/[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 47 by guez, Fri Jul 1 15:00:48 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).  
   
     ! Arguments:  
     ! dtime----input-R- interval du temps (secondes)  
     ! itap-----input-I- numero du pas de temps  
     ! date0----input-R- jour initial  
     ! t--------input-R- temperature (K)  
     ! q--------input-R- vapeur d'eau (kg/kg)  
     ! u--------input-R- vitesse u  
     ! v--------input-R- vitesse v  
     ! ts-------input-R- temperature du sol (en Kelvin)  
     ! paprs----input-R- pression a intercouche (Pa)  
     ! pplay----input-R- pression au milieu de couche (Pa)  
     ! radsol---input-R- flux radiatif net (positif vers le sol) en W/m**2  
     ! rlat-----input-R- latitude en degree  
     ! rugos----input-R- longeur de rugosite (en m)  
     ! cufi-----input-R- resolution des mailles en x (m)  
     ! cvfi-----input-R- resolution des mailles en y (m)  
28    
29        use clqh_m, only: clqh
30        use clvent_m, only: clvent
31        use coefkz_m, only: coefkz
32        use coefkzmin_m, only: coefkzmin
33        USE conf_gcm_m, ONLY: prt_level
34        USE conf_phys_m, ONLY: iflag_pbl
35        USE dimphy, ONLY: klev, klon, zmasq
36        USE dimsoil, ONLY: nsoilmx
37        use hbtm_m, only: hbtm
38        USE indicesol, ONLY: epsfra, is_lic, is_oce, is_sic, is_ter, nbsrf
39        use stdlevvar_m, only: stdlevvar
40        USE suphec_m, ONLY: rd, rg, rkappa
41        use ustarhb_m, only: ustarhb
42        use vdif_kcay_m, only: vdif_kcay
43        use yamada4_m, only: yamada4
44    
45        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    
92        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      ! d_u------output-R- le changement pour "u"  
96      ! d_v------output-R- le changement pour "v"      REAL, intent(out):: d_u(klon, klev), d_v(klon, klev)
97      ! d_ts-----output-R- le changement pour "ts"      ! 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)
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)
105    
106        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
109    
110        REAL, INTENT(out):: cdragh(klon), cdragm(klon)
111        real q2(klon, klev+1, nbsrf)
112    
113        REAL, INTENT(out):: dflux_t(klon), dflux_q(klon)
114      ! dflux_t derive du flux sensible      ! dflux_t derive du flux sensible
115      ! dflux_q derive du flux latent      ! dflux_q derive du flux latent
116      !IM "slab" ocean      ! IM "slab" ocean
     ! flux_g---output-R-  flux glace (pour OCEAN='slab  ')  
     ! flux_o---output-R-  flux ocean (pour OCEAN='slab  ')  
117    
118      ! tslab-in/output-R temperature du slab ocean (en Kelvin)      REAL, intent(out):: ycoefh(klon, klev)
119      ! uniqmnt pour slab      REAL, intent(out):: zu1(klon)
120        REAL zv1(klon)
121        REAL t2m(klon, nbsrf), q2m(klon, nbsrf)
122        REAL u10m(klon, nbsrf), v10m(klon, nbsrf)
123    
124      ! seaice---output-R-  glace de mer (kg/m2) (pour OCEAN='slab  ')      ! Ionela Musat cf. Anne Mathieu : planetary boundary layer, hbtm
125      !cc      ! (Comme les autres diagnostics on cumule dans physiq ce qui
126      ! ffonte----Flux thermique utilise pour fondre la neige      ! permet de sortir les grandeurs par sous-surface)
127      ! fqcalving-Flux d'eau "perdue" par la surface et necessaire pour limiter la      REAL pblh(klon, nbsrf) ! height of planetary boundary layer
128      !           hauteur de neige, en kg/m2/s      REAL capcl(klon, nbsrf)
129      ! on rajoute en output yu1 et yv1 qui sont les vents dans      REAL oliqcl(klon, nbsrf)
130      ! la premiere couche      REAL cteicl(klon, nbsrf)
131      ! ces 4 variables sont maintenant traites dans phytrac      REAL pblt(klon, nbsrf)
132      ! itr--------input-I- nombre de traceurs      ! pblT------- T au nveau HCL
133      ! tr---------input-R- q. de traceurs      REAL therm(klon, nbsrf)
134      ! flux_surf--input-R- flux de traceurs a la surface      REAL trmb1(klon, nbsrf)
     ! d_tr-------output-R tendance de traceurs  
     !IM cf. AM : PBL  
