isotrac_routines_mod.F90 Source File


Contents


Source Code

#ifdef ISO
#ifdef ISOTRAC
! $Id: $

MODULE isotrac_routines_mod
! on créé ce module pour éviter dépendances circulaires.
! isotopes_routines_mod a besoin de isotrac et isotopes_verif
! isotopes_verif a besoin de isotopes et isotrac
! isotrac n'a besoin que de isotopes
    USE infotrac_phy, ONLY: ntraciso=>ntiso, niso, index_trac=>itZonIso, ntraceurs_zone=>nzone
IMPLICIT NONE

CONTAINS


         subroutine uncompress_commun_zone(ncas, cas, &
     &   xtp_cas,xtp,xtwater_cas,xtwater,xtevap_cas,xtevap, &
     &           ncum,izone)

    USE isotopes_mod, ONLY: ridicule,iso_eau

         implicit none 

         ! decompression des outputs communs à tous les cas dans
         ! appel_stewart
         ! cas des traceurs. Ici, aucun risque de revap franche.

         ! inputs
         integer ncas,ncum
         integer cas(ncum)
         real xtevap_cas(niso,ncum)
         real xtp_cas(niso,ncum)
         real xtwater_cas(niso,ncum)
         integer izone
         ! outputs
         real xtwater(ntraciso,ncum)
         real xtp(ntraciso,ncum)
         real xtevap(ntraciso,ncum)

         ! locals
         integer il,ixt,iiso,ixt_revap


         do il=1,ncas
             do iiso=1,niso 
               ixt=index_trac(izone,iiso) 
               xtevap(ixt,cas(il))=xtevap_cas(iiso,il)
               xtp(ixt,cas(il))=xtp_cas(iiso,il)
               xtwater(ixt,cas(il))=xtwater_cas(iiso,il)
           enddo !do iiso=1,niso
         enddo !do il=1,ncas

         end subroutine uncompress_commun_zone


         subroutine uncompress_commun_zone_revap(ncas, cas, &
     &          xtp_cas,xtp,xtwater_cas,xtwater, &
     &          xtevap_cas,xtevap, &
     &          ncum,izone,Eqi_stewart,fac_ftmr_cas, &
#ifdef ISOVERIF
     &           Exi_cas,Exi,    &
#endif
     &          xtp_avantevap_cas,liq,hdiag)

    USE isotopes_mod, ONLY: ridicule,iso_eau,iso_HDO,ridicule_evap
    USE isotrac_mod, only: option_revap,evap_franche,izone_revap, &
&       ridicule_trac
#ifdef ISOVERIF
    USE isotopes_verif_mod
#endif

         implicit none 

         ! decompression des outputs communs à tous les cas dans
         ! appel_stewart
         ! cas des traceurs: mais ici, risque de révap franche -> on fat
         ! plus attention

         ! inputs
         integer ncas,ncum
         integer cas(ncum)
         real xtevap_cas(niso,ncum)
         real xtp_cas(niso,ncum)
         real xtwater_cas(niso,ncum)
         integer izone
         real Eqi_stewart(ncum)
         real xtp_avantevap_cas(niso,ncum)
         real fac_ftmr_cas(ncum) 
         integer liq  
         real hdiag(ncas)      
         
         ! outputs
         real xtwater(ntraciso,ncum)
         real xtp(ntraciso,ncum)
         real xtevap(ntraciso,ncum)

         ! locals
         integer il,ixt,iiso,ixt_revap
         real xtaddp_tag(niso,ncum)
#ifdef ISOVERIF
         integer ieau,iHDO
         real Exi_cas(niso,ncum)
         real Exi(ntraciso,ncum)
         !USE isotopes_verif, ONLY: 
#endif         

!        write(*,*) 'compress_stewart 315 tmp: ',
!     :           'entrée dans uncompress_commun_zone_revap'

         do il=1,ncas       
          if ((option_revap.eq.1).and. &
     &        ((((liq.eq.1).and. &
     &        (Eqi_stewart(il)*fac_ftmr_cas(il).gt.evap_franche) &
     &        .and.(hdiag(il).lt.0.99)).or. &
     &        ((liq.eq.0).and. &
     &        (Eqi_stewart(il)*fac_ftmr_cas(il).ge.0.0))).or. &
     &        (izone.eq.izone_revap))) then
!          if ((option_revap.eq.1).and.
!     :           (((Eqi_stewart(il)*fac_ftmr_cas(il).gt.evap_franche)
!     :           .or.((liq.eq.0).and.
!     :           (Eqi_stewart(il)*fac_ftmr_cas(il).ge.0.0))).or.
!     :           (izone.eq.izone_revap))) then
            ! on met la revap dans izone_revap si option_revap=1 et si:
            ! * evap glace (non fractionnante)
            ! * ou evap liq suffisemment forte pour que pas de flux
            ! d'isotopes négatifs.
            ! si option_revap=1 et izone=izone_revap, on met aussi dans izone_revap
!#ifdef ISOVERIF            
!            if (il.eq.1) then
!            write(*,*) 'compress tmp 341: revap dans izone_revap'
!            write(*,*) 'Eqi_stewart(il),fac_ftmr_cas(il),evap_franche=',
!     :           Eqi_stewart(il),fac_ftmr_cas(il),evap_franche
!            write(*,*) 'il,xtp_cas(iso_eau,il)=',il,xtp_cas(iso_eau,il)
!            write(*,*) 'il,xtp_avantevap_cas(iso_eau,il)=',il,
!     :            xtp_avantevap_cas(iso_eau,il)
!            write(*,*) 'xtp(ixt_revap,cas(il))=',
!     :            xtp(index_trac(izone_revap,iso_eau),cas(il))
!            endif
!#endif           

            ! toute la révap franche va dans izone_revap
            do iiso=1,niso
               ixt=index_trac(izone,iiso)           
               ixt_revap=index_trac(izone_revap,iiso)  
               ! le terme d'évap qui était pour la zone izone devient
               ! nul, et à la place on le met dans izone_revap&               
               xtevap(ixt_revap,cas(il))=xtevap(ixt_revap,cas(il)) &
     &                   +xtevap_cas(iiso,il)

               ! ce qui a été ajouté à xtp par rapport à xtp_avantevap
               ! est ajouté à izone_revap, au lieu de izone
               xtaddp_tag(iiso,il)=xtp_cas(iiso,il) &
     &                   -xtp_avantevap_cas(iiso,il)        
               xtp(ixt_revap,cas(il))= &
     &                  xtp(ixt_revap,cas(il)) &
     &                  +xtaddp_tag(iiso,il)
            enddo !do iiso=1,niso
#ifdef ISOVERIF
            if (iso_HDO.gt.0) then
                if (xtevap_cas(iso_eau,il).gt.ridicule_evap) then
                    call iso_verif_aberrant_choix( &
     &                 xtevap_cas(iso_HDO,il),xtevap_cas(iso_eau,il), &
     &                 ridicule_trac,deltalimtrac*2,'compress 344a')
                endif
                ieau=index_trac(izone_revap,iso_eau)
                iHDO=index_trac(izone_revap,iso_HDO) 
                call iso_verif_aberrant_choix(xtevap(iHDO,cas(il)), &
     &              xtevap(ieau,cas(il)),ridicule_trac,deltalimtrac*2, &
     &              'compress 344b')
            endif !if (iso_HDO.gt.0) then
#endif            

            ! l'évap des autres zones devient nulle
            if (izone.ne.izone_revap) then
                do iiso=1,niso
                  ixt=index_trac(izone,iiso)
                  xtevap(ixt,cas(il))=0.0
                  xtp(ixt,cas(il))=xtp_avantevap_cas(iiso,il)
                enddo
            endif

