/[lmdze]/trunk/libf/phylmd/clmain.f90
ViewVC logotype

Diff of /trunk/libf/phylmd/clmain.f90

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 17 by guez, Tue Aug 5 13:31:32 2008 UTC revision 47 by guez, Fri Jul 1 15:00:48 2011 UTC
# Line 1  Line 1 
1  SUBROUTINE clmain(dtime, itap, date0, pctsrf, pctsrf_new, t, q, u, v,&  module clmain_m
      jour, rmu0, co2_ppm, ok_veget, ocean, npas, nexca, ts,&  
      soil_model, cdmmax, cdhmax, ksta, ksta_ter, ok_kzmin, ftsoil,&  
      qsol, paprs, pplay, snow, qsurf, evap, albe, alblw, fluxlat,&  
      rain_f, snow_f, solsw, sollw, sollwdown, fder, rlon, rlat, cufi,&  
      cvfi, rugos, debut, lafin, agesno, rugoro, d_t, d_q, d_u, d_v,&  
      d_ts, flux_t, flux_q, flux_u, flux_v, cdragh, cdragm, q2,&  
      dflux_t, dflux_q, zcoefh, zu1, zv1, t2m, q2m, u10m, v10m, pblh,&  
      capcl, oliqcl, cteicl, pblt, therm, trmb1, trmb2, trmb3, plcl,&  
      fqcalving, ffonte, run_off_lic_0, flux_o, flux_g, tslab, seaice)  
   
   ! From phylmd/clmain.F, v 1.6 2005/11/16 14:47:19  
   
   !AA Tout ce qui a trait au traceurs est dans phytrac maintenant  
   !AA pour l'instant le calcul de la couche limite pour les traceurs  
   !AA se fait avec cltrac et ne tient pas compte de la differentiation  
   !AA des sous-fraction de sol.  
   
   !AA Pour pouvoir extraire les coefficient d'echanges et le vent  
   !AA dans la premiere couche, 3 champs supplementaires ont ete crees  
   !AA zcoefh, zu1 et zv1. Pour l'instant nous avons moyenne les valeurs  
   !AA de ces trois champs sur les 4 subsurfaces du modele. Dans l'avenir  
   !AA si les informations des subsurfaces doivent etre prises en compte  
   !AA il faudra sortir ces memes champs en leur ajoutant une dimension,  
   !AA c'est a dire nbsrf (nbre de subsurface).  
   
   ! Auteur(s) Z.X. Li (LMD/CNRS) date: 19930818  
   ! Objet: interface de "couche limite" (diffusion verticale)  
   
   ! Arguments:  
   ! dtime----input-R- interval du temps (secondes)  
   ! itap-----input-I- numero du pas de temps  
   ! date0----input-R- jour initial  
   ! t--------input-R- temperature (K)  
   ! q--------input-R- vapeur d'eau (kg/kg)  
   ! u--------input-R- vitesse u  
   ! v--------input-R- vitesse v  
   ! ts-------input-R- temperature du sol (en Kelvin)  
   ! paprs----input-R- pression a intercouche (Pa)  
   ! pplay----input-R- pression au milieu de couche (Pa)  
   ! radsol---input-R- flux radiatif net (positif vers le sol) en W/m**2  
   ! rlat-----input-R- latitude en degree  
   ! rugos----input-R- longeur de rugosite (en m)  
   ! cufi-----input-R- resolution des mailles en x (m)  
   ! cvfi-----input-R- resolution des mailles en y (m)  
   
   ! d_t------output-R- le changement pour "t"  
   ! d_q------output-R- le changement pour "q"  
   ! d_u------output-R- le changement pour "u"  
   ! d_v------output-R- le changement pour "v"  
   ! d_ts-----output-R- le changement pour "ts"  
   ! flux_t---output-R- flux de chaleur sensible (CpT) J/m**2/s (W/m**2)  
   !                    (orientation positive vers le bas)  
   ! flux_q---output-R- flux de vapeur d'eau (kg/m**2/s)  
   ! flux_u---output-R- tension du vent X: (kg m/s)/(m**2 s) ou Pascal  
   ! flux_v---output-R- tension du vent Y: (kg m/s)/(m**2 s) ou Pascal  
   ! dflux_t derive du flux sensible  
   ! dflux_q derive du flux latent  
   !IM "slab" ocean  
   ! flux_g---output-R-  flux glace (pour OCEAN='slab  ')  
   ! flux_o---output-R-  flux ocean (pour OCEAN='slab  ')  
   ! tslab-in/output-R temperature du slab ocean (en Kelvin) ! uniqmnt pour slab  
   ! seaice---output-R-  glace de mer (kg/m2) (pour OCEAN='slab  ')  
   !cc  
   ! ffonte----Flux thermique utilise pour fondre la neige  
   ! fqcalving-Flux d'eau "perdue" par la surface et necessaire pour limiter la  
   !           hauteur de neige, en kg/m2/s  
   !AA on rajoute en output yu1 et yv1 qui sont les vents dans  
   !AA la premiere couche  
   !AA ces 4 variables sont maintenant traites dans phytrac  
   ! itr--------input-I- nombre de traceurs  
   ! tr---------input-R- q. de traceurs  
   ! flux_surf--input-R- flux de traceurs a la surface  
   ! d_tr-------output-R tendance de traceurs  
   !IM cf. AM : PBL  
   ! trmb1-------deep_cape  
   ! trmb2--------inhibition  
   ! trmb3-------Point Omega  
   ! Cape(klon)-------Cape du thermique  
   ! EauLiq(klon)-------Eau liqu integr du thermique  
   ! ctei(klon)-------Critere d'instab d'entrainmt des nuages de CL  
   ! lcl------- Niveau de condensation  
   ! pblh------- HCL  
   ! pblT------- T au nveau HCL  
   
   !$$$ PB ajout pour soil  
   
   USE ioipsl, ONLY : histbeg_totreg, histdef, histend, histsync, &  
        histwrite, ymds2ju  
   USE dimens_m, ONLY : iim, jjm  
   USE indicesol, ONLY : epsfra, is_lic, is_oce, is_sic, is_ter, nbsrf  
   USE dimphy, ONLY : klev, klon, zmasq  
   USE dimsoil, ONLY : nsoilmx  
   USE temps, ONLY : annee_ref, day_ini, itau_phy  
   USE iniprint, ONLY : prt_level  
   USE yomcst, ONLY : rd, rg, rkappa  
   USE conf_phys_m, ONLY : iflag_pbl  
   USE gath_cpl, ONLY : gath2cpl  
