6 SUBROUTINE soildif(HDIFSFCOND, OFLOOD, &
7 pveg, pcv, pffg, pffv, &
9 pd_g, pdzg, ptg, pwg, pwgi, kwg_layer, &
10 phcapsoilz, pconddryz, pcondsldz, &
11 pbcoef, pwsat, pmpotsat, psoilcondz, psoilhcapz, &
70 USE modd_csts, ONLY : xcl, xci, xrholw, xrholi, xpi, xday, xcondi, xtt, xlmtt, xg
72 xomrho, xomsph, xomconddry, &
77 USE yomhook
,ONLY : lhook, dr_hook
78 USE parkind1
,ONLY : jprb
85 CHARACTER(LEN=*),
INTENT(IN) :: hdifsfcond
90 LOGICAL,
INTENT(IN) :: oflood
92 REAL,
DIMENSION(:),
INTENT(IN) :: pveg, pfwtd, pwtd, pcv, pwr
100 REAL,
DIMENSION(:,:),
INTENT(IN) :: phcapsoilz, pconddryz, pcondsldz, pd_g, pdzg
109 REAL,
DIMENSION(:,:),
INTENT(IN) :: pbcoef, pwsat, pmpotsat, ptg
114 REAL,
DIMENSION(:,:),
INTENT(INOUT):: pwg, pwgi
118 INTEGER,
DIMENSION(:),
INTENT(IN) :: kwg_layer
121 REAL,
DIMENSION(:),
INTENT(OUT) :: pfrozen1, pcg, pct
126 REAL,
DIMENSION(:,:),
INTENT(OUT) :: psoilcondz, psoilhcapz
131 REAL,
DIMENSION(:),
INTENT(IN) :: pffv, pffg
139 REAL,
DIMENSION(SIZE(PTG,1),SIZE(PTG,2)) :: zmatpot, zconddryz, zcondsldz, zvegmulch
142 REAL :: zfrozen2df, zunfrozen2df, zcondsatdf, zlog_condi, zlog_condwtr, &
143 zsatdegdf, zkerstendf, zwork1, zwork2, zwork3, zlog, zwtot, zwl
145 REAL,
PARAMETER :: zctmax = 1.e-4
147 REAL,
PARAMETER :: zthickm = 0.04
149 REAL,
DIMENSION(SIZE(PVEG)) :: zff, zcf, zcv
151 REAL,
DIMENSION(SIZE(PVEG)) :: zwtd
153 INTEGER :: ini, inl, jj, jl, idepth
155 REAL(KIND=JPRB) :: zhook_handle
162 IF (lhook) CALL dr_hook(
'SOILDIF',0,zhook_handle)
175 WHERE(pwtd(:)==xundef)
177 zwtd(:) = xwtd_maxdepth
179 zwtd(:) = pfwtd(:)/max(-pwtd(:),0.001) + (1.0-pfwtd(:))/max(-pwtd(:),xwtd_maxdepth)
180 zwtd(:) = 1.0/zwtd(:)
195 zwork1 = min(1.0,(pwg(jj,idepth)+pwgi(jj,idepth))/pwsat(jj,idepth))
196 zlog = pbcoef(jj,idepth)*log(zwork1)
197 zmatpot(jj,idepth) = pmpotsat(jj,idepth)*exp(-zlog)
200 zwork1 = 0.5*(pd_g(jj,idepth)+pd_g(jj,idepth-1))
201 zwork2 = 0.5*(pd_g(jj,jl)+pd_g(jj,jl-1))
202 zwork3 = max(0.0,(zwtd(jj)-zwork2)/(zwork2-zwork1))
203 zmatpot(jj,jl) = (pmpotsat(jj,jl)+zwork3*zmatpot(jj,idepth))/(1.0+zwork3)
206 zwork1 = max(1.0,zmatpot(jj,jl)/pmpotsat(jj,jl))
207 zlog = log(zwork1)/pbcoef(jj,jl)
208 zwtot = pwsat(jj,jl)*exp(-zlog)
209 zwtot = max(xwgmin,zwtot)
212 zmatpot(jj,jl) = min(pmpotsat(jj,jl),xlmtt*(ptg(jj,jl)-xtt)/(xg*ptg(jj,jl)))
214 zwork1 = max(1.0,zmatpot(jj,jl)/pmpotsat(jj,jl))
215 zlog = log(zwork1)/pbcoef(jj,jl)
216 zwl = pwsat(jj,jl)*exp(-zlog)
217 zwl = max(zwl,xwgmin)
218 pwg(jj,jl) = min(zwl,zwtot )
221 pwgi(jj,jl) = max(0.0,zwtot-pwg(jj,jl))
235 pfrozen1(:) = pwgi(:,1)/(pwgi(:,1) + max(pwg(:,1),xwgmin))
246 zconddryz(:,:) = pconddryz(:,:)
247 zcondsldz(:,:) = pcondsldz(:,:)
249 IF(hdifsfcond ==
'MLCH')
THEN
254 zvegmulch(jj,jl) = pveg(jj)*min(pdzg(jj,jl),max(0.0,zthickm-pd_g(jj,jl)+pdzg(jj,jl)))/pdzg(jj,jl)
256 IF(zvegmulch(jj,jl)>0.0)
THEN
257 zconddryz(jj,jl) = 1.0/((1.0-zvegmulch(jj,jl))/pconddryz(jj,jl)+zvegmulch(jj,jl)/xomconddry)
258 zcondsldz(jj,jl) = 1.0/((1.0-zvegmulch(jj,jl))/pcondsldz(jj,jl)+zvegmulch(jj,jl)/xomcondsld)
273 zlog_condi = log(xcondi)
274 zlog_condwtr = log(xcondwtr)
279 zfrozen2df = pwgi(jj,jl)/(pwgi(jj,jl) + max(pwg(jj,jl),xwgmin))
280 zunfrozen2df = (1.0-zfrozen2df)*pwsat(jj,jl)
283 zwork1 = log(zcondsldz(jj,jl))*(1.0-pwsat(jj,jl))
284 zwork2 = zlog_condi*(pwsat(jj,jl)-zunfrozen2df)
285 zwork3 = zlog_condwtr*zunfrozen2df
286 zcondsatdf = exp(zwork1+zwork2+zwork3)
288 zsatdegdf = max(0.1, (pwgi(jj,jl)+pwg(jj,jl))/pwsat(jj,jl))
289 zsatdegdf = min(1.0,zsatdegdf)
290 zkerstendf = log10(zsatdegdf) + 1.0
291 zkerstendf = (1.0-zfrozen2df)*zkerstendf + zfrozen2df *zsatdegdf
295 psoilcondz(jj,jl) = zkerstendf*(zcondsatdf-zconddryz(jj,jl)) + zconddryz(jj,jl)
309 psoilhcapz(jj,jl) = (1.0-pwsat(jj,jl))*phcapsoilz(jj,jl) + &
310 pwg(jj,jl) *xcl*xrholw + &
311 pwgi(jj,jl) *xci*xrholi
317 pcg(:) = 1.0 / ( pd_g(:,1) * psoilhcapz(:,1) )
319 pcg(:) = min(zctmax,pcg(:))
328 zcv(:) = 1.0 / ( xcvheatf/pcv(:) + xcl * pwr(:) )
330 zcv(:) = min(zctmax,zcv(:))
339 zff(:) = pveg(:)*pffv(:) + (1.-pveg(:))*pffg(:)
342 zcf(:) = 2.0 * sqrt( xpi/(xcondwtr*xrholw*xcl*xday) )
355 pct(:) = 1. / ( (1.-pveg(:))*(1.-pffg(:)) / pcg(:) &
356 + pveg(:) *(1.-pffv(:)) / zcv(:) &
376 IF (lhook) CALL dr_hook(
'SOILDIF',1,zhook_handle)
subroutine soildif(HDIFSFCOND, OFLOOD, PVEG, PCV, PFFG, PFFV, PCG, PCT, PFROZEN1, PD_G, PDZG, PTG, PWG, PWGI, KWG_LAYER, PHCAPSOILZ, PCONDDRYZ, PCONDSLDZ, PBCOEF, PWSAT, PMPOTSAT, PSOILCONDZ, PSOILHCAPZ, PFWTD, PWTD, PWR)