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

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

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

trunk/libf/phylmd/clmain.f90 revision 47 by guez, Fri Jul 1 15:00:48 2011 UTC trunk/Sources/phylmd/clmain.f revision 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).  
   
     ! Arguments:  
     ! dtime----input-R- interval du temps (secondes)  
     ! itap-----input-I- numero du pas de temps  
     ! date0----input-R- jour initial  
     ! t--------input-R- temperature (K)  
     ! q--------input-R- vapeur d'eau (kg/kg)  
     ! u--------input-R- vitesse u  
     ! v--------input-R- vitesse v  
     ! ts-------input-R- temperature du sol (en Kelvin)  
     ! paprs----input-R- pression a intercouche (Pa)  
     ! pplay----input-R- pression au milieu de couche (Pa)  
     ! radsol---input-R- flux radiatif net (positif vers le sol) en W/m**2  
     ! rlat-----input-R- latitude en degree  
     ! rugos----input-R- longeur de rugosite (en m)  
     ! cufi-----input-R- resolution des mailles en x (m)  
     ! cvfi-----input-R- resolution des mailles en y (m)  
28    
29      ! d_t------output-R- le changement pour "t"      use clqh_m, only: clqh
30      ! d_q------output-R- le changement pour "q"      use clvent_m, only: clvent
     ! d_u------output-R- le changement pour "u"  
     ! d_v------output-R- le changement pour "v"  
     ! d_ts-----output-R- le changement pour "ts"  
     ! flux_t---output-R- flux de chaleur sensible (CpT) J/m**2/s (W/m**2)  
     !                    (orientation positive vers le bas)  
     ! flux_q---output-R- flux de vapeur d'eau (kg/m**2/s)  
     ! 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  
     ! dflux_t derive du flux sensible  
     ! dflux_q derive du flux latent  
     !IM "slab" ocean  
     ! flux_g---output-R-  flux glace (pour OCEAN='slab  ')  
     ! flux_o---output-R-  flux ocean (pour OCEAN='slab  ')  
   
     ! tslab-in/output-R temperature du slab ocean (en Kelvin)  
     ! uniqmnt pour slab  
   
     ! seaice---output-R-  glace de mer (kg/m2) (pour OCEAN='slab  ')  
     !cc  
     ! ffonte----Flux thermique utilise pour fondre la neige  
     ! fqcalving-Flux d'eau "perdue" par la surface et necessaire pour limiter la  
     !           hauteur de neige, en kg/m2/s  
     ! on rajoute en output yu1 et yv1 qui sont les vents dans  
     ! la premiere couche  
     ! ces 4 variables sont maintenant traites dans phytrac  
     ! itr--------input-I- nombre de traceurs  
     ! tr---------input-R- q. de traceurs  
     ! flux_surf--input-R- flux de traceurs a la surface  
     ! d_tr-------output-R tendance de traceurs  
     !IM cf. AM : PBL  
     ! trmb1-------deep_cape  
     ! trmb2--------inhibition  
     ! trmb3-------Point Omega  
     ! Cape(klon)-------Cape du thermique  
     ! EauLiq(klon)-------Eau liqu integr du thermique  
     ! ctei(klon)-------Critere d'instab d'entrainmt des nuages de CL  
     ! lcl------- Niveau de condensation  
     ! pblh------- HCL  
     ! pblT------- T au nveau HCL  
   
     use calendar, ONLY : ymds2ju  
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      REAL, INTENT (IN) :: dtime      REAL, INTENT(IN):: dtime ! interval du temps (secondes)
48      REAL date0  
49      INTEGER, INTENT (IN) :: itap      REAL, INTENT(inout):: pctsrf(klon, nbsrf)
50      REAL t(klon, klev), q(klon, klev)      ! tableau des pourcentages de surface de chaque maille
     REAL, INTENT (IN):: u(klon, klev), v(klon, klev)  
     REAL, INTENT (IN):: paprs(klon, klev+1)  
     REAL, INTENT (IN):: pplay(klon, klev)  
     REAL, INTENT (IN):: rlon(klon), rlat(klon)  
     REAL cufi(klon), cvfi(klon)  
     REAL d_t(klon, klev), d_q(klon, klev)  
     REAL d_u(klon, klev), d_v(klon, klev)  
     REAL flux_t(klon, klev, nbsrf), flux_q(klon, klev, nbsrf)  
     REAL dflux_t(klon), dflux_q(klon)  
     !IM "slab" ocean  
     REAL flux_o(klon), flux_g(klon)  
     REAL y_flux_o(klon), y_flux_g(klon)  
     REAL tslab(klon), ytslab(klon)  
     REAL seaice(klon), y_seaice(klon)  
     REAL y_fqcalving(klon), y_ffonte(klon)  
     REAL fqcalving(klon, nbsrf), ffonte(klon, nbsrf)  
     REAL run_off_lic_0(klon), y_run_off_lic_0(klon)  
