6 SUBROUTINE drag(HISBA, HSNOW_ISBA, HCPSURF, PTSTEP, PTG, PWG, PWGI, &
7 PEXNS, PEXNA, PTA, PVMOD, PQA, PRR, PSR, PPS, PRS, &
8 PVEG, PZ0, PZ0EFF, PZ0H, PWFC, PWSAT, PPSNG, PPSNV, &
9 PZREF, PUREF, PDIRCOSZW, PDELTA, PF5, PRA, PCH, PCD, &
10 PCDN, PRI, PHUG, PHUGI, PHV, PHU, PCPS, PQS, PFFG, &
11 PFFV, PFF, PFFG_NOSNOW, PFFV_NOSNOW, PLEG_DELTA, &
12 PLEGI_DELTA, PWR, PRHOA, PLVTT, PQSAT )
83 USE modd_isba_par
, ONLY : xwgmin, xrs_max
88 USE modi_surface_aero_cond
90 USE modi_surface_cdch_1darp
91 USE modi_wind_threshold
104 CHARACTER(LEN=*),
INTENT(IN) :: HISBA
108 CHARACTER(LEN=*),
INTENT(IN) :: HSNOW_ISBA
112 CHARACTER(LEN=*),
INTENT(IN) :: HCPSURF
116 REAL,
INTENT(IN) :: PTSTEP
118 REAL,
DIMENSION(:),
INTENT(IN) :: PTG, PWG, PWGI, PEXNS
124 REAL,
DIMENSION(:),
INTENT(IN) :: PEXNA, PTA, PVMOD, PQA, PRR, PSR, PPS
135 REAL,
DIMENSION(:),
INTENT(IN) :: PRS, PVEG, PZ0, PZ0H, PZ0EFF
136 REAL,
DIMENSION(:),
INTENT(IN) :: PWFC, PWSAT, PPSNG, PPSNV, PZREF, PUREF
155 REAL,
DIMENSION(:),
INTENT(INOUT) :: PDELTA
158 REAL,
DIMENSION(:),
INTENT(IN) :: PF5
160 REAL,
DIMENSION(:),
INTENT(IN) :: PDIRCOSZW
162 REAL,
DIMENSION(:),
INTENT(INOUT) :: PRA
164 REAL,
DIMENSION(:),
INTENT(INOUT) :: PCPS
167 REAL,
DIMENSION(:),
INTENT(OUT) :: PCH, PCD, PCDN, PRI
173 REAL,
DIMENSION(:),
INTENT(OUT) :: PHUG, PHUGI, PHV, PHU, PQS, PLEG_DELTA, PLEGI_DELTA
182 REAL,
DIMENSION(:),
INTENT(IN) :: PFFV, PFF, PFFG, PFFG_NOSNOW, PFFV_NOSNOW
187 REAL,
DIMENSION(:),
INTENT(IN) :: PWR, PRHOA, PLVTT
192 REAL,
DIMENSION(:),
INTENT(OUT),
OPTIONAL :: PQSAT
197 REAL,
PARAMETER :: ZHVLIM = 1.e-12
199 REAL,
DIMENSION(SIZE(PTG)) :: ZQSAT, &
214 REAL(KIND=JPRB) :: ZHOOK_HANDLE
234 zqsat(:) =
qsat(ptg(:),pps(:))
236 IF(
PRESENT(pqsat))pqsat(:)=zqsat(:)
248 zwfc(:) = pwfc(:)*(pwsat(:)-pwgi(:))/pwsat(:)
250 phug(:) = 0.5 * ( 1.-cos(
xpi*min((pwg(:)-xwgmin) /zwfc(:),1.)) )
252 zwfc(:) = pwfc(:)*max(xwgmin, pwsat(:)-pwg(:))/pwsat(:)
254 phugi(:) = 0.5 * ( 1.-cos(
xpi*min(pwgi(:)/zwfc(:),1.)) )
271 WHERE ( phug*zqsat < pqa .AND. zqsat > pqa )
272 phug(:) = pqa(:) / zqsat(:)
275 WHERE ( phugi*zqsat < pqa .AND. zqsat > pqa )
276 phugi(:) = pqa(:) / zqsat(:)
283 WHERE ( phug*zqsat < pqa .AND. zqsat <= pqa )
286 WHERE ( phugi*zqsat < pqa .AND. zqsat <= pqa )
295 zzhv(:) = max(0.,sign(1.,zqsat(:)-pqa(:)))
297 phv(:) = pdelta(:) + (1.- pdelta(:))* &
298 ( pra(:) + prs(:)*(1.0 - zzhv(:)) )* &
299 ( (1/(pra(:)+prs(:))) - (zzhv(:)*(1.-pf5(:))/(pra(:)+xrs_max)) )
310 IF(hsnow_isba ==
'3-L' .OR. hsnow_isba ==
'CRO' .OR. hisba ==
'DIF')
THEN 314 pqs(:) =( (1.-pveg(:))*(1.-pffg_nosnow(:))*(pwg(:) /(pwg(:)+pwgi(:)))*phug(:) &
315 + (1.-pveg(:))*(1.-pffg_nosnow(:))*(pwgi(:)/(pwg(:)+pwgi(:)))*phugi(:) &
316 + pveg(:) *(1.-pffv_nosnow(:))* phv(:) &
317 + ((1.-pveg(:))*pffg_nosnow(:)+pveg(:)*pffv_nosnow(:)))*zqsat(:) &
318 + pveg(:) *(1.-pffv_nosnow(:))*(1.-phv(:))*pqa(:)
322 pqs(:) =( (1.-pveg(:))*(1.-ppsng(:)-pffg(:))*(pwg(:) /(pwg(:)+pwgi(:)))*phug(:) &
323 + (1.-pveg(:))*(1.-ppsng(:)-pffg(:))*(pwgi(:)/(pwg(:)+pwgi(:)))*phugi(:) &
324 + (1.-pveg(:))* ppsng(:) &
325 + pveg(:) *(1.-ppsnv(:)-pffv(:))*phv(:) &
326 + pveg(:) * ppsnv(:) &
327 + pff(:) )*zqsat(:) &
328 + pveg(:) *(1.-ppsnv(:)-pffv(:))*(1.-phv(:))*pqa(:)
332 phu(:) = pqs(:)/zqsat(:)
339 IF (hcpsurf==
'DRY')
THEN 350 CALL surface_ri(ptg, pqs, pexns, pexna, pta, pqa, &
351 pzref, puref, pdircoszw, pvmod, pri )
367 pqa, pqs, pcd, pcdn, pch )
368 pra(:) = 1. / ( pch(:) * zvmod(:) )
384 CALL surface_cd(pri, pzref, puref, pz0eff, pz0h, pcd, pcdn)
395 zfp(:)=max(0.0,prr(:)+psr(:))
397 /(pcd(:)*zvmod(:)**2))
412 phv(:) = pdelta(:) + (1.- pdelta(:))* &
413 ( pra(:) + prs(:)*(1.0 - zzhv(:)) )* &
414 ( (1/(pra(:)+prs(:))) - (zzhv(:)*(1.-pf5(:))/(pra(:)+xrs_max)) )
436 REAL,
DIMENSION(:),
INTENT(INOUT) :: PDELTA
441 REAL,
DIMENSION(SIZE(PDELTA)) :: ZPSNV
442 REAL,
DIMENSION(SIZE(PDELTA)) :: ZLEV
443 REAL,
DIMENSION(SIZE(PDELTA)) :: ZLETR
444 REAL,
DIMENSION(SIZE(PDELTA)) :: ZLECOEF
445 REAL,
DIMENSION(SIZE(PDELTA)) :: ZER
446 REAL,
DIMENSION(SIZE(PDELTA)) :: ZRRVEG
447 REAL,
DIMENSION(SIZE(PDELTA)) :: ZWR_DELTA
449 REAL(KIND=JPRB) :: ZHOOK_HANDLE
451 IF (
lhook)
CALL dr_hook(
'DRAG:LIMIT_LER',0,zhook_handle)
458 IF(hsnow_isba ==
'3-L' .OR. hsnow_isba ==
'CRO' .OR. hisba ==
'DIF')
THEN 459 zlecoef(:) = (1.0-ppsnv(:)-pffv(:))
463 zpsnv(:) = ppsnv(:)+pffv(:)
474 zlev(:) = prhoa(:) * plvtt(:) * pveg(:) * (1-zpsnv(:)) * phv(:) * (zqsat(:) - pqa(:)) / pra(:)
476 zletr(:) = zzhv(:) * prhoa(:) * (1. - pdelta(:)) * plvtt(:) * pveg(:) *(1-zpsnv(:)) &
477 * (zqsat(:) - pqa(:)) * ( (1/(pra(:) + prs(:))) - ((1.-pf5(:))/(pra(:) + xrs_max)) )
479 zer(:)=ptstep*(zlev(:)-zletr(:))*zlecoef(:)/plvtt(:)
481 zrrveg(:) = ptstep*pveg(:)*(1.-ppsnv(:))*prr(:)
485 WHERE( zzhv(:)>0.0 .AND. zer(:)/=0.0 .AND. (pwr(:)+zrrveg(:))<zer(:) )
487 zwr_delta(:) = max(0.01,min(1.0,(pwr(:)+zrrveg(:))/zer(:)))
489 pdelta(:) = pdelta(:) * zwr_delta(:)
491 phv(:) = pdelta(:) + (1.- pdelta(:))*( pra(:) + prs(:)*(1.0 - zzhv(:)) )* &
492 ( (1/(pra(:)+prs(:))) - (zzhv(:)*(1.-pf5(:))/(pra(:)+xrs_max)) )
496 IF (
lhook)
CALL dr_hook(
'DRAG:LIMIT_LER',1,zhook_handle)
real function, dimension(size(pwind)) wind_threshold(PWIND, PUREF)
subroutine surface_ri(PTG, PQS, PEXNS, PEXNA, PTA, PQA, PZREF, PUREF, PDIRCOSZW, PVMOD, PRI)
subroutine surface_aero_cond(PRI, PZREF, PUREF, PVMOD, PZ0, PZ0H, PAC, PRA, PCH)
subroutine limit_ler(PDELTA)
subroutine surface_cd(PRI, PZREF, PUREF, PZ0EFF, PZ0H, PCD, PCDN)
subroutine surface_cdch_1darp(PZREF, PZ0EFF, PZ0H, PVMOD, PTA, PTG, PQA, PQS, PCD, PCDN, PCH)
subroutine drag(HISBA, HSNOW_ISBA, HCPSURF, PTSTEP, PTG, PWG, PWGI, PEXNS, PEXNA, PTA, PVMOD, PQA, PRR, PSR, PPS, PRS, PVEG, PZ0, PZ0EFF, PZ0H, PWFC, PWSAT, PPSNG, PPSNV, PZREF, PUREF, PDIRCOSZW, PDELTA, PF5, PRA, PCH, PCD, PCDN, PRI, PHUG, PHUGI, PHV, PHU, PCPS, PQS, PFFG, PFFV, PFF, PFFG_NOSNOW, PFFV_NOSNOW, PLEG_DELTA, PLEGI_DELTA, PWR, PRHOA, PLVTT, PQSAT)