/[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.f90 revision 61 by guez, Fri Apr 20 14:58:43 2012 UTC trunk/Sources/phylmd/clmain.f revision 206 by guez, Tue Aug 30 12:52:46 2016 UTC
# Line 4  module clmain_m Line 4  module clmain_m
4    
5  contains  contains
6    
7    SUBROUTINE clmain(dtime, itap, date0, pctsrf, pctsrf_new, t, q, u, v,&    SUBROUTINE clmain(dtime, pctsrf, t, q, u, v, jour, rmu0, ts, cdmmax, &
8         jour, rmu0, co2_ppm, ok_veget, ocean, npas, nexca, ts,&         cdhmax, ksta, ksta_ter, ok_kzmin, ftsoil, qsol, paprs, pplay, snow, &
9         soil_model, cdmmax, cdhmax, ksta, ksta_ter, ok_kzmin, ftsoil,&         qsurf, evap, falbe, fluxlat, rain_fall, snow_f, solsw, sollw, fder, &
10         qsol, paprs, pplay, snow, qsurf, evap, albe, alblw, fluxlat,&         rlat, rugos, agesno, rugoro, d_t, d_q, d_u, d_v, d_ts, flux_t, flux_q, &
11         rain_f, snow_f, solsw, sollw, sollwdown, fder, rlon, rlat, cufi,&         flux_u, flux_v, cdragh, cdragm, q2, dflux_t, dflux_q, ycoefh, zu1, &
12         cvfi, rugos, debut, lafin, agesno, rugoro, d_t, d_q, d_u, d_v,&         zv1, t2m, q2m, u10m, v10m, pblh, capcl, oliqcl, cteicl, pblt, therm, &
13         d_ts, flux_t, flux_q, flux_u, flux_v, cdragh, cdragm, q2,&         trmb1, trmb2, trmb3, plcl, fqcalving, ffonte, run_off_lic_0)
14         dflux_t, dflux_q, zcoefh, zu1, zv1, t2m, q2m, u10m, v10m, pblh,&  
15         capcl, oliqcl, cteicl, pblt, therm, trmb1, trmb2, trmb3, plcl,&      ! From phylmd/clmain.F, version 1.6, 2005/11/16 14:47:19
16         fqcalving, ffonte, run_off_lic_0, flux_o, flux_g, tslab, seaice)      ! Author: Z. X. Li (LMD/CNRS), date: 1993/08/18
17        ! Objet : interface de couche limite (diffusion verticale)
18      ! From phylmd/clmain.F, version 1.6 2005/11/16 14:47:19  
19      ! Author: Z.X. Li (LMD/CNRS), date: 1993/08/18      ! Tout ce qui a trait aux traceurs est dans "phytrac". Le calcul
20      ! Objet : interface de "couche limite" (diffusion verticale)      ! de la couche limite pour les traceurs se fait avec "cltrac" et
21        ! ne tient pas compte de la diff\'erentiation des sous-fractions
22      ! Tout ce qui a trait aux traceurs est dans "phytrac" maintenant.      ! de sol.
23      ! Pour l'instant le calcul de la couche limite pour les traceurs  
24      ! se fait avec "cltrac" et ne tient pas compte de la différentiation      ! Pour pouvoir extraire les coefficients d'\'echanges et le vent
25      ! des sous-fractions de sol.      ! dans la premi\`ere couche, trois champs ont \'et\'e cr\'e\'es : "ycoefh",
26        ! "zu1" et "zv1". Nous avons moyenn\'e les valeurs de ces trois
27      ! Pour pouvoir extraire les coefficients d'échanges et le vent      ! champs sur les quatre sous-surfaces du mod\`ele.
     ! dans la première couche, trois champs supplémentaires ont été  
     ! créés : "zcoefh", "zu1" et "zv1". Pour l'instant nous avons  
     ! moyenné les valeurs de ces trois champs sur les 4 sous-surfaces  
     ! du modèle. Dans l'avenir, si les informations des sous-surfaces  
     ! doivent être prises en compte, il faudra sortir ces mêmes champs  
     ! en leur ajoutant une dimension, c'est-à-dire "nbsrf" (nombre de  
     ! sous-surfaces).  
28    
     use calendar, ONLY : ymds2ju  
29      use clqh_m, only: clqh      use clqh_m, only: clqh
30        use clvent_m, only: clvent
31      use coefkz_m, only: coefkz      use coefkz_m, only: coefkz
32      use coefkzmin_m, only: coefkzmin      use coefkzmin_m, only: coefkzmin
33      USE conf_phys_m, ONLY : iflag_pbl      USE conf_gcm_m, ONLY: prt_level, lmt_pas
34      USE dimens_m, ONLY : iim, jjm      USE conf_phys_m, ONLY: iflag_pbl
35      USE dimphy, ONLY : klev, klon, zmasq      USE dimphy, ONLY: klev, klon, zmasq
36      USE dimsoil, ONLY : nsoilmx      USE dimsoil, ONLY: nsoilmx
     USE dynetat0_m, ONLY : day_ini  
     USE gath_cpl, ONLY : gath2cpl  
37      use hbtm_m, only: hbtm      use hbtm_m, only: hbtm
38      USE histsync_m, ONLY : histsync      USE indicesol, ONLY: epsfra, is_lic, is_oce, is_sic, is_ter, nbsrf
39      USE histbeg_totreg_m, ONLY : histbeg_totreg      USE interfoce_lim_m, ONLY: interfoce_lim
40      USE histend_m, ONLY : histend      use stdlevvar_m, only: stdlevvar
41      USE histdef_m, ONLY : histdef      USE suphec_m, ONLY: rd, rg, rkappa
42      use histwrite_m, only: histwrite      use time_phylmdz, only: itap
43      USE indicesol, ONLY : epsfra, is_lic, is_oce, is_sic, is_ter, nbsrf      use ustarhb_m, only: ustarhb
44      USE conf_gcm_m, ONLY : prt_level      use vdif_kcay_m, only: vdif_kcay
     USE suphec_m, ONLY : rd, rg, rkappa  
     USE temps, ONLY : annee_ref, itau_phy  
45      use yamada4_m, only: yamada4      use yamada4_m, only: yamada4
46    
47      ! Arguments:      REAL, INTENT(IN):: dtime ! interval du temps (secondes)
48    
49        REAL, INTENT(inout):: pctsrf(klon, nbsrf)
50        ! tableau des pourcentages de surface de chaque maille
51    
52        REAL, INTENT(IN):: t(klon, klev) ! temperature (K)
53        REAL, INTENT(IN):: q(klon, klev) ! vapeur d'eau (kg/kg)
54        REAL, INTENT(IN):: u(klon, klev), v(klon, klev) ! vitesse
55        INTEGER, INTENT(IN):: jour ! jour de l'annee en cours
56        REAL, intent(in):: rmu0(klon) ! cosinus de l'angle solaire zenithal    
57        REAL, INTENT(IN):: ts(klon, nbsrf) ! temperature du sol (en Kelvin)
58        REAL, INTENT(IN):: cdmmax, cdhmax ! seuils cdrm, cdrh
59        REAL, INTENT(IN):: ksta, ksta_ter
60        LOGICAL, INTENT(IN):: ok_kzmin
61    
62        REAL, INTENT(inout):: ftsoil(klon, nsoilmx, nbsrf)
63        ! soil temperature of surface fraction
64    
65        REAL, INTENT(inout):: qsol(klon)
66        ! column-density of water in soil, in kg m-2
67    
68        REAL, INTENT(IN):: paprs(klon, klev+1) ! pression a intercouche (Pa)
69        REAL, INTENT(IN):: pplay(klon, klev) ! pression au milieu de couche (Pa)
70        REAL, INTENT(inout):: snow(klon, nbsrf)
71        REAL qsurf(klon, nbsrf)
72        REAL evap(klon, nbsrf)
73        REAL, intent(inout):: falbe(klon, nbsrf)
74    
75        REAL fluxlat(klon, nbsrf)
76    
77        REAL, intent(in):: rain_fall(klon)
78        ! liquid water mass flux (kg/m2/s), positive down
79    
80        REAL, intent(in):: snow_f(klon)
81        ! solid water mass flux (kg/m2/s), positive down
82    
83        REAL, INTENT(IN):: solsw(klon, nbsrf), sollw(klon, nbsrf)
84        REAL, intent(in):: fder(klon)
85        REAL, INTENT(IN):: rlat(klon) ! latitude en degr\'es
86    
87        REAL, intent(inout):: rugos(klon, nbsrf) ! longueur de rugosit\'e (en m)
88    
89        real agesno(klon, nbsrf)
90        REAL, INTENT(IN):: rugoro(klon)
91    
     REAL, INTENT (IN) :: dtime ! interval du temps (secondes)  
     REAL date0  
     ! date0----input-R- jour initial  
     INTEGER, INTENT (IN) :: itap  
     ! itap-----input-I- numero du pas de temps  
     REAL, INTENT(IN):: t(klon, klev), q(klon, klev)  
     ! t--------input-R- temperature (K)  
     ! q--------input-R- vapeur d'eau (kg/kg)  
     REAL, INTENT (IN):: u(klon, klev), v(klon, klev)  
     ! u--------input-R- vitesse u  
     ! v--------input-R- vitesse v  
     REAL, INTENT (IN):: paprs(klon, klev+1)  
     ! paprs----input-R- pression a intercouche (Pa)  
     REAL, INTENT (IN):: pplay(klon, klev)  
     ! pplay----input-R- pression au milieu de couche (Pa)  
     REAL, INTENT (IN):: rlon(klon), rlat(klon)  
     ! rlat-----input-R- latitude en degree  
     REAL cufi(klon), cvfi(klon)  
     ! cufi-----input-R- resolution des mailles en x (m)  
     ! cvfi-----input-R- resolution des mailles en y (m)  
92      REAL d_t(klon, klev), d_q(klon, klev)      REAL d_t(klon, klev), d_q(klon, klev)
93      ! d_t------output-R- le changement pour "t"      ! d_t------output-R- le changement pour "t"
94      ! d_q------output-R- le changement pour "q"      ! d_q------output-R- le changement pour "q"
95      REAL d_u(klon, klev), d_v(klon, klev)  
96      ! d_u------output-R- le changement pour "u"      REAL, intent(out):: d_u(klon, klev), d_v(klon, klev)
97      ! d_v------output-R- le changement pour "v"      ! changement pour "u" et "v"
98      REAL flux_t(klon, klev, nbsrf), flux_q(klon, klev, nbsrf)  
99      ! flux_t---output-R- flux de chaleur sensible (CpT) J/m**2/s (W/m**2)      REAL, intent(out):: d_ts(klon, nbsrf) ! le changement pour "ts"
100      !                    (orientation positive vers le bas)  
101      ! flux_q---output-R- flux de vapeur d'eau (kg/m**2/s)      REAL, intent(out):: flux_t(klon, nbsrf)
102      REAL dflux_t(klon), dflux_q(klon)      ! flux de chaleur sensible (Cp T) (W/m2) (orientation positive vers
103        ! le bas) à la surface
104    
105        REAL, intent(out):: flux_q(klon, nbsrf)
106        ! flux de vapeur d'eau (kg/m2/s) à la surface
107    
108        REAL, intent(out):: flux_u(klon, nbsrf), flux_v(klon, nbsrf)
109        ! tension du vent à la surface, en Pa
110    
111        REAL, INTENT(out):: cdragh(klon), cdragm(klon)
112        real q2(klon, klev+1, nbsrf)
113    
114        REAL, INTENT(out):: dflux_t(klon), dflux_q(klon)
115      ! dflux_t derive du flux sensible      ! dflux_t derive du flux sensible
116      ! dflux_q derive du flux latent      ! dflux_q derive du flux latent
117      !IM "slab" ocean      ! IM "slab" ocean
118      REAL flux_o(klon), flux_g(klon)  
119      !IM "slab" ocean      REAL, intent(out):: ycoefh(klon, klev)
120      ! flux_g---output-R-  flux glace (pour OCEAN='slab  ')      REAL, intent(out):: zu1(klon)
121      ! flux_o---output-R-  flux ocean (pour OCEAN='slab  ')      REAL zv1(klon)
122      REAL y_flux_o(klon), y_flux_g(klon)      REAL t2m(klon, nbsrf), q2m(klon, nbsrf)
123      REAL tslab(klon), ytslab(klon)      REAL u10m(klon, nbsrf), v10m(klon, nbsrf)
124      ! tslab-in/output-R temperature du slab ocean (en Kelvin)  
125      ! uniqmnt pour slab      ! Ionela Musat cf. Anne Mathieu : planetary boundary layer, hbtm
126      REAL seaice(klon), y_seaice(klon)      ! (Comme les autres diagnostics on cumule dans physiq ce qui
127      ! seaice---output-R-  glace de mer (kg/m2) (pour OCEAN='slab  ')      ! permet de sortir les grandeurs par sous-surface)
128      REAL y_fqcalving(klon), y_ffonte(klon)      REAL pblh(klon, nbsrf) ! height of planetary boundary layer
129        REAL capcl(klon, nbsrf)
130        REAL oliqcl(klon, nbsrf)
131        REAL cteicl(klon, nbsrf)
132        REAL pblt(klon, nbsrf)
133        ! pblT------- T au nveau HCL
134        REAL therm(klon, nbsrf)
135        REAL trmb1(klon, nbsrf)
136        ! trmb1-------deep_cape
137        REAL trmb2(klon, nbsrf)
138        ! trmb2--------inhibition
139        REAL trmb3(klon, nbsrf)
140        ! trmb3-------Point Omega
141        REAL plcl(klon, nbsrf)
142      REAL fqcalving(klon, nbsrf), ffonte(klon, nbsrf)      REAL fqcalving(klon, nbsrf), ffonte(klon, nbsrf)
143      ! ffonte----Flux thermique utilise pour fondre la neige      ! ffonte----Flux thermique utilise pour fondre la neige
144      ! fqcalving-Flux d'eau "perdue" par la surface et necessaire pour limiter la      ! fqcalving-Flux d'eau "perdue" par la surface et necessaire pour limiter la
145      !           hauteur de neige, en kg/m2/s      !           hauteur de neige, en kg/m2/s
146      REAL run_off_lic_0(klon), y_run_off_lic_0(klon)      REAL run_off_lic_0(klon)
147    
148      REAL flux_u(klon, klev, nbsrf), flux_v(klon, klev, nbsrf)      ! Local:
     ! flux_u---output-R- tension du vent X: (kg m/s)/(m**2 s) ou Pascal  
     ! flux_v---output-R- tension du vent Y: (kg m/s)/(m**2 s) ou Pascal  
     REAL rugmer(klon), agesno(klon, nbsrf)  
     REAL, INTENT (IN) :: rugoro(klon)  
     REAL cdragh(klon), cdragm(klon)  
     ! jour de l'annee en cours                  
     INTEGER jour  
     REAL rmu0(klon) ! cosinus de l'angle solaire zenithal      
     ! taux CO2 atmosphere                      
     REAL co2_ppm  
     LOGICAL, INTENT (IN) :: debut  
     LOGICAL, INTENT (IN) :: lafin  
     LOGICAL ok_veget  
     CHARACTER (len=*), INTENT (IN) :: ocean  
     INTEGER npas, nexca  
   
     REAL pctsrf(klon, nbsrf)  
     REAL ts(klon, nbsrf)  
     ! ts-------input-R- temperature du sol (en Kelvin)  
     REAL d_ts(klon, nbsrf)  
     ! d_ts-----output-R- le changement pour "ts"  
     REAL snow(klon, nbsrf)  
     REAL qsurf(klon, nbsrf)  
     REAL evap(klon, nbsrf)  
     REAL albe(klon, nbsrf)  
     REAL alblw(klon, nbsrf)  
149    
150      REAL fluxlat(klon, nbsrf)      LOGICAL:: firstcal = .true.
151    
     REAL rain_f(klon), snow_f(klon)  
     REAL fder(klon)  
   
     REAL sollw(klon, nbsrf), solsw(klon, nbsrf), sollwdown(klon)  
     REAL rugos(klon, nbsrf)  
     ! rugos----input-R- longeur de rugosite (en m)  
152      ! la nouvelle repartition des surfaces sortie de l'interface      ! la nouvelle repartition des surfaces sortie de l'interface
153      REAL pctsrf_new(klon, nbsrf)      REAL, save:: pctsrf_new_oce(klon)
154        REAL, save:: pctsrf_new_sic(klon)
     REAL zcoefh(klon, klev)  
     REAL zu1(klon)  
     REAL zv1(klon)  
155    
156      !$$$ PB ajout pour soil      REAL y_fqcalving(klon), y_ffonte(klon)
157      LOGICAL, INTENT (IN) :: soil_model      real y_run_off_lic_0(klon)
     !IM ajout seuils cdrm, cdrh  
     REAL cdmmax, cdhmax  
158    
159      REAL ksta, ksta_ter      REAL rugmer(klon)
     LOGICAL ok_kzmin  
160    
     REAL ftsoil(klon, nsoilmx, nbsrf)  
161      REAL ytsoil(klon, nsoilmx)      REAL ytsoil(klon, nsoilmx)
     REAL qsol(klon)  
   
     EXTERNAL clvent, calbeta, cltrac  
162    
163      REAL yts(klon), yrugos(klon), ypct(klon), yz0_new(klon)      REAL yts(klon), yrugos(klon), ypct(klon), yz0_new(klon)
164      REAL yalb(klon)      REAL yalb(klon)
     REAL yalblw(klon)  
165      REAL yu1(klon), yv1(klon)      REAL yu1(klon), yv1(klon)
166      ! on rajoute en output yu1 et yv1 qui sont les vents dans      ! on rajoute en output yu1 et yv1 qui sont les vents dans
167      ! la premiere couche      ! la premiere couche
168      REAL ysnow(klon), yqsurf(klon), yagesno(klon), yqsol(klon)      REAL ysnow(klon), yqsurf(klon), yagesno(klon)
169      REAL yrain_f(klon), ysnow_f(klon)  
170      REAL ysollw(klon), ysolsw(klon), ysollwdown(klon)      real yqsol(klon)
171      REAL yfder(klon), ytaux(klon), ytauy(klon)      ! column-density of water in soil, in kg m-2
172    
173        REAL yrain_f(klon)
174        ! liquid water mass flux (kg/m2/s), positive down
175    
176        REAL ysnow_f(klon)
177        ! solid water mass flux (kg/m2/s), positive down
178    
179        REAL yfder(klon)
180      REAL yrugm(klon), yrads(klon), yrugoro(klon)      REAL yrugm(klon), yrads(klon), yrugoro(klon)
181    
182      REAL yfluxlat(klon)      REAL yfluxlat(klon)
# Line 182  contains Line 184  contains
184      REAL y_d_ts(klon)      REAL y_d_ts(klon)
185      REAL y_d_t(klon, klev), y_d_q(klon, klev)      REAL y_d_t(klon, klev), y_d_q(klon, klev)
186      REAL y_d_u(klon, klev), y_d_v(klon, klev)      REAL y_d_u(klon, klev), y_d_v(klon, klev)
187      REAL y_flux_t(klon, klev), y_flux_q(klon, klev)      REAL y_flux_t(klon), y_flux_q(klon)
188      REAL y_flux_u(klon, klev), y_flux_v(klon, klev)      REAL y_flux_u(klon), y_flux_v(klon)
189      REAL y_dflux_t(klon), y_dflux_q(klon)      REAL y_dflux_t(klon), y_dflux_q(klon)
190      REAL ycoefh(klon, klev), ycoefm(klon, klev)      REAL coefh(klon, klev), coefm(klon, klev)
191      REAL yu(klon, klev), yv(klon, klev)      REAL yu(klon, klev), yv(klon, klev)
192      REAL yt(klon, klev), yq(klon, klev)      REAL yt(klon, klev), yq(klon, klev)
193      REAL ypaprs(klon, klev+1), ypplay(klon, klev), ydelp(klon, klev)      REAL ypaprs(klon, klev+1), ypplay(klon, klev), ydelp(klon, klev)
194    
     LOGICAL ok_nonloc  
     PARAMETER (ok_nonloc=.FALSE.)  
195      REAL ycoefm0(klon, klev), ycoefh0(klon, klev)      REAL ycoefm0(klon, klev), ycoefh0(klon, klev)
196    
197      REAL yzlay(klon, klev), yzlev(klon, klev+1), yteta(klon, klev)      REAL yzlay(klon, klev), yzlev(klon, klev+1), yteta(klon, klev)
198      REAL ykmm(klon, klev+1), ykmn(klon, klev+1)      REAL ykmm(klon, klev+1), ykmn(klon, klev+1)
199      REAL ykmq(klon, klev+1)      REAL ykmq(klon, klev+1)
200      REAL yq2(klon, klev+1), q2(klon, klev+1, nbsrf)      REAL yq2(klon, klev+1)
201      REAL q2diag(klon, klev+1)      REAL q2diag(klon, klev+1)
202    
203      REAL u1lay(klon), v1lay(klon)      REAL u1lay(klon), v1lay(klon)
# Line 207  contains Line 207  contains
207      INTEGER ni(klon), knon, j      INTEGER ni(klon), knon, j
208    
209      REAL pctsrf_pot(klon, nbsrf)      REAL pctsrf_pot(klon, nbsrf)
210      ! "pourcentage potentiel" pour tenir compte des éventuelles      ! "pourcentage potentiel" pour tenir compte des \'eventuelles
211      ! apparitions ou disparitions de la glace de mer      ! apparitions ou disparitions de la glace de mer
212    
213      REAL zx_alf1, zx_alf2 !valeur ambiante par extrapola.      REAL zx_alf1, zx_alf2 ! valeur ambiante par extrapolation
   
     ! maf pour sorties IOISPL en cas de debugagage  
   
     CHARACTER (80) cldebug  
     SAVE cldebug  
     CHARACTER (8) cl_surf(nbsrf)  
     SAVE cl_surf  
     INTEGER nhoridbg, nidbg  
     SAVE nhoridbg, nidbg  
     INTEGER ndexbg(iim*(jjm+1))  
     REAL zx_lon(iim, jjm+1), zx_lat(iim, jjm+1), zjulian  
     REAL tabindx(klon)  
     REAL debugtab(iim, jjm+1)  
     LOGICAL first_appel  
     SAVE first_appel  
     DATA first_appel/ .TRUE./  
     LOGICAL :: debugindex = .FALSE.  
     INTEGER idayref  
     REAL t2m(klon, nbsrf), q2m(klon, nbsrf)  
     REAL u10m(klon, nbsrf), v10m(klon, nbsrf)  
214    
215      REAL yt2m(klon), yq2m(klon), yu10m(klon)      REAL yt2m(klon), yq2m(klon), yu10m(klon)
216      REAL yustar(klon)      REAL yustar(klon)
     ! -- LOOP  
     REAL yu10mx(klon)  
     REAL yu10my(klon)  
     REAL ywindsp(klon)  
     ! -- LOOP  
217    
218      REAL yt10m(klon), yq10m(klon)      REAL yt10m(klon), yq10m(klon)
     !IM cf. AM : pbl, hbtm (Comme les autres diagnostics on cumule ds  
     ! physiq ce qui permet de sortir les grdeurs par sous surface)  
     REAL pblh(klon, nbsrf)  
     ! pblh------- HCL  
     REAL plcl(klon, nbsrf)  
     REAL capcl(klon, nbsrf)  
     REAL oliqcl(klon, nbsrf)  
     REAL cteicl(klon, nbsrf)  
     REAL pblt(klon, nbsrf)  
     ! pblT------- T au nveau HCL  
     REAL therm(klon, nbsrf)  
     REAL trmb1(klon, nbsrf)  
     ! trmb1-------deep_cape  
     REAL trmb2(klon, nbsrf)  
     ! trmb2--------inhibition  
     REAL trmb3(klon, nbsrf)  
     ! trmb3-------Point Omega  
219      REAL ypblh(klon)      REAL ypblh(klon)
220      REAL ylcl(klon)      REAL ylcl(klon)
221      REAL ycapcl(klon)      REAL ycapcl(klon)
# Line 268  contains Line 226  contains
226      REAL ytrmb1(klon)      REAL ytrmb1(klon)
227      REAL ytrmb2(klon)      REAL ytrmb2(klon)
228      REAL ytrmb3(klon)      REAL ytrmb3(klon)
     REAL y_cd_h(klon), y_cd_m(klon)  
229      REAL uzon(klon), vmer(klon)      REAL uzon(klon), vmer(klon)
230      REAL tair1(klon), qair1(klon), tairsol(klon)      REAL tair1(klon), qair1(klon), tairsol(klon)
231      REAL psfce(klon), patm(klon)      REAL psfce(klon), patm(klon)
# Line 280  contains Line 237  contains
237      LOGICAL zxli      LOGICAL zxli
238      PARAMETER (zxli=.FALSE.)      PARAMETER (zxli=.FALSE.)
239    
     REAL zt, zqs, zdelta, zcor  
     REAL t_coup  
     PARAMETER (t_coup=273.15)  
   
     CHARACTER (len=20) :: modname = 'clmain'  
   
240      !------------------------------------------------------------      !------------------------------------------------------------
241    
242      ytherm = 0.      ytherm = 0.
243    
     IF (debugindex .AND. first_appel) THEN  
        first_appel = .FALSE.  
   
        ! initialisation sorties netcdf  
   
        idayref = day_ini  
        CALL ymds2ju(annee_ref, 1, idayref, 0., zjulian)  
        CALL gr_fi_ecrit(1, klon, iim, jjm+1, rlon, zx_lon)  
        DO i = 1, iim  
           zx_lon(i, 1) = rlon(i+1)  
           zx_lon(i, jjm+1) = rlon(i+1)  
        END DO  
        CALL gr_fi_ecrit(1, klon, iim, jjm+1, rlat, zx_lat)  
        cldebug = 'sous_index'  
        CALL histbeg_totreg(cldebug, zx_lon(:, 1), zx_lat(1, :), 1, &  
             iim, 1, jjm+1, itau_phy, zjulian, dtime, nhoridbg, nidbg)  
        ! no vertical axis  
        cl_surf(1) = 'ter'  
        cl_surf(2) = 'lic'  
        cl_surf(3) = 'oce'  
        cl_surf(4) = 'sic'  
        DO nsrf = 1, nbsrf  
           CALL histdef(nidbg, cl_surf(nsrf), cl_surf(nsrf), '-', iim, jjm+1, &  
                nhoridbg, 1, 1, 1, -99, 'inst', dtime, dtime)  
        END DO  
        CALL histend(nidbg)  
        CALL histsync(nidbg)  
     END IF  
   
244      DO k = 1, klev ! epaisseur de couche      DO k = 1, klev ! epaisseur de couche
245         DO i = 1, klon         DO i = 1, klon
246            delp(i, k) = paprs(i, k) - paprs(i, k+1)            delp(i, k) = paprs(i, k) - paprs(i, k+1)
# Line 343  contains Line 265  contains
265      yts = 0.      yts = 0.
266      ysnow = 0.      ysnow = 0.
267      yqsurf = 0.      yqsurf = 0.
     yalb = 0.  
     yalblw = 0.  
268      yrain_f = 0.      yrain_f = 0.
269      ysnow_f = 0.      ysnow_f = 0.
270      yfder = 0.      yfder = 0.
     ytaux = 0.  
     ytauy = 0.  
     ysolsw = 0.  
     ysollw = 0.  
     ysollwdown = 0.  
271      yrugos = 0.      yrugos = 0.
272      yu1 = 0.      yu1 = 0.
273      yv1 = 0.      yv1 = 0.
# Line 364  contains Line 279  contains
279      yv = 0.      yv = 0.
280      yt = 0.      yt = 0.
281      yq = 0.      yq = 0.
     pctsrf_new = 0.  
     y_flux_u = 0.  
     y_flux_v = 0.  
     !$$ PB  
282      y_dflux_t = 0.      y_dflux_t = 0.
283      y_dflux_q = 0.      y_dflux_q = 0.
284      ytsoil = 999999.      ytsoil = 999999.
285      yrugoro = 0.      yrugoro = 0.
     ! -- LOOP  
     yu10mx = 0.  
     yu10my = 0.  
     ywindsp = 0.  
     ! -- LOOP  
286      d_ts = 0.      d_ts = 0.
     !§§§ PB  
287      yfluxlat = 0.      yfluxlat = 0.
288      flux_t = 0.      flux_t = 0.
289      flux_q = 0.      flux_q = 0.
# Line 388  contains Line 293  contains
293      d_q = 0.      d_q = 0.
294      d_u = 0.      d_u = 0.
295      d_v = 0.      d_v = 0.
296      zcoefh = 0.      ycoefh = 0.
297    
298      ! Boucler sur toutes les sous-fractions du sol:      ! Initialisation des "pourcentages potentiels". On consid\`ere ici qu'on
299        ! peut avoir potentiellement de la glace sur tout le domaine oc\'eanique
300      ! Initialisation des "pourcentages potentiels". On considère ici qu'on      ! (\`a affiner)
     ! peut avoir potentiellement de la glace sur tout le domaine océanique  
     ! (à affiner)  
301    
302      pctsrf_pot = pctsrf      pctsrf_pot(:, is_ter) = pctsrf(:, is_ter)
303        pctsrf_pot(:, is_lic) = pctsrf(:, is_lic)
304      pctsrf_pot(:, is_oce) = 1. - zmasq      pctsrf_pot(:, is_oce) = 1. - zmasq
305      pctsrf_pot(:, is_sic) = 1. - zmasq      pctsrf_pot(:, is_sic) = 1. - zmasq
306    
307        ! Tester si c'est le moment de lire le fichier:
308        if (mod(itap - 1, lmt_pas) == 0) then
309           CALL interfoce_lim(jour, pctsrf_new_oce, pctsrf_new_sic)
310        endif
311    
312        ! Boucler sur toutes les sous-fractions du sol:
313    
314      loop_surface: DO nsrf = 1, nbsrf      loop_surface: DO nsrf = 1, nbsrf
315         ! Chercher les indices :         ! Chercher les indices :
316         ni = 0         ni = 0
317         knon = 0         knon = 0
318         DO i = 1, klon         DO i = 1, klon
319            ! Pour déterminer le domaine à traiter, on utilise les surfaces            ! Pour d\'eterminer le domaine \`a traiter, on utilise les surfaces
320            ! "potentielles"            ! "potentielles"
321            IF (pctsrf_pot(i, nsrf) > epsfra) THEN            IF (pctsrf_pot(i, nsrf) > epsfra) THEN
322               knon = knon + 1               knon = knon + 1
# Line 413  contains Line 324  contains
324            END IF            END IF
325         END DO         END DO
326    
327         ! variables pour avoir une sortie IOIPSL des INDEX         if_knon: IF (knon /= 0) then
        IF (debugindex) THEN  
           tabindx = 0.  
           DO i = 1, knon  
              tabindx(i) = real(i)  
           END DO  
           debugtab = 0.  
           ndexbg = 0  
           CALL gath2cpl(tabindx, debugtab, klon, knon, iim, jjm, ni)  
           CALL histwrite(nidbg, cl_surf(nsrf), itap, debugtab)  
        END IF  
   
        IF (knon == 0) CYCLE  
   
        DO j = 1, knon  
           i = ni(j)  
           ypct(j) = pctsrf(i, nsrf)  
           yts(j) = ts(i, nsrf)  
           ytslab(i) = tslab(i)  
           ysnow(j) = snow(i, nsrf)  
           yqsurf(j) = qsurf(i, nsrf)  
           yalb(j) = albe(i, nsrf)  
           yalblw(j) = alblw(i, nsrf)  
           yrain_f(j) = rain_f(i)  
           ysnow_f(j) = snow_f(i)  
           yagesno(j) = agesno(i, nsrf)  
           yfder(j) = fder(i)  
           ytaux(j) = flux_u(i, 1, nsrf)  
           ytauy(j) = flux_v(i, 1, nsrf)  
           ysolsw(j) = solsw(i, nsrf)  
           ysollw(j) = sollw(i, nsrf)  
           ysollwdown(j) = sollwdown(i)  
           yrugos(j) = rugos(i, nsrf)  
           yrugoro(j) = rugoro(i)  
           yu1(j) = u1lay(i)  
           yv1(j) = v1lay(i)  
           yrads(j) = ysolsw(j) + ysollw(j)  
           ypaprs(j, klev+1) = paprs(i, klev+1)  
           y_run_off_lic_0(j) = run_off_lic_0(i)  
           yu10mx(j) = u10m(i, nsrf)  
           yu10my(j) = v10m(i, nsrf)  
           ywindsp(j) = sqrt(yu10mx(j)*yu10mx(j)+yu10my(j)*yu10my(j))  
        END DO  
   
        ! IF bucket model for continent, copy soil water content  
        IF (nsrf == is_ter .AND. .NOT. ok_veget) THEN  
           DO j = 1, knon  
              i = ni(j)  
              yqsol(j) = qsol(i)  
           END DO  
        ELSE  
           yqsol = 0.  
        END IF  
        !$$$ PB ajour pour soil  
        DO k = 1, nsoilmx  
328            DO j = 1, knon            DO j = 1, knon
329               i = ni(j)               i = ni(j)
330               ytsoil(j, k) = ftsoil(i, k, nsrf)               ypct(j) = pctsrf(i, nsrf)
331            END DO               yts(j) = ts(i, nsrf)
332         END DO               ysnow(j) = snow(i, nsrf)
333         DO k = 1, klev               yqsurf(j) = qsurf(i, nsrf)
334            DO j = 1, knon               yalb(j) = falbe(i, nsrf)
335               i = ni(j)               yrain_f(j) = rain_fall(i)
336               ypaprs(j, k) = paprs(i, k)               ysnow_f(j) = snow_f(i)
337               ypplay(j, k) = pplay(i, k)               yagesno(j) = agesno(i, nsrf)
338               ydelp(j, k) = delp(i, k)               yfder(j) = fder(i)
339               yu(j, k) = u(i, k)               yrugos(j) = rugos(i, nsrf)
340               yv(j, k) = v(i, k)               yrugoro(j) = rugoro(i)
341               yt(j, k) = t(i, k)               yu1(j) = u1lay(i)
342               yq(j, k) = q(i, k)               yv1(j) = v1lay(i)
343            END DO               yrads(j) = solsw(i, nsrf) + sollw(i, nsrf)
344         END DO               ypaprs(j, klev+1) = paprs(i, klev+1)
345                 y_run_off_lic_0(j) = run_off_lic_0(i)
346              END DO
347    
348              ! For continent, copy soil water content
349              IF (nsrf == is_ter) THEN
350                 yqsol(:knon) = qsol(ni(:knon))
351              ELSE
352                 yqsol = 0.
353              END IF
354    
355         ! calculer Cdrag et les coefficients d'echange            DO k = 1, nsoilmx
356         CALL coefkz(nsrf, knon, ypaprs, ypplay, ksta, ksta_ter, yts,&               DO j = 1, knon
357              yrugos, yu, yv, yt, yq, yqsurf, ycoefm, ycoefh)                  i = ni(j)
358         IF (iflag_pbl == 1) THEN                  ytsoil(j, k) = ftsoil(i, k, nsrf)
           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))  
359               END DO               END DO
360            END DO            END DO
        END IF  
361    
        ! on seuille ycoefm et ycoefh  
        IF (nsrf == is_oce) THEN  
           DO j = 1, knon  
              ycoefm(j, 1) = min(ycoefm(j, 1), cdmmax)  
              ycoefh(j, 1) = min(ycoefh(j, 1), cdhmax)  
           END DO  
        END IF  
   
        IF (ok_kzmin) THEN  
           ! Calcul d'une diffusion minimale pour les conditions tres stables  
           CALL coefkzmin(knon, ypaprs, ypplay, yu, yv, yt, yq, ycoefm(:, 1), &  
                ycoefm0, ycoefh0)  
   
           DO k = 1, klev  
              DO i = 1, knon  
                 ycoefm(i, k) = max(ycoefm(i, k), ycoefm0(i, k))  
                 ycoefh(i, k) = max(ycoefh(i, k), ycoefh0(i, k))  
              END DO  
           END DO  
        END IF  
   
        IF (iflag_pbl >= 3) THEN  
           ! MELLOR ET YAMADA adapté à Mars, Richard Fournier et Frédéric Hourdin  
           yzlay(1:knon, 1) = rd*yt(1:knon, 1)/(0.5*(ypaprs(1:knon, &  
                1)+ypplay(1:knon, 1)))*(ypaprs(1:knon, 1)-ypplay(1:knon, 1))/rg  
           DO k = 2, klev  
              yzlay(1:knon, k) = yzlay(1:knon, k-1) &  
                   + rd * 0.5 * (yt(1:knon, k-1) + yt(1:knon, k)) &  
                   / ypaprs(1:knon, k) &  
                   * (ypplay(1:knon, k-1) - ypplay(1:knon, k)) / rg  
           END DO  
362            DO k = 1, klev            DO k = 1, klev
              yteta(1:knon, k) = yt(1:knon, k)*(ypaprs(1:knon, 1) &  
                   / ypplay(1:knon, k))**rkappa * (1.+0.61*yq(1:knon, k))  
           END DO  
           yzlev(1:knon, 1) = 0.  
           yzlev(1:knon, klev+1) = 2.*yzlay(1:knon, klev) - yzlay(1:knon, klev-1)  
           DO k = 2, klev  
              yzlev(1:knon, k) = 0.5*(yzlay(1:knon, k)+yzlay(1:knon, k-1))  
           END DO  
           DO k = 1, klev + 1  
363               DO j = 1, knon               DO j = 1, knon
364                  i = ni(j)                  i = ni(j)
365                  yq2(j, k) = q2(i, k, nsrf)                  ypaprs(j, k) = paprs(i, k)
366                    ypplay(j, k) = pplay(i, k)
367                    ydelp(j, k) = delp(i, k)
368                    yu(j, k) = u(i, k)
369                    yv(j, k) = v(i, k)
370                    yt(j, k) = t(i, k)
371                    yq(j, k) = q(i, k)
372               END DO               END DO
373            END DO            END DO
374    
375            y_cd_m(1:knon) = ycoefm(1:knon, 1)            ! calculer Cdrag et les coefficients d'echange
376            y_cd_h(1:knon) = ycoefh(1:knon, 1)            CALL coefkz(nsrf, knon, ypaprs, ypplay, ksta, ksta_ter, yts, yrugos, &
377            CALL ustarhb(knon, yu, yv, y_cd_m, yustar)                 yu, yv, yt, yq, yqsurf, coefm(:knon, :), coefh(:knon, :))
378              IF (iflag_pbl == 1) THEN
379            IF (prt_level>9) THEN               CALL coefkz2(nsrf, knon, ypaprs, ypplay, yt, ycoefm0, ycoefh0)
380               PRINT *, 'USTAR = ', yustar               coefm(:knon, :) = max(coefm(:knon, :), ycoefm0(:knon, :))
381                 coefh(:knon, :) = max(coefh(:knon, :), ycoefh0(:knon, :))
382            END IF            END IF
383    
384            ! iflag_pbl peut être utilisé comme longueur de mélange            ! on met un seuil pour coefm et coefh
385              IF (nsrf == is_oce) THEN
386                 coefm(:knon, 1) = min(coefm(:knon, 1), cdmmax)
387                 coefh(:knon, 1) = min(coefh(:knon, 1), cdhmax)
388              END IF
389    
390            IF (iflag_pbl >= 11) THEN            IF (ok_kzmin) THEN
391               CALL vdif_kcay(knon, dtime, rg, rd, ypaprs, yt, yzlev, yzlay, &               ! Calcul d'une diffusion minimale pour les conditions tres stables
392                    yu, yv, yteta, y_cd_m, yq2, q2diag, ykmm, ykmn, yustar, &               CALL coefkzmin(knon, ypaprs, ypplay, yu, yv, yt, yq, &
393                    iflag_pbl)                    coefm(:knon, 1), ycoefm0, ycoefh0)
394            ELSE               coefm(:knon, :) = max(coefm(:knon, :), ycoefm0(:knon, :))
395               CALL yamada4(knon, dtime, rg, yzlev, yzlay, yu, yv, yteta, &               coefh(:knon, :) = max(coefh(:knon, :), ycoefh0(:knon, :))
                   y_cd_m, yq2, ykmm, ykmn, ykmq, yustar, iflag_pbl)  
396            END IF            END IF
397    
398            ycoefm(1:knon, 1) = y_cd_m(1:knon)            IF (iflag_pbl >= 3) THEN
399            ycoefh(1:knon, 1) = y_cd_h(1:knon)               ! Mellor et Yamada adapt\'e \`a Mars, Richard Fournier et
400            ycoefm(1:knon, 2:klev) = ykmm(1:knon, 2:klev)               ! Fr\'ed\'eric Hourdin
401            ycoefh(1:knon, 2:klev) = ykmn(1:knon, 2:klev)               yzlay(:knon, 1) = rd * yt(:knon, 1) / (0.5 * (ypaprs(:knon, 1) &
402         END IF                    + ypplay(:knon, 1))) &
403                      * (ypaprs(:knon, 1) - ypplay(:knon, 1)) / rg
404         ! calculer la diffusion des vitesses "u" et "v"               DO k = 2, klev
405         CALL clvent(knon, dtime, yu1, yv1, ycoefm, yt, yu, ypaprs, ypplay, &                  yzlay(1:knon, k) = yzlay(1:knon, k-1) &
406              ydelp, y_d_u, y_flux_u)                       + rd * 0.5 * (yt(1:knon, k-1) + yt(1:knon, k)) &
407         CALL clvent(knon, dtime, yu1, yv1, ycoefm, yt, yv, ypaprs, ypplay, &                       / ypaprs(1:knon, k) &
408              ydelp, y_d_v, y_flux_v)                       * (ypplay(1:knon, k-1) - ypplay(1:knon, k)) / rg
409                 END DO
410         ! pour le couplage               DO k = 1, klev
411         ytaux = y_flux_u(:, 1)                  yteta(1:knon, k) = yt(1:knon, k)*(ypaprs(1:knon, 1) &
412         ytauy = y_flux_v(:, 1)                       / ypplay(1:knon, k))**rkappa * (1.+0.61*yq(1:knon, k))
413                 END DO
414         ! calculer la diffusion de "q" et de "h"               yzlev(1:knon, 1) = 0.
415         CALL clqh(dtime, itap, date0, jour, debut, lafin, rlon, rlat,&               yzlev(:knon, klev+1) = 2. * yzlay(:knon, klev) &
416              cufi, cvfi, knon, nsrf, ni, pctsrf, soil_model, ytsoil,&                    - yzlay(:knon, klev - 1)
417              yqsol, ok_veget, ocean, npas, nexca, rmu0, co2_ppm, yrugos,&               DO k = 2, klev
418              yrugoro, yu1, yv1, ycoefh, yt, yq, yts, ypaprs, ypplay,&                  yzlev(1:knon, k) = 0.5*(yzlay(1:knon, k)+yzlay(1:knon, k-1))
419              ydelp, yrads, yalb, yalblw, ysnow, yqsurf, yrain_f, ysnow_f, &               END DO
420              yfder, ytaux, ytauy, ywindsp, ysollw, ysollwdown, ysolsw,&               DO k = 1, klev + 1
421              yfluxlat, pctsrf_new, yagesno, y_d_t, y_d_q, y_d_ts,&                  DO j = 1, knon
422              yz0_new, y_flux_t, y_flux_q, y_dflux_t, y_dflux_q,&                     i = ni(j)
423              y_fqcalving, y_ffonte, y_run_off_lic_0, y_flux_o, y_flux_g,&                     yq2(j, k) = q2(i, k, nsrf)
424              ytslab, y_seaice)                  END DO
425                 END DO
        ! calculer la longueur de rugosite sur ocean  
        yrugm = 0.  
        IF (nsrf == is_oce) THEN  
           DO j = 1, knon  
              yrugm(j) = 0.018*ycoefm(j, 1)*(yu1(j)**2+yv1(j)**2)/rg + &  
                   0.11*14E-6/sqrt(ycoefm(j, 1)*(yu1(j)**2+yv1(j)**2))  
              yrugm(j) = max(1.5E-05, yrugm(j))  
           END DO  
        END IF  
        DO j = 1, knon  
           y_dflux_t(j) = y_dflux_t(j)*ypct(j)  
           y_dflux_q(j) = y_dflux_q(j)*ypct(j)  
           yu1(j) = yu1(j)*ypct(j)  
           yv1(j) = yv1(j)*ypct(j)  
        END DO  
426    
427         DO k = 1, klev               CALL ustarhb(knon, yu, yv, coefm(:knon, 1), yustar)
428            DO j = 1, knon               IF (prt_level > 9) PRINT *, 'USTAR = ', yustar
429               i = ni(j)  
430               ycoefh(j, k) = ycoefh(j, k)*ypct(j)               ! iflag_pbl peut \^etre utilis\'e comme longueur de m\'elange
431               ycoefm(j, k) = ycoefm(j, k)*ypct(j)  
432               y_d_t(j, k) = y_d_t(j, k)*ypct(j)               IF (iflag_pbl >= 11) THEN
433               y_d_q(j, k) = y_d_q(j, k)*ypct(j)                  CALL vdif_kcay(knon, dtime, rg, ypaprs, yzlev, yzlay, yu, yv, &
434               flux_t(i, k, nsrf) = y_flux_t(j, k)                       yteta, coefm(:knon, 1), yq2, q2diag, ykmm, ykmn, yustar, &
435               flux_q(i, k, nsrf) = y_flux_q(j, k)                       iflag_pbl)
436               flux_u(i, k, nsrf) = y_flux_u(j, k)               ELSE
437               flux_v(i, k, nsrf) = y_flux_v(j, k)                  CALL yamada4(knon, dtime, rg, yzlev, yzlay, yu, yv, yteta, &
438               y_d_u(j, k) = y_d_u(j, k)*ypct(j)                       coefm(:knon, 1), yq2, ykmm, ykmn, ykmq, yustar, iflag_pbl)
439               y_d_v(j, k) = y_d_v(j, k)*ypct(j)               END IF
440            END DO  
441         END DO               coefm(:knon, 2:) = ykmm(:knon, 2:klev)
442                 coefh(:knon, 2:) = ykmn(:knon, 2:klev)
443              END IF
444    
445         evap(:, nsrf) = -flux_q(:, 1, nsrf)            ! calculer la diffusion des vitesses "u" et "v"
446              CALL clvent(knon, dtime, yu1, yv1, coefm(:knon, :), yt, yu, ypaprs, &
447                   ypplay, ydelp, y_d_u, y_flux_u(:knon))
448              CALL clvent(knon, dtime, yu1, yv1, coefm(:knon, :), yt, yv, ypaprs, &
449                   ypplay, ydelp, y_d_v, y_flux_v(:knon))
450    
451              ! calculer la diffusion de "q" et de "h"
452              CALL clqh(dtime, jour, firstcal, rlat, nsrf, ni(:knon), ytsoil, &
453                   yqsol, rmu0, yrugos, yrugoro, yu1, yv1, coefh(:knon, :), yt, &
454                   yq, yts, ypaprs, ypplay, ydelp, yrads, yalb(:knon), ysnow, &
455                   yqsurf, yrain_f, ysnow_f, yfder, yfluxlat, pctsrf_new_sic, &
456                   yagesno(:knon), y_d_t, y_d_q, y_d_ts(:knon), yz0_new, &
457                   y_flux_t(:knon), y_flux_q(:knon), y_dflux_t, y_dflux_q, &
458                   y_fqcalving, y_ffonte, y_run_off_lic_0)
459    
460         albe(:, nsrf) = 0.            ! calculer la longueur de rugosite sur ocean
461         alblw(:, nsrf) = 0.            yrugm = 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)  
462            IF (nsrf == is_oce) THEN            IF (nsrf == is_oce) THEN
463               rugmer(i) = yrugm(j)               DO j = 1, knon
464               rugos(i, nsrf) = yrugm(j)                  yrugm(j) = 0.018*coefm(j, 1)*(yu1(j)**2+yv1(j)**2)/rg + &
465                         0.11*14E-6/sqrt(coefm(j, 1)*(yu1(j)**2+yv1(j)**2))
466                    yrugm(j) = max(1.5E-05, yrugm(j))
467                 END DO
468            END IF            END IF
           agesno(i, nsrf) = yagesno(j)  
           fqcalving(i, nsrf) = y_fqcalving(j)  
           ffonte(i, nsrf) = y_ffonte(j)  
           cdragh(i) = cdragh(i) + ycoefh(j, 1)  
           cdragm(i) = cdragm(i) + ycoefm(j, 1)  
           dflux_t(i) = dflux_t(i) + y_dflux_t(j)  
           dflux_q(i) = dflux_q(i) + y_dflux_q(j)  
           zu1(i) = zu1(i) + yu1(j)  
           zv1(i) = zv1(i) + yv1(j)  
        END DO  
        IF (nsrf == is_ter) THEN  
469            DO j = 1, knon            DO j = 1, knon
470               i = ni(j)               y_dflux_t(j) = y_dflux_t(j)*ypct(j)
471               qsol(i) = yqsol(j)               y_dflux_q(j) = y_dflux_q(j)*ypct(j)
472                 yu1(j) = yu1(j)*ypct(j)
473                 yv1(j) = yv1(j)*ypct(j)
474            END DO            END DO
475         END IF  
476         IF (nsrf == is_lic) THEN            DO k = 1, klev
477                 DO j = 1, knon
478                    i = ni(j)
479                    coefh(j, k) = coefh(j, k)*ypct(j)
480                    coefm(j, k) = coefm(j, k)*ypct(j)
481                    y_d_t(j, k) = y_d_t(j, k)*ypct(j)
482                    y_d_q(j, k) = y_d_q(j, k)*ypct(j)
483                    y_d_u(j, k) = y_d_u(j, k)*ypct(j)
484                    y_d_v(j, k) = y_d_v(j, k)*ypct(j)
485                 END DO
486              END DO
487    
488            DO j = 1, knon            DO j = 1, knon
489               i = ni(j)               i = ni(j)
490               run_off_lic_0(i) = y_run_off_lic_0(j)               flux_t(i, nsrf) = y_flux_t(j)
491                 flux_q(i, nsrf) = y_flux_q(j)
492                 flux_u(i, nsrf) = y_flux_u(j)
493                 flux_v(i, nsrf) = y_flux_v(j)
494            END DO            END DO
495         END IF  
496         !$$$ PB ajout pour soil            evap(:, nsrf) = -flux_q(:, nsrf)
497         ftsoil(:, :, nsrf) = 0.  
498         DO k = 1, nsoilmx            falbe(:, nsrf) = 0.
499              snow(:, nsrf) = 0.
500              qsurf(:, nsrf) = 0.
501              rugos(:, nsrf) = 0.
502              fluxlat(:, nsrf) = 0.
503            DO j = 1, knon            DO j = 1, knon
504               i = ni(j)               i = ni(j)
505               ftsoil(i, k, nsrf) = ytsoil(j, k)               d_ts(i, nsrf) = y_d_ts(j)
506                 falbe(i, nsrf) = yalb(j)
507                 snow(i, nsrf) = ysnow(j)
508                 qsurf(i, nsrf) = yqsurf(j)
509                 rugos(i, nsrf) = yz0_new(j)
510                 fluxlat(i, nsrf) = yfluxlat(j)
511                 IF (nsrf == is_oce) THEN
512                    rugmer(i) = yrugm(j)
513                    rugos(i, nsrf) = yrugm(j)
514                 END IF
515                 agesno(i, nsrf) = yagesno(j)
516                 fqcalving(i, nsrf) = y_fqcalving(j)
517                 ffonte(i, nsrf) = y_ffonte(j)
518                 cdragh(i) = cdragh(i) + coefh(j, 1)
519                 cdragm(i) = cdragm(i) + coefm(j, 1)
520                 dflux_t(i) = dflux_t(i) + y_dflux_t(j)
521                 dflux_q(i) = dflux_q(i) + y_dflux_q(j)
522                 zu1(i) = zu1(i) + yu1(j)
523                 zv1(i) = zv1(i) + yv1(j)
524              END DO
525              IF (nsrf == is_ter) THEN
526                 qsol(ni(:knon)) = yqsol(:knon)
527              else IF (nsrf == is_lic) THEN
528                 DO j = 1, knon
529                    i = ni(j)
530                    run_off_lic_0(i) = y_run_off_lic_0(j)
531                 END DO
532              END IF
533    
534              ftsoil(:, :, nsrf) = 0.
535              DO k = 1, nsoilmx
536                 DO j = 1, knon
537                    i = ni(j)
538                    ftsoil(i, k, nsrf) = ytsoil(j, k)
539                 END DO
540            END DO            END DO
        END DO  
541    
542         DO j = 1, knon            DO j = 1, knon
543            i = ni(j)               i = ni(j)
544            DO k = 1, klev               DO k = 1, klev
545               d_t(i, k) = d_t(i, k) + y_d_t(j, k)                  d_t(i, k) = d_t(i, k) + y_d_t(j, k)
546               d_q(i, k) = d_q(i, k) + y_d_q(j, k)                  d_q(i, k) = d_q(i, k) + y_d_q(j, k)
547               d_u(i, k) = d_u(i, k) + y_d_u(j, k)                  d_u(i, k) = d_u(i, k) + y_d_u(j, k)
548               d_v(i, k) = d_v(i, k) + y_d_v(j, k)                  d_v(i, k) = d_v(i, k) + y_d_v(j, k)
549               zcoefh(i, k) = zcoefh(i, k) + ycoefh(j, k)                  ycoefh(i, k) = ycoefh(i, k) + coefh(j, k)
550                 END DO
551            END DO            END DO
        END DO  
552    
553         !cc diagnostic t, q a 2m et u, v a 10m            ! diagnostic t, q a 2m et u, v a 10m
554    
555         DO j = 1, knon            DO j = 1, knon
556            i = ni(j)               i = ni(j)
557            uzon(j) = yu(j, 1) + y_d_u(j, 1)               uzon(j) = yu(j, 1) + y_d_u(j, 1)
558            vmer(j) = yv(j, 1) + y_d_v(j, 1)               vmer(j) = yv(j, 1) + y_d_v(j, 1)
559            tair1(j) = yt(j, 1) + y_d_t(j, 1)               tair1(j) = yt(j, 1) + y_d_t(j, 1)
560            qair1(j) = yq(j, 1) + y_d_q(j, 1)               qair1(j) = yq(j, 1) + y_d_q(j, 1)
561            zgeo1(j) = rd*tair1(j)/(0.5*(ypaprs(j, 1)+ypplay(j, &               zgeo1(j) = rd*tair1(j)/(0.5*(ypaprs(j, 1)+ypplay(j, &
562                 1)))*(ypaprs(j, 1)-ypplay(j, 1))                    1)))*(ypaprs(j, 1)-ypplay(j, 1))
563            tairsol(j) = yts(j) + y_d_ts(j)               tairsol(j) = yts(j) + y_d_ts(j)
564            rugo1(j) = yrugos(j)               rugo1(j) = yrugos(j)
565            IF (nsrf == is_oce) THEN               IF (nsrf == is_oce) THEN
566               rugo1(j) = rugos(i, nsrf)                  rugo1(j) = rugos(i, nsrf)
567            END IF               END IF
568            psfce(j) = ypaprs(j, 1)               psfce(j) = ypaprs(j, 1)
569            patm(j) = ypplay(j, 1)               patm(j) = ypplay(j, 1)
570    
571            qairsol(j) = yqsurf(j)               qairsol(j) = yqsurf(j)
572         END DO            END DO
573    
574         CALL stdlevvar(klon, knon, nsrf, zxli, uzon, vmer, tair1, qair1, zgeo1, &            CALL stdlevvar(klon, knon, nsrf, zxli, uzon, vmer, tair1, qair1, &
575              tairsol, qairsol, rugo1, psfce, patm, yt2m, yq2m, yt10m, yq10m, &                 zgeo1, tairsol, qairsol, rugo1, psfce, patm, yt2m, yq2m, &
576              yu10m, yustar)                 yt10m, yq10m, yu10m, yustar)
   
        DO j = 1, knon  
           i = ni(j)  
           t2m(i, nsrf) = yt2m(j)  
           q2m(i, nsrf) = yq2m(j)  
   
           ! u10m, v10m : composantes du vent a 10m sans spirale de Ekman  
           u10m(i, nsrf) = (yu10m(j)*uzon(j))/sqrt(uzon(j)**2+vmer(j)**2)  
           v10m(i, nsrf) = (yu10m(j)*vmer(j))/sqrt(uzon(j)**2+vmer(j)**2)  
577    
578         END DO            DO j = 1, knon
579                 i = ni(j)
580                 t2m(i, nsrf) = yt2m(j)
581                 q2m(i, nsrf) = yq2m(j)
582    
583         DO i = 1, knon               ! u10m, v10m : composantes du vent a 10m sans spirale de Ekman
584            y_cd_h(i) = ycoefh(i, 1)               u10m(i, nsrf) = (yu10m(j)*uzon(j))/sqrt(uzon(j)**2+vmer(j)**2)
585            y_cd_m(i) = ycoefm(i, 1)               v10m(i, nsrf) = (yu10m(j)*vmer(j))/sqrt(uzon(j)**2+vmer(j)**2)
        END DO  
        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)  
   
        DO j = 1, knon  
           i = ni(j)  
           pblh(i, nsrf) = ypblh(j)  
           plcl(i, nsrf) = ylcl(j)  
           capcl(i, nsrf) = ycapcl(j)  
           oliqcl(i, nsrf) = yoliqcl(j)  
           cteicl(i, nsrf) = ycteicl(j)  
           pblt(i, nsrf) = ypblt(j)  
           therm(i, nsrf) = ytherm(j)  
           trmb1(i, nsrf) = ytrmb1(j)  
           trmb2(i, nsrf) = ytrmb2(j)  
           trmb3(i, nsrf) = ytrmb3(j)  
        END DO  
586    
        DO j = 1, knon  
           DO k = 1, klev + 1  
              i = ni(j)  
              q2(i, k, nsrf) = yq2(j, k)  
587            END DO            END DO
588         END DO  
589         !IM "slab" ocean            CALL hbtm(ypaprs, ypplay, yt2m, yq2m, yustar, y_flux_t(:knon), &
590         IF (nsrf == is_oce) THEN                 y_flux_q(:knon), yu, yv, yt, yq, ypblh(:knon), ycapcl, &
591                   yoliqcl, ycteicl, ypblt, ytherm, ytrmb1, ytrmb2, ytrmb3, ylcl)
592    
593            DO j = 1, knon            DO j = 1, knon
              ! on projette sur la grille globale  
594               i = ni(j)               i = ni(j)
595               IF (pctsrf_new(i, is_oce)>epsfra) THEN               pblh(i, nsrf) = ypblh(j)
596                  flux_o(i) = y_flux_o(j)               plcl(i, nsrf) = ylcl(j)
597               ELSE               capcl(i, nsrf) = ycapcl(j)
598                  flux_o(i) = 0.               oliqcl(i, nsrf) = yoliqcl(j)
599               END IF               cteicl(i, nsrf) = ycteicl(j)
600                 pblt(i, nsrf) = ypblt(j)
601                 therm(i, nsrf) = ytherm(j)
602                 trmb1(i, nsrf) = ytrmb1(j)
603                 trmb2(i, nsrf) = ytrmb2(j)
604                 trmb3(i, nsrf) = ytrmb3(j)
605            END DO            END DO
        END IF  
606    
        IF (nsrf == is_sic) THEN  
607            DO j = 1, knon            DO j = 1, knon
608               i = ni(j)               DO k = 1, klev + 1
609               ! On pondère lorsque l'on fait le bilan au sol :                  i = ni(j)
610               IF (pctsrf_new(i, is_sic)>epsfra) THEN                  q2(i, k, nsrf) = yq2(j, k)
611                  flux_g(i) = y_flux_g(j)               END DO
              ELSE  
                 flux_g(i) = 0.  
              END IF  
612            END DO            END DO
613           end IF if_knon
        END IF  
        IF (ocean == 'slab  ') THEN  
           IF (nsrf == is_oce) THEN  
              tslab(1:klon) = ytslab(1:klon)  
              seaice(1:klon) = y_seaice(1:klon)  
           END IF  
        END IF  
614      END DO loop_surface      END DO loop_surface
615    
616      ! On utilise les nouvelles surfaces      ! On utilise les nouvelles surfaces
   
617      rugos(:, is_oce) = rugmer      rugos(:, is_oce) = rugmer
618      pctsrf = pctsrf_new      pctsrf(:, is_oce) = pctsrf_new_oce
619        pctsrf(:, is_sic) = pctsrf_new_sic
620    
621        firstcal = .false.
622    
623    END SUBROUTINE clmain    END SUBROUTINE clmain
624    

Legend:
Removed from v.61  
changed lines
  Added in v.206

  ViewVC Help
Powered by ViewVC 1.1.21