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

Diff of /trunk/phylmd/Interface_surf/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 186 by guez, Mon Mar 21 15:36: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        ! Ionela Musat cf. Anne Mathieu : pbl, hbtm (Comme les autres
128        ! diagnostics on cumule dans physiq ce qui permet de sortir les
129        ! grandeurs par sous-surface)
130        REAL pblh(klon, nbsrf)
131        ! pblh------- HCL
132        REAL capcl(klon, nbsrf)
133        REAL oliqcl(klon, nbsrf)
134        REAL cteicl(klon, nbsrf)
135        REAL pblt(klon, nbsrf)
136        ! pblT------- T au nveau HCL
137        REAL therm(klon, nbsrf)
138        REAL trmb1(klon, nbsrf)
139        ! trmb1-------deep_cape
140        REAL trmb2(klon, nbsrf)
141        ! trmb2--------inhibition
142        REAL trmb3(klon, nbsrf)
143        ! trmb3-------Point Omega
144        REAL plcl(klon, nbsrf)
145        REAL fqcalving(klon, nbsrf), ffonte(klon, nbsrf)
146        ! ffonte----Flux thermique utilise pour fondre la neige
147        ! fqcalving-Flux d'eau "perdue" par la surface et necessaire pour limiter la
148        !           hauteur de neige, en kg/m2/s
149        REAL run_off_lic_0(klon)
150    
151      !$$$ PB ajout pour soil      ! Local:
     LOGICAL, INTENT (IN) :: soil_model  
     !IM ajout seuils cdrm, cdrh  
     REAL cdmmax, cdhmax  
152    
153      REAL ksta, ksta_ter      REAL y_fqcalving(klon), y_ffonte(klon)
154      LOGICAL ok_kzmin      real y_run_off_lic_0(klon)
155    
156      REAL ftsoil(klon, nsoilmx, nbsrf)      REAL rugmer(klon)
     REAL ytsoil(klon, nsoilmx)  
     REAL qsol(klon)  
157    
158      EXTERNAL clvent, calbeta, cltrac      REAL ytsoil(klon, nsoilmx)
159    
160      REAL yts(klon), yrugos(klon), ypct(klon), yz0_new(klon)      REAL yts(klon), yrugos(klon), ypct(klon), yz0_new(klon)
161      REAL yalb(klon)      REAL yalb(klon)
     REAL yalblw(klon)  
162      REAL yu1(klon), yv1(klon)      REAL yu1(klon), yv1(klon)
163      ! on rajoute en output yu1 et yv1 qui sont les vents dans      ! on rajoute en output yu1 et yv1 qui sont les vents dans
164      ! la premiere couche      ! la premiere couche
165      REAL ysnow(klon), yqsurf(klon), yagesno(klon), yqsol(klon)      REAL ysnow(klon), yqsurf(klon), yagesno(klon)
166      REAL yrain_f(klon), ysnow_f(klon)  
167      REAL ysollw(klon), ysolsw(klon), ysollwdown(klon)      real yqsol(klon)
168      REAL yfder(klon), ytaux(klon), ytauy(klon)      ! column-density of water in soil, in kg m-2
169    
170        REAL yrain_f(klon)
171        ! liquid water mass flux (kg/m2/s), positive down
172    
173        REAL ysnow_f(klon)
174        ! solid water mass flux (kg/m2/s), positive down
175    
176        REAL yfder(klon)
177      REAL yrugm(klon), yrads(klon), yrugoro(klon)      REAL yrugm(klon), yrads(klon), yrugoro(klon)
178    
179      REAL yfluxlat(klon)      REAL yfluxlat(klon)
# Line 182  contains Line 184  contains
184      REAL y_flux_t(klon, klev), y_flux_q(klon, klev)      REAL y_flux_t(klon, klev), y_flux_q(klon, klev)
185      REAL y_flux_u(klon, klev), y_flux_v(klon, klev)      REAL y_flux_u(klon, klev), y_flux_v(klon, klev)
186      REAL y_dflux_t(klon), y_dflux_q(klon)      REAL y_dflux_t(klon), y_dflux_q(klon)
187      REAL ycoefh(klon, klev), ycoefm(klon, klev)      REAL coefh(klon, klev), coefm(klon, klev)
188      REAL yu(klon, klev), yv(klon, klev)      REAL yu(klon, klev), yv(klon, klev)
189      REAL yt(klon, klev), yq(klon, klev)      REAL yt(klon, klev), yq(klon, klev)
190      REAL ypaprs(klon, klev+1), ypplay(klon, klev), ydelp(klon, klev)      REAL ypaprs(klon, klev+1), ypplay(klon, klev), ydelp(klon, klev)
191    
     LOGICAL ok_nonloc  
     PARAMETER (ok_nonloc=.FALSE.)  
