6 SUBROUTINE hydro_sgh (HISBA,HRUNOFF,HRAIN,HHORT,PTSTEP, &
7 pd_g,pdzg,pwsat,pwfc,pwwilt,pwg,pwgi, &
8 kwg_layer,ppg,ppg_melt,pmuf, &
9 pcondsat,pbcoef,pmpotsat, &
10 pksat_ice,pd_ice,pfsat,phorton,pdunne, &
11 pfflood,ppiflood,piflood,ppflood, &
12 prunoffb,prunoffd,pcg,psoilwght, &
13 oflood,klayer_hort,klayer_dun )
40 USE modd_csts, ONLY : xrholw, xday, xcl, xci, xrholi
53 USE yomhook
,ONLY : lhook, dr_hook
54 USE parkind1
,ONLY : jprb
62 CHARACTER(LEN=*),
INTENT(IN) :: hisba
68 CHARACTER(LEN=*),
INTENT(IN) :: hrunoff
74 CHARACTER(LEN=*),
INTENT(IN) :: hrain
79 CHARACTER(LEN=*),
INTENT(IN) :: hhort
83 LOGICAL,
INTENT(IN) :: oflood
85 REAL,
INTENT(IN) :: ptstep
88 REAL,
DIMENSION(:,:),
INTENT(IN) :: pwg,pwgi
92 INTEGER,
DIMENSION(:),
INTENT(IN) :: kwg_layer
95 REAL,
DIMENSION(:,:),
INTENT(IN) :: pd_g,pdzg,pwsat,pwfc,pwwilt
96 REAL,
DIMENSION(:,:),
INTENT(IN) :: pcondsat
102 REAL,
DIMENSION(:,:),
INTENT(IN) :: pbcoef,pmpotsat
106 REAL,
DIMENSION(:,:),
INTENT(IN) :: psoilwght
108 INTEGER,
INTENT(IN) :: klayer_hort
109 INTEGER,
INTENT(IN) :: klayer_dun
111 REAL,
DIMENSION(:),
INTENT(INOUT):: pfsat
114 REAL,
DIMENSION(:),
INTENT(INOUT):: ppg
115 REAL,
DIMENSION(:),
INTENT(IN) :: ppg_melt, pmuf
120 REAL,
DIMENSION(:),
INTENT(IN) :: pksat_ice, pd_ice
126 REAL,
DIMENSION(:),
INTENT(OUT) :: pdunne, phorton
130 REAL,
DIMENSION(:),
INTENT(IN ) :: pfflood
131 REAL,
DIMENSION(:),
INTENT(IN ) :: ppiflood
134 REAL,
DIMENSION(:),
INTENT(INOUT) :: piflood, ppflood
138 REAL,
DIMENSION(:),
INTENT(IN) :: prunoffb
139 REAL,
DIMENSION(:),
INTENT(IN) :: prunoffd
142 REAL,
DIMENSION(:),
INTENT(IN) :: pcg
147 REAL,
PARAMETER :: zeice = 6.0
149 REAL,
DIMENSION(SIZE(PPG)) :: zpg_ini, zfrozen, zimax_ice, zimax, &
150 zhort_r, zhort_m, zsoilmax, zif_max,&
157 REAL,
DIMENSION(SIZE(PPG)) :: zwg2_avg, zwgi2_avg, zwsat_avg, zwwilt_avg
161 REAL,
DIMENSION(SIZE(PD_G,1),SIZE(PD_G,2)) :: zwsat, zwfc, zfrz
163 REAL,
DIMENSION(SIZE(PPG)) :: zpg_work, zruisdt, znl_hort, zdepth
165 REAL,
DIMENSION(SIZE(PPG)) :: zrunoff_topd
167 REAL :: zeffice, zlog10, zlog, zs, zd_h
169 REAL :: ztdiurn, zsoilheatcap
173 INTEGER :: ini, inl, jj, jl, idepth
174 REAL(KIND=JPRB) :: zhook_handle
180 IF (lhook) CALL dr_hook(
'HYDRO_SGH',0,zhook_handle)
213 zrunoff_topd(:) = 0.0
216 zpg_ini(:) = ppg(:) + ppg_melt(:)
220 inl=maxval(kwg_layer(:))
227 IF( hrunoff==
'DT92' .OR. hrunoff ==
'TOPD' )
THEN
236 IF (hisba ==
'DIF')
THEN
244 zwg2_avg(jj) = zwg2_avg(jj) + psoilwght(jj,jl)*pwg(jj,jl)/max(1.e-6,prunoffd(jj))
245 zwgi2_avg(jj) = zwgi2_avg(jj) + psoilwght(jj,jl)*pwgi(jj,jl)/max(1.e-6,prunoffd(jj))
246 zwsat_avg(jj) = zwsat_avg(jj) + psoilwght(jj,jl)*pwsat(jj,jl)/max(1.e-6,prunoffd(jj))
247 zwwilt_avg(jj) = zwwilt_avg(jj) + psoilwght(jj,jl)*pwwilt(jj,jl)/max(1.e-6,prunoffd(jj))
254 zwg2_avg(:) = pwg(:, 2)
255 zwgi2_avg(:) = pwgi(:,2)
256 zwsat_avg(:) = pwsat(:,1)
257 zwwilt_avg(:) = pwwilt(:,1)
262 !runoff over frozen
soil explicitly calculated
267 zs=min(1.0,(zwg2_avg(jj)+zwgi2_avg(jj)-zwwilt_avg(jj))/(zwsat_avg(jj)-zwwilt_avg(jj)))
268 pfsat(jj) = 1.0-(1.0-max(0.0,zs))**(prunoffb(jj)/(prunoffb(jj)+1.))
276 IF(hhort==
'SGH'.OR.oflood)
THEN
278 IF(hisba ==
'DIF')
THEN
288 zwsat(jj,jl) = max(xwgmin, pwsat(jj,jl)-pwgi(jj,jl))
289 zwfc(jj,jl) = pwfc(jj,jl)*zwsat(jj,jl)/pwsat(jj,jl)
292 zfrz(jj,jl) = exp(zlog10*(-zeice*(pwgi(jj,jl)/(pwgi(jj,jl)+pwg(jj,jl)))))
298 zimax(:) =
infmax_func(pwg,zwsat,zfrz,pcondsat,pmpotsat,pbcoef,pdzg,pd_g,klayer_hort)
306 zsoilheatcap = xcl*xrholw*pwg(jj,2) + &
307 xci*xrholi*pwgi(jj,2) + &
308 xsphsoil*xdrywght*(1.0-pwsat(jj,1))
313 ztdiurn = min(pd_g(jj,2), 4./(zsoilheatcap*pcg(jj)))
317 zeffice=pd_g(jj,2)*pwgi(jj,2)/(pwgi(jj,2)+pwg(jj,2))
322 zwsat(jj,1) = max(xwgmin, pwsat(jj,1)-pwgi(jj,2))
326 zfrozen(jj) = min(1.,zeffice/max(pd_ice(jj),ztdiurn))
330 zfrz(jj,1) = exp(zlog10*(-zeice*min(1.,zeffice/ztdiurn)))
336 zs =min(1.,zwsat(jj,1)/pwsat(jj,1))
337 zimax_ice(jj)=zfrz(jj,1)*pksat_ice(jj)*(zs**(2*pbcoef(jj,1)+3.))
341 zs =min(1.,pwg(jj,2)/zwsat(jj,1))
342 zd_h =min(0.10,pd_g(jj,2))
343 zimax(jj)=pcondsat(jj,1)*(pbcoef(jj,1)*pmpotsat(jj,1)*(zs-1.0)/zd_h+1.0)
358 zhort_r(:) = (1.- zfrozen(:))* ppg(:)/((zimax(:)*xrholw*pmuf(:)/ppg(:)) + 1.) &
359 + zfrozen(:) * ppg(:)/((zimax_ice(:)*xrholw*pmuf(:)/ppg(:)) + 1.)
364 zhort_r(:) = (1.- zfrozen(:))* max(0.,ppg(:)-zimax(:)*xrholw) &
365 + zfrozen(:) * max(0.,ppg(:)-zimax_ice(:)*xrholw)
371 zhort_m(:) = (1.- zfrozen(:))* max(0.,ppg_melt(:)-zimax(:)*xrholw) &
372 + zfrozen(:) * max(0.,ppg_melt(:)-zimax_ice(:)*xrholw)
376 WHERE(pfflood(:)<=pfsat(:))
377 phorton(:) = (1. - pfsat(:)) * (zhort_r(:) + zhort_m(:))
379 phorton(:) = (1. - pfflood(:)) * (zhort_r(:) + zhort_m(:))
390 ppg(:) = ppg(:) + ppg_melt(:)
399 ppflood(:)=pfflood(:)*max(0.0,ppg(:))
404 IF(hrunoff==
'SGH ')
THEN
408 pdunne(:) = max(ppg(:),0.0) * max(pfsat(:)-pfflood(:),0.0)
410 ELSEIF (hrunoff==
'DT92' .OR. hrunoff==
'TOPD')
THEN
417 zpg_work(:) = ppg(:) - phorton(:) - ppflood(:)
420 IF ( lcoupl_topd.AND.hrunoff ==
'TOPD' )
THEN
422 DO jj=1,
SIZE(nmaskt_patch)
423 IF (nmaskt_patch(jj)/=0)
THEN
424 IF ( xatop(nmaskt_patch(jj))/=0. .AND. xas_nature(nmaskt_patch(jj))/=xundef )
THEN
425 zrunoff_topd(jj) = max(ppg(jj),0.0) * max(xas_nature(nmaskt_patch(jj)),0.0)
434 prunoffb, zwwilt_avg, &
435 prunoffd, zwsat_avg, &
436 zwg2_avg, zwgi2_avg, &
439 pdunne(:) = zruisdt(:)*prunoffd(:)*xrholw/ptstep
442 IF (lcoupl_topd.AND.hrunoff ==
'TOPD')
THEN
443 pdunne(:) = zrunoff_topd(:) + pdunne(:)*(1-xatop(nmaskt_patch(:)))
448 WHERE(pfflood(:)>=pfsat(:).AND.pfflood(:)>0.0)pdunne(:) = 0.0
462 ppg(:) = ppg(:) - pdunne(:) - phorton(:) - ppflood(:)
466 WHERE (zpg_ini(:)<0.0)
480 zpifldmax(:) = min(ppiflood(:),xrholw/xday)
482 zif_max(:) = max(0.,(1.- zfrozen(:))) * zimax(:)*xrholw &
483 + zfrozen(:) * zimax_ice(:)*xrholw
485 IF(hisba ==
'DIF')
THEN
489 IF(zdepth(jj)<xhort_depth)
THEN
490 zsoilmax(jj) = zsoilmax(jj)+max(0.0,zwfc(jj,jl)-pwg(jj,jl))*pdzg(jj,jl)*xrholw/ptstep
491 zdepth(jj) = pd_g(jj,jl)
497 zwsat(jj,1) = max(xwgmin, pwsat(jj,1)-pwgi(jj,2))
498 zsoilmax(jj) = max(0.0,zwsat(jj,1)-pwg(jj,2))*pd_g(jj,2)*xrholw/ptstep
502 zsoilmax(:) = min(zsoilmax(:),zif_max(:))
504 piflood(:) = max(0.0,(pfflood(:)-pfsat(:))) * min(zpifldmax(:),zsoilmax(:))
514 ppg(:) = ppg(:) + piflood(:)
518 IF (lhook) CALL dr_hook(
'HYDRO_SGH',1,zhook_handle)
subroutine soil(HC1DRY, HSCOND, HSNOW_ISBA, OGLACIER, PSNOWRHOM, PVEG, PCGSAT, PCGMAX, PC1SAT, PC2REF, PACOEF, PPCOEF, PCV, PPSN, PPSNG, PPSNV, PFFG, PFFV, PFF, PCG, PC1, PC2, PWGEQ, PCT, PCS, PFROZEN1, PTG, PWG, PWGI, PHCAPSOILZ, PCONDDRYZ, PCONDSLDZ, PBCOEF, PWSAT, PWWILT, HKSAT, PCONDSAT, PFFG_NOSNOW, PFFV_NOSNOW)
subroutine hydro_dt92(PTSTEP, PRUNOFFB, PWWILT, PRUNOFFD, PWSAT, PWG2, PWGI2, PPG, PRUISDT)
subroutine hydro_sgh(HISBA, HRUNOFF, HRAIN, HHORT, PTSTEP, PD_G, PDZG, PWSAT, PWFC, PWWILT, PWG, PWGI, KWG_LAYER, PPG, PPG_MELT, PMUF, PCONDSAT, PBCOEF, PMPOTSAT, PKSAT_ICE, PD_ICE, PFSAT, PHORTON, PDUNNE, PFFLOOD, PPIFLOOD, PIFLOOD, PPFLOOD, PRUNOFFB, PRUNOFFD, PCG, PSOILWGHT, OFLOOD, KLAYER_HORT, KLAYER_DUN)