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

Diff of /trunk/phylmd/Interface_surf/pbl_surface.f90

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

trunk/libf/phylmd/clmain.f90 revision 57 by guez, Mon Jan 30 12:54:02 2012 UTC trunk/phylmd/Interface_surf/pbl_surface.f revision 307 by guez, Tue Sep 11 12:52:28 2018 UTC
# Line 1  Line 1 
1  module clmain_m  module pbl_surface_m
2    
3    IMPLICIT NONE    IMPLICIT NONE
4    
5  contains  contains
6    
7    SUBROUTINE clmain(dtime, itap, date0, pctsrf, pctsrf_new, t, q, u, v,&    SUBROUTINE pbl_surface(pctsrf, t, q, u, v, julien, mu0, ftsol, cdmmax, &
8         jour, rmu0, co2_ppm, ok_veget, ocean, npas, nexca, ts,&         cdhmax, ftsoil, qsol, paprs, pplay, fsnow, qsurf, falbe, fluxlat, &
9         soil_model, cdmmax, cdhmax, ksta, ksta_ter, ok_kzmin, ftsoil,&         rain_fall, snow_fall, frugs, agesno, rugoro, d_t, d_q, d_u, d_v, d_ts, &
10         qsol, paprs, pplay, snow, qsurf, evap, albe, alblw, fluxlat,&         flux_t, flux_q, flux_u, flux_v, cdragh, cdragm, q2, dflux_t, dflux_q, &
11         rain_f, snow_f, solsw, sollw, sollwdown, fder, rlon, rlat, cufi,&         coefh, t2m, q2m, u10m_srf, v10m_srf, pblh, capcl, oliqcl, cteicl, pblt, &
12         cvfi, rugos, debut, lafin, agesno, rugoro, d_t, d_q, d_u, d_v,&         therm, plcl, fqcalving, ffonte, run_off_lic_0, albsol, sollw, solsw, &
13         d_ts, flux_t, flux_q, flux_u, flux_v, cdragh, cdragm, q2,&         tsol)
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)
17        ! Date: Aug. 18th, 1993
18      ! From phylmd/clmain.F, version 1.6 2005/11/16 14:47:19      ! Objet : interface de couche limite (diffusion verticale)
19      ! Author: Z.X. Li (LMD/CNRS), date: 1993/08/18  
20      ! Objet : interface de "couche limite" (diffusion verticale)      ! Tout ce qui a trait aux traceurs est dans "phytrac". Le calcul
21        ! de la couche limite pour les traceurs se fait avec "cltrac" et
22      ! Tout ce qui a trait aux traceurs est dans "phytrac" maintenant.      ! ne tient pas compte de la diff\'erentiation des sous-fractions
23      ! Pour l'instant le calcul de la couche limite pour les traceurs      ! de sol.
     ! se fait avec "cltrac" et ne tient pas compte de la différentiation  
     ! des sous-fractions de sol.  
   
     ! Pour pouvoir extraire les coefficients d'échanges et le vent  
     ! 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).  
24    
25      use calendar, ONLY : ymds2ju      use cdrag_m, only: cdrag
26      use clqh_m, only: clqh      use clqh_m, only: clqh
27      use coefkz_m, only: coefkz      use clvent_m, only: clvent
28      use coefkzmin_m, only: coefkzmin      use coef_diff_turb_m, only: coef_diff_turb
29      USE conf_phys_m, ONLY : iflag_pbl      USE conf_gcm_m, ONLY: lmt_pas
30      USE dimens_m, ONLY : iim, jjm      USE conf_phys_m, ONLY: iflag_pbl
31      USE dimphy, ONLY : klev, klon, zmasq      USE dimphy, ONLY: klev, klon
32      USE dimsoil, ONLY : nsoilmx      USE dimsoil, ONLY: nsoilmx
     USE dynetat0_m, ONLY : day_ini  
     USE gath_cpl, ONLY : gath2cpl  
