8 pletr, pleg, ppg, pevapcor, &
10 pc1, pc2, pc3, pc4b, pc4ref, pwgeq, &
11 pd_g2, pd_g3, pwsat, pwfc, &
12 pdwgi1, pdwgi2, plegi, pd_g1, pcg, pct, &
14 pwg1, pwg2, pwg3, pwgi1, pwgi2, &
15 prunoff, pdrain, hksat, pwwilt )
77 USE modd_csts, ONLY : xlvtt, xrholw, xlmtt, xlstt, xday
81 USE yomhook
,ONLY : lhook, dr_hook
82 USE parkind1
,ONLY : jprb
89 CHARACTER(LEN=*),
INTENT(IN) :: hisba
93 REAL,
INTENT(IN) :: ptstep
96 REAL,
DIMENSION(:),
INTENT(IN) :: pd_g1
99 REAL,
DIMENSION(:),
INTENT(IN) :: pletr, pleg, ppg, pevapcor
106 REAL,
DIMENSION(:),
INTENT(IN) :: pwdrain
108 REAL,
DIMENSION(:),
INTENT(IN) :: pc1, pc2, pwgeq, pcg, pct
109 REAL,
DIMENSION(:,:),
INTENT(IN) :: pc3
117 REAL,
DIMENSION(:),
INTENT(IN) :: pd_g2, pd_g3, pwsat, pwfc
125 REAL,
DIMENSION(:),
INTENT(IN) :: pc4b, pc4ref
129 REAL,
DIMENSION(:),
INTENT(IN) :: pdwgi1, pdwgi2, plegi
137 REAL,
DIMENSION(:),
INTENT(INOUT) :: ptg, ptg2
141 REAL,
DIMENSION(:),
INTENT(INOUT) :: pwg1, pwg2, pwg3, pwgi1, pwgi2
148 REAL,
DIMENSION(:),
INTENT(OUT) :: prunoff, pdrain
152 CHARACTER(LEN=*),
INTENT(IN) :: hksat
156 REAL,
DIMENSION(:),
INTENT(IN) :: pwwilt
163 REAL,
DIMENSION(SIZE(PTG)) :: zwgi1m, zwg2m, zwg3m, zwgi2m
170 REAL,
DIMENSION(SIZE(PTG)) :: zetr, zeg
175 REAL,
DIMENSION(SIZE(PTG)) :: zwsat, zwfc
179 REAL,
DIMENSION(SIZE(PWG3)) :: zc4
180 REAL,
DIMENSION(SIZE(PWG3)) :: zwavg, zsink2, &
181 zfactor, zdraincf2, zdraincf3, zdrain2, &
182 zdelta2, zdelta3, zdelta22, zdelta33, &
185 REAL,
DIMENSION(SIZE(PWG3)) :: zexcessf, za2, zb2, zc2, za3, zb3, zc3, zwdrain, zexcessfc
187 REAL,
DIMENSION(SIZE(PWG3)) :: zwlim2, zwlim3, zwwilt
190 REAL(KIND=JPRB) :: zhook_handle
197 IF (lhook) CALL dr_hook(
'HYDRO_SOIL',0,zhook_handle)
239 zwsat(jj) = pwsat(jj) - zwgi2m(jj)
242 zwfc(jj) = pwfc(jj) * zwsat(jj) / pwsat(jj)
244 zwwilt(jj) = pwwilt(jj) * zwsat(jj) / pwsat(jj)
249 zetr(jj) = pletr(jj) / xlvtt
261 zeg(jj) = pleg(jj) / xlvtt + pevapcor(jj)
270 pwg1(jj) = (pwg1(jj) - ptstep * (pc1(jj) * (zeg(jj) - ppg(jj)) / xrholw &
271 - pc2(jj) * pwgeq(jj) / xday) ) &
272 / (1. + ptstep * pc2(jj) / xday)
277 IF(hksat==
'SGH' .OR. hksat==
'EXP')
THEN
293 IF (hisba==
'2-L')
THEN
298 pwg2(jj) = zwg2m(jj) - ptstep*(zeg(jj) + zetr(jj) - ppg(jj)) &
299 / (pd_g2(jj) * xrholw)
304 zwdrain(jj) = pwdrain(jj) * max(0.0, min(zwfc(jj),pwg2(jj))-zwlim2(jj))/(zwfc(jj)-zwlim2(jj))
306 zdrain2(jj) = max( min(zwdrain(jj),pwg2(jj)) , pwg2(jj)-zwfc(jj) )*pc3(jj,1) &
307 / (pd_g2(jj)*xday) * ptstep
312 pwg2(jj) = pwg2(jj) - zdrain2(jj)
314 pdrain(jj) = zdrain2(jj)*pd_g2(jj)*xrholw/ptstep
325 IF (pd_g2(jj) >= pd_g3(jj))
THEN
327 pwg2(jj) = zwg2m(jj) - ptstep*(zeg(jj) + zetr(jj) - ppg(jj)) &
328 / (pd_g2(jj) * xrholw)
334 zwdrain(jj) = pwdrain(jj) * max(0.0, min(zwfc(jj),pwg2(jj))-zwlim2(jj))/(zwfc(jj)-zwlim2(jj))
336 zdrain2(jj) = max( min(zwdrain(jj),pwg2(jj)) , pwg2(jj)-zwfc(jj) )*pc3(jj,1) &
337 / (pd_g2(jj)*xday) * ptstep
339 pwg2(jj) = pwg2(jj) - zdrain2(jj)
342 pdrain(jj) = zdrain2(jj)*pd_g2(jj)*xrholw/ptstep
355 zwdrain2(jj) = pwdrain(jj)* max(0.0, min(zwfc(jj),zwg2m(jj))-zwlim2(jj))/(zwfc(jj)-zwlim2(jj))
356 zwdrain3(jj) = pwdrain(jj)* max(0.0, min(pwfc(jj),zwg3m(jj))-zwlim3(jj))/(pwfc(jj)-zwlim3(jj))
361 IF ( zwg2m(jj) - zwfc(jj) > zwdrain2(jj) ) zdelta2(jj) = 1.0
364 IF ( zwg3m(jj) - pwfc(jj) > zwdrain3(jj) ) zdelta3(jj) = 1.0
370 zwavg(jj) = ( ( (zwg2m(jj)**6)* pd_g2(jj) + &
371 (zwg3m(jj)**6)*(pd_g3(jj)-pd_g2(jj)) )/pd_g3(jj) )**(1./6.)
373 zfactor(jj) = pd_g2(jj)/(pd_g3(jj)-pd_g2(jj))
375 zc4(jj) = pc4ref(jj)*(zwavg(jj)**pc4b(jj)) &
376 *(10.**(-pc4b(jj)*pwgi2(jj)/(pwsat(jj)-xwgmin)))
380 zsink2(jj) = -(zeg(jj) + zetr(jj) - ppg(jj) )/(pd_g2(jj)*xrholw)
387 zdraincf2(jj) = pc3(jj,1) / (pd_g2(jj) * xday)
388 zdelta22(jj) = zdelta2(jj)*zwfc(jj) - (1.0-zdelta2(jj))*zwdrain2(jj)
389 zc2(jj) = 1.0 + ptstep*(zdelta2(jj)*zdraincf2(jj) + (zc4(jj)/xday))
390 zb2(jj) = ptstep*zc4(jj)/(xday*zc2(jj))
391 za2(jj) = ( zwg2m(jj) + ptstep*(zsink2(jj) + zdraincf2(jj)*zdelta22(jj)) )/zc2(jj)
393 zdraincf3(jj) = pc3(jj,2) / ( (pd_g3(jj)-pd_g2(jj)) * xday)
394 zdelta33(jj) = zdelta3(jj)*pwfc(jj) - (1.0-zdelta3(jj))*zwdrain3(jj)
395 zc3(jj) = 1.0 + ptstep*(zdelta3(jj)*zdraincf3(jj) + zfactor(jj)*(zc4(jj)/xday))
396 zb3(jj) = ptstep*zfactor(jj)*(zdelta2(jj)*zdraincf2(jj) + (zc4(jj)/xday) )/zc3(jj)
397 za3(jj) = ( zwg3m(jj) + ptstep*( &
398 - zfactor(jj)*zdraincf2(jj)*zdelta22(jj) &
399 + zdraincf3(jj)*zdelta33(jj)) )/zc3(jj)
404 pwg2(jj) = ( za2(jj)+zb2(jj)*za3(jj) )/(1.0 - zb2(jj)*zb3(jj))
405 pwg3(jj) = za3(jj) + zb3(jj)*pwg2(jj)
410 zwdrain(jj) = (xrholw*pc3(jj,2)/xday)* &
411 ( zdelta3(jj)*(pwg3(jj)-pwfc(jj)) + (1.0-zdelta3(jj))*zwdrain3(jj) )
416 pdrain(jj) = max(0.0, zwdrain(jj))
417 pwg3(jj) = pwg3(jj) + (pdrain(jj) - zwdrain(jj))*ptstep/((pd_g3(jj)-pd_g2(jj))*xrholw)
436 pwgi1(jj) = zwgi1m(jj) + pdwgi1(jj) - plegi(jj)*ptstep/(xlstt*pd_g1(jj)*xrholw)
440 pwg1(jj) = pwg1(jj) - pdwgi1(jj)
453 zexcessf(jj) = max(0.0, - pwgi1(jj))
454 pwg1(jj) = pwg1(jj) - zexcessf(jj)
455 pwgi1(jj) = pwgi1(jj) + zexcessf(jj)
456 zexcessfc(jj)= zexcessfc(jj) - zexcessf(jj)
465 zexcessf(jj) = min(0.0, pwsat(jj) - xwgmin - pwgi1(jj))
466 pwg1(jj) = pwg1(jj) - zexcessf(jj)
467 pwgi1(jj) = pwgi1(jj) + zexcessf(jj)
468 zexcessfc(jj)= zexcessfc(jj) - zexcessf(jj)
476 zexcessf(jj) = max(0.0, xwgmin - pwg1(jj))
477 pwgi1(jj) = pwgi1(jj) - zexcessf(jj)
478 pwg1(jj) = pwg1(jj) + zexcessf(jj)
479 zexcessfc(jj)= zexcessfc(jj) + zexcessf(jj)
483 IF(pwgi1(jj) < 1.0e-10)
THEN
484 zexcessf(jj) = pwgi1(jj)
485 pwg1(jj) = pwg1(jj) + zexcessf(jj)
487 zexcessfc(jj)= zexcessfc(jj) + zexcessf(jj)
492 ptg(jj) = ptg(jj) - zexcessfc(jj)*xlmtt*pct(jj)*xrholw*pd_g1(jj)
502 pwgi2(jj) = zwgi2m(jj) + pdwgi2(jj) - plegi(jj)*ptstep/(xlstt*pd_g2(jj)*xrholw)
506 pwg2(jj) = pwg2(jj) - pdwgi2(jj)
513 zexcessf(jj) = max(0.0, -pwgi2(jj))
514 pwg2(jj) = pwg2(jj) - zexcessf(jj)
515 pwgi2(jj) = pwgi2(jj) + zexcessf(jj)
516 zexcessfc(jj)= zexcessfc(jj) - zexcessf(jj)
523 zexcessf(jj) = max(0.0, xwgmin - pwg2(jj))
524 pwgi2(jj) = pwgi2(jj) - zexcessf(jj)
525 pwg2(jj) = pwg2(jj) + zexcessf(jj)
526 zexcessfc(jj)= zexcessfc(jj) + zexcessf(jj)
530 IF (pwgi2(jj) < 1.0e-10 * ptstep)
THEN
531 zexcessf(jj) = pwgi2(jj)
532 pwg2(jj) = pwg2(jj) + zexcessf(jj)
534 zexcessfc(jj)= zexcessfc(jj) + zexcessf(jj)
539 ptg2(jj) = ptg2(jj) - zexcessfc(jj)*xlmtt*pcg(jj)*xrholw*pd_g2(jj)
551 prunoff(:) = max( 0., pwg2(:)+pwgi2(:)-pwsat(:) )*pd_g2(:) * xrholw / ptstep
555 pwg1(:) = min( pwg1(:), pwsat(:) - pwgi1(:) )
556 pwg1(:) = max( pwg1(:), xwgmin )
558 pwg2(:) = min( pwg2(:), pwsat(:) - pwgi2(:) )
559 pwg2(:) = max( pwg2(:), xwgmin )
563 IF (hisba==
'3-L')
THEN
564 pdrain(:) = pdrain(:) + max( 0., pwg3(:)-pwsat(:) )* (pd_g3(:)-pd_g2(:)) * xrholw / ptstep
565 pwg3(:) = min( pwg3(:), pwsat(:) )
566 pwg3(:) = max( pwg3(:), xwgmin )
569 IF (lhook) CALL dr_hook(
'HYDRO_SOIL',1,zhook_handle)
subroutine hydro_soil(HISBA, PTSTEP, PLETR, PLEG, PPG, PEVAPCOR, PWDRAIN, PC1, PC2, PC3, PC4B, PC4REF, PWGEQ, PD_G2, PD_G3, PWSAT, PWFC, PDWGI1, PDWGI2, PLEGI, PD_G1, PCG, PCT, PTG, PTG2, PWG1, PWG2, PWG3, PWGI1, PWGI2, PRUNOFF, PDRAIN, HKSAT, PWWILT)