135      ! trmb1-------deep_cape      ! trmb1-------deep_cape
136        REAL trmb2(klon, nbsrf)
137      ! trmb2--------inhibition      ! trmb2--------inhibition
138        REAL trmb3(klon, nbsrf)
139      ! trmb3-------Point Omega      ! trmb3-------Point Omega
140      ! Cape(klon)-------Cape du thermique      REAL plcl(klon, nbsrf)
     ! EauLiq(klon)-------Eau liqu integr du thermique  
     ! ctei(klon)-------Critere d'instab d'entrainmt des nuages de CL  
     ! lcl------- Niveau de condensation  
     ! pblh------- HCL  
     ! pblT------- T au nveau HCL  
   
     use calendar, ONLY : ymds2ju  
     use coefkz_m, only: coefkz  
     use coefkzmin_m, only: coefkzmin  
     USE conf_phys_m, ONLY : iflag_pbl  
     USE dimens_m, ONLY : iim, jjm  
     USE dimphy, ONLY : klev, klon, zmasq  
     USE dimsoil, ONLY : nsoilmx  
     USE dynetat0_m, ONLY : day_ini  
     USE gath_cpl, ONLY : gath2cpl  
     use hbtm_m, only: hbtm  
     USE histcom, ONLY : histbeg_totreg, histdef, histend, histsync  
     use histwrite_m, only: histwrite  
     USE indicesol, ONLY : epsfra, is_lic, is_oce, is_sic, is_ter, nbsrf  
     USE iniprint, ONLY : prt_level  
     USE suphec_m, ONLY : rd, rg, rkappa  
     USE temps, ONLY : annee_ref, itau_phy  
     use yamada4_m, only: yamada4  
   
     REAL, INTENT (IN) :: dtime  
     REAL date0  
     INTEGER, INTENT (IN) :: itap  
     REAL t(klon, klev), q(klon, klev)  
     REAL, INTENT (IN):: u(klon, klev), v(klon, klev)  
     REAL, INTENT (IN):: paprs(klon, klev+1)  
     REAL, INTENT (IN):: pplay(klon, klev)  
     REAL, INTENT (IN):: rlon(klon), rlat(klon)  
     REAL cufi(klon), cvfi(klon)  
     REAL d_t(klon, klev), d_q(klon, klev)  
     REAL d_u(klon, klev), d_v(klon, klev)  
     REAL flux_t(klon, klev, nbsrf), flux_q(klon, klev, nbsrf)  
     REAL dflux_t(klon), dflux_q(klon)  
     !IM "slab" ocean  
     REAL flux_o(klon), flux_g(klon)  
     REAL y_flux_o(klon), y_flux_g(klon)  
     REAL tslab(klon), ytslab(klon)  
     REAL seaice(klon), y_seaice(klon)  
     REAL y_fqcalving(klon), y_ffonte(klon)  
141      REAL fqcalving(klon, nbsrf), ffonte(klon, nbsrf)      REAL fqcalving(klon, nbsrf), ffonte(klon, nbsrf)
142      REAL run_off_lic_0(klon), y_run_off_lic_0(klon)      ! ffonte----Flux thermique utilise pour fondre la neige
143        ! fqcalving-Flux d'eau "perdue" par la surface et necessaire pour limiter la
144      REAL flux_u(klon, klev, nbsrf), flux_v(klon, klev, nbsrf)      !           hauteur de neige, en kg/m2/s
145      REAL rugmer(klon), agesno(klon, nbsrf)      REAL run_off_lic_0(klon)
     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)  
     REAL d_ts(klon, nbsrf)  
     REAL snow(klon, nbsrf)  
     REAL qsurf(klon, nbsrf)  
     REAL evap(klon, nbsrf)  
     REAL albe(klon, nbsrf)  
     REAL alblw(klon, nbsrf)  
   
     REAL fluxlat(klon, nbsrf)  
   
     REAL rain_f(klon), snow_f(klon)  
     REAL fder(klon)  
   
     REAL sollw(klon, nbsrf), solsw(klon, nbsrf), sollwdown(klon)  
     REAL rugos(klon, nbsrf)  
     ! la nouvelle repartition des surfaces sortie de l'interface  
     REAL pctsrf_new(klon, nbsrf)  
146    
147      REAL zcoefh(klon, klev)      ! Local:
     REAL zu1(klon)  
     REAL zv1(klon)  
148    
149      !$$$ PB ajout pour soil      REAL y_fqcalving(klon), y_ffonte(klon)
150      LOGICAL, INTENT (IN) :: soil_model      real y_run_off_lic_0(klon)
     !IM ajout seuils cdrm, cdrh  
     REAL cdmmax, cdhmax  