33      use hbtm_m, only: hbtm      use hbtm_m, only: hbtm
34      USE histcom, ONLY : histbeg_totreg, histdef, histend, histsync      USE histwrite_phy_m, ONLY: histwrite_phy
35      use histwrite_m, only: histwrite      USE indicesol, ONLY: epsfra, is_lic, is_oce, is_sic, is_ter, nbsrf
36      USE indicesol, ONLY : epsfra, is_lic, is_oce, is_sic, is_ter, nbsrf      USE interfoce_lim_m, ONLY: interfoce_lim
37      USE conf_gcm_m, ONLY : prt_level      use phyetat0_m, only: zmasq
38      USE suphec_m, ONLY : rd, rg, rkappa      use stdlevvar_m, only: stdlevvar
39      USE temps, ONLY : annee_ref, itau_phy      USE suphec_m, ONLY: rd, rg, rsigma
40      use yamada4_m, only: yamada4      use time_phylmdz, only: itap
41    
42      ! Arguments:      REAL, INTENT(inout):: pctsrf(klon, nbsrf)
43        ! tableau des pourcentages de surface de chaque maille
44      REAL, INTENT (IN) :: dtime ! interval du temps (secondes)  
45      REAL date0      REAL, INTENT(IN):: t(klon, klev) ! temperature (K)
46      ! date0----input-R- jour initial      REAL, INTENT(IN):: q(klon, klev) ! vapeur d'eau (kg / kg)
47      INTEGER, INTENT (IN) :: itap      REAL, INTENT(IN):: u(klon, klev), v(klon, klev) ! vitesse
48      ! itap-----input-I- numero du pas de temps      INTEGER, INTENT(IN):: julien ! jour de l'annee en cours
49      REAL, INTENT(IN):: t(klon, klev), q(klon, klev)      REAL, intent(in):: mu0(klon) ! cosinus de l'angle solaire zenithal    
50      ! t--------input-R- temperature (K)      REAL, INTENT(IN):: ftsol(:, :) ! (klon, nbsrf) temp\'erature du sol (en K)
51      ! q--------input-R- vapeur d'eau (kg/kg)      REAL, INTENT(IN):: cdmmax, cdhmax ! seuils cdrm, cdrh
52      REAL, INTENT (IN):: u(klon, klev), v(klon, klev)  
53      ! u--------input-R- vitesse u      REAL, INTENT(inout):: ftsoil(klon, nsoilmx, nbsrf)
54      ! v--------input-R- vitesse v      ! soil temperature of surface fraction
55      REAL, INTENT (IN):: paprs(klon, klev+1)  
56      ! paprs----input-R- pression a intercouche (Pa)      REAL, INTENT(inout):: qsol(:) ! (klon)
57      REAL, INTENT (IN):: pplay(klon, klev)      ! column-density of water in soil, in kg m-2
58      ! pplay----input-R- pression au milieu de couche (Pa)  
59      REAL, INTENT (IN):: rlon(klon), rlat(klon)      REAL, INTENT(IN):: paprs(klon, klev + 1) ! pression a intercouche (Pa)
60      ! rlat-----input-R- latitude en degree      REAL, INTENT(IN):: pplay(klon, klev) ! pression au milieu de couche (Pa)
61      REAL cufi(klon), cvfi(klon)      REAL, INTENT(inout):: fsnow(:, :) ! (klon, nbsrf) \'epaisseur neigeuse
62      ! cufi-----input-R- resolution des mailles en x (m)      REAL, INTENT(inout):: qsurf(klon, nbsrf)
63      ! cvfi-----input-R- resolution des mailles en y (m)      REAL, intent(inout):: falbe(klon, nbsrf)
64      REAL d_t(klon, klev), d_q(klon, klev)      REAL, intent(out):: fluxlat(:, :) ! (klon, nbsrf)
65      ! d_t------output-R- le changement pour "t"  
66      ! d_q------output-R- le changement pour "q"      REAL, intent(in):: rain_fall(klon)
67      REAL d_u(klon, klev), d_v(klon, klev)      ! liquid water mass flux (kg / m2 / s), positive down
68      ! d_u------output-R- le changement pour "u"  
69      ! d_v------output-R- le changement pour "v"      REAL, intent(in):: snow_fall(klon)
70      REAL flux_t(klon, klev, nbsrf), flux_q(klon, klev, nbsrf)      ! solid water mass flux (kg / m2 / s), positive down
71      ! flux_t---output-R- flux de chaleur sensible (CpT) J/m**2/s (W/m**2)  
72      !                    (orientation positive vers le bas)      REAL, intent(inout):: frugs(klon, nbsrf) ! longueur de rugosit\'e (en m)
73      ! flux_q---output-R- flux de vapeur d'eau (kg/m**2/s)      real agesno(klon, nbsrf)
74      REAL dflux_t(klon), dflux_q(klon)      REAL, INTENT(IN):: rugoro(klon)
75      ! dflux_t derive du flux sensible  
76      ! dflux_q derive du flux latent      REAL, intent(out):: d_t(:, :), d_q(:, :) ! (klon, klev)
77      !IM "slab" ocean      ! changement pour t et q
78      REAL flux_o(klon), flux_g(klon)  
79      !IM "slab" ocean      REAL, intent(out):: d_u(klon, klev), d_v(klon, klev)
80      ! flux_g---output-R-  flux glace (pour OCEAN='slab  ')      ! changement pour "u" et "v"
81      ! flux_o---output-R-  flux ocean (pour OCEAN='slab  ')  
82      REAL y_flux_o(klon), y_flux_g(klon)      REAL, intent(out):: d_ts(:, :) ! (klon, nbsrf) variation of ftsol
83      REAL tslab(klon), ytslab(klon)  
84      ! tslab-in/output-R temperature du slab ocean (en Kelvin)      REAL, intent(out):: flux_t(klon, nbsrf)
85      ! uniqmnt pour slab      ! flux de chaleur sensible (c_p T) (W / m2) (orientation positive
86      REAL seaice(klon), y_seaice(klon)      ! vers le bas) à la surface
87      ! seaice---output-R-  glace de mer (kg/m2) (pour OCEAN='slab  ')  
88      REAL y_fqcalving(klon), y_ffonte(klon)      REAL, intent(out):: flux_q(klon, nbsrf)
89      REAL fqcalving(klon, nbsrf), ffonte(klon, nbsrf)      ! flux de vapeur d'eau (kg / m2 / s) à la surface
90      ! ffonte----Flux thermique utilise pour fondre la neige  
91      ! fqcalving-Flux d'eau "perdue" par la surface et necessaire pour limiter la      REAL, intent(out):: flux_u(klon, nbsrf), flux_v(klon, nbsrf)
92      !           hauteur de neige, en kg/m2/s      ! tension du vent (flux turbulent de vent) à la surface, en Pa
93      REAL run_off_lic_0(klon), y_run_off_lic_0(klon)  
94        REAL, INTENT(out):: cdragh(klon), cdragm(klon)
95      REAL flux_u(klon, klev, nbsrf), flux_v(klon, klev, nbsrf)      real q2(klon, klev + 1, nbsrf)
96      ! flux_u---output-R- tension du vent X: (kg m/s)/(m**2 s) ou Pascal  
97      ! flux_v---output-R- tension du vent Y: (kg m/s)/(m**2 s) ou Pascal      ! Ocean slab:
98      REAL rugmer(klon), agesno(klon, nbsrf)      REAL, INTENT(out):: dflux_t(klon) ! derive du flux sensible
99      REAL, INTENT (IN) :: rugoro(klon)      REAL, INTENT(out):: dflux_q(klon) ! derive du flux latent
100      REAL cdragh(klon), cdragm(klon)  
101      ! jour de l'annee en cours                      REAL, intent(out):: coefh(:, 2:) ! (klon, 2:klev)
102      INTEGER jour      ! Pour pouvoir extraire les coefficients d'\'echange, le champ
103      REAL rmu0(klon) ! cosinus de l'angle solaire zenithal          ! "coefh" a \'et\'e cr\'e\'e. Nous avons moyenn\'e les valeurs de
104      ! taux CO2 atmosphere                          ! ce champ sur les quatre sous-surfaces du mod\`ele.
105      REAL co2_ppm  
106      LOGICAL, INTENT (IN) :: debut      REAL, INTENT(inout):: t2m(klon, nbsrf), q2m(klon, nbsrf)
107      LOGICAL, INTENT (IN) :: lafin  
108      LOGICAL ok_veget      REAL, INTENT(inout):: u10m_srf(:, :), v10m_srf(:, :) ! (klon, nbsrf)
109      CHARACTER (len=*), INTENT (IN) :: ocean      ! composantes du vent \`a 10m sans spirale d'Ekman
110      INTEGER npas, nexca  
111        ! Ionela Musat. Cf. Anne Mathieu : planetary boundary layer, hbtm.
112      REAL pctsrf(klon, nbsrf)      ! Comme les autres diagnostics on cumule dans physiq ce qui permet
113      REAL ts(klon, nbsrf)      ! de sortir les grandeurs par sous-surface.
114      ! ts-------input-R- temperature du sol (en Kelvin)      REAL pblh(klon, nbsrf) ! height of planetary boundary layer
115      REAL d_ts(klon, nbsrf)      REAL capcl(klon, nbsrf)
116      ! d_ts-----output-R- le changement pour "ts"      REAL oliqcl(klon, nbsrf)
117      REAL snow(klon, nbsrf)      REAL cteicl(klon, nbsrf)
118      REAL qsurf(klon, nbsrf)      REAL, INTENT(inout):: pblt(klon, nbsrf) ! T au nveau HCL
119      REAL evap(klon, nbsrf)      REAL therm(klon, nbsrf)
120      REAL albe(klon, nbsrf)      REAL plcl(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)  
     ! rugos----input-R- longeur de rugosite (en m)  
     ! la nouvelle repartition des surfaces sortie de l'interface  
     REAL pctsrf_new(klon, nbsrf)  
121    
122      REAL zcoefh(klon, klev)      REAL, intent(out):: fqcalving(klon, nbsrf)
123      REAL zu1(klon)      ! flux d'eau "perdue" par la surface et necessaire pour limiter la
124      REAL zv1(klon)      ! hauteur de neige, en kg / m2 / s
125    
126        real ffonte(klon, nbsrf) ! flux thermique utilise pour fondre la neige
127        REAL, intent(inout):: run_off_lic_0(:) ! (klon)
128    
129        REAL, intent(out):: albsol(:) ! (klon)
130        ! albedo du sol total, visible, moyen par maille
131    
132        REAL, intent(in):: sollw(:) ! (klon)
133        ! rayonnement infrarouge montant \`a la surface
134        
135        REAL, intent(in):: solsw(:) ! (klon)
136        REAL, intent(in):: tsol(:) ! (klon)
137    
138      !$$$ PB ajout pour soil      ! Local:
     LOGICAL, INTENT (IN) :: soil_model  
     !IM ajout seuils cdrm, cdrh  
     REAL cdmmax, cdhmax  
139    
140      REAL ksta, ksta_ter      REAL fsollw(klon, nbsrf) ! bilan flux IR pour chaque sous-surface
141      LOGICAL ok_kzmin      REAL fsolsw(klon, nbsrf) ! flux solaire absorb\'e pour chaque sous-surface
142    
143      REAL ftsoil(klon, nsoilmx, nbsrf)      ! la nouvelle repartition des surfaces sortie de l'interface
144      REAL ytsoil(klon, nsoilmx)      REAL, save:: pctsrf_new_oce(klon)
145      REAL qsol(klon)      REAL, save:: pctsrf_new_sic(klon)
   
     EXTERNAL clvent, calbeta, cltrac  
146    
147      REAL yts(klon), yrugos(klon), ypct(klon), yz0_new(klon)      REAL y_fqcalving(klon), y_ffonte(klon)
148        real y_run_off_lic_0(klon), y_run_off_lic(klon)
149        REAL run_off_lic(klon) ! ruissellement total
150        REAL rugmer(klon)
151        REAL ytsoil(klon, nsoilmx)
152        REAL yts(klon), ypct(klon), yz0_new(klon)
153        real yrugos(klon) ! longueur de rugosite (en m)
154      REAL yalb(klon)      REAL yalb(klon)
155      REAL yalblw(klon)      REAL snow(klon), yqsurf(klon), yagesno(klon)
156      REAL yu1(klon), yv1(klon)      real yqsol(klon) ! column-density of water in soil, in kg m-2
157      ! on rajoute en output yu1 et yv1 qui sont les vents dans      REAL yrain_fall(klon) ! liquid water mass flux (kg / m2 / s), positive down
158      ! la premiere couche      REAL ysnow_fall(klon) ! solid water mass flux (kg / m2 / s), positive down
     REAL ysnow(klon), yqsurf(klon), yagesno(klon), yqsol(klon)  
     REAL yrain_f(klon), ysnow_f(klon)  
     REAL ysollw(klon), ysolsw(klon), ysollwdown(klon)  
     REAL yfder(klon), ytaux(klon), ytauy(klon)  
159      REAL yrugm(klon), yrads(klon), yrugoro(klon)      REAL yrugm(klon), yrads(klon), yrugoro(klon)
   
160      REAL yfluxlat(klon)      REAL yfluxlat(klon)
   
161      REAL y_d_ts(klon)      REAL y_d_ts(klon)
162      REAL y_d_t(klon, klev), y_d_q(klon, klev)      REAL y_d_t(klon, klev), y_d_q(klon, klev)
163      REAL y_d_u(klon, klev), y_d_v(klon, klev)      REAL y_d_u(klon, klev), y_d_v(klon, klev)
164      REAL y_flux_t(klon, klev), y_flux_q(klon, klev)      REAL y_flux_t(klon), y_flux_q(klon)
165      REAL y_flux_u(klon, klev), y_flux_v(klon, klev)      REAL y_flux_u(klon), y_flux_v(klon)
166      REAL y_dflux_t(klon), y_dflux_q(klon)      REAL y_dflux_t(klon), y_dflux_q(klon)
167      REAL ycoefh(klon, klev), ycoefm(klon, klev)      REAL ycoefh(klon, 2:klev), ycoefm(klon, 2:klev)
168        real ycdragh(klon), ycdragm(klon)
169      REAL yu(klon, klev), yv(klon, klev)      REAL yu(klon, klev), yv(klon, klev)
170      REAL yt(klon, klev), yq(klon, klev)      REAL yt(klon, klev), yq(klon, klev)
171      REAL ypaprs(klon, klev+1), ypplay(klon, klev), ydelp(klon, klev)      REAL ypaprs(klon, klev + 1), ypplay(klon, klev), ydelp(klon, klev)
172        REAL yq2(klon, klev + 1)
     LOGICAL ok_nonloc  
     PARAMETER (ok_nonloc=.FALSE.)  
     REAL ycoefm0(klon, klev), ycoefh0(klon, klev)  
   
     REAL yzlay(klon, klev), yzlev(klon, klev+1), yteta(klon, klev)  
     REAL ykmm(klon, klev+1), ykmn(klon, klev+1)  
     REAL ykmq(klon, klev+1)  
     REAL yq2(klon, klev+1), q2(klon, klev+1, nbsrf)  
     REAL q2diag(klon, klev+1)  
   
     REAL u1lay(klon), v1lay(klon)  
173      REAL delp(klon, klev)      REAL delp(klon, klev)
174      INTEGER i, k, nsrf      INTEGER i, k, nsrf
   
175      INTEGER ni(klon), knon, j      INTEGER ni(klon), knon, j
176    
177      REAL pctsrf_pot(klon, nbsrf)      REAL pctsrf_pot(klon, nbsrf)
178      ! "pourcentage potentiel" pour tenir compte des éventuelles      ! "pourcentage potentiel" pour tenir compte des \'eventuelles
179      ! apparitions ou disparitions de la glace de mer      ! apparitions ou disparitions de la glace de mer
180    
181      REAL zx_alf1, zx_alf2 !valeur ambiante par extrapola.      REAL yt2m(klon), yq2m(klon), wind10m(klon)
182        REAL ustar(klon)
     ! 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)  
   
     REAL yt2m(klon), yq2m(klon), yu10m(klon)  
     REAL yustar(klon)  
     ! -- LOOP  
     REAL yu10mx(klon)  
     REAL yu10my(klon)  
     REAL ywindsp(klon)  
     ! -- LOOP  
183    
184      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  
185      REAL ypblh(klon)      REAL ypblh(klon)
186      REAL ylcl(klon)      REAL ylcl(klon)
187      REAL ycapcl(klon)      REAL ycapcl(klon)
# Line 262  contains Line 189  contains
189      REAL ycteicl(klon)      REAL ycteicl(klon)
190      REAL ypblt(klon)      REAL ypblt(klon)
191      REAL ytherm(klon)      REAL ytherm(klon)
192      REAL ytrmb1(klon)      REAL u1(klon), v1(klon)
     REAL ytrmb2(klon)  
     REAL ytrmb3(klon)  
     REAL y_cd_h(klon), y_cd_m(klon)  
     REAL uzon(klon), vmer(klon)  
193      REAL tair1(klon), qair1(klon), tairsol(klon)      REAL tair1(klon), qair1(klon), tairsol(klon)
194      REAL psfce(klon), patm(klon)      REAL psfce(klon), patm(klon)
195        REAL zgeo1(klon)
     REAL qairsol(klon), zgeo1(klon)  
196      REAL rugo1(klon)      REAL rugo1(klon)
197        REAL zgeop(klon, klev)
     ! utiliser un jeu de fonctions simples                
     LOGICAL zxli  
     PARAMETER (zxli=.FALSE.)  
   
     REAL zt, zqs, zdelta, zcor  
     REAL t_coup  
     PARAMETER (t_coup=273.15)  
   
     CHARACTER (len=20) :: modname = 'clmain'  
198    
199      !------------------------------------------------------------      !------------------------------------------------------------
200    
201      ytherm = 0.      albsol = sum(falbe * pctsrf, dim = 2)
202    
203      IF (debugindex .AND. first_appel) THEN      ! R\'epartition sous maille des flux longwave et shortwave
204         first_appel = .FALSE.      ! R\'epartition du longwave par sous-surface lin\'earis\'ee
205    
206         ! initialisation sorties netcdf      forall (nsrf = 1:nbsrf)
207           fsollw(:, nsrf) = sollw + 4. * RSIGMA * tsol**3 &
208                * (tsol - ftsol(:, nsrf))
209           fsolsw(:, nsrf) = solsw * (1. - falbe(:, nsrf)) / (1. - albsol)
210        END forall
211    
212         idayref = day_ini      ytherm = 0.
        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  
213    
214      DO k = 1, klev ! epaisseur de couche      DO k = 1, klev ! epaisseur de couche
215         DO i = 1, klon         DO i = 1, klon
216            delp(i, k) = paprs(i, k) - paprs(i, k+1)            delp(i, k) = paprs(i, k) - paprs(i, k + 1)
217         END DO         END DO
218      END DO      END DO
     DO i = 1, klon ! vent de la premiere couche  
        zx_alf1 = 1.0  
        zx_alf2 = 1.0 - zx_alf1  
        u1lay(i) = u(i, 1)*zx_alf1 + u(i, 2)*zx_alf2  
        v1lay(i) = v(i, 1)*zx_alf1 + v(i, 2)*zx_alf2  
     END DO  
219    
220      ! Initialization:      ! Initialization:
221      rugmer = 0.      rugmer = 0.
# Line 334  contains Line 223  contains
223      cdragm = 0.      cdragm = 0.
224      dflux_t = 0.      dflux_t = 0.
225      dflux_q = 0.      dflux_q = 0.
     zu1 = 0.  
     zv1 = 0.  
226      ypct = 0.      ypct = 0.
     yts = 0.  
     ysnow = 0.  
     yqsurf = 0.  
     yalb = 0.  
     yalblw = 0.  
     yrain_f = 0.  
     ysnow_f = 0.  
     yfder = 0.  
     ytaux = 0.  
     ytauy = 0.  
     ysolsw = 0.  
     ysollw = 0.  
     ysollwdown = 0.  
227      yrugos = 0.      yrugos = 0.
     yu1 = 0.  
     yv1 = 0.  
     yrads = 0.  
228      ypaprs = 0.      ypaprs = 0.
229      ypplay = 0.      ypplay = 0.
230      ydelp = 0.      ydelp = 0.
     yu = 0.  
     yv = 0.  
     yt = 0.  
     yq = 0.  
     pctsrf_new = 0.  
     y_flux_u = 0.  
     y_flux_v = 0.  
     !$$ PB  
     y_dflux_t = 0.  
     y_dflux_q = 0.  
     ytsoil = 999999.  
231      yrugoro = 0.      yrugoro = 0.
     ! -- LOOP  
     yu10mx = 0.  
     yu10my = 0.  
     ywindsp = 0.  
     ! -- LOOP  
232      d_ts = 0.      d_ts = 0.
     !§§§ PB  
     yfluxlat = 0.  
233      flux_t = 0.      flux_t = 0.
234      flux_q = 0.      flux_q = 0.
235      flux_u = 0.      flux_u = 0.
236      flux_v = 0.      flux_v = 0.
237        fluxlat = 0.
238      d_t = 0.      d_t = 0.
239      d_q = 0.      d_q = 0.
240      d_u = 0.      d_u = 0.
241      d_v = 0.      d_v = 0.
242      zcoefh = 0.      coefh = 0.
243        fqcalving = 0.
244      ! Boucler sur toutes les sous-fractions du sol:      run_off_lic = 0.
245    
246        ! Initialisation des "pourcentages potentiels". On consid\`ere ici qu'on
247        ! peut avoir potentiellement de la glace sur tout le domaine oc\'eanique
248        ! (\`a affiner).
249    
250      ! Initialisation des "pourcentages potentiels". On considère ici qu'on      pctsrf_pot(:, is_ter) = pctsrf(:, is_ter)
251      ! peut avoir potentiellement de la glace sur tout le domaine océanique      pctsrf_pot(:, is_lic) = pctsrf(:, is_lic)
     ! (à affiner)  
   
     pctsrf_pot = pctsrf  
252      pctsrf_pot(:, is_oce) = 1. - zmasq      pctsrf_pot(:, is_oce) = 1. - zmasq
253      pctsrf_pot(:, is_sic) = 1. - zmasq      pctsrf_pot(:, is_sic) = 1. - zmasq
254    
255        ! Tester si c'est le moment de lire le fichier:
256        if (mod(itap - 1, lmt_pas) == 0) then
257           CALL interfoce_lim(julien, pctsrf_new_oce, pctsrf_new_sic)
258        endif
259    
260        ! Boucler sur toutes les sous-fractions du sol:
261    
262      loop_surface: DO nsrf = 1, nbsrf      loop_surface: DO nsrf = 1, nbsrf
263         ! Chercher les indices :         ! Define ni and knon:
264          
265         ni = 0         ni = 0
266         knon = 0         knon = 0
267    
268         DO i = 1, klon         DO i = 1, klon
269            ! Pour déterminer le domaine à traiter, on utilise les surfaces            ! Pour d\'eterminer le domaine \`a traiter, on utilise les surfaces
270            ! "potentielles"            ! "potentielles"
271            IF (pctsrf_pot(i, nsrf) > epsfra) THEN            IF (pctsrf_pot(i, nsrf) > epsfra) THEN
272               knon = knon + 1               knon = knon + 1
# Line 410  contains Line 274  contains
274            END IF            END IF
275         END DO         END DO
276    
277         ! 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  
278            DO j = 1, knon            DO j = 1, knon
279               i = ni(j)               i = ni(j)
280               ytsoil(j, k) = ftsoil(i, k, nsrf)               ypct(j) = pctsrf(i, nsrf)
281                 yts(j) = ftsol(i, nsrf)
282                 snow(j) = fsnow(i, nsrf)
283                 yqsurf(j) = qsurf(i, nsrf)
284                 yalb(j) = falbe(i, nsrf)
285                 yrain_fall(j) = rain_fall(i)
286                 ysnow_fall(j) = snow_fall(i)
287                 yagesno(j) = agesno(i, nsrf)
288                 yrugos(j) = frugs(i, nsrf)
289                 yrugoro(j) = rugoro(i)
290                 yrads(j) = fsolsw(i, nsrf) + fsollw(i, nsrf)
291                 ypaprs(j, klev + 1) = paprs(i, klev + 1)
292                 y_run_off_lic_0(j) = run_off_lic_0(i)
293            END DO            END DO
        END DO  
        DO k = 1, klev  
           DO j = 1, knon  
              i = ni(j)  
              ypaprs(j, k) = paprs(i, k)  
              ypplay(j, k) = pplay(i, k)  
              ydelp(j, k) = delp(i, k)  
              yu(j, k) = u(i, k)  
              yv(j, k) = v(i, k)  
              yt(j, k) = t(i, k)  
              yq(j, k) = q(i, k)  
           END DO  
        END DO  
294    
295         ! calculer Cdrag et les coefficients d'echange            ! For continent, copy soil water content
296         CALL coefkz(nsrf, knon, ypaprs, ypplay, ksta, ksta_ter, yts,&            IF (nsrf == is_ter) yqsol(:knon) = qsol(ni(:knon))
             yrugos, yu, yv, yt, yq, yqsurf, ycoefm, ycoefh)  
        IF (iflag_pbl == 1) THEN  
           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))  
              END DO  
           END DO  
        END IF  
297    
298         ! on seuille ycoefm et ycoefh            ytsoil(:knon, :) = ftsoil(ni(:knon), :, nsrf)
        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)  
299    
300            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  
301               DO j = 1, knon               DO j = 1, knon
302                  i = ni(j)                  i = ni(j)
303                  yq2(j, k) = q2(i, k, nsrf)                  ypaprs(j, k) = paprs(i, k)
304                    ypplay(j, k) = pplay(i, k)
305                    ydelp(j, k) = delp(i, k)
306                    yu(j, k) = u(i, k)
307                    yv(j, k) = v(i, k)
308                    yt(j, k) = t(i, k)
309                    yq(j, k) = q(i, k)
310               END DO               END DO
311            END DO            END DO
312    
313            y_cd_m(1:knon) = ycoefm(1:knon, 1)            ! Calculer les géopotentiels de chaque couche:
           y_cd_h(1:knon) = ycoefh(1:knon, 1)  
           CALL ustarhb(knon, yu, yv, y_cd_m, yustar)  
314    
315            IF (prt_level>9) THEN            zgeop(:knon, 1) = RD * yt(:knon, 1) / (0.5 * (ypaprs(:knon, 1) &
316               PRINT *, 'USTAR = ', yustar                 + ypplay(:knon, 1))) * (ypaprs(:knon, 1) - ypplay(:knon, 1))
           END IF  
317    
318            ! iflag_pbl peut être utilisé comme longueur de mélange            DO k = 2, klev
319                 zgeop(:knon, k) = zgeop(:knon, k - 1) + RD * 0.5 &
320                      * (yt(:knon, k - 1) + yt(:knon, k)) / ypaprs(:knon, k) &
321                      * (ypplay(:knon, k - 1) - ypplay(:knon, k))
322              ENDDO
323    
324              CALL cdrag(nsrf, sqrt(yu(:knon, 1)**2 + yv(:knon, 1)**2), &
325                   yt(:knon, 1), yq(:knon, 1), zgeop(:knon, 1), ypaprs(:knon, 1), &
326                   yts(:knon), yqsurf(:knon), yrugos(:knon), ycdragm(:knon), &
327                   ycdragh(:knon))
328    
329              IF (iflag_pbl == 1) THEN
330                 ycdragm(:knon) = max(ycdragm(:knon), 0.)
331                 ycdragh(:knon) = max(ycdragh(:knon), 0.)
332              end IF
333    
334            IF (iflag_pbl >= 11) THEN            ! on met un seuil pour ycdragm et ycdragh
335               CALL vdif_kcay(knon, dtime, rg, rd, ypaprs, yt, yzlev, yzlay, &            IF (nsrf == is_oce) THEN
336                    yu, yv, yteta, y_cd_m, yq2, q2diag, ykmm, ykmn, yustar, &               ycdragm(:knon) = min(ycdragm(:knon), cdmmax)
337                    iflag_pbl)               ycdragh(:knon) = min(ycdragh(:knon), cdhmax)
           ELSE  
              CALL yamada4(knon, dtime, rg, yzlev, yzlay, yu, yv, yteta, &  
                   y_cd_m, yq2, ykmm, ykmn, ykmq, yustar, iflag_pbl)  
338            END IF            END IF
339    
340            ycoefm(1:knon, 1) = y_cd_m(1:knon)            IF (iflag_pbl >= 6) yq2(:knon, :) = q2(ni(:knon), :, nsrf)
341            ycoefh(1:knon, 1) = y_cd_h(1:knon)            call coef_diff_turb(nsrf, ni(:knon), ypaprs(:knon, :), &
342            ycoefm(1:knon, 2:klev) = ykmm(1:knon, 2:klev)                 ypplay(:knon, :), yu(:knon, :), yv(:knon, :), yq(:knon, :), &
343            ycoefh(1:knon, 2:klev) = ykmn(1:knon, 2:klev)                 yt(:knon, :), yts(:knon), ycdragm(:knon), zgeop(:knon, :), &
344         END IF                 ycoefm(:knon, :), ycoefh(:knon, :), yq2(:knon, :))
345              
346         ! calculer la diffusion des vitesses "u" et "v"            CALL clvent(yu(:knon, 1), yv(:knon, 1), ycoefm(:knon, :), &
347         CALL clvent(knon, dtime, yu1, yv1, ycoefm, yt, yu, ypaprs, ypplay, &                 ycdragm(:knon), yt(:knon, :), yu(:knon, :), ypaprs(:knon, :), &
348              ydelp, y_d_u, y_flux_u)                 ypplay(:knon, :), ydelp(:knon, :), y_d_u(:knon, :), &
349         CALL clvent(knon, dtime, yu1, yv1, ycoefm, yt, yv, ypaprs, ypplay, &                 y_flux_u(:knon))
350              ydelp, y_d_v, y_flux_v)            CALL clvent(yu(:knon, 1), yv(:knon, 1), ycoefm(:knon, :), &
351                   ycdragm(:knon), yt(:knon, :), yv(:knon, :), ypaprs(:knon, :), &
352         ! pour le couplage                 ypplay(:knon, :), ydelp(:knon, :), y_d_v(:knon, :), &
353         ytaux = y_flux_u(:, 1)                 y_flux_v(:knon))
354         ytauy = y_flux_v(:, 1)  
355              CALL clqh(julien, nsrf, ni(:knon), ytsoil(:knon, :), yqsol(:knon), &
356         ! calculer la diffusion de "q" et de "h"                 mu0(ni(:knon)), yrugos(:knon), yrugoro(:knon), yu(:knon, 1), &
357         CALL clqh(dtime, itap, date0, jour, debut, lafin, rlon, rlat,&                 yv(:knon, 1), ycoefh(:knon, :), ycdragh(:knon), yt(:knon, :), &
358              cufi, cvfi, knon, nsrf, ni, pctsrf, soil_model, ytsoil,&                 yq(:knon, :), yts(:knon), ypaprs(:knon, :), ypplay(:knon, :), &
359              yqsol, ok_veget, ocean, npas, nexca, rmu0, co2_ppm, yrugos,&                 ydelp(:knon, :), yrads(:knon), yalb(:knon), snow(:knon), &
360              yrugoro, yu1, yv1, ycoefh, yt, yq, yts, ypaprs, ypplay,&                 yqsurf(:knon), yrain_fall(:knon), ysnow_fall(:knon), &
361              ydelp, yrads, yalb, yalblw, ysnow, yqsurf, yrain_f, ysnow_f, &                 yfluxlat(:knon), pctsrf_new_sic(ni(:knon)), yagesno(:knon), &
362              yfder, ytaux, ytauy, ywindsp, ysollw, ysollwdown, ysolsw,&                 y_d_t(:knon, :), y_d_q(:knon, :), y_d_ts(:knon), &
363              yfluxlat, pctsrf_new, yagesno, y_d_t, y_d_q, y_d_ts,&                 yz0_new(:knon), y_flux_t(:knon), y_flux_q(:knon), &
364              yz0_new, y_flux_t, y_flux_q, y_dflux_t, y_dflux_q,&                 y_dflux_t(:knon), y_dflux_q(:knon), y_fqcalving(:knon), &
365              y_fqcalving, y_ffonte, y_run_off_lic_0, y_flux_o, y_flux_g,&                 y_ffonte(:knon), y_run_off_lic_0(:knon), y_run_off_lic(:knon))
             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  
366    
367         DO k = 1, klev            ! calculer la longueur de rugosite sur ocean
           DO j = 1, knon  
              i = ni(j)  
              ycoefh(j, k) = ycoefh(j, k)*ypct(j)  
              ycoefm(j, k) = ycoefm(j, k)*ypct(j)  
              y_d_t(j, k) = y_d_t(j, k)*ypct(j)  
              y_d_q(j, k) = y_d_q(j, k)*ypct(j)  
              flux_t(i, k, nsrf) = y_flux_t(j, k)  
              flux_q(i, k, nsrf) = y_flux_q(j, k)  
              flux_u(i, k, nsrf) = y_flux_u(j, k)  
              flux_v(i, k, nsrf) = y_flux_v(j, k)  
              y_d_u(j, k) = y_d_u(j, k)*ypct(j)  
              y_d_v(j, k) = y_d_v(j, k)*ypct(j)  
           END DO  
        END DO  
368    
369         evap(:, nsrf) = -flux_q(:, 1, nsrf)            yrugm = 0.
370    
        albe(:, nsrf) = 0.  
        alblw(:, nsrf) = 0.  
        snow(:, nsrf) = 0.  
        qsurf(:, nsrf) = 0.  
        rugos(:, nsrf) = 0.  
        fluxlat(:, nsrf) = 0.  
        DO j = 1, knon  
           i = ni(j)  
           d_ts(i, nsrf) = y_d_ts(j)  
           albe(i, nsrf) = yalb(j)  
           alblw(i, nsrf) = yalblw(j)  
           snow(i, nsrf) = ysnow(j)  
           qsurf(i, nsrf) = yqsurf(j)  
           rugos(i, nsrf) = yz0_new(j)  
           fluxlat(i, nsrf) = yfluxlat(j)  
371            IF (nsrf == is_oce) THEN            IF (nsrf == is_oce) THEN
372               rugmer(i) = yrugm(j)               DO j = 1, knon
373               rugos(i, nsrf) = yrugm(j)                  yrugm(j) = 0.018 * ycdragm(j) * (yu(j, 1)**2 + yv(j, 1)**2) &
374                         / rg + 0.11 * 14E-6 &
375                         / sqrt(ycdragm(j) * (yu(j, 1)**2 + yv(j, 1)**2))
376                    yrugm(j) = max(1.5E-05, yrugm(j))
377                 END DO
378            END IF            END IF
           agesno(i, nsrf) = yagesno(j)  
           fqcalving(i, nsrf) = y_fqcalving(j)  
           ffonte(i, nsrf) = y_ffonte(j)  
           cdragh(i) = cdragh(i) + ycoefh(j, 1)  
           cdragm(i) = cdragm(i) + ycoefm(j, 1)  
           dflux_t(i) = dflux_t(i) + y_dflux_t(j)  
           dflux_q(i) = dflux_q(i) + y_dflux_q(j)  
           zu1(i) = zu1(i) + yu1(j)  
           zv1(i) = zv1(i) + yv1(j)  
        END DO  
        IF (nsrf == is_ter) THEN  
           DO j = 1, knon  
              i = ni(j)  
              qsol(i) = yqsol(j)  
           END DO  
        END IF  
        IF (nsrf == is_lic) THEN  
           DO j = 1, knon  
              i = ni(j)  
              run_off_lic_0(i) = y_run_off_lic_0(j)  
           END DO  
        END IF  
        !$$$ PB ajout pour soil  
        ftsoil(:, :, nsrf) = 0.  
        DO k = 1, nsoilmx  
           DO j = 1, knon  
              i = ni(j)  
              ftsoil(i, k, nsrf) = ytsoil(j, k)  
           END DO  
        END DO  
379    
        DO j = 1, knon  
           i = ni(j)  
380            DO k = 1, klev            DO k = 1, klev
381               d_t(i, k) = d_t(i, k) + y_d_t(j, k)               DO j = 1, knon
382               d_q(i, k) = d_q(i, k) + y_d_q(j, k)                  i = ni(j)
383               d_u(i, k) = d_u(i, k) + y_d_u(j, k)                  y_d_t(j, k) = y_d_t(j, k) * ypct(j)
384               d_v(i, k) = d_v(i, k) + y_d_v(j, k)                  y_d_q(j, k) = y_d_q(j, k) * ypct(j)
385               zcoefh(i, k) = zcoefh(i, k) + ycoefh(j, k)                  y_d_u(j, k) = y_d_u(j, k) * ypct(j)
386                    y_d_v(j, k) = y_d_v(j, k) * ypct(j)
387                 END DO
388            END DO            END DO
        END DO  
389    
390         !cc diagnostic t, q a 2m et u, v a 10m            flux_t(ni(:knon), nsrf) = y_flux_t(:knon)
391              flux_q(ni(:knon), nsrf) = y_flux_q(:knon)
392         DO j = 1, knon            flux_u(ni(:knon), nsrf) = y_flux_u(:knon)
393            i = ni(j)            flux_v(ni(:knon), nsrf) = y_flux_v(:knon)
394            uzon(j) = yu(j, 1) + y_d_u(j, 1)  
395            vmer(j) = yv(j, 1) + y_d_v(j, 1)            falbe(:, nsrf) = 0.
396            tair1(j) = yt(j, 1) + y_d_t(j, 1)            fsnow(:, nsrf) = 0.
397            qair1(j) = yq(j, 1) + y_d_q(j, 1)            qsurf(:, nsrf) = 0.
398            zgeo1(j) = rd*tair1(j)/(0.5*(ypaprs(j, 1)+ypplay(j, &            frugs(:, nsrf) = 0.
399                 1)))*(ypaprs(j, 1)-ypplay(j, 1))            DO j = 1, knon
400            tairsol(j) = yts(j) + y_d_ts(j)               i = ni(j)
401            rugo1(j) = yrugos(j)               d_ts(i, nsrf) = y_d_ts(j)
402            IF (nsrf == is_oce) THEN               falbe(i, nsrf) = yalb(j)
403               rugo1(j) = rugos(i, nsrf)               fsnow(i, nsrf) = snow(j)
404                 qsurf(i, nsrf) = yqsurf(j)
405                 frugs(i, nsrf) = yz0_new(j)
406                 fluxlat(i, nsrf) = yfluxlat(j)
407                 IF (nsrf == is_oce) THEN
408                    rugmer(i) = yrugm(j)
409                    frugs(i, nsrf) = yrugm(j)
410                 END IF
411                 agesno(i, nsrf) = yagesno(j)
412                 fqcalving(i, nsrf) = y_fqcalving(j)
413                 ffonte(i, nsrf) = y_ffonte(j)
414                 cdragh(i) = cdragh(i) + ycdragh(j) * ypct(j)
415                 cdragm(i) = cdragm(i) + ycdragm(j) * ypct(j)
416                 dflux_t(i) = dflux_t(i) + y_dflux_t(j) * ypct(j)
417                 dflux_q(i) = dflux_q(i) + y_dflux_q(j) * ypct(j)
418              END DO
419              IF (nsrf == is_ter) THEN
420                 qsol(ni(:knon)) = yqsol(:knon)
421              else IF (nsrf == is_lic) THEN
422                 DO j = 1, knon
423                    i = ni(j)
424                    run_off_lic_0(i) = y_run_off_lic_0(j)
425                    run_off_lic(i) = y_run_off_lic(j)
426                 END DO
427            END IF            END IF
           psfce(j) = ypaprs(j, 1)  
           patm(j) = ypplay(j, 1)  
428    
429            qairsol(j) = yqsurf(j)            ftsoil(:, :, nsrf) = 0.
430         END DO            ftsoil(ni(:knon), :, nsrf) = ytsoil(:knon, :)
431    
432         CALL stdlevvar(klon, knon, nsrf, zxli, uzon, vmer, tair1, qair1, zgeo1, &            DO j = 1, knon
433              tairsol, qairsol, rugo1, psfce, patm, yt2m, yq2m, yt10m, yq10m, &               i = ni(j)
434              yu10m, yustar)               DO k = 1, klev
435                    d_t(i, k) = d_t(i, k) + y_d_t(j, k)
436         DO j = 1, knon                  d_q(i, k) = d_q(i, k) + y_d_q(j, k)
437            i = ni(j)                  d_u(i, k) = d_u(i, k) + y_d_u(j, k)
438            t2m(i, nsrf) = yt2m(j)                  d_v(i, k) = d_v(i, k) + y_d_v(j, k)
439            q2m(i, nsrf) = yq2m(j)               END DO
440              END DO
           ! 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)  
441    
442         END DO            forall (k = 2:klev) coefh(ni(:knon), k) &
443                   = coefh(ni(:knon), k) + ycoefh(:knon, k) * ypct(:knon)
444    
445         DO i = 1, knon            ! diagnostic t, q a 2m et u, v a 10m
           y_cd_h(i) = ycoefh(i, 1)  
           y_cd_m(i) = ycoefm(i, 1)  
        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  
446    
447         DO j = 1, knon            DO j = 1, knon
           DO k = 1, klev + 1  
448               i = ni(j)               i = ni(j)
449               q2(i, k, nsrf) = yq2(j, k)               u1(j) = yu(j, 1) + y_d_u(j, 1)
450                 v1(j) = yv(j, 1) + y_d_v(j, 1)
451                 tair1(j) = yt(j, 1) + y_d_t(j, 1)
452                 qair1(j) = yq(j, 1) + y_d_q(j, 1)
453                 zgeo1(j) = rd * tair1(j) / (0.5 * (ypaprs(j, 1) + ypplay(j, &
454                      1))) * (ypaprs(j, 1)-ypplay(j, 1))
455                 tairsol(j) = yts(j) + y_d_ts(j)
456                 rugo1(j) = yrugos(j)
457                 IF (nsrf == is_oce) THEN
458                    rugo1(j) = frugs(i, nsrf)
459                 END IF
460                 psfce(j) = ypaprs(j, 1)
461                 patm(j) = ypplay(j, 1)
462            END DO            END DO
463         END DO  
464         !IM "slab" ocean            CALL stdlevvar(nsrf, u1(:knon), v1(:knon), tair1(:knon), qair1, &
465         IF (nsrf == is_oce) THEN                 zgeo1, tairsol, yqsurf(:knon), rugo1, psfce, patm, yt2m, yq2m, &
466                   yt10m, yq10m, wind10m(:knon), ustar(:knon))
467    
468            DO j = 1, knon            DO j = 1, knon
              ! on projette sur la grille globale  
469               i = ni(j)               i = ni(j)
470               IF (pctsrf_new(i, is_oce)>epsfra) THEN               t2m(i, nsrf) = yt2m(j)
471                  flux_o(i) = y_flux_o(j)               q2m(i, nsrf) = yq2m(j)
472               ELSE  
473                  flux_o(i) = 0.               u10m_srf(i, nsrf) = (wind10m(j) * u1(j)) &
474               END IF                    / sqrt(u1(j)**2 + v1(j)**2)
475                 v10m_srf(i, nsrf) = (wind10m(j) * v1(j)) &
476                      / sqrt(u1(j)**2 + v1(j)**2)
477            END DO            END DO
        END IF  
478    
479         IF (nsrf == is_sic) THEN            CALL hbtm(ypaprs, ypplay, yt2m, yq2m, ustar(:knon), y_flux_t(:knon), &
480                   y_flux_q(:knon), yu(:knon, :), yv(:knon, :), yt(:knon, :), &
481                   yq(:knon, :), ypblh(:knon), ycapcl, yoliqcl, ycteicl, ypblt, &
482                   ytherm, ylcl)
483    
484            DO j = 1, knon            DO j = 1, knon
485               i = ni(j)               i = ni(j)
486               ! On pondère lorsque l'on fait le bilan au sol :               pblh(i, nsrf) = ypblh(j)
487               IF (pctsrf_new(i, is_sic)>epsfra) THEN               plcl(i, nsrf) = ylcl(j)
488                  flux_g(i) = y_flux_g(j)               capcl(i, nsrf) = ycapcl(j)
489               ELSE               oliqcl(i, nsrf) = yoliqcl(j)
490                  flux_g(i) = 0.               cteicl(i, nsrf) = ycteicl(j)
491               END IF               pblt(i, nsrf) = ypblt(j)
492                 therm(i, nsrf) = ytherm(j)
493            END DO            END DO
494    
495         END IF            IF (iflag_pbl >= 6) q2(ni(:knon), :, nsrf) = yq2(:knon, :)
496         IF (ocean == 'slab  ') THEN         else
497            IF (nsrf == is_oce) THEN            fsnow(:, nsrf) = 0.
498               tslab(1:klon) = ytslab(1:klon)         end IF if_knon
              seaice(1:klon) = y_seaice(1:klon)  
           END IF  
        END IF  
499      END DO loop_surface      END DO loop_surface
500    
501      ! On utilise les nouvelles surfaces      ! On utilise les nouvelles surfaces
502        frugs(:, is_oce) = rugmer
503        pctsrf(:, is_oce) = pctsrf_new_oce
504        pctsrf(:, is_sic) = pctsrf_new_sic
505    
506      rugos(:, is_oce) = rugmer      CALL histwrite_phy("run_off_lic", run_off_lic)
     pctsrf = pctsrf_new  
507    
508    END SUBROUTINE clmain    END SUBROUTINE pbl_surface
509    
510  end module clmain_m  end module pbl_surface_m

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

  ViewVC Help
Powered by ViewVC 1.1.21