6 SUBROUTINE ecume_flux(PZ0SEA,PTA,PEXNA,PRHOA,PSST,PEXNS,PQA,PVMOD, &
7 pzref,puref,pps,pichce,oprecip,opwebb,opwg,&
8 pqsat,psfth,psftq,pustar,pcd,pcdn,pch,pce, &
9 pri,presa,prain,pz0hsea,opertflux,ppertflux)
63 USE modd_csts, ONLY : xkarman, xg, xstefan, xrd, xrv, &
64 xlvtt, xcl, xcpd, xcpv, xrholw, &
76 USE modi_wind_threshold
82 USE yomhook
,ONLY : lhook, dr_hook
83 USE parkind1
,ONLY : jprb
89 REAL,
DIMENSION(:),
INTENT(IN) :: pta
90 REAL,
DIMENSION(:),
INTENT(IN) :: pqa
91 REAL,
DIMENSION(:),
INTENT(IN) :: prhoa
92 REAL,
DIMENSION(:),
INTENT(IN) :: pvmod
93 REAL,
DIMENSION(:),
INTENT(IN) :: pzref
94 REAL,
DIMENSION(:),
INTENT(IN) :: puref
95 REAL,
DIMENSION(:),
INTENT(IN) :: psst
96 REAL,
DIMENSION(:),
INTENT(IN) :: pps
97 REAL,
DIMENSION(:),
INTENT(IN) :: prain
98 REAL,
DIMENSION(:),
INTENT(IN) :: pexna
99 REAL,
DIMENSION(:),
INTENT(IN) :: pexns
100 REAL,
DIMENSION(:),
INTENT(IN) :: ppertflux
102 REAL,
INTENT(IN) :: pichce
103 LOGICAL,
INTENT(IN) :: oprecip
104 LOGICAL,
INTENT(IN) :: opwebb
105 LOGICAL,
INTENT(IN) :: opwg
106 LOGICAL,
INTENT(IN) :: opertflux
108 REAL,
DIMENSION(:),
INTENT(INOUT) :: pz0sea
111 REAL,
DIMENSION(:),
INTENT(OUT) :: psfth
112 REAL,
DIMENSION(:),
INTENT(OUT) :: psftq
113 REAL,
DIMENSION(:),
INTENT(OUT) :: pustar
116 REAL,
DIMENSION(:),
INTENT(OUT) :: pqsat
117 REAL,
DIMENSION(:),
INTENT(OUT) :: pcd
118 REAL,
DIMENSION(:),
INTENT(OUT) :: pch
119 REAL,
DIMENSION(:),
INTENT(OUT) :: pce
120 REAL,
DIMENSION(:),
INTENT(OUT) :: pcdn
121 REAL,
DIMENSION(:),
INTENT(OUT) :: presa
122 REAL,
DIMENSION(:),
INTENT(OUT) :: pri
123 REAL,
DIMENSION(:),
INTENT(OUT) :: pz0hsea
127 REAL,
DIMENSION(SIZE(PTA)) :: ztau
128 REAL,
DIMENSION(SIZE(PTA)) :: zhf
129 REAL,
DIMENSION(SIZE(PTA)) :: zef
130 REAL,
DIMENSION(SIZE(PTA)) :: ztaur
131 REAL,
DIMENSION(SIZE(PTA)) :: zrf
132 REAL,
DIMENSION(SIZE(PTA)) :: zefwebb
134 REAL,
DIMENSION(SIZE(PTA)) :: zvmod
135 REAL,
DIMENSION(SIZE(PTA)) :: zqsata
136 REAL,
DIMENSION(SIZE(PTA)) :: zpa
137 REAL,
DIMENSION(SIZE(PTA)) :: zusr
139 REAL,
DIMENSION(SIZE(PTA)) :: ztsr
140 REAL,
DIMENSION(SIZE(PTA)) :: zqsr
141 REAL,
DIMENSION(SIZE(PTA)) :: zwg
143 REAL,
DIMENSION(SIZE(PTA)) :: zustar2
144 REAL,
DIMENSION(SIZE(PTA)) :: zac
145 REAL,
DIMENSION(SIZE(PTA)) :: zdircoszw
148 REAL,
DIMENSION(SIZE(PTA)) :: zlv,zlr
149 REAL,
DIMENSION(SIZE(PTA)) :: zdu,zdth,zdq,zduwg
151 REAL,
DIMENSION(SIZE(PTA)) :: zdeltau10n,zdeltat10n,zdeltaq10n
153 REAL,
DIMENSION(SIZE(PTA)) :: zchn,zcen
154 REAL,
DIMENSION(SIZE(PTA)) :: zd0
155 REAL,
DIMENSION(SIZE(PTA)) :: zcharn
156 REAL,
DIMENSION(SIZE(PTA)) :: ztvsr,zbf
160 REAL :: zpsi_u,zpsi_t
161 REAL :: zlmomin,zlmomax
165 REAL :: zchic,zchik,zeps,zloghs10,zlogts10,zpi,zpis2,zpsic,zpsik, &
168 REAL :: zalfac,zcplw,zdqsdt,zdtmp,zdwat,zp00,ztac,zww
173 REAL(KIND=JPRB) :: zhook_handle
176 IF (lhook) CALL dr_hook(
'ECUME_FLUX',0,zhook_handle)
188 zpis2 = 2.0*atan(1.0)
232 zpa(:) = xp00*(pexna(:)**(xcpd/xrd))
233 zqsata(:) =
qsat(pta(:),zpa(:))
238 zdth(:) = pta(:)/pexna(:)-psst(:)/pexns(:)
239 zdq(:) = pqa(:)-pqsat(:)
243 zd0(:) = 1.2+6.3e-03*max(zdu(:)-10.0,0.0)
247 zduwg(:) = sqrt(zdu(:)**2+zwg(:)**2)
252 zdeltau10n(:) = zduwg(:)
253 zdeltat10n(:) = zdth(:)*zd0(:)
254 zdeltaq10n(:) = zdq(:)
258 zlv(:) = xlvtt+(xcpv-xcl)*(psst(:)-xtt)
259 zlr(:) = xlvtt+(xcpv-xcl)*(pta(:)-xtt)
263 IF(ccharnock==
'OLD')
THEN
267 zcharn(:) = max(0.011,min(0.018,0.011+0.007*(zduwg(:)-10.)/8.))
280 IF (zdeltau10n(jlon) <= 16.8)
THEN
281 pcdn(jlon) = 1.3013e-03 &
282 + (-1.2719e-04 * zdeltau10n(jlon) ) &
283 + (+1.3067e-05 * zdeltau10n(jlon)**2) &
284 + (-2.2261e-07 * zdeltau10n(jlon)**3)
285 ELSEIF (zdeltau10n(jlon) <= 50.0)
THEN
286 pcdn(jlon) = 1.3633e-03 &
287 + (-1.3056e-04 * zdeltau10n(jlon) ) &
288 + (+1.6212e-05 * zdeltau10n(jlon)**2) &
289 + (-4.8208e-07 * zdeltau10n(jlon)**3) &
290 + (+4.2684e-09 * zdeltau10n(jlon)**4)
292 pcdn(jlon) = 1.7828e-03
297 IF (zdeltau10n(jlon) <= 33.0)
THEN
298 zchn(jlon) = 1.2536e-03 &
299 + (-1.2455e-04 * zdeltau10n(jlon) ) &
300 + (+1.6038e-05 * zdeltau10n(jlon)**2) &
301 + (-4.3701e-07 * zdeltau10n(jlon)**3) &
302 + (+3.4517e-09 * zdeltau10n(jlon)**4) &
303 + (+3.5763e-12 * zdeltau10n(jlon)**5)
305 zchn(jlon) = 3.1374e-03
310 IF (zdeltau10n(jlon) <= 29.0)
THEN
311 zcen(jlon) = 1.2687e-03 &
312 + (-1.1384e-04 * zdeltau10n(jlon) ) &
313 + (+1.1467e-05 * zdeltau10n(jlon)**2) &
314 + (-3.9144e-07 * zdeltau10n(jlon)**3) &
315 + (+5.0864e-09 * zdeltau10n(jlon)**4)
316 ELSEIF (zdeltau10n(jlon) <= 33.0)
THEN
317 zcen(jlon) = -1.3526e-03 &
318 + (+1.8229e-04 * zdeltau10n(jlon) ) &
319 + (-2.6995e-06 * zdeltau10n(jlon)**2)
321 zcen(jlon) = 1.7232e-03
323 zcen(jlon) = zcen(jlon)*(1.0-pichce)+zchn(jlon)*pichce
327 zusr(jlon) = sqrt(pcdn(jlon))*zdeltau10n(jlon)
328 ztsr(jlon) = zchn(jlon)/sqrt(pcdn(jlon))*zdeltat10n(jlon)
329 zqsr(jlon) = zcen(jlon)/sqrt(pcdn(jlon))*zdeltaq10n(jlon)
334 ztvsr(jlon)=ztsr(jlon)*(1.0+zetv*pqa(jlon))+zetv*pta(jlon)*zqsr(jlon)
335 zbf(jlon)=max(0.0,-xg/pta(jlon)*zusr(jlon)*ztvsr(jlon))
336 zwg(jlon)=zbetagust*(zbf(jlon)*zzbl)**(1./3.)
342 zlmou = puref(jlon)*xg*xkarman*(ztsr(jlon)/(pta(jlon)) &
343 +zetv*zqsr(jlon)/(1.0+zetv*pqa(jlon)))/max(zusr(jlon),zeps)**2
345 zlmot = zlmou*pzref(jlon)/puref(jlon)
346 zlmou = max(min(zlmou,zlmomax),zlmomin)
347 zlmot = max(min(zlmot,zlmomax),zlmomin)
353 IF (zlmou == 0.0)
THEN
355 ELSEIF (zlmou > 0.0)
THEN
358 zchik = (1.0-16.0*zlmou)**0.25
359 zpsik = 2.0*log((1.0+zchik)/2.0) &
360 +log((1.0+zchik**2)/2.0) &
361 -2.0*atan(zchik)+zpis2
362 zchic = (1.0-12.87*zlmou)**(1.0/3.0)
363 zpsic = 1.5*log((zchic**2+zchic+1.0)/3.0) &
364 -zsqr3*atan((2.0*zchic+1.0)/zsqr3) &
366 zpsi_u = zpsic+(zpsik-zpsic)/(1.0+zlmou**2)
370 IF (zlmot == 0.0)
THEN
372 ELSEIF (zlmot > 0.0)
THEN
375 zchik = (1.0-16.0*zlmot)**0.25
376 zpsik = 2.0*log((1.0+zchik**2)/2.0)
377 zchic = (1.0-12.87*zlmot)**(1.0/3.0)
378 zpsic = 1.5*log((zchic**2+zchic+1.0)/3.0) &
379 -zsqr3*atan((2.0*zchic+1.0)/zsqr3) &
381 zpsi_t = zpsic+(zpsik-zpsic)/(1.0+zlmot**2)
387 zloghs10 = log(puref(jlon)/10.0)
388 zlogts10 = log(pzref(jlon)/10.0)
389 zduwg(jlon) = sqrt(zdu(jlon)**2+zwg(jlon)**2)
390 zdeltau10n(jlon) = zduwg(jlon)-zusr(jlon)*(zloghs10-zpsi_u)/xkarman
391 zdeltat10n(jlon) = zdth(jlon)-ztsr(jlon)*(zlogts10-zpsi_t)/xkarman
392 zdeltaq10n(jlon) = zdq(jlon)-zqsr(jlon)*(zlogts10-zpsi_t)/xkarman
407 ((1.0+sign(1.0,zdth(jlon)))*max(zdth(jlon),zeps) &
408 +(1.0-sign(1.0,zdth(jlon)))*min(zdth(jlon),-zeps))
410 ((1.0+sign(1.0,zdq(jlon)))*max(zdq(jlon),zeps) &
411 +(1.0-sign(1.0,zdq(jlon)))*min(zdq(jlon),-zeps))
412 pcd(jlon) = (zusr(jlon)/zduwg(jlon))**2
413 pch(jlon) = zusr(jlon)*ztsr(jlon)/(zduwg(jlon)*zzdth)
414 pce(jlon) = zusr(jlon)*zqsr(jlon)/(zduwg(jlon)*zzdq)
419 ztau(jlon) = -prhoa(jlon)*pcd(jlon)*zduwg(jlon)**2
420 zhf(jlon) = -prhoa(jlon)*xcpd*pch(jlon)*zduwg(jlon)*zdth(jlon)
421 zef(jlon) = -prhoa(jlon)*zlv(jlon)*pce(jlon)*zduwg(jlon)*zdq(jlon)
426 ztau(jlon) = ztau(jlon)* ( 1. + ppertflux(jlon) / 2. )
427 zhf(jlon) = zhf(jlon)* ( 1. + ppertflux(jlon) / 2. )
428 zef(jlon) = zef(jlon)* ( 1. + ppertflux(jlon) / 2. )
445 ztaur(jlon) = -prain(jlon)*zduwg(jlon)
454 zcplw = 4224.8482+ztac*(-4.707+ztac*(0.08499 &
455 +ztac*(1.2826e-03+ztac*(4.7884e-05 &
457 zdwat = 2.11e-05*(zp00/zpa(jlon)) &
458 *(pta(jlon)/xtt)**1.94
459 zdtmp = (1.0+3.309e-03*ztac-1.44e-06*ztac**2) &
460 *0.02411/(prhoa(jlon)*xcpd)
461 zdqsdt = zqsata(jlon)*zlr(jlon)/(xrd*pta(jlon)**2)
462 zalfac = 1.0/(1.0+zdqsdt*(zlr(jlon)*zdwat)/(zdtmp*xcpd))
463 zrf(jlon) = zcplw*prain(jlon)*zalfac*((psst(jlon)-pta(jlon)) &
464 +(pqsat(jlon)-pqa(jlon))*(zlr(jlon)*zdwat)/(zdtmp*xcpd))
477 zww = -(1.0+zetv)*(pce(jlon)*zduwg(jlon)*zdq(jlon)) &
478 -(1.0+(1.0+zetv)*pqa(jlon))* &
479 (pch(jlon)*zduwg(jlon)*zdth(jlon))/(pta(jlon))
480 zefwebb(jlon) = prhoa(jlon)*zww*zlv(jlon)*pqa(jlon)
491 CALL
surface_ri(psst,pqsat,pexns,pexna,pta,zqsata, &
492 pzref,puref,zdircoszw,pvmod,pri )
496 zustar2(:)=-(ztau(:)+ztaur(:))/prhoa(:)
499 pcd(:)=zustar2(:)/(zduwg(:)**2)
502 pustar(:)=sqrt(zustar2(:))
506 zac(:)=pch(:)*zvmod(:)
507 presa(:)=1./ max(zac(:),xsurf_epsilon)
511 psfth(:)=zhf(:)+zrf(:)
512 psftq(:)=(zef(:)+zefwebb(:))/zlv(:)
516 pz0sea(:) = zcharn(:) * zustar2(:) / xg + xvz0cm * pcd(:) / pcdn(:)
520 IF (lhook) CALL dr_hook(
'ECUME_FLUX',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 ecume_flux(PZ0SEA, PTA, PEXNA, PRHOA, PSST, PEXNS, PQA, PVMOD, PZREF, PUREF, PPS, PICHCE, OPRECIP, OPWEBB, OPWG, PQSAT, PSFTH, PSFTQ, PUSTAR, PCD, PCDN, PCH, PCE, PRI, PRESA, PRAIN, PZ0HSEA, OPERTFLUX, PPERTFLUX)