Directory: | ./ |
---|---|
File: | phys/calwake.f90 |
Date: | 2022-01-11 19:19:34 |
Exec | Total | Coverage | |
---|---|---|---|
Lines: | 143 | 145 | 98.6% |
Branches: | 93 | 96 | 96.9% |
Line | Branch | Exec | Source |
---|---|---|---|
1 | |||
2 | ! $Id: calwake.F90 3208 2018-02-16 11:42:18Z jyg $ | ||
3 | |||
4 | 480 | SUBROUTINE calwake(iflag_wake_tend, paprs, pplay, dtime, & | |
5 | t, q, omgb, & | ||
6 | dt_dwn, dq_dwn, m_dwn, m_up, dt_a, dq_a, wgen, & | ||
7 | sigd, Cin, & | ||
8 | 480 | wake_deltat, wake_deltaq, wake_s, awake_dens, wake_dens, & | |
9 | wake_dth, wake_h, & | ||
10 | wake_pe, wake_fip, wake_gfl, & | ||
11 | 480 | dt_wake, dq_wake, wake_k, t_x, q_x, wake_omgbdth, & | |
12 | wake_dp_omgb, & | ||
13 | wake_dtke, wake_dqke, & | ||
14 | wake_omg, wake_dp_deltomg, & | ||
15 | wake_spread, wake_cstar, wake_d_deltat_gw, & | ||
16 | wake_ddeltat, wake_ddeltaq, wake_ds, awake_ddens, wake_ddens) | ||
17 | ! ************************************************************** | ||
18 | ! * | ||
19 | ! CALWAKE * | ||
20 | ! interface avec le schema de calcul de la poche * | ||
21 | ! froide * | ||
22 | ! * | ||
23 | ! written by : CHERUY Frederique, 13/03/2000, 10.31.05 * | ||
24 | ! modified by : ROEHRIG Romain, 01/30/2007 * | ||
25 | ! ************************************************************** | ||
26 | |||
27 | USE dimphy | ||
28 | USE phys_state_var_mod, ONLY: pctsrf | ||
29 | USE indice_sol_mod, ONLY: is_oce | ||
30 | USE print_control_mod, ONLY: mydebug=>debug , lunout, prt_level | ||
31 | IMPLICIT NONE | ||
32 | ! ====================================================================== | ||
33 | include "YOMCST.h" | ||
34 | |||
35 | ! Arguments | ||
36 | ! ---------- | ||
37 | ! Input | ||
38 | ! ---- | ||
39 | INTEGER, INTENT (IN) :: iflag_wake_tend | ||
40 | REAL, INTENT (IN) :: dtime | ||
41 | REAL, DIMENSION(klon, klev), INTENT (IN) :: pplay | ||
42 | REAL, DIMENSION(klon, klev+1), INTENT (IN) :: paprs | ||
43 | REAL, DIMENSION(klon, klev), INTENT (IN) :: t, q, omgb | ||
44 | REAL, DIMENSION(klon, klev), INTENT (IN) :: dt_dwn, dq_dwn | ||
45 | REAL, DIMENSION(klon, klev), INTENT (IN) :: m_up, m_dwn | ||
46 | REAL, DIMENSION(klon, klev), INTENT (IN) :: dt_a, dq_a | ||
47 | REAL, DIMENSION(klon), INTENT (IN) :: wgen | ||
48 | REAL, DIMENSION(klon), INTENT (IN) :: sigd | ||
49 | REAL, DIMENSION(klon), INTENT (IN) :: Cin | ||
50 | ! Input/Output | ||
51 | ! ------------ | ||
52 | REAL, DIMENSION(klon, klev), INTENT (INOUT) :: wake_deltat, wake_deltaq | ||
53 | REAL, DIMENSION(klon), INTENT (INOUT) :: wake_s | ||
54 | REAL, DIMENSION(klon), INTENT (INOUT) :: awake_dens, wake_dens | ||
55 | ! Output | ||
56 | ! ------ | ||
57 | REAL, DIMENSION(klon, klev), INTENT (OUT) :: dt_wake, dq_wake | ||
58 | !!jyg REAL, DIMENSION(klon), INTENT (OUT) :: wake_k | ||
59 | INTEGER, DIMENSION(klon), INTENT (OUT) :: wake_k | ||
60 | REAL, DIMENSION(klon, klev), INTENT (OUT) :: wake_d_deltat_gw | ||
61 | REAL, DIMENSION(klon), INTENT (OUT) :: wake_h | ||
62 | REAL, DIMENSION(klon, klev), INTENT (OUT) :: wake_dth | ||
63 | REAL, DIMENSION(klon), INTENT (OUT) :: wake_pe, wake_fip, wake_gfl | ||
64 | REAL, DIMENSION(klon, klev), INTENT (OUT) :: t_x, q_x | ||
65 | REAL, DIMENSION(klon, klev), INTENT (OUT) :: wake_omgbdth, wake_dp_omgb | ||
66 | REAL, DIMENSION(klon, klev), INTENT (OUT) :: wake_dtke, wake_dqke | ||
67 | REAL, DIMENSION(klon, klev), INTENT (OUT) :: wake_omg, wake_dp_deltomg | ||
68 | REAL, DIMENSION(klon, klev), INTENT (OUT) :: wake_spread | ||
69 | REAL, DIMENSION(klon), INTENT (OUT) :: wake_cstar | ||
70 | REAL, DIMENSION(klon, klev), INTENT (OUT) :: wake_ddeltat, wake_ddeltaq | ||
71 | REAL, DIMENSION(klon), INTENT (OUT) :: wake_ds, awake_ddens, wake_ddens | ||
72 | |||
73 | |||
74 | ! Variable internes | ||
75 | ! ----------------- | ||
76 | LOGICAL, SAVE :: first = .TRUE. | ||
77 | !$OMP THREADPRIVATE(first) | ||
78 | INTEGER :: i, l | ||
79 | 960 | INTEGER, DIMENSION(klon) :: znatsurf ! 0 if pctsrf(is_oce)>0.1; 1 else. | |
80 | REAL :: aire | ||
81 | 960 | REAL, DIMENSION(klon, klev) :: p, pi | |
82 | 960 | REAL, DIMENSION(klon, klev+1) :: ph | |
83 | 960 | REAL, DIMENSION(klon, klev) :: omgbe | |
84 | 960 | REAL, DIMENSION(klon, klev) :: te, qe | |
85 | 960 | REAL, DIMENSION(klon, klev) :: dtdwn, dqdwn | |
86 | 960 | REAL, DIMENSION(klon, klev) :: dta, dqa | |
87 | 960 | REAL, DIMENSION(klon, klev) :: amdwn, amup | |
88 | 960 | REAL, DIMENSION(klon, klev) :: dtw, dqw, dth | |
89 | 960 | REAL, DIMENSION(klon, klev) :: dtls, dqls | |
90 | 960 | REAL, DIMENSION(klon, klev) :: tx, qx | |
91 | 960 | REAL, DIMENSION(klon) :: hw, wape, fip, gfl | |
92 | 960 | REAL, DIMENSION(klon) :: sigmaw, awdens, wdens | |
93 | 960 | REAL, DIMENSION(klon, klev) :: omgbdth | |
94 | 960 | REAL, DIMENSION(klon, klev) :: dp_omgb | |
95 | 960 | REAL, DIMENSION(klon, klev) :: dtke, dqke | |
96 | 960 | REAL, DIMENSION(klon, klev) :: omg | |
97 | 960 | REAL, DIMENSION(klon, klev) :: dp_deltomg, spread | |
98 | 960 | REAL, DIMENSION(klon) :: cstar | |
99 | 960 | REAL, DIMENSION(klon) :: sigd0 | |
100 | 960 | INTEGER, DIMENSION(klon) :: ktopw | |
101 | 960 | REAL, DIMENSION(klon, klev) :: d_deltat_gw | |
102 | 960 | REAL, DIMENSION(klon, klev) :: d_deltatw, d_deltaqw | |
103 | 960 | REAL, DIMENSION(klon) :: d_sigmaw, d_awdens, d_wdens | |
104 | |||
105 | REAL :: rdcp | ||
106 | |||
107 | |||
108 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 480 times.
|
480 | IF (prt_level >= 10) THEN |
109 | ✗ | print *, '-> calwake, wake_s, wgen input ', wake_s(1), wgen(1) | |
110 | ENDIF | ||
111 | |||
112 | rdcp = 1./3.5 | ||
113 | |||
114 |
2/2✓ Branch 0 taken 477120 times.
✓ Branch 1 taken 480 times.
|
477600 | znatsurf(:) = 0 |
115 |
2/2✓ Branch 0 taken 477120 times.
✓ Branch 1 taken 480 times.
|
477600 | DO i = 1,klon |
116 |
2/2✓ Branch 0 taken 159645 times.
✓ Branch 1 taken 317475 times.
|
477600 | IF (pctsrf(i,is_oce) < 0.1) znatsurf(i) = 1 |
117 | ENDDO | ||
118 | |||
119 | |||
120 | ! ----------------------------------------------------------- | ||
121 | ! IM 290108 DO 999 i=1,klon ! a vectoriser | ||
122 | ! ---------------------------------------------------------- | ||
123 | |||
124 | |||
125 |
2/2✓ Branch 0 taken 18720 times.
✓ Branch 1 taken 480 times.
|
19200 | DO l = 1, klev |
126 |
2/2✓ Branch 0 taken 18607680 times.
✓ Branch 1 taken 18720 times.
|
18626880 | DO i = 1, klon |
127 | 18607680 | p(i, l) = pplay(i, l) | |
128 | 18607680 | ph(i, l) = paprs(i, l) | |
129 | 18607680 | pi(i, l) = (pplay(i,l)/100000.)**rdcp | |
130 | |||
131 | 18607680 | te(i, l) = t(i, l) | |
132 | 18607680 | qe(i, l) = q(i, l) | |
133 | 18607680 | omgbe(i, l) = omgb(i, l) | |
134 | |||
135 | 18607680 | dtdwn(i, l) = dt_dwn(i, l) | |
136 | 18607680 | dqdwn(i, l) = dq_dwn(i, l) | |
137 | 18607680 | dta(i, l) = dt_a(i, l) | |
138 | 18626400 | dqa(i, l) = dq_a(i, l) | |
139 | END DO | ||
140 | END DO | ||
141 | |||
142 | !---------------------------------------------------------------- | ||
143 | ! Initialize tendencies to zero | ||
144 | !---------------------------------------------------------------- | ||
145 |
4/4✓ Branch 0 taken 18720 times.
✓ Branch 1 taken 480 times.
✓ Branch 2 taken 18607680 times.
✓ Branch 3 taken 18720 times.
|
18626880 | dtls(:,:) = 0. |
146 |
4/4✓ Branch 0 taken 18720 times.
✓ Branch 1 taken 480 times.
✓ Branch 2 taken 18607680 times.
✓ Branch 3 taken 18720 times.
|
18626880 | dqls(:,:) = 0. |
147 |
4/4✓ Branch 0 taken 18720 times.
✓ Branch 1 taken 480 times.
✓ Branch 2 taken 18607680 times.
✓ Branch 3 taken 18720 times.
|
18626880 | d_deltat_gw(:,:) = 0. |
148 |
4/4✓ Branch 0 taken 18720 times.
✓ Branch 1 taken 480 times.
✓ Branch 2 taken 18607680 times.
✓ Branch 3 taken 18720 times.
|
18626880 | d_deltatw(:,:) = 0. |
149 |
4/4✓ Branch 0 taken 18720 times.
✓ Branch 1 taken 480 times.
✓ Branch 2 taken 18607680 times.
✓ Branch 3 taken 18720 times.
|
18626880 | d_deltaqw(:,:) = 0. |
150 |
2/2✓ Branch 0 taken 477120 times.
✓ Branch 1 taken 480 times.
|
477600 | d_sigmaw(:) = 0. |
151 |
2/2✓ Branch 0 taken 477120 times.
✓ Branch 1 taken 480 times.
|
477600 | d_awdens(:) = 0. |
152 |
2/2✓ Branch 0 taken 477120 times.
✓ Branch 1 taken 480 times.
|
477600 | d_wdens(:) = 0. |
153 | ! | ||
154 | |||
155 |
2/2✓ Branch 0 taken 477120 times.
✓ Branch 1 taken 480 times.
|
477600 | DO i = 1, klon |
156 | 477600 | sigd0(i) = sigd(i) | |
157 | END DO | ||
158 | ! print*, 'sigd0,sigd', sigd0, sigd(i) | ||
159 |
2/2✓ Branch 0 taken 477120 times.
✓ Branch 1 taken 480 times.
|
477600 | DO i = 1, klon |
160 | 477600 | ph(i, klev+1) = 0. | |
161 | END DO | ||
162 | |||
163 | !!jyg! DO i = 1, klon | ||
164 | !!jyg! ktopw(i) = NINT(wake_k(i)) | ||
165 | !!jyg! END DO | ||
166 | |||
167 |
2/2✓ Branch 0 taken 477120 times.
✓ Branch 1 taken 480 times.
|
477600 | DO i = 1, klon |
168 | 477600 | hw(i) = wake_h(i) | |
169 | END DO | ||
170 | ! | ||
171 | ! Make a copy of state variables | ||
172 |
2/2✓ Branch 0 taken 18720 times.
✓ Branch 1 taken 480 times.
|
19200 | DO l = 1, klev |
173 |
2/2✓ Branch 0 taken 18607680 times.
✓ Branch 1 taken 18720 times.
|
18626880 | DO i = 1, klon |
174 | 18607680 | dtw(i, l) = wake_deltat(i, l) | |
175 | 18626400 | dqw(i, l) = wake_deltaq(i, l) | |
176 | END DO | ||
177 | END DO | ||
178 | |||
179 |
2/2✓ Branch 0 taken 477120 times.
✓ Branch 1 taken 480 times.
|
477600 | DO i = 1, klon |
180 | 477600 | sigmaw(i) = wake_s(i) | |
181 | END DO | ||
182 | |||
183 |
2/2✓ Branch 0 taken 477120 times.
✓ Branch 1 taken 480 times.
|
477600 | DO i = 1, klon |
184 | 477120 | awdens(i) = max(0., awake_dens(i)) | |
185 | 477600 | wdens(i) = max(0., wake_dens(i)) | |
186 | END DO | ||
187 | |||
188 | ! fkc les flux de masses sont evalues aux niveaux et valent 0 a la surface | ||
189 | ! fkc on veut le flux de masse au milieu des couches | ||
190 | |||
191 |
2/2✓ Branch 0 taken 18240 times.
✓ Branch 1 taken 480 times.
|
18720 | DO l = 1, klev - 1 |
192 |
2/2✓ Branch 0 taken 18130560 times.
✓ Branch 1 taken 18240 times.
|
18149280 | DO i = 1, klon |
193 | 18130560 | amdwn(i, l) = 0.5*(m_dwn(i,l)+m_dwn(i,l+1)) | |
194 | 18148800 | amdwn(i, l) = (m_dwn(i,l+1)) | |
195 | END DO | ||
196 | END DO | ||
197 | |||
198 | ! au sommet le flux de masse est nul | ||
199 | |||
200 |
2/2✓ Branch 0 taken 477120 times.
✓ Branch 1 taken 480 times.
|
477600 | DO i = 1, klon |
201 | 477600 | amdwn(i, klev) = 0.5*m_dwn(i, klev) | |
202 | END DO | ||
203 | |||
204 |
2/2✓ Branch 0 taken 18720 times.
✓ Branch 1 taken 480 times.
|
19200 | DO l = 1, klev |
205 |
2/2✓ Branch 0 taken 18607680 times.
✓ Branch 1 taken 18720 times.
|
18626880 | DO i = 1, klon |
206 | 18626400 | amup(i, l) = m_up(i, l) | |
207 | END DO | ||
208 | END DO | ||
209 | |||
210 | CALL wake(znatsurf, p, ph, pi, dtime, & | ||
211 | te, qe, omgbe, & | ||
212 | dtdwn, dqdwn, amdwn, amup, dta, dqa, wgen, & | ||
213 | sigd0, Cin, & | ||
214 | dtw, dqw, sigmaw, awdens, wdens, & ! state variables | ||
215 | dth, hw, wape, fip, gfl, & | ||
216 | dtls, dqls, ktopw, omgbdth, dp_omgb, tx, qx, & | ||
217 | dtke, dqke, omg, dp_deltomg, spread, cstar, & | ||
218 | d_deltat_gw, & | ||
219 | 480 | d_deltatw, d_deltaqw, d_sigmaw, d_awdens, d_wdens) ! tendencies | |
220 | |||
221 | ! | ||
222 |
2/2✓ Branch 0 taken 18720 times.
✓ Branch 1 taken 480 times.
|
19200 | DO l = 1, klev |
223 |
2/2✓ Branch 0 taken 18607680 times.
✓ Branch 1 taken 18720 times.
|
18626880 | DO i = 1, klon |
224 |
2/2✓ Branch 0 taken 3220035 times.
✓ Branch 1 taken 15387645 times.
|
18626400 | IF (ktopw(i)>0) THEN |
225 | 3220035 | wake_d_deltat_gw(i, l) = d_deltat_gw(i, l) | |
226 | 3220035 | wake_omgbdth(i, l) = omgbdth(i, l) | |
227 | 3220035 | wake_dp_omgb(i, l) = dp_omgb(i, l) | |
228 | 3220035 | wake_dtke(i, l) = dtke(i, l) | |
229 | 3220035 | wake_dqke(i, l) = dqke(i, l) | |
230 | 3220035 | wake_omg(i, l) = omg(i, l) | |
231 | 3220035 | wake_dp_deltomg(i, l) = dp_deltomg(i, l) | |
232 | 3220035 | wake_spread(i, l) = spread(i, l) | |
233 | 3220035 | wake_dth(i, l) = dth(i, l) | |
234 | 3220035 | dt_wake(i, l) = dtls(i, l)*dtime ! derivative -> tendency | |
235 | 3220035 | dq_wake(i, l) = dqls(i, l)*dtime ! derivative -> tendency | |
236 | 3220035 | t_x(i, l) = tx(i, l) | |
237 | 3220035 | q_x(i, l) = qx(i, l) | |
238 | ELSE | ||
239 | 15387645 | wake_d_deltat_gw(i, l) = 0. | |
240 | 15387645 | wake_omgbdth(i, l) = 0. | |
241 | 15387645 | wake_dp_omgb(i, l) = 0. | |
242 | 15387645 | wake_dtke(i, l) = 0. | |
243 | 15387645 | wake_dqke(i, l) = 0. | |
244 | 15387645 | wake_omg(i, l) = 0. | |
245 | 15387645 | wake_dp_deltomg(i, l) = 0. | |
246 | 15387645 | wake_spread(i, l) = 0. | |
247 | 15387645 | wake_dth(i, l) = 0. | |
248 | 15387645 | dt_wake(i, l) = 0. | |
249 | 15387645 | dq_wake(i, l) = 0. | |
250 | 15387645 | t_x(i, l) = te(i, l) | |
251 | 15387645 | q_x(i, l) = qe(i, l) | |
252 | END IF | ||
253 | END DO | ||
254 | END DO | ||
255 | |||
256 |
2/2✓ Branch 0 taken 477120 times.
✓ Branch 1 taken 480 times.
|
477600 | DO i = 1, klon |
257 | 477120 | wake_h(i) = hw(i) | |
258 | 477120 | wake_pe(i) = wape(i) | |
259 | 477120 | wake_fip(i) = fip(i) | |
260 | 477120 | wake_gfl(i) = gfl(i) | |
261 | 477120 | wake_k(i) = ktopw(i) | |
262 | 477600 | wake_cstar(i) = cstar(i) | |
263 | END DO | ||
264 | |||
265 | ! Tendencies of state variables | ||
266 |
2/2✓ Branch 0 taken 18720 times.
✓ Branch 1 taken 480 times.
|
19200 | DO l = 1, klev |
267 |
2/2✓ Branch 0 taken 18607680 times.
✓ Branch 1 taken 18720 times.
|
18626880 | DO i = 1, klon |
268 |
2/2✓ Branch 0 taken 3220035 times.
✓ Branch 1 taken 15387645 times.
|
18626400 | IF (ktopw(i)>0) THEN |
269 | 3220035 | wake_ddeltat(i, l) = d_deltatw(i, l)*dtime | |
270 | 3220035 | wake_ddeltaq(i, l) = d_deltaqw(i, l)*dtime | |
271 | ELSE | ||
272 | 15387645 | wake_ddeltat(i, l) = -wake_deltat(i, l) | |
273 | 15387645 | wake_ddeltaq(i, l) = -wake_deltaq(i, l) | |
274 | END IF | ||
275 | END DO | ||
276 | END DO | ||
277 |
2/2✓ Branch 0 taken 477120 times.
✓ Branch 1 taken 480 times.
|
477600 | DO i = 1, klon |
278 |
2/2✓ Branch 0 taken 82565 times.
✓ Branch 1 taken 394555 times.
|
477600 | IF (ktopw(i)>0) THEN |
279 | 82565 | wake_ds(i) = d_sigmaw(i)*dtime | |
280 | 82565 | awake_ddens(i) = d_awdens(i)*dtime | |
281 | 82565 | wake_ddens(i) = d_wdens(i)*dtime | |
282 | ELSE | ||
283 | 394555 | wake_ds(i) = -wake_s(i) | |
284 | 394555 | wake_ddens(i)= -wake_dens(i) | |
285 | END IF | ||
286 | END DO | ||
287 | ! | ||
288 | |||
289 | !jyg< | ||
290 |
1/2✓ Branch 0 taken 480 times.
✗ Branch 1 not taken.
|
480 | IF (iflag_wake_tend .EQ. 0) THEN |
291 | ! Update State variables | ||
292 |
2/2✓ Branch 0 taken 18720 times.
✓ Branch 1 taken 480 times.
|
19200 | DO l = 1, klev |
293 |
2/2✓ Branch 0 taken 18607680 times.
✓ Branch 1 taken 18720 times.
|
18626880 | DO i = 1, klon |
294 |
2/2✓ Branch 0 taken 3220035 times.
✓ Branch 1 taken 15387645 times.
|
18626400 | IF (ktopw(i)>0) THEN |
295 | 3220035 | wake_deltat(i, l) = dtw(i, l) | |
296 | 3220035 | wake_deltaq(i, l) = dqw(i, l) | |
297 | ELSE | ||
298 | 15387645 | wake_deltat(i, l) = 0. | |
299 | 15387645 | wake_deltaq(i, l) = 0. | |
300 | END IF | ||
301 | END DO | ||
302 | END DO | ||
303 |
2/2✓ Branch 0 taken 477120 times.
✓ Branch 1 taken 480 times.
|
477600 | DO i = 1, klon |
304 | 477120 | wake_s(i) = sigmaw(i) | |
305 | 477120 | awake_dens(i) = awdens(i) | |
306 | 477600 | wake_dens(i) = wdens(i) | |
307 | END DO | ||
308 | ENDIF ! (iflag_wake_tend .EQ. 0) | ||
309 | ! | ||
310 |
2/2✓ Branch 0 taken 1 times.
✓ Branch 1 taken 479 times.
|
480 | IF (first) THEN |
311 |
2/2✓ Branch 0 taken 994 times.
✓ Branch 1 taken 1 times.
|
995 | DO i = 1,klon |
312 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 994 times.
|
995 | IF (wake_dens(i) < -1.) THEN |
313 | ✗ | wake_dens(i) = wdens(i) | |
314 | ENDIF | ||
315 | ENDDO | ||
316 | 1 | first=.false. | |
317 | ENDIF ! (first) | ||
318 | !>jyg | ||
319 | |||
320 | 480 | RETURN | |
321 | END SUBROUTINE calwake | ||
322 | |||
323 |