192      REAL ycoefm0(klon, klev), ycoefh0(klon, klev)      REAL ycoefm0(klon, klev), ycoefh0(klon, klev)
193    
194      REAL yzlay(klon, klev), yzlev(klon, klev+1), yteta(klon, klev)      REAL yzlay(klon, klev), yzlev(klon, klev+1), yteta(klon, klev)
195      REAL ykmm(klon, klev+1), ykmn(klon, klev+1)      REAL ykmm(klon, klev+1), ykmn(klon, klev+1)
196      REAL ykmq(klon, klev+1)      REAL ykmq(klon, klev+1)
197      REAL yq2(klon, klev+1), q2(klon, klev+1, nbsrf)      REAL yq2(klon, klev+1)
198      REAL q2diag(klon, klev+1)      REAL q2diag(klon, klev+1)
199    
200      REAL u1lay(klon), v1lay(klon)      REAL u1lay(klon), v1lay(klon)
# Line 204  contains Line 204  contains
204      INTEGER ni(klon), knon, j      INTEGER ni(klon), knon, j
205    
206      REAL pctsrf_pot(klon, nbsrf)      REAL pctsrf_pot(klon, nbsrf)
207      ! "pourcentage potentiel" pour tenir compte des éventuelles      ! "pourcentage potentiel" pour tenir compte des \'eventuelles
208      ! apparitions ou disparitions de la glace de mer      ! apparitions ou disparitions de la glace de mer
209    
210      REAL zx_alf1, zx_alf2 !valeur ambiante par extrapola.      REAL zx_alf1, zx_alf2 !valeur ambiante par extrapola.
211    
     ! 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)  
   
212      REAL yt2m(klon), yq2m(klon), yu10m(klon)      REAL yt2m(klon), yq2m(klon), yu10m(klon)
213      REAL yustar(klon)      REAL yustar(klon)
     ! -- LOOP  
     REAL yu10mx(klon)  
     REAL yu10my(klon)  
     REAL ywindsp(klon)  
     ! -- LOOP  
214    
215      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  
216      REAL ypblh(klon)      REAL ypblh(klon)
217      REAL ylcl(klon)      REAL ylcl(klon)
218      REAL ycapcl(klon)      REAL ycapcl(klon)
# Line 265  contains Line 223  contains
223      REAL ytrmb1(klon)      REAL ytrmb1(klon)
224      REAL ytrmb2(klon)      REAL ytrmb2(klon)
225      REAL ytrmb3(klon)      REAL ytrmb3(klon)
     REAL y_cd_h(klon), y_cd_m(klon)  
226      REAL uzon(klon), vmer(klon)      REAL uzon(klon), vmer(klon)
227      REAL tair1(klon), qair1(klon), tairsol(klon)      REAL tair1(klon), qair1(klon), tairsol(klon)
228      REAL psfce(klon), patm(klon)      REAL psfce(klon), patm(klon)
# Line 277  contains Line 234  contains
234      LOGICAL zxli      LOGICAL zxli
235      PARAMETER (zxli=.FALSE.)      PARAMETER (zxli=.FALSE.)
236    
     REAL zt, zqs, zdelta, zcor  
     REAL t_coup  
     PARAMETER (t_coup=273.15)  
   
     CHARACTER (len=20) :: modname = 'clmain'  
   