2    
3    IMPLICIT NONE    IMPLICIT NONE
4    
5    REAL, INTENT (IN) :: dtime  contains
   REAL date0  
   INTEGER, INTENT (IN) :: itap  
   REAL t(klon, klev), q(klon, klev)  
   REAL u(klon, klev), v(klon, klev)  
   REAL, INTENT (IN) :: paprs(klon, klev+1)  
   REAL, INTENT (IN) :: pplay(klon, klev)  
   REAL, INTENT (IN) :: rlon(klon), rlat(klon)  
   REAL cufi(klon), cvfi(klon)  
   REAL d_t(klon, klev), d_q(klon, klev)  
   REAL d_u(klon, klev), d_v(klon, klev)  
   REAL flux_t(klon, klev, nbsrf), flux_q(klon, klev, nbsrf)  
   REAL dflux_t(klon), dflux_q(klon)  
   !IM "slab" ocean  
   REAL flux_o(klon), flux_g(klon)  
   REAL y_flux_o(klon), y_flux_g(klon)  
   REAL tslab(klon), ytslab(klon)  
   REAL seaice(klon), y_seaice(klon)  
   REAL y_fqcalving(klon), y_ffonte(klon)  
   REAL fqcalving(klon, nbsrf), ffonte(klon, nbsrf)  
   REAL run_off_lic_0(klon), y_run_off_lic_0(klon)  
   
   REAL flux_u(klon, klev, nbsrf), flux_v(klon, klev, nbsrf)  
   REAL rugmer(klon), agesno(klon, nbsrf)  
   REAL, INTENT (IN) :: rugoro(klon)  
   REAL cdragh(klon), cdragm(klon)  
   ! jour de l'annee en cours                  
   INTEGER jour  
   REAL rmu0(klon) ! cosinus de l'angle solaire zenithal      
   ! taux CO2 atmosphere                      
   REAL co2_ppm  
   LOGICAL, INTENT (IN) :: debut  
   LOGICAL, INTENT (IN) :: lafin  
   LOGICAL ok_veget  
   CHARACTER (len=*), INTENT (IN) :: ocean  
   INTEGER npas, nexca  
   
   REAL pctsrf(klon, nbsrf)  
   REAL ts(klon, nbsrf)  
   REAL d_ts(klon, nbsrf)  
   REAL snow(klon, nbsrf)  
   REAL qsurf(klon, nbsrf)  
   REAL evap(klon, nbsrf)  
   REAL albe(klon, nbsrf)  
   REAL alblw(klon, nbsrf)  
   
   REAL fluxlat(klon, nbsrf)  
   
   REAL rain_f(klon), snow_f(klon)  
   REAL fder(klon)  
   
   REAL sollw(klon, nbsrf), solsw(klon, nbsrf), sollwdown(klon)  
   REAL rugos(klon, nbsrf)  
   ! la nouvelle repartition des surfaces sortie de l'interface  
   REAL pctsrf_new(klon, nbsrf)  
   
   REAL zcoefh(klon, klev)  
   REAL zu1(klon)  
   REAL zv1(klon)  
   
   !$$$ PB ajout pour soil  
   LOGICAL, INTENT (IN) :: soil_model  
   !IM ajout seuils cdrm, cdrh  
   REAL cdmmax, cdhmax  
   
   REAL ksta, ksta_ter  
   LOGICAL ok_kzmin  
   
   REAL ftsoil(klon, nsoilmx, nbsrf)  
   REAL ytsoil(klon, nsoilmx)  
   REAL qsol(klon)  
   
   EXTERNAL clqh, clvent, coefkz, calbeta, cltrac  
   
   REAL yts(klon), yrugos(klon), ypct(klon), yz0_new(klon)  
   REAL yalb(klon)  
   REAL yalblw(klon)  
   REAL yu1(klon), yv1(klon)  
   REAL ysnow(klon), yqsurf(klon), yagesno(klon), yqsol(klon)  
   REAL yrain_f(klon), ysnow_f(klon)  
   REAL ysollw(klon), ysolsw(klon), ysollwdown(klon)  
   REAL yfder(klon), ytaux(klon), ytauy(klon)  
   REAL yrugm(klon), yrads(klon), yrugoro(klon)  
   
   REAL yfluxlat(klon)  
   
   REAL y_d_ts(klon)  
   REAL y_d_t(klon, klev), y_d_q(klon, klev)  
   REAL y_d_u(klon, klev), y_d_v(klon, klev)  
   REAL y_flux_t(klon, klev), y_flux_q(klon, klev)  
   REAL y_flux_u(klon, klev), y_flux_v(klon, klev)  
   REAL y_dflux_t(klon), y_dflux_q(klon)  
   REAL ycoefh(klon, klev), ycoefm(klon, klev)  
   REAL yu(klon, klev), yv(klon, klev)  
   REAL yt(klon, klev), yq(klon, klev)  
   REAL ypaprs(klon, klev+1), ypplay(klon, klev), ydelp(klon, klev)  
   
   LOGICAL ok_nonloc  
   PARAMETER (ok_nonloc=.FALSE.)  
   REAL ycoefm0(klon, klev), ycoefh0(klon, klev)  
   
   !IM 081204 hcl_Anne ? BEG  
   REAL yzlay(klon, klev), yzlev(klon, klev+1), yteta(klon, klev)  
   REAL ykmm(klon, klev+1), ykmn(klon, klev+1)  
   REAL ykmq(klon, klev+1)  
   REAL yq2(klon, klev+1), q2(klon, klev+1, nbsrf)  
   REAL q2diag(klon, klev+1)  
   !IM 081204 hcl_Anne ? END  
   
   REAL u1lay(klon), v1lay(klon)  
   REAL delp(klon, klev)  
   INTEGER i, k, nsrf  
   
   INTEGER ni(klon), knon, j  
   ! Introduction d'une variable "pourcentage potentiel" pour tenir compte  
   ! des eventuelles apparitions et/ou disparitions de la glace de mer  
   REAL pctsrf_pot(klon, nbsrf)  
   
   REAL zx_alf1, zx_alf2 !valeur ambiante par extrapola.  
   
   ! maf pour sorties IOISPL en cas de debugagage  
   
   CHARACTER (80) cldebug  
   SAVE cldebug  
   CHARACTER (8) cl_surf(nbsrf)  
   SAVE cl_surf  
   INTEGER nhoridbg, nidbg  
   SAVE nhoridbg, nidbg  
   INTEGER ndexbg(iim*(jjm+1))  
   REAL zx_lon(iim, jjm+1), zx_lat(iim, jjm+1), zjulian  
   REAL tabindx(klon)  
   REAL debugtab(iim, jjm+1)  
   LOGICAL first_appel  
   SAVE first_appel  
   DATA first_appel/ .TRUE./  
   LOGICAL :: debugindex = .FALSE.  
   INTEGER idayref  
   REAL t2m(klon, nbsrf), q2m(klon, nbsrf)  
   REAL u10m(klon, nbsrf), v10m(klon, nbsrf)  
   
   REAL yt2m(klon), yq2m(klon), yu10m(klon)  
   REAL yustar(klon)  
   ! -- LOOP  
   REAL yu10mx(klon)  
   REAL yu10my(klon)  
   REAL ywindsp(klon)  
   ! -- LOOP  
   
   REAL yt10m(klon), yq10m(klon)  
   !IM cf. AM : pbl, hbtm2 (Comme les autres diagnostics on cumule ds  
   ! physiq ce qui permet de sortir les grdeurs par sous surface)  
   REAL pblh(klon, nbsrf)  
   REAL plcl(klon, nbsrf)  
   REAL capcl(klon, nbsrf)  
   REAL oliqcl(klon, nbsrf)  
   REAL cteicl(klon, nbsrf)  
   REAL pblt(klon, nbsrf)  
   REAL therm(klon, nbsrf)  
   REAL trmb1(klon, nbsrf)  
   REAL trmb2(klon, nbsrf)  
   REAL trmb3(klon, nbsrf)  
   REAL ypblh(klon)  
   REAL ylcl(klon)  
   REAL ycapcl(klon)  
   REAL yoliqcl(klon)  
   REAL ycteicl(klon)  
   REAL ypblt(klon)  
   REAL ytherm(klon)  
   REAL ytrmb1(klon)  
   REAL ytrmb2(klon)  
   REAL ytrmb3(klon)  
   REAL y_cd_h(klon), y_cd_m(klon)  
   REAL uzon(klon), vmer(klon)  
   REAL tair1(klon), qair1(klon), tairsol(klon)  
   REAL psfce(klon), patm(klon)  
   
   REAL qairsol(klon), zgeo1(klon)  
   REAL rugo1(klon)  
   
   ! utiliser un jeu de fonctions simples                
   LOGICAL zxli  
   PARAMETER (zxli=.FALSE.)  
   
   REAL zt, zqs, zdelta, zcor  
   REAL t_coup  
   PARAMETER (t_coup=273.15)  
   
   CHARACTER (len=20) :: modname = 'clmain'  
   LOGICAL check  
   PARAMETER (check=.FALSE.)  
   
   !------------------------------------------------------------  
   
   ! initialisation Anne  
   ytherm = 0.  
   
   IF (check) THEN  
      PRINT *, modname, '  klon=', klon  
   END IF  
   
   IF (debugindex .AND. first_appel) THEN  
      first_appel = .FALSE.  
   
      ! initialisation sorties netcdf  
   
      idayref = day_ini  
      CALL ymds2ju(annee_ref, 1, idayref, 0.0, zjulian)  
      CALL gr_fi_ecrit(1, klon, iim, jjm+1, rlon, zx_lon)  
      DO i = 1, iim  
         zx_lon(i, 1) = rlon(i+1)  
         zx_lon(i, jjm+1) = rlon(i+1)  
      END DO  
      CALL gr_fi_ecrit(1, klon, iim, jjm+1, rlat, zx_lat)  
      cldebug = 'sous_index'  
      CALL histbeg_totreg(cldebug, zx_lon(:, 1), zx_lat(1, :), 1, &  
           iim, 1, jjm+1, itau_phy, zjulian, dtime, nhoridbg, nidbg)  
      ! no vertical axis  
      cl_surf(1) = 'ter'  
      cl_surf(2) = 'lic'  
      cl_surf(3) = 'oce'  
      cl_surf(4) = 'sic'  
      DO nsrf = 1, nbsrf  
         CALL histdef(nidbg, cl_surf(nsrf), cl_surf(nsrf), '-', iim, jjm+1, &  
              nhoridbg, 1, 1, 1, -99, 'inst', dtime, dtime)  
      END DO  
      CALL histend(nidbg)  
      CALL histsync(nidbg)  
   END IF  
   
   DO k = 1, klev ! epaisseur de couche  
      DO i = 1, klon  
         delp(i, k) = paprs(i, k) - paprs(i, k+1)  
      END DO  
   END DO  
   DO i = 1, klon ! vent de la premiere couche  
      zx_alf1 = 1.0  
      zx_alf2 = 1.0 - zx_alf1  
      u1lay(i) = u(i, 1)*zx_alf1 + u(i, 2)*zx_alf2  
      v1lay(i) = v(i, 1)*zx_alf1 + v(i, 2)*zx_alf2  
   END DO  
   
   ! initialisation:  
   
   DO i = 1, klon  
      rugmer(i) = 0.0  
      cdragh(i) = 0.0  
      cdragm(i) = 0.0  
      dflux_t(i) = 0.0  
      dflux_q(i) = 0.0  
      zu1(i) = 0.0  
      zv1(i) = 0.0  
   END DO  
   ypct = 0.0  
   yts = 0.0  
   ysnow = 0.0  
   yqsurf = 0.0  
   yalb = 0.0  
   yalblw = 0.0  
   yrain_f = 0.0  
   ysnow_f = 0.0  
   yfder = 0.0  
   ytaux = 0.0  
   ytauy = 0.0  
   ysolsw = 0.0  
   ysollw = 0.0  
   ysollwdown = 0.0  
   yrugos = 0.0  
   yu1 = 0.0  
   yv1 = 0.0  
   yrads = 0.0  
   ypaprs = 0.0  
   ypplay = 0.0  
   ydelp = 0.0  
   yu = 0.0  
   yv = 0.0  
   yt = 0.0  
   yq = 0.0  
   pctsrf_new = 0.0  
   y_flux_u = 0.0  
   y_flux_v = 0.0  
   !$$ PB  
   y_dflux_t = 0.0  
   y_dflux_q = 0.0  
   ytsoil = 999999.  
   yrugoro = 0.  
   ! -- LOOP  
   yu10mx = 0.0  
   yu10my = 0.0  
   ywindsp = 0.0  
   ! -- LOOP  
   DO nsrf = 1, nbsrf  
      DO i = 1, klon  
         d_ts(i, nsrf) = 0.0  
      END DO  
   END DO  
   !§§§ PB  
   yfluxlat = 0.  
   flux_t = 0.  
   flux_q = 0.  
   flux_u = 0.  
   flux_v = 0.  
   DO k = 1, klev  
      DO i = 1, klon  
         d_t(i, k) = 0.0  
         d_q(i, k) = 0.0  
         !$$$         flux_t(i, k) = 0.0  
         !$$$         flux_q(i, k) = 0.0  
         d_u(i, k) = 0.0  
         d_v(i, k) = 0.0  
         !$$$         flux_u(i, k) = 0.0  
         !$$$         flux_v(i, k) = 0.0  
         zcoefh(i, k) = 0.0  
      END DO  
   END DO  
   !AA      IF (itr.GE.1) THEN  
   !AA      DO it = 1, itr  
   !AA      DO k = 1, klev  
   !AA      DO i = 1, klon  
   !AA         d_tr(i, k, it) = 0.0  
   !AA      ENDDO  
   !AA      ENDDO  
   !AA      ENDDO  
   !AA      ENDIF  
   
   
   ! Boucler sur toutes les sous-fractions du sol:  
   
   ! Initialisation des "pourcentages potentiels". On considere ici qu'on  
   ! peut avoir potentiellementdela glace sur tout le domaine oceanique  
   ! (a affiner)  
   
   pctsrf_pot = pctsrf  
   pctsrf_pot(:, is_oce) = 1. - zmasq  
   pctsrf_pot(:, is_sic) = 1. - zmasq  
   
   DO nsrf = 1, nbsrf  
      ! chercher les indices:  
      ni = 0  
      knon = 0  
      DO i = 1, klon  
         ! pour determiner le domaine a traiter on utilise les surfaces  
         ! "potentielles"  
         IF (pctsrf_pot(i, nsrf) > epsfra) THEN  
            knon = knon + 1  
            ni(knon) = i  
         END IF  
      END DO  
   
      IF (check) THEN  
         PRINT *, 'CLMAIN, nsrf, knon =', nsrf, knon  
      END IF  
   
      ! variables pour avoir une sortie IOIPSL des INDEX  
      IF (debugindex) THEN  
         tabindx = 0.  
         DO i = 1, knon  
            tabindx(i) = real(i)  
         END DO  
         debugtab = 0.  
         ndexbg = 0  
         CALL gath2cpl(tabindx, debugtab, klon, knon, iim, jjm, ni)  
         CALL histwrite(nidbg, cl_surf(nsrf), itap, debugtab)  
      END IF  
   
      IF (knon==0) CYCLE  
   
      DO j = 1, knon  
         i = ni(j)  
         ypct(j) = pctsrf(i, nsrf)  
         yts(j) = ts(i, nsrf)  
         ytslab(i) = tslab(i)  
         ysnow(j) = snow(i, nsrf)  
         yqsurf(j) = qsurf(i, nsrf)  
         yalb(j) = albe(i, nsrf)  
         yalblw(j) = alblw(i, nsrf)  
         yrain_f(j) = rain_f(i)  
         ysnow_f(j) = snow_f(i)  
         yagesno(j) = agesno(i, nsrf)  
         yfder(j) = fder(i)  
         ytaux(j) = flux_u(i, 1, nsrf)  
         ytauy(j) = flux_v(i, 1, nsrf)  
         ysolsw(j) = solsw(i, nsrf)  
         ysollw(j) = sollw(i, nsrf)  
         ysollwdown(j) = sollwdown(i)  
         yrugos(j) = rugos(i, nsrf)  
         yrugoro(j) = rugoro(i)  
         yu1(j) = u1lay(i)  
         yv1(j) = v1lay(i)  
         yrads(j) = ysolsw(j) + ysollw(j)  
         ypaprs(j, klev+1) = paprs(i, klev+1)  
         y_run_off_lic_0(j) = run_off_lic_0(i)  
         yu10mx(j) = u10m(i, nsrf)  
         yu10my(j) = v10m(i, nsrf)  
         ywindsp(j) = sqrt(yu10mx(j)*yu10mx(j)+yu10my(j)*yu10my(j))  
      END DO  
   
      !     IF bucket model for continent, copy soil water content  
      IF (nsrf==is_ter .AND. .NOT. ok_veget) THEN  
         DO j = 1, knon  
            i = ni(j)  
            yqsol(j) = qsol(i)  
         END DO  
      ELSE  
         yqsol = 0.  
      END IF  
      !$$$ PB ajour pour soil  
      DO k = 1, nsoilmx  
         DO j = 1, knon  
            i = ni(j)  
            ytsoil(j, k) = ftsoil(i, k, nsrf)  
         END DO  
      END DO  
      DO k = 1, klev  
         DO j = 1, knon  
            i = ni(j)  
            ypaprs(j, k) = paprs(i, k)  
            ypplay(j, k) = pplay(i, k)  
            ydelp(j, k) = delp(i, k)  
            yu(j, k) = u(i, k)  
            yv(j, k) = v(i, k)  
            yt(j, k) = t(i, k)  
            yq(j, k) = q(i, k)  
         END DO  
      END DO  
   
      ! calculer Cdrag et les coefficients d'echange  
      CALL coefkz(nsrf, knon, ypaprs, ypplay, ksta, ksta_ter, yts,&  
           yrugos, yu, yv, yt, yq, yqsurf, ycoefm, ycoefh)  
      !IM 081204 BEG  
      !CR test  
      IF (iflag_pbl==1) THEN  
         !IM 081204 END  
         CALL coefkz2(nsrf, knon, ypaprs, ypplay, yt, ycoefm0, ycoefh0)  
         DO k = 1, klev  
            DO i = 1, knon  
               ycoefm(i, k) = max(ycoefm(i, k), ycoefm0(i, k))  
               ycoefh(i, k) = max(ycoefh(i, k), ycoefh0(i, k))  
            END DO  
         END DO  
      END IF  
   
      !IM cf JLD : on seuille ycoefm et ycoefh  
      IF (nsrf==is_oce) THEN  
         DO j = 1, knon  
            !           ycoefm(j, 1)=min(ycoefm(j, 1), 1.1E-3)  
            ycoefm(j, 1) = min(ycoefm(j, 1), cdmmax)  
            !           ycoefh(j, 1)=min(ycoefh(j, 1), 1.1E-3)  
            ycoefh(j, 1) = min(ycoefh(j, 1), cdhmax)  
         END DO  
      END IF  
   
   
      !IM: 261103  
      IF (ok_kzmin) THEN  
         !IM cf FH: 201103 BEG  
         !   Calcul d'une diffusion minimale pour les conditions tres stables.  
         CALL coefkzmin(knon, ypaprs, ypplay, yu, yv, yt, yq, ycoefm, ycoefm0, &  
              ycoefh0)  
         !      call dump2d(iim, jjm-1, ycoefm(2:klon-1, 2), 'KZ         ')  
         !      call dump2d(iim, jjm-1, ycoefm0(2:klon-1, 2), 'KZMIN      ')  
   
         IF (1==1) THEN  
            DO k = 1, klev  
               DO i = 1, knon  
                  ycoefm(i, k) = max(ycoefm(i, k), ycoefm0(i, k))  
                  ycoefh(i, k) = max(ycoefh(i, k), ycoefh0(i, k))  
               END DO  
            END DO  
         END IF  
         !IM cf FH: 201103 END  
         !IM: 261103  
      END IF !ok_kzmin  
   
      IF (iflag_pbl>=3) THEN  
   
         !ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc  
         ! MELLOR ET YAMADA adapte a Mars Richard Fournier et Frederic Hourdin  
         !ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc  
   
         yzlay(1:knon, 1) = rd*yt(1:knon, 1)/(0.5*(ypaprs(1:knon, &  
              1)+ypplay(1:knon, 1)))*(ypaprs(1:knon, 1)-ypplay(1:knon, 1))/rg  
         DO k = 2, klev  
            yzlay(1:knon, k) = yzlay(1:knon, k-1) &  
                 + rd*0.5*(yt(1:knon, k-1) +yt(1: knon, k)) &  
                 / ypaprs(1:knon, k) *(ypplay(1:knon, k-1)-ypplay(1:knon, k))/ &  
                 rg  
         END DO  
         DO k = 1, klev  
            yteta(1:knon, k) = yt(1:knon, k)*(ypaprs(1:knon, 1) &  
                 / ypplay(1:knon, k))**rkappa * (1.+0.61*yq(1:knon, k))  
         END DO  
         yzlev(1:knon, 1) = 0.  
         yzlev(1:knon, klev+1) = 2.*yzlay(1:knon, klev) - yzlay(1:knon, klev-1)  
         DO k = 2, klev  
            yzlev(1:knon, k) = 0.5*(yzlay(1:knon, k)+yzlay(1:knon, k-1))  
         END DO  
         DO k = 1, klev + 1  
            DO j = 1, knon  
               i = ni(j)  
               yq2(j, k) = q2(i, k, nsrf)  
            END DO  
         END DO  
   
   
         !   Bug introduit volontairement pour converger avec les resultats  
         !  du papier sur les thermiques.  
         IF (1==1) THEN  
            y_cd_m(1:knon) = ycoefm(1:knon, 1)  
            y_cd_h(1:knon) = ycoefh(1:knon, 1)  
         ELSE  
            y_cd_h(1:knon) = ycoefm(1:knon, 1)  
            y_cd_m(1:knon) = ycoefh(1:knon, 1)  
         END IF  
         CALL ustarhb(knon, yu, yv, y_cd_m, yustar)  
   
         IF (prt_level>9) THEN  
            PRINT *, 'USTAR = ', yustar  
         END IF  
   
         !   iflag_pbl peut etre utilise comme longuer de melange  
   
         IF (iflag_pbl>=11) THEN  
            CALL vdif_kcay(knon, dtime, rg, rd, ypaprs, yt, yzlev, yzlay, yu, yv, yteta, &  
                 y_cd_m, yq2, q2diag, ykmm, ykmn, yustar, iflag_pbl)  
         ELSE  
            CALL yamada4(knon, dtime, rg, rd, ypaprs, yt, yzlev, yzlay, yu, yv, yteta, &  
                 y_cd_m, yq2, ykmm, ykmn, ykmq, yustar, iflag_pbl)  
         END IF  
   
         ycoefm(1:knon, 1) = y_cd_m(1:knon)  
         ycoefh(1:knon, 1) = y_cd_h(1:knon)  
         ycoefm(1:knon, 2:klev) = ykmm(1:knon, 2:klev)  
         ycoefh(1:knon, 2:klev) = ykmn(1:knon, 2:klev)  
   
   
      END IF  
   
      !ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc  
      ! calculer la diffusion des vitesses "u" et "v"  
      !ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc  
   
      CALL clvent(knon, dtime, yu1, yv1, ycoefm, yt, yu, ypaprs, ypplay, &  
           ydelp, y_d_u, y_flux_u)  
      CALL clvent(knon, dtime, yu1, yv1, ycoefm, yt, yv, ypaprs, ypplay, &  
           ydelp, y_d_v, y_flux_v)  
   
      ! pour le couplage  
      ytaux = y_flux_u(:, 1)  
      ytauy = y_flux_v(:, 1)  
   
      ! FH modif sur le cdrag temperature  
      !$$$PB : déplace dans clcdrag  
      !$$$      do i=1, knon  
      !$$$         ycoefh(i, 1)=ycoefm(i, 1)*0.8  
      !$$$      enddo  
   
      ! calculer la diffusion de "q" et de "h"  
      CALL clqh(dtime, itap, date0, jour, debut, lafin, rlon, rlat,&  
           cufi, cvfi, knon, nsrf, ni, pctsrf, soil_model, ytsoil,&  
           yqsol, ok_veget, ocean, npas, nexca, rmu0, co2_ppm, yrugos,&  
           yrugoro, yu1, yv1, ycoefh, yt, yq, yts, ypaprs, ypplay,&  
           ydelp, yrads, yalb, yalblw, ysnow, yqsurf, yrain_f, ysnow_f, &  
           yfder, ytaux, ytauy, ywindsp, ysollw, ysollwdown, ysolsw,&  
           yfluxlat, pctsrf_new, yagesno, y_d_t, y_d_q, y_d_ts,&  
           yz0_new, y_flux_t, y_flux_q, y_dflux_t, y_dflux_q,&  
           y_fqcalving, y_ffonte, y_run_off_lic_0, y_flux_o, y_flux_g,&  
           ytslab, y_seaice)  
   
      ! calculer la longueur de rugosite sur ocean  
      yrugm = 0.  
      IF (nsrf==is_oce) THEN  
         DO j = 1, knon  
            yrugm(j) = 0.018*ycoefm(j, 1)*(yu1(j)**2+yv1(j)**2)/rg + &  
                 0.11*14E-6/sqrt(ycoefm(j, 1)*(yu1(j)**2+yv1(j)**2))  
            yrugm(j) = max(1.5E-05, yrugm(j))  
         END DO  
      END IF  
      DO j = 1, knon  
         y_dflux_t(j) = y_dflux_t(j)*ypct(j)  
         y_dflux_q(j) = y_dflux_q(j)*ypct(j)  
         yu1(j) = yu1(j)*ypct(j)  
         yv1(j) = yv1(j)*ypct(j)  
      END DO  
   
      DO k = 1, klev  
         DO j = 1, knon  
            i = ni(j)  
            ycoefh(j, k) = ycoefh(j, k)*ypct(j)  
            ycoefm(j, k) = ycoefm(j, k)*ypct(j)  
            y_d_t(j, k) = y_d_t(j, k)*ypct(j)  
            y_d_q(j, k) = y_d_q(j, k)*ypct(j)  
            !§§§ PB  
            flux_t(i, k, nsrf) = y_flux_t(j, k)  
            flux_q(i, k, nsrf) = y_flux_q(j, k)  
            flux_u(i, k, nsrf) = y_flux_u(j, k)  
            flux_v(i, k, nsrf) = y_flux_v(j, k)  
            !$$$ PB        y_flux_t(j, k) = y_flux_t(j, k) * ypct(j)  
            !$$$ PB        y_flux_q(j, k) = y_flux_q(j, k) * ypct(j)  
            y_d_u(j, k) = y_d_u(j, k)*ypct(j)  
            y_d_v(j, k) = y_d_v(j, k)*ypct(j)  
            !$$$ PB        y_flux_u(j, k) = y_flux_u(j, k) * ypct(j)  
            !$$$ PB        y_flux_v(j, k) = y_flux_v(j, k) * ypct(j)  
         END DO  
      END DO  
   
   
      evap(:, nsrf) = -flux_q(:, 1, nsrf)  
   
      albe(:, nsrf) = 0.  
      alblw(:, nsrf) = 0.  
      snow(:, nsrf) = 0.  
      qsurf(:, nsrf) = 0.  
      rugos(:, nsrf) = 0.  
      fluxlat(:, nsrf) = 0.  
      DO j = 1, knon  
         i = ni(j)  
         d_ts(i, nsrf) = y_d_ts(j)  
         albe(i, nsrf) = yalb(j)  
         alblw(i, nsrf) = yalblw(j)  
         snow(i, nsrf) = ysnow(j)  
         qsurf(i, nsrf) = yqsurf(j)  
         rugos(i, nsrf) = yz0_new(j)  
         fluxlat(i, nsrf) = yfluxlat(j)  
         !$$$ pb         rugmer(i) = yrugm(j)  
         IF (nsrf==is_oce) THEN  
            rugmer(i) = yrugm(j)  
            rugos(i, nsrf) = yrugm(j)  
         END IF  
         !IM cf JLD ??  
         agesno(i, nsrf) = yagesno(j)  
         fqcalving(i, nsrf) = y_fqcalving(j)  
         ffonte(i, nsrf) = y_ffonte(j)  
         cdragh(i) = cdragh(i) + ycoefh(j, 1)  
         cdragm(i) = cdragm(i) + ycoefm(j, 1)  
         dflux_t(i) = dflux_t(i) + y_dflux_t(j)  
         dflux_q(i) = dflux_q(i) + y_dflux_q(j)  
         zu1(i) = zu1(i) + yu1(j)  
         zv1(i) = zv1(i) + yv1(j)  
      END DO  
      IF (nsrf==is_ter) THEN  
         DO j = 1, knon  
            i = ni(j)  
            qsol(i) = yqsol(j)  
         END DO  
      END IF  
      IF (nsrf==is_lic) THEN  
         DO j = 1, knon  
            i = ni(j)  
            run_off_lic_0(i) = y_run_off_lic_0(j)  
         END DO  
      END IF  
      !$$$ PB ajout pour soil  
      ftsoil(:, :, nsrf) = 0.  
      DO k = 1, nsoilmx  
         DO j = 1, knon  
            i = ni(j)  
            ftsoil(i, k, nsrf) = ytsoil(j, k)  
         END DO  
      END DO  
   
      DO j = 1, knon  
         i = ni(j)  
         DO k = 1, klev  
            d_t(i, k) = d_t(i, k) + y_d_t(j, k)  
            d_q(i, k) = d_q(i, k) + y_d_q(j, k)  
            !$$$ PB        flux_t(i, k) = flux_t(i, k) + y_flux_t(j, k)  
            !$$$         flux_q(i, k) = flux_q(i, k) + y_flux_q(j, k)  
            d_u(i, k) = d_u(i, k) + y_d_u(j, k)  
            d_v(i, k) = d_v(i, k) + y_d_v(j, k)  
            !$$$  PB       flux_u(i, k) = flux_u(i, k) + y_flux_u(j, k)  
            !$$$         flux_v(i, k) = flux_v(i, k) + y_flux_v(j, k)  
            zcoefh(i, k) = zcoefh(i, k) + ycoefh(j, k)  
         END DO  
      END DO  
   
   
      !cc diagnostic t, q a 2m et u, v a 10m  
   
      DO j = 1, knon  
         i = ni(j)  
         uzon(j) = yu(j, 1) + y_d_u(j, 1)  
         vmer(j) = yv(j, 1) + y_d_v(j, 1)  
         tair1(j) = yt(j, 1) + y_d_t(j, 1)  
         qair1(j) = yq(j, 1) + y_d_q(j, 1)  
         zgeo1(j) = rd*tair1(j)/(0.5*(ypaprs(j, 1)+ypplay(j, &  
              1)))*(ypaprs(j, 1)-ypplay(j, 1))  
         tairsol(j) = yts(j) + y_d_ts(j)  
         rugo1(j) = yrugos(j)  
         IF (nsrf==is_oce) THEN  
            rugo1(j) = rugos(i, nsrf)  
         END IF  
         psfce(j) = ypaprs(j, 1)  
         patm(j) = ypplay(j, 1)  
   
         qairsol(j) = yqsurf(j)  
      END DO  
   
      CALL stdlevvar(klon, knon, nsrf, zxli, uzon, vmer, tair1, qair1, zgeo1, &  
           tairsol, qairsol, rugo1, psfce, patm, yt2m, yq2m, yt10m, yq10m, &  
           yu10m, yustar)  
      !IM 081204 END  
   
      DO j = 1, knon  
         i = ni(j)  
         t2m(i, nsrf) = yt2m(j)  
         q2m(i, nsrf) = yq2m(j)  
   
         ! u10m, v10m : composantes du vent a 10m sans spirale de Ekman  
         u10m(i, nsrf) = (yu10m(j)*uzon(j))/sqrt(uzon(j)**2+vmer(j)**2)  
         v10m(i, nsrf) = (yu10m(j)*vmer(j))/sqrt(uzon(j)**2+vmer(j)**2)  
   
      END DO  
   
      !IM cf AM : pbl, HBTM  
      DO i = 1, knon  
         y_cd_h(i) = ycoefh(i, 1)  
         y_cd_m(i) = ycoefm(i, 1)  
      END DO  
      !     print*, 'appel hbtm2'  
      CALL hbtm(knon, ypaprs, ypplay, yt2m, yt10m, yq2m, yq10m, yustar, y_flux_t, &  
           y_flux_q, yu, yv, yt, yq, ypblh, ycapcl, yoliqcl, ycteicl, ypblt, ytherm, &  
           ytrmb1, ytrmb2, ytrmb3, ylcl)  
      !     print*, 'fin hbtm2'  
   
      DO j = 1, knon  
         i = ni(j)  
         pblh(i, nsrf) = ypblh(j)  
         plcl(i, nsrf) = ylcl(j)  
         capcl(i, nsrf) = ycapcl(j)  
         oliqcl(i, nsrf) = yoliqcl(j)  
         cteicl(i, nsrf) = ycteicl(j)  
         pblt(i, nsrf) = ypblt(j)  
         therm(i, nsrf) = ytherm(j)  
         trmb1(i, nsrf) = ytrmb1(j)  
         trmb2(i, nsrf) = ytrmb2(j)  
         trmb3(i, nsrf) = ytrmb3(j)  
      END DO  
   
   
      DO j = 1, knon  
         DO k = 1, klev + 1  
            i = ni(j)  
            q2(i, k, nsrf) = yq2(j, k)  
         END DO  
      END DO  
      !IM "slab" ocean  
      IF (nsrf==is_oce) THEN  
         DO j = 1, knon  
            ! on projette sur la grille globale  
            i = ni(j)  
            IF (pctsrf_new(i, is_oce)>epsfra) THEN  
               flux_o(i) = y_flux_o(j)  
            ELSE  
               flux_o(i) = 0.  
            END IF  
         END DO  
      END IF  
   
      IF (nsrf==is_sic) THEN  
         DO j = 1, knon  
            i = ni(j)  
            !IM 230604 on pondere lorsque l'on fait le bilan au sol :  flux_g(i) = y_flux_g(j)*ypct(j)  
            IF (pctsrf_new(i, is_sic)>epsfra) THEN  
               flux_g(i) = y_flux_g(j)  
            ELSE  
               flux_g(i) = 0.  
            END IF  
         END DO  
   
      END IF  
      !nsrf.EQ.is_sic                                              
      IF (ocean=='slab  ') THEN  
         IF (nsrf==is_oce) THEN  
            tslab(1:klon) = ytslab(1:klon)  
            seaice(1:klon) = y_seaice(1:klon)  
            !nsrf                                                        
         END IF  
         !OCEAN                                                        
      END IF  
   END DO  