!#ifdef ISOVERIF            
!            if (il.eq.1) then
!            write(*,*) 'compress tmp 341: revap dans izone_revap'
!            write(*,*) 'xtp(ixt_revap,cas(il))=',
!     :           xtp(index_trac(izone_revap,iso_eau),cas(il))
!            write(*,*) 'xtp(ixt,cas(il))=',
!     :            xtp(index_trac(izone,iso_eau),cas(il))
!            endif
!#endif            

           else !if ((Eqi_stewart(il).gt.ridicule_evap*100)

             do iiso=1,niso 
               ixt=index_trac(izone,iiso) 
               xtevap(ixt,cas(il))=xtevap_cas(iiso,il)
               xtp(ixt,cas(il))=xtp_cas(iiso,il)
             enddo !do iiso=1,niso
           endif !if ((Eqi_stewart(il).gt.ridicule_evap*100)
        enddo !do il=1,ncas

        do il=1,ncas
           do iiso=1,niso
             ixt=index_trac(izone,iiso)
             xtwater(ixt,cas(il))=xtwater_cas(iiso,il)
#ifdef ISOVERIF
             Exi(ixt,cas(il))=Exi_cas(iiso,il)
#endif             
           enddo !do iiso=1,niso
         enddo !do il=1,ncas
!         write(*,*) 'compress_stewart 361 tmp: ',
!     :           'sortie de uncompress_commun_zone_revap'
         
         end subroutine uncompress_commun_zone_revap



         subroutine compress_cond_facftmr_zone( &
     &    ncas,  cas, &
     &    Eqi_prime_cas,Eqi_prime, &
     &    Pqisup_cas,Pqisup,  &
     &    Pxtisup_cas,Pxtisup,   &
     &    qp_avantevap_cas,qp_avantevap, &
     &    xtp_avantevap_cas,xtp_avantevap,  &
     &    xtevapsup_cas,xtevap,& 
     &    water_cas,water,& 
#ifdef ISOVERIF        
     &    evap_cas,evap, & 
#endif        
     &    nloc,ncum,nd,i,izone)

    USE isotopes_mod, ONLY: iso_eau
#ifdef ISOVERIF        
    USE isotopes_verif_mod  
#endif

         implicit none

         ! compression dans le cas condensation_facftmr
         ! inputs
         integer nd,ncum,nloc
         integer ncas
         integer cas(ncum)
         integer i
         integer izone
         real  &
     &    xtevapsup_cas(niso,ncum),xtevap(ntraciso,ncum), &
     &    water_cas(ncum),water(ncum)
         real Eqi_prime_cas(ncum),Eqi_prime(ncum), &
     &    Pqisup_cas(ncum),Pqisup(ncum),  &
     &    Pxtisup_cas(niso,ncum),Pxtisup(ntraciso,ncum),  &
     &    qp_avantevap_cas(ncum),qp_avantevap(ncum), &
     &    xtp_avantevap_cas(niso,ncum),xtp_avantevap(ntraciso,ncum)
#ifdef ISOVERIF      
         real evap_cas(ncum),evap(ncum)
#endif         
         ! locals
         integer il,ixt,ieau,iiso

          ieau=index_trac(izone,iso_eau)
          do il=1,ncas
            if (qp_avantevap(cas(il)).gt.0.0) then
               Eqi_prime_cas(il)=Eqi_prime(cas(il)) &
     &        *(xtp_avantevap(ieau,cas(il))/qp_avantevap(cas(il)))
            else !if (qp_avantevap_cas(cas(il)).gt.0.0) then
#ifdef ISOVERIF
                call iso_verif_egalite_choix( &
     &                   (Eqi_prime(cas(il))),0.0, &
     &                   'compress_stewart 495',errmax,errmaxrel)
#endif
                Eqi_prime_cas(il)=0.0
            endif !if (qp_avantevap_cas(cas(il)).gt.0.0) thens
            
            if (Pqisup(cas(il))-Eqi_prime(cas(il)).gt.0.0) then
               water_cas(il)=water(cas(il)) &
     &           *((Pxtisup(ieau,cas(il))-Eqi_prime_cas(il)) &
     &           /(Pqisup(cas(il))-Eqi_prime(cas(il))))
            else !if (Pqisup(cas(il)).gt.0.0) then
#ifdef ISOVERIF
                call iso_verif_egalite_choix(water(cas(il)),0.0, &
     &                   'compress_stewart 507',errmax,errmaxrel)
#endif
                water_cas(il)=0.0
            endif !if (Pqisup(cas(il)).gt.0.0) then

            Pqisup_cas(il)=Pxtisup(ieau,cas(il))
            qp_avantevap_cas(il)=xtp_avantevap(ieau,cas(il))

!#ifdef ISOVERIF
!            call iso_verif_noNaN(water_cas(il),'compress_stewart 518')
!            evap_cas(il)=evap(cas(il))
!     :        *(xtp_avantevap(ieau,cas(il))/qp_avantevap(cas(il)))
!!           qp_cas(il)=xtp(ieau,cas(il))     
!#endif
            do iiso=1,niso
              ixt=index_trac(izone,iiso)
              Pxtisup_cas(iiso,il)=Pxtisup(ixt,cas(il))
              xtp_avantevap_cas(iiso,il)=xtp_avantevap(ixt,cas(il))
              xtevapsup_cas(iiso,il)=xtevap(ixt,cas(il))
            enddo
          enddo 

         end subroutine compress_cond_facftmr_zone

         subroutine compress_cond_nofftmr_zone( &
     &    ncas,  cas, &
     &    Eqi_prime_cas,Eqi_prime, &
     &    Pqisup_cas,Pqisup,  &
     &    Pxtisup_cas,Pxtisup, &
     &    water_cas,water,   &
     &    qp_avantevap_cas,qp_avantevap, &
     &    xtp_avantevap_cas,xtp_avantevap, &
     &    xt_cas,xt,q_cas,q,  &
     &    xtevapsup_cas,xtevap, &
#ifdef ISOVERIF
     &    evap_cas,evap, &
#endif      
     &    nloc,ncum,nd,i,izone)

    USE isotopes_mod, ONLY: iso_eau
#ifdef ISOVERIF
    USE isotopes_verif_mod
#endif

         implicit none

         ! compression dans le cas condensation_facftmr
         ! inputs
         integer nloc,nd,ncum
         integer ncas
         integer cas(ncum)
         integer i
         integer izone
         real  &
     &    xt_cas(niso,ncum),q_cas(ncum),xt(ntraciso,ncum),q(ncum),  &
     &    xtevapsup_cas(niso,ncum),xtevap(ntraciso,ncum), &
     &    water_cas(ncum),water(ncum)
         real Eqi_prime_cas(ncum),Eqi_prime(ncum), &
     &    Pqisup_cas(ncum),Pqisup(ncum),  &
     &    Pxtisup_cas(niso,ncum),Pxtisup(ntraciso,ncum), &
     &    qp_avantevap_cas(ncum),qp_avantevap(ncum), &
     &    xtp_avantevap_cas(niso,ncum),xtp_avantevap(ntraciso,ncum)
#ifdef ISOVERIF
         real evap_cas(ncum),evap(ncum)
#endif         
         ! locals
          integer il,ixt,ieau,iiso

          ieau=index_trac(izone,iso_eau)
          do il=1,ncas
            if (qp_avantevap(cas(il)).gt.0) then
              Eqi_prime_cas(il)=Eqi_prime(cas(il)) &
     &           *(xtp_avantevap(ieau,cas(il))/qp_avantevap(cas(il)))
            else
                Eqi_prime_cas(il)=Eqi_prime(cas(il)) &
     &           *(xt(ieau,cas(il))/q(cas(il)))
            endif
            
            if (Pqisup(cas(il))-Eqi_prime(cas(il)).gt.0.0) then
              water_cas(il)=water(cas(il)) &
     &           *((Pxtisup(ieau,cas(il))-Eqi_prime_cas(il)) &
     &           /(Pqisup(cas(il))-Eqi_prime(cas(il))))
            else !if (Pqisup(cas(il)).gt.0.0) then
#ifdef ISOVERIF
                call iso_verif_egalite_choix(water(cas(il)),0.0, &
     &                   'compress_stewart 654',errmax,errmaxrel)
#endif
                water_cas(il)=0.0
            endif !if (Pqisup(cas(il)).gt.0.0) then  

            Pqisup_cas(il)=Pxtisup(ieau,cas(il))
            qp_avantevap_cas(il)=xtp_avantevap(ieau,cas(il))
            q_cas(il)=xt(ieau,cas(il))
!#ifdef ISOVERIF
!            if (qp_avantevap(cas(il)).gt.0.0) then
!              evap_cas(il)=evap(cas(il))
!     :           *(xtp_avantevap(ieau,cas(il))/qp_avantevap(cas(il)))
!            else
!                evap_cas(il)=evap(cas(il))
!     :           *(xt(ieau,cas(il))/q(cas(il)))
!            endif
!            qp_cas(il)=xtp(ieau,cas(il))
!#endif            
            do iiso=1,niso 
              ixt=index_trac(izone,iiso)            
              Pxtisup_cas(iiso,il)=Pxtisup(ixt,cas(il))
              xtp_avantevap_cas(iiso,il)=xtp_avantevap(ixt,cas(il))
              xt_cas(iiso,il)=xt(ixt,cas(il))
              xtevapsup_cas(iiso,il)=xtevap(ixt,cas(il))
            enddo
          enddo 

         end subroutine compress_cond_nofftmr_zone

         subroutine compress_noevap_zone( &
     &    ncas,  cas, &
     &    Pqisup_cas,Pqisup,  &
     &    Pxtisup_cas,Pxtisup,   &
     &    xtp_avantevap_cas,xtp_avantevap, &
     &    xtevapsup_cas,xtevap, &
     &    water_cas,water, &
#ifdef ISOVERIF         
     &    evap_cas,evap, &
#endif 
     &    nloc,ncum,nd,i,izone)

    USE isotopes_mod, ONLY: ridicule,iso_eau
#ifdef ISOVERIF
    USE isotopes_verif_mod
#endif
         implicit none

         ! compression dans le cas condensation_facftmr
         integer nloc,nd,ncum
         integer ncas
         integer cas(ncum)
         integer i
         integer izone
         real xtevapsup_cas(niso,ncum),xtevap(ntraciso,ncum), &
     &    water_cas(ncum),water(ncum)
         real Pqisup_cas(ncum),Pqisup(ncum),  &
     &    Pxtisup_cas(niso,ncum),Pxtisup(ntraciso,ncum),   &
     &    xtp_avantevap_cas(niso,ncum),xtp_avantevap(ntraciso,ncum)
#ifdef ISOVERIF        
        real evap_cas(ncum),evap(ncum)
#endif 
         integer il,ixt,ieau,iiso

          ieau=index_trac(izone,iso_eau)
          do il=1,ncas
            Pqisup_cas(il)=Pxtisup(ieau,cas(il))
            if (Pqisup(cas(il)).gt.0.0) then
               water_cas(il)=water(cas(il)) &
     &           *(Pxtisup(ieau,cas(il))/Pqisup(cas(il)))
            else
                water_cas(il)=0.0
#ifdef ISOVERIF                 
                call iso_verif_egalite_choix(water(cas(il)), &
     &               0.0,'compress_stewart 709',errmax,errmaxrel)
#endif                
            endif
#ifdef ISOVERIF 
!            evap_cas(il)=evap(cas(il))
!     :           *(Pxtisup(ieau,cas(il))/Pqisup(cas(il)))
!            qp_cas(il)=xtp(ieau,cas(il))
#endif
            do iiso=1,niso
              ixt=index_trac(izone,iiso)            
              Pxtisup_cas(iiso,il)=Pxtisup(ixt,cas(il))
              xtp_avantevap_cas(iiso,il)=xtp_avantevap(ixt,cas(il))
              xtevapsup_cas(iiso,il)=xtevap(ixt,cas(il))
            enddo
          enddo 

         end subroutine compress_noevap_zone

         subroutine compress_evap_liq_zone(iflag_con,ncas,   &
     &    cas, &
     &    Pqisup_cas,Pqisup,  &
     &    Pxtisup_cas,Pxtisup,     &
     &    xtp_avantevap_cas,xtp_avantevap, &
     &    xtp_avantevaptrac_cas,qp_avantevaptrac_cas, &
     &    xtevapsup_cas,xtevap, &
     &    water_cas,water, &
     &    Eqi_stewart,Pqiinf_stewart,Eqi_prime_cas,& 
     &    Pqiinf,Eqi_par,Pqiinf_par,Eqi_prime,ptrac, &
     &    Eqi,Eqi_cas,  &
!     &    qp_cas,
#ifdef ISOVERIF           
     &    evap_cas,evap,   &
#endif         
     &    nloc,ncum,nd,izone)

    USE isotopes_mod, ONLY: ridicule,iso_eau
#ifdef ISOVERIF
    USE isotopes_verif_mod
#endif
         implicit none

         ! compression dans le cas condensation_facftmr
        ! inputs et outputs 
         integer iflag_con
         integer izone    
         integer nloc,nd,ncum
         integer ncas
         integer cas(ncum)
!         integer i
         real xtevapsup_cas(niso,ncum),xtevap(ntraciso,ncum)
         real xtp_avantevap_cas(niso,ncum), &
     &           xtp_avantevap(ntraciso,ncum)
         real water_cas(ncum),water(ncum)
         real xtp_avantevaptrac_cas(niso,ncum), &
     &           qp_avantevaptrac_cas(ncum)
         real ptrac(ncum)
!         real qp_cas(ncum)
#ifdef ISOVERIF           
         real evap_cas(ncum),evap(ncum)
#endif         
         real &
     &    Eqi_stewart(ncum),Pqiinf_stewart(ncum),Eqi_prime_cas(ncum), &
     &    Pqiinf(ncum),Eqi_par(ncum),Pqiinf_par(ncum), &
     &    Eqi_prime(ncum),Pqisup(ncum),Pqisup_cas(ncum), &
     &    Pxtisup(ntraciso,ncum),Pxtisup_cas(niso,ncum), &
     &    Eqi(ncum),Eqi_cas(ncum)    
         ! locals
          integer il,ixt,iiso,ieau

!          write(*,*) 'compress 910: xtp_avantevap(iso_eau,cas(1))=',
!     :           xtp_avantevap(iso_eau,cas(1))
!        write(*,*) 'compress_evap_liq_zone 510: ncas,ncum=',ncas,ncum
        ptrac(:)=0. ! CR 31 mars 2023: initialisation de ptrac

          ieau=index_trac(izone,iso_eau)
          do il=1,ncas            
            Pqisup_cas(il)=Pxtisup(ieau,cas(il))

            if (Pqisup(cas(il)).gt.0.0) then
              ptrac(il)=Pxtisup(ieau,cas(il))/Pqisup(cas(il))
              Eqi_prime_cas(il)=Eqi_prime(cas(il)) &
     &           *ptrac(il)
            else
#ifdef ISOVERIF 
              call iso_verif_egalite(( &
     &                   Eqi_prime(cas(il))),0.0, &
     &                   'compress_stewart 979')
#endif                
              Eqi_prime_cas(il)=0.0 
            endif

            if (Pqisup(cas(il))-Eqi_prime(cas(il)).gt.0.0) then
               water_cas(il)=water(cas(il)) &
     &           *((Pxtisup(ieau,cas(il))-Eqi_prime_cas(il)) &
     &           /(Pqisup(cas(il))-Eqi_prime(cas(il))))
            else !if (Pqisup(cas(il)).gt.0.0) then
#ifdef ISOVERIF
                call iso_verif_egalite_choix(water(cas(il)),0.0, &
     &                   'compress_stewart 507',errmax,errmaxrel)
#endif
                water_cas(il)=0.0
            endif !if (Pqisup(cas(il)).gt.0.0) then

            
!            qp_cas(il)=qp(cas(il))
#ifdef ISOVERIF              
!            evap_cas(il)=evap(cas(il))
!     &           *(Pxtisup(ieau,cas(il))/Pqisup(cas(il)))
!            ! ce calcul est faux& normalement, 
!        evap_cas(il)=Eqi_prime_cas(il)//100.0/delP_cas(il)/SIGD*g*2.0
!     &         -(ieau,cas(il))
#endif            
            qp_avantevaptrac_cas(il)=xtp_avantevap(ieau,cas(il))
            do iiso=1,niso  
              ixt=index_trac(izone,iiso)            
              Pxtisup_cas(iiso,il)=Pxtisup(ixt,cas(il))
              xtp_avantevap_cas(iiso,il)=xtp_avantevap(iiso,cas(il))
              xtp_avantevaptrac_cas(iiso,il)=xtp_avantevap(ixt,cas(il))
              xtevapsup_cas(iiso,il)=xtevap(ixt,cas(il))
            enddo
          enddo !do il=1,ncas
!         write(*,*) 'compress_stewart 931: ',
!     &           'xtp_avantevap_cas(iso_eau,1)=', 
!     &           xtp_avantevap_cas(iso_eau,1)
!         write(*,*) 'xtp_avantevap(iso_eau,cas(1))=',
!     &           xtp_avantevap(iso_eau,cas(1))

      ! calculs des flux de masses à mettre en argument de stewart:
      ! comme l'eau n'est pas bien concervée dans les ddfts, on est
      ! obligé de bidouillé.
      ! 1) soit on considère Pqisup, Eqi, et Pqiinf_par=Pqisup-Eqi
      !    et on suppose que dans la réalité les compositions de
      !    Pqiinf sont les même que Pqiinf_par
      ! 2) soit on considère Pqisup, Eqi_par=Pqisup-Pqiinf, et Pqiinf,
      !    et on suppose que dans la réalité les compositions de
      !    Eqi_prime sont les même que Eqi_par
          do il=1,ncas  
           if (Pqisup(cas(il)).gt.0.0) then            
            if ((water(cas(il)).gt.ridicule/100).and. &
     &            (Pqiinf_par(cas(il)).le.0.0)) then
             ! on ne peut pas utiliser la méthode 1, car KE prédit de l'eau
             ! alors que le bilan de masse n'enprédit pas.
             ! Peut-on utiliser la méthode 2?
             Pqiinf_stewart(il)=Pqiinf(cas(il))*ptrac(il)
             Eqi_stewart(il)=Eqi_par(cas(il)) *ptrac(il)
           else !if ((water(il,i).gt.ridicule/100).and.(Pqiinf_par.le.0.0)) then
             ! il n'y a pas d'obstacles à l'utilisation de 1)
             Pqiinf_stewart(il)=Pqiinf_par(cas(il))*ptrac(il)
             if (iflag_con.eq.30) then
                Eqi_stewart(il)=Eqi_prime(cas(il))*ptrac(il)
             else
                Eqi_stewart(il)=Eqi(cas(il))*ptrac(il)
             endif
           endif !if ((water(il,i).gt.ridicule/100).and.(Pqiinf_par.le.0.0)) then
          else ! if (Pqisup(cas(il).gt.0.0) then
#ifdef ISOVERIF
               call iso_verif_egalite((Pqiinf(cas(il))), &
     &           0.0,'compress_stewart 1047a')
               call iso_verif_egalite(( &
     &           Eqi_prime(cas(il))),0.0,'compress_stewart 1047b') 
               call iso_verif_egalite(( &
     &           Pqiinf_par(cas(il))),0.0,'compress_stewart 1047c')
               call iso_verif_egalite((Eqi_par(cas(il))), &
     &           0.0,'compress_stewart 1047d') 
#endif              
               Pqiinf_stewart(il)=0.0
               Eqi_stewart(il)=0.0
          endif ! if (Pqisup(cas(il).gt.0.0) then 
         enddo !do il=1,ncas_evap_glace

         ! petite vérif
#ifdef ISOVERIF        
        do il=1,ncas
          if ((abs(water_cas(il)).ge.ridicule/10.) &
     &           .and.(Pqiinf_stewart(il).le.0.0)) then
              write(*,*) 'compress_stewart 498: evap liq:'
              write(*,*) 'water(il,i)=', water_cas(il)
              write(*,*) 'Pqiinf=',Pqiinf(cas(il))
              write(*,*) 'Pqiinf_par=',Pqiinf_par(cas(il))
              write(*,*) 'Pqiinf_stewart=',Pqiinf_stewart(il)
              stop                   
          endif
        enddo !do il=1,ncas_evap_glace
#endif

         end subroutine compress_evap_liq_zone

         subroutine compress_evap_glace_zone(iflag_con, &
     &    ncas, cas, &
     &    water_cas,water,     &
     &    Pqisup_cas,Pqisup,  &
     &    Pxtisup_cas,Pxtisup,  &
     &    xtp_avantevap_cas,xtp_avantevap,  &
     &    xtp_avantevaptrac_cas,qp_avantevaptrac_cas, &
     &    xtevapsup_cas,xtevap, &
     &    Eqi_stewart,Pqiinf_stewart,Eqi_prime_cas,Eqi_cas, &
     &    Pqiinf,Eqi_par,Pqiinf_par,Eqi_prime,Eqi, &
!     &    qp_cas,
#ifdef ISOVERIF           
     &    evap_cas,evap, &
#endif         
     &    nloc,ncum,nd,i,frac_sublim,izone)

    USE isotopes_mod, ONLY: ridicule,iso_eau
#ifdef ISOVERIF
    USE isotopes_verif_mod
#endif
         implicit none

         ! compression dans le cas condensation_facftmr
         integer iflag_con         
         integer nloc,nd,ncum
         integer ncas
         integer cas(ncum)
         integer i
         integer izone
         real  &
     &    water_cas(ncum),water(ncum), &
     &    xtevapsup_cas(niso,ncum),xtevap(ntraciso,ncum)
!         real qp_cas(ncum)    
#ifdef ISOVERIF           
         real evap_cas(ncum),evap(ncum)
#endif         
         real  &
     &    Pqisup_cas(ncum),Pqisup(ncum),  &
     &    Pxtisup_cas(niso,ncum),Pxtisup(ntraciso,ncum),   &
     &    xtp_avantevap_cas(niso,ncum),xtp_avantevap(ntraciso,ncum), &
     &    Eqi_stewart(ncum),Pqiinf_stewart(ncum),Eqi_prime_cas(ncum), &
     &    Pqiinf(ncum),Eqi_par(ncum),Pqiinf_par(ncum),Eqi_prime(ncum), &
     &    Eqi(ncum),Eqi_cas(ncum)

         real xtp_avantevaptrac_cas(niso,ncum), &
     &           qp_avantevaptrac_cas(ncum)
          integer frac_sublim
          ! locals
          integer il,ixt,ieau,iiso

          ieau=index_trac(izone,iso_eau)
          do il=1,ncas
            Pqisup_cas(il)=Pxtisup(ieau,cas(il))  

            if (Pqisup(cas(il)).gt.0.0) then
              Eqi_prime_cas(il)=Eqi_prime(cas(il)) &
     &           *(Pxtisup(ieau,cas(il))/Pqisup(cas(il)))
              Eqi_cas(il)=Eqi(cas(il)) & ! corr bug Camille 15 juin 2024
     &           *(Pxtisup(ieau,cas(il))/Pqisup(cas(il)))
            else
#ifdef ISOVERIF 
                call iso_verif_egalite(( &
     &                   Eqi_prime(cas(il))),0.0, &
     &                   'compress_stewart 979b')
#endif                
              Eqi_prime_cas(il)=0.0 
              Eqi_cas(il)=0.0
            endif

            if (Pqisup(cas(il))-Eqi_prime(cas(il)).gt.0.0) then
               water_cas(il)=water(cas(il)) &
     &           *((Pxtisup(ieau,cas(il))-Eqi_prime_cas(il)) &
     &           /(Pqisup(cas(il))-Eqi_prime(cas(il))))
            else !if (Pqisup(cas(il)).gt.0.0) then
#ifdef ISOVERIF
                call iso_verif_egalite_choix(water(cas(il)),0.0, &
     &                   'compress_stewart 507',errmax,errmaxrel)
#endif
                water_cas(il)=0.0
            endif !if (Pqisup(cas(il)).gt.0.0) then


            qp_avantevaptrac_cas(il)=xtp_avantevap(ieau,cas(il))
!            qp_cas(il)=xtp(ieau,cas(il))
#ifdef ISOVERIF              
!            evap_cas(il)=evap(cas(il))
!     &           *(Pxtisup(ieau,cas(il))/Pqisup(cas(il)))
            ! ce calcul est faux& faire plutot:
!            evap_cas(il)=Eqi_prime_cas(il)//100.0/delP_cas(il)/SIGD*g*2.0
!     &         -(ieau,cas(il))
#endif            
            do iiso=1,niso  
              ixt=index_trac(izone,iiso)            
              Pxtisup_cas(iiso,il)=Pxtisup(ixt,cas(il))
              xtp_avantevap_cas(iiso,il)=xtp_avantevap(iiso,cas(il))
              xtp_avantevaptrac_cas(iiso,il)=xtp_avantevap(ixt,cas(il))
              xtevapsup_cas(iiso,il)=xtevap(ixt,cas(il))
            enddo
          enddo  !do il=1,ncas     

          ! calculs des flux de masses à mettre en argument de stewart:
      ! comme l'eau n'est pas bien concervée dans les ddfts, on est
      ! obligé de bidouillé.
      ! 1) soit on considère Pqisup, Eqi, et Pqiinf_par=Pqisup-Eqi
      !    et on suppose que dans la réalité les compositions de
      !    Pqiinf sont les même que Pqiinf_par
      ! 2) soit on considère Pqisup, Eqi_par=Pqisup-Pqiinf, et Pqiinf,
      !    et on suppose que dans la réalité les compositions de
      !    Eqi_prime sont les même que Eqi_par
          do il=1,ncas  
           if (Pqisup(cas(il)).gt.0.0) then  

            if ((water(cas(il)).gt.ridicule/100).and. &
     &            (Pqiinf_par(cas(il)).le.0.0)) then
             ! on ne peut pas utiliser la méthode 1, car KE prédit de l'eau
             ! alors que le bilan de masse n'enprédit pas.
             ! Peut-on utiliser la méthode 2?
             Pqiinf_stewart(il)=Pqiinf(cas(il)) &
     &          *(Pxtisup(ieau,cas(il))/Pqisup(cas(il)))
             Eqi_stewart(il)=Eqi_par(cas(il)) &
     &          *(Pxtisup(ieau,cas(il))/Pqisup(cas(il)))
           else !if ((water(il,i).gt.ridicule/100).and.(Pqiinf_par.le.0.0)) then
             ! il n'y a pas d'obstacles à l'utilisation de 1)
             Pqiinf_stewart(il)=Pqiinf_par(cas(il)) &
     &            *(Pxtisup(ieau,cas(il))/Pqisup(cas(il)))
             if (iflag_con.eq.30) then
                Eqi_stewart(il)=Eqi_prime(cas(il)) &
     &            *(Pxtisup(ieau,cas(il))/Pqisup(cas(il)))
             else
                Eqi_stewart(il)=Eqi(cas(il)) &
     &            *(Pxtisup(ieau,cas(il))/Pqisup(cas(il)))
             endif
           endif !if ((water(il,i).gt.ridicule/100).and.(Pqiinf_par.le.0.0)) then

          else !if (Pqisup(cas(il).gt.0.0) then  

#ifdef ISOVERIF
              call iso_verif_egalite((Pqiinf(cas(il))), &
     &           0.0,'compress_stewart 1347a')
               call iso_verif_egalite(( &
     &           Eqi_prime(cas(il))),0.0,'compress_stewart 1347b') 
               call iso_verif_egalite(( &
     &           Pqiinf_par(cas(il))),0.0,'compress_stewart 1347c')
               call iso_verif_egalite((Eqi_par(cas(il))), &
     &           0.0,'compress_stewart 1347d') 
#endif              
               Pqiinf_stewart(il)=0.0
               Eqi_stewart(il)=0.0              
          endif !if (Pqisup(cas(il).gt.0.0) then  
         enddo !do il=1,ncas_evap_glace

        ! petite vérif
#ifdef ISOVERIF        
        do il=1,ncas
          if ((abs(water_cas(il)).ge.ridicule/10.) &
     &           .and.(Pqiinf_stewart(il).le.0.0)) then
              write(*,*) 'compress_stewart 498: evap glace:'
              write(*,*) 'water(il,i)=', water_cas(il)
              write(*,*) 'Pqiinf=',Pqiinf(cas(il))
              write(*,*) 'Pqiinf_par=',Pqiinf_par(cas(il))
              write(*,*) 'Pqiinf_stewart=',Pqiinf_stewart(il)
              stop                   
          endif
        enddo !do il=1,ncas_evap_glace
#endif             

         end subroutine compress_evap_glace_zone

         subroutine uncompress_ilp_zone( &
     &       ncas,cas, &
     &       zxtrfln_cas,zxt_cas,zxtrfl,zxtrfln,zxt,klon, &
     &       izone,Eqi,Exi,fac_ftmr, &
     &       xtrevap_tag,liq,hdiag)

    USE isotopes_mod, ONLY: ridicule,iso_eau
    USE isotrac_mod, only: option_revap,evap_franche
#ifdef ISOVERIF
        use isotopes_verif_mod
#endif

         implicit none

        ! inputs         
         integer ncas
         integer cas(ncas)
         integer klon
         integer izone                  
         real zxt_cas(niso,ncas),zxtrfln_cas(niso,ncas)
         real Exi(niso,ncas)
         real Eqi(ncas)
         real fac_ftmr(ncas)
         integer liq
         real hdiag(ncas)

         ! output
         real zxt(ntraciso,klon)
         real zxtrfl(ntraciso,klon),zxtrfln(ntraciso,klon)
         real xtrevap_tag(ntraciso,ncas)

         ! locals
         integer il,ixt,iiso

!         write(*,*) 'uncompress_stewart 1420 tmp: zxt=',
!     :            zxt(iso_eau:ntraciso:3,cas(1))
!         write(*,*) 'Exi,fac_ftmr=',
!     :            Exi(iso_eau,1),fac_ftmr(1)
         do il=1,ncas
          do iiso=1,niso
            ixt=index_trac(izone,iiso)
            zxtrfln(ixt,cas(il))=zxtrfln_cas(iiso,il)
            zxtrfl(ixt,cas(il))=zxtrfln_cas(iiso,il)            
          enddo !do iiso=1,niso
!#ifdef ISOVERIF
!          if (il.eq.9) then
!            write(*,*) 'uncompress 1521'
!            write(*,*) 'il,Eqi,fac_ftmr,evap_franche,Exi(2,il)=',
!     :         il,Eqi(il),fac_ftmr(il),evap_franche,Exi(2,il)
!          endif
!#endif

          if ((option_revap.eq.1).and. &
     &         (((liq.eq.1).and.(Eqi(il)*fac_ftmr(il).gt.evap_franche) &
     &         .and.(hdiag(il).lt.0.99)).or. &
     &         ((liq.eq.0).and. &
     &         (Eqi(il)*fac_ftmr(il).ge.0.0)))) then 
          ! le flux d'évap va dans un tag particulier
          ! -> zxt est inchangé mais xtrevap_tag(ixt,il) est incrémenté
             do iiso=1,niso
              ixt=index_trac(izone,iiso)
              xtrevap_tag(ixt,il)=fac_ftmr(il)*Exi(iiso,il)
!              zxt(ixt,cas(il))=zxt_cas(iiso,il)
!     :                   -xtrevap_tag(ixt,il)
             enddo !do iiso=1,niso
                
          else !if ((Eqi(il)*fac_ftmr(il).gt.evap_franche).and.
            ! reequilibration standard
            do iiso=1,niso
              ixt=index_trac(izone,iiso)
              zxt(ixt,cas(il))=zxt(ixt,cas(il)) &
     &                   +fac_ftmr(il)*Exi(iiso,il)
              zxt(ixt,cas(il))=max(0.0,zxt(ixt,cas(il)))
              xtrevap_tag(ixt,il)=0.0
#ifdef ISOVERIF
              call iso_verif_positif_choix(zxt(ixt,cas(il)), &
     &              0.0,'compress 1508')
#endif              
            enddo ! do iiso=1,niso           
          endif !if ((Eqi(il)*fac_ftmr(il).gt.evap_franche).and.
         enddo !do il=1,ncas
!         write(*,*) 'compress_stewart 1453 tmp: zxt=',
!     :            zxt(iso_eau:ntraciso:3,cas(1))

         end subroutine uncompress_ilp_zone

         subroutine compress_ilp_evap_liq_zone( &
     &       ncas,cas, &
     &       zxt_cas,zxt, &
     &       zxtrfl_cas,zxtrfl_ancien, &
     &       zrfln_cas,zrfln,   &
     &       zrfl_cas,zrfl_ancien,     &
     &       zqev_diag_cas,zqev_diag,  &
     &       klon,izone,ptrac)

    USE isotopes_mod, ONLY: ridicule,iso_eau
#ifdef ISOVERIF
        USE isotopes_verif_mod
#endif
         implicit none

        ! inputs         
         integer ncas
         integer cas(ncas)
         integer klon
         real zxt(ntraciso,klon)
         real zxtrfl(ntraciso,klon)
         real zrfl_ancien(klon)
         real zqev_diag(klon)
         real zrfln(klon)
         real zxtrfl_ancien(ntraciso,klon)
         integer izone

         ! outputs
         real zxt_cas(niso,ncas)         
         real zxtrfl_cas(niso,ncas)         
         real zqev_diag_cas(ncas)
         real zrfln_cas(ncas)         
         real zrfl_cas(ncas)
         real ptrac(ncas)
         
         ! locals
         integer il,ixt,ieau,iiso

         ieau=index_trac(izone,iso_eau)
         do il=1,ncas
          do iiso=1,niso
            ixt=index_trac(izone,iiso)
            ! la compo de la vap à l'extérieure reste la vapeur totale
            zxt_cas(iiso,il)=zxt(iiso,cas(il))
            ! le flux de pluie est celui le flux de pluie lié à la zone
            zxtrfl_cas(iiso,il)=zxtrfl_ancien(ixt,cas(il))
          enddo
          zrfl_cas(il)=zxtrfl_ancien(ieau,cas(il))

          if (zrfl_ancien(cas(il)).gt.0.0) then
          ! proportion de izone dans l'évap = celle dans la goutte          
            ptrac(il)=zxtrfl_ancien(ieau,cas(il))/zrfl_ancien(cas(il))
            zrfln_cas(il)=zrfln(cas(il))*ptrac(il)
            zqev_diag_cas(il)=zqev_diag(cas(il))*ptrac(il)
!#ifdef ISOVERIF              
!            if (il.eq.9) then
!              write(*,*) 'compress tmp: il, ptrac=',il,ptrac(il)
!              write(*,*) 'ieau,zxtrfl_ancien(ieau,cas(il))=',
!     :           ieau,zxtrfl_ancien(ieau,cas(il))
!              write(*,*) 'zrfl_ancien(cas(il))=',zrfl_ancien(cas(il))
!              write(*,*) 'zrfl_cas(il)=',zrfl_cas(il)
!            endif
!#endif

          else !if (zrfl_ancien(cas(il)).gt.0.0) then
#ifdef ISOVERIF  
!              write(*,*) 'il,cas(il),zrfln,zrfl_ancien,zqev_diag=',
!     :              il,cas(il),zrfln(cas(il)),zrfl_ancien(cas(il)),
!     :              zqev_diag(cas(il))   
              call iso_verif_egalite(zqev_diag(cas(il)),0.0, &
     &           'compress_stewart 1591a')
              call iso_verif_egalite(zrfln(cas(il)),0.0, &
     &           'compress_stewart 1591b')
#endif               
                zrfln_cas(il)=0.0
                zqev_diag_cas(il)=0.0
               
          endif !if (zrfl_ancien(cas(il)).gt.0.0) then
          ! les lignes suvantes ne sont pas à recalculer
!          zt_cas(il)=zt(cas(il))
!          delP(il)=paprs(cas(il),k)-paprs(cas(il),k+1)
         enddo !do il=1,ncas

         end subroutine compress_ilp_evap_liq_zone    


         subroutine compress_ilp_evap_glace_zone( &
     &       ncas,cas, &
     &       zxt_cas,zxt, &
     &       zxtrfl_cas,zxtrfl_ancien, &
     &       zrfln_cas,zrfln,   &
     &       zrfl_cas, zrfl_ancien, &
     &       zqev_diag_cas,zqev_diag,  &
     &       klon,izone)

    USE isotopes_mod, ONLY: ridicule,iso_eau
#ifdef ISOVERIF
        use isotopes_verif_mod
#endif

         implicit none

        ! inputs         
         integer ncas
         integer cas(ncas)
         integer klon
         real zxt(ntraciso,klon)
         real zxtrfl_ancien(ntraciso,klon)
         real zqev_diag(klon)
         real zrfln(klon)
         integer izone
         real zrfl_ancien(klon)

         ! outputs
         real zxt_cas(niso,ncas)         
         real zxtrfl_cas(niso,ncas)         
         real zqev_diag_cas(ncas)
         real zrfln_cas(ncas)         
         real zrfl_cas(ncas)
         
         
         ! locals
         integer il,ixt,ieau,iiso     

         ieau=index_trac(izone,iso_eau)
         do il=1,ncas
          do iiso=1,niso
            ixt=index_trac(izone,iiso)
            zxt_cas(iiso,il)=zxt(iiso,cas(il))
            zxtrfl_cas(iiso,il)=zxtrfl_ancien(ixt,cas(il))
          enddo          
          zrfl_cas(il)=zxtrfl_ancien(ieau,cas(il))

          if (zrfl_ancien(cas(il)).gt.0.0) then
             zrfln_cas(il)=zrfln(cas(il)) &
     &           *(zxtrfl_ancien(ieau,cas(il))/zrfl_ancien(cas(il)))
            ! car la proportion de traceurs dans zqev_diag et la même
            ! que dans zrfl_ancien. Comme zrfln=zrfl-zqev_diag*fac_ftmr
            ! alors cette proportion de traceurs est aussi la même dans
            ! zrfln
             zqev_diag_cas(il)=zqev_diag(cas(il)) &
     &         *zxtrfl_ancien(ieau,cas(il))/zrfl_ancien(cas(il))
          else !if (zrfl_ancien(cas(il)).gt.0.0) then
#ifdef ISOVERIF  
              call iso_verif_egalite(zqev_diag(cas(il)),0.0, &
     &           'compress_stewart 1791a')
              call iso_verif_egalite(zrfln(cas(il)),0.0, &
     &           'compress_stewart 1791b')
#endif               
                zrfln_cas(il)=0.0
                zqev_diag_cas(il)=0.0
          endif !if (zrfl_ancien(cas(il)).gt.0.0) then
         enddo

         end subroutine compress_ilp_evap_glace_zone   


      subroutine ajoute_revap(ncas,cas, &
     &    klon,izone,zxt,xtrevap_tag)

#ifdef ISOVERIF
USE isotopes_verif_mod
#endif
USE isotrac_mod, only: izone_revap
      implicit none

      ! ajoute xtrevap_tag (evaps des différents traceurs d'isotopes)
      ! dans la vapeur qui est taggée par la révap des gouttes.

      ! input
      integer ncas
      integer cas(ncas)
      integer klon
      integer izone      
      real xtrevap_tag(ntraciso,ncas)

      ! inout
      real zxt(ntraciso,klon)

      ! local
      integer i,ixt,iiso,ixt_revap
!#ifdef ISOVERIF      
!      integer iso_verif_positif_choix_nostop
!#endif          

#ifdef ISOVERIF
      do i=1,ncas
        do ixt=1,ntraciso
            call iso_verif_positif_choix(zxt(ixt,cas(i)),0.0, &
     &                   'ajoute_revap 29')
        enddo
      enddo !do i=1,ncas
#endif    

      do i=1,ncas
         do iiso=1,niso
            ixt_revap=index_trac(izone_revap,iiso)
            do izone=1,ntraceurs_zone
               ixt=index_trac(izone,iiso)
               zxt(ixt_revap,cas(i))=zxt(ixt_revap,cas(i)) &
     &             +xtrevap_tag(ixt,i)
#ifdef ISOVERIF
               if (iso_verif_positif_choix_nostop(zxt(ixt_revap,cas(i)), &
     &                   0.0,'ajoute_revap 46').eq.1) then
                  write(*,*) 'i,iiso,izone,ixt=',i,iiso,izone,ixt
                  write(*,*) 'xtrevap_tag(ixt,i)=',xtrevap_tag(ixt,i)
!                  stop
               endif
#endif               
               zxt(ixt_revap,cas(i))=max(0.0,zxt(ixt_revap,cas(i)))
            enddo !do izone=1,ntraceurs_zone
         enddo !do iiso=1,niso
      enddo !do i=1,ncas_evap_liq

#ifdef ISOVERIF
      do i=1,ncas
        do ixt=1,ntraciso
            call iso_verif_positif_choix(zxt(ixt,cas(i)),0.0, &
     &                   'ajoute_revap 40')
        enddo
      enddo !do i=1,ncas
#endif      

      return
      end subroutine ajoute_revap


      function is_in_bassin(lat,lon,bassin)
      USE isotrac_mod, only: use_bassin_atlantic,use_bassin_medit, &
&       use_bassin_indian,use_bassin_austral,use_bassin_pacific, &
&       use_bassin_MerArabie,use_bassin_BengalGolf,use_bassin_SouthIndian, &
&       use_bassin_tropics,use_bassin_midlats,use_bassin_HighLats, &
&       bassin_atlantic,bassin_medit, &
&       bassin_indian,bassin_austral,bassin_pacific, &
&       bassin_MerArabie,bassin_BengalGolf,bassin_SouthIndian, &
&       bassin_tropics,bassin_midlats,bassin_HighLats
      implicit none
      ! répond true si lat,lon se trouve dans le bassin numéroté bassin

      ! input
      integer bassin
      real lat,lon

      ! outut
      logical is_in_bassin

      ! locals
      !logical is_in_rectangle
      !logical is_in_triangle
      
      is_in_bassin=.false.
#ifdef ISOVERIF      
      write(*,*) 'is_in_basin 84: entree,bassin=',bassin
#endif
      if (use_bassin_atlantic .and. bassin==bassin_atlantic) then
#ifdef ISOVERIF           
          write(*,*) 'bassin Atlantique?'
#endif          
          if (is_in_rectangle(lon,lat,-67.0,28.0,20.0,-45.0)) then
            ! boite sud
            is_in_bassin=.true.
            return
          endif
          if (is_in_rectangle(lon,lat,-100.0,40.0,-5.3,28.0)) then
            ! ouest gibraltar    
            is_in_bassin=.true.
            return
          endif
          if (is_in_rectangle(lon,lat,-100.0,48.0,0.0,40.0)) then
            ! Ouest France
            is_in_bassin=.true.
            return
          endif 
          if (is_in_rectangle(lon,lat,-90.0,80.0,10.0,46.0)) then
            ! Atlantic Nord
            is_in_bassin=.true.
            return
          endif
          if (is_in_triangle(lon,lat, &
     &           -62.0,0.0,-62.0,30.0,-112.0,30.0)) then
            ! golfe du Mexique
            is_in_bassin=.true.
            return
          endif

      else if (use_bassin_medit .and. bassin==bassin_medit) then
#ifdef ISOVERIF           
          write(*,*) 'bassin Medit?'
#endif          
          if (is_in_rectangle(lon,lat,0.0,48.0,45.0,29.0)) then
            is_in_bassin=.true.
            return
          endif
          if (is_in_rectangle(lon,lat,-5.3,42.0,45.0,29.0)) then
            is_in_bassin=.true.
            return
          endif

      else if (use_bassin_indian .and. bassin==bassin_indian) then
#ifdef ISOVERIF           
          write(*,*) 'bassin indian?'
#endif           
          if (is_in_rectangle(lon,lat,20.0,30.0,110.0,-45.0)) then
            is_in_bassin=.true.
            return
          endif
          if (is_in_triangle(lon,lat, &
     &           90.0,30.0,90.0,-45.0,150.0,-45.0)) then
            ! Ouest Australie
            is_in_bassin=.true.
            return
          endif   

      else if (use_bassin_SouthIndian .and. bassin==bassin_SouthIndian) then
#ifdef ISOVERIF           
          write(*,*) 'bassin indian hemisphere Sud?'
#endif           
          if (is_in_rectangle(lon,lat,20.0,0.0,120.0,-45.0)) then
            is_in_bassin=.true.
            return
          endif
          
      else if (use_bassin_MerArabie .and. bassin==bassin_MerArabie) then
#ifdef ISOVERIF           
          write(*,*) 'bassin Mer d''Arabie?'
#endif           
          if (is_in_rectangle(lon,lat,20.0,30.0,76.0,0.0)) then
            is_in_bassin=.true.
            return
          endif 

      else if (use_bassin_BengalGolf .and. bassin==bassin_BengalGolf) then
#ifdef ISOVERIF           
          write(*,*) 'bassin Golfe du Bengale?'
#endif           
          if (is_in_rectangle(lon,lat,76.0,30.0,110.0,0.0)) then
            is_in_bassin=.true.
            return
          endif         

      else if (use_bassin_pacific .and. bassin==bassin_pacific) then
#ifdef ISOVERIF           
          write(*,*) 'bassin Pacific?'
#endif          
         if (is_in_rectangle(lon,lat,-180.0,80.0,-100.0,-45.0)) then
             ! pacifique Est
            is_in_bassin=.true.
            return
          endif
          if (is_in_rectangle(lon,lat,110.0,80.0,180.0,28.0)) then
            ! Pacifique Nord Ouest
            is_in_bassin=.true.
            return
          endif 
          if (is_in_rectangle(lon,lat,120.0,80.0,180.0,-45.0)) then
            ! Pacifique central Sud
            is_in_bassin=.true.
            return
          endif
          if (is_in_triangle(lon,lat, &
     &            90.0,28.0,150.0,-45.0,150.0,28.0)) then
            ! Pacifque Sud Ouest
            is_in_bassin=.true.
            return
          endif
          if (is_in_triangle(lon,lat, &
     &            -62.0,0.0,-112.0,30.0,-112.0,0.0)) then
            ! Ouest Amérique centrale
            is_in_bassin=.true.
            return
          endif
          if (is_in_rectangle(lon,lat,-180.0,0.0,-67.0,-45.0)) then
            ! Ouest Chili
            is_in_bassin=.true.
            return
          endif

      else if (use_bassin_austral .and. bassin==bassin_austral) then  
#ifdef ISOVERIF           
          write(*,*) 'bassin austral?'
#endif           
          if (lat.lt.-45.0+0.2) then
                is_in_bassin=.true.
                return    
          endif  

      else if (use_bassin_HighLats .and. bassin==bassin_HighLats) then  
#ifdef ISOVERIF           
          write(*,*) 'bassin hautes lats?'
#endif           
          if (abs(lat).gt.35.0) then
                is_in_bassin=.true.
                return    
          endif

      else if (use_bassin_tropics .and. bassin==bassin_tropics) then  
#ifdef ISOVERIF           
          write(*,*) 'bassin tropics?'
#endif           
          if (abs(lat).lt.15.0) then
                is_in_bassin=.true.
                return    
          endif

       else if (use_bassin_midlats .and. bassin==bassin_midlats) then  
#ifdef ISOVERIF           
          write(*,*) 'bassin mid lats?'
#endif           
          if ((abs(lat).ge.15.0).and. &
     &           (abs(lat).le.35.0)) then
                is_in_bassin=.true.
                return    
          endif    

      else
          write(*,*) 'iso_traceurs_routines 59: bassin inconnu'
          write(*,*) 'bassin_atlantic=' ,bassin_atlantic  
          write(*,*) 'bassin_medit=' ,bassin_medit
          write(*,*) 'bassin_indian=' ,bassin_indian
          write(*,*) 'bassin_austral=' ,bassin_austral
          write(*,*) 'bassin_MerArabie=' ,bassin_MerArabie
          write(*,*) 'bassin_BengalGolf=' ,bassin_BengalGolf
          write(*,*) 'bassin_SouthIndian=' ,bassin_SouthIndian
          write(*,*) 'use_bassin_atlantic=' ,use_bassin_atlantic  
          write(*,*) 'use_bassin_medit=' ,use_bassin_medit
          write(*,*) 'use_bassin_indian=' ,use_bassin_indian
          write(*,*) 'use_bassin_austral=' ,use_bassin_austral
          write(*,*) 'use_bassin_MerArabie=' ,use_bassin_MerArabie
          write(*,*) 'use_bassin_BengalGolf=' ,use_bassin_BengalGolf
          write(*,*) 'use_bassin_SouthIndian=' ,use_bassin_SouthIndian
          stop
      endif
      
      return
      end function is_in_bassin

      subroutine find_bassin(lat,lon,bassin)
      use isotrac_mod, only: izone_poubelle,ntraceurs_zone=>ntiso,option_traceurs, &
&        bassin_map
#ifdef ISOVERIF
        use isotopes_verif_mod
#endif
      implicit none

      ! inputs
      real lat,lon
      ! output
      integer bassin
      !locals
      logical continu
      !logical is_in_bassin

      continu=.true.
      bassin=1
     
#ifdef ISOVERIF       
      write(*,*) ''
      write(*,*) 'find bassin lat,lon=',lat,lon
#endif       
      do while (continu)
!#ifdef ISOVERIF       
!!      write(*,*) 'find_bassin 169: lat,lon,bassin=',lat,lon,bassin
!#endif       
         if (is_in_bassin(lat,lon,bassin)) then
                continu=.false.
#ifdef ISOVERIF                 
                write(*,*) 'find_bassin 173: trouve: bassin=',bassin
#endif                 
         else
!#ifdef ISOVERIF              
!             write(*,*) 'find_bassin 175: pas trouve: bassin=',bassin
!#endif              
             bassin=bassin+1
         endif
         if (bassin.eq.izone_poubelle) then
                continu=.false.
                bassin=izone_poubelle
!#ifdef ISOVERIF                 
!                write(*,*) 'find_bassin 179: poubelle: bassin=',bassin
!#endif  
         endif
       enddo

       ! normalement, le bassin est soit un bassin oce, soit un résidu
       ! donc bassin<=ntraceurs_zone-1
#ifdef ISOVERIF
       call iso_verif_positif(float(ntraceurs_zone-1-bassin), &
     &           'find_bassin 195')
#endif

        return
        end subroutine find_bassin

        subroutine initialise_bassins_boites(presnivs)
        USE dimphy, only: klev
        USE geometry_mod, ONLY : longitude_deg, latitude_deg
        use isotrac_mod, only: bassin_map,option_traceurs,boite_map
#ifdef ISOVERIF
        use isotopes_verif_mod
#endif
        implicit none
        real presnivs(klev)

       if (option_traceurs.eq.3) then
           ! initialisation de bassin_map
           call bassin_map_init(latitude_deg,longitude_deg,bassin_map)
       else if (option_traceurs.eq.20) then
           ! initialisation de bassin_map selon < ou > 35° lat
           write(*,*) 'physiq 1681: init de la map pour tag 20'
           call bassin_map_init_opt20(latitude_deg,bassin_map)
       else if (option_traceurs.eq.5) then
           call boite_AMMA_init(latitude_deg,longitude_deg,presnivs,boite_map)
       else if (option_traceurs.eq.21) then
           call boite_UT_extra_init(latitude_deg,longitude_deg,presnivs,boite_map)
       endif

        return
        end subroutine initialise_bassins_boites

        subroutine bassin_map_init(lat,lon,bassin_map)
        USE dimphy, only: klon
#ifdef ISOVERIF
        use isotopes_verif_mod
#endif

        implicit none

        ! inputs
        real lat(klon),lon(klon)
        ! output
        integer bassin_map(klon)
        ! locals
        integer i

        do i=1,klon
             call find_bassin(lat(i),lon(i),bassin_map(i))
#ifdef ISOVERIF              
             write(*,*) 'init 233: i,lat,lon,bassin=',i,lat(i),lon(i), &
     &            bassin_map(i)
#endif             
        enddo

        return
        end subroutine bassin_map_init

        function is_in_rectangle(x,y,x1,y1,x2,y2)
        implicit none
        ! inputs 
        real x,y
        ! point en haut à gauche         
        real x1,y1
        ! point en bas à droite
        real x2,y2
        ! output
        logical is_in_rectangle

!#ifdef ISOVERIF        
!        write(*,*) 'is_in_rectange 237: x,y=',x,y
!        write(*,*) 'x1,y1,x2,y2=',x1,y1,x2,y2
!#endif         
        if ((x-x2.lt.0.1).and.(x-x1.gt.-0.1).and. &
     &            (y-y1.lt.0.1).and.(y-y2.gt.-0.1)) then
          is_in_rectangle=.true.
        else
          is_in_rectangle=.false.
        endif
!#ifdef ISOVERIF        
!        write(*,*) 'is_in_rectangle=',is_in_rectangle
!#endif        
        return
        end function is_in_rectangle

        function is_in_triangle(x,y,x1,y1,x2,y2,x3,y3)
        implicit none
        ! inputs
        real x,y
        ! points dans le sens trigo
        ! à gauche
        real x1,y1
        ! en bas
        real x2,y2
        ! à droite
        real x3,y3
        ! output
        logical is_in_triangle
        ! locals
        real det1
        real det2
        real det3
!#ifdef ISOVERIF
!        write(*,*) 'is_in_triange 271: x,y=',x,y
!        write(*,*) 'x1,y1,x2,y2,x3,y3=',x1,y1,x2,y2,x3,y3
!#endif        
        det1=(x1-x)*(y2-y)-(y1-y)*(x2-x)
        det2=(x2-x)*(y3-y)-(y2-y)*(x3-x)
        det3=(x3-x)*(y1-y)-(y3-y)*(x1-x)
        is_in_triangle=.false.
        if ((det1*det2.gt.0.0).and.(det2*det3.gt.0.0)) then
          is_in_triangle=.true.
        else
          is_in_triangle=.false.      
        endif
!#ifdef ISOVERIF        
!        write(*,*) 'det1,det2,det3,is_in_triangle',
!     :         det1,det2,det3,is_in_triangle
!#endif
        return
        end function is_in_triangle


        subroutine isotrac_recolorise_tmin(xt,t)
        USE dimphy, only: klon, klev
        USE isotrac_mod, only: zone_temp,nzone_temp
#ifdef ISOVERIF
        USE isotopes_verif_mod
#endif
        implicit none

        ! inout
        real xt(ntraciso,klon,klev)
        ! input
        real t(klon,klev)
        ! locals
        integer izone_temp 
        integer ixt,ixt_recoit
        integer k,i,izone,iiso
        !integer find_index
      

        do k=1,klev
          do i=1,klon
!#ifdef ISOVERIF
!            if (i.eq.1) then
!                write(*,*) 'recolorise 396: i,k,t=',i,k,t(i,k)
!                write(*,*) 'zone_temp=',zone_temp     
!            endif
!#endif           
            ! trouver la zone de cette température
            izone_temp=find_index(t(i,k),nzone_temp,zone_temp)

!#ifdef ISOVERIF
!            if (i.eq.1) then
!                write(*,*) 'recolorise 414: izone_temp=',izone_temp    
!            endif
!#endif            
            do izone=1,nzone_temp-1
               ! tous les tags de zone < nzone_temp se trouvant à des
               ! températures plus basses sont convertis
!#ifdef ISOVERIF
!            if (i.eq.1) then
!                write(*,*) 'recolorise 405: izone,xt_eau=',
!     :               izone,xt(index_trac(izone,iso_eau),i,k)  
!            endif
!#endif                 
               if (izone.lt.izone_temp) then                   
                  do iiso=1,niso
                   ixt=index_trac(izone,iiso) ! emmetteur
                   ixt_recoit=index_trac(izone_temp,iiso) ! recepteur
                   xt(ixt_recoit,i,k)=xt(ixt_recoit,i,k)+xt(ixt,i,k)
                   xt(ixt,i,k)=0.0 
                  enddo !do iiso=1,niso
               endif  !if (izone.lt.izone_temp) then
!#ifdef ISOVERIF
!            if (i.eq.1) then
!                write(*,*) 'recolorise 419: xt_eau,xt_recoit=',
!     :               xt(index_trac(izone,iso_eau),i,k),
!     :               xt(index_trac(izone_temp,iso_eau),i,k)
!            endif
!#endif                
            enddo !do izone=1,zone_pot(k)-1

            ! conversion de l'évap en surf et de la revap des gouttes
            do izone=nzone_temp+1,ntraceurs_zone 
              do iiso=1,niso 
                   ixt=index_trac(izone,iiso) ! emmetteur
                   ixt_recoit=index_trac(izone_temp,iiso) ! recepteur
                   xt(ixt_recoit,i,k)=xt(ixt_recoit,i,k)+xt(ixt,i,k)
                   xt(ixt,i,k)=0.0           
              enddo !do iiso=1,niso 
            enddo !do izone=nzone_temp+1,ntraceurs_zone 
          enddo !do i=1,klon
        enddo !do k=1,klev

#ifdef ISOVERIF
        do k=1,klev
          do i=1,klon
            call iso_verif_traceur(xt(1,i,k),'recolorise 403')
          enddo !do i=1,klon
        enddo !do k=1,klev
#endif

        return
        end subroutine isotrac_recolorise_tmin

        subroutine isotrac_recolorise_tmin_sfrev(xt,t)
        USE dimphy, only: klon,klev
        USE isotrac_mod, only: nzone_temp,zone_temp
#ifdef ISOVERIF
        USE isotopes_verif_mod
#endif
        implicit none

        ! recolorise selon la température minimum, mais les tags de
        ! revap sont laissés en revap

        ! inout
        real xt(ntraciso,klon,klev)
        ! input
        real t(klon,klev)
        ! locals
        integer izone_temp 
        integer ixt,ixt_recoit
        integer k,i,izone,iiso
        !integer find_index

        do k=1,klev
          do i=1,klon
            ! trouver la zone de cette température
            izone_temp=find_index(t(i,k),nzone_temp,zone_temp)

            do izone=1,nzone_temp-1
               ! tous les tags de zone < nzone_temp se trouvant à des
               ! températures plus basses sont convertis
               ! sauf la revap
               ! le tag de la revap est nzone_temp+1=ntraceurs_zone
               if (izone.lt.izone_temp) then                   
                  do iiso=1,niso
                   ixt=index_trac(izone,iiso) ! emmetteur
                   ixt_recoit=index_trac(izone_temp,iiso) ! recepteur
                   xt(ixt_recoit,i,k)=xt(ixt_recoit,i,k)+xt(ixt,i,k)
                   xt(ixt,i,k)=0.0 
                  enddo !do iiso=1,niso
               endif  !if (izone.lt.izone_temp) then
            enddo !do izone=1,zone_pot(k)-1

          enddo !do i=1,klon
        enddo !do k=1,klev

#ifdef ISOVERIF
        do k=1,klev
          do i=1,klon
            call iso_verif_traceur(xt(1,i,k),'recolorise 594')
          enddo !do i=1,klon
        enddo !do k=1,klev
#endif

        return
        end subroutine isotrac_recolorise_tmin_sfrev


        subroutine isotrac_recolorise_saturation(xt,rh,lat,pres)
        USE dimphy, only: klon,klev
#ifdef ISOVERIF
        USE isotopes_verif_mod
#endif
        implicit none

        ! recolorise selon la température minimum, mais les tags de
        ! revap sont laissés en revap

        ! inout
        real xt(ntraciso,klon,klev)
        ! input
        real rh(klon,klev)
        real lat(klon)
        real pres(klev)
        ! locals
        integer izone_recoit
        integer ixt,ixt_recoit
        integer k,i,izone,iiso
        logical continu
        real rh_seuil
        parameter (rh_seuil=0.90)
        !integer index_zone_latpres

#ifdef ISOVERIF
        do k=1,klev
          do i=1,klon
            call iso_verif_traceur(xt(1,i,k),'recolorise 612')
          enddo !do i=1,klon
        enddo !do k=1,klev        
#endif

        ! on ne sature pas les 2 premières couches: on les laisse se
        ! recharger en evap de surface
        do k=3,klev
          do i=1,klon
            if (rh(i,k).gt.rh_seuil) then
                izone_recoit=index_zone_latpres(lat(i),pres(k))
                do izone=1,ntraceurs_zone
                 if (izone.ne.izone_recoit) then
                  do iiso=1,niso
                   ixt=index_trac(izone,iiso) ! emmetteur
                   ixt_recoit=index_trac(izone_recoit,iiso) ! recepteur
                   xt(ixt_recoit,i,k)=xt(ixt_recoit,i,k)+xt(ixt,i,k)
                   xt(ixt,i,k)=0.0 
                  enddo !do iiso=1,niso
                 endif
                enddo !do izone=1,ntraceurs_zone
            endif !if (rh(i,k).gt.rh_seuil) then
          enddo !do i=1,klon
        enddo !do k=1,klev

#ifdef ISOVERIF
        do k=1,klev
          do i=1,klon
            call iso_verif_traceur(xt(1,i,k),'recolorise 637')
          enddo !do i=1,klon
        enddo !do k=1,klev
#endif

        return
        end subroutine isotrac_recolorise_saturation

        subroutine isotrac_recolorise_boite(xt,boite_map)
        USE dimphy, only: klon,klev
#ifdef ISOVERIF
        USE isotopes_verif_mod
#endif
        implicit none

        ! subroutine écrite à la base pour tagguer 3 boites AMMA.
        ! Mais ça peut être générique, selon comment est initialisée boite_map

        ! inout
        real xt(ntraciso,klon,klev)
        ! input
        integer boite_map(klon,klev)
        ! locals
        integer i,k
        integer izone_recoit,izone,iiso
        integer ixt,ixt_recoit
        
        do k=1,klev
          do i=1,klon
            izone_recoit=boite_map(i,k)
            if (izone_recoit.gt.0) then
                ! on est dans une boite connue
                ! toutes les molécules sont converties en cete couleur
               do izone=1,ntraceurs_zone
                  if (izone.ne.izone_recoit) then
                      ! on met les traceurs izone dans izone_recoit
                      do iiso=1,niso
                        ixt=index_trac(izone,iiso)
                        ixt_recoit=index_trac(izone_recoit,iiso)
                        xt(ixt_recoit,i,k)=xt(ixt_recoit,i,k) &
     &                         +xt(ixt,i,k)
                        xt(ixt,i,k)=0.0
                      enddo
                  endif !if (izone.ne.izone_recoit) then
               enddo !do izone=2,ntraceurs_zone
            endif !if (izone_recoit.gt.0) then
          enddo !do i=1,klon
        enddo !do k=1,klev

#ifdef ISOVERIF
        do k=1,klev
          do i=1,klon
            call iso_verif_traceur(xt(1,i,k),'recolorise 514')
          enddo !do i=1,klon
        enddo !do k=1,klev
#endif

        return
        end subroutine isotrac_recolorise_boite

        subroutine isotrac_recolorise_extra(xt,rlat)
        USE dimphy, only: klon,klev
        usE isotrac_mod, only: lim_tag20,izone_trop,izone_extra
#ifdef ISOVERIF
        USE isotopes_verif_mod
#endif
        implicit none

        ! subroutine écrite pour l'option de taggage 20
        ! permet de retagguer la vapeur tropicale en vapeur
        ! extratropicale dès qu'elle atteint 35° de latitude

        ! inout
        real xt(ntraciso,klon,klev)
        ! input
        real rlat(klon)
        ! locals
        integer i,k
        integer iiso,ixt,ixt_recoit
       
!        write(*,*) 'iso_traceurs_routines 723: lim_tag20=',lim_tag20
        do k=1,klev
          do i=1,klon
            if (abs(rlat(i)).gt.lim_tag20) then
                ! on met les traceurs izone_trop dans izone_extra
                do iiso=1,niso
                    ixt=index_trac(izone_trop,iiso)
                    ixt_recoit=index_trac(izone_extra,iiso)
                        xt(ixt_recoit,i,k)=xt(ixt_recoit,i,k) &
     &                         +xt(ixt,i,k)
                        xt(ixt,i,k)=0.0
                 enddo                  
            endif ! if (abs(rlat(i)).lt.35.0) then
          enddo !do i=1,klon
        enddo !do k=1,klev

#ifdef ISOVERIF
        do k=1,klev
          do i=1,klon
            call iso_verif_traceur(xt(1,i,k),'recolorise 741')
          enddo !do i=1,klon
        enddo !do k=1,klev
#endif

        return
        end subroutine isotrac_recolorise_extra

        subroutine isotrac_recolorise_conv(xt,rlat,presnivs,rain_con)
        USE dimphy, only: klon,klev
        use isotrac_mod, only: lim_precip_tag22, &
&       izone_conv_BT,izone_conv_UT
#ifdef ISOVERIF
        USE isotopes_verif_mod
#endif
        implicit none

        ! subroutine écrite pour l'option de taggage 20
        ! permet de retagguer la vapeur tropicale en vapeur
        ! extratropicale dès qu'elle atteint 35° de latitude

        ! inout
        real xt(ntraciso,klon,klev)
        ! input
        real rlat(klon)
        real presnivs(klev)
        real rain_con(klon)
        ! locals
        integer i,k
        integer iiso,ixt,ixt_recoit,izone
       
!        write(*,*) 'iso_traceurs_routines 723: lim_tag20=',lim_tag20
!        write(*,*) 'presnivs=',presnivs
!        stop
        do k=1,klev
          do i=1,klon
#ifdef ISOVERIF
          if ((abs(rlat(i)).lt.30.0).and.(k.eq.1)) then
          endif
#endif          
            if ((abs(rlat(i)).lt.30.0).and. &
     &            (rain_con(i)*86400.gt.lim_precip_tag22)) then
            
                ! on met les traceurs izone_trop dans izone_conv fn z                
                do iiso=1,niso
                  if (presnivs(k).gt.650.0*100.0) then
                    ixt_recoit=index_trac(izone_conv_BT,iiso) 
                  else
                    ixt_recoit=index_trac(izone_conv_UT,iiso) 
                  endif
                  do izone=1,ntraceurs_zone
                    ixt=index_trac(izone,iiso)
                    if (ixt.ne.ixt_recoit) then                    
                        xt(ixt_recoit,i,k)=xt(ixt_recoit,i,k) &
     &                         +xt(ixt,i,k)
                        xt(ixt,i,k)=0.0
                    endif !if (ixt.ne.ixt_recoit) then
                  enddo !do izone=1,ntraceurs_zone
                enddo !do iiso=1,niso
!                write(*,*) 'k,presnivs,ixt,ixt_recoit=',k,presnivs(k),
!     :                   ixt,ixt_recoit
!                write(*,*) 'xt(:,i,k)=',xt(:,i,k)
            endif ! if (abs(rlat(i)).lt.35.0) then
          enddo !do i=1,klon
        enddo !do k=1,klev

#ifdef ISOVERIF
        do k=1,klev
          do i=1,klon
            call iso_verif_traceur(xt(1,i,k),'recolorise 741')
          enddo !do i=1,klon
        enddo !do k=1,klev
#endif

        return
        end subroutine isotrac_recolorise_conv


        subroutine boite_AMMA_init(lat,lon,presnivs,boite_map)
        USE dimphy, only: klon,klev
#ifdef ISOVERIF
        USE isotopes_verif_mod
#endif
        USE isotrac_mod, only: izone_aej,izone_mousson,izone_harmattan
        implicit none

        real lat(klon),lon(klon)
        real presnivs(klev)
        ! output
        integer boite_map(klon,klev)
        ! locals
        integer i,k

!        write(*,*) 'izone_aej,izone_mousson,izone_harmattan=',
!     :       izone_aej,izone_mousson,izone_harmattan    
        do k=1,klev
          do i=1,klon
                boite_map(i,k)=0.0
!                write(*,*) 'i,k,lat,lon,pres=',
!     :                   i,k,lat(i),lon(i),presnivs(k)
                if ((presnivs(k).le.700.0*100.0).and. &
     &              (presnivs(k).gt.400.0*100.0).and. &
     &              (lat(i).gt.8.0).and. &
     &              (lat(i).lt.20.0).and. &
     &              (lon(i).gt.10.0).and. &
     &              (lon(i).lt.30.0)) then
                   boite_map(i,k)=izone_aej
!                   write(*,*) '   -> zone AEJ'
                else if ((presnivs(k).ge.850.0*100.0).and. &
     &              (lat(i).gt.-5.0).and. &
     &              (lat(i).le.8.0).and. &
     &              (lon(i).gt.-40.0).and. &
     &              (lon(i).lt.15.0)) then
                   boite_map(i,k)=izone_mousson
!                   write(*,*) '   -> zone flux de mousson'
                else if ((presnivs(k).gt.700.0*100.0).and. &
     &              (lat(i).ge.20.0).and. &
     &              (lat(i).lt.30.0).and. &
     &              (lon(i).gt.-10.0).and. &
     &              (lon(i).lt.40.0)) then
                   boite_map(i,k)=izone_harmattan
!                   write(*,*) '   -> zone Harmattan'
                endif
!                write(*,*) '   ** boite_map=',boite_map(i,k)
          enddo
        enddo

        return
        end subroutine boite_AMMA_init

        
        subroutine boite_UT_extra_init(lat,lon,presnivs,boite_map)
        USE dimphy, only: klon,klev
        use isotrac_mod, only: izone_extra,izone_trop
#ifdef ISOVERIF
        USE isotopes_verif_mod
#endif
        implicit none

        real lat(klon),lon(klon)
        real presnivs(klev)
        ! output
        integer boite_map(klon,klev)
        ! locals
        integer i,k

!        write(*,*) 'izone_trop,izone_extra=',
!     :       izone_trop,izone_extra    
        do k=1,klev
          do i=1,klon
                boite_map(i,k)=0.0
!                write(*,*) 'i,k,lat,lon,pres=',
!     :                   i,k,lat(i),lon(i),presnivs(k)
                if ((presnivs(k).le.500.0*100.0) &
     &              .and.(abs(lat(i)).lt.15.0)) then
                   boite_map(i,k)=izone_trop
!                   write(*,*) '   -> zone trop'
                else if (abs(lat(i)).gt.35.0) then
                   boite_map(i,k)=izone_extra
!                   write(*,*) '   -> zone extratropiques'
                endif
!                write(*,*) '   ** boite_map=',boite_map(i,k)
          enddo
        enddo

        return
        end subroutine boite_UT_extra_init


        function index_zone_lat(lat)
        use isotrac_mod, only: lattag_min,dlattag,nzone_lat
        implicit none

        ! inputs
        real lat,pres
        ! output 
        integer index_zone_lat

        if (lat.lt.lattag_min) then
                index_zone_lat=1
        else
                index_zone_lat=int((lat-lattag_min)/dlattag)+2
                index_zone_lat=min(index_zone_lat,nzone_lat)
        endif

        return
        end function index_zone_lat


        function index_zone_pres(pres)
        use isotrac_mod, only: nzone_pres,zone_pres
        implicit none

        ! inputs
        real lat,pres
        ! output 
        integer index_zone_pres
        !integer find_index

        
        index_zone_pres=find_index(pres,nzone_pres,zone_pres) 
        write(*,*) 'iso_traceurs_routines 802: pres,index_zone_pres=', &
     &           pres,index_zone_pres
        write(*,*) 'zone_pres=',zone_pres(1:nzone_pres-1)

        return
        end function index_zone_pres

        function find_index(pres,nzone_pres,zone_pres)
        implicit none

        ! inputs
        real pres
        integer nzone_pres
        real zone_pres(nzone_pres)
        ! output 
        integer find_index
        logical continu

        if (nzone_pres.gt.1) then
          if (pres.ge.zone_pres(1)) then
                find_index=1
          else if (pres.lt.zone_pres(nzone_pres-1)) then
                find_index=nzone_pres
          else !if (t(i,k).ge.zone_temp1) then
                continu=.true.
                find_index=2
                do while (continu)
                  if (pres.ge.zone_pres(find_index)) then
                     continu=.false. 
                     ! c'est izone_temp, zone trouvée
                  else   
                     find_index=find_index+1
                  endif     
                enddo !do while (continu)
           endif !if (t(i,k).ge.zone_temp1) then

        else !if (nzone_pres.gt.1) then
            find_index=1
        endif !if (nzone_pres.gt.1) then

        return
        end function find_index

        function index_zone_latpres(lat,pres)
        use isotrac_mod, only: nzone_lat
        implicit none

        ! inputs
        real lat,pres
        ! output 
        integer index_zone_latpres
        ! locals
        integer index_lat
        integer index_pres
        !integer index_zone_lat
        !integer index_zone_pres

        index_lat=index_zone_lat(lat)
        index_pres=index_zone_pres(pres)
        index_zone_latpres=index_lat+(index_pres-1)*nzone_lat

        return
        end function index_zone_latpres

        subroutine iso_recolorise_condensation(qt,cond, &
     &           xt,zxtcond,tcond,ep,xtres, &
     &           seuil_in)
        USE dimphy, only: klon,klev
        USE isotopes_mod, only: bidouille_anti_divergence,iso_eau
        use isotrac_mod, only: option_seuil_tag_tmin,izone_cond, &
&       nzone_temp,zone_temp
#ifdef ISOVERIF
        USE isotopes_verif_mod
#endif
        implicit none

        ! on recolorise la vapeur résiduelle selon la température de condensation
        ! on supose qu'une vapeur xt,q condense en cond,zxtcond, à une
        ! température tcond. A ce stade, la vapeur initiale n'est pas
        ! retranchée de son condensat. On calcule les tags dans la vepru
        ! résiduelle xtres qu'on aurait si on retranchait un fraction ep du
        ! condensat

        ! inputs
        real qt
        real cond
        real tcond
        real ep
        real xt(ntraciso)
        real zxtcond(ntraciso)
        real seuil_in
        ! outputs
        real xtres(ntraciso)
        ! locals
        integer izone_temp,izone 
        integer ixt,ixt_recoit
        integer iiso
        !integer find_index
        real fcond, qmicro
!        real f

        if ((cond.gt.0.0).and.(qt.gt.0.0)) then        

            izone_temp=find_index(tcond,nzone_temp,zone_temp)
!            WRITE(*,*) 'pgm 901 tmp: izone_temp=',izone_temp    
#ifdef ISOVERIF
           do ixt=1,ntraciso
              call iso_verif_positif(xt(ixt)-zxtcond(ixt), &
     &           'iso_trac 898')
           enddo  !do ixt=1,ntraciso  
           call iso_verif_traceur_justmass(xt, &
     &          'iso_trac_routines 906')                
           call iso_verif_traceur_justmass(zxtcond, &
     &          'iso_trac_routines 908')
#endif           
          ! bidouille
          if (bidouille_anti_divergence) then
              call iso_verif_traceur_jbidouille(xt)
              call iso_verif_traceur_jbidouille(zxtcond)  
          endif 

          do ixt=1,niso
            xtres(ixt)=xt(ixt)-ep*zxtcond(ixt)
          enddo
          do ixt=1+niso,ntraciso
            xtres(ixt)=0.0
          enddo
!          write(*,*) 'iso_trac_routines tmp 916: xtres=',xtres

#ifdef ISOVERIF 
        do ixt=1,ntraciso
          call iso_verif_positif(xtres(ixt), &
     &              'iso_trac_routines 921')
        enddo
#endif          

             ! cas de izone sfc et izone precip et izone cond et izone< izone_temp

!             write(*,*) 'iso_trac 940: cond/qt,seuil_in,izone_temp=',
!     :                   cond/qt,seuil_in,izone_temp

             if (option_seuil_tag_tmin.eq.2) then
                 qmicro=0.0
                 do izone=nzone_temp+1,ntraceurs_zone 
                   ixt= index_trac(izone,iso_eau)  
                   qmicro=qmicro+xt(ixt)
                 enddo !do izone=nzone_temp+1,ntraceurs_zone
                 if (qt-qmicro.gt.0.0) then 
                     fcond=(cond-qmicro)/(qt-qmicro)
                 else
                     fcond=0.0   
                 endif
             else
                 fcond=cond/qt
             endif
       
             if (fcond.gt.seuil_in) then

             ! on les transfert à izone_temp
             do izone=1,ntraceurs_zone
               if ((izone.gt.nzone_temp).or.(izone.lt.izone_temp)) then
!                 ieau=index_trac(izone,iso_eau)
                 do iiso=1,niso  
                   ixt= index_trac(izone,iiso)    
                   ixt_recoit=index_trac(izone_temp,iiso) ! recepteur                 
                   xtres(ixt_recoit)=xtres(ixt_recoit) &
     &                   +(xt(ixt)-zxtcond(ixt))
                   xtres(ixt)=0.0   
!                   write(*,*) 'iso_trac 920: izone,ixt,',
!     :                 'ixt_recoit=',
!     :                 izone,ixt,ixt_recoit     
!                   write(*,*) 'isotrac 924: xt=',xt
!                   write(*,*) 'isotrac 925: zxtcond=',zxtcond
                 enddo !do iiso=1,niso
!                 write(*,*) 'iso_trac tmp 944: izone,xtres=',izone,xtres
                endif !if (izone.ne.izone_cond) then  
              enddo !do izone=nzones_temp+1,ntraceurs_zone

             else !if (cond/qt.gt.seuil_in) then
                
                ! on les laisse sur place
               do izone=1,ntraceurs_zone
                if ((izone.gt.nzone_temp).or.(izone.lt.izone_temp)) then
                 do iiso=1,niso  
                   ixt= index_trac(izone,iiso)    
                   xtres(ixt)=(xt(ixt)-zxtcond(ixt))
                 enddo !do iiso=1,niso
                endif !if (izone.ne.izone_cond) then  
               enddo !do izone=nzones_temp+1,ntraceurs_zone

             endif !if (cond/qt.gt.seuil_in) then

              ! izone_temp est conservé, on lui enlève juste son
              ! condesat
              do iiso=1,niso  
                   ixt_recoit=index_trac(izone_temp,iiso) ! recepteur                 
                   xtres(ixt_recoit)=xtres(ixt_recoit) &
     &                   +(xt(ixt_recoit)-zxtcond(ixt_recoit))
              enddo !do iiso=1,niso  

#ifdef ISOVERIF 
        do ixt=1,ntraciso
          call iso_verif_positif(xtres(ixt), &
     &              'iso_trac_routines 940')
        enddo
#endif

             ! cas des zones > izone temp
             ! on conserve le condensat résiduel
             do izone=izone_temp+1,nzone_temp   
               do iiso=1,niso
                   ixt= index_trac(izone,iiso)
                   xtres(ixt)=xt(ixt)-zxtcond(ixt)
!                   write(*,*) 'iso_trac 931: izone,ixt,ixt_recoit=',
!     :                 izone,ixt,ixt_recoit       
!                   write(*,*) 'isotrac 934: xt=',xt
!                   write(*,*) 'isotrac 935: zxtice=',zxtice
               enddo !do iiso=1,niso  
!               write(*,*) 'iso_trac tmp 965: izone,xtres=',izone,xtres
             enddo !do izone=izone_temp+1,nzones_temp

             ! on rajoute le condensat qui ne precipite pas
             if (ep.lt.1.0) then
               do iiso=1,niso    
                   ixt= index_trac(izone_cond,iiso) 
                   xtres(ixt)=xtres(ixt)+(1.0-ep)*zxtcond(iiso)
!                   write(*,*) 'iso_trac 940: izone,ixt,ixt_recoit=',
!     :                 izone,ixt,ixt_recoit     
!                   write(*,*) 'isotrac 1014: xt=',xt
!                   write(*,*) 'isotrac 945: zxtice=',zxtice
                enddo  !do iiso=1,niso      
            endif !if (ep.lt.0.0) then

        else
            ! si cond=0 ou qt=0, tot reste pareil
           do ixt=1,ntraciso
                xtres(ixt)=xt(ixt)
           enddo  !do ixt=1,ntraciso     

        endif ! if (qt.gt.0.0) then    

#ifdef ISOVERIF
        if (iso_verif_traceur_jm_nostop(xtres, &
     &          'iso_trac_routines 166').eq.1) then
          write(*,*) 'isotrac 1024: xt=',xt
          write(*,*) 'zxtcond=',zxtcond
          write(*,*) 'xtres=',xtres
          write(*,*) 'ep=',ep
          stop
        endif 
#endif          
#ifdef ISOVERIF              
        do ixt=1,ntraciso
          call iso_verif_positif(xtres(ixt),'iso_trac_routines 953')
        enddo
        if (nzone_temp.ge.5) then 
        if (iso_verif_tag17_q_deltaD_chns(xtres, &
     &           'iso_trac_routines 1025').eq.1) then
            write(*,*) 'xt=',xt
            write(*,*) 'zxtcond=',zxtcond
            write(*,*) 'xtres=',xtres
            write(*,*) 'ep=',ep
            write(*,*) 'tcond=',tcond
            write(*,*) 'izone_temp=',izone_temp
            stop
        endif
        endif
!       write(*,*) 'isotrac 1048: sortie de iso_recolorise_condensation'
#endif

            return
            end subroutine iso_recolorise_condensation

        subroutine bassin_map_init_opt20(lat,bassin_map)
        USE dimphy, only: klon
        use isotrac_mod, only: izone_cont,izone_trop,lim_tag20
#ifdef ISOVERIF
        USE isotopes_verif_mod
#endif
        implicit none

        ! inputs
        real lat(klon)
        ! output
        integer bassin_map(klon)
        ! locals
        integer i

        write(*,*) 'iso_traceurs_routines 1142: lim_tag20=',lim_tag20
        do i=1,klon
         if (abs(lat(i)).gt.lim_tag20) then   
             bassin_map(i)=izone_cont
         else  
             bassin_map(i)=izone_trop
         endif
        enddo !do i=1,klon
        
        return
        end subroutine bassin_map_init_opt20

        subroutine isotrac_recolorise_general(xt_seri,t_seri,zx_rh,presnivs)
        USE geometry_mod, ONLY : latitude_deg
        USE dimphy, only: klon,klev
        use isotrac_mod, only: option_traceurs,boite_map
        implicit none

        ! inputs
        real, dimension(ntraciso,klon,klev), intent(in) :: xt_seri
        real, dimension(klon,klev), intent(in) :: t_seri
        real, dimension(klon,klev), intent(in) :: zx_rh
        real, dimension(klev), intent(in) :: presnivs

              if (option_traceurs.eq.4) then
         call isotrac_recolorise_tmin(xt_seri,t_seri)
      elseif ((option_traceurs.eq.5).or. &
     &            (option_traceurs.eq.21)) then
        call isotrac_recolorise_boite(xt_seri,boite_map)
      elseif (option_traceurs.eq.13) then
        call isotrac_recolorise_tmin_sfrev(xt_seri,t_seri)
      elseif (option_traceurs.eq.14) then
        call isotrac_recolorise_saturation(xt_seri,zx_rh,latitude_deg,presnivs)
      elseif (option_traceurs.eq.20) then      
        call isotrac_recolorise_extra(xt_seri,latitude_deg)
      endif !if (option_traceurs.eq.4) then

        return
        end subroutine isotrac_recolorise_general


        

        subroutine iso_verif_traceur_jbid_vect(x,n,m)
        USE isotopes_mod, ONLY: bidouille_anti_divergence,iso_eau,ridicule
        !use isotrac_mod, only: ntraceurs_zone=>nzone
        USE infotrac_phy, ONLY: ntraceurs_zone=>nzone
        implicit none
        
        ! version vectrisée de iso_verif_traceur_jbidouille
            ! inputs
       integer n,m
       real x(ntraciso,n,m)

       ! locals
       integer iiso,izone,ixt,i,j
       real xtractot(n,m)
                
        if (bidouille_anti_divergence) then        
        do iiso=1,niso

          do j=1,m
           do i=1,n          
            xtractot(i,j)=0.0
           enddo !do j=1,m
          enddo !do j=1,m

          do izone=1,ntraceurs_zone  
            ixt=index_trac(izone,iiso) 
            do j=1,m
             do i=1,n
              xtractot(i,j)=xtractot(i,j)+x(ixt,i,j)
             enddo !do j=1,m
            enddo !do j=1,m
           enddo !do izone=1,ntraceurs_zone
         
              ! on réajuste pour que les traceurs fasses bien la somme
              ! des traceurs
           do izone=1,ntraceurs_zone
            ixt=index_trac(izone,iiso)
            do j=1,m
             do i=1,n
!              if (abs(xtractot(i,j)).gt.ridicule*10) then 
               if (abs(xtractot(i,j)).gt.ridicule) then 
                   ! modif le 19 fev 2011
                  x(ixt,i,j)=x(ixt,i,j)/xtractot(i,j)*x(iiso,i,j) 
              endif !if (abs(xtractot(i,j)).gt.ridicule*10) then
             enddo !do i=1,n
            enddo !do j=1,m   
           enddo !do izone=1,ntraceurs_zone 
 
!           ! ajout le 19 fev 2011
!           ! on rend plutot les vérifs plus strictes
!           ixt=index_trac(izone_poubelle,iiso)
!           do j=1,m
!             do i=1,n
!              if ((abs(xtractot(i,j)).lt.1e-18).and.
!     :           (x(iiso,i,j).gt.ridicule)) then
!                  x(ixt,i,j)=x(iiso,i,j)
!              endif !if (abs(xtractot(i,j)).gt.ridicule*10) then
!             enddo ! do i=1,n
!           enddo !do j=1,m

        enddo !do iiso=1,ntraceurs_iso  
        endif !if (bidouille_anti_divergence) then    

        end subroutine iso_verif_traceur_jbid_vect

        subroutine iso_verif_traceur_jbidouille(x)
        USE isotopes_mod, ONLY: bidouille_anti_divergence,iso_eau,ridicule
        implicit none
        
        ! on réajuste aussi les valeurs des traceurs pour la
        ! conservation de la masse, dans le cas bidouille
       
       ! inputs
       real x(ntraciso)

       ! locals
       integer iiso,izone,ixt
       real xtractot
        
        if (bidouille_anti_divergence) then

        do iiso=1,niso

          xtractot=0.0
          do izone=1,ntraceurs_zone  
            ixt=index_trac(izone,iiso) 
            xtractot=xtractot+x(ixt)
          enddo !do izone=1,ntraceurs_zone
         
              ! on réajuste pour que les traceurs fasses bien la somme
              ! des traceurs
              if (abs(xtractot).gt.ridicule*10) then
                do izone=1,ntraceurs_zone
                  ixt=index_trac(izone,iiso) 
                  x(ixt)=x(ixt)/xtractot*x(iiso)
                enddo !do izone=1,ntraceurs_zone                
              endif         

        enddo !do iiso=1,ntraceurs_iso   
        endif !if (bidouille_anti_divergence) then     

        end subroutine iso_verif_traceur_jbidouille


        subroutine iso_verif_traceur_jbid_pos(x)
        USE isotopes_mod, ONLY: bidouille_anti_divergence,iso_eau,ridicule
!#ifdef ISOVERIF
!        use isotopes_verif_mod, only: iso_verif_traceur_pbidouille
!#endif
        implicit none
        
        ! on réajuste les valeurs des traceurs pour qu'il n'y ai pas de
        ! valeurs négatives. Si valeurs négatives -> on pompe les autres
        ! traceurs
        ! attention: fait la même chose pour tous les isos -> peut
        ! induire des fractionnements.
        ! Pour ne pas induire des fractionnements, prendre 
        ! iso_verif_traceur_jbid_pos2
        ! avantage de cette subroutine: conserve la masse en isotopes
        ! légers, ce qui nest pas le cas de pos2
          
       ! inputs
       real x(ntraciso)

       ! locals
       integer iiso,izone,ixt
       real xtractot,xtractotprec
        
        if (bidouille_anti_divergence) then

!            write(*,*) 'pgm 532 tmp: x=',x
        do iiso=1,niso

          xtractot=0.0
          xtractotprec=0.0
          do izone=1,ntraceurs_zone  
            ixt=index_trac(izone,iiso) 
            xtractotprec=xtractotprec+x(ixt)
            x(ixt)=max(x(ixt),0.0) 
            xtractot=xtractot+x(ixt)
          enddo !do izone=1,ntraceurs_zone
!          write(*,*) 'iiso,xtractotprec,xtractot=',
!     :          iiso,xtractotprec,xtractot
         
          if (xtractot.gt.xtractotprec) then
              ! on réajuste pour que les traceurs fasses bien la somme
              ! des traceurs
              if (abs(xtractot).gt.ridicule) then
                do izone=1,ntraceurs_zone
                  ixt=index_trac(izone,iiso) 
                  x(ixt)=x(ixt)*xtractotprec/xtractot
                enddo !do izone=1,ntraceurs_zone  
                ! on modifie aussi l'isotope de base si lui aussi était
                ! négatif   
!                x(iiso)=xtractot
              else  !if (abs(xtractot).gt.ridicule) then
                ! normallement, valeurs restantes très faibles
                ! on ne fait rien. 
                ! on met juste un max
                x(iiso)=max(x(iiso),0.0)
                do izone=1,ntraceurs_zone
                  ixt=index_trac(izone,iiso) 
                  x(ixt)=max(x(ixt),0.0)
                enddo !do izone=1,ntraceurs_zone
              endif !if (abs(xtractot).gt.ridicule) then
          endif !if (xtractot.gt.xtractotprec) then      

        enddo !do iiso=1,ntraceurs_iso
#ifdef ISOVERIF        
        call iso_verif_traceur_pbidouille(x,'iso_verif_trac 558') 
#else
        call iso_verif_traceur_jbidouille(x) 
#endif
        endif !if (bidouille_anti_divergence) then     

        end subroutine iso_verif_traceur_jbid_pos

        subroutine iso_verif_traceur_jbid_pos_vect(n,m,x)
        USE isotopes_mod, ONLY: bidouille_anti_divergence,iso_eau,ridicule
#ifdef ISOVERIF
        USE isotopes_verif_mod
#endif
        implicit none
       
       ! inputs
       integer n,m
       real x(ntraciso,n,m)

       ! locals
       integer iiso,izone,ixt
       real xtractot(n,m),xtractotprec(n,m)
       integer i,j
        
        if (bidouille_anti_divergence) then

!            write(*,*) 'pgm 532 tmp: x=',x
               
        do iiso=1,niso          
          do j=1,m 
          do i=1,n
          xtractot(i,j)=0.0
          xtractotprec(i,j)=0.0
          enddo !do j=1,m 
          enddo !do i=1,n
          do izone=1,ntraceurs_zone 
            ixt=index_trac(izone,iiso)  

            do j=1,m 
            do i=1,n
            xtractotprec(i,j)=xtractotprec(i,j)+x(ixt,i,j)
            x(ixt,i,j)=max(x(ixt,i,j),0.0) 
            xtractot(i,j)=xtractot(i,j)+x(ixt,i,j)
            enddo !do i=1,n
            enddo !do j=1,m 
            
          enddo !do izone=1,ntraceurs_zone
!          write(*,*) 'iiso,xtractotprec,xtractot=',
!     :          iiso,xtractotprec,xtractot
                  
         do j=1,m 
         do i=1,n
          if (xtractot(i,j).gt.xtractotprec(i,j)) then
              ! on réajuste pour que les traceurs fasses bien la somme
              ! des traceurs
              if (abs(xtractot(i,j)).gt.ridicule) then
                do izone=1,ntraceurs_zone
                  ixt=index_trac(izone,iiso) 
                  x(ixt,i,j)=x(ixt,i,j)*xtractotprec(i,j)/xtractot(i,j)
                enddo !do izone=1,ntraceurs_zone  
                ! on modifie aussi l'isotope de base si lui aussi était
                ! négatif   
!                x(iiso)=xtractot
              else  !if (abs(xtractot).gt.ridicule) then
                ! normallement, valeurs restantes très faibles
                ! on ne fait rien. 
                ! on met juste un max
                x(iiso,i,j)=max(x(iiso,i,j),0.0)
                do izone=1,ntraceurs_zone
                  ixt=index_trac(izone,iiso) 
                  x(ixt,i,j)=max(x(ixt,i,j),0.0)
                enddo !do izone=1,ntraceurs_zone
              endif !if (abs(xtractot).gt.ridicule) then
          endif !if (xtractot.gt.xtractotprec) then
         enddo !do i=1,n      
         enddo !do j=1,m 
         

        enddo !do iiso=1,ntraceurs_iso
#ifdef ISOVERIF        
        call iso_verif_traceur_pbid_vect(x,n,m,'iso_verif_trac 558') 
#else
        call iso_verif_traceur_jbid_vect(x,n,m) 
#endif
        endif !if (bidouille_anti_divergence) then     

        end subroutine iso_verif_traceur_jbid_pos_vect

        subroutine iso_verif_traceur_jbid_pos2(x,q)
        USE isotopes_mod, ONLY: bidouille_anti_divergence,iso_eau,ridicule
#ifdef ISOVERIF
        use isotopes_verif_mod
#endif        
        implicit none
        
        ! même but que iso_verif_traceur_jbid_pos, mais n'induit
        ! pas de fractionnement.
        ! on regarde si xteau est positif. S'il ne l'est pas, on pompe
        ! dans les autres tags pour le mettre à 0. On conserve la compo
        ! iso.
        ! Pb: ne conserve pas la masse d'isotopes légers.
    
       ! inputs
       real x(ntraciso),q

       ! locals
       integer iiso,izone,ixt,ieau
       real dqtmp,factmp
        
        if (bidouille_anti_divergence) then
!        write(*,*) 'iso_verif_trac 578 tmp: q,xt=',
!     :                q,x(1:ntraciso)
        if (q.gt.0.0) then
              dqtmp=0.0
              do izone=1,ntraceurs_zone
                ieau=index_trac(izone,iso_eau)
                if (x(ieau).lt.0.0) then
!                    write(*,*) 'local_x<0 pour izone=',izone
                    dqtmp=dqtmp-x(ieau)
                    do iiso=1,niso    
                      ixt=index_trac(izone,iiso)
                      x(ixt) =0.0
                    enddo !do iiso=1,niso  
                endif  !if (local_xt(ieau,i,k).lt.0.0) then                
              enddo !do izone=1,ntraceurs_zone
!              write(*,*) 'dqtmp=',dqtmp
              if (dqtmp.gt.0.0) then  
!                  write(*,*) 'iso_verif_trac 593 warning: q,dqtmp,xt=',
!     :                q,dqtmp,x(1:ntraciso)
                    ! on redistribue la négativité des traceurs dans les
                    ! traceurs positifs
!                    factmp=(1.0-dqtmp/(local_q(i,k)+dqtmp))
                    ! correction janv 2010
                    factmp=(q/(q+dqtmp))
!                    write(*,*) 'factmp=',factmp
                     do izone=1,ntraceurs_zone
                       ieau=index_trac(izone,iso_eau)
                       if (x(ieau).gt.0.0) then
                          do iiso=1,niso    
                             ixt=index_trac(izone,iiso)
                             x(ixt)=x(ixt)*factmp
                          enddo !do iiso=1,niso
                       endif !if (local_xt(ieau,i,k).gt.0.0) then
                     enddo ! do izone=1,ntraceurs_zone
!                     write(*,*) 'apres bidouille: xt=',x(1:ntraciso)
              endif !if (dqtmp.gt.0.0) then   
#ifdef ISOVERIF
              call iso_verif_traceur(x,'iso_verif_traceurs 612') 
#endif
          endif !if (local_q(i,k).lt.0.0) then

#ifdef ISOVERIF
        call iso_verif_traceur_pbidouille(x,'iso_verif_trac 625')    
#endif
        endif ! if (bidouille_anti_divergence) then  

        end subroutine iso_verif_traceur_jbid_pos2

        subroutine iso_verif_traceur_jbid_vect1D(x,n)
        USE isotopes_mod, ONLY: bidouille_anti_divergence,iso_eau,ridicule
        implicit none
        
        ! version vectrisée de iso_verif_traceur_jbidouille
           
       ! inputs
       integer n
       real x(ntraciso,n)

       ! locals
       integer iiso,izone,ixt,i
       real xtractot
        
        if (bidouille_anti_divergence) then

        do i=1,n
        do iiso=1,niso

          xtractot=0.0
          do izone=1,ntraceurs_zone  
            ixt=index_trac(izone,iiso) 
            xtractot=xtractot+x(ixt,i)
          enddo !do izone=1,ntraceurs_zone
         
              ! on réajuste pour que les traceurs fasses bien la somme
              ! des traceurs
              if (abs(xtractot).gt.ridicule*10) then
                do izone=1,ntraceurs_zone
                  ixt=index_trac(izone,iiso) 
                  x(ixt,i)=x(ixt,i)/xtractot*x(iiso,i)
                enddo !do izone=1,ntraceurs_zone                
              endif         

        enddo !do iiso=1,ntraceurs_iso  
        enddo  !do i=1,n
        endif !if (bidouille_anti_divergence) then             

        end subroutine iso_verif_traceur_jbid_vect1D
      
! on met ces routines ici pour éviter dépendances circulaires   
#ifdef ISOVERIF

        subroutine iso_verif_traceur_pbidouille(x,err_msg)
        use isotopes_verif_mod
        implicit none
        ! vérifier des choses sur les traceurs
        ! * toutes les zones donne t l'istope total
        ! * pas de deltaD aberrant
        ! on réajuste aussi les valeurs des traceurs pour la
        ! conservation de la masse, dans le cas bidouille

        ! on prend les valeurs pas défaut pour 
        ! errmax,errmaxrel,ridicule_trac,deltalimtrac
       
       ! inputs
       real x(ntraciso)
       character*(*) err_msg ! message d''erreur à afficher

       ! local
       !integer iso_verif_traceur_pbid_ns

        if (iso_verif_traceur_pbid_ns(x,err_msg).eq.1) then
            stop
        endif

        end subroutine iso_verif_traceur_pbidouille

        function iso_verif_traceur_pbid_ns(x,err_msg)
        use isotopes_mod, ONLY: iso_HDO,bidouille_anti_divergence
        use isotrac_mod, only: ridicule_trac
        use isotopes_verif_mod
        implicit none
        ! vérifier des choses sur les traceurs
        ! * toutes les zones donne t l'istope total
        ! * pas de deltaD aberrant
        ! on réajuste aussi les valeurs des traceurs pour la
        ! conservation de la masse, dans le cas bidouille

        ! on prend les valeurs pas défaut pour 
        ! errmax,errmaxrel,ridicule_trac,deltalimtrac
       
       ! inputs
       real x(ntraciso)
       character*(*) err_msg ! message d''erreur à afficher

       ! output
       integer iso_verif_traceur_pbid_ns

       ! locals
       !integer iso_verif_traceur_noNaN_nostop
       !integer iso_verif_tracm_choix_nostop  
       !integer iso_verif_tracdD_choix_nostop  
       integer iiso,izone,ixt
       real xtractot
        
        ! verif noNaN
        iso_verif_traceur_pbid_ns=0

        if (iso_verif_traceur_noNaN_nostop(x,err_msg).eq.1) then
!             stop
            iso_verif_traceur_pbid_ns=1
        endif

        ! verif masse
        if (iso_verif_tracm_choix_nostop(x,err_msg, &
     &           errmax*10,errmaxrel*50).eq.1) then
             ! on est plus laxiste car ça vient en général après une
             ! bidouille pour iso_eau normal
!             stop
             iso_verif_traceur_pbid_ns=1   
        endif  

        if (bidouille_anti_divergence) then
            ! on réajuste pour que les traceurs fasses bien la somme
            ! des traceurs
            call iso_verif_traceur_jbidouille(x)
        endif !if (bidouille_anti_divergence) then    

       ! verif deltaD
       if (iso_HDO.gt.0) then
        if (iso_verif_tracdD_choix_nostop(x,err_msg, &
     &           ridicule_trac,deltalimtrac).eq.1) then
!             stop
              iso_verif_traceur_pbid_ns=1
        endif  
       endif !if (iso_HDO.gt.0) then

        end function iso_verif_traceur_pbid_ns

        subroutine iso_verif_traceur_pbid_vect(x,n,m,err_msg)
        use isotopes_mod, ONLY: iso_HDO,bidouille_anti_divergence
        use isotopes_verif_mod
        implicit none
       
       ! inputs
       integer n,m
       real x(ntraciso,n,m)
       character*(*) err_msg ! message d''erreur à afficher       

       ! locals
       integer iiso,izone,ixt
       real xtractot
        
        ! verif noNaN
        call iso_verif_traceur_noNaN_vect(x,n,m,err_msg)

        ! verif masse
        call iso_verif_trac_masse_vect(x,n,m,err_msg,errmax*10, &
     &           errmaxrel*50)

        if (bidouille_anti_divergence) then
            ! on réajuste pour que les traceurs fasses bien la somme
            ! des traceurs
            call iso_verif_traceur_jbid_vect(x,n,m)
        endif !if (bidouille_anti_divergence) then    

       ! verif deltaD
       if (iso_HDO.gt.0) then
        call iso_verif_tracdd_vect(x,n,m,err_msg)  
       endif

        end subroutine iso_verif_traceur_pbid_vect
#endif

END MODULE isotrac_routines_mod
#endif
#endif