237      !------------------------------------------------------------      !------------------------------------------------------------
238    
239      ytherm = 0.      ytherm = 0.
240    
     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  
   
241      DO k = 1, klev ! epaisseur de couche      DO k = 1, klev ! epaisseur de couche
242         DO i = 1, klon         DO i = 1, klon
243            delp(i, k) = paprs(i, k) - paprs(i, k+1)            delp(i, k) = paprs(i, k) - paprs(i, k+1)
# Line 340  contains Line 262  contains
262      yts = 0.      yts = 0.
263      ysnow = 0.      ysnow = 0.
264      yqsurf = 0.      yqsurf = 0.
     yalb = 0.  
     yalblw = 0.  
265      yrain_f = 0.      yrain_f = 0.
266      ysnow_f = 0.      ysnow_f = 0.
267      yfder = 0.      yfder = 0.
     ytaux = 0.  
     ytauy = 0.  
     ysolsw = 0.  
     ysollw = 0.  
     ysollwdown = 0.  
268      yrugos = 0.      yrugos = 0.
269      yu1 = 0.      yu1 = 0.
270      yv1 = 0.      yv1 = 0.
# Line 364  contains Line 279  contains
279      pctsrf_new = 0.      pctsrf_new = 0.
280      y_flux_u = 0.      y_flux_u = 0.
281      y_flux_v = 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 385  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.
   
     ! Boucler sur toutes les sous-fractions du sol:  
