!
! $Header$
!
      SUBROUTINE cltracrn( itr, dtime,u1lay, v1lay,
     e              coef,t,ftsol,pctsrf,
     e              tr,trs,paprs,pplay,delp,
     e              masktr,fshtr,hsoltr,tautr,vdeptr,
     e              lat,
     s              d_tr,d_trs )

      IMPLICIT none
c======================================================================
c Auteur(s): Alex/LMD) date:  fev 99
c            inspire de clqh + clvent
c Objet: diffusion verticale de traceurs avec quantite de traceur ds 
c        le sol ( reservoir de sol de radon ) 
c        
c note : pour l'instant le traceur dans le sol et le flux sont
c        calcules mais ils ne servent que de diagnostiques
c        seule la tendance sur le traceur est sortie (d_tr)
c======================================================================
c Arguments:
c itr---  -input-R- le type de traceur 1- Rn 2 - Pb
c dtime----input-R- intervalle du temps (en second)
c u1lay----input-R- vent u de la premiere couche (m/s)
c v1lay----input-R- vent v de la premiere couche (m/s)
c coef-----input-R- le coefficient d'echange (m**2/s) l>1
c t--------input-R- temperature (K)
c paprs----input-R- pression a inter-couche (Pa)
c pplay----input-R- pression au milieu de couche (Pa)
c delp-----input-R- epaisseur de couche (Pa)
c ftsol----input-R- temperature du sol (en Kelvin)
c tr-------input-R- traceurs
c trs------input-R- traceurs dans le sol
c masktr---input-R- Masque reservoir de sol traceur (1 = reservoir)
c fshtr----input-R- Flux surfacique de production dans le sol
c tautr----input-R- Constante de decroissance du traceur
c vdeptr---input-R- Vitesse de depot sec dans la couche brownienne
c hsoltr---input-R- Epaisseur equivalente du reservoir de sol
c lat-----input-R- latitude en degree
c d_tr-----output-R- le changement de "tr"
c d_trs----output-R- le changement de "trs"
c======================================================================
#include "dimensions.h"
#include "dimphy.h"
#include "YOMCST.h"
#include "indicesol.h"
c======================================================================
      REAL dtime
      REAL u1lay(klon), v1lay(klon)
      REAL coef(klon,klev)
      REAL t(klon,klev), ftsol(klon,nbsrf), pctsrf(klon,nbsrf) 
      REAL tr(klon,klev), trs(klon)
      REAL paprs(klon,klev+1), pplay(klon,klev), delp(klon,klev)
      REAL masktr(klon) 
      REAL fshtr(klon) 
      REAL hsoltr
      REAL tautr
      REAL vdeptr
      REAL lat(klon)   
      REAL d_tr(klon,klev)
c======================================================================
      REAL flux_tr(klon,klev)  ! (diagnostic) flux de traceur
      REAL d_trs(klon)         ! (diagnostic) traceur ds le sol
c======================================================================
      INTEGER i, k, itr, n, l
      REAL rotrhi(klon)
      REAL zx_coef(klon,klev)
      REAL zx_buf(klon)
      REAL zx_ctr(klon,klev)
      REAL zx_dtr(klon,klev)
      REAL zx_trs(klon)
      REAL zx_a, zx_b

      REAL local_tr(klon,klev)
      REAL local_trs(klon)
      REAL zts(klon)
      REAL zx_alpha1(klon), zx_alpha2(klon)
c======================================================================
cAA Pour l'instant les 4 types de surface ne sont pas pris en compte
cAA On fabrique avec zts un champ de temperature de sol  
cAA que le pondere par la fraction de nature de sol.
c 
c      print*,'PASSAGE DANS CLTRACRN'

      DO i = 1,klon
            zts(i) = 0. 
      ENDDO
c
      DO n=1,nbsrf
         DO i = 1,klon
            zts(i) = zts(i) + ftsol(i,n)*pctsrf(i,n)
         ENDDO
      ENDDO
c
      DO i = 1,klon
          rotrhi(i) = RD * zts(i) / hsoltr 
      END DO
c
      DO k = 1, klev
      DO i = 1, klon
         local_tr(i,k) = tr(i,k)
      ENDDO
      ENDDO
