Directory: | ./ |
---|---|
File: | rad/swde.f90 |
Date: | 2022-01-11 19:19:34 |
Exec | Total | Coverage | |
---|---|---|---|
Lines: | 76 | 83 | 91.6% |
Branches: | 10 | 20 | 50.0% |
Line | Branch | Exec | Source |
---|---|---|---|
1 | !OPTIONS XOPT(HSFUN) | ||
2 | 56160 | SUBROUTINE SWDE & | |
3 | & ( KIDIA, KFDIA, KLON,& | ||
4 | & PGG , PREF , PRMUZ, PTO1, PW,& | ||
5 | & PRE1 , PRE2 , PTR1 , PTR2 & | ||
6 | & ) | ||
7 | |||
8 | !**** *SWDE* - DELTA-EDDINGTON IN A CLOUDY LAYER | ||
9 | |||
10 | ! PURPOSE. | ||
11 | ! -------- | ||
12 | ! COMPUTES THE REFLECTIVITY AND TRANSMISSIVITY OF A CLOUDY | ||
13 | ! LAYER USING THE DELTA-EDDINGTON'S APPROXIMATION. | ||
14 | |||
15 | !** INTERFACE. | ||
16 | ! ---------- | ||
17 | ! *SWDE* IS CALLED BY *SWR*, *SWNI* | ||
18 | |||
19 | ! EXPLICIT ARGUMENTS : | ||
20 | ! -------------------- | ||
21 | ! PGG : (KLON) ; ASSYMETRY FACTOR | ||
22 | ! PREF : (KLON) ; REFLECTIVITY OF THE UNDERLYING LAYER | ||
23 | ! PRMUZ : (KLON) ; COSINE OF SOLAR ZENITH ANGLE | ||
24 | ! PTO1 : (KLON) ; OPTICAL THICKNESS | ||
25 | ! PW : (KLON) ; SINGLE SCATTERING ALBEDO | ||
26 | ! ==== OUTPUTS === | ||
27 | ! PRE1 : (KLON) ; LAYER REFLECTIVITY ASSUMING NO | ||
28 | ! ; REFLECTION FROM UNDERLYING LAYER | ||
29 | ! PTR1 : (KLON) ; LAYER TRANSMISSIVITY ASSUMING NO | ||
30 | ! ; REFLECTION FROM UNDERLYING LAYER | ||
31 | ! PRE2 : (KLON) ; LAYER REFLECTIVITY ASSUMING | ||
32 | ! ; REFLECTION FROM UNDERLYING LAYER | ||
33 | ! PTR2 : (KLON) ; LAYER TRANSMISSIVITY ASSUMING | ||
34 | ! ; REFLECTION FROM UNDERLYING LAYER | ||
35 | |||
36 | ! IMPLICIT ARGUMENTS : NONE | ||
37 | ! -------------------- | ||
38 | |||
39 | ! METHOD. | ||
40 | ! ------- | ||
41 | |||
42 | ! STANDARD DELTA-EDDINGTON LAYER CALCULATIONS. | ||
43 | |||
44 | ! EXTERNALS. | ||
45 | ! ---------- | ||
46 | |||
47 | ! NONE | ||
48 | |||
49 | ! REFERENCE. | ||
50 | ! ---------- | ||
51 | |||
52 | ! SEE RADIATION'S PART OF THE MODEL'S DOCUMENTATION AND | ||
53 | ! ECMWF RESEARCH DEPARTMENT DOCUMENTATION OF THE IFS | ||
54 | |||
55 | ! AUTHOR. | ||
56 | ! ------- | ||
57 | ! JEAN-JACQUES MORCRETTE *ECMWF* | ||
58 | |||
59 | ! MODIFICATIONS. | ||
60 | ! -------------- | ||
61 | ! ORIGINAL: 88-12-15 | ||
62 | ! 96-05-30 Michel Deque (security in EXP()) | ||
63 | ! M.Hamrud 01-Oct-2003 CY28 Cleaning | ||
64 | ! Modified: 03-10-10 Deborah Salmond and Marta Janiskova Optimisation | ||
65 | ! Modified: 03-12-13 John Hague - MASS Vector Fns | ||
66 | ! Y.Seity 06-09-09 : add modset from O.Thouron (MesoNH) under NOVLP tests | ||
67 | ! ------------------------------------------------------------------ | ||
68 | |||
69 | ! ------------------------------------------------------------------ | ||
70 | |||
71 | !* 0.1 ARGUMENTS | ||
72 | ! --------- | ||
73 | |||
74 | USE PARKIND1 ,ONLY : JPIM ,JPRB | ||
75 | USE YOMHOOK ,ONLY : LHOOK, DR_HOOK | ||
76 | |||
77 | USE YOERDU , ONLY : REPLOG | ||
78 | USE YOMJFH , ONLY : N_VMASS | ||
79 | !++MODIFCODE | ||
80 | USE YOERAD , ONLY : NOVLP | ||
81 | !--MODIFCODE | ||
82 | IMPLICIT NONE | ||
83 | |||
84 | INTEGER(KIND=JPIM),INTENT(IN) :: KLON | ||
85 | INTEGER(KIND=JPIM),INTENT(IN) :: KIDIA | ||
86 | INTEGER(KIND=JPIM),INTENT(IN) :: KFDIA | ||
87 | REAL(KIND=JPRB) ,INTENT(IN) :: PGG(KLON) | ||
88 | REAL(KIND=JPRB) ,INTENT(IN) :: PREF(KLON) | ||
89 | REAL(KIND=JPRB) ,INTENT(IN) :: PRMUZ(KLON) | ||
90 | REAL(KIND=JPRB) ,INTENT(IN) :: PTO1(KLON) | ||
91 | REAL(KIND=JPRB) ,INTENT(IN) :: PW(KLON) | ||
92 | REAL(KIND=JPRB) ,INTENT(OUT) :: PRE1(KLON) | ||
93 | REAL(KIND=JPRB) ,INTENT(OUT) :: PRE2(KLON) | ||
94 | REAL(KIND=JPRB) ,INTENT(OUT) :: PTR1(KLON) | ||
95 | REAL(KIND=JPRB) ,INTENT(OUT) :: PTR2(KLON) | ||
96 | 112320 | REAL(KIND=JPRB) :: ZTMP (4,KFDIA-KIDIA+1) | |
97 | 112320 | REAL(KIND=JPRB) :: ZTMP2 (KFDIA-KIDIA+1+N_VMASS) | |
98 | 112320 | REAL(KIND=JPRB) :: ZTMP3 (KFDIA-KIDIA+1+N_VMASS) | |
99 | 112320 | REAL(KIND=JPRB) :: ZZARG (KFDIA-KIDIA+1+N_VMASS) | |
100 | 112320 | REAL(KIND=JPRB) :: ZZARG2 (KFDIA-KIDIA+1+N_VMASS) | |
101 | |||
102 | INTEGER(KIND=JPIM) :: JL, JLL, JLEN | ||
103 | |||
104 | REAL(KIND=JPRB) :: ZA11, ZA12, ZA13, ZA21, ZA22, ZA23, ZALPHA,& | ||
105 | & ZAM2B, ZAP2B, ZB21, ZB22, ZB23, & | ||
106 | & ZBETA, ZC1A, ZC1B, ZC2A, ZC2B, ZDENA, ZDENB, & | ||
107 | & ZDT, ZEXKM, ZEXKP, ZEXMU0, ZFF, ZGP, ZRI0A, & | ||
108 | & ZRI0B, ZRI0C, ZRI0D, ZRI1A, ZRI1B, ZRI1C, & | ||
109 | & ZRI1D, ZRK, ZRM2, ZRP, ZTOP, ZWCP, ZWM, ZX1, & | ||
110 | & ZX2, ZXM2P, ZXP2P | ||
111 | |||
112 | |||
113 | REAL(KIND=JPRB) :: MINJ, MAXJ, X, Y | ||
114 | REAL(KIND=JPRB) :: ZPRMUZ,ZIDENA,ZIDENB,ZRR | ||
115 | REAL(KIND=JPRB) :: ZHOOK_HANDLE | ||
116 | |||
117 | ! STATEMENT DUNCTIONS | ||
118 | MINJ(X,Y) = Y - 0.5_JPRB*(ABS(X-Y)-(X-Y)) | ||
119 | MAXJ(X,Y) = Y + 0.5_JPRB*(ABS(X-Y)+(X-Y)) | ||
120 | |||
121 | ! ------------------------------------------------------------------ | ||
122 | |||
123 | !* 1. DELTA-EDDINGTON CALCULATIONS | ||
124 | |||
125 |
1/2✓ Branch 0 taken 56160 times.
✗ Branch 1 not taken.
|
56160 | IF (LHOOK) CALL DR_HOOK('SWDE',0,ZHOOK_HANDLE) |
126 | |||
127 | ZDT = 2.0_JPRB/3._JPRB | ||
128 | |||
129 |
2/2✓ Branch 0 taken 55823040 times.
✓ Branch 1 taken 56160 times.
|
55879200 | DO JL = KIDIA,KFDIA |
130 | 55823040 | JLL=JL-KIDIA+1 | |
131 | 55823040 | ZPRMUZ=1.0_JPRB/PRMUZ(JL) | |
132 | !++MODIFCODE | ||
133 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 55823040 times.
|
55823040 | IF (NOVLP >= 5) THEN !MESONH_VERSION |
134 | ✗ | ZGP = PGG(JL) | |
135 | ✗ | ZTOP = PTO1(JL) | |
136 | ✗ | ZWCP = PW(JL) | |
137 | ELSE !ECMWF VERSION | ||
138 | 55823040 | ZFF = PGG(JL)*PGG(JL) | |
139 | 55823040 | ZGP = PGG(JL)/(1.0_JPRB+PGG(JL)) | |
140 | 55823040 | ZTOP = (1.0_JPRB- PW(JL) * ZFF) * PTO1(JL) | |
141 | 55823040 | ZWCP = (1-ZFF)* PW(JL) /(1.0_JPRB- PW(JL) * ZFF) | |
142 | ENDIF | ||
143 | !--MODIFCODE | ||
144 | 55823040 | ZX1 = 1.0_JPRB-ZWCP*ZGP | |
145 | 55823040 | ZWM = 1.0_JPRB-ZWCP | |
146 | 55823040 | ZRM2 = PRMUZ(JL) * PRMUZ(JL) | |
147 | 55823040 | ZRK = SQRT(MAXJ(REPLOG,3._JPRB*ZWM*ZX1)) | |
148 | 55823040 | ZX2 = (1.0_JPRB-ZRK*ZRK*ZRM2)*(4._JPRB/3._JPRB) | |
149 | 55823040 | ZRR = 1.0_JPRB/ZX2 | |
150 | 55823040 | ZRP=ZRK/ZX1 | |
151 | 55823040 | ZALPHA = ZWCP*ZRM2*(1.0_JPRB+ZGP*ZWM)*ZRR | |
152 | 55823040 | ZBETA = ZWCP* PRMUZ(JL) *(1.0_JPRB+3._JPRB*ZGP*ZRM2*ZWM)*ZRR | |
153 | 55823040 | ZZARG(JLL) = -MAXJ( -200._JPRB, MINJ( ZTOP*ZPRMUZ, 200._JPRB) ) | |
154 | 55823040 | ZZARG2(JLL) = MINJ( ZRK*ZTOP, 200._JPRB) | |
155 | 55823040 | ZTMP(1,JLL) = ZPRMUZ | |
156 | 55823040 | ZTMP(2,JLL) = ZALPHA | |
157 | 55823040 | ZTMP(3,JLL) = ZBETA | |
158 | 55879200 | ZTMP(4,JLL) = ZRP | |
159 | ENDDO | ||
160 | |||
161 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 56160 times.
|
56160 | IF(N_VMASS /= 0 ) THEN !USING VECTOR MASS |
162 | ✗ | JLEN=KFDIA-KIDIA+N_VMASS-MOD(KFDIA-KIDIA,N_VMASS) | |
163 | ✗ | IF(KFDIA-KIDIA+1 /= JLEN) THEN | |
164 | ✗ | ZZARG (KFDIA-KIDIA+2:JLEN)=1.0_JPRB | |
165 | ✗ | ZZARG2 (KFDIA-KIDIA+2:JLEN)=1.0_JPRB | |
166 | ENDIF | ||
167 | ! Commente par MPL le 21.11.08 | ||
168 | ! CALL VEXP(ZTMP2,ZZARG, JLEN) | ||
169 | ! CALL VEXP(ZTMP3,ZZARG2,JLEN) | ||
170 | ELSE | ||
171 |
2/2✓ Branch 0 taken 56160 times.
✓ Branch 1 taken 55823040 times.
|
55879200 | DO JL = KIDIA,KFDIA |
172 | 55823040 | JLL=JL-KIDIA+1 | |
173 | 55823040 | ZTMP2(JLL) = EXP(ZZARG(JLL)) | |
174 | 55879200 | ZTMP3(JLL) = EXP(ZZARG2(JLL)) | |
175 | ENDDO | ||
176 | ENDIF | ||
177 | |||
178 |
2/2✓ Branch 0 taken 55823040 times.
✓ Branch 1 taken 56160 times.
|
55879200 | DO JL = KIDIA,KFDIA |
179 | 55823040 | JLL=JL-KIDIA+1 | |
180 | 55823040 | ZEXMU0 = ZTMP2(JLL) | |
181 | 55823040 | ZEXKP = ZTMP3(JLL) | |
182 | 55823040 | ZPRMUZ = ZTMP(1,JLL) | |
183 | 55823040 | ZALPHA = ZTMP(2,JLL) | |
184 | 55823040 | ZBETA = ZTMP(3,JLL) | |
185 | 55823040 | ZRP = ZTMP(4,JLL) | |
186 | 55823040 | ZEXKM = 1.0_JPRB/ZEXKP | |
187 | 55823040 | ZXP2P = 1.0_JPRB+ZDT*ZRP | |
188 | 55823040 | ZXM2P = 1.0_JPRB-ZDT*ZRP | |
189 | 55823040 | ZAP2B = ZALPHA+ZDT*ZBETA | |
190 | 55823040 | ZAM2B = ZALPHA-ZDT*ZBETA | |
191 | |||
192 | !* 1.2 WITHOUT REFLECTION FROM THE UNDERLYING LAYER | ||
193 | |||
194 | ZA11 = ZXP2P | ||
195 | ZA12 = ZXM2P | ||
196 | ZA13 = ZAP2B | ||
197 | 55823040 | ZA22 = ZXP2P*ZEXKP | |
198 | 55823040 | ZA21 = ZXM2P*ZEXKM | |
199 | 55823040 | ZA23 = ZAM2B*ZEXMU0 | |
200 | 55823040 | ZDENA = ZA11 * ZA22 - ZA21 * ZA12 | |
201 | 55823040 | ZIDENA=1.0_JPRB/ZDENA | |
202 | 55823040 | ZC1A = (ZA22*ZA13-ZA12*ZA23)*ZIDENA | |
203 | 55823040 | ZC2A = (ZA11*ZA23-ZA21*ZA13)*ZIDENA | |
204 | 55823040 | ZRI0A = ZC1A+ZC2A-ZALPHA | |
205 | 55823040 | ZRI1A = ZRP*(ZC1A-ZC2A)-ZBETA | |
206 | 55823040 | PRE1(JL) = (ZRI0A-ZDT*ZRI1A)*ZPRMUZ | |
207 | 55823040 | ZRI0B = ZC1A*ZEXKM+ZC2A*ZEXKP-ZALPHA*ZEXMU0 | |
208 | 55823040 | ZRI1B = ZRP*(ZC1A*ZEXKM-ZC2A*ZEXKP)-ZBETA*ZEXMU0 | |
209 | 55823040 | PTR1(JL) = ZEXMU0+(ZRI0B+ZDT*ZRI1B)*ZPRMUZ | |
210 | |||
211 | !* 1.3 WITH REFLECTION FROM THE UNDERLYING LAYER | ||
212 | |||
213 | 55823040 | ZB21 = ZA21- PREF(JL) *ZXP2P*ZEXKM | |
214 | 55823040 | ZB22 = ZA22- PREF(JL) *ZXM2P*ZEXKP | |
215 | 55823040 | ZB23 = ZA23- PREF(JL) *ZEXMU0*(ZAP2B - PRMUZ(JL) ) | |
216 | 55823040 | ZDENB = ZA11 * ZB22 - ZB21 * ZA12 | |
217 | 55823040 | ZIDENB= 1.0_JPRB/ZDENB | |
218 | 55823040 | ZC1B = (ZB22*ZA13-ZA12*ZB23)*ZIDENB | |
219 | 55823040 | ZC2B = (ZA11*ZB23-ZB21*ZA13)*ZIDENB | |
220 | 55823040 | ZRI0C = ZC1B+ZC2B-ZALPHA | |
221 | 55823040 | ZRI1C = ZRP*(ZC1B-ZC2B)-ZBETA | |
222 | 55823040 | PRE2(JL) = (ZRI0C-ZDT*ZRI1C) * ZPRMUZ | |
223 | 55823040 | ZRI0D = ZC1B*ZEXKM + ZC2B*ZEXKP - ZALPHA*ZEXMU0 | |
224 | 55823040 | ZRI1D = ZRP * (ZC1B*ZEXKM - ZC2B*ZEXKP) - ZBETA*ZEXMU0 | |
225 | 55879200 | PTR2(JL) = ZEXMU0 + (ZRI0D + ZDT*ZRI1D) * ZPRMUZ | |
226 | ENDDO | ||
227 | |||
228 |
1/2✓ Branch 0 taken 56160 times.
✗ Branch 1 not taken.
|
56160 | IF (LHOOK) CALL DR_HOOK('SWDE',1,ZHOOK_HANDLE) |
229 | 56160 | END SUBROUTINE SWDE | |
230 | |||
231 |