7 SUBROUTINE drag_meb(IO, PEK, DMK, DK, PTG, PTA, PQA, PVMOD, &
8 PWG, PWGI, PWSAT, PWFC, PEXNS, PEXNA, PPS, PRR, PSR, &
9 PRHOA, PZ0G_WITHOUT_SNOW, PZ0_MEBV, PZ0H_MEBV, &
10 PZ0EFF_MEBV, PZ0_MEBN, PZ0H_MEBN, PZ0EFF_MEBN, PSNOWSWE,&
11 PCHIP, PTSTEP, PRS_VG, PRS_VN, PPALPHAN, PZREF, PUREF, &
12 PDIRCOSZW, PSNCV, PDELTA, PVELC, &
13 PRISNOW, PUSTAR2SNOW, PHUGI, PHVG, PHVN, PLEG_DELTA, &
14 PLEGI_DELTA, PHSGL, PHSGF, PFLXC_C_A, PFLXC_N_A, &
15 PFLXC_G_C, PFLXC_N_C, PFLXC_VG_C, PFLXC_VN_C, PFLXC_MOM,&
16 PQSATG, PQSATV, PQSATC, PQSATN, PDELTAVK )
69 USE modd_snow_par
, ONLY : xz0sn
70 USE modd_isba_par
, ONLY : xwgmin
75 USE modi_surface_cdch_1darp
76 USE modi_wind_threshold
77 USE modi_disph_for_meb
78 USE modi_preps_for_meb_drag
79 USE modi_surface_air_meb
92 TYPE(
diag_t),
INTENT(INOUT) :: DK
95 REAL,
INTENT(IN) :: PTSTEP
98 REAL,
DIMENSION(:),
INTENT(IN) :: PTG, PTA, PQA, PVMOD, PWG, PWGI, PWSAT, PWFC, &
99 PEXNS, PEXNA, PPS, PSNOWSWE
114 REAL,
DIMENSION(:),
INTENT(IN) :: PRR, PSR, PRHOA
119 REAL,
DIMENSION(:),
INTENT(IN) :: PZ0G_WITHOUT_SNOW, &
120 PZ0_MEBV, PZ0H_MEBV, PZ0EFF_MEBV, &
121 PZ0_MEBN, PZ0H_MEBN, PZ0EFF_MEBN
129 REAL,
DIMENSION(:),
INTENT(IN) :: PCHIP
132 REAL,
DIMENSION(:),
INTENT(IN) :: PRS_VG, PRS_VN, PSNCV, &
133 PPALPHAN, PZREF, PUREF, PDIRCOSZW
149 REAL,
DIMENSION(:),
INTENT(IN) :: PDELTA
153 REAL,
DIMENSION(:),
INTENT(OUT) :: PDELTAVK
159 REAL,
DIMENSION(:),
INTENT(OUT) :: PVELC
162 REAL,
DIMENSION(:),
INTENT(OUT) :: PHUGI, PHVG, PHVN, PLEG_DELTA, PLEGI_DELTA, PHSGL, PHSGF
173 REAL,
DIMENSION(:),
INTENT(OUT) :: PFLXC_C_A, PFLXC_N_A, PFLXC_G_C, PFLXC_N_C, PFLXC_VG_C, PFLXC_VN_C
184 REAL,
DIMENSION(:),
INTENT(OUT) :: PFLXC_MOM, PQSATG, PQSATV, PQSATC, PQSATN
191 REAL,
DIMENSION(:),
INTENT(OUT) :: PRISNOW, PUSTAR2SNOW
201 REAL,
DIMENSION(SIZE(PTG)) :: ZAC,ZWFC,ZWSAT,ZFP,ZRRCOR
210 REAL,
DIMENSION(SIZE(PTG)) :: ZCHIL, ZLAISN, ZLW, ZDISPH, ZVELC, ZRICN, ZRA_C_A, &
211 ZRA_G_C, ZG_VG_C, ZRA_N_C, ZG_VN_C
223 REAL,
DIMENSION(SIZE(PTG)) :: ZCHCN,ZCDNCN,ZCDCN
226 REAL,
DIMENSION(SIZE(PTG)) :: ZRINN,ZRANN,ZCHNN,ZCDNNN,ZCDNN,ZTEFF,ZDELTAMAX,ZDELTAV,ZVMOD
228 REAL,
DIMENSION(SIZE(PTG)) :: ZRSGL,ZRSGF,ZZ0SN
233 REAL,
DIMENSION(SIZE(PTG)) :: ZRSNFRAC, ZDENOM
237 REAL,
DIMENSION(SIZE(PTG)) :: ZUSTAR2G, ZCDG, ZCHG, ZRIG, ZPSNA
246 REAL,
PARAMETER :: ZRAEPS = 1.e-3
248 REAL,
PARAMETER :: ZSNOWSWESMIN = 1.e-4
250 REAL,
PARAMETER :: ZRG_COEF1 = 8.206
251 REAL,
PARAMETER :: ZRG_COEF2 = 4.255
254 REAL(KIND=JPRB) :: ZHOOK_HANDLE
298 zwsat(:) = pwsat(:)-pwgi(:)
299 zwfc(:) = pwfc(:)*zwsat(:)/pwsat(:)
301 dk%XHUG(:) = 0.5 * ( 1.-cos(
xpi*min((pwg(:)-xwgmin) /zwfc(:),1.)) )
303 zwsat(:) = max(xwgmin, pwsat(:)-pwg(:))
304 zwfc(:) = pwfc(:)*zwsat(:)/pwsat(:)
305 phugi(:) = 0.5 * ( 1.-cos(
xpi*min(pwgi(:)/zwfc(:),1.)) )
310 pqsatg(:) =
qsat(ptg(:),pps(:))
311 pqsatv(:) =
qsat(pek%XTV(:),pps(:))
312 pqsatc(:) =
qsat(pek%XTC(:),pps(:))
313 pqsatn(:) =
qsati(dmk%XSNOWTEMP(:,1),pps(:))
322 dk%XQS(:) =(1.-pek%XPSN(:)*ppalphan(:))*pek%XQC(:) + pek%XPSN(:)*ppalphan(:)*pqsatn(:)
323 dk%XHU(:) =(1.-pek%XPSN(:)*ppalphan(:))*pek%XQC(:)/pqsatc(:)+ pek%XPSN(:)*ppalphan(:)
348 CALL disph_for_meb(zchil,pek%XLAI,zlw,pek%XH_VEG,pzref,pz0_mebv,zdisph)
353 pek%XH_VEG, pzref, pek%XTC, pta, pek%XQC, pqa, puref, &
354 pvmod, pexna, pexns, pdircoszw, zdisph, pvelc, zvmod, zricn,&
355 zra_c_a, zchcn, zcdncn, zcdcn )
359 zfp(:)=max(0.0,prr(:)+psr(:))
361 & /(zcdcn(:)*zvmod(:)**2))
363 zcdcn(:) = zcdcn(:) * zrrcor(:)
364 zchcn(:) = zchcn(:) * zrrcor(:)
365 zcdncn(:) = zcdncn(:) * zrrcor(:)
369 pflxc_c_a(:)=zchcn(:)*zvmod(:)*prhoa(:)
374 pflxc_mom(:)=zcdcn(:)*zvmod(:)*prhoa(:)
379 CALL surface_air_meb(pz0_mebv, pz0h_mebv, pz0g_without_snow, pek%XH_VEG, pek%XLAI, &
380 ptg, pek%XTC, pek%XTV, pvelc, zlw, zdisph, &
381 zra_g_c, zg_vg_c, zustar2g, zcdg, zchg, zrig )
385 zlaisn(:)= pek%XLAI(:)*(1.-ppalphan(:))
392 dmk%XSNOWTEMP(:,1), pek%XTC, pek%XTV, &
393 pvelc, zlw, zdisph, zra_n_c, zg_vn_c, &
394 zustar2g, zcdg, zchg, zrig )
398 pustar2snow(:) = zustar2g(:)
399 dmk%XCDSNOW(:) = zcdg(:)
400 dmk%XCHSNOW(:) = zchg(:)
408 pz0_mebn, pz0h_mebn, pz0eff_mebn, pek%XH_VEG, pzref, &
409 dmk%XSNOWTEMP(:,1), pta, pqsatn, pqa, puref, pvmod, &
410 pexna, pexns, pdircoszw, zdisph, &
411 zvelc, zvmod, zrinn, zrann, &
417 /(zcdnn(:)*zvmod(:)**2))
419 zcdnn(:) = zcdnn(:) * zrrcor(:)
420 zchnn(:) = zchnn(:) * zrrcor(:)
421 zcdnnn(:) = zcdnnn(:) * zrrcor(:)
425 pflxc_n_a(:)=zchnn(:)*zvmod(:)*prhoa(:)
429 pflxc_mom(:)=(1.-pek%XPSN(:)*ppalphan(:))*pflxc_mom(:) + &
430 pek%XPSN(:)*ppalphan(:)*zcdnn(:)*zvmod(:)*prhoa(:)
436 zpsna(:) = pek%XPSN(:)*ppalphan(:)
438 zteff(:) = (1.-zpsna(:))*pek%XTC(:)+ zpsna(:)*dmk%XSNOWTEMP(:,1)
442 pustar2snow(:) = (1.-zpsna(:))*pustar2snow(:) + zpsna(:)*zcdnn(:)*zvmod(:)**2
443 dmk%XCDSNOW(:) = (1.-zpsna(:))*dmk%XCDSNOW(:) + zpsna(:)*zcdnn(:)
444 dmk%XCHSNOW(:) = (1.-zpsna(:))*dmk%XCHSNOW(:) + zpsna(:)*zchnn(:)
445 prisnow(:) = (1.-zpsna(:))*prisnow(:) + zpsna(:)*zrinn(:)
450 pek%XH_VEG, pzref, zteff, pta, dk%XQS, pqa, puref, pvmod, &
451 pexna, pexns, pdircoszw, zdisph, zvelc, zvmod, dk%XRI, &
452 pek%XRESA(:), dk%XCH,dk%XCDN,dk%XCD )
457 /(dk%XCD(:)*zvmod(:)**2))
459 dk%XCD(:) = dk%XCD(:) * zrrcor(:)
460 dk%XCH(:) = dk%XCH(:) * zrrcor(:)
461 dk%XCDN(:) = dk%XCDN(:) * zrrcor(:)
482 zra_g_c(:) = max(zraeps,zra_g_c(:))
483 pflxc_g_c(:) = prhoa(:) / zra_g_c(:)
484 phsgl(:) = zra_g_c(:)/(zra_g_c(:)+zrsgl(:))
485 phsgf(:) = zra_g_c(:)/(zra_g_c(:)+zrsgf(:))
487 zra_n_c(:) = max(zra_n_c(:),zraeps)
488 pflxc_n_c(:) = prhoa(:)/zra_n_c(:)
496 pflxc_n_c(:) = pflxc_n_c(:)*min(1., (psnowswe(:) + psr(:)*ptstep)/zsnowswesmin)
500 pflxc_vg_c(:) = prhoa(:)*zg_vg_c(:)
501 pflxc_vn_c(:) = prhoa(:)*zg_vn_c(:)
508 zdeltamax(:) = (1.-pchip(:))*(1.-pek%XPSN(:)*ppalphan(:))*prr(:)+ pek%XWR(:)/ptstep
510 ( pek%XPSN(:)*(1.-ppalphan(:))*pflxc_vn_c(:) + (1.-pek%XPSN(:))*pflxc_vg_c(:) )* &
511 ( pqsatv(:)-pek%XQC(:))
512 zdeltamax(:) = max(0., min(1.0, zdeltamax(:)/max(1.e-10,zdenom(:))))
514 zdeltav(:) =
xkdelta_wr*min(zdeltamax(:),pdelta(:))
517 phvg(:) = 1. - max(0.,sign(1.,pqsatv(:)-pek%XQC(:))) &
518 *(1.-zdeltav(:))*prs_vg(:)*zg_vg_c(:) / (1.+prs_vg(:)*zg_vg_c(:))
520 phvn(:) = 1. - max(0.,sign(1.,pqsatv(:)-pek%XQC(:))) &
521 *(1.-zdeltav(:))*prs_vn(:)*zg_vn_c(:) / (1.+prs_vn(:)*zg_vn_c(:))
526 dmk%XRS(:) = ppalphan(:)*prs_vn(:) + (1.0-ppalphan(:))*prs_vg(:)
527 dmk%XHV(:) = ppalphan(:)*phvn(:) + (1.0-ppalphan(:))*phvg(:)
538 IF (io%LMEB_GNDRES)
THEN 539 pleg_delta(:) = zra_g_c(:) / ( zra_g_c(:) + exp(zrg_coef1 - zrg_coef2 * pwg(:) / zwsat(:) ) )
540 plegi_delta(:) = zra_g_c(:) / ( zra_g_c(:) + exp(zrg_coef1 - zrg_coef2 * pwgi(:)/ zwsat(:) ) )
556 WHERE ( dk%XHUG(:)*pqsatg(:) < pek%XQC(:) .AND. pqsatg(:) > pek%XQC(:) )
557 dk%XHUG(:) = pek%XQC(:) / pqsatg(:)
560 WHERE ( phugi(:)*pqsatg(:) < pek%XQC(:) .AND. pqsatg(:) > pek%XQC(:) )
561 phugi(:) = pek%XQC(:) / pqsatg(:)
567 WHERE ( dk%XHUG*pqsatg < pek%XQC(:) .AND. pqsatg <= pek%XQC(:) )dk%XHUG(:) = 1.0
568 WHERE ( phugi*pqsatg < pek%XQC(:) .AND. pqsatg <= pek%XQC(:) )phugi(:) = 1.0
subroutine surface_air_meb(PZ0, PZ0H, PZ0G, PH_VEG, PLAI, PTG, PTC, PTV, PVELC, PLW, PDISPH, PRAGNC, PGVNC, PUSTAR2, PCD, PCH, PRI)
subroutine preps_for_meb_drag(LCVEL, LFORC_MEASURE, PZ0, PZ0H, PZ0EFF, PH_VEG, PZREF, PTC, PTA, PQC, PQA, PUREF, PVMOD, PEXNA, PEXNS, PDIRCOSZW, PDISPH, PVELC, PZVMOD, PRI, PRA, PCH, PCDN, PCD)
subroutine disph_for_meb(PCHIL, PLAIV, PLW, PH_VEG, PZREF, PZ0_MEBV, PDISPH)
subroutine drag_meb(IO, PEK, DMK, DK, PTG, PTA, PQA, PVMOD, PWG, PWGI, PWSAT, PWFC, PEXNS, PEXNA, PPS, PRR, PSR, PRHOA, PZ0G_WITHOUT_SNOW, PZ0_MEBV, PZ0H_MEBV, PZ0EFF_MEBV, PZ0_MEBN, PZ0H_MEBN, PZ0EFF_MEBN, PSNOWSWE, PCHIP, PTSTEP, PRS_VG, PRS_VN, PPALPHAN, PZREF, PUREF, PDIRCOSZW, PSNCV, PDELTA, PVELC, PRISNOW, PUSTAR2SNOW, PHUGI, PHVG, PHVN, PLEG_DELTA, PLEGI_DELTA, PHSGL, PHSGF, PFLXC_C_A, PFLXC_N_A, PFLXC_G_C, PFLXC_N_C, PFLXC_VG_C, PFLXC_VN_C, PFLXC_MOM, PQSATG, PQSATV, PQSATC, PQSATN, PDELTAVK)