297    
298      ! Initialisation des "pourcentages potentiels". On considère ici qu'on      ! Initialisation des "pourcentages potentiels". On consid\`ere ici qu'on
299      ! peut avoir potentiellement de la glace sur tout le domaine océanique      ! peut avoir potentiellement de la glace sur tout le domaine oc\'eanique
300      ! (à affiner)      ! (\`a affiner)
301    
302      pctsrf_pot = pctsrf      pctsrf_pot = pctsrf
303      pctsrf_pot(:, is_oce) = 1. - zmasq      pctsrf_pot(:, is_oce) = 1. - zmasq
304      pctsrf_pot(:, is_sic) = 1. - zmasq      pctsrf_pot(:, is_sic) = 1. - zmasq
305    
306        ! Boucler sur toutes les sous-fractions du sol:
307    
308      loop_surface: DO nsrf = 1, nbsrf      loop_surface: DO nsrf = 1, nbsrf
309         ! Chercher les indices :         ! Chercher les indices :
310         ni = 0         ni = 0
311         knon = 0         knon = 0
312         DO i = 1, klon         DO i = 1, klon
313            ! Pour déterminer le domaine à traiter, on utilise les surfaces            ! Pour d\'eterminer le domaine \`a traiter, on utilise les surfaces
314            ! "potentielles"            ! "potentielles"
315            IF (pctsrf_pot(i, nsrf) > epsfra) THEN            IF (pctsrf_pot(i, nsrf) > epsfra) THEN
316               knon = knon + 1               knon = knon + 1
# Line 410  contains Line 318  contains
318            END IF            END IF
319         END DO         END DO
320    
321         ! 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  
322            DO j = 1, knon            DO j = 1, knon
323               i = ni(j)               i = ni(j)
324               ytsoil(j, k) = ftsoil(i, k, nsrf)               ypct(j) = pctsrf(i, nsrf)
325            END DO               yts(j) = ts(i, nsrf)
326         END DO               ysnow(j) = snow(i, nsrf)
327         DO k = 1, klev               yqsurf(j) = qsurf(i, nsrf)
328            DO j = 1, knon               yalb(j) = falbe(i, nsrf)
329               i = ni(j)               yrain_f(j) = rain_fall(i)
330               ypaprs(j, k) = paprs(i, k)               ysnow_f(j) = snow_f(i)
331               ypplay(j, k) = pplay(i, k)               yagesno(j) = agesno(i, nsrf)
332               ydelp(j, k) = delp(i, k)               yfder(j) = fder(i)
333               yu(j, k) = u(i, k)               yrugos(j) = rugos(i, nsrf)
334               yv(j, k) = v(i, k)               yrugoro(j) = rugoro(i)
335               yt(j, k) = t(i, k)               yu1(j) = u1lay(i)
336               yq(j, k) = q(i, k)               yv1(j) = v1lay(i)
337            END DO               yrads(j) = solsw(i, nsrf) + sollw(i, nsrf)
338         END DO               ypaprs(j, klev+1) = paprs(i, klev+1)
339                 y_run_off_lic_0(j) = run_off_lic_0(i)
340              END DO
341    
342              ! For continent, copy soil water content
343              IF (nsrf == is_ter) THEN
344                 yqsol(:knon) = qsol(ni(:knon))
345              ELSE
346                 yqsol = 0.
347              END IF
348    
349         ! calculer Cdrag et les coefficients d'echange            DO k = 1, nsoilmx
350         CALL coefkz(nsrf, knon, ypaprs, ypplay, ksta, ksta_ter, yts,&               DO j = 1, knon
351              yrugos, yu, yv, yt, yq, yqsurf, ycoefm, ycoefh)                  i = ni(j)
352         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))  
353               END DO               END DO
354            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)  
355    
356            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  
357               DO j = 1, knon               DO j = 1, knon
358                  i = ni(j)                  i = ni(j)
359                  yq2(j, k) = q2(i, k, nsrf)                  ypaprs(j, k) = paprs(i, k)
360                    ypplay(j, k) = pplay(i, k)
361                    ydelp(j, k) = delp(i, k)
362                    yu(j, k) = u(i, k)
363                    yv(j, k) = v(i, k)
364                    yt(j, k) = t(i, k)
365                    yq(j, k) = q(i, k)
366               END DO               END DO
367            END DO            END DO
368    
369            y_cd_m(1:knon) = ycoefm(1:knon, 1)            ! calculer Cdrag et les coefficients d'echange
370            y_cd_h(1:knon) = ycoefh(1:knon, 1)            CALL coefkz(nsrf, knon, ypaprs, ypplay, ksta, ksta_ter, yts, yrugos, &
371            CALL ustarhb(knon, yu, yv, y_cd_m, yustar)                 yu, yv, yt, yq, yqsurf, coefm(:knon, :), coefh(:knon, :))
372              IF (iflag_pbl == 1) THEN
373                 CALL coefkz2(nsrf, knon, ypaprs, ypplay, yt, ycoefm0, ycoefh0)
374                 coefm(:knon, :) = max(coefm(:knon, :), ycoefm0(:knon, :))
375                 coefh(:knon, :) = max(coefh(:knon, :), ycoefh0(:knon, :))
376              END IF
377    
378            IF (prt_level>9) THEN            ! on met un seuil pour coefm et coefh
379               PRINT *, 'USTAR = ', yustar            IF (nsrf == is_oce) THEN
380                 coefm(:knon, 1) = min(coefm(:knon, 1), cdmmax)
381                 coefh(:knon, 1) = min(coefh(:knon, 1), cdhmax)
382            END IF            END IF
383    
384            ! iflag_pbl peut être utilisé comme longueur de mélange            IF (ok_kzmin) THEN
385                 ! Calcul d'une diffusion minimale pour les conditions tres stables
386                 CALL coefkzmin(knon, ypaprs, ypplay, yu, yv, yt, yq, &
387                      coefm(:knon, 1), ycoefm0, ycoefh0)
388                 coefm(:knon, :) = max(coefm(:knon, :), ycoefm0(:knon, :))
389                 coefh(:knon, :) = max(coefh(:knon, :), ycoefh0(:knon, :))
390              END IF
391    
392            IF (iflag_pbl >= 11) THEN            IF (iflag_pbl >= 3) THEN
393               CALL vdif_kcay(knon, dtime, rg, rd, ypaprs, yt, yzlev, yzlay, &               ! Mellor et Yamada adapt\'e \`a Mars, Richard Fournier et
394                    yu, yv, yteta, y_cd_m, yq2, q2diag, ykmm, ykmn, yustar, &               ! Fr\'ed\'eric Hourdin
395                    iflag_pbl)               yzlay(:knon, 1) = rd * yt(:knon, 1) / (0.5 * (ypaprs(:knon, 1) &
396            ELSE                    + ypplay(:knon, 1))) &
397               CALL yamada4(knon, dtime, rg, yzlev, yzlay, yu, yv, yteta, &                    * (ypaprs(:knon, 1) - ypplay(:knon, 1)) / rg
398                    y_cd_m, yq2, ykmm, ykmn, ykmq, yustar, iflag_pbl)               DO k = 2, klev
399                    yzlay(1:knon, k) = yzlay(1:knon, k-1) &
400                         + rd * 0.5 * (yt(1:knon, k-1) + yt(1:knon, k)) &
401                         / ypaprs(1:knon, k) &
402                         * (ypplay(1:knon, k-1) - ypplay(1:knon, k)) / rg
403                 END DO
404                 DO k = 1, klev
405                    yteta(1:knon, k) = yt(1:knon, k)*(ypaprs(1:knon, 1) &
406                         / ypplay(1:knon, k))**rkappa * (1.+0.61*yq(1:knon, k))
407                 END DO
408                 yzlev(1:knon, 1) = 0.
409                 yzlev(:knon, klev+1) = 2. * yzlay(:knon, klev) &
410                      - yzlay(:knon, klev - 1)
411                 DO k = 2, klev
412                    yzlev(1:knon, k) = 0.5*(yzlay(1:knon, k)+yzlay(1:knon, k-1))
413                 END DO
414                 DO k = 1, klev + 1
415                    DO j = 1, knon
416                       i = ni(j)
417                       yq2(j, k) = q2(i, k, nsrf)
418                    END DO
419                 END DO
420    
421                 CALL ustarhb(knon, yu, yv, coefm(:knon, 1), yustar)
422                 IF (prt_level > 9) PRINT *, 'USTAR = ', yustar
423    
424                 ! iflag_pbl peut \^etre utilis\'e comme longueur de m\'elange
425    
426                 IF (iflag_pbl >= 11) THEN
427                    CALL vdif_kcay(knon, dtime, rg, ypaprs, yzlev, yzlay, yu, yv, &
428                         yteta, coefm(:knon, 1), yq2, q2diag, ykmm, ykmn, yustar, &
429                         iflag_pbl)
430                 ELSE
431                    CALL yamada4(knon, dtime, rg, yzlev, yzlay, yu, yv, yteta, &
432                         coefm(:knon, 1), yq2, ykmm, ykmn, ykmq, yustar, iflag_pbl)
433                 END IF
434    
435                 coefm(:knon, 2:) = ykmm(:knon, 2:klev)
436                 coefh(:knon, 2:) = ykmn(:knon, 2:klev)
437            END IF            END IF
438    
439            ycoefm(1:knon, 1) = y_cd_m(1:knon)            ! calculer la diffusion des vitesses "u" et "v"
440            ycoefh(1:knon, 1) = y_cd_h(1:knon)            CALL clvent(knon, dtime, yu1, yv1, coefm(:knon, :), yt, yu, ypaprs, &
441            ycoefm(1:knon, 2:klev) = ykmm(1:knon, 2:klev)                 ypplay, ydelp, y_d_u, y_flux_u)
442            ycoefh(1:knon, 2:klev) = ykmn(1:knon, 2:klev)            CALL clvent(knon, dtime, yu1, yv1, coefm(:knon, :), yt, yv, ypaprs, &
443         END IF                 ypplay, ydelp, y_d_v, y_flux_v)
444    
445         ! calculer la diffusion des vitesses "u" et "v"            ! calculer la diffusion de "q" et de "h"
446         CALL clvent(knon, dtime, yu1, yv1, ycoefm, yt, yu, ypaprs, ypplay, &            CALL clqh(dtime, itap, jour, debut, rlat, knon, nsrf, ni(:knon), &
447              ydelp, y_d_u, y_flux_u)                 pctsrf, ytsoil, yqsol, rmu0, yrugos, yrugoro, yu1, &
448         CALL clvent(knon, dtime, yu1, yv1, ycoefm, yt, yv, ypaprs, ypplay, &                 yv1, coefh(:knon, :), yt, yq, yts, ypaprs, ypplay, ydelp, &
449              ydelp, y_d_v, y_flux_v)                 yrads, yalb(:knon), ysnow, yqsurf, yrain_f, ysnow_f, yfder, &
450                   yfluxlat, pctsrf_new, yagesno(:knon), y_d_t, y_d_q, &
451         ! pour le couplage                 y_d_ts(:knon), yz0_new, y_flux_t, y_flux_q, y_dflux_t, &
452         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  
453    
454         DO k = 1, klev            ! calculer la longueur de rugosite sur ocean
455              yrugm = 0.
456              IF (nsrf == is_oce) THEN
457                 DO j = 1, knon
458                    yrugm(j) = 0.018*coefm(j, 1)*(yu1(j)**2+yv1(j)**2)/rg + &
459                         0.11*14E-6/sqrt(coefm(j, 1)*(yu1(j)**2+yv1(j)**2))
460                    yrugm(j) = max(1.5E-05, yrugm(j))
461                 END DO
462              END IF
463            DO j = 1, knon            DO j = 1, knon
464               i = ni(j)               y_dflux_t(j) = y_dflux_t(j)*ypct(j)
465               ycoefh(j, k) = ycoefh(j, k)*ypct(j)               y_dflux_q(j) = y_dflux_q(j)*ypct(j)
466               ycoefm(j, k) = ycoefm(j, k)*ypct(j)               yu1(j) = yu1(j)*ypct(j)
467               y_d_t(j, k) = y_d_t(j, k)*ypct(j)               yv1(j) = yv1(j)*ypct(j)
468               y_d_q(j, k) = y_d_q(j, k)*ypct(j)            END DO
469               flux_t(i, k, nsrf) = y_flux_t(j, k)  
470               flux_q(i, k, nsrf) = y_flux_q(j, k)            DO k = 1, klev
471               flux_u(i, k, nsrf) = y_flux_u(j, k)               DO j = 1, knon
472               flux_v(i, k, nsrf) = y_flux_v(j, k)                  i = ni(j)
473               y_d_u(j, k) = y_d_u(j, k)*ypct(j)                  coefh(j, k) = coefh(j, k)*ypct(j)
474               y_d_v(j, k) = y_d_v(j, k)*ypct(j)                  coefm(j, k) = coefm(j, k)*ypct(j)
475                    y_d_t(j, k) = y_d_t(j, k)*ypct(j)
476                    y_d_q(j, k) = y_d_q(j, k)*ypct(j)
477                    flux_t(i, k, nsrf) = y_flux_t(j, k)
478                    flux_q(i, k, nsrf) = y_flux_q(j, k)
479                    flux_u(i, k, nsrf) = y_flux_u(j, k)
480                    flux_v(i, k, nsrf) = y_flux_v(j, k)
481                    y_d_u(j, k) = y_d_u(j, k)*ypct(j)
482                    y_d_v(j, k) = y_d_v(j, k)*ypct(j)
483                 END DO
484            END DO            END DO
        END DO  
485    
486         evap(:, nsrf) = -flux_q(:, 1, nsrf)            evap(:, nsrf) = -flux_q(:, 1, nsrf)
487    
488         albe(:, nsrf) = 0.            falbe(:, nsrf) = 0.
489         alblw(:, nsrf) = 0.            snow(:, nsrf) = 0.
490         snow(:, nsrf) = 0.            qsurf(:, nsrf) = 0.
491         qsurf(:, nsrf) = 0.            rugos(:, nsrf) = 0.
492         rugos(:, nsrf) = 0.            fluxlat(:, 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)  
           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  
493            DO j = 1, knon            DO j = 1, knon
494               i = ni(j)               i = ni(j)
495               qsol(i) = yqsol(j)               d_ts(i, nsrf) = y_d_ts(j)
496                 falbe(i, nsrf) = yalb(j)
497                 snow(i, nsrf) = ysnow(j)
498                 qsurf(i, nsrf) = yqsurf(j)
499                 rugos(i, nsrf) = yz0_new(j)
500                 fluxlat(i, nsrf) = yfluxlat(j)
501                 IF (nsrf == is_oce) THEN
502                    rugmer(i) = yrugm(j)
503                    rugos(i, nsrf) = yrugm(j)
504                 END IF
505                 agesno(i, nsrf) = yagesno(j)
506                 fqcalving(i, nsrf) = y_fqcalving(j)
507                 ffonte(i, nsrf) = y_ffonte(j)
508                 cdragh(i) = cdragh(i) + coefh(j, 1)
509                 cdragm(i) = cdragm(i) + coefm(j, 1)
510                 dflux_t(i) = dflux_t(i) + y_dflux_t(j)
511                 dflux_q(i) = dflux_q(i) + y_dflux_q(j)
512                 zu1(i) = zu1(i) + yu1(j)
513                 zv1(i) = zv1(i) + yv1(j)
514              END DO
515              IF (nsrf == is_ter) THEN
516                 qsol(ni(:knon)) = yqsol(:knon)
517              else IF (nsrf == is_lic) THEN
518                 DO j = 1, knon
519                    i = ni(j)
520                    run_off_lic_0(i) = y_run_off_lic_0(j)
521                 END DO
522              END IF
523    
524              ftsoil(:, :, nsrf) = 0.
525              DO k = 1, nsoilmx
526                 DO j = 1, knon
527                    i = ni(j)
528                    ftsoil(i, k, nsrf) = ytsoil(j, k)
529                 END DO
530            END DO            END DO
531         END IF  
        IF (nsrf == is_lic) THEN  
532            DO j = 1, knon            DO j = 1, knon
533               i = ni(j)               i = ni(j)
534               run_off_lic_0(i) = y_run_off_lic_0(j)               DO k = 1, klev
535                    d_t(i, k) = d_t(i, k) + y_d_t(j, k)
536                    d_q(i, k) = d_q(i, k) + y_d_q(j, k)
537                    d_u(i, k) = d_u(i, k) + y_d_u(j, k)
538                    d_v(i, k) = d_v(i, k) + y_d_v(j, k)
539                    ycoefh(i, k) = ycoefh(i, k) + coefh(j, k)
540                 END DO
541            END DO            END DO
542         END IF  
543         !$$$ PB ajout pour soil            ! diagnostic t, q a 2m et u, v a 10m
544         ftsoil(:, :, nsrf) = 0.  
        DO k = 1, nsoilmx  
545            DO j = 1, knon            DO j = 1, knon
546               i = ni(j)               i = ni(j)
547               ftsoil(i, k, nsrf) = ytsoil(j, k)               uzon(j) = yu(j, 1) + y_d_u(j, 1)
548            END DO               vmer(j) = yv(j, 1) + y_d_v(j, 1)
549         END DO               tair1(j) = yt(j, 1) + y_d_t(j, 1)
550                 qair1(j) = yq(j, 1) + y_d_q(j, 1)
551                 zgeo1(j) = rd*tair1(j)/(0.5*(ypaprs(j, 1)+ypplay(j, &
552                      1)))*(ypaprs(j, 1)-ypplay(j, 1))
553                 tairsol(j) = yts(j) + y_d_ts(j)
554                 rugo1(j) = yrugos(j)
555                 IF (nsrf == is_oce) THEN
556                    rugo1(j) = rugos(i, nsrf)
557                 END IF
558                 psfce(j) = ypaprs(j, 1)
559                 patm(j) = ypplay(j, 1)
560    
561         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)  
562            END DO            END DO
        END DO  
   
        !cc diagnostic t, q a 2m et u, v a 10m  
563    
564         DO j = 1, knon            CALL stdlevvar(klon, knon, nsrf, zxli, uzon, vmer, tair1, qair1, &
565            i = ni(j)                 zgeo1, tairsol, qairsol, rugo1, psfce, patm, yt2m, yq2m, &
566            uzon(j) = yu(j, 1) + y_d_u(j, 1)                 yt10m, yq10m, yu10m, yustar)
           vmer(j) = yv(j, 1) + y_d_v(j, 1)  
           tair1(j) = yt(j, 1) + y_d_t(j, 1)  
           qair1(j) = yq(j, 1) + y_d_q(j, 1)  
           zgeo1(j) = rd*tair1(j)/(0.5*(ypaprs(j, 1)+ypplay(j, &  
                1)))*(ypaprs(j, 1)-ypplay(j, 1))  
           tairsol(j) = yts(j) + y_d_ts(j)  
           rugo1(j) = yrugos(j)  
           IF (nsrf == is_oce) THEN  
              rugo1(j) = rugos(i, nsrf)  
           END IF  
           psfce(j) = ypaprs(j, 1)  
           patm(j) = ypplay(j, 1)  
567    
568            qairsol(j) = yqsurf(j)            DO j = 1, knon
569         END DO               i = ni(j)
570                 t2m(i, nsrf) = yt2m(j)
571                 q2m(i, nsrf) = yq2m(j)
572    
573         CALL stdlevvar(klon, knon, nsrf, zxli, uzon, vmer, tair1, qair1, zgeo1, &               ! u10m, v10m : composantes du vent a 10m sans spirale de Ekman
574              tairsol, qairsol, rugo1, psfce, patm, yt2m, yq2m, yt10m, yq10m, &               u10m(i, nsrf) = (yu10m(j)*uzon(j))/sqrt(uzon(j)**2+vmer(j)**2)
575              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)  
576    
577         END DO            END DO
578    
579         DO i = 1, knon            CALL hbtm(knon, ypaprs, ypplay, yt2m, yq2m, yustar, y_flux_t, &
580            y_cd_h(i) = ycoefh(i, 1)                 y_flux_q, yu, yv, yt, yq, ypblh(:knon), ycapcl, yoliqcl, &
581            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  
582    
        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  
583            DO j = 1, knon            DO j = 1, knon
              ! on projette sur la grille globale  
584               i = ni(j)               i = ni(j)
585               IF (pctsrf_new(i, is_oce)>epsfra) THEN               pblh(i, nsrf) = ypblh(j)
586                  flux_o(i) = y_flux_o(j)               plcl(i, nsrf) = ylcl(j)
587               ELSE               capcl(i, nsrf) = ycapcl(j)
588                  flux_o(i) = 0.               oliqcl(i, nsrf) = yoliqcl(j)
589               END IF               cteicl(i, nsrf) = ycteicl(j)
590                 pblt(i, nsrf) = ypblt(j)
591                 therm(i, nsrf) = ytherm(j)
592                 trmb1(i, nsrf) = ytrmb1(j)
593                 trmb2(i, nsrf) = ytrmb2(j)
594                 trmb3(i, nsrf) = ytrmb3(j)
595            END DO            END DO
        END IF  
596    
        IF (nsrf == is_sic) THEN  
597            DO j = 1, knon            DO j = 1, knon
598               i = ni(j)               DO k = 1, klev + 1
599               ! On pondère lorsque l'on fait le bilan au sol :                  i = ni(j)
600               IF (pctsrf_new(i, is_sic)>epsfra) THEN                  q2(i, k, nsrf) = yq2(j, k)
601                  flux_g(i) = y_flux_g(j)               END DO
              ELSE  
                 flux_g(i) = 0.  
              END IF  
602            END DO            END DO
603           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  
604      END DO loop_surface      END DO loop_surface
605    
606      ! On utilise les nouvelles surfaces      ! On utilise les nouvelles surfaces

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

  ViewVC Help
Powered by ViewVC 1.1.21