/[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 62 by guez, Thu Jul 26 14:37:37 2012 UTC trunk/Sources/phylmd/clmain.f revision 191 by guez, Mon May 9 19:56:28 2016 UTC
# Line 4  module clmain_m Line 4  module clmain_m
4    
5  contains  contains
6    
7    SUBROUTINE clmain(dtime, itap, date0, pctsrf, pctsrf_new, t, q, u, v, &    SUBROUTINE clmain(dtime, pctsrf, pctsrf_new, t, q, u, v, jour, rmu0, ts, &
8         jour, rmu0, co2_ppm, ok_veget, ocean, npas, nexca, ts, &         cdmmax, cdhmax, ksta, ksta_ter, ok_kzmin, ftsoil, qsol, paprs, pplay, &
9         soil_model, cdmmax, cdhmax, ksta, ksta_ter, ok_kzmin, ftsoil, &         snow, qsurf, evap, falbe, fluxlat, rain_fall, snow_f, solsw, sollw, &
10         qsol, paprs, pplay, snow, qsurf, evap, albe, alblw, fluxlat, &         fder, rlat, rugos, firstcal, agesno, rugoro, d_t, d_q, d_u, d_v, d_ts, &
11         rain_fall, snow_f, solsw, sollw, sollwdown, fder, rlon, rlat, cufi, &         flux_t, flux_q, flux_u, flux_v, cdragh, cdragm, q2, dflux_t, dflux_q, &
12         cvfi, rugos, debut, lafin, agesno, rugoro, d_t, d_q, d_u, d_v, &         ycoefh, zu1, zv1, t2m, q2m, u10m, v10m, pblh, capcl, oliqcl, cteicl, &
13         d_ts, flux_t, flux_q, flux_u, flux_v, cdragh, cdragm, q2, &         pblt, therm, trmb1, trmb2, trmb3, plcl, fqcalving, ffonte, run_off_lic_0)
        dflux_t, dflux_q, zcoefh, zu1, zv1, t2m, q2m, u10m, v10m, pblh, &  
        capcl, oliqcl, cteicl, pblt, therm, trmb1, trmb2, trmb3, plcl, &  
        fqcalving, ffonte, run_off_lic_0, flux_o, flux_g, tslab, seaice)  
14    
15      ! From phylmd/clmain.F, version 1.6 2005/11/16 14:47:19      ! From phylmd/clmain.F, version 1.6, 2005/11/16 14:47:19
16      ! Author: Z. X. Li (LMD/CNRS), date: 1993/08/18      ! Author: Z. X. Li (LMD/CNRS), date: 1993/08/18
17      ! Objet : interface de couche limite (diffusion verticale)      ! Objet : interface de couche limite (diffusion verticale)
18    
19      ! Tout ce qui a trait aux traceurs est dans "phytrac". Le calcul      ! Tout ce qui a trait aux traceurs est dans "phytrac". Le calcul
20      ! de la couche limite pour les traceurs se fait avec "cltrac" et      ! de la couche limite pour les traceurs se fait avec "cltrac" et
21      ! ne tient pas compte de la différentiation des sous-fractions de      ! ne tient pas compte de la diff\'erentiation des sous-fractions
22      ! sol.      ! de sol.
23    
24      ! Pour pouvoir extraire les coefficients d'échanges et le vent      ! Pour pouvoir extraire les coefficients d'\'echanges et le vent
25      ! dans la première couche, trois champs ont été créés : "zcoefh",      ! dans la premi\`ere couche, trois champs ont \'et\'e cr\'e\'es : "ycoefh",
26      ! "zu1" et "zv1". Nous avons moyenné les valeurs de ces trois      ! "zu1" et "zv1". Nous avons moyenn\'e les valeurs de ces trois
27      ! champs sur les quatre sous-surfaces du modèle.      ! champs sur les quatre sous-surfaces du mod\`ele.
28    
     use calendar, ONLY: ymds2ju  
29      use clqh_m, only: clqh      use clqh_m, only: clqh
30      use clvent_m, only: clvent      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_gcm_m, ONLY: prt_level      USE conf_gcm_m, ONLY: prt_level
34      USE conf_phys_m, ONLY: iflag_pbl      USE conf_phys_m, ONLY: iflag_pbl
     USE dimens_m, ONLY: iim, jjm  
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
     USE histbeg_totreg_m, ONLY: histbeg_totreg  
     USE histdef_m, ONLY: histdef  
     USE histend_m, ONLY: histend  
     USE histsync_m, ONLY: histsync  
     use histwrite_m, only: histwrite  
38      USE indicesol, ONLY: epsfra, is_lic, is_oce, is_sic, is_ter, nbsrf      USE indicesol, ONLY: epsfra, is_lic, is_oce, is_sic, is_ter, nbsrf
39        use stdlevvar_m, only: stdlevvar
40      USE suphec_m, ONLY: rd, rg, rkappa      USE suphec_m, ONLY: rd, rg, rkappa
     USE temps, ONLY: annee_ref, itau_phy  
41      use ustarhb_m, only: ustarhb      use ustarhb_m, only: ustarhb
42      use vdif_kcay_m, only: vdif_kcay      use vdif_kcay_m, only: vdif_kcay
43      use yamada4_m, only: yamada4      use yamada4_m, only: yamada4
44    
     ! Arguments:  
   
45      REAL, INTENT(IN):: dtime ! interval du temps (secondes)      REAL, INTENT(IN):: dtime ! interval du temps (secondes)
     INTEGER, INTENT(IN):: itap ! numero du pas de temps  
     REAL, INTENT(IN):: date0 ! jour initial  
46      REAL, INTENT(inout):: pctsrf(klon, nbsrf)      REAL, INTENT(inout):: pctsrf(klon, nbsrf)
47    
48      ! la nouvelle repartition des surfaces sortie de l'interface      ! la nouvelle repartition des surfaces sortie de l'interface
# Line 69  contains Line 53  contains
53      REAL, INTENT(IN):: u(klon, klev), v(klon, klev) ! vitesse      REAL, INTENT(IN):: u(klon, klev), v(klon, klev) ! vitesse
54      INTEGER, INTENT(IN):: jour ! jour de l'annee en cours      INTEGER, INTENT(IN):: jour ! jour de l'annee en cours
55      REAL, intent(in):: rmu0(klon) ! cosinus de l'angle solaire zenithal          REAL, intent(in):: rmu0(klon) ! cosinus de l'angle solaire zenithal    
56        REAL, INTENT(IN):: ts(klon, nbsrf) ! temperature du sol (en Kelvin)
57        REAL, INTENT(IN):: cdmmax, cdhmax ! seuils cdrm, cdrh
58        REAL, INTENT(IN):: ksta, ksta_ter
59        LOGICAL, INTENT(IN):: ok_kzmin
60    
61        REAL, INTENT(inout):: ftsoil(klon, nsoilmx, nbsrf)
62        ! soil temperature of surface fraction
63    
64        REAL, INTENT(inout):: qsol(klon)
65        ! column-density of water in soil, in kg m-2
66    
67      REAL, INTENT(IN):: paprs(klon, klev+1) ! pression a intercouche (Pa)      REAL, INTENT(IN):: paprs(klon, klev+1) ! pression a intercouche (Pa)
68      REAL, INTENT(IN):: pplay(klon, klev) ! pression au milieu de couche (Pa)      REAL, INTENT(IN):: pplay(klon, klev) ! pression au milieu de couche (Pa)
69      REAL, INTENT(IN):: rlon(klon)      REAL, INTENT(inout):: snow(klon, nbsrf)
70      REAL, INTENT(IN):: rlat(klon) ! latitude en degrés      REAL qsurf(klon, nbsrf)
71      REAL cufi(klon), cvfi(klon)      REAL evap(klon, nbsrf)
72      ! cufi-----input-R- resolution des mailles en x (m)      REAL, intent(inout):: falbe(klon, nbsrf)
73      ! cvfi-----input-R- resolution des mailles en y (m)  
74        REAL fluxlat(klon, nbsrf)
75    
76        REAL, intent(in):: rain_fall(klon)
77        ! liquid water mass flux (kg/m2/s), positive down
78    
79        REAL, intent(in):: snow_f(klon)
80        ! solid water mass flux (kg/m2/s), positive down
81    
82        REAL, INTENT(IN):: solsw(klon, nbsrf), sollw(klon, nbsrf)
83        REAL, intent(in):: fder(klon)
84        REAL, INTENT(IN):: rlat(klon) ! latitude en degr\'es
85    
86        REAL, intent(inout):: rugos(klon, nbsrf) ! longueur de rugosit\'e (en m)
87    
88        LOGICAL, INTENT(IN):: firstcal
89        real agesno(klon, nbsrf)
90        REAL, INTENT(IN):: rugoro(klon)
91    
92      REAL d_t(klon, klev), d_q(klon, klev)      REAL d_t(klon, klev), d_q(klon, klev)
93      ! d_t------output-R- le changement pour "t"      ! d_t------output-R- le changement pour "t"
94      ! d_q------output-R- le changement pour "q"      ! d_q------output-R- le changement pour "q"
# Line 83  contains Line 96  contains
96      REAL, intent(out):: d_u(klon, klev), d_v(klon, klev)      REAL, intent(out):: d_u(klon, klev), d_v(klon, klev)
97      ! changement pour "u" et "v"      ! changement pour "u" et "v"
98    
99        REAL, intent(out):: d_ts(klon, nbsrf) ! le changement pour "ts"
100    
101      REAL flux_t(klon, klev, nbsrf), flux_q(klon, klev, nbsrf)      REAL flux_t(klon, klev, nbsrf), flux_q(klon, klev, nbsrf)
102      ! flux_t---output-R- flux de chaleur sensible (CpT) J/m**2/s (W/m**2)      ! flux_t---output-R- flux de chaleur sensible (CpT) J/m**2/s (W/m**2)
103      !                    (orientation positive vers le bas)      !                    (orientation positive vers le bas)
104      ! flux_q---output-R- flux de vapeur d'eau (kg/m**2/s)      ! flux_q---output-R- flux de vapeur d'eau (kg/m**2/s)
     REAL dflux_t(klon), dflux_q(klon)  
     ! dflux_t derive du flux sensible  
     ! dflux_q derive du flux latent  
     !IM "slab" ocean  
     REAL flux_o(klon), flux_g(klon)  
     !IM "slab" ocean  
     ! flux_g---output-R-  flux glace (pour OCEAN='slab  ')  
     ! flux_o---output-R-  flux ocean (pour OCEAN='slab  ')  
     REAL y_flux_o(klon), y_flux_g(klon)  
     REAL tslab(klon), ytslab(klon)  
     ! tslab-in/output-R temperature du slab ocean (en Kelvin)  
     ! uniqmnt pour slab  
     REAL seaice(klon), y_seaice(klon)  
     ! seaice---output-R-  glace de mer (kg/m2) (pour OCEAN='slab  ')  
     REAL y_fqcalving(klon), y_ffonte(klon)  
     REAL fqcalving(klon, nbsrf), ffonte(klon, nbsrf)  
     ! ffonte----Flux thermique utilise pour fondre la neige  
     ! fqcalving-Flux d'eau "perdue" par la surface et necessaire pour limiter la  
     !           hauteur de neige, en kg/m2/s  
     REAL run_off_lic_0(klon), y_run_off_lic_0(klon)  
105    
106      REAL flux_u(klon, klev, nbsrf), flux_v(klon, klev, nbsrf)      REAL flux_u(klon, klev, nbsrf), flux_v(klon, klev, nbsrf)
107      ! flux_u---output-R- tension du vent X: (kg m/s)/(m**2 s) ou Pascal      ! flux_u---output-R- tension du vent X: (kg m/s)/(m**2 s) ou Pascal
108      ! flux_v---output-R- tension du vent Y: (kg m/s)/(m**2 s) ou Pascal      ! flux_v---output-R- tension du vent Y: (kg m/s)/(m**2 s) ou Pascal
109      REAL rugmer(klon), agesno(klon, nbsrf)  
     REAL, INTENT(IN):: rugoro(klon)  
110      REAL, INTENT(out):: cdragh(klon), cdragm(klon)      REAL, INTENT(out):: cdragh(klon), cdragm(klon)
111      ! taux CO2 atmosphere                          real q2(klon, klev+1, nbsrf)
     REAL co2_ppm  
     LOGICAL, INTENT(IN):: debut  
     LOGICAL, INTENT(IN):: lafin  
     LOGICAL ok_veget  
     CHARACTER(len=*), INTENT(IN):: ocean  
     INTEGER npas, nexca  
   
     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)  
112    
113      REAL fluxlat(klon, nbsrf)      REAL, INTENT(out):: dflux_t(klon), dflux_q(klon)
114        ! dflux_t derive du flux sensible
115        ! dflux_q derive du flux latent
116        ! IM "slab" ocean
117    
118      REAL, intent(in):: rain_fall(klon), snow_f(klon)      REAL, intent(out):: ycoefh(klon, klev)
119      REAL fder(klon)      REAL, intent(out):: zu1(klon)
120        REAL zv1(klon)
121        REAL t2m(klon, nbsrf), q2m(klon, nbsrf)
122        REAL u10m(klon, nbsrf), v10m(klon, nbsrf)
123    
124      REAL sollw(klon, nbsrf), solsw(klon, nbsrf), sollwdown(klon)      ! Ionela Musat cf. Anne Mathieu : planetary boundary layer, hbtm
125      REAL rugos(klon, nbsrf)      ! (Comme les autres diagnostics on cumule dans physiq ce qui
126      ! rugos----input-R- longeur de rugosite (en m)      ! permet de sortir les grandeurs par sous-surface)
127        REAL pblh(klon, nbsrf) ! height of planetary boundary layer
128        REAL capcl(klon, nbsrf)
129        REAL oliqcl(klon, nbsrf)
130        REAL cteicl(klon, nbsrf)
131        REAL pblt(klon, nbsrf)
132        ! pblT------- T au nveau HCL
133        REAL therm(klon, nbsrf)
134        REAL trmb1(klon, nbsrf)
135        ! trmb1-------deep_cape
136        REAL trmb2(klon, nbsrf)
137        ! trmb2--------inhibition
138        REAL trmb3(klon, nbsrf)
139        ! trmb3-------Point Omega
140        REAL plcl(klon, nbsrf)
141        REAL fqcalving(klon, nbsrf), ffonte(klon, nbsrf)
142        ! ffonte----Flux thermique utilise pour fondre la neige
143        ! fqcalving-Flux d'eau "perdue" par la surface et necessaire pour limiter la
144        !           hauteur de neige, en kg/m2/s
145        REAL run_off_lic_0(klon)
146    
147      REAL zcoefh(klon, klev)      ! Local:
     REAL zu1(klon)  
     REAL zv1(klon)  
148    
149      !$$$ PB ajout pour soil      REAL y_fqcalving(klon), y_ffonte(klon)
150      LOGICAL, INTENT(IN):: soil_model      real y_run_off_lic_0(klon)
     !IM ajout seuils cdrm, cdrh  
     REAL cdmmax, cdhmax  
151    
152      REAL ksta, ksta_ter      REAL rugmer(klon)
     LOGICAL ok_kzmin  
153    
     REAL ftsoil(klon, nsoilmx, nbsrf)  
154      REAL ytsoil(klon, nsoilmx)      REAL ytsoil(klon, nsoilmx)
     REAL qsol(klon)  
155    
156      REAL yts(klon), yrugos(klon), ypct(klon), yz0_new(klon)      REAL yts(klon), yrugos(klon), ypct(klon), yz0_new(klon)
157      REAL yalb(klon)      REAL yalb(klon)
     REAL yalblw(klon)  
158      REAL yu1(klon), yv1(klon)      REAL yu1(klon), yv1(klon)
159      ! on rajoute en output yu1 et yv1 qui sont les vents dans      ! on rajoute en output yu1 et yv1 qui sont les vents dans
160      ! la premiere couche      ! la premiere couche
161      REAL ysnow(klon), yqsurf(klon), yagesno(klon), yqsol(klon)      REAL ysnow(klon), yqsurf(klon), yagesno(klon)
162      REAL yrain_f(klon), ysnow_f(klon)  
163      REAL ysollw(klon), ysolsw(klon), ysollwdown(klon)      real yqsol(klon)
164      REAL yfder(klon), ytaux(klon), ytauy(klon)      ! column-density of water in soil, in kg m-2
165    
166        REAL yrain_f(klon)
167        ! liquid water mass flux (kg/m2/s), positive down
168    
169        REAL ysnow_f(klon)
170        ! solid water mass flux (kg/m2/s), positive down
171    
172        REAL yfder(klon)
173      REAL yrugm(klon), yrads(klon), yrugoro(klon)      REAL yrugm(klon), yrads(klon), yrugoro(klon)
174    
175      REAL yfluxlat(klon)      REAL yfluxlat(klon)
# Line 182  contains Line 185  contains
185      REAL yt(klon, klev), yq(klon, klev)      REAL yt(klon, klev), yq(klon, klev)
186      REAL ypaprs(klon, klev+1), ypplay(klon, klev), ydelp(klon, klev)      REAL ypaprs(klon, klev+1), ypplay(klon, klev), ydelp(klon, klev)
187    
     LOGICAL ok_nonloc  
     PARAMETER (ok_nonloc=.FALSE.)  
188      REAL ycoefm0(klon, klev), ycoefh0(klon, klev)      REAL ycoefm0(klon, klev), ycoefh0(klon, klev)
189    
190      REAL yzlay(klon, klev), yzlev(klon, klev+1), yteta(klon, klev)      REAL yzlay(klon, klev), yzlev(klon, klev+1), yteta(klon, klev)
191      REAL ykmm(klon, klev+1), ykmn(klon, klev+1)      REAL ykmm(klon, klev+1), ykmn(klon, klev+1)
192      REAL ykmq(klon, klev+1)      REAL ykmq(klon, klev+1)
193      REAL yq2(klon, klev+1), q2(klon, klev+1, nbsrf)      REAL yq2(klon, klev+1)
194      REAL q2diag(klon, klev+1)      REAL q2diag(klon, klev+1)
195    
196      REAL u1lay(klon), v1lay(klon)      REAL u1lay(klon), v1lay(klon)
# Line 199  contains Line 200  contains
200      INTEGER ni(klon), knon, j      INTEGER ni(klon), knon, j
201    
202      REAL pctsrf_pot(klon, nbsrf)      REAL pctsrf_pot(klon, nbsrf)
203      ! "pourcentage potentiel" pour tenir compte des éventuelles      ! "pourcentage potentiel" pour tenir compte des \'eventuelles
204      ! apparitions ou disparitions de la glace de mer      ! apparitions ou disparitions de la glace de mer
205    
206      REAL zx_alf1, zx_alf2 !valeur ambiante par extrapola.      REAL zx_alf1, zx_alf2 ! valeur ambiante par extrapolation
   
     ! maf pour sorties IOISPL en cas de debugagage  
   
     CHARACTER(80) cldebug  
     SAVE cldebug  
     CHARACTER(8) cl_surf(nbsrf)  
     SAVE cl_surf  
     INTEGER nhoridbg, nidbg  
     SAVE nhoridbg, nidbg  
     INTEGER ndexbg(iim*(jjm+1))  
     REAL zx_lon(iim, jjm+1), zx_lat(iim, jjm+1), zjulian  
     REAL tabindx(klon)  
     REAL debugtab(iim, jjm+1)  
     LOGICAL first_appel  
     SAVE first_appel  
     DATA first_appel/ .TRUE./  
     LOGICAL:: debugindex = .FALSE.  
     INTEGER idayref  
     REAL t2m(klon, nbsrf), q2m(klon, nbsrf)  
     REAL u10m(klon, nbsrf), v10m(klon, nbsrf)  
207    
208      REAL yt2m(klon), yq2m(klon), yu10m(klon)      REAL yt2m(klon), yq2m(klon), yu10m(klon)
209      REAL yustar(klon)      REAL yustar(klon)
     ! -- LOOP  
     REAL yu10mx(klon)  
     REAL yu10my(klon)  
     REAL ywindsp(klon)  
     ! -- LOOP  
210    
211      REAL yt10m(klon), yq10m(klon)      REAL yt10m(klon), yq10m(klon)
     !IM cf. AM : pbl, hbtm (Comme les autres diagnostics on cumule ds  
     ! physiq ce qui permet de sortir les grdeurs par sous surface)  
     REAL pblh(klon, nbsrf)  
     ! pblh------- HCL  
     REAL plcl(klon, nbsrf)  
     REAL capcl(klon, nbsrf)  
     REAL oliqcl(klon, nbsrf)  
     REAL cteicl(klon, nbsrf)  
     REAL pblt(klon, nbsrf)  
     ! pblT------- T au nveau HCL  
     REAL therm(klon, nbsrf)  
     REAL trmb1(klon, nbsrf)  
     ! trmb1-------deep_cape  
     REAL trmb2(klon, nbsrf)  
     ! trmb2--------inhibition  
     REAL trmb3(klon, nbsrf)  
     ! trmb3-------Point Omega  
212      REAL ypblh(klon)      REAL ypblh(klon)
213      REAL ylcl(klon)      REAL ylcl(klon)
214      REAL ycapcl(klon)      REAL ycapcl(klon)
# Line 271  contains Line 230  contains
230      LOGICAL zxli      LOGICAL zxli
231      PARAMETER (zxli=.FALSE.)      PARAMETER (zxli=.FALSE.)
232    
     REAL zt, zqs, zdelta, zcor  
     REAL t_coup  
     PARAMETER (t_coup=273.15)  
   
     CHARACTER(len=20):: modname = 'clmain'  
   
233      !------------------------------------------------------------      !------------------------------------------------------------
234    
235      ytherm = 0.      ytherm = 0.
236    
     IF (debugindex .AND. first_appel) THEN  
        first_appel = .FALSE.  
   
        ! initialisation sorties netcdf  
   
        idayref = day_ini  
        CALL ymds2ju(annee_ref, 1, idayref, 0., zjulian)  
        CALL gr_fi_ecrit(1, klon, iim, jjm+1, rlon, zx_lon)  
        DO i = 1, iim  
           zx_lon(i, 1) = rlon(i+1)  
           zx_lon(i, jjm+1) = rlon(i+1)  
        END DO  
        CALL gr_fi_ecrit(1, klon, iim, jjm+1, rlat, zx_lat)  
        cldebug = 'sous_index'  
        CALL histbeg_totreg(cldebug, zx_lon(:, 1), zx_lat(1, :), 1, &  
             iim, 1, jjm+1, itau_phy, zjulian, dtime, nhoridbg, nidbg)  
        ! no vertical axis  
        cl_surf(1) = 'ter'  
        cl_surf(2) = 'lic'  
        cl_surf(3) = 'oce'  
        cl_surf(4) = 'sic'  
        DO nsrf = 1, nbsrf  
           CALL histdef(nidbg, cl_surf(nsrf), cl_surf(nsrf), '-', iim, jjm+1, &  
                nhoridbg, 1, 1, 1, -99, 'inst', dtime, dtime)  
        END DO  
        CALL histend(nidbg)  
        CALL histsync(nidbg)  
     END IF  
   
237      DO k = 1, klev ! epaisseur de couche      DO k = 1, klev ! epaisseur de couche
238         DO i = 1, klon         DO i = 1, klon
239            delp(i, k) = paprs(i, k) - paprs(i, k+1)            delp(i, k) = paprs(i, k) - paprs(i, k+1)
# Line 334  contains Line 258  contains
258      yts = 0.      yts = 0.
259      ysnow = 0.      ysnow = 0.
260      yqsurf = 0.      yqsurf = 0.
     yalb = 0.  
     yalblw = 0.  
261      yrain_f = 0.      yrain_f = 0.
262      ysnow_f = 0.      ysnow_f = 0.
263      yfder = 0.      yfder = 0.
     ytaux = 0.  
     ytauy = 0.  
     ysolsw = 0.  
     ysollw = 0.  
     ysollwdown = 0.  
264      yrugos = 0.      yrugos = 0.
265      yu1 = 0.      yu1 = 0.
266      yv1 = 0.      yv1 = 0.
# Line 358  contains Line 275  contains
275      pctsrf_new = 0.      pctsrf_new = 0.
276      y_flux_u = 0.      y_flux_u = 0.
277      y_flux_v = 0.      y_flux_v = 0.
     !$$ PB  
278      y_dflux_t = 0.      y_dflux_t = 0.
279      y_dflux_q = 0.      y_dflux_q = 0.
280      ytsoil = 999999.      ytsoil = 999999.
281      yrugoro = 0.      yrugoro = 0.
     ! -- LOOP  
     yu10mx = 0.  
     yu10my = 0.  
     ywindsp = 0.  
     ! -- LOOP  
282      d_ts = 0.      d_ts = 0.
     !§§§ PB  
283      yfluxlat = 0.      yfluxlat = 0.
284      flux_t = 0.      flux_t = 0.
285      flux_q = 0.      flux_q = 0.
# Line 379  contains Line 289  contains
289      d_q = 0.      d_q = 0.
290      d_u = 0.      d_u = 0.
291      d_v = 0.      d_v = 0.
292      zcoefh = 0.      ycoefh = 0.
293    
294      ! Boucler sur toutes les sous-fractions du sol:      ! Initialisation des "pourcentages potentiels". On consid\`ere ici qu'on
295        ! peut avoir potentiellement de la glace sur tout le domaine oc\'eanique
296      ! Initialisation des "pourcentages potentiels". On considère ici qu'on      ! (\`a affiner)
     ! peut avoir potentiellement de la glace sur tout le domaine océanique  
     ! (à affiner)  
297    
298      pctsrf_pot = pctsrf      pctsrf_pot = pctsrf
299      pctsrf_pot(:, is_oce) = 1. - zmasq      pctsrf_pot(:, is_oce) = 1. - zmasq
300      pctsrf_pot(:, is_sic) = 1. - zmasq      pctsrf_pot(:, is_sic) = 1. - zmasq
301    
302        ! Boucler sur toutes les sous-fractions du sol:
303    
304      loop_surface: DO nsrf = 1, nbsrf      loop_surface: DO nsrf = 1, nbsrf
305         ! Chercher les indices :         ! Chercher les indices :
306         ni = 0         ni = 0
307         knon = 0         knon = 0
308         DO i = 1, klon         DO i = 1, klon
309            ! Pour déterminer le domaine à traiter, on utilise les surfaces            ! Pour d\'eterminer le domaine \`a traiter, on utilise les surfaces
310            ! "potentielles"            ! "potentielles"
311            IF (pctsrf_pot(i, nsrf) > epsfra) THEN            IF (pctsrf_pot(i, nsrf) > epsfra) THEN
312               knon = knon + 1               knon = knon + 1
# Line 404  contains Line 314  contains
314            END IF            END IF
315         END DO         END DO
316    
        ! variables pour avoir une sortie IOIPSL des INDEX  
        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  
   
317         if_knon: IF (knon /= 0) then         if_knon: IF (knon /= 0) then
318            DO j = 1, knon            DO j = 1, knon
319               i = ni(j)               i = ni(j)
320               ypct(j) = pctsrf(i, nsrf)               ypct(j) = pctsrf(i, nsrf)
321               yts(j) = ts(i, nsrf)               yts(j) = ts(i, nsrf)
              ytslab(i) = tslab(i)  
322               ysnow(j) = snow(i, nsrf)               ysnow(j) = snow(i, nsrf)
323               yqsurf(j) = qsurf(i, nsrf)               yqsurf(j) = qsurf(i, nsrf)
324               yalb(j) = albe(i, nsrf)               yalb(j) = falbe(i, nsrf)
              yalblw(j) = alblw(i, nsrf)  
325               yrain_f(j) = rain_fall(i)               yrain_f(j) = rain_fall(i)
326               ysnow_f(j) = snow_f(i)               ysnow_f(j) = snow_f(i)
327               yagesno(j) = agesno(i, nsrf)               yagesno(j) = agesno(i, nsrf)
328               yfder(j) = fder(i)               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)  
329               yrugos(j) = rugos(i, nsrf)               yrugos(j) = rugos(i, nsrf)
330               yrugoro(j) = rugoro(i)               yrugoro(j) = rugoro(i)
331               yu1(j) = u1lay(i)               yu1(j) = u1lay(i)
332               yv1(j) = v1lay(i)               yv1(j) = v1lay(i)
333               yrads(j) = ysolsw(j) + ysollw(j)               yrads(j) = solsw(i, nsrf) + sollw(i, nsrf)
334               ypaprs(j, klev+1) = paprs(i, klev+1)               ypaprs(j, klev+1) = paprs(i, klev+1)
335               y_run_off_lic_0(j) = run_off_lic_0(i)               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))  
336            END DO            END DO
337    
338            ! IF bucket model for continent, copy soil water content            ! For continent, copy soil water content
339            IF (nsrf == is_ter .AND. .NOT. ok_veget) THEN            IF (nsrf == is_ter) THEN
340               DO j = 1, knon               yqsol(:knon) = qsol(ni(:knon))
                 i = ni(j)  
                 yqsol(j) = qsol(i)  
              END DO  
341            ELSE            ELSE
342               yqsol = 0.               yqsol = 0.
343            END IF            END IF
# Line 486  contains Line 371  contains
371               coefh(:knon, :) = max(coefh(:knon, :), ycoefh0(:knon, :))               coefh(:knon, :) = max(coefh(:knon, :), ycoefh0(:knon, :))
372            END IF            END IF
373    
374            ! on seuille coefm et coefh            ! on met un seuil pour coefm et coefh
375            IF (nsrf == is_oce) THEN            IF (nsrf == is_oce) THEN
376               coefm(:knon, 1) = min(coefm(:knon, 1), cdmmax)               coefm(:knon, 1) = min(coefm(:knon, 1), cdmmax)
377               coefh(:knon, 1) = min(coefh(:knon, 1), cdhmax)               coefh(:knon, 1) = min(coefh(:knon, 1), cdhmax)
# Line 495  contains Line 380  contains
380            IF (ok_kzmin) THEN            IF (ok_kzmin) THEN
381               ! Calcul d'une diffusion minimale pour les conditions tres stables               ! Calcul d'une diffusion minimale pour les conditions tres stables
382               CALL coefkzmin(knon, ypaprs, ypplay, yu, yv, yt, yq, &               CALL coefkzmin(knon, ypaprs, ypplay, yu, yv, yt, yq, &
383                    coefm(:, 1), ycoefm0, ycoefh0)                    coefm(:knon, 1), ycoefm0, ycoefh0)
384               coefm(:knon, :) = max(coefm(:knon, :), ycoefm0(:knon, :))               coefm(:knon, :) = max(coefm(:knon, :), ycoefm0(:knon, :))
385               coefh(:knon, :) = max(coefh(:knon, :), ycoefh0(:knon, :))               coefh(:knon, :) = max(coefh(:knon, :), ycoefh0(:knon, :))
386             END IF            END IF
387    
388            IF (iflag_pbl >= 3) THEN            IF (iflag_pbl >= 3) THEN
389               ! MELLOR ET YAMADA adapté à Mars, Richard Fournier et               ! Mellor et Yamada adapt\'e \`a Mars, Richard Fournier et
390               ! Frédéric Hourdin               ! Fr\'ed\'eric Hourdin
391               yzlay(:knon, 1) = rd * yt(:knon, 1) / (0.5 * (ypaprs(:knon, 1) &               yzlay(:knon, 1) = rd * yt(:knon, 1) / (0.5 * (ypaprs(:knon, 1) &
392                    + ypplay(:knon, 1))) &                    + ypplay(:knon, 1))) &
393                    * (ypaprs(:knon, 1) - ypplay(:knon, 1)) / rg                    * (ypaprs(:knon, 1) - ypplay(:knon, 1)) / rg
# Line 530  contains Line 415  contains
415               END DO               END DO
416    
417               CALL ustarhb(knon, yu, yv, coefm(:knon, 1), yustar)               CALL ustarhb(knon, yu, yv, coefm(:knon, 1), yustar)
418                 IF (prt_level > 9) PRINT *, 'USTAR = ', yustar
419    
420               IF (prt_level > 9) THEN               ! iflag_pbl peut \^etre utilis\'e comme longueur de m\'elange
                 PRINT *, 'USTAR = ', yustar  
              END IF  
   
              ! iflag_pbl peut être utilisé comme longueur de mélange  
421    
422               IF (iflag_pbl >= 11) THEN               IF (iflag_pbl >= 11) THEN
423                  CALL vdif_kcay(knon, dtime, rg, rd, ypaprs, yt, yzlev, yzlay, &                  CALL vdif_kcay(knon, dtime, rg, ypaprs, yzlev, yzlay, yu, yv, &
424                       yu, yv, yteta, coefm(:knon, 1), yq2, q2diag, ykmm, ykmn, &                       yteta, coefm(:knon, 1), yq2, q2diag, ykmm, ykmn, yustar, &
425                       yustar, iflag_pbl)                       iflag_pbl)
426               ELSE               ELSE
427                  CALL yamada4(knon, dtime, rg, yzlev, yzlay, yu, yv, yteta, &                  CALL yamada4(knon, dtime, rg, yzlev, yzlay, yu, yv, yteta, &
428                       coefm(:knon, 1), yq2, ykmm, ykmn, ykmq, yustar, iflag_pbl)                       coefm(:knon, 1), yq2, ykmm, ykmn, ykmq, yustar, iflag_pbl)
# Line 551  contains Line 433  contains
433            END IF            END IF
434    
435            ! calculer la diffusion des vitesses "u" et "v"            ! calculer la diffusion des vitesses "u" et "v"
436            CALL clvent(knon, dtime, yu1, yv1, coefm, yt, yu, ypaprs, ypplay, &            CALL clvent(knon, dtime, yu1, yv1, coefm(:knon, :), yt, yu, ypaprs, &
437                 ydelp, y_d_u, y_flux_u)                 ypplay, ydelp, y_d_u, y_flux_u)
438            CALL clvent(knon, dtime, yu1, yv1, coefm, yt, yv, ypaprs, ypplay, &            CALL clvent(knon, dtime, yu1, yv1, coefm(:knon, :), yt, yv, ypaprs, &
439                 ydelp, y_d_v, y_flux_v)                 ypplay, ydelp, y_d_v, y_flux_v)
   
           ! pour le couplage  
           ytaux = y_flux_u(:, 1)  
           ytauy = y_flux_v(:, 1)  
440    
441            ! calculer la diffusion de "q" et de "h"            ! calculer la diffusion de "q" et de "h"
442            CALL clqh(dtime, itap, date0, jour, debut, lafin, rlon, rlat, &            CALL clqh(dtime, jour, firstcal, rlat, knon, nsrf, ni(:knon), &
443                 cufi, cvfi, knon, nsrf, ni, pctsrf, soil_model, ytsoil, &                 pctsrf, ytsoil, yqsol, rmu0, yrugos, yrugoro, yu1, yv1, &
444                 yqsol, ok_veget, ocean, npas, nexca, rmu0, co2_ppm, yrugos, &                 coefh(:knon, :), yt, yq, yts, ypaprs, ypplay, ydelp, yrads, &
445                 yrugoro, yu1, yv1, coefh, yt, yq, yts, ypaprs, ypplay, &                 yalb(:knon), ysnow, yqsurf, yrain_f, ysnow_f, yfder, yfluxlat, &
446                 ydelp, yrads, yalb, yalblw, ysnow, yqsurf, yrain_f, ysnow_f, &                 pctsrf_new, yagesno(:knon), y_d_t, y_d_q, y_d_ts(:knon), &
                yfder, ytaux, ytauy, ywindsp, ysollw, ysollwdown, ysolsw, &  
                yfluxlat, pctsrf_new, yagesno, y_d_t, y_d_q, y_d_ts, &  
447                 yz0_new, y_flux_t, y_flux_q, y_dflux_t, y_dflux_q, &                 yz0_new, y_flux_t, y_flux_q, y_dflux_t, y_dflux_q, &
448                 y_fqcalving, y_ffonte, y_run_off_lic_0, y_flux_o, y_flux_g, &                 y_fqcalving, y_ffonte, y_run_off_lic_0)
                ytslab, y_seaice)  
449    
450            ! calculer la longueur de rugosite sur ocean            ! calculer la longueur de rugosite sur ocean
451            yrugm = 0.            yrugm = 0.
# Line 606  contains Line 481  contains
481    
482            evap(:, nsrf) = -flux_q(:, 1, nsrf)            evap(:, nsrf) = -flux_q(:, 1, nsrf)
483    
484            albe(:, nsrf) = 0.            falbe(:, nsrf) = 0.
           alblw(:, nsrf) = 0.  
485            snow(:, nsrf) = 0.            snow(:, nsrf) = 0.
486            qsurf(:, nsrf) = 0.            qsurf(:, nsrf) = 0.
487            rugos(:, nsrf) = 0.            rugos(:, nsrf) = 0.
# Line 615  contains Line 489  contains
489            DO j = 1, knon            DO j = 1, knon
490               i = ni(j)               i = ni(j)
491               d_ts(i, nsrf) = y_d_ts(j)               d_ts(i, nsrf) = y_d_ts(j)
492               albe(i, nsrf) = yalb(j)               falbe(i, nsrf) = yalb(j)
              alblw(i, nsrf) = yalblw(j)  
493               snow(i, nsrf) = ysnow(j)               snow(i, nsrf) = ysnow(j)
494               qsurf(i, nsrf) = yqsurf(j)               qsurf(i, nsrf) = yqsurf(j)
495               rugos(i, nsrf) = yz0_new(j)               rugos(i, nsrf) = yz0_new(j)
# Line 636  contains Line 509  contains
509               zv1(i) = zv1(i) + yv1(j)               zv1(i) = zv1(i) + yv1(j)
510            END DO            END DO
511            IF (nsrf == is_ter) THEN            IF (nsrf == is_ter) THEN
512               DO j = 1, knon               qsol(ni(:knon)) = yqsol(:knon)
513                  i = ni(j)            else IF (nsrf == is_lic) THEN
                 qsol(i) = yqsol(j)  
              END DO  
           END IF  
           IF (nsrf == is_lic) THEN  
514               DO j = 1, knon               DO j = 1, knon
515                  i = ni(j)                  i = ni(j)
516                  run_off_lic_0(i) = y_run_off_lic_0(j)                  run_off_lic_0(i) = y_run_off_lic_0(j)
517               END DO               END DO
518            END IF            END IF
519            !$$$ PB ajout pour soil  
520            ftsoil(:, :, nsrf) = 0.            ftsoil(:, :, nsrf) = 0.
521            DO k = 1, nsoilmx            DO k = 1, nsoilmx
522               DO j = 1, knon               DO j = 1, knon
# Line 663  contains Line 532  contains
532                  d_q(i, k) = d_q(i, k) + y_d_q(j, k)                  d_q(i, k) = d_q(i, k) + y_d_q(j, k)
533                  d_u(i, k) = d_u(i, k) + y_d_u(j, k)                  d_u(i, k) = d_u(i, k) + y_d_u(j, k)
534                  d_v(i, k) = d_v(i, k) + y_d_v(j, k)                  d_v(i, k) = d_v(i, k) + y_d_v(j, k)
535                  zcoefh(i, k) = zcoefh(i, k) + coefh(j, k)                  ycoefh(i, k) = ycoefh(i, k) + coefh(j, k)
536               END DO               END DO
537            END DO            END DO
538    
539            !cc diagnostic t, q a 2m et u, v a 10m            ! diagnostic t, q a 2m et u, v a 10m
540    
541            DO j = 1, knon            DO j = 1, knon
542               i = ni(j)               i = ni(j)
# Line 703  contains Line 572  contains
572    
573            END DO            END DO
574    
575            CALL hbtm(knon, ypaprs, ypplay, yt2m, yt10m, yq2m, yq10m, yustar, &            CALL hbtm(knon, ypaprs, ypplay, yt2m, yq2m, yustar, y_flux_t, &
576                 y_flux_t, y_flux_q, yu, yv, yt, yq, ypblh, ycapcl, yoliqcl, &                 y_flux_q, yu, yv, yt, yq, ypblh(:knon), ycapcl, yoliqcl, &
577                 ycteicl, ypblt, ytherm, ytrmb1, ytrmb2, ytrmb3, ylcl)                 ycteicl, ypblt, ytherm, ytrmb1, ytrmb2, ytrmb3, ylcl)
578    
579            DO j = 1, knon            DO j = 1, knon
# Line 727  contains Line 596  contains
596                  q2(i, k, nsrf) = yq2(j, k)                  q2(i, k, nsrf) = yq2(j, k)
597               END DO               END DO
598            END DO            END DO
           !IM "slab" ocean  
           IF (nsrf == is_oce) THEN  
              DO j = 1, knon  
                 ! on projette sur la grille globale  
                 i = ni(j)  
                 IF (pctsrf_new(i, is_oce)>epsfra) THEN  
                    flux_o(i) = y_flux_o(j)  
                 ELSE  
                    flux_o(i) = 0.  
                 END IF  
              END DO  
           END IF  
   
           IF (nsrf == is_sic) THEN  
              DO j = 1, knon  
                 i = ni(j)  
                 ! On pondère lorsque l'on fait le bilan au sol :  
                 IF (pctsrf_new(i, is_sic)>epsfra) THEN  
                    flux_g(i) = y_flux_g(j)  
                 ELSE  
                    flux_g(i) = 0.  
                 END IF  
              END DO  
   
           END IF  
           IF (ocean == 'slab  ') THEN  
              IF (nsrf == is_oce) THEN  
                 tslab(1:klon) = ytslab(1:klon)  
                 seaice(1:klon) = y_seaice(1:klon)  
              END IF  
           END IF  
599         end IF if_knon         end IF if_knon
600      END DO loop_surface      END DO loop_surface
601    

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

  ViewVC Help
Powered by ViewVC 1.1.21