1 |
SUBROUTINE flxadjtq(pp, pt, pq, ldflag, kcall) |
module flxadjtq_m |
2 |
use dimens_m |
|
3 |
use dimphy |
IMPLICIT none |
4 |
use SUPHEC_M |
|
5 |
use yoethf_m |
contains |
6 |
use fcttre |
|
7 |
IMPLICIT none |
SUBROUTINE flxadjtq(pp, pt, pq, ldflag, kcall) |
8 |
!====================================================================== |
|
9 |
! Objet: ajustement entre T et Q |
! Objet: ajustement entre T et Q |
10 |
!====================================================================== |
|
11 |
! NOTE: INPUT PARAMETER kcall DEFINES CALCULATION AS |
USE dimphy, ONLY: klon |
12 |
! kcall=0 ENV. T AND QS IN*CUINI* |
USE suphec_m, ONLY: rcpd, retv, rlstt, rlvtt, rtt |
13 |
! kcall=1 CONDENSATION IN UPDRAFTS (E.G. CUBASE, CUASC) |
USE yoethf_m, ONLY: r2es, r5ies, r5les |
14 |
! kcall=2 EVAPORATION IN DOWNDRAFTS (E.G. CUDLFS,CUDDRAF) |
USE fcttre, ONLY: foede, foeew |
15 |
! |
|
16 |
! |
REAL pt(klon), pq(klon), pp(klon) |
17 |
REAL pt(klon), pq(klon), pp(klon) |
LOGICAL ldflag(klon) |
18 |
LOGICAL ldflag(klon) |
INTEGER kcall |
19 |
INTEGER kcall |
! NOTE: INPUT PARAMETER kcall DEFINES CALCULATION AS |
20 |
! |
! kcall=0 ENV. T AND QS IN*CUINI* |
21 |
REAL zcond(klon), zcond1 |
! kcall=1 CONDENSATION IN UPDRAFTS (E.G. CUBASE, CUASC) |
22 |
REAL Z5alvcp, z5alscp, zalvdcp, zalsdcp |
! kcall=2 EVAPORATION IN DOWNDRAFTS (E.G. CUDLFS,CUDDRAF) |
23 |
REAL zdelta, zcvm5, zldcp, zqsat, zcor |
|
24 |
INTEGER is, i |
REAL zcond(klon), zcond1 |
25 |
! |
REAL Z5alvcp, z5alscp, zalvdcp, zalsdcp |
26 |
z5alvcp = r5les*RLVTT/RCPD |
REAL zdelta, zcvm5, zldcp, zqsat, zcor |
27 |
z5alscp = r5ies*RLSTT/RCPD |
INTEGER is, i |
28 |
zalvdcp = rlvtt/RCPD |
|
29 |
zalsdcp = rlstt/RCPD |
!--------------------------------------------------------------------- |
30 |
! |
|
31 |
|
z5alvcp = r5les*RLVTT/RCPD |
32 |
DO i = 1, klon |
z5alscp = r5ies*RLSTT/RCPD |
33 |
zcond(i) = 0.0 |
zalvdcp = rlvtt/RCPD |
34 |
ENDDO |
zalsdcp = rlstt/RCPD |
35 |
|
|
36 |
DO 210 i =1, klon |
DO i = 1, klon |
37 |
IF (ldflag(i)) THEN |
zcond(i) = 0.0 |
38 |
zdelta = MAX(0.,SIGN(1.,RTT-pt(i))) |
ENDDO |
39 |
zcvm5 = z5alvcp*(1.-zdelta) + zdelta*z5alscp |
|
40 |
zldcp = zalvdcp*(1.-zdelta) + zdelta*zalsdcp |
DO i =1, klon |
41 |
zqsat = R2ES*FOEEW(pt(i),zdelta) / pp(i) |
IF (ldflag(i)) THEN |
42 |
zqsat = MIN(0.5,zqsat) |
zdelta = MAX(0.,SIGN(1.,RTT-pt(i))) |
43 |
zcor = 1./(1.-RETV*zqsat) |
zcvm5 = z5alvcp*(1.-zdelta) + zdelta*z5alscp |
44 |
zqsat = zqsat*zcor |
zldcp = zalvdcp*(1.-zdelta) + zdelta*zalsdcp |
45 |
zcond(i) = (pq(i)-zqsat) & |
zqsat = R2ES*FOEEW(pt(i),zdelta) / pp(i) |
46 |
/ (1. + FOEDE(pt(i), zdelta, zcvm5, zqsat, zcor)) |
zqsat = MIN(0.5,zqsat) |
47 |
IF (kcall.EQ.1) zcond(i) = MAX(zcond(i),0.) |
zcor = 1./(1.-RETV*zqsat) |
48 |
IF (kcall.EQ.2) zcond(i) = MIN(zcond(i),0.) |
zqsat = zqsat*zcor |
49 |
pt(i) = pt(i) + zldcp*zcond(i) |
zcond(i) = (pq(i)-zqsat) & |
50 |
pq(i) = pq(i) - zcond(i) |
/ (1. + FOEDE(pt(i), zdelta, zcvm5, zqsat, zcor)) |
51 |
ENDIF |
IF (kcall.EQ.1) zcond(i) = MAX(zcond(i),0.) |
52 |
210 CONTINUE |
IF (kcall.EQ.2) zcond(i) = MIN(zcond(i),0.) |
53 |
! |
pt(i) = pt(i) + zldcp*zcond(i) |
54 |
is = 0 |
pq(i) = pq(i) - zcond(i) |
55 |
DO i =1, klon |
ENDIF |
56 |
IF (zcond(i).NE.0.) is = is + 1 |
end DO |
57 |
ENDDO |
|
58 |
IF (is.EQ.0) GOTO 230 |
is = 0 |
59 |
! |
DO i =1, klon |
60 |
DO 220 i = 1, klon |
IF (zcond(i).NE.0.) is = is + 1 |
61 |
IF(ldflag(i).AND.zcond(i).NE.0.) THEN |
ENDDO |
62 |
zdelta = MAX(0.,SIGN(1.,RTT-pt(i))) |
IF (is /= 0) then |
63 |
zcvm5 = z5alvcp*(1.-zdelta) + zdelta*z5alscp |
DO i = 1, klon |
64 |
zldcp = zalvdcp*(1.-zdelta) + zdelta*zalsdcp |
IF(ldflag(i).AND.zcond(i).NE.0.) THEN |
65 |
zqsat = R2ES* FOEEW(pt(i),zdelta) / pp(i) |
zdelta = MAX(0.,SIGN(1.,RTT-pt(i))) |
66 |
zqsat = MIN(0.5,zqsat) |
zcvm5 = z5alvcp*(1.-zdelta) + zdelta*z5alscp |
67 |
zcor = 1./(1.-RETV*zqsat) |
zldcp = zalvdcp*(1.-zdelta) + zdelta*zalsdcp |
68 |
zqsat = zqsat*zcor |
zqsat = R2ES* FOEEW(pt(i),zdelta) / pp(i) |
69 |
zcond1 = (pq(i)-zqsat) & |
zqsat = MIN(0.5,zqsat) |
70 |
/ (1. + FOEDE(pt(i),zdelta,zcvm5,zqsat,zcor)) |
zcor = 1./(1.-RETV*zqsat) |
71 |
pt(i) = pt(i) + zldcp*zcond1 |
zqsat = zqsat*zcor |
72 |
pq(i) = pq(i) - zcond1 |
zcond1 = (pq(i)-zqsat) & |
73 |
ENDIF |
/ (1. + FOEDE(pt(i),zdelta,zcvm5,zqsat,zcor)) |
74 |
220 CONTINUE |
pt(i) = pt(i) + zldcp*zcond1 |
75 |
! |
pq(i) = pq(i) - zcond1 |
76 |
230 CONTINUE |
ENDIF |
77 |
RETURN |
end DO |
78 |
END |
end IF |
79 |
|
|
80 |
|
END SUBROUTINE flxadjtq |
81 |
|
|
82 |
|
end module flxadjtq_m |