6 SUBROUTINE hydro_soildif(IO, KK, PK, PEK, PTSTEP, PPG, PLETR, PLEG, PEVAPCOR, &
7 PF2WGHT, PPS, PQSAT, PQSATI, PDRAIN, PHORTON, KMAX_LAYER, PQSB)
85 USE modd_isba_par
, ONLY : xwgmin
99 REAL,
INTENT(IN) :: PTSTEP
101 REAL,
DIMENSION(:),
INTENT(IN) :: PPS, PPG, PLETR, PLEG, PEVAPCOR
112 REAL,
DIMENSION(:,:),
INTENT(IN) :: PQSAT,PQSATI
115 REAL,
DIMENSION(:,:),
INTENT(IN) :: PF2WGHT
118 INTEGER,
INTENT(IN) :: KMAX_LAYER
121 REAL,
DIMENSION(:),
INTENT(OUT) :: PDRAIN, PHORTON
124 REAL,
DIMENSION(:),
INTENT(OUT) :: PQSB
131 INTEGER :: INJ, INL, IDEPTH
133 REAL,
DIMENSION(SIZE(PK%XDZG,1)) :: ZINFILTC, ZEXCESS, ZDGN, ZWGTOT
142 REAL,
DIMENSION(SIZE(PK%XDZG,1),SIZE(PK%XDZG,2)) :: ZWFLUX, ZDFLUXDT1, ZDFLUXDT2
149 REAL,
DIMENSION(SIZE(PK%XDZG,1),SIZE(PK%XDZG,2)) :: ZPSI, ZK, ZNU, ZWSAT
163 REAL,
DIMENSION(SIZE(PK%XDZG,1),SIZE(PK%XDZG,2)) :: ZAMTRX, ZBMTRX, ZCMTRX
172 REAL,
DIMENSION(SIZE(PK%XDZG,1),SIZE(PK%XDZG,2)) :: ZINFLAYER
174 REAL,
PARAMETER :: ZWGHT = 0.5
179 REAL,
PARAMETER :: ZEICE = 6.0
181 REAL :: ZLOG10, ZS, ZLOG, ZWDRAIN
183 REAL :: ZDKDT1, ZDKDT2, ZDHEADDT1, ZDHEADDT2
189 REAL(KIND=JPRB) :: ZHOOK_HANDLE
198 inj =
SIZE(pk%XDZG,1)
241 idepth=pk%NWG_LAYER(jj)
246 zwsat(jj,jl) = max(xwgmin, kk%XWSAT(jj,jl)-pek%XWGI(jj,jl))
253 zfrz(jj,jl) = exp(zlog10*(-zeice*(pek%XWGI(jj,jl)/(pek%XWGI(jj,jl)
263 IF(io%CRUNOFF==
'SGH')
THEN 264 ztopqs(:,:)=zfrz(:,:)*pk%XTOPQS(:,:)
278 zinfiltc(:) = max(0.0,ppg(:))*ptstep
286 idepth=pk%NWG_LAYER(jj)
289 zcapacity(jj,jl) = max(0.0,zwsat(jj,jl)-pek%XWG(jj,jl))*pk%XDZG(jj
291 zinflayer(jj,jl) = min(zinfiltc(jj),zcapacity(jj,jl))
293 pek%XWG(jj,jl) = pek%XWG(jj,jl)+zinflayer(jj,jl)/pk%XDZG(jj,jl)
295 zinfiltc(jj) = zinfiltc(jj) - zinflayer(jj,jl)
307 idepth=pk%NWG_LAYER(jj)
309 zinfneg(jj,jl) = (min(0.0,ppg(jj))-pevapcor(jj))*pk%XDZG(jj,jl)*pek%XWG
316 zinfneg(jj,jl) = zinfneg(jj,jl)/zwgtot(jj)
322 phorton(:)=(phorton(:)+zinfiltc(:)/ptstep)*
xrholw 330 idepth=pk%NWG_LAYER(jj)
334 zs = min(1.0,pek%XWG(jj,jl)/zwsat(jj,jl))
335 zlog = kk%XBCOEF(jj,jl)*log(zs)
336 zpsi(jj,jl) = kk%XMPOTSAT(jj,jl)*exp(-zlog)
339 zlog = -zlog*(2.0+3.0/kk%XBCOEF(jj,jl))
340 zk(jj,jl) = zfrz(jj,jl)*pk%XCONDSAT(jj,jl)*exp(-zlog)
349 idepth=pk%NWG_LAYER(jj)
351 zdgn(jj) = 0.5*(pk%XDG(jj,idepth)+pk%XDG(jj,idepth-1))
352 zpsiwtd(jj) = zpsi(jj,idepth)
353 IF(kk%XWTD(jj)/=
xundef)
THEN 355 zwtd(jj) = max(pk%XDG(jj,idepth),-kk%XWTD(jj))
357 zs = min(1.0,zwsat(jj,idepth)/kk%XWSAT(jj,idepth))
358 zlog = kk%XBCOEF(jj,idepth)*log(zs)
359 zpsiwtd(jj) = kk%XMPOTSAT(jj,idepth)*exp(-zlog)
366 zvapcond(:,:) =
vapcondcf(pek%XTG, pps, pek%XWG, pek%XWGI, zpsi,&
367 kk%XWSAT, kk%XWFC, pqsat, pqsati, pk%NWG_LAYER
377 idepth=pk%NWG_LAYER(jj)
381 zki(jj,jl) = sqrt(zk(jj,jl)*zk(jj,jl+1))
382 znu(jj,jl) = zki(jj,jl) + sqrt(zvapcond(jj,jl)*zvapcond(jj,jl+1)
387 zwflux(jj,jl) = -znu(jj,jl) * zhead(jj,jl) - zki(jj,jl)
389 ELSEIF(jl==idepth)
THEN 392 zki(jj,idepth) = zk(jj,idepth)
393 znu(jj,idepth) = zk(jj,idepth) * kk%XFWTD(jj)
394 zhead(jj,idepth) = (zpsi(jj,idepth)-zpsiwtd(jj))/(zwtd(jj)-zdgn(jj
398 zwflux(jj,idepth) = -znu(jj,idepth) * zhead(jj,idepth) - zki(jj,idepth
412 idepth=pk%NWG_LAYER(jj)
414 zdheaddt1 = -kk%XBCOEF(jj,jl )*zpsi(jj,jl )/(pek%XWG(jj,jl )*pk%XDZDIF
419 zdfluxdt1(jj,jl) = -zdkdt1*zhead(jj,jl) - znu(jj,jl)*zdheaddt1 - zdkdt1
420 zdfluxdt2(jj,jl) = -zdkdt2*zhead(jj,jl) + znu(jj,jl)*zdheaddt2 - zdkdt2
421 ELSEIF(jl==idepth)
THEN 422 zdheaddt1 = -kk%XBCOEF(jj,idepth)*zpsi(jj,idepth)/(pek%XWG (jj
428 zdfluxdt1(jj,idepth) = -zdkdt1*zhead(jj,idepth)*kk%XFWTD(jj) - znu
438 zfrc(:,1) = zwflux(:,1) - pleg(:) - pf2wght(:,1)*pletr(:) + zinfneg(:,
446 idepth=pk%NWG_LAYER(jj)
448 zfrc(jj,jl) = zwflux(jj,jl) - zwflux(jj,jl-1) - pf2wght(jj,jl)*pletr
459 CALL tridiag_dif(zamtrx,zbmtrx,zcmtrx,zfrc,pk%NWG_LAYER(:),inl,zsol)
468 idepth=pk%NWG_LAYER(jj)
472 pek%XWG(jj,jl) = pek%XWG(jj,jl) + zsol(jj,jl)
475 zexcess(jj) = max(0.0, pek%XWG(jj,jl) - zwsat(jj,jl))
476 pek%XWG(jj,jl ) = min(pek%XWG(jj,jl),zwsat(jj,jl))
477 pek%XWG(jj,jl+1) = pek%XWG(jj,jl+1) + zexcess(jj)*(pk%XDZG(jj,jl)/pk%XDZG
480 zwfluxn(jj,jl) = zwflux(jj,jl) + zdfluxdt1(jj,jl)*zsol(jj,jl) + zdfluxdt2
483 pqsb(jj) = pqsb(jj) + ztopqs(jj,jl)*
xrholw 485 ELSEIF(jl==idepth)
THEN 488 pek%XWG(jj,idepth) = pek%XWG(jj,idepth) + zsol(jj,idepth)
491 zexcess(jj) = max(0.0, pek%XWG(jj,idepth) - zwsat(jj,idepth))
492 pek%XWG(jj,idepth) = min(pek%XWG(jj,idepth),zwsat(jj,idepth))
493 pdrain(jj) = pdrain(jj) + zexcess(jj)*pk%XDZG(jj,idepth)*
xrholw 496 zwfluxn(jj,idepth) = zwflux(jj,idepth) + zdfluxdt1(jj,idepth)*zsol
501 pdrain(jj) = pdrain(jj)-(zwght*zwfluxn(jj,idepth)+(1.-zwght)*zwflux
504 pqsb(jj) = pqsb(jj) + ztopqs(jj,idepth)*
xrholw 515 idepth=pk%NWG_LAYER(jj)
521 zexcess(jj) = max(0., xwgmin - pek%XWG(jj,jl))
522 pek%XWG(jj,jl) = pek%XWG(jj,jl) + zexcess(jj)
523 pek%XWG(jj,jl+1) = pek%XWG(jj,jl+1) - zexcess(jj)*pk%XDZG(jj,jl)/pk%XDZG
524 ELSEIF(jl==idepth.AND.pek%XWG(jj,idepth)<xwgmin)
THEN 529 pdrain(jj) = pdrain(jj) + min(0.0,pek%XWG(jj,idepth)-xwgmin)*pk%XDZG
subroutine hydro_soildif(IO, KK, PK, PEK, PTSTEP, PPG, PLETR, PLEG
integer, parameter nundef