c
      DO i = 1, klon
         local_trs(i) = trs(i)
      ENDDO
c======================================================================
cAA   Attention si dans clmain zx_alf1(i) = 1.0 
cAA   Il doit y avoir coherence (dc la meme chose ici)

      DO i = 1, klon
cAA         zx_alpha1(i) = (paprs(i,1)-pplay(i,2))/(pplay(i,1)-pplay(i,2))
         zx_alpha1(i) = 1.0
         zx_alpha2(i) = 1.0 - zx_alpha1(i)
      ENDDO
c======================================================================
      DO i = 1, klon
         zx_coef(i,1) = coef(i,1)
     .                 * (1.0+SQRT(u1lay(i)**2+v1lay(i)**2))
     .                 * pplay(i,1)/(RD*t(i,1))
         zx_coef(i,1) = zx_coef(i,1) * dtime*RG
      ENDDO
c
      DO k = 2, klev
      DO i = 1, klon
         zx_coef(i,k) = coef(i,k)*RG/(pplay(i,k-1)-pplay(i,k))
     .                  *(paprs(i,k)*2/(t(i,k)+t(i,k-1))/RD)**2
         zx_coef(i,k) = zx_coef(i,k) * dtime*RG
      ENDDO
      ENDDO
c======================================================================
      DO i = 1, klon
         zx_buf(i)      = delp(i,klev) + zx_coef(i,klev)
         zx_ctr(i,klev) = local_tr(i,klev)*delp(i,klev)/zx_buf(i)
         zx_dtr(i,klev) = zx_coef(i,klev) / zx_buf(i)
      ENDDO
c
      DO l = klev-1, 2 , -1
      DO i = 1, klon
         zx_buf(i) = delp(i,l)+zx_coef(i,l)
     .              +zx_coef(i,l+1)*(1.-zx_dtr(i,l+1))
         zx_ctr(i,l) = ( local_tr(i,l)*delp(i,l)
     .                   + zx_coef(i,l+1)*zx_ctr(i,l+1) )/zx_buf(i)
         zx_dtr(i,l) = zx_coef(i,l) / zx_buf(i)
      ENDDO
      ENDDO
c
      DO i = 1, klon
         zx_buf(i) = delp(i,1) + zx_coef(i,2)*(1.-zx_dtr(i,2))
     .               + masktr(i) * zx_coef(i,1)
     .               *( zx_alpha1(i)+zx_alpha2(i)*zx_dtr(i,2) )
         zx_ctr(i,1) = ( local_tr(i,1)*delp(i,1)
     .                  + zx_ctr(i,2)
     .                  *(zx_coef(i,2)
     .                    - masktr(i) * zx_coef(i,1)
     .                    *zx_alpha2(i) ) ) / zx_buf(i)
         zx_dtr(i,1) = masktr(i) * zx_coef(i,1) / zx_buf(i)
      ENDDO
c======================================================================
c Calculer d'abord local_trs nouvelle quantite dans le reservoir
c de sol
c
c-------------------------
c Au dessus des continents
c-------------------------
c Le pb peut se deposer partout : vdeptr = 10-3 m/s
c Le Rn est traiter commme une couche Brownienne puisque vdeptr = 0.
c
      DO i = 1, klon
c
        IF ( NINT(masktr(i)) .EQ. 1 ) THEN
         zx_trs(i) = local_trs(i)
         zx_a = zx_trs(i)
     .         +fshtr(i)*dtime*rotrhi(i)
     .         +rotrhi(i)*masktr(i)*zx_coef(i,1)/RG
     .         *(zx_ctr(i,1)*(zx_alpha1(i)+zx_alpha2(i)*zx_dtr(i,2))
     .         +zx_alpha2(i)*zx_ctr(i,2))
         zx_b = 1. + rotrhi(i)*masktr(i)*zx_coef(i,1)/RG
     .              * (1.-zx_dtr(i,1)
     .              *(zx_alpha1(i)+zx_alpha2(i)*zx_dtr(i,2)))
     .              + dtime / tautr
cAA: Pour l'instant, pour aller vite, le depot sec est traite
C comme une decroissance
     .              + dtime * vdeptr / hsoltr
         zx_trs(i) = zx_a / zx_b
         local_trs(i) = zx_trs(i)
        ENDIF
