SURFEX v8.1
General documentation of Surfex
soildif.F90
Go to the documentation of this file.
1 !SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
2 !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence
3 !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
4 !SFX_LIC for details. version 1.
5 ! #########
6  SUBROUTINE soildif(IO, KK, PK, PEK, DMI, PVEG, PFROZEN1, PFFG, PFFV, PSOILCONDZ, PSOILHCAPZ )
7 ! ##########################################################################
8 !
9 !!**** *SOIL*
10 !!
11 !! PURPOSE
12 !! -------
13 !
14 ! Calculates the coefficients related to the soil (i.e., surface heat capacities, CG, CT,
15 ! and thermal conductivity and heat capacity profiles)
16 !
17 !
18 !!** METHOD
19 !! ------
20 !
21 ! Direct calculation
22 !
23 !! EXTERNAL
24 !! --------
25 !
26 ! None
27 !!
28 !! IMPLICIT ARGUMENTS
29 !! ------------------
30 !!
31 !! USE MODD_CST
32 !! USE MODD_PARAMETERS
33 !!
34 !!
35 !! REFERENCE
36 !! ---------
37 !!
38 !! Noilhan and Planton (1989)
39 !! Belair (1995)
40 !! Boone (2000)
41 !!
42 !! AUTHOR
43 !! ------
44 !! A. Boone * Meteo-France *
45 !!
46 !! MODIFICATIONS
47 !! -------------
48 !! Original
49 !! 25/03/99 (Boone) Added Johansen (1975)/Peters-Lidard
50 !! option to explicitly compute CG
51 !! 08/25/02 (Boone) DIF option code only
52 !! 25/05/08 (Decharme) Add Flood properties
53 !! 03/08/11 (Decharme) Optimization
54 !! 04/13 (Decharme) good soil moisture extrapolation computation
55 !! 23/07/13 (Decharme) Surface / Water table depth coupling
56 !! 23/10/14 (Decharme) revise all thermo properties
57 !! delete NP89 option for thermal cond
58 !! because not physical with explicit soil.
59 !-------------------------------------------------------------------------------
60 !
61 !* 0. DECLARATIONS
62 ! ------------
63 !
67 !
68 USE modd_csts, ONLY : xcl, xci, xrholw, xrholi, xpi, xday, xcondi, xtt, xlmtt, xg
69 USE modd_isba_par, ONLY : xcondwtr, xwgmin, xwtd_maxdepth, &
70  xomrho, xomsph, xomconddry, &
71  xomcondsld, xcvheatf
72 USE modd_surf_par, ONLY : xundef
73 !
74 USE yomhook ,ONLY : lhook, dr_hook
75 USE parkind1 ,ONLY : jprb
76 !
77 IMPLICIT NONE
78 !
79 !* 0.1 declarations of arguments
80 !
81 !
82 TYPE(isba_options_t), INTENT(INOUT) :: IO
83 TYPE(isba_k_t), INTENT(INOUT) :: KK
84 TYPE(isba_p_t), INTENT(INOUT) :: PK
85 TYPE(isba_pe_t), INTENT(INOUT) :: PEK
86 TYPE(diag_misc_isba_t), INTENT(INOUT) :: DMI
87 !
88 REAL, DIMENSION(:), INTENT(IN) :: PVEG
89 ! Soil and vegetation parameters
90 ! PVEG = fraction of vegetation
91 
92 !
93 REAL, DIMENSION(:), INTENT(OUT) :: PFROZEN1
94 ! PFROZEN1 = fraction of ice in superficial soil
95 !
96 REAL, DIMENSION(:), INTENT(IN) :: PFFV, PFFG
97 ! PFFG = Floodplain fraction over the ground
98 ! without snow (ES)
99 ! PFFV = Floodplain fraction over vegetation
100 ! without snow (ES)
101 !
102 REAL, DIMENSION(:,:), INTENT(OUT) :: PSOILCONDZ, PSOILHCAPZ
103 ! PSOILHCAP = soil heat capacity (J m-3 K-1)
104 ! PSOILCOND = soil thermal conductivity (W m-1 K-1)
105 !
106 !* 0.2 declarations of local variables
107 !
108 REAL, DIMENSION(SIZE(PEK%XTG,1),SIZE(PEK%XTG,2)) :: ZMATPOT, ZCONDDRYZ, ZCONDSLDZ, ZVEGMULCH
109 ! ZMATPOT = soil matric potential (m)
110 !
111 REAL :: ZFROZEN2DF, ZUNFROZEN2DF, ZCONDSATDF, ZLOG_CONDI, ZLOG_CONDWTR, &
112  ZSATDEGDF, ZKERSTENDF, ZWORK1, ZWORK2, ZWORK3, ZLOG, ZWTOT, ZWL
113 !
114 REAL, PARAMETER :: ZCTMAX = 1.e-4 ! Maximum thermal inertia
115 !
116 REAL, PARAMETER :: ZTHICKM = 0.04 ! Mulch thickness (m)
117 !
118 REAL, DIMENSION(SIZE(PVEG)) :: ZFF, ZCF, ZCV !Thermal inertia of the flood or vegetation
119 !
120 REAL, DIMENSION(SIZE(PVEG)) :: ZWTD ! Water table depth if no coupling (m)
121 !
122 INTEGER :: INI, INL, JJ, JL, IDEPTH
123 !
124 REAL(KIND=JPRB) :: ZHOOK_HANDLE
125 !
126 !-------------------------------------------------------------------------------
127 !
128 !* 0. Initialization:
129 ! ---------------
130 !
131 IF (lhook) CALL dr_hook('SOILDIF',0,zhook_handle)
132 !
133 ini=SIZE(pek%XWG,1)
134 inl=SIZE(pek%XWG,2)
135 !
136 zff(:) = 0.0
137 zcf(:) = xundef
138 !
139 !-------------------------------------------------------------------------------
140 !
141 !* 1. WATER TABLE DETH ADJUSTMENT FOR ISBA (m)
142 ! -----------------------------------------
143 !
144 WHERE(kk%XWTD(:)==xundef)
145 ! no water table / surface coupling over some regions
146  zwtd(:) = xwtd_maxdepth
147 ELSEWHERE
148  zwtd(:) = kk%XFWTD(:)/max(-kk%XWTD(:),0.001) + (1.0-kk%XFWTD(:))/max(-kk%XWTD(:),xwtd_maxdepth)
149  zwtd(:) = 1.0/zwtd(:)
150 ENDWHERE
151 !
152 !-------------------------------------------------------------------------------
153 !
154 !* 2. MATRIC POTENTIAL AND MOISTURE EXTRAPOLATION
155 ! -------------------------------------------
156 !
157 DO jl=1,inl
158  DO jj=1,ini
159 !
160  idepth=pk%NWG_LAYER(jj)
161  IF(jl>idepth)THEN
162 !
163 ! total matric potential
164  zwork1 = min(1.0,(pek%XWG(jj,idepth)+pek%XWGI(jj,idepth))/kk%XWSAT(jj,idepth))
165  zlog = kk%XBCOEF(jj,idepth)*log(zwork1)
166  zmatpot(jj,idepth) = kk%XMPOTSAT(jj,idepth)*exp(-zlog)
167 
168 ! extrapolation of total matric potential
169  zwork1 = 0.5*(pk%XDG(jj,idepth) + pk%XDG(jj,idepth-1))
170  zwork2 = 0.5*(pk%XDG(jj,jl ) + pk%XDG(jj,jl-1))
171  zwork3 = max(0.0,(zwtd(jj)-zwork2)/(zwork2-zwork1))
172  zmatpot(jj,jl) = (kk%XMPOTSAT(jj,jl)+zwork3*zmatpot(jj,idepth))/(1.0+zwork3)
173 !
174 ! total soil water content computation
175  zwork1 = max(1.0,zmatpot(jj,jl)/kk%XMPOTSAT(jj,jl))
176  zlog = log(zwork1)/kk%XBCOEF(jj,jl)
177  zwtot = kk%XWSAT(jj,jl)*exp(-zlog)
178  zwtot = max(xwgmin,zwtot)
179 !
180 ! soil liquid water content computation
181  zmatpot(jj,jl) = min(kk%XMPOTSAT(jj,jl),xlmtt*(pek%XTG(jj,jl)-xtt)/(xg*pek%XTG(jj,jl)))
182 !
183  zwork1 = max(1.0,zmatpot(jj,jl)/kk%XMPOTSAT(jj,jl))
184  zlog = log(zwork1)/kk%XBCOEF(jj,jl)
185  zwl = kk%XWSAT(jj,jl)*exp(-zlog)
186  zwl = max(zwl,xwgmin)
187  pek%XWG (jj,jl) = min(zwl,zwtot )
188 !
189 ! soil ice computation
190  pek%XWGI(jj,jl) = max(0.0,zwtot-pek%XWG(jj,jl))
191 !
192  ENDIF
193  ENDDO
194 ENDDO
195 !
196 !-------------------------------------------------------------------------------
197 !
198 !* 3. SURFACE FROZEN FRACTION
199 ! -----------------------
200 !
201 !
202 ! Surface soil water reservoir frozen fraction:
203 !
204 pfrozen1(:) = pek%XWGI(:,1)/(pek%XWGI(:,1) + max(pek%XWG(:,1),xwgmin))
205 !
206 !-------------------------------------------------------------------------------
207 !
208 !* 4. SIMPLE LITTER/MULCH EFFECT
209 ! --------------------------
210 !
211 ! This takes into account the insulating effect of dead vegetation/leaf litter/mulch on
212 ! uppermost soil layers thermal properties. Use organic matter thermal properties.
213 !
214 !
215 zconddryz(:,:) = kk%XCONDDRY (:,:)
216 zcondsldz(:,:) = kk%XCONDSLD (:,:)
217 !
218 IF(io%CDIFSFCOND == 'MLCH') THEN
219 !
220  DO jl=1,inl
221  DO jj=1,ini
222 !
223  zvegmulch(jj,jl) = pveg(jj)*min(pk%XDZG(jj,jl),max(0.0,zthickm-pk%XDG(jj,jl)+pk%XDZG(jj,jl)))/pk%XDZG(jj,jl)
224 !
225  IF(zvegmulch(jj,jl)>0.0)THEN
226  zconddryz(jj,jl) = 1.0/((1.0-zvegmulch(jj,jl))/kk%XCONDDRY(jj,jl)+zvegmulch(jj,jl)/xomconddry)
227  zcondsldz(jj,jl) = 1.0/((1.0-zvegmulch(jj,jl))/kk%XCONDSLD(jj,jl)+zvegmulch(jj,jl)/xomcondsld)
228  ENDIF
229 !
230  ENDDO
231  ENDDO
232 !
233 ENDIF
234 !
235 !-------------------------------------------------------------------------------
236 !
237 !* 5. THE THERMAL CONDUCTIVITY OF BARE-GROUND
238 ! ---------------------------------------
239 !
240 ! Calculate thermal conductivity using PL98 :
241 !
242 zlog_condi = log(xcondi)
243 zlog_condwtr = log(xcondwtr)
244 !
245 DO jl=1,inl
246  DO jj=1,ini
247 !
248  zfrozen2df = pek%XWGI(jj,jl)/(pek%XWGI(jj,jl) + max(pek%XWG(jj,jl),xwgmin))
249  zunfrozen2df = (1.0-zfrozen2df)*kk%XWSAT(jj,jl)
250 !
251 !Old: CONDSATDF=(CONDSLDZ**(1.0-WSAT))*(CONDI**(WSAT-UNFROZEN2DF))*(CONDWTR**UNFROZEN2DF)
252  zwork1 = log(zcondsldz(jj,jl))*(1.0-kk%XWSAT(jj,jl))
253  zwork2 = zlog_condi*(kk%XWSAT(jj,jl)-zunfrozen2df)
254  zwork3 = zlog_condwtr*zunfrozen2df
255  zcondsatdf = exp(zwork1+zwork2+zwork3)
256 !
257  zsatdegdf = max(0.1, (pek%XWGI(jj,jl)+pek%XWG(jj,jl))/kk%XWSAT(jj,jl))
258  zsatdegdf = min(1.0,zsatdegdf)
259  zkerstendf = log10(zsatdegdf) + 1.0
260  zkerstendf = (1.0-zfrozen2df)*zkerstendf + zfrozen2df *zsatdegdf
261 !
262 ! Thermal conductivity of soil:
263 !
264  psoilcondz(jj,jl) = zkerstendf*(zcondsatdf-zconddryz(jj,jl)) + zconddryz(jj,jl)
265 !
266  ENDDO
267 ENDDO
268 !
269 !-------------------------------------------------------------------------------
270 !
271 !* 6. THE HEAT CAPACITY OF BARE-GROUND
272 ! --------------------------------
273 !
274 ! Soil Heat capacity [J/(m3 K)]
275 !
276 DO jl=1,inl
277  DO jj=1,ini
278  psoilhcapz(jj,jl) = (1.0-kk%XWSAT(jj,jl))*kk%XHCAPSOIL(jj,jl) + &
279  pek%XWG (jj,jl) *xcl*xrholw + pek%XWGI (jj,jl) *xci*xrholi
280  ENDDO
281 ENDDO
282 !
283 ! Surface soil thermal inertia [(m2 K)/J]
284 !
285 dmi%XCG(:) = 1.0 / ( pk%XDG(:,1) * psoilhcapz(:,1) )
286 !
287 dmi%XCG(:) = min(zctmax,dmi%XCG(:))
288 !
289 !-------------------------------------------------------------------------------
290 !
291 !* 7. THE HEAT CAPACITY OF VEGETATION
292 ! --------------------------------
293 !
294 ! Vegetation thermal inertia [(m2 K)/J]
295 !
296 zcv(:) = 1.0 / ( xcvheatf/pek%XCV(:) + xcl * pek%XWR(:) )
297 !
298 zcv(:) = min(zctmax,zcv(:))
299 !
300 !-------------------------------------------------------------------------------
301 !
302 !* 8. THE HEAT CAPACITY OF FLOOD
303 ! --------------------------------
304 !
305 IF(io%LFLOOD)THEN
306 !
307  zff(:) = pveg(:)*pffv(:) + (1.-pveg(:))*pffg(:)
308 !
309  WHERE(zff(:)>0.0)
310  zcf(:) = 2.0 * sqrt( xpi/(xcondwtr*xrholw*xcl*xday) )
311  ENDWHERE
312 !
313 ENDIF
314 !
315 !-------------------------------------------------------------------------------
316 !
317 !* 9. GRID-AVERAGED HEAT CAPACITY
318 ! ---------------------------
319 !
320 ! With contribution from the ground, flood and vegetation for explicit
321 ! (ISBA-ES) snow scheme option (i.e. no snow effects included here):
322 !
323 dmi%XCT(:) = 1. / ( (1.-pveg(:))*(1.-pffg(:)) / dmi%XCG(:) &
324  + pveg(:) *(1.-pffv(:)) / zcv(:) + zff(:) / zcf(:) )
325 !
326 !-------------------------------------------------------------------------------
327 !
328 !* 10. RESTORE DEFAULT VALUES
329 ! ----------------------
330 !
331 ! restore default moisture and ice values under moisture soil depth
332 !
333 DO jl=1,inl
334  DO jj=1,ini
335  idepth=pk%NWG_LAYER(jj)
336  IF(jl>idepth)THEN
337  pek%XWG (jj,jl) = xundef
338  pek%XWGI(jj,jl) = xundef
339  ENDIF
340  ENDDO
341 ENDDO
342 !
343 IF (lhook) CALL dr_hook('SOILDIF',1,zhook_handle)
344 !
345 !-------------------------------------------------------------------------------
346 !
347 END SUBROUTINE soildif
real, save xpi
Definition: modd_csts.F90:43
real, parameter xundef
real, save xcondi
Definition: modd_csts.F90:82
real, save xg
Definition: modd_csts.F90:55
integer, parameter jprb
Definition: parkind1.F90:32
real, save xci
Definition: modd_csts.F90:65
real, save xday
Definition: modd_csts.F90:45
subroutine soildif(IO, KK, PK, PEK, DMI, PVEG, PFROZEN1, PFFG, PFF
Definition: soildif.F90:7
real, save xcl
Definition: modd_csts.F90:65
logical lhook
Definition: yomhook.F90:15
real, save xrholi
Definition: modd_csts.F90:81
real, save xrholw
Definition: modd_csts.F90:64
real, save xtt
Definition: modd_csts.F90:66
real, save xlmtt
Definition: modd_csts.F90:72