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

Diff of /trunk/phylmd/pbl_surface.f

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

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

Legend:
Removed from v.57  
changed lines
  Added in v.178

  ViewVC Help
Powered by ViewVC 1.1.21