51    
52      REAL flux_u(klon, klev, nbsrf), flux_v(klon, klev, nbsrf)      REAL, INTENT(IN):: t(klon, klev) ! temperature (K)
53      REAL rugmer(klon), agesno(klon, nbsrf)      REAL, INTENT(IN):: q(klon, klev) ! vapeur d'eau (kg / kg)
54      REAL, INTENT (IN) :: rugoro(klon)      REAL, INTENT(IN):: u(klon, klev), v(klon, klev) ! vitesse
55      REAL cdragh(klon), cdragm(klon)      INTEGER, INTENT(IN):: julien ! jour de l'annee en cours
56      ! jour de l'annee en cours                      REAL, intent(in):: mu0(klon) ! cosinus de l'angle solaire zenithal    
57      INTEGER jour      REAL, INTENT(IN):: ftsol(:, :) ! (klon, nbsrf) temp\'erature du sol (en K)
58      REAL rmu0(klon) ! cosinus de l'angle solaire zenithal          REAL, INTENT(IN):: cdmmax, cdhmax ! seuils cdrm, cdrh
59      ! taux CO2 atmosphere                          REAL, INTENT(IN):: ksta, ksta_ter
60      REAL co2_ppm      LOGICAL, INTENT(IN):: ok_kzmin
61      LOGICAL, INTENT (IN) :: debut  
62      LOGICAL, INTENT (IN) :: lafin      REAL, INTENT(inout):: ftsoil(klon, nsoilmx, nbsrf)
63      LOGICAL ok_veget      ! soil temperature of surface fraction
64      CHARACTER (len=*), INTENT (IN) :: ocean  
65      INTEGER npas, nexca      REAL, INTENT(inout):: qsol(:) ! (klon)
66        ! column-density of water in soil, in kg m-2
67      REAL pctsrf(klon, nbsrf)  
68      REAL ts(klon, nbsrf)      REAL, INTENT(IN):: paprs(klon, klev + 1) ! pression a intercouche (Pa)
69      REAL d_ts(klon, nbsrf)      REAL, INTENT(IN):: pplay(klon, klev) ! pression au milieu de couche (Pa)
70      REAL snow(klon, nbsrf)      REAL, INTENT(inout):: fsnow(:, :) ! (klon, nbsrf) \'epaisseur neigeuse
71      REAL qsurf(klon, nbsrf)      REAL qsurf(klon, nbsrf)
72      REAL evap(klon, nbsrf)      REAL evap(klon, nbsrf)
73      REAL albe(klon, nbsrf)      REAL, intent(inout):: falbe(klon, nbsrf)
74      REAL alblw(klon, nbsrf)      REAL, intent(out):: fluxlat(:, :) ! (klon, nbsrf)
75    
76      REAL fluxlat(klon, nbsrf)      REAL, intent(in):: rain_fall(klon)
77        ! liquid water mass flux (kg / m2 / s), positive down
78    
79      REAL rain_f(klon), snow_f(klon)      REAL, intent(in):: snow_f(klon)
80      REAL fder(klon)      ! solid water mass flux (kg / m2 / s), positive down
81    
82      REAL sollw(klon, nbsrf), solsw(klon, nbsrf), sollwdown(klon)      REAL, INTENT(IN):: fsolsw(klon, nbsrf), fsollw(klon, nbsrf)
83      REAL rugos(klon, nbsrf)      REAL, intent(inout):: frugs(klon, nbsrf) ! longueur de rugosit\'e (en m)
84      ! la nouvelle repartition des surfaces sortie de l'interface      real agesno(klon, nbsrf)
85      REAL pctsrf_new(klon, nbsrf)      REAL, INTENT(IN):: rugoro(klon)
86    
87      REAL zcoefh(klon, klev)      REAL d_t(klon, klev), d_q(klon, klev)
88      REAL zu1(klon)      ! d_t------output-R- le changement pour "t"
89      REAL zv1(klon)      ! d_q------output-R- le changement pour "q"
90    
91      !$$$ PB ajout pour soil      REAL, intent(out):: d_u(klon, klev), d_v(klon, klev)
92      LOGICAL, INTENT (IN) :: soil_model      ! changement pour "u" et "v"
     !IM ajout seuils cdrm, cdrh  
     REAL cdmmax, cdhmax  