c
c Si on est entre 60N et 70N on divise par 2 l'emanation
c--------------------------------------------------------
c
        IF
     .  ( (itr.eq.1.AND.NINT(masktr(i)).EQ.1.AND.lat(i).GE.60.
     .     .AND.lat(i).LE.70.)
     .                      .OR.
     .     (itr.eq.2.AND.NINT(masktr(i)).EQ.1.AND.lat(i).GE.60.
     .     .AND.lat(i).LE.70.) )
     .  THEN
         zx_trs(i) = local_trs(i)
         zx_a = zx_trs(i)
     .         +(fshtr(i)/2.)*dtime*rotrhi(i)
     .         +rotrhi(i)*masktr(i)*zx_coef(i,1)/RG
     .         *(zx_ctr(i,1)*(zx_alpha1(i)+zx_alpha2(i)*zx_dtr(i,2))
     .         +zx_alpha2(i)*zx_ctr(i,2))
         zx_b = 1. + rotrhi(i)*masktr(i)*zx_coef(i,1)/RG
     .              * (1.-zx_dtr(i,1)
     .              *(zx_alpha1(i)+zx_alpha2(i)*zx_dtr(i,2)))
     .              + dtime / tautr
     .              + dtime * vdeptr / hsoltr
         zx_trs(i) = zx_a / zx_b
         local_trs(i) = zx_trs(i)
        ENDIF
c
c----------------------------------------------
c Au dessus des oceans et aux hautes latitudes
c----------------------------------------------
c
c au dessous de -60S  pas d'emission de radon au dessus 
c des oceans et des continents
c---------------------------------------------------------------

       IF ( (itr.EQ.1.AND.NINT(masktr(i)).EQ.0)
     .                 .OR.
     . (itr.EQ.1.AND.NINT(masktr(i)).EQ.1.AND.lat(i).LT.-60.))
     . THEN
         zx_trs(i) = 0.
         local_trs(i) = 0.
        END IF

c au dessus de 70 N pas d'emission de radon au dessus 
c des oceans et des continents
c--------------------------------------------------------------
       IF ( (itr.EQ.1.AND.NINT(masktr(i)).EQ.0)
     .                 .OR.
     . (itr.EQ.1.AND.NINT(masktr(i)).EQ.1.AND.lat(i).GT.70.))
     . THEN
         zx_trs(i) = 0.
         local_trs(i) = 0.
        END IF

c Au dessus des oceans la source est nulle
c-----------------------------------------
c
        IF (itr.eq.1.AND.NINT(masktr(i)).EQ.0) THEN
         zx_trs(i) = 0.
         local_trs(i) = 0.
        END IF
c
      ENDDO    ! sur le i=1,klon
c
c======================================================================
c==== une fois on a zx_trs, on peut faire l'iteration ========
c
      DO i = 1, klon
         local_tr(i,1) = zx_ctr(i,1)+zx_dtr(i,1)*zx_trs(i)
      ENDDO
      DO l = 2, klev
      DO i = 1, klon
        local_tr(i,l)
     .    = zx_ctr(i,l) + zx_dtr(i,l)*local_tr(i,l-1)
      ENDDO
      ENDDO
c======================================================================
c== Calcul du flux de traceur (flux_tr): UA/(m**2 s)
c
      DO i = 1, klon
        flux_tr(i,1) = masktr(i)*zx_coef(i,1)/RG
     .      * (zx_alpha1(i)*local_tr(i,1)+zx_alpha2(i)*local_tr(i,2)
     .                   -zx_trs(i)) / dtime
      ENDDO
      DO l = 2, klev
      DO i = 1, klon
        flux_tr(i,l) = zx_coef(i,l)/RG
     .       * (local_tr(i,l)-local_tr(i,l-1)) / dtime
      ENDDO
      ENDDO
c======================================================================
c== Calcul des tendances du traceur ds le sol et dans l'atmosphere
c
      DO l = 1, klev
      DO i = 1, klon
         d_tr(i,l) = local_tr(i,l) - tr(i,l)
      ENDDO
      ENDDO
      DO i = 1, klon
         d_trs(i) = local_trs(i) - trs(i)
      ENDDO
c======================================================================
c
      RETURN
      END
