Changeset 3974 for LMDZ6/trunk/libf/phylmd/soil.F90
- Timestamp:
- Jul 30, 2021, 4:27:30 PM (3 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ6/trunk/libf/phylmd/soil.F90
r2915 r3974 2 2 ! $Header$ 3 3 ! 4 SUBROUTINE soil(ptimestep, indice, knon, snow, ptsrf, &5 ptsoil, pcapcal, pfluxgrd)4 SUBROUTINE soil(ptimestep, indice, knon, snow, ptsrf, qsol, & 5 lon, lat, ptsoil, pcapcal, pfluxgrd) 6 6 7 7 USE dimphy … … 21 21 ! the surface conduction flux pcapcal 22 22 ! 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) 23 27 ! 24 28 ! Method: Implicit time integration … … 48 52 ! snow(klon) snow 49 53 ! 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 50 57 ! ptsoil(klon,nsoilmx) temperature inside the ground (K) 51 58 ! pcapcal(klon) surfacic specific heat (W*m-2*s*K-1) … … 60 67 ! --------- 61 68 REAL, INTENT(IN) :: ptimestep 62 INTEGER, INTENT(IN) :: indice, knon 69 INTEGER, INTENT(IN) :: indice, knon !, knindex 63 70 REAL, DIMENSION(klon), INTENT(IN) :: snow 64 71 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 66 76 REAL, DIMENSION(klon,nsoilmx), INTENT(INOUT) :: ptsoil 67 77 REAL, DIMENSION(klon), INTENT(OUT) :: pcapcal … … 182 192 ! knon, knindex, ztherm_i) 183 193 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 ! 184 198 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 ! 186 240 IF (snow(ig) > 0.0) ztherm_i(ig) = inertie_sno 241 187 242 ENDDO 188 243 ! CALL iophys_ecrit_index('ztherm_ter', 1, 'ztherm_ter', 'USI', &
Note: See TracChangeset
for help on using the changeset viewer.