/[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 72 by guez, Tue Jul 23 13:00:07 2013 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)      REAL pblt(klon, nbsrf)
145        real, intent(in):: rugoro(klon)      ! pblT------- T au nveau HCL
146        REAL cdragh(klon), cdragm(klon)      REAL therm(klon, nbsrf)
147        integer jour            ! jour de l'annee en cours      REAL trmb1(klon, nbsrf)
148        real rmu0(klon)         ! cosinus de l'angle solaire zenithal      ! trmb1-------deep_cape
149        REAL co2_ppm            ! taux CO2 atmosphere      REAL trmb2(klon, nbsrf)
150        LOGICAL, intent(in):: debut      ! trmb2--------inhibition
151        logical, intent(in):: lafin      REAL trmb3(klon, nbsrf)
152        logical ok_veget      ! trmb3-------Point Omega
153        character(len=*), intent(IN):: ocean      REAL plcl(klon, nbsrf)
154        integer npas, nexca      REAL fqcalving(klon, nbsrf), ffonte(klon, nbsrf)
155  c      ! ffonte----Flux thermique utilise pour fondre la neige
156        REAL pctsrf(klon,nbsrf)      ! fqcalving-Flux d'eau "perdue" par la surface et necessaire pour limiter la
157        REAL ts(klon,nbsrf)      !           hauteur de neige, en kg/m2/s
158        REAL d_ts(klon,nbsrf)      REAL run_off_lic_0(klon)
159        REAL snow(klon,nbsrf)  
160        REAL qsurf(klon,nbsrf)      REAL flux_o(klon), flux_g(klon)
161        REAL evap(klon,nbsrf)      !IM "slab" ocean
162        REAL albe(klon,nbsrf)      ! flux_g---output-R-  flux glace (pour OCEAN='slab  ')
163        REAL alblw(klon,nbsrf)      ! flux_o---output-R-  flux ocean (pour OCEAN='slab  ')
164  c$$$ PB  
165        REAL fluxlat(klon,nbsrf)      REAL tslab(klon)
166  C      ! tslab-in/output-R temperature du slab ocean (en Kelvin)
167        real rain_f(klon), snow_f(klon)      ! uniqmnt pour slab
168        REAL fder(klon)  
169  cIM cf. JLD   REAL sollw(klon), solsw(klon), sollwdown(klon)      REAL seaice(klon)
170        REAL sollw(klon,nbsrf), solsw(klon,nbsrf), sollwdown(klon)      ! seaice---output-R-  glace de mer (kg/m2) (pour OCEAN='slab  ')
171        REAL rugos(klon,nbsrf)  
172  C la nouvelle repartition des surfaces sortie de l'interface      ! Local:
173        REAL pctsrf_new(klon,nbsrf)  
174  cAA      REAL y_flux_o(klon), y_flux_g(klon)
175        REAL zcoefh(klon,klev)      real ytslab(klon)
176        REAL zu1(klon)      real y_seaice(klon)
177        REAL zv1(klon)      REAL y_fqcalving(klon), y_ffonte(klon)
178  cAA      real y_run_off_lic_0(klon)
179  c$$$ PB ajout pour soil  
180        LOGICAL, intent(in):: soil_model      REAL rugmer(klon)
181  cIM ajout seuils cdrm, cdrh  
182        REAL cdmmax, cdhmax      REAL ytsoil(klon, nsoilmx)
183  cIM: 261103  
184        REAL ksta, ksta_ter      REAL yts(klon), yrugos(klon), ypct(klon), yz0_new(klon)
185        LOGICAL ok_kzmin      REAL yalb(klon)
186  cIM: 261103      REAL yalblw(klon)
187        REAL ftsoil(klon,nsoilmx,nbsrf)      REAL yu1(klon), yv1(klon)
188        REAL ytsoil(klon,nsoilmx)      ! on rajoute en output yu1 et yv1 qui sont les vents dans
189        REAL qsol(klon)      ! la premiere couche
190  c======================================================================      REAL ysnow(klon), yqsurf(klon), yagesno(klon), yqsol(klon)
191        EXTERNAL clqh, clvent, coefkz, calbeta, cltrac      REAL yrain_f(klon), ysnow_f(klon)
192  c======================================================================      REAL ysollw(klon), ysolsw(klon)
193        REAL yts(klon), yrugos(klon), ypct(klon), yz0_new(klon)      REAL yfder(klon), ytaux(klon), ytauy(klon)
194        REAL yalb(klon)      REAL yrugm(klon), yrads(klon), yrugoro(klon)
195        REAL yalblw(klon)  
196        REAL yu1(klon), yv1(klon)      REAL yfluxlat(klon)
197        real ysnow(klon), yqsurf(klon), yagesno(klon), yqsol(klon)  
198        real yrain_f(klon), ysnow_f(klon)      REAL y_d_ts(klon)
199        real ysollw(klon), ysolsw(klon), ysollwdown(klon)      REAL y_d_t(klon, klev), y_d_q(klon, klev)
200        real yfder(klon), ytaux(klon), ytauy(klon)      REAL y_d_u(klon, klev), y_d_v(klon, klev)
201        REAL yrugm(klon), yrads(klon),yrugoro(klon)      REAL y_flux_t(klon, klev), y_flux_q(klon, klev)
202  c$$$ PB      REAL y_flux_u(klon, klev), y_flux_v(klon, klev)
203        REAL yfluxlat(klon)      REAL y_dflux_t(klon), y_dflux_q(klon)
204  C      REAL coefh(klon, klev), coefm(klon, klev)
205        REAL y_d_ts(klon)      REAL yu(klon, klev), yv(klon, klev)
206        REAL y_d_t(klon, klev), y_d_q(klon, klev)      REAL yt(klon, klev), yq(klon, klev)
207        REAL y_d_u(klon, klev), y_d_v(klon, klev)      REAL ypaprs(klon, klev+1), ypplay(klon, klev), ydelp(klon, klev)
208        REAL y_flux_t(klon,klev), y_flux_q(klon,klev)  
209        REAL y_flux_u(klon,klev), y_flux_v(klon,klev)      REAL ycoefm0(klon, klev), ycoefh0(klon, klev)
210        REAL y_dflux_t(klon), y_dflux_q(klon)  
211        REAL ycoefh(klon,klev), ycoefm(klon,klev)      REAL yzlay(klon, klev), yzlev(klon, klev+1), yteta(klon, klev)
212        REAL yu(klon,klev), yv(klon,klev)      REAL ykmm(klon, klev+1), ykmn(klon, klev+1)
213        REAL yt(klon,klev), yq(klon,klev)      REAL ykmq(klon, klev+1)
214        REAL ypaprs(klon,klev+1), ypplay(klon,klev), ydelp(klon,klev)      REAL yq2(klon, klev+1)
215  c      REAL q2diag(klon, klev+1)
216        LOGICAL ok_nonloc  
217        PARAMETER (ok_nonloc=.FALSE.)      REAL u1lay(klon), v1lay(klon)
218        REAL ycoefm0(klon,klev), ycoefh0(klon,klev)      REAL delp(klon, klev)
219        INTEGER i, k, nsrf
220  cIM 081204 hcl_Anne ? BEG  
221        real yzlay(klon,klev),yzlev(klon,klev+1),yteta(klon,klev)      INTEGER ni(klon), knon, j
222        real ykmm(klon,klev+1),ykmn(klon,klev+1)  
223        real ykmq(klon,klev+1)      REAL pctsrf_pot(klon, nbsrf)
224        real yq2(klon,klev+1),q2(klon,klev+1,nbsrf)      ! "pourcentage potentiel" pour tenir compte des éventuelles
225        real q2diag(klon,klev+1)      ! apparitions ou disparitions de la glace de mer
226  cIM 081204   real yustar(klon),y_cd_m(klon),y_cd_h(klon)  
227  cIM 081204 hcl_Anne ? END      REAL zx_alf1, zx_alf2 !valeur ambiante par extrapola.
228  c  
229        REAL u1lay(klon), v1lay(klon)      ! maf pour sorties IOISPL en cas de debugagage
230        REAL delp(klon,klev)  
231        INTEGER i, k, nsrf      CHARACTER(80) cldebug
232  cAA   INTEGER it      SAVE cldebug
233        INTEGER ni(klon), knon, j      CHARACTER(8) cl_surf(nbsrf)
234  c Introduction d'une variable "pourcentage potentiel" pour tenir compte      SAVE cl_surf
235  c des eventuelles apparitions et/ou disparitions de la glace de mer      INTEGER nhoridbg, nidbg
236        REAL pctsrf_pot(klon,nbsrf)      SAVE nhoridbg, nidbg
237              INTEGER ndexbg(iim*(jjm+1))
238  c======================================================================      REAL zx_lon(iim, jjm+1), zx_lat(iim, jjm+1), zjulian
239        REAL zx_alf1, zx_alf2 !valeur ambiante par extrapola.      REAL tabindx(klon)
240  c======================================================================      REAL debugtab(iim, jjm+1)
241  c      LOGICAL first_appel
242  c maf pour sorties IOISPL en cas de debugagage      SAVE first_appel
243  c      DATA first_appel/ .TRUE./
244        CHARACTER*80 cldebug      LOGICAL:: debugindex = .FALSE.
245        SAVE cldebug      INTEGER idayref
246        CHARACTER*8 cl_surf(nbsrf)  
247        SAVE cl_surf      REAL yt2m(klon), yq2m(klon), yu10m(klon)
248        INTEGER nhoridbg, nidbg      REAL yustar(klon)
249        SAVE nhoridbg, nidbg      ! -- LOOP
250        INTEGER ndexbg(iim*(jjm+1))      REAL yu10mx(klon)
251        REAL zx_lon(iim,jjm+1), zx_lat(iim,jjm+1), zjulian      REAL yu10my(klon)
252        REAL tabindx(klon)      REAL ywindsp(klon)
253        REAL debugtab(iim,jjm+1)      ! -- LOOP
254        LOGICAL first_appel  
255        SAVE first_appel      REAL yt10m(klon), yq10m(klon)
256        DATA first_appel/.true./      REAL ypblh(klon)
257        LOGICAL:: debugindex = .false.      REAL ylcl(klon)
258        integer idayref      REAL ycapcl(klon)
259        REAL t2m(klon,nbsrf), q2m(klon,nbsrf)      REAL yoliqcl(klon)
260        REAL u10m(klon,nbsrf), v10m(klon,nbsrf)      REAL ycteicl(klon)
261  c      REAL ypblt(klon)
262        REAL yt2m(klon), yq2m(klon), yu10m(klon)      REAL ytherm(klon)
263        REAL yustar(klon)      REAL ytrmb1(klon)
264  c -- LOOP      REAL ytrmb2(klon)
265         REAL yu10mx(klon)      REAL ytrmb3(klon)
266         REAL yu10my(klon)      REAL uzon(klon), vmer(klon)
267         REAL ywindsp(klon)      REAL tair1(klon), qair1(klon), tairsol(klon)
268  c -- LOOP      REAL psfce(klon), patm(klon)
269  c  
270        REAL yt10m(klon), yq10m(klon)      REAL qairsol(klon), zgeo1(klon)
271  cIM cf. AM : pbl, hbtm2 (Comme les autres diagnostics on cumule ds physic ce qui      REAL rugo1(klon)
272  c   permet de sortir les grdeurs par sous surface)  
273        REAL pblh(klon,nbsrf)      ! utiliser un jeu de fonctions simples              
274        REAL plcl(klon,nbsrf)      LOGICAL zxli
275        REAL capCL(klon,nbsrf)      PARAMETER (zxli=.FALSE.)
276        REAL oliqCL(klon,nbsrf)  
277        REAL cteiCL(klon,nbsrf)      !------------------------------------------------------------
278        REAL pblT(klon,nbsrf)  
279        REAL therm(klon,nbsrf)      ytherm = 0.
280        REAL trmb1(klon,nbsrf)  
281        REAL trmb2(klon,nbsrf)      IF (debugindex .AND. first_appel) THEN
282        REAL trmb3(klon,nbsrf)         first_appel = .FALSE.
283        REAL ypblh(klon)  
284        REAL ylcl(klon)         ! initialisation sorties netcdf
285        REAL ycapCL(klon)  
286        REAL yoliqCL(klon)         idayref = day_ini
287        REAL ycteiCL(klon)         CALL ymds2ju(annee_ref, 1, idayref, 0., zjulian)
288        REAL ypblT(klon)         CALL gr_fi_ecrit(1, klon, iim, jjm+1, rlon, zx_lon)
289        REAL ytherm(klon)         DO i = 1, iim
290        REAL ytrmb1(klon)            zx_lon(i, 1) = rlon(i+1)
291        REAL ytrmb2(klon)            zx_lon(i, jjm+1) = rlon(i+1)
292        REAL ytrmb3(klon)         END DO
293        REAL y_cd_h(klon), y_cd_m(klon)         CALL gr_fi_ecrit(1, klon, iim, jjm+1, rlat, zx_lat)
294  c     REAL ygamt(klon,2:klev) ! contre-gradient pour temperature         cldebug = 'sous_index'
295  c     REAL ygamq(klon,2:klev) ! contre-gradient pour humidite         CALL histbeg_totreg(cldebug, zx_lon(:, 1), zx_lat(1, :), 1, &
296        REAL uzon(klon), vmer(klon)              iim, 1, jjm+1, itau_phy, zjulian, dtime, nhoridbg, nidbg)
297        REAL tair1(klon), qair1(klon), tairsol(klon)         ! no vertical axis
298        REAL psfce(klon), patm(klon)         cl_surf(1) = 'ter'
299  c         cl_surf(2) = 'lic'
300        REAL qairsol(klon), zgeo1(klon)         cl_surf(3) = 'oce'
301        REAL rugo1(klon)         cl_surf(4) = 'sic'
302  c         DO nsrf = 1, nbsrf
303        LOGICAL zxli ! utiliser un jeu de fonctions simples            CALL histdef(nidbg, cl_surf(nsrf), cl_surf(nsrf), '-', iim, jjm+1, &
304        PARAMETER (zxli=.FALSE.)                 nhoridbg, 1, 1, 1, -99, 'inst', dtime, dtime)
305  c         END DO
306        REAL zt, zqs, zdelta, zcor         CALL histend(nidbg)
307        REAL t_coup         CALL histsync(nidbg)
308        PARAMETER(t_coup=273.15)      END IF
309  C  
310        character (len = 20) :: modname = 'clmain'      DO k = 1, klev ! epaisseur de couche
311        LOGICAL check         DO i = 1, klon
312        PARAMETER (check=.false.)            delp(i, k) = paprs(i, k) - paprs(i, k+1)
313           END DO
314        END DO
315  c initialisation Anne      DO i = 1, klon ! vent de la premiere couche
316        ytherm(:) = 0.         zx_alf1 = 1.0
317  C         zx_alf2 = 1.0 - zx_alf1
318        if (check) THEN         u1lay(i) = u(i, 1)*zx_alf1 + u(i, 2)*zx_alf2
319            write(*,*) modname,'  klon=',klon         v1lay(i) = v(i, 1)*zx_alf1 + v(i, 2)*zx_alf2
320  CC        call flush(6)      END DO
321        endif  
322        IF (debugindex .and. first_appel) THEN      ! Initialization:
323            first_appel=.false.      rugmer = 0.
324  !      cdragh = 0.
325  ! initialisation sorties netcdf      cdragm = 0.
326  !      dflux_t = 0.
327            idayref = day_ini      dflux_q = 0.
328            CALL ymds2ju(annee_ref, 1, idayref, 0.0, zjulian)      zu1 = 0.
329            CALL gr_fi_ecrit(1,klon,iim,jjm+1,rlon,zx_lon)      zv1 = 0.
330            DO i = 1, iim      ypct = 0.
331              zx_lon(i,1) = rlon(i+1)      yts = 0.
332              zx_lon(i,jjm+1) = rlon(i+1)      ysnow = 0.
333            ENDDO      yqsurf = 0.
334            CALL gr_fi_ecrit(1,klon,iim,jjm+1,rlat,zx_lat)      yalb = 0.
335            cldebug='sous_index'      yalblw = 0.
336            CALL histbeg_totreg(cldebug, iim,zx_lon(:,1),jjm+1,      yrain_f = 0.
337       $        zx_lat(1,:),1,iim,1,jjm      ysnow_f = 0.
338       $        +1, itau_phy,zjulian,dtime,nhoridbg,nidbg)      yfder = 0.
339  ! no vertical axis      ytaux = 0.
340            cl_surf(1)='ter'      ytauy = 0.
341            cl_surf(2)='lic'      ysolsw = 0.
342            cl_surf(3)='oce'      ysollw = 0.
343            cl_surf(4)='sic'      yrugos = 0.
344            DO nsrf=1,nbsrf      yu1 = 0.
345              CALL histdef(nidbg, cl_surf(nsrf),cl_surf(nsrf), "-",iim,      yv1 = 0.
346       $          jjm+1,nhoridbg, 1, 1, 1, -99, 32, "inst", dtime,dtime)      yrads = 0.
347            END DO      ypaprs = 0.
348            CALL histend(nidbg)      ypplay = 0.
349            CALL histsync(nidbg)      ydelp = 0.
350        ENDIF      yu = 0.
351                  yv = 0.
352        DO k = 1, klev   ! epaisseur de couche      yt = 0.
353        DO i = 1, klon      yq = 0.
354           delp(i,k) = paprs(i,k)-paprs(i,k+1)      pctsrf_new = 0.
355        ENDDO      y_flux_u = 0.
356        ENDDO      y_flux_v = 0.
357        DO i = 1, klon  ! vent de la premiere couche      !$$ PB
358           zx_alf1 = 1.0      y_dflux_t = 0.
359           zx_alf2 = 1.0 - zx_alf1      y_dflux_q = 0.
360           u1lay(i) = u(i,1)*zx_alf1 + u(i,2)*zx_alf2      ytsoil = 999999.
361           v1lay(i) = v(i,1)*zx_alf1 + v(i,2)*zx_alf2      yrugoro = 0.
362        ENDDO      ! -- LOOP
363  c      yu10mx = 0.
364  c initialisation:      yu10my = 0.
365  c      ywindsp = 0.
366        DO i = 1, klon      ! -- LOOP
367           rugmer(i) = 0.0      d_ts = 0.
368           cdragh(i) = 0.0      !§§§ PB
369           cdragm(i) = 0.0      yfluxlat = 0.
370           dflux_t(i) = 0.0      flux_t = 0.
371           dflux_q(i) = 0.0      flux_q = 0.
372           zu1(i) = 0.0      flux_u = 0.
373           zv1(i) = 0.0      flux_v = 0.
374        ENDDO      d_t = 0.
375        ypct = 0.0      d_q = 0.
376        yts = 0.0      d_u = 0.
377        ysnow = 0.0      d_v = 0.
378        yqsurf = 0.0      ycoefh = 0.
379        yalb = 0.0  
380        yalblw = 0.0      ! Boucler sur toutes les sous-fractions du sol:
381        yrain_f = 0.0  
382        ysnow_f = 0.0      ! Initialisation des "pourcentages potentiels". On considère ici qu'on
383        yfder = 0.0      ! peut avoir potentiellement de la glace sur tout le domaine océanique
384        ytaux = 0.0      ! (à affiner)
385        ytauy = 0.0  
386        ysolsw = 0.0      pctsrf_pot = pctsrf
387        ysollw = 0.0      pctsrf_pot(:, is_oce) = 1. - zmasq
388        ysollwdown = 0.0      pctsrf_pot(:, is_sic) = 1. - zmasq
389        yrugos = 0.0  
390        yu1 = 0.0      loop_surface: DO nsrf = 1, nbsrf
391        yv1 = 0.0         ! Chercher les indices :
392        yrads = 0.0         ni = 0
393        ypaprs = 0.0         knon = 0
394        ypplay = 0.0         DO i = 1, klon
395        ydelp = 0.0            ! Pour déterminer le domaine à traiter, on utilise les surfaces
396        yu = 0.0            ! "potentielles"
397        yv = 0.0            IF (pctsrf_pot(i, nsrf) > epsfra) THEN
398        yt = 0.0               knon = knon + 1
399        yq = 0.0               ni(knon) = i
400        pctsrf_new = 0.0            END IF
401        y_flux_u = 0.0         END DO
402        y_flux_v = 0.0  
403  C$$ PB         ! variables pour avoir une sortie IOIPSL des INDEX
404        y_dflux_t = 0.0         IF (debugindex) THEN
405        y_dflux_q = 0.0            tabindx = 0.
406        ytsoil = 999999.            DO i = 1, knon
407        yrugoro = 0.               tabindx(i) = real(i)
408  c -- LOOP            END DO
409        yu10mx = 0.0            debugtab = 0.
410        yu10my = 0.0            ndexbg = 0
411        ywindsp = 0.0            CALL gath2cpl(tabindx, debugtab, klon, knon, iim, jjm, ni)
412  c -- LOOP            CALL histwrite(nidbg, cl_surf(nsrf), itap, debugtab)
413        DO nsrf = 1, nbsrf         END IF
414        DO i = 1, klon  
415           d_ts(i,nsrf) = 0.0         if_knon: IF (knon /= 0) then
416        ENDDO            DO j = 1, knon
417        END DO               i = ni(j)
418  C§§§ PB               ypct(j) = pctsrf(i, nsrf)
419        yfluxlat=0.               yts(j) = ts(i, nsrf)
420        flux_t = 0.               ytslab(i) = tslab(i)
421        flux_q = 0.               ysnow(j) = snow(i, nsrf)
422        flux_u = 0.               yqsurf(j) = qsurf(i, nsrf)
423        flux_v = 0.               yalb(j) = albe(i, nsrf)
424        DO k = 1, klev               yalblw(j) = alblw(i, nsrf)
425        DO i = 1, klon               yrain_f(j) = rain_fall(i)
426           d_t(i,k) = 0.0               ysnow_f(j) = snow_f(i)
427           d_q(i,k) = 0.0               yagesno(j) = agesno(i, nsrf)
428  c$$$         flux_t(i,k) = 0.0               yfder(j) = fder(i)
429  c$$$         flux_q(i,k) = 0.0               ytaux(j) = flux_u(i, 1, nsrf)
430           d_u(i,k) = 0.0               ytauy(j) = flux_v(i, 1, nsrf)
431           d_v(i,k) = 0.0               ysolsw(j) = solsw(i, nsrf)
432  c$$$         flux_u(i,k) = 0.0               ysollw(j) = sollw(i, nsrf)
433  c$$$         flux_v(i,k) = 0.0               yrugos(j) = rugos(i, nsrf)
434           zcoefh(i,k) = 0.0               yrugoro(j) = rugoro(i)
435        ENDDO               yu1(j) = u1lay(i)
436        ENDDO               yv1(j) = v1lay(i)
437  cAA      IF (itr.GE.1) THEN               yrads(j) = ysolsw(j) + ysollw(j)
438  cAA      DO it = 1, itr               ypaprs(j, klev+1) = paprs(i, klev+1)
439  cAA      DO k = 1, klev               y_run_off_lic_0(j) = run_off_lic_0(i)
440  cAA      DO i = 1, klon               yu10mx(j) = u10m(i, nsrf)
441  cAA         d_tr(i,k,it) = 0.0               yu10my(j) = v10m(i, nsrf)
442  cAA      ENDDO               ywindsp(j) = sqrt(yu10mx(j)*yu10mx(j)+yu10my(j)*yu10my(j))
443  cAA      ENDDO            END DO
444  cAA      ENDDO  
445  cAA      ENDIF            ! IF bucket model for continent, copy soil water content
446              IF (nsrf == is_ter .AND. .NOT. ok_veget) THEN
447  c               DO j = 1, knon
448  c Boucler sur toutes les sous-fractions du sol:                  i = ni(j)
449  c                  yqsol(j) = qsol(i)
450  C Initialisation des "pourcentages potentiels". On considere ici qu'on               END DO
451  C peut avoir potentiellementdela glace sur tout le domaine oceanique            ELSE
452  C (a affiner)               yqsol = 0.
453              END IF
454        pctsrf_pot = pctsrf  
455        pctsrf_pot(:,is_oce) = 1. - zmasq(:)            DO k = 1, nsoilmx
456        pctsrf_pot(:,is_sic) = 1. - zmasq(:)               DO j = 1, knon
457                    i = ni(j)
458        DO 99999 nsrf = 1, nbsrf                  ytsoil(j, k) = ftsoil(i, k, nsrf)
459                 END DO
460  c chercher les indices:            END DO
461        DO j = 1, klon  
462           ni(j) = 0            DO k = 1, klev
463        ENDDO               DO j = 1, knon
464        knon = 0                  i = ni(j)
465        DO i = 1, klon                  ypaprs(j, k) = paprs(i, k)
466                    ypplay(j, k) = pplay(i, k)
467  C pour determiner le domaine a traiter on utilise les surfaces "potentielles"                  ydelp(j, k) = delp(i, k)
468  C                    yu(j, k) = u(i, k)
469        IF (pctsrf_pot(i,nsrf).GT.epsfra) THEN                  yv(j, k) = v(i, k)
470           knon = knon + 1                  yt(j, k) = t(i, k)
471           ni(knon) = i                  yq(j, k) = q(i, k)
472        ENDIF               END DO
473        ENDDO            END DO
474  c  
475        if (check) THEN            ! calculer Cdrag et les coefficients d'echange
476            write(*,*)'CLMAIN, nsrf, knon =',nsrf, knon            CALL coefkz(nsrf, knon, ypaprs, ypplay, ksta, ksta_ter, yts, yrugos, &
477  CC        call flush(6)                 yu, yv, yt, yq, yqsurf, coefm(:knon, :), coefh(:knon, :))
478        endif            IF (iflag_pbl == 1) THEN
479  c               CALL coefkz2(nsrf, knon, ypaprs, ypplay, yt, ycoefm0, ycoefh0)
480  c variables pour avoir une sortie IOIPSL des INDEX               coefm(:knon, :) = max(coefm(:knon, :), ycoefm0(:knon, :))
481  c               coefh(:knon, :) = max(coefh(:knon, :), ycoefh0(:knon, :))
482        IF (debugindex) THEN            END IF
483            tabindx(:)=0.  
484  c          tabindx(1:knon)=(/FLOAT(i),i=1:knon/)            ! on met un seuil pour coefm et coefh
485            DO i=1,knon            IF (nsrf == is_oce) THEN
486              tabindx(1:knon)=FLOAT(i)               coefm(:knon, 1) = min(coefm(:knon, 1), cdmmax)
487            END DO               coefh(:knon, 1) = min(coefh(:knon, 1), cdhmax)
488            debugtab(:,:)=0.            END IF
489            ndexbg(:)=0  
490            CALL gath2cpl(tabindx,debugtab,klon,knon,iim,jjm,ni)            IF (ok_kzmin) THEN
491            CALL histwrite(nidbg,cl_surf(nsrf),itap,debugtab,iim*(jjm+1)               ! Calcul d'une diffusion minimale pour les conditions tres stables
492       $        ,ndexbg)               CALL coefkzmin(knon, ypaprs, ypplay, yu, yv, yt, yq, &
493        ENDIF                    coefm(:knon, 1), ycoefm0, ycoefh0)
494        IF (knon.EQ.0) GOTO 99999               coefm(:knon, :) = max(coefm(:knon, :), ycoefm0(:knon, :))
495        DO j = 1, knon               coefh(:knon, :) = max(coefh(:knon, :), ycoefh0(:knon, :))
496        i = ni(j)             END IF
497          ypct(j) = pctsrf(i,nsrf)  
498          yts(j) = ts(i,nsrf)            IF (iflag_pbl >= 3) THEN
499  cIM "slab" ocean               ! MELLOR ET YAMADA adapté à Mars, Richard Fournier et
500  c        PRINT *, 'tslab = ', i, tslab(i)               ! Frédéric Hourdin
501          ytslab(i) = tslab(i)               yzlay(:knon, 1) = rd * yt(:knon, 1) / (0.5 * (ypaprs(:knon, 1) &
502  c                    + ypplay(:knon, 1))) &
503          ysnow(j) = snow(i,nsrf)                    * (ypaprs(:knon, 1) - ypplay(:knon, 1)) / rg
504          yqsurf(j) = qsurf(i,nsrf)               DO k = 2, klev
505          yalb(j) = albe(i,nsrf)                  yzlay(1:knon, k) = yzlay(1:knon, k-1) &
506          yalblw(j) = alblw(i,nsrf)                       + rd * 0.5 * (yt(1:knon, k-1) + yt(1:knon, k)) &
507          yrain_f(j) = rain_f(i)                       / ypaprs(1:knon, k) &
508          ysnow_f(j) = snow_f(i)                       * (ypplay(1:knon, k-1) - ypplay(1:knon, k)) / rg
509          yagesno(j) = agesno(i,nsrf)               END DO
510          yfder(j) = fder(i)               DO k = 1, klev
511          ytaux(j) = flux_u(i,1,nsrf)                  yteta(1:knon, k) = yt(1:knon, k)*(ypaprs(1:knon, 1) &
512          ytauy(j) = flux_v(i,1,nsrf)                       / ypplay(1:knon, k))**rkappa * (1.+0.61*yq(1:knon, k))
513          ysolsw(j) = solsw(i,nsrf)               END DO
514          ysollw(j) = sollw(i,nsrf)               yzlev(1:knon, 1) = 0.
515          ysollwdown(j) = sollwdown(i)               yzlev(:knon, klev+1) = 2. * yzlay(:knon, klev) &
516          yrugos(j) = rugos(i,nsrf)                    - yzlay(:knon, klev - 1)
517          yrugoro(j) = rugoro(i)               DO k = 2, klev
518          yu1(j) = u1lay(i)                  yzlev(1:knon, k) = 0.5*(yzlay(1:knon, k)+yzlay(1:knon, k-1))
519          yv1(j) = v1lay(i)               END DO
520          yrads(j) =  ysolsw(j)+ ysollw(j)               DO k = 1, klev + 1
521          ypaprs(j,klev+1) = paprs(i,klev+1)                  DO j = 1, knon
522          y_run_off_lic_0(j) = run_off_lic_0(i)                     i = ni(j)
523  c -- LOOP                     yq2(j, k) = q2(i, k, nsrf)
524         yu10mx(j) = u10m(i,nsrf)                  END DO
525         yu10my(j) = v10m(i,nsrf)               END DO
526         ywindsp(j) = SQRT(yu10mx(j)*yu10mx(j) + yu10my(j)*yu10my(j) )  
527  c -- LOOP               CALL ustarhb(knon, yu, yv, coefm(:knon, 1), yustar)
528        END DO  
529  C               IF (prt_level > 9) THEN
530  C     IF bucket model for continent, copy soil water content                  PRINT *, 'USTAR = ', yustar
531        IF ( nsrf .eq. is_ter .and. .not. ok_veget ) THEN               END IF
532    
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.13  
changed lines
  Added in v.72

  ViewVC Help
Powered by ViewVC 1.1.21