6    
7    ! On utilise les nouvelles surfaces    SUBROUTINE clmain(dtime, itap, date0, pctsrf, pctsrf_new, t, q, u, v,&
8    ! A rajouter: conservation de l'albedo         jour, rmu0, co2_ppm, ok_veget, ocean, npas, nexca, ts,&
9           soil_model, cdmmax, cdhmax, ksta, ksta_ter, ok_kzmin, ftsoil,&
10           qsol, paprs, pplay, snow, qsurf, evap, albe, alblw, fluxlat,&
11           rain_f, snow_f, solsw, sollw, sollwdown, fder, rlon, rlat, cufi,&
12           cvfi, rugos, debut, lafin, agesno, rugoro, d_t, d_q, d_u, d_v,&
13           d_ts, flux_t, flux_q, flux_u, flux_v, cdragh, cdragm, q2,&
14           dflux_t, dflux_q, zcoefh, zu1, zv1, t2m, q2m, u10m, v10m, pblh,&
15           capcl, oliqcl, cteicl, pblt, therm, trmb1, trmb2, trmb3, plcl,&
16           fqcalving, ffonte, run_off_lic_0, flux_o, flux_g, tslab, seaice)
17    
18        ! From phylmd/clmain.F, version 1.6 2005/11/16 14:47:19
19        ! Author: Z.X. Li (LMD/CNRS), date: 1993/08/18
20        ! Objet : interface de "couche limite" (diffusion verticale)
21    
22        ! Tout ce qui a trait aux traceurs est dans "phytrac" maintenant.
23        ! Pour l'instant le calcul de la couche limite pour les traceurs
24        ! se fait avec "cltrac" et ne tient pas compte de la différentiation
25        ! des sous-fractions de sol.
26    
27        ! Pour pouvoir extraire les coefficients d'échanges et le vent
28        ! dans la première couche, trois champs supplémentaires ont été
29        ! créés : "zcoefh", "zu1" et "zv1". Pour l'instant nous avons
30        ! moyenné les valeurs de ces trois champs sur les 4 sous-surfaces
31        ! du modèle. Dans l'avenir, si les informations des sous-surfaces
32        ! doivent être prises en compte, il faudra sortir ces mêmes champs
33        ! en leur ajoutant une dimension, c'est-à-dire "nbsrf" (nombre de
34        ! sous-surfaces).
35    
36        ! Arguments:
37        ! dtime----input-R- interval du temps (secondes)
38        ! itap-----input-I- numero du pas de temps
39        ! date0----input-R- jour initial
40        ! t--------input-R- temperature (K)
41        ! q--------input-R- vapeur d'eau (kg/kg)
42        ! u--------input-R- vitesse u
43        ! v--------input-R- vitesse v
44        ! ts-------input-R- temperature du sol (en Kelvin)
45        ! paprs----input-R- pression a intercouche (Pa)
46        ! pplay----input-R- pression au milieu de couche (Pa)
47        ! radsol---input-R- flux radiatif net (positif vers le sol) en W/m**2
48        ! rlat-----input-R- latitude en degree
49        ! rugos----input-R- longeur de rugosite (en m)
50        ! cufi-----input-R- resolution des mailles en x (m)
51        ! cvfi-----input-R- resolution des mailles en y (m)
52    
53        ! d_t------output-R- le changement pour "t"
54        ! d_q------output-R- le changement pour "q"
55        ! d_u------output-R- le changement pour "u"
56        ! d_v------output-R- le changement pour "v"
57        ! d_ts-----output-R- le changement pour "ts"
58        ! flux_t---output-R- flux de chaleur sensible (CpT) J/m**2/s (W/m**2)
59        !                    (orientation positive vers le bas)
60        ! flux_q---output-R- flux de vapeur d'eau (kg/m**2/s)
61        ! flux_u---output-R- tension du vent X: (kg m/s)/(m**2 s) ou Pascal
62        ! flux_v---output-R- tension du vent Y: (kg m/s)/(m**2 s) ou Pascal
63        ! dflux_t derive du flux sensible
64        ! dflux_q derive du flux latent
65        !IM "slab" ocean
66        ! flux_g---output-R-  flux glace (pour OCEAN='slab  ')
67        ! flux_o---output-R-  flux ocean (pour OCEAN='slab  ')
68    
69        ! tslab-in/output-R temperature du slab ocean (en Kelvin)
70        ! uniqmnt pour slab
71    
72        ! seaice---output-R-  glace de mer (kg/m2) (pour OCEAN='slab  ')
73        !cc
74        ! ffonte----Flux thermique utilise pour fondre la neige
75        ! fqcalving-Flux d'eau "perdue" par la surface et necessaire pour limiter la
76        !           hauteur de neige, en kg/m2/s
77        ! on rajoute en output yu1 et yv1 qui sont les vents dans
78        ! la premiere couche
79        ! ces 4 variables sont maintenant traites dans phytrac
80        ! itr--------input-I- nombre de traceurs
81        ! tr---------input-R- q. de traceurs
82        ! flux_surf--input-R- flux de traceurs a la surface
83        ! d_tr-------output-R tendance de traceurs
84        !IM cf. AM : PBL
85        ! trmb1-------deep_cape
86        ! trmb2--------inhibition
87        ! trmb3-------Point Omega
88        ! Cape(klon)-------Cape du thermique
89        ! EauLiq(klon)-------Eau liqu integr du thermique
90        ! ctei(klon)-------Critere d'instab d'entrainmt des nuages de CL
91        ! lcl------- Niveau de condensation
92        ! pblh------- HCL
93        ! pblT------- T au nveau HCL
94    
95        use calendar, ONLY : ymds2ju
96        use coefkz_m, only: coefkz
97        use coefkzmin_m, only: coefkzmin
98        USE conf_phys_m, ONLY : iflag_pbl
99        USE dimens_m, ONLY : iim, jjm
100        USE dimphy, ONLY : klev, klon, zmasq
101        USE dimsoil, ONLY : nsoilmx
102        USE dynetat0_m, ONLY : day_ini
103        USE gath_cpl, ONLY : gath2cpl
104        use hbtm_m, only: hbtm
105        USE histcom, ONLY : histbeg_totreg, histdef, histend, histsync
106        use histwrite_m, only: histwrite
107        USE indicesol, ONLY : epsfra, is_lic, is_oce, is_sic, is_ter, nbsrf
108        USE iniprint, ONLY : prt_level
109        USE suphec_m, ONLY : rd, rg, rkappa
110        USE temps, ONLY : annee_ref, itau_phy
111        use yamada4_m, only: yamada4
112    
113        REAL, INTENT (IN) :: dtime
114        REAL date0
115        INTEGER, INTENT (IN) :: itap
116        REAL t(klon, klev), q(klon, klev)
117        REAL, INTENT (IN):: u(klon, klev), v(klon, klev)
118        REAL, INTENT (IN):: paprs(klon, klev+1)
119        REAL, INTENT (IN):: pplay(klon, klev)
120        REAL, INTENT (IN):: rlon(klon), rlat(klon)
121        REAL cufi(klon), cvfi(klon)
122        REAL d_t(klon, klev), d_q(klon, klev)
123        REAL d_u(klon, klev), d_v(klon, klev)
124        REAL flux_t(klon, klev, nbsrf), flux_q(klon, klev, nbsrf)
125        REAL dflux_t(klon), dflux_q(klon)
126        !IM "slab" ocean
127        REAL flux_o(klon), flux_g(klon)
128        REAL y_flux_o(klon), y_flux_g(klon)
129        REAL tslab(klon), ytslab(klon)
130        REAL seaice(klon), y_seaice(klon)
131        REAL y_fqcalving(klon), y_ffonte(klon)
132        REAL fqcalving(klon, nbsrf), ffonte(klon, nbsrf)
133        REAL run_off_lic_0(klon), y_run_off_lic_0(klon)
134    
135        REAL flux_u(klon, klev, nbsrf), flux_v(klon, klev, nbsrf)
136        REAL rugmer(klon), agesno(klon, nbsrf)
137        REAL, INTENT (IN) :: rugoro(klon)
138        REAL cdragh(klon), cdragm(klon)
139        ! jour de l'annee en cours                
140        INTEGER jour
141        REAL rmu0(klon) ! cosinus de l'angle solaire zenithal    
142        ! taux CO2 atmosphere                    
143        REAL co2_ppm
144        LOGICAL, INTENT (IN) :: debut
145        LOGICAL, INTENT (IN) :: lafin
146        LOGICAL ok_veget
147        CHARACTER (len=*), INTENT (IN) :: ocean
148        INTEGER npas, nexca
149    
150        REAL pctsrf(klon, nbsrf)
151        REAL ts(klon, nbsrf)
152        REAL d_ts(klon, nbsrf)
153        REAL snow(klon, nbsrf)
154        REAL qsurf(klon, nbsrf)
155        REAL evap(klon, nbsrf)
156        REAL albe(klon, nbsrf)
157        REAL alblw(klon, nbsrf)
158    
159        REAL fluxlat(klon, nbsrf)
160    
161        REAL rain_f(klon), snow_f(klon)
162        REAL fder(klon)
163    
164        REAL sollw(klon, nbsrf), solsw(klon, nbsrf), sollwdown(klon)
165        REAL rugos(klon, nbsrf)
166        ! la nouvelle repartition des surfaces sortie de l'interface
167        REAL pctsrf_new(klon, nbsrf)
168    
169        REAL zcoefh(klon, klev)
170        REAL zu1(klon)
171        REAL zv1(klon)
172    
173        !$$$ PB ajout pour soil
174        LOGICAL, INTENT (IN) :: soil_model
175        !IM ajout seuils cdrm, cdrh
176        REAL cdmmax, cdhmax
177    
178        REAL ksta, ksta_ter
179        LOGICAL ok_kzmin
180    
181        REAL ftsoil(klon, nsoilmx, nbsrf)
182        REAL ytsoil(klon, nsoilmx)
183        REAL qsol(klon)
184    
185        EXTERNAL clqh, clvent, calbeta, cltrac
186    
187        REAL yts(klon), yrugos(klon), ypct(klon), yz0_new(klon)
188        REAL yalb(klon)
189        REAL yalblw(klon)
190        REAL yu1(klon), yv1(klon)
191        REAL ysnow(klon), yqsurf(klon), yagesno(klon), yqsol(klon)
192        REAL yrain_f(klon), ysnow_f(klon)
193        REAL ysollw(klon), ysolsw(klon), ysollwdown(klon)
194        REAL yfder(klon), ytaux(klon), ytauy(klon)
195        REAL yrugm(klon), yrads(klon), yrugoro(klon)
196    
197        REAL yfluxlat(klon)
198    
199        REAL y_d_ts(klon)
200        REAL y_d_t(klon, klev), y_d_q(klon, klev)
201        REAL y_d_u(klon, klev), y_d_v(klon, klev)
202        REAL y_flux_t(klon, klev), y_flux_q(klon, klev)
203        REAL y_flux_u(klon, klev), y_flux_v(klon, klev)
204        REAL y_dflux_t(klon), y_dflux_q(klon)
205        REAL ycoefh(klon, klev), ycoefm(klon, klev)
206        REAL yu(klon, klev), yv(klon, klev)
207        REAL yt(klon, klev), yq(klon, klev)
208        REAL ypaprs(klon, klev+1), ypplay(klon, klev), ydelp(klon, klev)
209    
210        LOGICAL ok_nonloc
211        PARAMETER (ok_nonloc=.FALSE.)
212        REAL ycoefm0(klon, klev), ycoefh0(klon, klev)
213    
214        REAL yzlay(klon, klev), yzlev(klon, klev+1), yteta(klon, klev)
215        REAL ykmm(klon, klev+1), ykmn(klon, klev+1)
216        REAL ykmq(klon, klev+1)
217        REAL yq2(klon, klev+1), q2(klon, klev+1, nbsrf)
218        REAL q2diag(klon, klev+1)
219    
220        REAL u1lay(klon), v1lay(klon)
221        REAL delp(klon, klev)
222        INTEGER i, k, nsrf
223    
224        INTEGER ni(klon), knon, j
225    
226        REAL pctsrf_pot(klon, nbsrf)
227        ! "pourcentage potentiel" pour tenir compte des éventuelles
228        ! apparitions ou disparitions de la glace de mer
229    
230        REAL zx_alf1, zx_alf2 !valeur ambiante par extrapola.
231    
232        ! maf pour sorties IOISPL en cas de debugagage
233    
234        CHARACTER (80) cldebug
235        SAVE cldebug
236        CHARACTER (8) cl_surf(nbsrf)
237        SAVE cl_surf
238        INTEGER nhoridbg, nidbg
239        SAVE nhoridbg, nidbg
240        INTEGER ndexbg(iim*(jjm+1))
241        REAL zx_lon(iim, jjm+1), zx_lat(iim, jjm+1), zjulian
242        REAL tabindx(klon)
243        REAL debugtab(iim, jjm+1)
244        LOGICAL first_appel
245        SAVE first_appel
246        DATA first_appel/ .TRUE./
247        LOGICAL :: debugindex = .FALSE.
248        INTEGER idayref
249        REAL t2m(klon, nbsrf), q2m(klon, nbsrf)
250        REAL u10m(klon, nbsrf), v10m(klon, nbsrf)
251    
252        REAL yt2m(klon), yq2m(klon), yu10m(klon)
253        REAL yustar(klon)
254        ! -- LOOP
255        REAL yu10mx(klon)
256        REAL yu10my(klon)
257        REAL ywindsp(klon)
258        ! -- LOOP
259    
260        REAL yt10m(klon), yq10m(klon)
261        !IM cf. AM : pbl, hbtm (Comme les autres diagnostics on cumule ds
262        ! physiq ce qui permet de sortir les grdeurs par sous surface)
263        REAL pblh(klon, nbsrf)
264        REAL plcl(klon, nbsrf)
265        REAL capcl(klon, nbsrf)
266        REAL oliqcl(klon, nbsrf)
267        REAL cteicl(klon, nbsrf)
268        REAL pblt(klon, nbsrf)
269        REAL therm(klon, nbsrf)
270        REAL trmb1(klon, nbsrf)
271        REAL trmb2(klon, nbsrf)
272        REAL trmb3(klon, nbsrf)
273        REAL ypblh(klon)
274        REAL ylcl(klon)
275        REAL ycapcl(klon)
276        REAL yoliqcl(klon)
277        REAL ycteicl(klon)
278        REAL ypblt(klon)
279        REAL ytherm(klon)
280        REAL ytrmb1(klon)
281        REAL ytrmb2(klon)
282        REAL ytrmb3(klon)
283        REAL y_cd_h(klon), y_cd_m(klon)
284        REAL uzon(klon), vmer(klon)
285        REAL tair1(klon), qair1(klon), tairsol(klon)
286        REAL psfce(klon), patm(klon)
287    
288        REAL qairsol(klon), zgeo1(klon)
289        REAL rugo1(klon)
290    
291        ! utiliser un jeu de fonctions simples              
292        LOGICAL zxli
293        PARAMETER (zxli=.FALSE.)
294    
295        REAL zt, zqs, zdelta, zcor
296        REAL t_coup
297        PARAMETER (t_coup=273.15)
298    
299        CHARACTER (len=20) :: modname = 'clmain'
300    
301        !------------------------------------------------------------
302    
303        ytherm = 0.
304    
305        IF (debugindex .AND. first_appel) THEN
306           first_appel = .FALSE.
307    
308           ! initialisation sorties netcdf
309    
310           idayref = day_ini
311           CALL ymds2ju(annee_ref, 1, idayref, 0., zjulian)
312           CALL gr_fi_ecrit(1, klon, iim, jjm+1, rlon, zx_lon)
313           DO i = 1, iim
314              zx_lon(i, 1) = rlon(i+1)
315              zx_lon(i, jjm+1) = rlon(i+1)
316           END DO
317           CALL gr_fi_ecrit(1, klon, iim, jjm+1, rlat, zx_lat)
318           cldebug = 'sous_index'
319           CALL histbeg_totreg(cldebug, zx_lon(:, 1), zx_lat(1, :), 1, &
320                iim, 1, jjm+1, itau_phy, zjulian, dtime, nhoridbg, nidbg)
321           ! no vertical axis
322           cl_surf(1) = 'ter'
323           cl_surf(2) = 'lic'
324           cl_surf(3) = 'oce'
325           cl_surf(4) = 'sic'
326           DO nsrf = 1, nbsrf
327              CALL histdef(nidbg, cl_surf(nsrf), cl_surf(nsrf), '-', iim, jjm+1, &
328                   nhoridbg, 1, 1, 1, -99, 'inst', dtime, dtime)
329           END DO
330           CALL histend(nidbg)
331           CALL histsync(nidbg)
332        END IF
333    
334        DO k = 1, klev ! epaisseur de couche
335           DO i = 1, klon
336              delp(i, k) = paprs(i, k) - paprs(i, k+1)
337           END DO
338        END DO
339        DO i = 1, klon ! vent de la premiere couche
340           zx_alf1 = 1.0
341           zx_alf2 = 1.0 - zx_alf1
342           u1lay(i) = u(i, 1)*zx_alf1 + u(i, 2)*zx_alf2
343           v1lay(i) = v(i, 1)*zx_alf1 + v(i, 2)*zx_alf2
344        END DO
345    
346        ! Initialization:
347        rugmer = 0.
348        cdragh = 0.
349        cdragm = 0.
350        dflux_t = 0.
351        dflux_q = 0.
352        zu1 = 0.
353        zv1 = 0.
354        ypct = 0.
355        yts = 0.
356        ysnow = 0.
357        yqsurf = 0.
358        yalb = 0.
359        yalblw = 0.
360        yrain_f = 0.
361        ysnow_f = 0.
362        yfder = 0.
363        ytaux = 0.
364        ytauy = 0.
365        ysolsw = 0.
366        ysollw = 0.
367        ysollwdown = 0.
368        yrugos = 0.
369        yu1 = 0.
370        yv1 = 0.
371        yrads = 0.
372        ypaprs = 0.
373        ypplay = 0.
374        ydelp = 0.
375        yu = 0.
376        yv = 0.
377        yt = 0.
378        yq = 0.
379        pctsrf_new = 0.
380        y_flux_u = 0.
381        y_flux_v = 0.
382        !$$ PB
383        y_dflux_t = 0.
384        y_dflux_q = 0.
385        ytsoil = 999999.
386        yrugoro = 0.
387        ! -- LOOP
388        yu10mx = 0.
389        yu10my = 0.
390        ywindsp = 0.
391        ! -- LOOP
392        d_ts = 0.
393        !§§§ PB
394        yfluxlat = 0.
395        flux_t = 0.
396        flux_q = 0.
397        flux_u = 0.
398        flux_v = 0.
399        d_t = 0.
400        d_q = 0.
401        d_u = 0.
402        d_v = 0.
403        zcoefh = 0.
404    
405        ! Boucler sur toutes les sous-fractions du sol:
406    
407        ! Initialisation des "pourcentages potentiels". On considère ici qu'on
408        ! peut avoir potentiellement de la glace sur tout le domaine océanique
409        ! (à affiner)
410    
411        pctsrf_pot = pctsrf
412        pctsrf_pot(:, is_oce) = 1. - zmasq
413        pctsrf_pot(:, is_sic) = 1. - zmasq
414    
415        DO nsrf = 1, nbsrf
416           ! chercher les indices:
417           ni = 0
418           knon = 0
419           DO i = 1, klon
420              ! Pour déterminer le domaine à traiter, on utilise les surfaces
421              ! "potentielles"
422              IF (pctsrf_pot(i, nsrf) > epsfra) THEN
423                 knon = knon + 1
424                 ni(knon) = i
425              END IF
426           END DO
427    
428           ! variables pour avoir une sortie IOIPSL des INDEX
429           IF (debugindex) THEN
430              tabindx = 0.
431              DO i = 1, knon
432                 tabindx(i) = real(i)
433              END DO
434              debugtab = 0.
435              ndexbg = 0
436              CALL gath2cpl(tabindx, debugtab, klon, knon, iim, jjm, ni)
437              CALL histwrite(nidbg, cl_surf(nsrf), itap, debugtab)
438           END IF
439    
440           IF (knon == 0) CYCLE
441    
442           DO j = 1, knon
443              i = ni(j)
444              ypct(j) = pctsrf(i, nsrf)
445              yts(j) = ts(i, nsrf)
446              ytslab(i) = tslab(i)
447              ysnow(j) = snow(i, nsrf)
448              yqsurf(j) = qsurf(i, nsrf)
449              yalb(j) = albe(i, nsrf)
450              yalblw(j) = alblw(i, nsrf)
451              yrain_f(j) = rain_f(i)
452              ysnow_f(j) = snow_f(i)
453              yagesno(j) = agesno(i, nsrf)
454              yfder(j) = fder(i)
455              ytaux(j) = flux_u(i, 1, nsrf)
456              ytauy(j) = flux_v(i, 1, nsrf)
457              ysolsw(j) = solsw(i, nsrf)
458              ysollw(j) = sollw(i, nsrf)
459              ysollwdown(j) = sollwdown(i)
460              yrugos(j) = rugos(i, nsrf)
461              yrugoro(j) = rugoro(i)
462              yu1(j) = u1lay(i)
463              yv1(j) = v1lay(i)
464              yrads(j) = ysolsw(j) + ysollw(j)
465              ypaprs(j, klev+1) = paprs(i, klev+1)
466              y_run_off_lic_0(j) = run_off_lic_0(i)
467              yu10mx(j) = u10m(i, nsrf)
468              yu10my(j) = v10m(i, nsrf)
469              ywindsp(j) = sqrt(yu10mx(j)*yu10mx(j)+yu10my(j)*yu10my(j))
470           END DO
471    
472           ! IF bucket model for continent, copy soil water content
473           IF (nsrf == is_ter .AND. .NOT. ok_veget) THEN
474              DO j = 1, knon
475                 i = ni(j)
476                 yqsol(j) = qsol(i)
477              END DO
478           ELSE
479              yqsol = 0.
480           END IF
481           !$$$ PB ajour pour soil
482           DO k = 1, nsoilmx
483              DO j = 1, knon
484                 i = ni(j)
485                 ytsoil(j, k) = ftsoil(i, k, nsrf)
486              END DO
487           END DO
488           DO k = 1, klev
489              DO j = 1, knon
490                 i = ni(j)
491                 ypaprs(j, k) = paprs(i, k)
492                 ypplay(j, k) = pplay(i, k)
493                 ydelp(j, k) = delp(i, k)
494                 yu(j, k) = u(i, k)
495                 yv(j, k) = v(i, k)
496                 yt(j, k) = t(i, k)
497                 yq(j, k) = q(i, k)
498              END DO
499           END DO
500    
501           ! calculer Cdrag et les coefficients d'echange
502           CALL coefkz(nsrf, knon, ypaprs, ypplay, ksta, ksta_ter, yts,&
503                yrugos, yu, yv, yt, yq, yqsurf, ycoefm, ycoefh)
504           IF (iflag_pbl == 1) THEN
505              CALL coefkz2(nsrf, knon, ypaprs, ypplay, yt, ycoefm0, ycoefh0)
506              DO k = 1, klev
507                 DO i = 1, knon
508                    ycoefm(i, k) = max(ycoefm(i, k), ycoefm0(i, k))
509                    ycoefh(i, k) = max(ycoefh(i, k), ycoefh0(i, k))
510                 END DO
511              END DO
512           END IF
513    
514           ! on seuille ycoefm et ycoefh
515           IF (nsrf == is_oce) THEN
516              DO j = 1, knon
517                 ycoefm(j, 1) = min(ycoefm(j, 1), cdmmax)
518                 ycoefh(j, 1) = min(ycoefh(j, 1), cdhmax)
519              END DO
520           END IF
521    
522           IF (ok_kzmin) THEN
523              ! Calcul d'une diffusion minimale pour les conditions tres stables
524              CALL coefkzmin(knon, ypaprs, ypplay, yu, yv, yt, yq, ycoefm(:, 1), &
525                   ycoefm0, ycoefh0)
526    
527              DO k = 1, klev
528                 DO i = 1, knon
529                    ycoefm(i, k) = max(ycoefm(i, k), ycoefm0(i, k))
530                    ycoefh(i, k) = max(ycoefh(i, k), ycoefh0(i, k))
531                 END DO
532              END DO
533           END IF
534    
535           IF (iflag_pbl >= 3) THEN
536              ! MELLOR ET YAMADA adapté à Mars, Richard Fournier et Frédéric Hourdin
537              yzlay(1:knon, 1) = rd*yt(1:knon, 1)/(0.5*(ypaprs(1:knon, &
538                   1)+ypplay(1:knon, 1)))*(ypaprs(1:knon, 1)-ypplay(1:knon, 1))/rg
539              DO k = 2, klev
540                 yzlay(1:knon, k) = yzlay(1:knon, k-1) &
541                      + rd * 0.5 * (yt(1:knon, k-1) + yt(1:knon, k)) &
542                      / ypaprs(1:knon, k) &
543                      * (ypplay(1:knon, k-1) - ypplay(1:knon, k)) / rg
544              END DO
545              DO k = 1, klev
546                 yteta(1:knon, k) = yt(1:knon, k)*(ypaprs(1:knon, 1) &
547                      / ypplay(1:knon, k))**rkappa * (1.+0.61*yq(1:knon, k))
548              END DO
549              yzlev(1:knon, 1) = 0.
550              yzlev(1:knon, klev+1) = 2.*yzlay(1:knon, klev) - yzlay(1:knon, klev-1)
551              DO k = 2, klev
552                 yzlev(1:knon, k) = 0.5*(yzlay(1:knon, k)+yzlay(1:knon, k-1))
553              END DO
554              DO k = 1, klev + 1
555                 DO j = 1, knon
556                    i = ni(j)
557                    yq2(j, k) = q2(i, k, nsrf)
558                 END DO
559              END DO
560    
561              y_cd_m(1:knon) = ycoefm(1:knon, 1)
562              y_cd_h(1:knon) = ycoefh(1:knon, 1)
563              CALL ustarhb(knon, yu, yv, y_cd_m, yustar)
564    
565              IF (prt_level>9) THEN
566                 PRINT *, 'USTAR = ', yustar
567              END IF
568    
569              ! iflag_pbl peut être utilisé comme longueur de mélange
570    
571              IF (iflag_pbl >= 11) THEN
572                 CALL vdif_kcay(knon, dtime, rg, rd, ypaprs, yt, yzlev, yzlay, &
573                      yu, yv, yteta, y_cd_m, yq2, q2diag, ykmm, ykmn, yustar, &
574                      iflag_pbl)
575              ELSE
576                 CALL yamada4(knon, dtime, rg, yzlev, yzlay, yu, yv, yteta, &
577                      y_cd_m, yq2, ykmm, ykmn, ykmq, yustar, iflag_pbl)
578              END IF
579    
580              ycoefm(1:knon, 1) = y_cd_m(1:knon)
581              ycoefh(1:knon, 1) = y_cd_h(1:knon)
582              ycoefm(1:knon, 2:klev) = ykmm(1:knon, 2:klev)
583              ycoefh(1:knon, 2:klev) = ykmn(1:knon, 2:klev)
584           END IF
585    
586           ! calculer la diffusion des vitesses "u" et "v"
587           CALL clvent(knon, dtime, yu1, yv1, ycoefm, yt, yu, ypaprs, ypplay, &
588                ydelp, y_d_u, y_flux_u)
589           CALL clvent(knon, dtime, yu1, yv1, ycoefm, yt, yv, ypaprs, ypplay, &
590                ydelp, y_d_v, y_flux_v)
591    
592           ! pour le couplage
593           ytaux = y_flux_u(:, 1)
594           ytauy = y_flux_v(:, 1)
595    
596           ! calculer la diffusion de "q" et de "h"
597           CALL clqh(dtime, itap, date0, jour, debut, lafin, rlon, rlat,&
598                cufi, cvfi, knon, nsrf, ni, pctsrf, soil_model, ytsoil,&
599                yqsol, ok_veget, ocean, npas, nexca, rmu0, co2_ppm, yrugos,&
600                yrugoro, yu1, yv1, ycoefh, yt, yq, yts, ypaprs, ypplay,&
601                ydelp, yrads, yalb, yalblw, ysnow, yqsurf, yrain_f, ysnow_f, &
602                yfder, ytaux, ytauy, ywindsp, ysollw, ysollwdown, ysolsw,&
603                yfluxlat, pctsrf_new, yagesno, y_d_t, y_d_q, y_d_ts,&
604                yz0_new, y_flux_t, y_flux_q, y_dflux_t, y_dflux_q,&
605                y_fqcalving, y_ffonte, y_run_off_lic_0, y_flux_o, y_flux_g,&
606                ytslab, y_seaice)
607    
608           ! calculer la longueur de rugosite sur ocean
609           yrugm = 0.
610           IF (nsrf == is_oce) THEN
611              DO j = 1, knon
612                 yrugm(j) = 0.018*ycoefm(j, 1)*(yu1(j)**2+yv1(j)**2)/rg + &
613                      0.11*14E-6/sqrt(ycoefm(j, 1)*(yu1(j)**2+yv1(j)**2))
614                 yrugm(j) = max(1.5E-05, yrugm(j))
615              END DO
616           END IF
617           DO j = 1, knon
618              y_dflux_t(j) = y_dflux_t(j)*ypct(j)
619              y_dflux_q(j) = y_dflux_q(j)*ypct(j)
620              yu1(j) = yu1(j)*ypct(j)
621              yv1(j) = yv1(j)*ypct(j)
622           END DO
623    
624           DO k = 1, klev
625              DO j = 1, knon
626                 i = ni(j)
627                 ycoefh(j, k) = ycoefh(j, k)*ypct(j)
628                 ycoefm(j, k) = ycoefm(j, k)*ypct(j)
629                 y_d_t(j, k) = y_d_t(j, k)*ypct(j)
630                 y_d_q(j, k) = y_d_q(j, k)*ypct(j)
631                 flux_t(i, k, nsrf) = y_flux_t(j, k)
632                 flux_q(i, k, nsrf) = y_flux_q(j, k)
633                 flux_u(i, k, nsrf) = y_flux_u(j, k)
634                 flux_v(i, k, nsrf) = y_flux_v(j, k)
635                 y_d_u(j, k) = y_d_u(j, k)*ypct(j)
636                 y_d_v(j, k) = y_d_v(j, k)*ypct(j)
637              END DO
638           END DO
639    
640           evap(:, nsrf) = -flux_q(:, 1, nsrf)
641    
642           albe(:, nsrf) = 0.
643           alblw(:, nsrf) = 0.
644           snow(:, nsrf) = 0.
645           qsurf(:, nsrf) = 0.
646           rugos(:, nsrf) = 0.
647           fluxlat(:, nsrf) = 0.
648           DO j = 1, knon
649              i = ni(j)
650              d_ts(i, nsrf) = y_d_ts(j)
651              albe(i, nsrf) = yalb(j)
652              alblw(i, nsrf) = yalblw(j)
653              snow(i, nsrf) = ysnow(j)
654              qsurf(i, nsrf) = yqsurf(j)
655              rugos(i, nsrf) = yz0_new(j)
656              fluxlat(i, nsrf) = yfluxlat(j)
657              IF (nsrf == is_oce) THEN
658                 rugmer(i) = yrugm(j)
659                 rugos(i, nsrf) = yrugm(j)
660              END IF
661              agesno(i, nsrf) = yagesno(j)
662              fqcalving(i, nsrf) = y_fqcalving(j)
663              ffonte(i, nsrf) = y_ffonte(j)
664              cdragh(i) = cdragh(i) + ycoefh(j, 1)
665              cdragm(i) = cdragm(i) + ycoefm(j, 1)
666              dflux_t(i) = dflux_t(i) + y_dflux_t(j)
667              dflux_q(i) = dflux_q(i) + y_dflux_q(j)
668              zu1(i) = zu1(i) + yu1(j)
669              zv1(i) = zv1(i) + yv1(j)
670           END DO
671           IF (nsrf == is_ter) THEN
672              DO j = 1, knon
673                 i = ni(j)
674                 qsol(i) = yqsol(j)
675              END DO
676           END IF
677           IF (nsrf == is_lic) THEN
678              DO j = 1, knon
679                 i = ni(j)
680                 run_off_lic_0(i) = y_run_off_lic_0(j)
681              END DO
682           END IF
683           !$$$ PB ajout pour soil
684           ftsoil(:, :, nsrf) = 0.
685           DO k = 1, nsoilmx
686              DO j = 1, knon
687                 i = ni(j)
688                 ftsoil(i, k, nsrf) = ytsoil(j, k)
689              END DO
690           END DO
691    
692           DO j = 1, knon
693              i = ni(j)
694              DO k = 1, klev
695                 d_t(i, k) = d_t(i, k) + y_d_t(j, k)
696                 d_q(i, k) = d_q(i, k) + y_d_q(j, k)
697                 d_u(i, k) = d_u(i, k) + y_d_u(j, k)
698                 d_v(i, k) = d_v(i, k) + y_d_v(j, k)
699                 zcoefh(i, k) = zcoefh(i, k) + ycoefh(j, k)
700              END DO
701           END DO
702    
703           !cc diagnostic t, q a 2m et u, v a 10m
704    
705           DO j = 1, knon
706              i = ni(j)
707              uzon(j) = yu(j, 1) + y_d_u(j, 1)
708              vmer(j) = yv(j, 1) + y_d_v(j, 1)
709              tair1(j) = yt(j, 1) + y_d_t(j, 1)
710              qair1(j) = yq(j, 1) + y_d_q(j, 1)
711              zgeo1(j) = rd*tair1(j)/(0.5*(ypaprs(j, 1)+ypplay(j, &
712                   1)))*(ypaprs(j, 1)-ypplay(j, 1))
713              tairsol(j) = yts(j) + y_d_ts(j)
714              rugo1(j) = yrugos(j)
715              IF (nsrf == is_oce) THEN
716                 rugo1(j) = rugos(i, nsrf)
717              END IF
718              psfce(j) = ypaprs(j, 1)
719              patm(j) = ypplay(j, 1)
720    
721              qairsol(j) = yqsurf(j)
722           END DO
723    
724           CALL stdlevvar(klon, knon, nsrf, zxli, uzon, vmer, tair1, qair1, zgeo1, &
725                tairsol, qairsol, rugo1, psfce, patm, yt2m, yq2m, yt10m, yq10m, &
726                yu10m, yustar)
727    
728           DO j = 1, knon
729              i = ni(j)
730              t2m(i, nsrf) = yt2m(j)
731              q2m(i, nsrf) = yq2m(j)
732    
733              ! u10m, v10m : composantes du vent a 10m sans spirale de Ekman
734              u10m(i, nsrf) = (yu10m(j)*uzon(j))/sqrt(uzon(j)**2+vmer(j)**2)
735              v10m(i, nsrf) = (yu10m(j)*vmer(j))/sqrt(uzon(j)**2+vmer(j)**2)
736    
737           END DO
738    
739           DO i = 1, knon
740              y_cd_h(i) = ycoefh(i, 1)
741              y_cd_m(i) = ycoefm(i, 1)
742           END DO
743           CALL hbtm(knon, ypaprs, ypplay, yt2m, yt10m, yq2m, yq10m, yustar, &
744                y_flux_t, y_flux_q, yu, yv, yt, yq, ypblh, ycapcl, yoliqcl, &
745                ycteicl, ypblt, ytherm, ytrmb1, ytrmb2, ytrmb3, ylcl)
746    
747           DO j = 1, knon
748              i = ni(j)
749              pblh(i, nsrf) = ypblh(j)
750              plcl(i, nsrf) = ylcl(j)
751              capcl(i, nsrf) = ycapcl(j)
752              oliqcl(i, nsrf) = yoliqcl(j)
753              cteicl(i, nsrf) = ycteicl(j)
754              pblt(i, nsrf) = ypblt(j)
755              therm(i, nsrf) = ytherm(j)
756              trmb1(i, nsrf) = ytrmb1(j)
757              trmb2(i, nsrf) = ytrmb2(j)
758              trmb3(i, nsrf) = ytrmb3(j)
759           END DO
760    
761           DO j = 1, knon
762              DO k = 1, klev + 1
763                 i = ni(j)
764                 q2(i, k, nsrf) = yq2(j, k)
765              END DO
766           END DO
767           !IM "slab" ocean
768           IF (nsrf == is_oce) THEN
769              DO j = 1, knon
770                 ! on projette sur la grille globale
771                 i = ni(j)
772                 IF (pctsrf_new(i, is_oce)>epsfra) THEN
773                    flux_o(i) = y_flux_o(j)
774                 ELSE
775                    flux_o(i) = 0.
776                 END IF
777              END DO
778           END IF
779    
780           IF (nsrf == is_sic) THEN
781              DO j = 1, knon
782                 i = ni(j)
783                 ! On pondère lorsque l'on fait le bilan au sol :
784                 IF (pctsrf_new(i, is_sic)>epsfra) THEN
785                    flux_g(i) = y_flux_g(j)
786                 ELSE
787                    flux_g(i) = 0.
788                 END IF
789              END DO
790    
791           END IF
792           IF (ocean == 'slab  ') THEN
793              IF (nsrf == is_oce) THEN
794                 tslab(1:klon) = ytslab(1:klon)
795                 seaice(1:klon) = y_seaice(1:klon)
796              END IF
797           END IF
798        END DO
799    
800    rugos(:, is_oce) = rugmer      ! On utilise les nouvelles surfaces
   pctsrf = pctsrf_new  
801    
802  END SUBROUTINE clmain      rugos(:, is_oce) = rugmer
803        pctsrf = pctsrf_new
804    
805      END SUBROUTINE clmain
806    
807    end module clmain_m

Legend:
Removed from v.17  
changed lines
  Added in v.47

  ViewVC Help
Powered by ViewVC 1.1.21