/[lmdze]/trunk/Sources/phylmd/clmain.f
ViewVC logotype

Diff of /trunk/Sources/phylmd/clmain.f

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

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

Legend:
Removed from v.13  
changed lines
  Added in v.62

  ViewVC Help
Powered by ViewVC 1.1.21