6 SUBROUTINE ecumev6_flux(PZ0SEA,PTA,PEXNA,PRHOA,PSST,PSSS,PEXNS,PQA,PVMOD, &
7 pzref,puref,pps,ppa,pichce,oprecip,opwebb, &
8 pqsat,psfth,psftq,pustar,pcd,pcdn,pch,pce, &
9 pri,presa,prain,kz0,pz0hsea,opertflux,ppertflux )
86 USE modd_csts, ONLY : xpi, xday, xkarman, xg, xp00, xstefan, xrd, xrv, &
87 xcpd, xcpv, xcl, xtt, xlvtt
93 USE modi_wind_threshold
96 USE yomhook
, ONLY : lhook, dr_hook
97 USE parkind1
, ONLY : jprb
105 REAL,
DIMENSION(:),
INTENT(IN) :: pvmod
106 REAL,
DIMENSION(:),
INTENT(IN) :: pta
107 REAL,
DIMENSION(:),
INTENT(IN) :: pqa
108 REAL,
DIMENSION(:),
INTENT(IN) :: ppa
109 REAL,
DIMENSION(:),
INTENT(IN) :: prhoa
110 REAL,
DIMENSION(:),
INTENT(IN) :: pexna
111 REAL,
DIMENSION(:),
INTENT(IN) :: puref
112 REAL,
DIMENSION(:),
INTENT(IN) :: pzref
113 REAL,
DIMENSION(:),
INTENT(IN) :: psss
114 REAL,
DIMENSION(:),
INTENT(IN) :: pps
115 REAL,
DIMENSION(:),
INTENT(IN) :: pexns
116 REAL,
DIMENSION(:),
INTENT(IN) :: ppertflux
118 REAL,
INTENT(IN) :: pichce
119 LOGICAL,
INTENT(IN) :: oprecip
120 LOGICAL,
INTENT(IN) :: opwebb
121 LOGICAL,
INTENT(IN) :: opertflux
122 REAL,
DIMENSION(:),
INTENT(IN) :: prain
124 INTEGER,
INTENT(IN) :: kz0
126 REAL,
DIMENSION(:),
INTENT(INOUT) :: psst
127 REAL,
DIMENSION(:),
INTENT(INOUT) :: pz0sea
128 REAL,
DIMENSION(:),
INTENT(OUT) :: pz0hsea
131 REAL,
DIMENSION(:),
INTENT(OUT) :: pustar
132 REAL,
DIMENSION(:),
INTENT(OUT) :: psfth
133 REAL,
DIMENSION(:),
INTENT(OUT) :: psftq
136 REAL,
DIMENSION(:),
INTENT(OUT) :: pqsat
137 REAL,
DIMENSION(:),
INTENT(OUT) :: pcd
138 REAL,
DIMENSION(:),
INTENT(OUT) :: pch
139 REAL,
DIMENSION(:),
INTENT(OUT) :: pce
140 REAL,
DIMENSION(:),
INTENT(OUT) :: pcdn
141 REAL,
DIMENSION(:),
INTENT(OUT) :: pri
142 REAL,
DIMENSION(:),
INTENT(OUT) :: presa
147 INTEGER,
DIMENSION(SIZE(PTA)) :: jcv
148 INTEGER,
DIMENSION(SIZE(PTA)) :: jiter
150 REAL,
DIMENSION(SIZE(PTA)) :: ztau
151 REAL,
DIMENSION(SIZE(PTA)) :: zhf
152 REAL,
DIMENSION(SIZE(PTA)) :: zef
153 REAL,
DIMENSION(SIZE(PTA)) :: ztaur
154 REAL,
DIMENSION(SIZE(PTA)) :: zrf
155 REAL,
DIMENSION(SIZE(PTA)) :: zefwebb
157 REAL,
DIMENSION(SIZE(PTA)) :: zvmod
158 REAL,
DIMENSION(SIZE(PTA)) :: zqsata
159 REAL,
DIMENSION(SIZE(PTA)) :: zlva
160 REAL,
DIMENSION(SIZE(PTA)) :: zlvs
161 REAL,
DIMENSION(SIZE(PTA)) :: zcpa
162 REAL,
DIMENSION(SIZE(PTA)) :: zvisa
163 REAL,
DIMENSION(SIZE(PTA)) :: zdu
164 REAL,
DIMENSION(SIZE(PTA)) :: zdt,zdq
165 REAL,
DIMENSION(SIZE(PTA)) :: zddu
166 REAL,
DIMENSION(SIZE(PTA)) :: zddt,zddq
167 REAL,
DIMENSION(SIZE(PTA)) :: zusr
169 REAL,
DIMENSION(SIZE(PTA)) :: ztsr
170 REAL,
DIMENSION(SIZE(PTA)) :: zqsr
171 REAL,
DIMENSION(SIZE(PTA)) :: zdeltau10n,zdeltat10n,zdeltaq10n
173 REAL,
DIMENSION(SIZE(PTA)) :: zusr0,ztsr0,zqsr0
174 REAL,
DIMENSION(SIZE(PTA)) :: zdusto,zdtsto,zdqsto
175 REAL,
DIMENSION(SIZE(PTA)) :: zpsiu,zpsit
176 REAL,
DIMENSION(SIZE(PTA)) :: zcharn
178 REAL,
DIMENSION(SIZE(PTA)) :: zustar2
179 REAL,
DIMENSION(SIZE(PTA)) :: zac
180 REAL,
DIMENSION(SIZE(PTA)) :: zdircoszw
182 REAL,
DIMENSION(SIZE(PTA)) :: zparun,zpartn,zparqn
183 REAL,
DIMENSION(0:5) :: zcoefu,zcoeft,zcoefq
192 REAL :: zlmomin,zlmomax
194 REAL :: zdusr0,zdtsr0,zdqsr0
196 REAL :: zutu,zutt,zutq
197 REAL :: zcdiru,zcdirt,zcdirq
198 REAL :: zordou,zordot,zordoq
203 REAL :: zpsi_u,zpsi_t
204 REAL :: z0tsea,z0qsea
205 REAL :: zchic,zchik,zpsic,zpsik,zlogus10,zlogts10
206 REAL :: ztac,zcpwa,zdqsdt,zdwat,zdtmp,zbulb
209 REAL(KIND=JPRB) :: zhook_handle
212 IF (lhook) CALL dr_hook(
'ECUMEV6_FLUX',0,zhook_handle)
223 IF (opcvflx) niterfl = nitermax+nitersup
225 zcoefu = (/ 1.00e-03, 3.66e-02, -1.92e-03, 2.32e-04, -7.02e-06, 6.40e-08 /)
226 zcoeft = (/ 5.36e-03, 2.90e-02, -1.24e-03, 4.50e-04, -2.06e-05, 0.0 /)
227 zcoefq = (/ 1.00e-03, 3.59e-02, -2.87e-04, 0.0, 0.0, 0.0 /)
233 zcdiru = zcoefu(1) + 2.0*zcoefu(2)*zutu + 3.0*zcoefu(3)*zutu**2 &
234 + 4.0*zcoefu(4)*zutu**3 + 5.0*zcoefu(5)*zutu**4
235 zcdirt = zcoeft(1) + 2.0*zcoeft(2)*zutt + 3.0*zcoeft(3)*zutt**2 &
236 + 4.0*zcoeft(4)*zutt**3
237 zcdirq = zcoefq(1) + 2.0*zcoefq(2)*zutq
239 zordou = zcoefu(0) + zcoefu(1)*zutu + zcoefu(2)*zutu**2 + zcoefu(3)*zutu**3 &
240 + zcoefu(4)*zutu**4 + zcoefu(5)*zutu**5
241 zordot = zcoeft(0) + zcoeft(1)*zutt + zcoeft(2)*zutt**2 + zcoeft(3)*zutt**3 &
243 zordoq = zcoefq(0) + zcoefq(1)*zutq + zcoefq(2)*zutq**2
296 WHERE(psss(:)>0.0.AND.psss(:)/=xundef)
301 zqsata(:) =
qsat(pta(:),ppa(:))
306 zdt(:) = pta(:)/pexna(:)-psst(:)/pexns(:)
307 zdq(:) = pqa(:)-pqsat(:)
311 zlva(:) = xlvtt+(xcpv-xcl)*(pta(:)-xtt)
312 zlvs(:) = xlvtt+(xcpv-xcl)*(psst(:)-xtt)
313 WHERE(psss(:)>0.0.AND.psss(:)/=xundef)
314 zlvs(:) = zlvs(:)*(1.0-1.00472e-3*psss(:))
324 zvisa(:) = 1.326e-05*(1.0+6.542e-03*(pta(:)-xtt)+8.301e-06*(pta(:)-xtt)**2 &
325 -4.84e-09*(pta(:)-xtt)**3)
334 zddu(:) = sign(max(abs(zddu(:)),10.0*zdusr0),zddu(:))
335 zddt(:) = sign(max(abs(zddt(:)),10.0*zdtsr0),zddt(:))
336 zddq(:) = sign(max(abs(zddq(:)),10.0*zdqsr0),zddq(:))
339 zusr(:) = 0.04*zddu(:)
340 ztsr(:) = 0.04*zddt(:)
341 zqsr(:) = 0.04*zddq(:)
342 zdeltau10n(:) = zddu(:)
343 zdeltat10n(:) = zddt(:)
344 zdeltaq10n(:) = zddq(:)
357 IF (jcv(jlon) == -1)
THEN
358 zusr0(jlon)=zusr(jlon)
359 ztsr0(jlon)=ztsr(jlon)
360 zqsr0(jlon)=zqsr(jlon)
361 IF (jj == nitermax+1 .OR. jj == nitermax+nitersup)
THEN
362 zdeltau10n(jlon) = 0.5*(zdusto(jlon)+zdeltau10n(jlon))
363 zdeltat10n(jlon) = 0.5*(zdtsto(jlon)+zdeltat10n(jlon))
364 zdeltaq10n(jlon) = 0.5*(zdqsto(jlon)+zdeltaq10n(jlon))
365 IF (jj == nitermax+nitersup) jcv(jlon)=3
367 zdusto(jlon) = zdeltau10n(jlon)
368 zdtsto(jlon) = zdeltat10n(jlon)
369 zdqsto(jlon) = zdeltaq10n(jlon)
373 IF (zdeltau10n(jlon) <= zutu)
THEN
374 zparun(jlon) = zcoefu(0) + zcoefu(1)*zdeltau10n(jlon) &
375 + zcoefu(2)*zdeltau10n(jlon)**2 &
376 + zcoefu(3)*zdeltau10n(jlon)**3 &
377 + zcoefu(4)*zdeltau10n(jlon)**4 &
378 + zcoefu(5)*zdeltau10n(jlon)**5
380 zparun(jlon) = zcdiru*(zdeltau10n(jlon)-zutu) + zordou
382 pcdn(jlon) = (zparun(jlon)/zdeltau10n(jlon))**2
386 IF (zdeltau10n(jlon) <= zutt)
THEN
387 zpartn(jlon) = zcoeft(0) + zcoeft(1)*zdeltau10n(jlon) &
388 + zcoeft(2)*zdeltau10n(jlon)**2 &
389 + zcoeft(3)*zdeltau10n(jlon)**3 &
390 + zcoeft(4)*zdeltau10n(jlon)**4
392 zpartn(jlon) = zcdirt*(zdeltau10n(jlon)-zutt) + zordot
397 IF (zdeltau10n(jlon) <= zutq)
THEN
398 zparqn(jlon) = zcoefq(0) + zcoefq(1)*zdeltau10n(jlon) &
399 + zcoefq(2)*zdeltau10n(jlon)**2
401 zparqn(jlon) = zcdirq*(zdeltau10n(jlon)-zutq) + zordoq
406 zusr(jlon) = zparun(jlon)
407 ztsr(jlon) = zpartn(jlon)*zdeltat10n(jlon)/zdeltau10n(jlon)
408 zqsr(jlon) = zparqn(jlon)*zdeltaq10n(jlon)/zdeltau10n(jlon)
417 zlmou = puref(jlon)*xg*xkarman*(ztsr(jlon)/pta(jlon) &
418 +zetv*zqsr(jlon)/(1.0+zetv*pqa(jlon)))/zusr(jlon)**2
420 zlmot = zlmou*(pzref(jlon)/puref(jlon))
421 zlmou = max(min(zlmou,zlmomax),zlmomin)
422 zlmot = max(min(zlmot,zlmomax),zlmomin)
428 IF (zlmou == 0.0)
THEN
430 ELSEIF (zlmou > 0.0)
THEN
433 zchik = (1.0-zbta*zlmou)**0.25
434 zpsik = 2.0*log((1.0+zchik)/2.0) &
435 +log((1.0+zchik**2)/2.0) &
436 -2.0*atan(zchik)+0.5*xpi
437 zchic = (1.0-12.87*zlmou)**(1.0/3.0)
438 zpsic = 1.5*log((zchic**2+zchic+1.0)/3.0) &
439 -zsqr3*atan((2.0*zchic+1.0)/zsqr3) &
441 zpsi_u = zpsic+(zpsik-zpsic)/(1.0+zlmou**2)
445 IF (zlmot == 0.0)
THEN
447 ELSEIF (zlmot > 0.0)
THEN
450 zchik = (1.0-zbta*zlmot)**0.25
451 zpsik = 2.0*log((1.0+zchik**2)/2.0)
452 zchic = (1.0-12.87*zlmot)**(1.0/3.0)
453 zpsic = 1.5*log((zchic**2+zchic+1.0)/3.0) &
454 -zsqr3*atan((2.0*zchic+1.0)/zsqr3) &
456 zpsi_t = zpsic+(zpsik-zpsic)/(1.0+zlmot**2)
462 zddu(jlon) = zdu(jlon)
463 zddt(jlon) = zdt(jlon)
464 zddq(jlon) = zdq(jlon)
465 zddu(jlon) = sign(max(abs(zddu(jlon)),10.0*zdusr0),zddu(jlon))
466 zddt(jlon) = sign(max(abs(zddt(jlon)),10.0*zdtsr0),zddt(jlon))
467 zddq(jlon) = sign(max(abs(zddq(jlon)),10.0*zdqsr0),zddq(jlon))
468 zlogus10 = log(puref(jlon)/10.0)
469 zlogts10 = log(pzref(jlon)/10.0)
470 zdeltau10n(jlon) = zddu(jlon)-zusr(jlon)*(zlogus10-zpsi_u)/xkarman
471 zdeltat10n(jlon) = zddt(jlon)-ztsr(jlon)*(zlogts10-zpsi_t)/xkarman
472 zdeltaq10n(jlon) = zddq(jlon)-zqsr(jlon)*(zlogts10-zpsi_t)/xkarman
473 zdeltau10n(jlon) = sign(max(abs(zdeltau10n(jlon)),10.0*zdusr0), &
475 zdeltat10n(jlon) = sign(max(abs(zdeltat10n(jlon)),10.0*zdtsr0), &
477 zdeltaq10n(jlon) = sign(max(abs(zdeltaq10n(jlon)),10.0*zdqsr0), &
482 IF (abs(zusr(jlon)-zusr0(jlon)) < zdusr0 .AND. &
483 abs(ztsr(jlon)-ztsr0(jlon)) < zdtsr0 .AND. &
484 abs(zqsr(jlon)-zqsr0(jlon)) < zdqsr0)
THEN
486 IF (jj >= nitermax+1) jcv(jlon) = 2
504 ztau(jlon) = -prhoa(jlon)*zusr(jlon)**2
505 zhf(jlon) = -prhoa(jlon)*zcpa(jlon)*zusr(jlon)*ztsr(jlon)
506 zef(jlon) = -prhoa(jlon)*zlvs(jlon)*zusr(jlon)*zqsr(jlon)
510 pcd(jlon) = (zusr(jlon)/zddu(jlon))**2
511 pch(jlon) = (zusr(jlon)*ztsr(jlon))/(zddu(jlon)*zddt(jlon))
512 pce(jlon) = (zusr(jlon)*zqsr(jlon))/(zddu(jlon)*zddq(jlon))
517 ztau(jlon) = ztau(jlon)* ( 1. + ppertflux(jlon) / 2. )
518 zhf(jlon) = zhf(jlon)* ( 1. + ppertflux(jlon) / 2. )
519 zef(jlon) = zef(jlon)* ( 1. + ppertflux(jlon) / 2. )
536 ztaur(jlon) = -0.85*prain(jlon)*pvmod(jlon)
546 zcpwa = 4217.51 -3.65566*ztac +0.1381*ztac**2 &
547 -2.8309e-03*ztac**3 +3.42061e-05*ztac**4 &
548 -2.18107e-07*ztac**5 +5.74535e-10*ztac**6
549 zdqsdt = (zlva(jlon)*zqsata(jlon))/(xrv*pta(jlon)**2)
550 zdwat = 2.11e-05*(zp00/ppa(jlon))*(pta(jlon)/xtt)**1.94
551 zdtmp = (1.0+3.309e-03*ztac-1.44e-06*ztac**2) &
552 *0.02411/(prhoa(jlon)*zcpa(jlon))
553 zbulb = 1.0/(1.0+zdqsdt*(zlva(jlon)*zdwat)/(zcpa(jlon)*zdtmp))
554 zrf(jlon) = prain(jlon)*zcpwa*zbulb*((psst(jlon)-pta(jlon)) &
555 +(pqsat(jlon)-pqa(jlon))*(zlva(jlon)*zdwat)/(zcpa(jlon)*zdtmp))
568 zww = (1.0+zetv)*(zusr(jlon)*zqsr(jlon)) &
569 +(1.0+(1.0+zetv)*pqa(jlon))*(zusr(jlon)*ztsr(jlon))/pta(jlon)
570 zefwebb(jlon) = -prhoa(jlon)*zlvs(jlon)*zww*pqa(jlon)
581 CALL
surface_ri(psst,pqsat,pexns,pexna,pta,pqa, &
582 pzref,puref,zdircoszw,pvmod,pri)
586 zustar2(:) = -(ztau(:)+ztaur(:))/prhoa(:)
589 pcd(:) = zustar2(:)/zddu(:)**2
592 pustar(:) = sqrt(zustar2(:))
596 zac(:) = pch(:)*zddu(:)
597 presa(:) = 1.0/zac(:)
601 psfth(:) = zhf(:)+zrf(:)
602 psftq(:) = (zef(:)+zefwebb(:))/zlvs(:)
606 IF (ccharnock ==
'OLD')
THEN
609 zcharn(:) = min(0.018,max(0.011,0.011+(0.007/8.0)*(zddu(:)-10.0)))
615 pz0sea(:) = (zcharn(:)/xg)*zustar2(:) + xvz0cm*pcd(:)/pcdn(:)
616 pz0hsea(:) = pz0sea(:)
617 ELSEIF (kz0 == 1)
THEN
618 pz0sea(:) = (zcharn(:)/xg)*zustar2(:) + 0.11*zvisa(:)/pustar(:)
619 pz0hsea(:) = pz0sea(:)
620 ELSEIF (kz0 == 2)
THEN
622 pz0sea(jlon) = puref(jlon)/exp(xkarman*zddu(jlon)/pustar(jlon)+zpsiu(jlon))
623 z0tsea = pzref(jlon)/exp(xkarman*zddt(jlon)/ztsr(jlon)+zpsit(jlon))
624 z0qsea = pzref(jlon)/exp(xkarman*zddq(jlon)/zqsr(jlon)+zpsit(jlon))
625 pz0hsea(jlon) = 0.5*(z0tsea+z0qsea)
630 IF (lhook) CALL dr_hook(
'ECUMEV6_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 ecumev6_flux(PZ0SEA, PTA, PEXNA, PRHOA, PSST, PSSS, PEXNS, PQA, PVMOD, PZREF, PUREF, PPS, PPA, PICHCE, OPRECIP, OPWEBB, PQSAT, PSFTH, PSFTQ, PUSTAR, PCD, PCDN, PCH, PCE, PRI, PRESA, PRAIN, KZ0, PZ0HSEA, OPERTFLUX, PPERTFLUX)