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

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

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

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

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

  ViewVC Help
Powered by ViewVC 1.1.21