1 |
SUBROUTINE swde(pgg, pref, prmuz, pto1, pw, pre1, pre2, ptr1, ptr2) |
module swde_m |
2 |
USE dimens_m |
|
|
USE dimphy |
|
|
USE raddim |
|
3 |
IMPLICIT NONE |
IMPLICIT NONE |
4 |
|
|
5 |
! ------------------------------------------------------------------ |
contains |
6 |
! PURPOSE. |
|
7 |
! -------- |
SUBROUTINE swde(pgg, pref, prmuz, pto1, pw, pre1, pre2, ptr1, ptr2) |
8 |
! COMPUTES THE REFLECTIVITY AND TRANSMISSIVITY OF A CLOUDY |
USE dimens_m |
9 |
! LAYER USING THE DELTA-EDDINGTON'S APPROXIMATION. |
USE dimphy |
10 |
|
USE raddim |
11 |
! METHOD. |
! ------------------------------------------------------------------ |
12 |
! ------- |
! PURPOSE. |
13 |
|
! -------- |
14 |
! STANDARD DELTA-EDDINGTON LAYER CALCULATIONS. |
! COMPUTES THE REFLECTIVITY AND TRANSMISSIVITY OF A CLOUDY |
15 |
|
! LAYER USING THE DELTA-EDDINGTON'S APPROXIMATION. |
16 |
! REFERENCE. |
|
17 |
! ---------- |
! METHOD. |
18 |
|
! ------- |
19 |
! SEE RADIATION'S PART OF THE MODEL'S DOCUMENTATION AND |
|
20 |
! ECMWF RESEARCH DEPARTMENT DOCUMENTATION OF THE IFS |
! STANDARD DELTA-EDDINGTON LAYER CALCULATIONS. |
21 |
|
|
22 |
! AUTHOR. |
! REFERENCE. |
23 |
! ------- |
! ---------- |
24 |
! JEAN-JACQUES MORCRETTE *ECMWF* |
|
25 |
|
! SEE RADIATION'S PART OF THE MODEL'S DOCUMENTATION AND |
26 |
! MODIFICATIONS. |
! ECMWF RESEARCH DEPARTMENT DOCUMENTATION OF THE IFS |
27 |
! -------------- |
|
28 |
! ORIGINAL : 88-12-15 |
! AUTHOR. |
29 |
! ------------------------------------------------------------------ |
! ------- |
30 |
! * ARGUMENTS: |
! JEAN-JACQUES MORCRETTE *ECMWF* |
31 |
|
|
32 |
DOUBLE PRECISION pgg(kdlon) ! ASSYMETRY FACTOR |
! MODIFICATIONS. |
33 |
DOUBLE PRECISION pref(kdlon) ! REFLECTIVITY OF THE UNDERLYING LAYER |
! -------------- |
34 |
DOUBLE PRECISION prmuz(kdlon) ! COSINE OF SOLAR ZENITH ANGLE |
! ORIGINAL : 88-12-15 |
35 |
DOUBLE PRECISION pto1(kdlon) ! OPTICAL THICKNESS |
! ------------------------------------------------------------------ |
36 |
DOUBLE PRECISION pw(kdlon) ! SINGLE SCATTERING ALBEDO |
! * ARGUMENTS: |
37 |
DOUBLE PRECISION pre1(kdlon) ! LAYER REFLECTIVITY (NO UNDERLYING-LAYER REFLECTION) |
|
38 |
DOUBLE PRECISION pre2(kdlon) ! LAYER REFLECTIVITY |
DOUBLE PRECISION pgg(kdlon) ! ASSYMETRY FACTOR |
39 |
DOUBLE PRECISION ptr1(kdlon) ! LAYER TRANSMISSIVITY (NO UNDERLYING-LAYER REFLECTION) |
DOUBLE PRECISION pref(kdlon) ! REFLECTIVITY OF THE UNDERLYING LAYER |
40 |
DOUBLE PRECISION ptr2(kdlon) ! LAYER TRANSMISSIVITY |
DOUBLE PRECISION prmuz(kdlon) ! COSINE OF SOLAR ZENITH ANGLE |
41 |
|
DOUBLE PRECISION pto1(kdlon) ! OPTICAL THICKNESS |
42 |
! * LOCAL VARIABLES: |
DOUBLE PRECISION pw(kdlon) ! SINGLE SCATTERING ALBEDO |
43 |
|
DOUBLE PRECISION pre1(kdlon) ! LAYER REFLECTIVITY (NO UNDERLYING-LAYER REFLECTION) |
44 |
INTEGER jl |
DOUBLE PRECISION pre2(kdlon) ! LAYER REFLECTIVITY |
45 |
DOUBLE PRECISION zff, zgp, ztop, zwcp, zdt, zx1, zwm |
DOUBLE PRECISION ptr1(kdlon) ! LAYER TRANSMISSIVITY (NO UNDERLYING-LAYER REFLECTION) |
46 |
DOUBLE PRECISION zrm2, zrk, zx2, zrp, zalpha, zbeta, zarg |
DOUBLE PRECISION ptr2(kdlon) ! LAYER TRANSMISSIVITY |
47 |
DOUBLE PRECISION zexmu0, zarg2, zexkp, zexkm, zxp2p, zxm2p, zap2b |
|
48 |
DOUBLE PRECISION zam2b |
! * LOCAL VARIABLES: |
49 |
DOUBLE PRECISION za11, za12, za13, za21, za22, za23 |
|
50 |
DOUBLE PRECISION zdena, zc1a, zc2a, zri0a, zri1a |
INTEGER jl |
51 |
DOUBLE PRECISION zri0b, zri1b |
DOUBLE PRECISION zff, zgp, ztop, zwcp, zdt, zx1, zwm |
52 |
DOUBLE PRECISION zb21, zb22, zb23, zdenb, zc1b, zc2b |
DOUBLE PRECISION zrm2, zrk, zx2, zrp, zalpha, zbeta, zarg |
53 |
DOUBLE PRECISION zri0c, zri1c, zri0d, zri1d |
DOUBLE PRECISION zexmu0, zarg2, zexkp, zexkm, zxp2p, zxm2p, zap2b |
54 |
! ------------------------------------------------------------------ |
DOUBLE PRECISION zam2b |
55 |
|
DOUBLE PRECISION za11, za12, za13, za21, za22, za23 |
56 |
! * 1. DELTA-EDDINGTON CALCULATIONS |
DOUBLE PRECISION zdena, zc1a, zc2a, zri0a, zri1a |
57 |
|
DOUBLE PRECISION zri0b, zri1b |
58 |
|
DOUBLE PRECISION zb21, zb22, zb23, zdenb, zc1b, zc2b |
59 |
DO jl = 1, kdlon |
DOUBLE PRECISION zri0c, zri1c, zri0d, zri1d |
60 |
|
! ------------------------------------------------------------------ |
61 |
! * 1.1 SET UP THE DELTA-MODIFIED PARAMETERS |
|
62 |
|
! * 1. DELTA-EDDINGTON CALCULATIONS |
63 |
|
|
64 |
zff = pgg(jl)*pgg(jl) |
|
65 |
zgp = pgg(jl)/(1.+pgg(jl)) |
DO jl = 1, kdlon |
66 |
ztop = (1.-pw(jl)*zff)*pto1(jl) |
|
67 |
zwcp = (1-zff)*pw(jl)/(1.-pw(jl)*zff) |
! * 1.1 SET UP THE DELTA-MODIFIED PARAMETERS |
68 |
zdt = 2./3. |
|
69 |
zx1 = 1. - zwcp*zgp |
|
70 |
zwm = 1. - zwcp |
zff = pgg(jl)*pgg(jl) |
71 |
zrm2 = prmuz(jl)*prmuz(jl) |
zgp = pgg(jl)/(1.+pgg(jl)) |
72 |
zrk = sqrt(3.*zwm*zx1) |
ztop = (1.-pw(jl)*zff)*pto1(jl) |
73 |
zx2 = 4.*(1.-zrk*zrk*zrm2) |
zwcp = (1-zff)*pw(jl)/(1.-pw(jl)*zff) |
74 |
zrp = zrk/zx1 |
zdt = 2./3. |
75 |
zalpha = 3.*zwcp*zrm2*(1.+zgp*zwm)/zx2 |
zx1 = 1. - zwcp*zgp |
76 |
zbeta = 3.*zwcp*prmuz(jl)*(1.+3.*zgp*zrm2*zwm)/zx2 |
zwm = 1. - zwcp |
77 |
! MAF ZARG=MIN(ZTOP/PRMUZ(JL),200.) |
zrm2 = prmuz(jl)*prmuz(jl) |
78 |
zarg = min(ztop/prmuz(jl), 2.0D+2) |
zrk = sqrt(3.*zwm*zx1) |
79 |
zexmu0 = exp(-zarg) |
zx2 = 4.*(1.-zrk*zrk*zrm2) |
80 |
! MAF ZARG2=MIN(ZRK*ZTOP,200.) |
zrp = zrk/zx1 |
81 |
zarg2 = min(zrk*ztop, 2.0D+2) |
zalpha = 3.*zwcp*zrm2*(1.+zgp*zwm)/zx2 |
82 |
zexkp = exp(zarg2) |
zbeta = 3.*zwcp*prmuz(jl)*(1.+3.*zgp*zrm2*zwm)/zx2 |
83 |
zexkm = 1./zexkp |
! MAF ZARG=MIN(ZTOP/PRMUZ(JL),200.) |
84 |
zxp2p = 1. + zdt*zrp |
zarg = min(ztop/prmuz(jl), 2.0D+2) |
85 |
zxm2p = 1. - zdt*zrp |
zexmu0 = exp(-zarg) |
86 |
zap2b = zalpha + zdt*zbeta |
! MAF ZARG2=MIN(ZRK*ZTOP,200.) |
87 |
zam2b = zalpha - zdt*zbeta |
zarg2 = min(zrk*ztop, 2.0D+2) |
88 |
|
zexkp = exp(zarg2) |
89 |
! * 1.2 WITHOUT REFLECTION FROM THE UNDERLYING LAYER |
zexkm = 1./zexkp |
90 |
|
zxp2p = 1. + zdt*zrp |
91 |
|
zxm2p = 1. - zdt*zrp |
92 |
za11 = zxp2p |
zap2b = zalpha + zdt*zbeta |
93 |
za12 = zxm2p |
zam2b = zalpha - zdt*zbeta |
94 |
za13 = zap2b |
|
95 |
za22 = zxp2p*zexkp |
! * 1.2 WITHOUT REFLECTION FROM THE UNDERLYING LAYER |
96 |
za21 = zxm2p*zexkm |
|
97 |
za23 = zam2b*zexmu0 |
|
98 |
zdena = za11*za22 - za21*za12 |
za11 = zxp2p |
99 |
zc1a = (za22*za13-za12*za23)/zdena |
za12 = zxm2p |
100 |
zc2a = (za11*za23-za21*za13)/zdena |
za13 = zap2b |
101 |
zri0a = zc1a + zc2a - zalpha |
za22 = zxp2p*zexkp |
102 |
zri1a = zrp*(zc1a-zc2a) - zbeta |
za21 = zxm2p*zexkm |
103 |
pre1(jl) = (zri0a-zdt*zri1a)/prmuz(jl) |
za23 = zam2b*zexmu0 |
104 |
zri0b = zc1a*zexkm + zc2a*zexkp - zalpha*zexmu0 |
zdena = za11*za22 - za21*za12 |
105 |
zri1b = zrp*(zc1a*zexkm-zc2a*zexkp) - zbeta*zexmu0 |
zc1a = (za22*za13-za12*za23)/zdena |
106 |
ptr1(jl) = zexmu0 + (zri0b+zdt*zri1b)/prmuz(jl) |
zc2a = (za11*za23-za21*za13)/zdena |
107 |
|
zri0a = zc1a + zc2a - zalpha |
108 |
! * 1.3 WITH REFLECTION FROM THE UNDERLYING LAYER |
zri1a = zrp*(zc1a-zc2a) - zbeta |
109 |
|
pre1(jl) = (zri0a-zdt*zri1a)/prmuz(jl) |
110 |
|
zri0b = zc1a*zexkm + zc2a*zexkp - zalpha*zexmu0 |
111 |
zb21 = za21 - pref(jl)*zxp2p*zexkm |
zri1b = zrp*(zc1a*zexkm-zc2a*zexkp) - zbeta*zexmu0 |
112 |
zb22 = za22 - pref(jl)*zxm2p*zexkp |
ptr1(jl) = zexmu0 + (zri0b+zdt*zri1b)/prmuz(jl) |
113 |
zb23 = za23 - pref(jl)*zexmu0*(zap2b-prmuz(jl)) |
|
114 |
zdenb = za11*zb22 - zb21*za12 |
! * 1.3 WITH REFLECTION FROM THE UNDERLYING LAYER |
115 |
zc1b = (zb22*za13-za12*zb23)/zdenb |
|
116 |
zc2b = (za11*zb23-zb21*za13)/zdenb |
|
117 |
zri0c = zc1b + zc2b - zalpha |
zb21 = za21 - pref(jl)*zxp2p*zexkm |
118 |
zri1c = zrp*(zc1b-zc2b) - zbeta |
zb22 = za22 - pref(jl)*zxm2p*zexkp |
119 |
pre2(jl) = (zri0c-zdt*zri1c)/prmuz(jl) |
zb23 = za23 - pref(jl)*zexmu0*(zap2b-prmuz(jl)) |
120 |
zri0d = zc1b*zexkm + zc2b*zexkp - zalpha*zexmu0 |
zdenb = za11*zb22 - zb21*za12 |
121 |
zri1d = zrp*(zc1b*zexkm-zc2b*zexkp) - zbeta*zexmu0 |
zc1b = (zb22*za13-za12*zb23)/zdenb |
122 |
ptr2(jl) = zexmu0 + (zri0d+zdt*zri1d)/prmuz(jl) |
zc2b = (za11*zb23-zb21*za13)/zdenb |
123 |
|
zri0c = zc1b + zc2b - zalpha |
124 |
END DO |
zri1c = zrp*(zc1b-zc2b) - zbeta |
125 |
RETURN |
pre2(jl) = (zri0c-zdt*zri1c)/prmuz(jl) |
126 |
END SUBROUTINE swde |
zri0d = zc1b*zexkm + zc2b*zexkp - zalpha*zexmu0 |
127 |
|
zri1d = zrp*(zc1b*zexkm-zc2b*zexkp) - zbeta*zexmu0 |
128 |
|
ptr2(jl) = zexmu0 + (zri0d+zdt*zri1d)/prmuz(jl) |
129 |
|
|
130 |
|
END DO |
131 |
|
RETURN |
132 |
|
END SUBROUTINE swde |
133 |
|
|
134 |
|
end module swde_m |