Changeset 3974 for LMDZ6/trunk


Ignore:
Timestamp:
Jul 30, 2021, 4:27:30 PM (3 years ago)
Author:
asima
Message:

In the "bucket" soil model, soil thermal inertia (formerly a constant value) can also be now a function of soil moisture "qsol"
(F Cheruy's idea; results from "Stage L3" Eve Rebouillat, with E Vignon, A Sima, F Cheruy).

The function depends on iflag_inertie, read from physiq.def (via conf_phys_m.F90), as follows :
(only in physiq.def_NPv6.1 for the time being)


# Controle de la definition de l'inertie thermique du sol dans le modele "bucket":
# 0 (default) : constant
# 1 : fonction lineaire de qsol
# 2 : 2 fonctions lineaires de qsol :
# une pour "sable" (boite lat/lon pour Sahara), une pour le reste (limons et argile)
# 3 : fonction lineaire de qsol, valeurs entre 900 pour qsol=0 et 2000 pour qsol=150

iflag_inertie=0


Relevant changes are in soil.F90 and physiq.def_NPv6.1 ; the other files are adjusted accordingly.

Location:
LMDZ6/trunk
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • LMDZ6/trunk/DefLists/physiq.def_NPv6.1

    r3621 r3974  
    169169iflag_albedo=1
    170170
     171    # Controle de la definition de l'inertie thermique du sol dans le modele "bucket":
     172    #   0 (default) : constant
     173    #   1 : fonction lineaire de qsol
     174    #   2 : 2 fonctions lineaires de qsol :
     175    #       une pour "sable" (boite lat/lon pour Sahara), une pour le reste (limons et argile)
     176    #   3 : fonction lineaire de qsol, valeurs entre 900 pour qsol=0 et 2000 pour qsol=150
     177iflag_inertie=0
     178
    171179          # Frequence appel convection. Nombre appels par jour
    172180nbapp_cv=48
  • LMDZ6/trunk/libf/phylmd/comsoil.h

    r2915 r3974  
    44
    55      common /comsoil/inertie_sol,inertie_sno,inertie_sic,inertie_lic,  &
    6      &                iflag_sic
     6     &                iflag_sic,iflag_inertie
    77      real inertie_sol,inertie_sno,inertie_sic,inertie_lic
    8       integer iflag_sic
     8      integer iflag_sic,iflag_inertie
    99!$OMP THREADPRIVATE(/comsoil/)
  • LMDZ6/trunk/libf/phylmd/conf_phys_m.F90

    r3948 r3974  
    183183    REAL,SAVE :: exposant_glace_omp
    184184    REAL,SAVE :: rei_min_omp, rei_max_omp
    185     INTEGER,SAVE :: iflag_sic_omp
     185    INTEGER,SAVE :: iflag_sic_omp, iflag_inertie_omp
    186186    REAL,SAVE :: inertie_sol_omp,inertie_sno_omp,inertie_sic_omp
    187187    REAL,SAVE :: inertie_lic_omp
     
    13251325    CALL getin('iflag_sic',iflag_sic_omp)
    13261326    !
     1327    !Config Key  = iflag_inertie
     1328    !Config Desc =
     1329    !Config Def  = 0
     1330    !Config Help =
     1331    !
     1332    iflag_inertie_omp = 0
     1333    CALL getin('iflag_inertie',iflag_inertie_omp)
     1334    !
    13271335    !Config Key  = inertie_sic
    13281336    !Config Desc = 
     
    23952403    albsno0 = albsno0_omp
    23962404    iflag_sic = iflag_sic_omp
     2405    iflag_inertie = iflag_inertie_omp
    23972406    inertie_sol = inertie_sol_omp
    23982407    inertie_sic = inertie_sic_omp
     
    28812890    WRITE(lunout,*) ' albsno0 = ', albsno0
    28822891    WRITE(lunout,*) ' iflag_sic = ', iflag_sic
     2892    WRITE(lunout,*) ' iflag_inertie = ', iflag_inertie
    28832893    WRITE(lunout,*) ' inertie_sol = ', inertie_sol
    28842894    WRITE(lunout,*) ' inertie_sic = ', inertie_sic
  • LMDZ6/trunk/libf/phylmd/ocean_forced_mod.F90

    r3815 r3974  
    180180!
    181181    USE dimphy
     182    USE geometry_mod, ONLY: longitude,latitude
    182183    USE calcul_fluxs_mod
    183184    USE surface_data,     ONLY : calice, calsno
     
    260261    IF (soil_model) THEN
    261262! update tsoil and calculate soilcap and soilflux
    262        CALL soil(dtime, is_sic, knon, snow, tsurf_tmp, tsoil,soilcap, soilflux)
     263       CALL soil(dtime, is_sic, knon, snow, tsurf_tmp, qsol, &
     264        & longitude(knindex(1:knon)), latitude(knindex(1:knon)), tsoil,soilcap, soilflux)
    263265       cal(1:knon) = RCPD / soilcap(1:knon)
    264266       radsol(1:knon) = radsol(1:knon)  + soilflux(1:knon)
  • LMDZ6/trunk/libf/phylmd/soil.F90

    r2915 r3974  
    22! $Header$
    33!
    4 SUBROUTINE soil(ptimestep, indice, knon, snow, ptsrf, &
    5      ptsoil, pcapcal, pfluxgrd)
     4SUBROUTINE soil(ptimestep, indice, knon, snow, ptsrf, qsol, &
     5     lon, lat, ptsoil, pcapcal, pfluxgrd)
    66 
    77  USE dimphy
     
    2121!                            the surface conduction flux pcapcal
    2222!
     23!   Update: 2021/07 : soil thermal inertia, formerly a constant value,
     24!   ------   can also be now a function of soil moisture (F Cheruy's idea)
     25!            depending on iflag_inertie, read from physiq.def via conf_phys_m.F90
     26!            ("Stage L3" Eve Rebouillat, with E Vignon, A Sima, F Cheruy)
    2327!
    2428!   Method: Implicit time integration
     
    4852!   snow(klon)           snow
    4953!   ptsrf(klon)          surface temperature at time-step t (K)
     54!   qsol(klon)           soil moisture (kg/m2 or mm)
     55!   lon(klon)            longitude in radian
     56!   lat(klon)            latitude in radian
    5057!   ptsoil(klon,nsoilmx) temperature inside the ground (K)
    5158!   pcapcal(klon)        surfacic specific heat (W*m-2*s*K-1)
     
    6067! ---------
    6168  REAL, INTENT(IN)                     :: ptimestep
    62   INTEGER, INTENT(IN)                  :: indice, knon
     69  INTEGER, INTENT(IN)                  :: indice, knon !, knindex
    6370  REAL, DIMENSION(klon), INTENT(IN)    :: snow
    6471  REAL, DIMENSION(klon), INTENT(IN)    :: ptsrf
    65  
     72  REAL, DIMENSION(klon), INTENT(IN)    :: qsol
     73  REAL, DIMENSION(klon), INTENT(IN)    :: lon
     74  REAL, DIMENSION(klon), INTENT(IN)    :: lat
     75
    6676  REAL, DIMENSION(klon,nsoilmx), INTENT(INOUT) :: ptsoil
    6777  REAL, DIMENSION(klon), INTENT(OUT)           :: pcapcal
     
    182192!      knon, knindex, ztherm_i)
    183193  ELSE IF (indice == is_ter) THEN
     194     !
     195     ! La relation entre l'inertie thermique du sol et qsol change d'apres
     196     !   iflag_inertie, defini dans physiq.def, et appele via comsoil.h
     197     !
    184198     DO ig = 1, knon
    185         ztherm_i(ig)   = inertie_sol
     199        ! iflag_inertie=0 correspond au cas inertie=constant, comme avant
     200        IF (iflag_inertie==0) THEN         
     201           ztherm_i(ig)   = inertie_sol
     202        ELSE IF (iflag_inertie == 1) THEN
     203          ! I = a_qsol * qsol + b  modele lineaire deduit d'une
     204          ! regression lineaire I = a_mrsos * mrsos + b obtenue sur
     205          ! sorties MO d'une simulation LMDZOR(CMIP6) sur l'annee 2000
     206          ! sur tous les points avec frac_snow=0
     207          ! Difference entre qsol et mrsos prise en compte par un
     208          ! facteur d'echelle sur le coefficient directeur de regression:
     209          ! fact = 35./150. = mrsos_max/qsol_max
     210          ! et a_qsol = a_mrsos * fact (car a = dI/dHumidite)
     211            ztherm_i(ig) = 30.0 *35.0/150.0 *qsol(ig) +770.0
     212          ! AS : pour qsol entre 0 - 150, on a I entre 770 - 1820
     213        ELSE IF (iflag_inertie == 2) THEN
     214          ! deux regressions lineaires, sur les memes sorties, 
     215          ! distinguant le type de sol : sable ou autre (limons/argile)
     216          ! Implementation simple : regression type "sable" seulement pour
     217          ! Sahara, defini par une "boite" lat/lon (NB : en radians !! )
     218          IF (lon(ig)>-0.35 .AND. lon(ig)<0.70 .AND. lat(ig)>0.17 .AND. lat(ig)<0.52) THEN
     219              ! Valeurs theoriquement entre 728 et 2373 ; qsol valeurs basses
     220              ztherm_i(ig) = 47. *35.0/150.0 *qsol(ig) +728.  ! boite type "sable" pour Sahara
     221          ELSE
     222              ! Valeurs theoriquement entre 550 et 1940 ; qsol valeurs moyennes et hautes
     223              ztherm_i(ig) = 41. *35.0/150.0 *qsol(ig) +505.
     224          ENDIF
     225        ELSE IF (iflag_inertie == 3) THEN
     226          ! AS : idee a tester :
     227          ! si la relation doit etre une droite,
     228          ! definissons-la en fonction des valeurs min et max de qsol (0:150),
     229          ! et de l'inertie (900 : 2000 ou 2400 ; choix ici: 2000)
     230          ! I = I_min + qsol * (I_max - I_min)/(qsol_max - qsol_min)
     231              ztherm_i(ig) = 900. + qsol(ig) * (2000. - 900.)/150.
     232        ELSE         
     233          WRITE (lunout,*) "Le choix iflag_inertie = ",iflag_inertie," n'est pas defini. Veuillez choisir un entier entre 0 et 3"
     234        ENDIF
     235     !
     236     ! Fin de l'introduction de la relation entre l'inertie thermique du sol et qsol
     237     !-------------------------------------------
     238        !AS : donc le moindre flocon de neige sur un point de grid
     239        ! fait que l'inertie du point passe a la valeur pour neige !
    186240        IF (snow(ig) > 0.0) ztherm_i(ig)   = inertie_sno
     241       
    187242     ENDDO
    188243!    CALL iophys_ecrit_index('ztherm_ter', 1, 'ztherm_ter', 'USI', &
  • LMDZ6/trunk/libf/phylmd/surf_land_bucket_mod.F90

    r2351 r3974  
    2424    USE cpl_mod
    2525    USE dimphy
    26     USE geometry_mod, ONLY: latitude
     26    USE geometry_mod, ONLY: longitude,latitude
    2727    USE mod_grid_phy_lmdz
    2828    USE mod_phys_lmdz_para
     
    103103       
    104104! calculate temperature, heat capacity and conduction flux in soil
    105     IF (soil_model) THEN
    106        CALL soil(dtime, is_ter, knon, snow, tsurf, tsoil, soilcap, soilflux)
     105    IF (soil_model) THEN
     106       CALL soil(dtime, is_ter, knon, snow, tsurf, qsol,  &
     107        & longitude(knindex(1:knon)), latitude(knindex(1:knon)), tsoil, soilcap, soilflux)
     108
    107109       DO i=1, knon
    108110          cal(i) = RCPD / soilcap(i)
  • LMDZ6/trunk/libf/phylmd/surf_landice_mod.F90

    r3903 r3974  
    2525
    2626    USE dimphy
     27    USE geometry_mod,     ONLY : longitude,latitude
    2728    USE surface_data,     ONLY : type_ocean, calice, calsno, landice_opt, iflag_albcalc
    2829    USE fonte_neige_mod,  ONLY : fonte_neige,run_off_lic,fqcalving_global,ffonte_global,fqfonte_global,runofflic_global
     
    278279    ! use soil model and recalculate properly cal
    279280    IF (soil_model) THEN
    280        CALL soil(dtime, is_lic, knon, snow, tsurf, tsoil, soilcap, soilflux)
     281       CALL soil(dtime, is_lic, knon, snow, tsurf, qsol, &
     282        & longitude(knindex(1:knon)), latitude(knindex(1:knon)), tsoil, soilcap, soilflux)
    281283       cal(1:knon) = RCPD / soilcap(1:knon)
    282284       radsol(1:knon)  = radsol(1:knon) + soilflux(1:knon)
Note: See TracChangeset for help on using the changeset viewer.