93    
94      REAL ksta, ksta_ter      REAL, intent(out):: d_ts(:, :) ! (klon, nbsrf) variation of ftsol
     LOGICAL ok_kzmin  
95    
96      REAL ftsoil(klon, nsoilmx, nbsrf)      REAL, intent(out):: flux_t(klon, nbsrf)
97      REAL ytsoil(klon, nsoilmx)      ! flux de chaleur sensible (Cp T) (W / m2) (orientation positive vers
98      REAL qsol(klon)      ! 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
111        ! dflux_q derive du flux latent
112        ! IM "slab" ocean
113    
114        REAL, intent(out):: ycoefh(klon, klev)
115        REAL, intent(out):: zu1(klon), zv1(klon)
116        REAL, INTENT(inout):: t2m(klon, nbsrf), q2m(klon, nbsrf)
117    
118        REAL, INTENT(inout):: u10m_srf(:, :), v10m_srf(:, :) ! (klon, nbsrf)
119        ! composantes du vent \`a 10m sans spirale d'Ekman
120    
121        ! Ionela Musat. Cf. Anne Mathieu : planetary boundary layer, hbtm.
122        ! Comme les autres diagnostics on cumule dans physiq ce qui permet
123        ! 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)
138        ! ffonte----Flux thermique utilise pour fondre la neige
139        ! fqcalving-Flux d'eau "perdue" par la surface et necessaire pour limiter la
140        !           hauteur de neige, en kg / m2 / s
141        REAL run_off_lic_0(klon)
142    
143        ! Local:
144    
145      EXTERNAL clqh, clvent, calbeta, cltrac      LOGICAL:: firstcal = .true.
146    
147        ! la nouvelle repartition des surfaces sortie de l'interface
148        REAL, save:: pctsrf_new_oce(klon)
149        REAL, save:: pctsrf_new_sic(klon)
150    
151        REAL y_fqcalving(klon), y_ffonte(klon)
152        real y_run_off_lic_0(klon)
153        REAL rugmer(klon)
154        REAL ytsoil(klon, nsoilmx)
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)  
     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)  
     REAL plcl(klon, nbsrf)  
     REAL capcl(klon, nbsrf)  
     REAL oliqcl(klon, nbsrf)  
     REAL cteicl(klon, nbsrf)  
     REAL pblt(klon, nbsrf)  
     REAL therm(klon, nbsrf)  
     REAL trmb1(klon, nbsrf)  
     REAL trmb2(klon, nbsrf)  
     REAL trmb3(klon, nbsrf)  
199      REAL ypblh(klon)      REAL ypblh(klon)
200      REAL ylcl(klon)      REAL ylcl(klon)
201      REAL ycapcl(klon)      REAL ycapcl(klon)
# Line 280  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 292  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 352  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 376  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.
264    
265      ! Boucler sur toutes les sous-fractions du sol:      ! Initialisation des "pourcentages potentiels". On consid\`ere ici qu'on
266        ! peut avoir potentiellement de la glace sur tout le domaine oc\'eanique
267        ! (\`a affiner)
268    
269      ! Initialisation des "pourcentages potentiels". On considère ici qu'on      pctsrf_pot(:, is_ter) = pctsrf(:, is_ter)
270      ! peut avoir potentiellement de la glace sur tout le domaine océanique      pctsrf_pot(:, is_lic) = pctsrf(:, is_lic)
     ! (à affiner)  
   
     pctsrf_pot = pctsrf  
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      DO nsrf = 1, nbsrf      ! Tester si c'est le moment de lire le fichier:
275         ! chercher les indices:      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
282           ! 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 425  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  
295            DO j = 1, knon            DO j = 1, knon
296               i = ni(j)               i = ni(j)
297               ytsoil(j, k) = ftsoil(i, k, nsrf)               ypct(j) = pctsrf(i, nsrf)
298                 yts(j) = ftsol(i, nsrf)
299                 snow(j) = fsnow(i, nsrf)
300                 yqsurf(j) = qsurf(i, nsrf)
301                 yalb(j) = falbe(i, nsrf)
302                 yrain_f(j) = rain_fall(i)
303                 ysnow_f(j) = snow_f(i)
304                 yagesno(j) = agesno(i, nsrf)
305                 yrugos(j) = frugs(i, nsrf)
306                 yrugoro(j) = rugoro(i)
307                 u1lay(j) = u(i, 1)
308                 v1lay(j) = v(i, 1)
309                 yrads(j) = fsolsw(i, nsrf) + fsollw(i, nsrf)
310                 ypaprs(j, klev + 1) = paprs(i, klev + 1)
311                 y_run_off_lic_0(j) = run_off_lic_0(i)
312            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  
313    
314         ! calculer Cdrag et les coefficients d'echange            ! For continent, copy soil water content
315         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  
   
        ! on seuille ycoefm et ycoefh  
        IF (nsrf == is_oce) THEN  
           DO j = 1, knon  
              ycoefm(j, 1) = min(ycoefm(j, 1), cdmmax)  
              ycoefh(j, 1) = min(ycoefh(j, 1), cdhmax)  
           END DO  
        END IF  
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)  
318    
319            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  
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
              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  
387    
388         evap(:, nsrf) = -flux_q(:, 1, nsrf)               ! iflag_pbl peut \^etre utilis\'e comme longueur de m\'elange
389    
390                 IF (iflag_pbl >= 11) THEN
391                    CALL vdif_kcay(knon, dtime, rg, ypaprs, yzlev, yzlay, yu, yv, &
392                         yteta, coefm(:knon, 1), yq2, q2diag, ykmm, ykmn, yustar, &
393                         iflag_pbl)
394                 ELSE
395                    CALL yamada4(knon, dtime, rg, yzlev, yzlay, yu, yv, yteta, &
396                         coefm(:knon, 1), yq2, ykmm, ykmn, ykmq, yustar, iflag_pbl)
397                 END IF
398    
399                 coefm(:knon, 2:) = ykmm(:knon, 2:klev)
400                 coefh(:knon, 2:) = ykmn(:knon, 2:klev)
401              END IF
402    
403         albe(:, nsrf) = 0.            ! calculer la diffusion des vitesses "u" et "v"
404         alblw(:, nsrf) = 0.            CALL clvent(knon, dtime, u1lay(:knon), v1lay(:knon), &
405         snow(:, nsrf) = 0.                 coefm(:knon, :), yt, yu, ypaprs, ypplay, ydelp, y_d_u, &
406         qsurf(:, nsrf) = 0.                 y_flux_u(:knon))
407         rugos(:, nsrf) = 0.            CALL clvent(knon, dtime, u1lay(:knon), v1lay(:knon), &
408         fluxlat(:, nsrf) = 0.                 coefm(:knon, :), yt, yv, ypaprs, ypplay, ydelp, y_d_v, &
409         DO j = 1, knon                 y_flux_v(:knon))
410            i = ni(j)  
411            d_ts(i, nsrf) = y_d_ts(j)            ! calculer la diffusion de "q" et de "h"
412            albe(i, nsrf) = yalb(j)            CALL clqh(dtime, julien, firstcal, nsrf, ni(:knon), &
413            alblw(i, nsrf) = yalblw(j)                 ytsoil(:knon, :), yqsol(:knon), mu0, yrugos, yrugoro, &
414            snow(i, nsrf) = ysnow(j)                 u1lay(:knon), v1lay(:knon), coefh(:knon, :), yt, yq, &
415            qsurf(i, nsrf) = yqsurf(j)                 yts(:knon), ypaprs, ypplay, ydelp, yrads(:knon), yalb(:knon), &
416            rugos(i, nsrf) = yz0_new(j)                 snow(:knon), yqsurf, yrain_f, ysnow_f, yfluxlat(:knon), &
417            fluxlat(i, nsrf) = yfluxlat(j)                 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              ! calculer la longueur de rugosite sur ocean
422              yrugm = 0.
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  
           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  
431            DO j = 1, knon            DO j = 1, knon
432               i = ni(j)               y_dflux_t(j) = y_dflux_t(j) * ypct(j)
433               ftsoil(i, k, nsrf) = ytsoil(j, k)               y_dflux_q(j) = y_dflux_q(j) * ypct(j)
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      END DO            fsnow(:, nsrf) = 0.
566           end IF if_knon
567        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.47  
changed lines
  Added in v.225

  ViewVC Help
Powered by ViewVC 1.1.21