6 SUBROUTINE drag(HISBA, HSNOW_ISBA, HCPSURF, PTSTEP, &
8 pexns, pexna, pta, pvmod, pqa, prr, psr, &
9 pps, prs, pveg, pz0, pz0eff, pz0h, &
10 pwfc, pwsat, ppsng, ppsnv, pzref, puref, &
11 pdircoszw, pdelta, pf5, pra, &
12 pch, pcd, pcdn, pri, phug, phugi, &
13 phv, phu, pcps, pqs, pffg, pffv, pff, &
14 pffg_nosnow, pffv_nosnow, &
15 pleg_delta, plegi_delta, pwr, prhoa, plvtt, pqsat )
87 USE modd_surf_atm, ONLY : ldrag_coef_arp, lrrgust_arp, xrrscale, &
88 xrrgamma, xutilgust, lcpl_arp
91 USE modi_surface_aero_cond
93 USE modi_surface_cdch_1darp
94 USE modi_wind_threshold
99 USE yomhook
,ONLY : lhook, dr_hook
100 USE parkind1
,ONLY : jprb
107 CHARACTER(LEN=*),
INTENT(IN) :: hisba
111 CHARACTER(LEN=*),
INTENT(IN) :: hsnow_isba
115 CHARACTER(LEN=*),
INTENT(IN) :: hcpsurf
119 REAL,
INTENT(IN) :: ptstep
121 REAL,
DIMENSION(:),
INTENT(IN) :: ptg, pwg, pwgi, pexns
127 REAL,
DIMENSION(:),
INTENT(IN) :: pexna, pta, pvmod, pqa, prr, psr, pps
138 REAL,
DIMENSION(:),
INTENT(IN) :: prs, pveg, pz0, pz0h, pz0eff
139 REAL,
DIMENSION(:),
INTENT(IN) :: pwfc, pwsat, ppsng, ppsnv, pzref, puref
158 REAL,
DIMENSION(:),
INTENT(INOUT) :: pdelta
161 REAL,
DIMENSION(:),
INTENT(IN) :: pf5
163 REAL,
DIMENSION(:),
INTENT(IN) :: pdircoszw
165 REAL,
DIMENSION(:),
INTENT(INOUT) :: pra
167 REAL,
DIMENSION(:),
INTENT(INOUT) :: pcps
170 REAL,
DIMENSION(:),
INTENT(OUT) :: pch, pcd, pcdn, pri
176 REAL,
DIMENSION(:),
INTENT(OUT) :: phug, phugi, phv, phu, pqs, pleg_delta, plegi_delta
185 REAL,
DIMENSION(:),
INTENT(IN) :: pffv, pff, pffg, pffg_nosnow, pffv_nosnow
190 REAL,
DIMENSION(:),
INTENT(IN) :: pwr, prhoa, plvtt
195 REAL,
DIMENSION(:),
INTENT(OUT),
OPTIONAL :: pqsat
200 REAL,
PARAMETER :: zhvlim = 1.e-12
202 REAL,
DIMENSION(SIZE(PTG)) :: zqsat, &
217 REAL(KIND=JPRB) :: zhook_handle
223 IF (lhook) CALL dr_hook(
'DRAG',0,zhook_handle)
237 zqsat(:) =
qsat(ptg(:),pps(:))
239 IF(present(pqsat))pqsat(:)=zqsat(:)
251 zwfc(:) = pwfc(:)*(pwsat(:)-pwgi(:))/pwsat(:)
253 phug(:) = 0.5 * ( 1.-cos(xpi*min((pwg(:)-xwgmin) /zwfc(:),1.)) )
255 zwfc(:) = pwfc(:)*max(xwgmin, pwsat(:)-pwg(:))/pwsat(:)
257 phugi(:) = 0.5 * ( 1.-cos(xpi*min(pwgi(:)/zwfc(:),1.)) )
274 WHERE ( phug*zqsat < pqa .AND. zqsat > pqa )
275 phug(:) = pqa(:) / zqsat(:)
278 WHERE ( phugi*zqsat < pqa .AND. zqsat > pqa )
279 phugi(:) = pqa(:) / zqsat(:)
286 WHERE ( phug*zqsat < pqa .AND. zqsat <= pqa )
289 WHERE ( phugi*zqsat < pqa .AND. zqsat <= pqa )
298 zzhv(:) = max(0.,sign(1.,zqsat(:)-pqa(:)))
300 phv(:) = pdelta(:) + (1.- pdelta(:))* &
301 ( pra(:) + prs(:)*(1.0 - zzhv(:)) )* &
302 ( (1/(pra(:)+prs(:))) - (zzhv(:)*(1.-pf5(:))/(pra(:)+xrs_max)) )
313 IF(hsnow_isba ==
'3-L' .OR. hsnow_isba ==
'CRO' .OR. hisba ==
'DIF')
THEN
317 pqs(:) =( (1.-pveg(:))*(1.-pffg_nosnow(:))*(pwg(:) /(pwg(:)+pwgi(:)))*phug(:) &
318 + (1.-pveg(:))*(1.-pffg_nosnow(:))*(pwgi(:)/(pwg(:)+pwgi(:)))*phugi(:) &
319 + pveg(:) *(1.-pffv_nosnow(:))* phv(:) &
320 + ((1.-pveg(:))*pffg_nosnow(:)+pveg(:)*pffv_nosnow(:)))*zqsat(:) &
321 + pveg(:) *(1.-pffv_nosnow(:))*(1.-phv(:))*pqa(:)
325 pqs(:) =( (1.-pveg(:))*(1.-ppsng(:)-pffg(:))*(pwg(:) /(pwg(:)+pwgi(:)))*phug(:) &
326 + (1.-pveg(:))*(1.-ppsng(:)-pffg(:))*(pwgi(:)/(pwg(:)+pwgi(:)))*phugi(:) &
327 + (1.-pveg(:))* ppsng(:) &
328 + pveg(:) *(1.-ppsnv(:)-pffv(:))*phv(:) &
329 + pveg(:) * ppsnv(:) &
330 + pff(:) )*zqsat(:) &
331 + pveg(:) *(1.-ppsnv(:)-pffv(:))*(1.-phv(:))*pqa(:)
335 phu(:) = pqs(:)/zqsat(:)
342 IF (hcpsurf==
'DRY')
THEN
344 ELSEIF(.NOT.lcpl_arp)
THEN
345 pcps(:) = xcpd + ( xcpv - xcpd ) * pqa(:)
353 CALL
surface_ri(ptg, pqs, pexns, pexna, pta, pqa, &
354 pzref, puref, pdircoszw, pvmod, pri )
367 IF (ldrag_coef_arp)
THEN
370 pqa, pqs, pcd, pcdn, pch )
371 pra(:) = 1. / ( pch(:) * zvmod(:) )
387 CALL
surface_cd(pri, pzref, puref, pz0eff, pz0h, pcd, pcdn)
396 IF (lrrgust_arp)
THEN
398 zfp(:)=max(0.0,prr(:)+psr(:))
399 zrrcor(:)=sqrt(1.0+((((zfp(:)/(zfp(:)+xrrscale))**xrrgamma)*xutilgust)**2) &
400 /(pcd(:)*zvmod(:)**2))
415 phv(:) = pdelta(:) + (1.- pdelta(:))* &
416 ( pra(:) + prs(:)*(1.0 - zzhv(:)) )* &
417 ( (1/(pra(:)+prs(:))) - (zzhv(:)*(1.-pf5(:))/(pra(:)+xrs_max)) )
425 IF (lhook) CALL dr_hook(
'DRAG',1,zhook_handle)
439 REAL,
DIMENSION(:),
INTENT(INOUT) :: pdelta
444 REAL,
DIMENSION(SIZE(PDELTA)) :: zpsnv
445 REAL,
DIMENSION(SIZE(PDELTA)) :: zlev
446 REAL,
DIMENSION(SIZE(PDELTA)) :: zletr
447 REAL,
DIMENSION(SIZE(PDELTA)) :: zlecoef
448 REAL,
DIMENSION(SIZE(PDELTA)) :: zer
449 REAL,
DIMENSION(SIZE(PDELTA)) :: zrrveg
450 REAL,
DIMENSION(SIZE(PDELTA)) :: zwr_delta
452 REAL(KIND=JPRB) :: zhook_handle
454 IF (lhook) CALL dr_hook(
'DRAG:LIMIT_LER',0,zhook_handle)
461 IF(hsnow_isba ==
'3-L' .OR. hsnow_isba ==
'CRO' .OR. hisba ==
'DIF')
THEN
462 zlecoef(:) = (1.0-ppsnv(:)-pffv(:))
466 zpsnv(:) = ppsnv(:)+pffv(:)
478 zlev(:) = prhoa(:) * plvtt(:) * pveg(:) * (1-zpsnv(:)) * phv(:) * (zqsat(:) - pqa(:)) / pra(:)
480 zletr(:) = zzhv(:) * prhoa(:) * (1. - pdelta(:)) * plvtt(:) * pveg(:) *(1-zpsnv(:)) &
481 * (zqsat(:) - pqa(:)) * ( (1/(pra(:) + prs(:))) - ((1.-pf5(:))/(pra(:) + xrs_max)) )
483 zer(:)=ptstep*(zlev(:)-zletr(:))*zlecoef(:)/plvtt(:)
485 zrrveg(:) = ptstep*pveg(:)*(1.-ppsnv(:))*prr(:)
489 WHERE( zzhv(:)>0.0 .AND. zer(:)/=0.0 .AND. (pwr(:)+zrrveg(:))<zer(:) )
491 zwr_delta(:) = max(0.01,min(1.0,(pwr(:)+zrrveg(:))/zer(:)))
493 pdelta(:) = pdelta(:) * zwr_delta(:)
495 phv(:) = pdelta(:) + (1.- pdelta(:))*( pra(:) + prs(:)*(1.0 - zzhv(:)) )* &
496 ( (1/(pra(:)+prs(:))) - (zzhv(:)*(1.-pf5(:))/(pra(:)+xrs_max)) )
500 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)