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

Diff of /trunk/phylmd/clmain.f

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

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

Legend:
Removed from v.3  
changed lines
  Added in v.38

  ViewVC Help
Powered by ViewVC 1.1.21