/[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/phylmd/clmain.f revision 99 by guez, Wed Jul 2 18:39:15 2014 UTC trunk/Sources/phylmd/clmain.f revision 154 by guez, Tue Jul 7 17:49:23 2015 UTC
# Line 5  module clmain_m Line 5  module clmain_m
5  contains  contains
6    
7    SUBROUTINE clmain(dtime, itap, pctsrf, pctsrf_new, t, q, u, v, jour, rmu0, &    SUBROUTINE clmain(dtime, itap, pctsrf, pctsrf_new, t, q, u, v, jour, rmu0, &
8         co2_ppm, ts, soil_model, cdmmax, cdhmax, ksta, ksta_ter, &         co2_ppm, ts, cdmmax, cdhmax, ksta, ksta_ter, ok_kzmin, ftsoil, qsol, &
9         ok_kzmin, ftsoil, qsol, paprs, pplay, snow, qsurf, evap, albe, alblw, &         paprs, pplay, snow, qsurf, evap, albe, alblw, fluxlat, rain_fall, &
10         fluxlat, rain_fall, snow_f, solsw, sollw, fder, rlat, rugos, debut, &         snow_f, solsw, sollw, fder, rlat, rugos, debut, agesno, rugoro, d_t, &
11         agesno, rugoro, d_t, d_q, d_u, d_v, d_ts, flux_t, flux_q, flux_u, &         d_q, d_u, d_v, d_ts, flux_t, flux_q, flux_u, flux_v, cdragh, cdragm, &
12         flux_v, cdragh, cdragm, q2, dflux_t, dflux_q, ycoefh, zu1, zv1, t2m, &         q2, dflux_t, dflux_q, ycoefh, zu1, zv1, t2m, q2m, u10m, v10m, pblh, &
13         q2m, u10m, v10m, pblh, capcl, oliqcl, cteicl, pblt, therm, trmb1, &         capcl, oliqcl, cteicl, pblt, therm, trmb1, trmb2, trmb3, plcl, &
14         trmb2, trmb3, plcl, fqcalving, ffonte, run_off_lic_0, flux_o, flux_g, &         fqcalving, ffonte, run_off_lic_0, flux_o, flux_g, tslab)
        tslab, seaice)  
15    
16      ! 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
17      ! Author: Z. X. Li (LMD/CNRS), date: 1993/08/18      ! Author: Z. X. Li (LMD/CNRS), date: 1993/08/18
# Line 20  contains Line 19  contains
19    
20      ! Tout ce qui a trait aux traceurs est dans "phytrac". Le calcul      ! Tout ce qui a trait aux traceurs est dans "phytrac". Le calcul
21      ! de la couche limite pour les traceurs se fait avec "cltrac" et      ! de la couche limite pour les traceurs se fait avec "cltrac" et
22      ! ne tient pas compte de la différentiation des sous-fractions de      ! ne tient pas compte de la diff\'erentiation des sous-fractions
23      ! sol.      ! de sol.
24    
25      ! Pour pouvoir extraire les coefficients d'échanges et le vent      ! Pour pouvoir extraire les coefficients d'\'echanges et le vent
26      ! dans la première couche, trois champs ont été créés : "ycoefh",      ! dans la premi\`ere couche, trois champs ont \'et\'e cr\'e\'es : "ycoefh",
27      ! "zu1" et "zv1". Nous avons moyenné les valeurs de ces trois      ! "zu1" et "zv1". Nous avons moyenn\'e les valeurs de ces trois
28      ! champs sur les quatre sous-surfaces du modèle.      ! champs sur les quatre sous-surfaces du mod\`ele.
29    
30      use clqh_m, only: clqh      use clqh_m, only: clqh
31      use clvent_m, only: clvent      use clvent_m, only: clvent
# Line 39  contains Line 38  contains
38      USE dimsoil, ONLY: nsoilmx      USE dimsoil, ONLY: nsoilmx
39      use hbtm_m, only: hbtm      use hbtm_m, only: hbtm
40      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
41        use stdlevvar_m, only: stdlevvar
42      USE suphec_m, ONLY: rd, rg, rkappa      USE suphec_m, ONLY: rd, rg, rkappa
43      use ustarhb_m, only: ustarhb      use ustarhb_m, only: ustarhb
44      use vdif_kcay_m, only: vdif_kcay      use vdif_kcay_m, only: vdif_kcay
# Line 57  contains Line 57  contains
57      INTEGER, INTENT(IN):: jour ! jour de l'annee en cours      INTEGER, INTENT(IN):: jour ! jour de l'annee en cours
58      REAL, intent(in):: rmu0(klon) ! cosinus de l'angle solaire zenithal          REAL, intent(in):: rmu0(klon) ! cosinus de l'angle solaire zenithal    
59      REAL, intent(in):: co2_ppm ! taux CO2 atmosphere      REAL, intent(in):: co2_ppm ! taux CO2 atmosphere
60      REAL, INTENT(IN):: ts(klon, nbsrf) ! input-R- temperature du sol (en Kelvin)      REAL, INTENT(IN):: ts(klon, nbsrf) ! temperature du sol (en Kelvin)
     LOGICAL, INTENT(IN):: soil_model  
61      REAL, INTENT(IN):: cdmmax, cdhmax ! seuils cdrm, cdrh      REAL, INTENT(IN):: cdmmax, cdhmax ! seuils cdrm, cdrh
62      REAL, INTENT(IN):: ksta, ksta_ter      REAL, INTENT(IN):: ksta, ksta_ter
63      LOGICAL, INTENT(IN):: ok_kzmin      LOGICAL, INTENT(IN):: ok_kzmin
64      REAL ftsoil(klon, nsoilmx, nbsrf)  
65        REAL, INTENT(inout):: ftsoil(klon, nsoilmx, nbsrf)
66        ! soil temperature of surface fraction
67    
68      REAL, INTENT(inout):: qsol(klon)      REAL, INTENT(inout):: qsol(klon)
69        ! column-density of water in soil, in kg m-2
70    
71      REAL, INTENT(IN):: paprs(klon, klev+1) ! pression a intercouche (Pa)      REAL, INTENT(IN):: paprs(klon, klev+1) ! pression a intercouche (Pa)
72      REAL, INTENT(IN):: pplay(klon, klev) ! pression au milieu de couche (Pa)      REAL, INTENT(IN):: pplay(klon, klev) ! pression au milieu de couche (Pa)
73      REAL snow(klon, nbsrf)      REAL snow(klon, nbsrf)
# Line 74  contains Line 78  contains
78    
79      REAL fluxlat(klon, nbsrf)      REAL fluxlat(klon, nbsrf)
80    
81      REAL, intent(in):: rain_fall(klon), snow_f(klon)      REAL, intent(in):: rain_fall(klon)
82        ! liquid water mass flux (kg/m2/s), positive down
83    
84        REAL, intent(in):: snow_f(klon)
85        ! solid water mass flux (kg/m2/s), positive down
86    
87      REAL, INTENT(IN):: solsw(klon, nbsrf), sollw(klon, nbsrf)      REAL, INTENT(IN):: solsw(klon, nbsrf), sollw(klon, nbsrf)
88      REAL fder(klon)      REAL, intent(in):: fder(klon)
89      REAL, INTENT(IN):: rlat(klon) ! latitude en degrés      REAL, INTENT(IN):: rlat(klon) ! latitude en degr\'es
90    
91      REAL rugos(klon, nbsrf)      REAL rugos(klon, nbsrf)
92      ! rugos----input-R- longeur de rugosite (en m)      ! rugos----input-R- longeur de rugosite (en m)
# Line 93  contains Line 102  contains
102      REAL, intent(out):: d_u(klon, klev), d_v(klon, klev)      REAL, intent(out):: d_u(klon, klev), d_v(klon, klev)
103      ! changement pour "u" et "v"      ! changement pour "u" et "v"
104    
105      REAL d_ts(klon, nbsrf)      REAL, intent(out):: d_ts(klon, nbsrf) ! le changement pour "ts"
     ! d_ts-----output-R- le changement pour "ts"  
106    
107      REAL flux_t(klon, klev, nbsrf), flux_q(klon, klev, nbsrf)      REAL flux_t(klon, klev, nbsrf), flux_q(klon, klev, nbsrf)
108      ! 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)
# Line 151  contains Line 159  contains
159      ! tslab-in/output-R temperature du slab ocean (en Kelvin)      ! tslab-in/output-R temperature du slab ocean (en Kelvin)
160      ! uniqmnt pour slab      ! uniqmnt pour slab
161    
     REAL seaice(klon)  
     ! seaice---output-R-  glace de mer (kg/m2) (pour OCEAN='slab  ')  
   
162      ! Local:      ! Local:
163    
164      REAL y_flux_o(klon), y_flux_g(klon)      REAL y_flux_o(klon), y_flux_g(klon)
165      real ytslab(klon)      real ytslab(klon)
     real y_seaice(klon)  
166      REAL y_fqcalving(klon), y_ffonte(klon)      REAL y_fqcalving(klon), y_ffonte(klon)
167      real y_run_off_lic_0(klon)      real y_run_off_lic_0(klon)
168    
# Line 172  contains Line 176  contains
176      REAL yu1(klon), yv1(klon)      REAL yu1(klon), yv1(klon)
177      ! on rajoute en output yu1 et yv1 qui sont les vents dans      ! on rajoute en output yu1 et yv1 qui sont les vents dans
178      ! la premiere couche      ! la premiere couche
179      REAL ysnow(klon), yqsurf(klon), yagesno(klon), yqsol(klon)      REAL ysnow(klon), yqsurf(klon), yagesno(klon)
180      REAL yrain_f(klon), ysnow_f(klon)  
181        real yqsol(klon)
182        ! column-density of water in soil, in kg m-2
183    
184        REAL yrain_f(klon)
185        ! liquid water mass flux (kg/m2/s), positive down
186    
187        REAL ysnow_f(klon)
188        ! solid water mass flux (kg/m2/s), positive down
189    
190      REAL ysollw(klon), ysolsw(klon)      REAL ysollw(klon), ysolsw(klon)
191      REAL yfder(klon)      REAL yfder(klon)
192      REAL yrugm(klon), yrads(klon), yrugoro(klon)      REAL yrugm(klon), yrads(klon), yrugoro(klon)
# Line 206  contains Line 219  contains
219      INTEGER ni(klon), knon, j      INTEGER ni(klon), knon, j
220    
221      REAL pctsrf_pot(klon, nbsrf)      REAL pctsrf_pot(klon, nbsrf)
222      ! "pourcentage potentiel" pour tenir compte des éventuelles      ! "pourcentage potentiel" pour tenir compte des \'eventuelles
223      ! apparitions ou disparitions de la glace de mer      ! apparitions ou disparitions de la glace de mer
224    
225      REAL zx_alf1, zx_alf2 !valeur ambiante par extrapola.      REAL zx_alf1, zx_alf2 !valeur ambiante par extrapola.
# Line 270  contains Line 283  contains
283      ysnow = 0.      ysnow = 0.
284      yqsurf = 0.      yqsurf = 0.
285      yalb = 0.      yalb = 0.
     yalblw = 0.  
286      yrain_f = 0.      yrain_f = 0.
287      ysnow_f = 0.      ysnow_f = 0.
288      yfder = 0.      yfder = 0.
# Line 294  contains Line 306  contains
306      y_dflux_q = 0.      y_dflux_q = 0.
307      ytsoil = 999999.      ytsoil = 999999.
308      yrugoro = 0.      yrugoro = 0.
     ! -- LOOP  
309      yu10mx = 0.      yu10mx = 0.
310      yu10my = 0.      yu10my = 0.
311      ywindsp = 0.      ywindsp = 0.
     ! -- LOOP  
312      d_ts = 0.      d_ts = 0.
313      yfluxlat = 0.      yfluxlat = 0.
314      flux_t = 0.      flux_t = 0.
# Line 311  contains Line 321  contains
321      d_v = 0.      d_v = 0.
322      ycoefh = 0.      ycoefh = 0.
323    
324      ! Initialisation des "pourcentages potentiels". On considère ici qu'on      ! Initialisation des "pourcentages potentiels". On consid\`ere ici qu'on
325      ! peut avoir potentiellement de la glace sur tout le domaine océanique      ! peut avoir potentiellement de la glace sur tout le domaine oc\'eanique
326      ! (à affiner)      ! (\`a affiner)
327    
328      pctsrf_pot = pctsrf      pctsrf_pot = pctsrf
329      pctsrf_pot(:, is_oce) = 1. - zmasq      pctsrf_pot(:, is_oce) = 1. - zmasq
# Line 326  contains Line 336  contains
336         ni = 0         ni = 0
337         knon = 0         knon = 0
338         DO i = 1, klon         DO i = 1, klon
339            ! Pour déterminer le domaine à traiter, on utilise les surfaces            ! Pour d\'eterminer le domaine \`a traiter, on utilise les surfaces
340            ! "potentielles"            ! "potentielles"
341            IF (pctsrf_pot(i, nsrf) > epsfra) THEN            IF (pctsrf_pot(i, nsrf) > epsfra) THEN
342               knon = knon + 1               knon = knon + 1
# Line 343  contains Line 353  contains
353               ysnow(j) = snow(i, nsrf)               ysnow(j) = snow(i, nsrf)
354               yqsurf(j) = qsurf(i, nsrf)               yqsurf(j) = qsurf(i, nsrf)
355               yalb(j) = albe(i, nsrf)               yalb(j) = albe(i, nsrf)
              yalblw(j) = alblw(i, nsrf)  
356               yrain_f(j) = rain_fall(i)               yrain_f(j) = rain_fall(i)
357               ysnow_f(j) = snow_f(i)               ysnow_f(j) = snow_f(i)
358               yagesno(j) = agesno(i, nsrf)               yagesno(j) = agesno(i, nsrf)
# Line 413  contains Line 422  contains
422            END IF            END IF
423    
424            IF (iflag_pbl >= 3) THEN            IF (iflag_pbl >= 3) THEN
425               ! Mellor et Yamada adapté à Mars, Richard Fournier et               ! Mellor et Yamada adapt\'e \`a Mars, Richard Fournier et
426               ! Frédéric Hourdin               ! Fr\'ed\'eric Hourdin
427               yzlay(:knon, 1) = rd * yt(:knon, 1) / (0.5 * (ypaprs(:knon, 1) &               yzlay(:knon, 1) = rd * yt(:knon, 1) / (0.5 * (ypaprs(:knon, 1) &
428                    + ypplay(:knon, 1))) &                    + ypplay(:knon, 1))) &
429                    * (ypaprs(:knon, 1) - ypplay(:knon, 1)) / rg                    * (ypaprs(:knon, 1) - ypplay(:knon, 1)) / rg
# Line 444  contains Line 453  contains
453               CALL ustarhb(knon, yu, yv, coefm(:knon, 1), yustar)               CALL ustarhb(knon, yu, yv, coefm(:knon, 1), yustar)
454               IF (prt_level > 9) PRINT *, 'USTAR = ', yustar               IF (prt_level > 9) PRINT *, 'USTAR = ', yustar
455    
456               ! iflag_pbl peut être utilisé comme longueur de mélange               ! iflag_pbl peut \^etre utilis\'e comme longueur de m\'elange
457    
458               IF (iflag_pbl >= 11) THEN               IF (iflag_pbl >= 11) THEN
459                  CALL vdif_kcay(knon, dtime, rg, rd, ypaprs, yt, yzlev, yzlay, &                  CALL vdif_kcay(knon, dtime, rg, ypaprs, yzlev, yzlay, yu, yv, &
460                       yu, yv, yteta, coefm(:knon, 1), yq2, q2diag, ykmm, ykmn, &                       yteta, coefm(:knon, 1), yq2, q2diag, ykmm, ykmn, yustar, &
461                       yustar, iflag_pbl)                       iflag_pbl)
462               ELSE               ELSE
463                  CALL yamada4(knon, dtime, rg, yzlev, yzlay, yu, yv, yteta, &                  CALL yamada4(knon, dtime, rg, yzlev, yzlay, yu, yv, yteta, &
464                       coefm(:knon, 1), yq2, ykmm, ykmn, ykmq, yustar, iflag_pbl)                       coefm(:knon, 1), yq2, ykmm, ykmn, ykmq, yustar, iflag_pbl)
# Line 466  contains Line 475  contains
475                 ypplay, ydelp, y_d_v, y_flux_v)                 ypplay, ydelp, y_d_v, y_flux_v)
476    
477            ! calculer la diffusion de "q" et de "h"            ! calculer la diffusion de "q" et de "h"
478            CALL clqh(dtime, itap, jour, debut, rlat, knon, nsrf, ni, pctsrf, &            CALL clqh(dtime, itap, jour, debut, rlat, knon, nsrf, ni(:knon), &
479                 soil_model, ytsoil, yqsol, rmu0, co2_ppm, yrugos, yrugoro, &                 pctsrf, ytsoil, yqsol, rmu0, co2_ppm, yrugos, yrugoro, yu1, &
480                 yu1, yv1, coefh(:knon, :), yt, yq, yts, ypaprs, ypplay, ydelp, &                 yv1, coefh(:knon, :), yt, yq, yts, ypaprs, ypplay, ydelp, &
481                 yrads, yalb, yalblw, ysnow, yqsurf, yrain_f, ysnow_f, yfder, &                 yrads, yalb, yalblw(:knon), ysnow, yqsurf, yrain_f, ysnow_f, &
482                 ysolsw, yfluxlat, pctsrf_new, yagesno, y_d_t, y_d_q, y_d_ts, &                 yfder, ysolsw, yfluxlat, pctsrf_new, yagesno, y_d_t, y_d_q, &
483                 yz0_new, y_flux_t, y_flux_q, y_dflux_t, y_dflux_q, &                 y_d_ts(:knon), yz0_new, y_flux_t, y_flux_q, y_dflux_t, &
484                 y_fqcalving, y_ffonte, y_run_off_lic_0, y_flux_o, y_flux_g, &                 y_dflux_q, y_fqcalving, y_ffonte, y_run_off_lic_0, y_flux_o, &
485                 ytslab, y_seaice)                 y_flux_g)
486    
487            ! calculer la longueur de rugosite sur ocean            ! calculer la longueur de rugosite sur ocean
488            yrugm = 0.            yrugm = 0.
# Line 546  contains Line 555  contains
555                  run_off_lic_0(i) = y_run_off_lic_0(j)                  run_off_lic_0(i) = y_run_off_lic_0(j)
556               END DO               END DO
557            END IF            END IF
558            !$$$ PB ajout pour soil  
559            ftsoil(:, :, nsrf) = 0.            ftsoil(:, :, nsrf) = 0.
560            DO k = 1, nsoilmx            DO k = 1, nsoilmx
561               DO j = 1, knon               DO j = 1, knon
# Line 602  contains Line 611  contains
611    
612            END DO            END DO
613    
614            CALL hbtm(knon, ypaprs, ypplay, yt2m, yt10m, yq2m, yq10m, yustar, &            CALL hbtm(knon, ypaprs, ypplay, yt2m, yq2m, yustar, &
615                 y_flux_t, y_flux_q, yu, yv, yt, yq, ypblh, ycapcl, yoliqcl, &                 y_flux_t, y_flux_q, yu, yv, yt, yq, ypblh, ycapcl, yoliqcl, &
616                 ycteicl, ypblt, ytherm, ytrmb1, ytrmb2, ytrmb3, ylcl)                 ycteicl, ypblt, ytherm, ytrmb1, ytrmb2, ytrmb3, ylcl)
617    
# Line 642  contains Line 651  contains
651            IF (nsrf == is_sic) THEN            IF (nsrf == is_sic) THEN
652               DO j = 1, knon               DO j = 1, knon
653                  i = ni(j)                  i = ni(j)
654                  ! On pondère lorsque l'on fait le bilan au sol :                  ! On pond\`ere lorsque l'on fait le bilan au sol :
655                  IF (pctsrf_new(i, is_sic)>epsfra) THEN                  IF (pctsrf_new(i, is_sic)>epsfra) THEN
656                     flux_g(i) = y_flux_g(j)                     flux_g(i) = y_flux_g(j)
657                  ELSE                  ELSE

Legend:
Removed from v.99  
changed lines
  Added in v.154

  ViewVC Help
Powered by ViewVC 1.1.21