151    
152      REAL ksta, ksta_ter      REAL rugmer(klon)
     LOGICAL ok_kzmin  
153    
     REAL ftsoil(klon, nsoilmx, nbsrf)  
154      REAL ytsoil(klon, nsoilmx)      REAL ytsoil(klon, nsoilmx)
     REAL qsol(klon)  
   
     EXTERNAL clqh, clvent, calbeta, cltrac  
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      REAL ysnow(klon), yqsurf(klon), yagesno(klon), yqsol(klon)      ! on rajoute en output yu1 et yv1 qui sont les vents dans
160      REAL yrain_f(klon), ysnow_f(klon)      ! la premiere couche
161      REAL ysollw(klon), ysolsw(klon), ysollwdown(klon)      REAL ysnow(klon), yqsurf(klon), yagesno(klon)
162      REAL yfder(klon), ytaux(klon), ytauy(klon)  
163        real yqsol(klon)
164        ! 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 202  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 224  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)  
     REAL plcl(klon, nbsrf)  
     REAL capcl(klon, nbsrf)  
     REAL oliqcl(klon, nbsrf)  
     REAL cteicl(klon, nbsrf)  
     REAL pblt(klon, nbsrf)  
     REAL therm(klon, nbsrf)  
     REAL trmb1(klon, nbsrf)  
     REAL trmb2(klon, nbsrf)  
     REAL trmb3(klon, nbsrf)  
212      REAL ypblh(klon)      REAL ypblh(klon)
213      REAL ylcl(klon)      REAL ylcl(klon)
214      REAL ycapcl(klon)      REAL ycapcl(klon)
# Line 280  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 292  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 355  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 379  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 400  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.
293    
294      ! Boucler sur toutes les sous-fractions du sol:      ! Initialisation des "pourcentages potentiels". On consid\`ere ici qu'on
295        ! peut avoir potentiellement de la glace sur tout le domaine oc\'eanique
296      ! Initialisation des "pourcentages potentiels". On considère ici qu'on      ! (\`a affiner)
     ! peut avoir potentiellement de la glace sur tout le domaine océanique  
     ! (à affiner)  
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      DO nsrf = 1, nbsrf      ! Boucler sur toutes les sous-fractions du sol:
303         ! chercher les indices:  
304        loop_surface: DO nsrf = 1, nbsrf
305           ! 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 425  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  
318            DO j = 1, knon            DO j = 1, knon
319               i = ni(j)               i = ni(j)
320               yqsol(j) = qsol(i)               ypct(j) = pctsrf(i, nsrf)
321            END DO               yts(j) = ts(i, nsrf)
322         ELSE               ysnow(j) = snow(i, nsrf)
323            yqsol = 0.               yqsurf(j) = qsurf(i, nsrf)
324         END IF               yalb(j) = falbe(i, nsrf)
325         !$$$ PB ajour pour soil               yrain_f(j) = rain_fall(i)
326         DO k = 1, nsoilmx               ysnow_f(j) = snow_f(i)
327            DO j = 1, knon               yagesno(j) = agesno(i, nsrf)
328               i = ni(j)               yfder(j) = fder(i)
329               ytsoil(j, k) = ftsoil(i, k, nsrf)               yrugos(j) = rugos(i, nsrf)
330            END DO               yrugoro(j) = rugoro(i)
331         END DO               yu1(j) = u1lay(i)
332         DO k = 1, klev               yv1(j) = v1lay(i)
333            DO j = 1, knon               yrads(j) = solsw(i, nsrf) + sollw(i, nsrf)
334               i = ni(j)               ypaprs(j, klev+1) = paprs(i, klev+1)
335               ypaprs(j, k) = paprs(i, k)               y_run_off_lic_0(j) = run_off_lic_0(i)
336               ypplay(j, k) = pplay(i, k)            END DO
337               ydelp(j, k) = delp(i, k)  
338               yu(j, k) = u(i, k)            ! For continent, copy soil water content
339               yv(j, k) = v(i, k)            IF (nsrf == is_ter) THEN
340               yt(j, k) = t(i, k)               yqsol(:knon) = qsol(ni(:knon))
341               yq(j, k) = q(i, k)            ELSE
342            END DO               yqsol = 0.
343         END DO            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  
   
        ! 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)  
351    
352            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  
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
600         END IF      END DO loop_surface
        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  
     END DO  
601    
602      ! On utilise les nouvelles surfaces      ! On utilise les nouvelles surfaces
603    

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

  ViewVC Help
Powered by ViewVC 1.1.21