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

Legend:
Removed from v.12  
changed lines
  Added in v.82

  ViewVC Help
Powered by ViewVC 1.1.21