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.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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', &
Note: See TracChangeset for help on using the changeset viewer.