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

Diff of /trunk/Sources/phylmd/clmain.f

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

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

Legend:
Removed from v.49  
changed lines
  Added in v.191

  ViewVC Help
Powered by ViewVC 1.1.21