GCC Code Coverage Report


Directory: ./
File: phys/cv3_routines.f90
Date: 2022-01-11 19:19:34
Exec Total Coverage
Lines: 1070 1721 62.2%
Branches: 921 1656 55.6%

Line Branch Exec Source
1
2 ! $Id: cv3_routines.F90 3670 2020-04-27 08:49:09Z jyg $
3
4
5
6
7 480 SUBROUTINE cv3_param(nd, k_upper, delt)
8
9 USE ioipsl_getin_p_mod, ONLY : getin_p
10 use mod_phys_lmdz_para
11 IMPLICIT NONE
12
13 !------------------------------------------------------------
14 !Set parameters for convectL for iflag_con = 3
15 !------------------------------------------------------------
16
17
18 !*** PBCRIT IS THE CRITICAL CLOUD DEPTH (MB) BENEATH WHICH THE ***
19 !*** PRECIPITATION EFFICIENCY IS ASSUMED TO BE ZERO ***
20 !*** PTCRIT IS THE CLOUD DEPTH (MB) ABOVE WHICH THE PRECIP. ***
21 !*** EFFICIENCY IS ASSUMED TO BE UNITY ***
22 !*** SIGD IS THE FRACTIONAL AREA COVERED BY UNSATURATED DNDRAFT ***
23 !*** SPFAC IS THE FRACTION OF PRECIPITATION FALLING OUTSIDE ***
24 !*** OF CLOUD ***
25
26 ![TAU: CHARACTERISTIC TIMESCALE USED TO COMPUTE ALPHA & BETA]
27 !*** ALPHA AND BETA ARE PARAMETERS THAT CONTROL THE RATE OF ***
28 !*** APPROACH TO QUASI-EQUILIBRIUM ***
29 !*** (THEIR STANDARD VALUES ARE 1.0 AND 0.96, RESPECTIVELY) ***
30 !*** (BETA MUST BE LESS THAN OR EQUAL TO 1) ***
31
32 !*** DTCRIT IS THE CRITICAL BUOYANCY (K) USED TO ADJUST THE ***
33 !*** APPROACH TO QUASI-EQUILIBRIUM ***
34 !*** IT MUST BE LESS THAN 0 ***
35
36 include "cv3param.h"
37 include "cvflag.h"
38 include "conema3.h"
39
40 INTEGER, INTENT(IN) :: nd
41 INTEGER, INTENT(IN) :: k_upper
42 REAL, INTENT(IN) :: delt ! timestep (seconds)
43
44 ! Local variables
45 CHARACTER (LEN=20) :: modname = 'cv3_param'
46 CHARACTER (LEN=80) :: abort_message
47
48 LOGICAL, SAVE :: first = .TRUE.
49 !$OMP THREADPRIVATE(first)
50
51 !glb noff: integer limit for convection (nd-noff)
52 ! minorig: First level of convection
53
54 ! -- limit levels for convection:
55
56 !jyg<
57 ! noff is chosen such that nl = k_upper so that upmost loops end at about 22 km
58 !
59 240 noff = min(max(nd-k_upper, 1), (nd+1)/2)
60 !! noff = 1
61 !>jyg
62 240 minorig = 1
63 240 nl = nd - noff
64 240 nlp = nl + 1
65 240 nlm = nl - 1
66
67
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 239 times.
240 IF (first) THEN
68 ! -- "microphysical" parameters:
69 ! IM beg: ajout fis. reglage ep
70 ! CR+JYG: shedding coefficient (used when iflag_mix_adiab=1)
71 ! IM lu dans physiq.def via conf_phys.F90 epmax = 0.993
72
73 1 omtrain = 45.0 ! used also for snow (no disctinction rain/snow)
74 ! -- misc:
75 1 dtovsh = -0.2 ! dT for overshoot
76 ! cc dttrig = 5. ! (loose) condition for triggering
77 1 dttrig = 10. ! (loose) condition for triggering
78 1 dtcrit = -2.0
79 ! -- end of convection
80 ! -- interface cloud parameterization:
81 1 delta = 0.01 ! cld
82 ! -- interface with boundary-layer (gust factor): (sb)
83 1 betad = 10.0 ! original value (from convect 4.3)
84
85 ! Var interm pour le getin
86 1 cv_flag_feed=1
87 1 CALL getin_p('cv_flag_feed',cv_flag_feed)
88 1 T_top_max = 1000.
89 1 CALL getin_p('t_top_max',T_top_max)
90 1 dpbase=-40.
91 1 CALL getin_p('dpbase',dpbase)
92 1 pbcrit=150.0
93 1 CALL getin_p('pbcrit',pbcrit)
94 1 ptcrit=500.0
95 1 CALL getin_p('ptcrit',ptcrit)
96 1 sigdz=0.01
97 1 CALL getin_p('sigdz',sigdz)
98 1 spfac=0.15
99 1 CALL getin_p('spfac',spfac)
100 1 tau=8000.
101 1 CALL getin_p('tau',tau)
102 1 flag_wb=1
103 1 CALL getin_p('flag_wb',flag_wb)
104 1 wbmax=6.
105 1 CALL getin_p('wbmax',wbmax)
106 1 ok_convstop=.False.
107 1 CALL getin_p('ok_convstop',ok_convstop)
108 1 tau_stop=15000.
109 1 CALL getin_p('tau_stop',tau_stop)
110 1 ok_intermittent=.False.
111 1 CALL getin_p('ok_intermittent',ok_intermittent)
112 1 ok_optim_yield=.False.
113 1 CALL getin_p('ok_optim_yield',ok_optim_yield)
114 1 ok_homo_tend=.TRUE.
115 1 CALL getin_p('ok_homo_tend',ok_homo_tend)
116 1 ok_entrain=.TRUE.
117 1 CALL getin_p('ok_entrain',ok_entrain)
118
119 1 coef_peel=0.25
120 1 CALL getin_p('coef_peel',coef_peel)
121
122 1 flag_epKEorig=1
123 1 CALL getin_p('flag_epKEorig',flag_epKEorig)
124 1 elcrit=0.0003
125 1 CALL getin_p('elcrit',elcrit)
126 1 tlcrit=-55.0
127 1 CALL getin_p('tlcrit',tlcrit)
128 1 ejectliq=0.
129 1 CALL getin_p('ejectliq',ejectliq)
130 1 ejectice=0.
131 1 CALL getin_p('ejectice',ejectice)
132 1 cvflag_prec_eject = .FALSE.
133 1 CALL getin_p('cvflag_prec_eject',cvflag_prec_eject)
134 1 qsat_depends_on_qt = .FALSE.
135 1 CALL getin_p('qsat_depends_on_qt',qsat_depends_on_qt)
136 1 adiab_ascent_mass_flux_depends_on_ejectliq = .FALSE.
137 1 CALL getin_p('adiab_ascent_mass_flux_depends_on_ejectliq',adiab_ascent_mass_flux_depends_on_ejectliq)
138 1 keepbug_ice_frac = .TRUE.
139 1 CALL getin_p('keepbug_ice_frac', keepbug_ice_frac)
140
141 1 WRITE (*, *) 't_top_max=', t_top_max
142 1 WRITE (*, *) 'dpbase=', dpbase
143 1 WRITE (*, *) 'pbcrit=', pbcrit
144 1 WRITE (*, *) 'ptcrit=', ptcrit
145 1 WRITE (*, *) 'sigdz=', sigdz
146 1 WRITE (*, *) 'spfac=', spfac
147 1 WRITE (*, *) 'tau=', tau
148 1 WRITE (*, *) 'flag_wb=', flag_wb
149 1 WRITE (*, *) 'wbmax=', wbmax
150 1 WRITE (*, *) 'ok_convstop=', ok_convstop
151 1 WRITE (*, *) 'tau_stop=', tau_stop
152 1 WRITE (*, *) 'ok_intermittent=', ok_intermittent
153 1 WRITE (*, *) 'ok_optim_yield =', ok_optim_yield
154 1 WRITE (*, *) 'coef_peel=', coef_peel
155
156 1 WRITE (*, *) 'flag_epKEorig=', flag_epKEorig
157 1 WRITE (*, *) 'elcrit=', elcrit
158 1 WRITE (*, *) 'tlcrit=', tlcrit
159 1 WRITE (*, *) 'ejectliq=', ejectliq
160 1 WRITE (*, *) 'ejectice=', ejectice
161 1 WRITE (*, *) 'cvflag_prec_eject =', cvflag_prec_eject
162 1 WRITE (*, *) 'qsat_depends_on_qt =', qsat_depends_on_qt
163 1 WRITE (*, *) 'adiab_ascent_mass_flux_depends_on_ejectliq =', adiab_ascent_mass_flux_depends_on_ejectliq
164 1 WRITE (*, *) 'keepbug_ice_frac =', keepbug_ice_frac
165
166 1 first = .FALSE.
167 END IF ! (first)
168
169 240 beta = 1.0 - delt/tau
170 alpha1 = 1.5E-3
171 !JYG Correction bug alpha
172 240 alpha1 = alpha1*1.5
173 240 alpha = alpha1*delt/tau
174 !JYG Bug
175 ! cc increase alpha to compensate W decrease:
176 ! c alpha = alpha*1.5
177
178 240 noconv_stop = max(2.,tau_stop/delt)
179
180 240 RETURN
181 END SUBROUTINE cv3_param
182
183 240 SUBROUTINE cv3_incrcount(len, nd, delt, sig)
184
185 IMPLICIT NONE
186
187 ! =====================================================================
188 ! Increment the counter sig(nd)
189 ! =====================================================================
190
191 include "cv3param.h"
192 include "cvflag.h"
193
194 !inputs:
195 INTEGER, INTENT(IN) :: len
196 INTEGER, INTENT(IN) :: nd
197 REAL, INTENT(IN) :: delt ! timestep (seconds)
198
199 !input/output
200 REAL, DIMENSION(len,nd), INTENT(INOUT) :: sig
201
202 !local variables
203 INTEGER il
204
205 ! print *,'cv3_incrcount : noconv_stop ',noconv_stop
206 ! print *,'cv3_incrcount in, sig(1,nd) ',sig(1,nd)
207
1/2
✓ Branch 0 taken 240 times.
✗ Branch 1 not taken.
240 IF(ok_convstop) THEN
208 DO il = 1, len
209 sig(il, nd) = sig(il, nd) + 1.
210 sig(il, nd) = min(sig(il,nd), noconv_stop+0.1)
211 END DO
212 ELSE
213
2/2
✓ Branch 0 taken 240 times.
✓ Branch 1 taken 238560 times.
238800 DO il = 1, len
214 238560 sig(il, nd) = sig(il, nd) + 1.
215 238800 sig(il, nd) = min(sig(il,nd), 12.1)
216 END DO
217 ENDIF ! (ok_convstop)
218 ! print *,'cv3_incrcount out, sig(1,nd) ',sig(1,nd)
219
220 240 RETURN
221 END SUBROUTINE cv3_incrcount
222
223 25764960 SUBROUTINE cv3_prelim(len, nd, ndp1, t, q, p, ph, &
224 480 lv, lf, cpn, tv, gz, h, hm, th)
225 IMPLICIT NONE
226
227 ! =====================================================================
228 ! --- CALCULATE ARRAYS OF GEOPOTENTIAL, HEAT CAPACITY & STATIC ENERGY
229 ! "ori": from convect4.3 (vectorized)
230 ! "convect3": to be exactly consistent with convect3
231 ! =====================================================================
232
233 ! inputs:
234 INTEGER len, nd, ndp1
235 REAL t(len, nd), q(len, nd), p(len, nd), ph(len, ndp1)
236
237 ! outputs:
238 REAL lv(len, nd), lf(len, nd), cpn(len, nd), tv(len, nd)
239 REAL gz(len, nd), h(len, nd), hm(len, nd)
240 REAL th(len, nd)
241
242 ! local variables:
243 INTEGER k, i
244 REAL rdcp
245 REAL tvx, tvy ! convect3
246 960 REAL cpx(len, nd)
247
248 include "cvthermo.h"
249 include "cv3param.h"
250
251
252 ! ori do 110 k=1,nlp
253 ! abderr do 110 k=1,nl ! convect3
254
2/2
✓ Branch 0 taken 13440 times.
✓ Branch 1 taken 480 times.
13920 DO k = 1, nlp
255
256
2/2
✓ Branch 0 taken 13359360 times.
✓ Branch 1 taken 13440 times.
13373280 DO i = 1, len
257 ! debug lv(i,k)= lv0-clmcpv*(t(i,k)-t0)
258 13359360 lv(i, k) = lv0 - clmcpv*(t(i,k)-273.15)
259 !! lf(i, k) = lf0 - clmci*(t(i,k)-273.15) ! erreur de signe !!
260 13359360 lf(i, k) = lf0 + clmci*(t(i,k)-273.15)
261 13359360 cpn(i, k) = cpd*(1.0-q(i,k)) + cpv*q(i, k)
262 13359360 cpx(i, k) = cpd*(1.0-q(i,k)) + cl*q(i, k)
263 ! ori tv(i,k)=t(i,k)*(1.0+q(i,k)*epsim1)
264 13359360 tv(i, k) = t(i, k)*(1.0+q(i,k)/eps-q(i,k))
265 13359360 rdcp = (rrd*(1.-q(i,k))+q(i,k)*rrv)/cpn(i, k)
266 13372800 th(i, k) = t(i, k)*(1000.0/p(i,k))**rdcp
267 END DO
268 END DO
269
270 ! gz = phi at the full levels (same as p).
271
272 !! DO i = 1, len !jyg
273 !! gz(i, 1) = 0.0 !jyg
274 !! END DO !jyg
275
4/4
✓ Branch 0 taken 18720 times.
✓ Branch 1 taken 480 times.
✓ Branch 2 taken 18607680 times.
✓ Branch 3 taken 18720 times.
18626880 gz(:,:) = 0. !jyg: initialization of the whole array
276 ! ori do 140 k=2,nlp
277
2/2
✓ Branch 0 taken 12480 times.
✓ Branch 1 taken 480 times.
12960 DO k = 2, nl ! convect3
278
2/2
✓ Branch 0 taken 12405120 times.
✓ Branch 1 taken 12480 times.
12418080 DO i = 1, len
279 12405120 tvx = t(i, k)*(1.+q(i,k)/eps-q(i,k)) !convect3
280 12405120 tvy = t(i, k-1)*(1.+q(i,k-1)/eps-q(i,k-1)) !convect3
281 gz(i, k) = gz(i, k-1) + 0.5*rrd*(tvx+tvy)* & !convect3
282 12417600 (p(i,k-1)-p(i,k))/ph(i, k) !convect3
283
284 ! c print *,' gz(',k,')',gz(i,k),' tvx',tvx,' tvy ',tvy
285
286 ! ori gz(i,k)=gz(i,k-1)+hrd*(tv(i,k-1)+tv(i,k))
287 ! ori & *(p(i,k-1)-p(i,k))/ph(i,k)
288 END DO
289 END DO
290
291 ! h = phi + cpT (dry static energy).
292 ! hm = phi + cp(T-Tbase)+Lq
293
294 ! ori do 170 k=1,nlp
295
2/2
✓ Branch 0 taken 12960 times.
✓ Branch 1 taken 480 times.
13440 DO k = 1, nl ! convect3
296
2/2
✓ Branch 0 taken 12882240 times.
✓ Branch 1 taken 12960 times.
12895680 DO i = 1, len
297 12882240 h(i, k) = gz(i, k) + cpn(i, k)*t(i, k)
298 12895200 hm(i, k) = gz(i, k) + cpx(i, k)*(t(i,k)-t(i,1)) + lv(i, k)*q(i, k)
299 END DO
300 END DO
301
302 480 RETURN
303 END SUBROUTINE cv3_prelim
304
305 240 SUBROUTINE cv3_feed(len, nd, ok_conserv_q, &
306 240 t, q, u, v, p, ph, h, gz, &
307 p1feed, p2feed, wght, &
308 wghti, tnk, thnk, qnk, qsnk, unk, vnk, &
309 240 cpnk, hnk, nk, icb, icbmax, iflag, gznk, plcl)
310
311 USE mod_phys_lmdz_transfert_para, ONLY : bcast
312 USE add_phys_tend_mod, ONLY: fl_cor_ebil
313 USE print_control_mod, ONLY: prt_level
314 IMPLICIT NONE
315
316 ! ================================================================
317 ! Purpose: CONVECTIVE FEED
318
319 ! Main differences with cv_feed:
320 ! - ph added in input
321 ! - here, nk(i)=minorig
322 ! - icb defined differently (plcl compared with ph instead of p)
323 ! - dry static energy as argument instead of moist static energy
324
325 ! Main differences with convect3:
326 ! - we do not compute dplcldt and dplcldr of CLIFT anymore
327 ! - values iflag different (but tests identical)
328 ! - A,B explicitely defined (!...)
329 ! ================================================================
330
331 include "cv3param.h"
332 include "cvthermo.h"
333
334 !inputs:
335 INTEGER, INTENT (IN) :: len, nd
336 LOGICAL, INTENT (IN) :: ok_conserv_q
337 REAL, DIMENSION (len, nd), INTENT (IN) :: t, q, p
338 REAL, DIMENSION (len, nd), INTENT (IN) :: u, v
339 REAL, DIMENSION (len, nd), INTENT (IN) :: h, gz
340 REAL, DIMENSION (len, nd+1), INTENT (IN) :: ph
341 REAL, DIMENSION (len), INTENT (IN) :: p1feed
342 REAL, DIMENSION (nd), INTENT (IN) :: wght
343 !input-output
344 REAL, DIMENSION (len), INTENT (INOUT) :: p2feed
345 !outputs:
346 INTEGER, INTENT (OUT) :: icbmax
347 INTEGER, DIMENSION (len), INTENT (OUT) :: iflag, nk, icb
348 REAL, DIMENSION (len, nd), INTENT (OUT) :: wghti
349 REAL, DIMENSION (len), INTENT (OUT) :: tnk, thnk, qnk, qsnk
350 REAL, DIMENSION (len), INTENT (OUT) :: unk, vnk
351 REAL, DIMENSION (len), INTENT (OUT) :: cpnk, hnk, gznk
352 REAL, DIMENSION (len), INTENT (OUT) :: plcl
353
354 !local variables:
355 INTEGER i, k, iter, niter
356 INTEGER ihmin(len)
357 REAL work(len)
358 480 REAL pup(len), plo(len), pfeed(len)
359 480 REAL plclup(len), plcllo(len), plclfeed(len)
360 480 REAL pfeedmin(len)
361 480 REAL posit(len)
362 480 LOGICAL nocond(len)
363
364 !jyg20140217<
365 INTEGER iostat
366 LOGICAL, SAVE :: first
367 LOGICAL, SAVE :: ok_new_feed
368 REAL, SAVE :: dp_lcl_feed
369 !$OMP THREADPRIVATE (first,ok_new_feed,dp_lcl_feed)
370 DATA first/.TRUE./
371 DATA dp_lcl_feed/2./
372
373
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 239 times.
240 IF (first) THEN
374 !$OMP MASTER
375 1 ok_new_feed = ok_conserv_q
376 1 OPEN (98, FILE='cv3feed_param.data', STATUS='old', FORM='formatted', IOSTAT=iostat)
377
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 IF (iostat==0) THEN
378 READ (98, *, END=998) ok_new_feed
379 998 CONTINUE
380 CLOSE (98)
381 END IF
382 1 PRINT *, ' ok_new_feed: ', ok_new_feed
383 !$OMP END MASTER
384 1 call bcast(ok_new_feed)
385 1 first = .FALSE.
386 END IF
387 !jyg>
388 ! -------------------------------------------------------------------
389 ! --- Origin level of ascending parcels for convect3:
390 ! -------------------------------------------------------------------
391
392
2/2
✓ Branch 0 taken 238560 times.
✓ Branch 1 taken 240 times.
238800 DO i = 1, len
393 238560 nk(i) = minorig
394 238800 gznk(i) = gz(i, nk(i))
395 END DO
396
397 ! -------------------------------------------------------------------
398 ! --- Adjust feeding layer thickness so that lifting up to the top of
399 ! --- the feeding layer does not induce condensation (i.e. so that
400 ! --- plcl < p2feed).
401 ! --- Method : iterative secant method.
402 ! -------------------------------------------------------------------
403
404 ! 1- First bracketing of the solution : ph(nk+1), p2feed
405
406 ! 1.a- LCL associated with p2feed
407
2/2
✓ Branch 0 taken 238560 times.
✓ Branch 1 taken 240 times.
238800 DO i = 1, len
408 238800 pup(i) = p2feed(i)
409 END DO
410
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 240 times.
240 IF (fl_cor_ebil >=2 ) THEN
411 CALL cv3_estatmix(len, nd, iflag, p1feed, pup, p, ph, &
412 t, q, u, v, h, gz, wght, &
413 wghti, nk, tnk, thnk, qnk, qsnk, unk, vnk, plclup)
414 ELSE
415 CALL cv3_enthalpmix(len, nd, iflag, p1feed, pup, p, ph, &
416 t, q, u, v, wght, &
417 240 wghti, nk, tnk, thnk, qnk, qsnk, unk, vnk, plclup)
418 ENDIF ! (fl_cor_ebil >=2 )
419 ! 1.b- LCL associated with ph(nk+1)
420
2/2
✓ Branch 0 taken 238560 times.
✓ Branch 1 taken 240 times.
238800 DO i = 1, len
421 238800 plo(i) = ph(i, nk(i)+1)
422 END DO
423
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 240 times.
240 IF (fl_cor_ebil >=2 ) THEN
424 CALL cv3_estatmix(len, nd, iflag, p1feed, plo, p, ph, &
425 t, q, u, v, h, gz, wght, &
426 wghti, nk, tnk, thnk, qnk, qsnk, unk, vnk, plcllo)
427 ELSE
428 CALL cv3_enthalpmix(len, nd, iflag, p1feed, plo, p, ph, &
429 t, q, u, v, wght, &
430 240 wghti, nk, tnk, thnk, qnk, qsnk, unk, vnk, plcllo)
431 ENDIF ! (fl_cor_ebil >=2 )
432 ! 2- Iterations
433 niter = 5
434
2/2
✓ Branch 0 taken 1200 times.
✓ Branch 1 taken 240 times.
1440 DO iter = 1, niter
435
2/2
✓ Branch 0 taken 1192800 times.
✓ Branch 1 taken 1200 times.
1194000 DO i = 1, len
436 1192800 plcllo(i) = min(plo(i), plcllo(i))
437 1192800 plclup(i) = max(pup(i), plclup(i))
438 1194000 nocond(i) = plclup(i) <= pup(i)
439 END DO
440
2/2
✓ Branch 0 taken 1192800 times.
✓ Branch 1 taken 1200 times.
1194000 DO i = 1, len
441
2/2
✓ Branch 0 taken 869425 times.
✓ Branch 1 taken 323375 times.
1194000 IF (nocond(i)) THEN
442 869425 pfeed(i) = pup(i)
443 ELSE
444 !JYG20140217<
445
1/2
✓ Branch 0 taken 323375 times.
✗ Branch 1 not taken.
323375 IF (ok_new_feed) THEN
446 pfeed(i) = (pup(i)*(plo(i)-plcllo(i)-dp_lcl_feed)+ &
447 plo(i)*(plclup(i)-pup(i)+dp_lcl_feed))/ &
448 323375 (plo(i)-plcllo(i)+plclup(i)-pup(i))
449 ELSE
450 pfeed(i) = (pup(i)*(plo(i)-plcllo(i))+ &
451 plo(i)*(plclup(i)-pup(i)))/ &
452 (plo(i)-plcllo(i)+plclup(i)-pup(i))
453 END IF
454 !JYG>
455 END IF
456 END DO
457 !jyg20140217<
458 ! For the last iteration, make sure that the top of the feeding layer
459 ! and LCL are not in the same layer:
460
1/2
✓ Branch 0 taken 1200 times.
✗ Branch 1 not taken.
1200 IF (ok_new_feed) THEN
461
2/2
✓ Branch 0 taken 240 times.
✓ Branch 1 taken 960 times.
1200 IF (iter==niter) THEN
462
2/2
✓ Branch 0 taken 238560 times.
✓ Branch 1 taken 240 times.
238800 DO i = 1,len !jyg
463 238800 pfeedmin(i) = ph(i,minorig+1) !jyg
464 ENDDO !jyg
465
2/2
✓ Branch 0 taken 6240 times.
✓ Branch 1 taken 240 times.
6480 DO k = minorig+1, nl !jyg
466 !! DO k = minorig, nl !jyg
467
2/2
✓ Branch 0 taken 6202560 times.
✓ Branch 1 taken 6240 times.
6209040 DO i = 1, len
468
2/2
✓ Branch 0 taken 711123 times.
✓ Branch 1 taken 5491437 times.
6208800 IF (ph(i,k)>=plclfeed(i)) pfeedmin(i) = ph(i, k)
469 END DO
470 END DO
471
2/2
✓ Branch 0 taken 238560 times.
✓ Branch 1 taken 240 times.
238800 DO i = 1, len
472 238800 pfeed(i) = max(pfeedmin(i), pfeed(i))
473 END DO
474 END IF
475 END IF
476 !jyg>
477
478
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1200 times.
1200 IF (fl_cor_ebil >=2 ) THEN
479 CALL cv3_estatmix(len, nd, iflag, p1feed, pfeed, p, ph, &
480 t, q, u, v, h, gz, wght, &
481 wghti, nk, tnk, thnk, qnk, qsnk, unk, vnk, plclfeed)
482 ELSE
483 CALL cv3_enthalpmix(len, nd, iflag, p1feed, pfeed, p, ph, &
484 t, q, u, v, wght, &
485 1200 wghti, nk, tnk, thnk, qnk, qsnk, unk, vnk, plclfeed)
486 ENDIF ! (fl_cor_ebil >=2 )
487 !jyg20140217<
488
1/2
✓ Branch 0 taken 1200 times.
✗ Branch 1 not taken.
1200 IF (ok_new_feed) THEN
489
2/2
✓ Branch 0 taken 1200 times.
✓ Branch 1 taken 1192800 times.
1194000 DO i = 1, len
490 1192800 posit(i) = (sign(1.,plclfeed(i)-pfeed(i)+dp_lcl_feed)+1.)*0.5
491
2/2
✓ Branch 0 taken 258 times.
✓ Branch 1 taken 1192542 times.
1194000 IF (plclfeed(i)-pfeed(i)+dp_lcl_feed==0.) posit(i) = 1.
492 END DO
493 ELSE
494 DO i = 1, len
495 posit(i) = (sign(1.,plclfeed(i)-pfeed(i))+1.)*0.5
496 IF (plclfeed(i)==pfeed(i)) posit(i) = 1.
497 END DO
498 END IF
499 !jyg>
500
2/2
✓ Branch 0 taken 1192800 times.
✓ Branch 1 taken 1200 times.
1194240 DO i = 1, len
501 ! - posit = 1 when lcl is below top of feeding layer (plclfeed>pfeed)
502 ! - => pup=pfeed
503 ! - posit = 0 when lcl is above top of feeding layer (plclfeed<pfeed)
504 ! - => plo=pfeed
505 1192800 pup(i) = posit(i)*pfeed(i) + (1.-posit(i))*pup(i)
506 1192800 plo(i) = (1.-posit(i))*pfeed(i) + posit(i)*plo(i)
507 1192800 plclup(i) = posit(i)*plclfeed(i) + (1.-posit(i))*plclup(i)
508 1194000 plcllo(i) = (1.-posit(i))*plclfeed(i) + posit(i)*plcllo(i)
509 END DO
510 END DO ! iter
511
512
2/2
✓ Branch 0 taken 238560 times.
✓ Branch 1 taken 240 times.
238800 DO i = 1, len
513 238560 p2feed(i) = pfeed(i)
514 238800 plcl(i) = plclfeed(i)
515 END DO
516
517
2/2
✓ Branch 0 taken 238560 times.
✓ Branch 1 taken 240 times.
238800 DO i = 1, len
518 238560 cpnk(i) = cpd*(1.0-qnk(i)) + cpv*qnk(i)
519 238800 hnk(i) = gz(i, 1) + cpnk(i)*tnk(i)
520 END DO
521
522 ! -------------------------------------------------------------------
523 ! --- Check whether parcel level temperature and specific humidity
524 ! --- are reasonable
525 ! -------------------------------------------------------------------
526
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 240 times.
240 IF (cv_flag_feed == 1) THEN
527 DO i = 1, len
528 IF (((tnk(i)<250.0) .OR. &
529 (qnk(i)<=0.0)) .AND. &
530 (iflag(i)==0)) iflag(i) = 7
531 END DO
532
1/2
✓ Branch 0 taken 240 times.
✗ Branch 1 not taken.
240 ELSEIF (cv_flag_feed >= 2) THEN
533 ! --- and demand that LCL be high enough
534
2/2
✓ Branch 0 taken 240 times.
✓ Branch 1 taken 238560 times.
238800 DO i = 1, len
535 IF (((tnk(i)<250.0) .OR. &
536 (qnk(i)<=0.0) .OR. &
537
6/8
✓ Branch 0 taken 224671 times.
✓ Branch 1 taken 13889 times.
✓ Branch 2 taken 224671 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 68244 times.
✓ Branch 5 taken 156427 times.
✓ Branch 6 taken 82133 times.
✗ Branch 7 not taken.
238560 (plcl(i)>min(0.99*ph(i,1),ph(i,3)))) .AND. &
538 82373 (iflag(i)==0)) iflag(i) = 7
539 END DO
540 ENDIF
541
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 240 times.
240 IF (prt_level .GE. 10) THEN
542 print *,'cv3_feed : iflag(1), pfeed(1), plcl(1), wghti(1,k) ', &
543 iflag(1), pfeed(1), plcl(1), (wghti(1,k),k=1,10)
544 ENDIF
545
546 ! -------------------------------------------------------------------
547 ! --- Calculate first level above lcl (=icb)
548 ! -------------------------------------------------------------------
549
550 !@ do 270 i=1,len
551 !@ icb(i)=nlm
552 !@ 270 continue
553 !@c
554 !@ do 290 k=minorig,nl
555 !@ do 280 i=1,len
556 !@ if((k.ge.(nk(i)+1)).and.(p(i,k).lt.plcl(i)))
557 !@ & icb(i)=min(icb(i),k)
558 !@ 280 continue
559 !@ 290 continue
560 !@c
561 !@ do 300 i=1,len
562 !@ if((icb(i).ge.nlm).and.(iflag(i).eq.0))iflag(i)=9
563 !@ 300 continue
564
565
2/2
✓ Branch 0 taken 238560 times.
✓ Branch 1 taken 240 times.
238800 DO i = 1, len
566 238800 icb(i) = nlm
567 END DO
568
569 ! la modification consiste a comparer plcl a ph et non a p:
570 ! icb est defini par : ph(icb)<plcl<ph(icb-1)
571 !@ do 290 k=minorig,nl
572
2/2
✓ Branch 0 taken 5760 times.
✓ Branch 1 taken 240 times.
6000 DO k = 3, nl - 1 ! modif pour que icb soit sup/egal a 2
573
2/2
✓ Branch 0 taken 5725440 times.
✓ Branch 1 taken 5760 times.
5731440 DO i = 1, len
574
2/2
✓ Branch 0 taken 5192126 times.
✓ Branch 1 taken 533314 times.
5731200 IF (ph(i,k)<plcl(i)) icb(i) = min(icb(i), k)
575 END DO
576 END DO
577
578
579 ! print*,'icb dans cv3_feed '
580 ! write(*,'(64i2)') icb(2:len-1)
581 ! call dump2d(64,43,'plcl dans cv3_feed ',plcl(2:len-1))
582
583
2/2
✓ Branch 0 taken 238560 times.
✓ Branch 1 taken 240 times.
238800 DO i = 1, len
584 !@ if((icb(i).ge.nlm).and.(iflag(i).eq.0))iflag(i)=9
585
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 238560 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
238800 IF ((icb(i)==nlm) .AND. (iflag(i)==0)) iflag(i) = 9
586 END DO
587
588
2/2
✓ Branch 0 taken 238560 times.
✓ Branch 1 taken 240 times.
238800 DO i = 1, len
589 238800 icb(i) = icb(i) - 1 ! icb sup ou egal a 2
590 END DO
591
592 ! Compute icbmax.
593
594 240 icbmax = 2
595
2/2
✓ Branch 0 taken 238560 times.
✓ Branch 1 taken 240 times.
238800 DO i = 1, len
596 !! icbmax=max(icbmax,icb(i))
597
2/2
✓ Branch 0 taken 156427 times.
✓ Branch 1 taken 82133 times.
238800 IF (iflag(i)<7) icbmax = max(icbmax, icb(i)) ! sb Jun7th02
598 END DO
599
600 240 RETURN
601 END SUBROUTINE cv3_feed
602
603 3369900 SUBROUTINE cv3_undilute1(len, nd, t, qs, gz, plcl, p, icb, tnk, qnk, gznk, &
604 tp, tvp, clw, icbs)
605 IMPLICIT NONE
606
607 ! ----------------------------------------------------------------
608 ! Equivalent de TLIFT entre NK et ICB+1 inclus
609
610 ! Differences with convect4:
611 ! - specify plcl in input
612 ! - icbs is the first level above LCL (may differ from icb)
613 ! - in the iterations, used x(icbs) instead x(icb)
614 ! - many minor differences in the iterations
615 ! - tvp is computed in only one time
616 ! - icbs: first level above Plcl (IMIN de TLIFT) in output
617 ! - if icbs=icb, compute also tp(icb+1),tvp(icb+1) & clw(icb+1)
618 ! ----------------------------------------------------------------
619
620 include "cvthermo.h"
621 include "cv3param.h"
622
623 ! inputs:
624 INTEGER, INTENT (IN) :: len, nd
625 INTEGER, DIMENSION (len), INTENT (IN) :: icb
626 REAL, DIMENSION (len, nd), INTENT (IN) :: t, qs, gz
627 REAL, DIMENSION (len), INTENT (IN) :: tnk, qnk, gznk
628 REAL, DIMENSION (len, nd), INTENT (IN) :: p
629 REAL, DIMENSION (len), INTENT (IN) :: plcl ! convect3
630
631 ! outputs:
632 INTEGER, DIMENSION (len), INTENT (OUT) :: icbs
633 REAL, DIMENSION (len, nd), INTENT (OUT) :: tp, tvp, clw
634
635 ! local variables:
636 INTEGER i, k
637 480 INTEGER icb1(len), icbsmax2 ! convect3
638 REAL tg, qg, alv, s, ahg, tc, denom, es, rg
639 480 REAL ah0(len), cpp(len)
640 480 REAL ticb(len), gzicb(len)
641 480 REAL qsicb(len) ! convect3
642 240 REAL cpinv(len) ! convect3
643
644 ! -------------------------------------------------------------------
645 ! --- Calculates the lifted parcel virtual temperature at nk,
646 ! --- the actual temperature, and the adiabatic
647 ! --- liquid water content. The procedure is to solve the equation.
648 ! cp*tp+L*qp+phi=cp*tnk+L*qnk+gznk.
649 ! -------------------------------------------------------------------
650
651
652 ! *** Calculate certain parcel quantities, including static energy ***
653
654
2/2
✓ Branch 0 taken 238560 times.
✓ Branch 1 taken 240 times.
238800 DO i = 1, len
655 238560 ah0(i) = (cpd*(1.-qnk(i))+cl*qnk(i))*tnk(i) + qnk(i)*(lv0-clmcpv*(tnk(i)-273.15)) + gznk(i)
656 238560 cpp(i) = cpd*(1.-qnk(i)) + qnk(i)*cpv
657 238800 cpinv(i) = 1./cpp(i)
658 END DO
659
660 ! *** Calculate lifted parcel quantities below cloud base ***
661
662
2/2
✓ Branch 0 taken 238560 times.
✓ Branch 1 taken 240 times.
238800 DO i = 1, len !convect3
663 238560 icb1(i) = min(max(icb(i), 2), nl)
664 ! if icb is below LCL, start loop at ICB+1:
665 ! (icbs est le premier niveau au-dessus du LCL)
666 238560 icbs(i) = icb1(i) !convect3
667
2/2
✓ Branch 0 taken 92010 times.
✓ Branch 1 taken 146550 times.
238800 IF (plcl(i)<p(i,icb1(i))) THEN
668 92010 icbs(i) = min(icbs(i)+1, nl) !convect3
669 END IF
670 END DO !convect3
671
672
2/2
✓ Branch 0 taken 238560 times.
✓ Branch 1 taken 240 times.
238800 DO i = 1, len !convect3
673 238560 ticb(i) = t(i, icbs(i)) !convect3
674 238560 gzicb(i) = gz(i, icbs(i)) !convect3
675 238800 qsicb(i) = qs(i, icbs(i)) !convect3
676 END DO !convect3
677
678
679 ! Re-compute icbsmax (icbsmax2): !convect3
680 ! !convect3
681 icbsmax2 = 2 !convect3
682
2/2
✓ Branch 0 taken 240 times.
✓ Branch 1 taken 238560 times.
238800 DO i = 1, len !convect3
683 238800 icbsmax2 = max(icbsmax2, icbs(i)) !convect3
684 END DO !convect3
685
686 ! initialization outputs:
687
688
2/2
✓ Branch 0 taken 2670 times.
✓ Branch 1 taken 240 times.
2910 DO k = 1, icbsmax2 ! convect3
689
2/2
✓ Branch 0 taken 2653980 times.
✓ Branch 1 taken 2670 times.
2656890 DO i = 1, len ! convect3
690 2653980 tp(i, k) = 0.0 ! convect3
691 2653980 tvp(i, k) = 0.0 ! convect3
692 2656650 clw(i, k) = 0.0 ! convect3
693 END DO ! convect3
694 END DO ! convect3
695
696 ! tp and tvp below cloud base:
697
698
2/2
✓ Branch 0 taken 2430 times.
✓ Branch 1 taken 240 times.
2670 DO k = minorig, icbsmax2 - 1
699
2/2
✓ Branch 0 taken 2415420 times.
✓ Branch 1 taken 2430 times.
2418090 DO i = 1, len
700 2415420 tp(i, k) = tnk(i) - (gz(i,k)-gznk(i))*cpinv(i)
701 2417850 tvp(i, k) = tp(i, k)*(1.+qnk(i)/eps-qnk(i)) !whole thing (convect3)
702 END DO
703 END DO
704
705 ! *** Find lifted parcel quantities above cloud base ***
706
707
2/2
✓ Branch 0 taken 238560 times.
✓ Branch 1 taken 240 times.
238800 DO i = 1, len
708 238560 tg = ticb(i)
709 ! ori qg=qs(i,icb(i))
710 238560 qg = qsicb(i) ! convect3
711 ! debug alv=lv0-clmcpv*(ticb(i)-t0)
712 238560 alv = lv0 - clmcpv*(ticb(i)-273.15)
713
714 ! First iteration.
715
716 ! ori s=cpd+alv*alv*qg/(rrv*ticb(i)*ticb(i))
717 s = cpd*(1.-qnk(i)) + cl*qnk(i) + & ! convect3
718 238560 alv*alv*qg/(rrv*ticb(i)*ticb(i)) ! convect3
719 238560 s = 1./s
720 ! ori ahg=cpd*tg+(cl-cpd)*qnk(i)*ticb(i)+alv*qg+gzicb(i)
721 238560 ahg = cpd*tg + (cl-cpd)*qnk(i)*tg + alv*qg + gzicb(i) ! convect3
722 238560 tg = tg + s*(ah0(i)-ahg)
723 ! ori tg=max(tg,35.0)
724 ! debug tc=tg-t0
725 238560 tc = tg - 273.15
726 238560 denom = 243.5 + tc
727 238560 denom = max(denom, 1.0) ! convect3
728 ! ori if(tc.ge.0.0)then
729 238560 es = 6.112*exp(17.67*tc/denom)
730 ! ori else
731 ! ori es=exp(23.33086-6111.72784/tg+0.15215*log(tg))
732 ! ori endif
733 ! ori qg=eps*es/(p(i,icb(i))-es*(1.-eps))
734 238560 qg = eps*es/(p(i,icbs(i))-es*(1.-eps))
735
736 ! Second iteration.
737
738
739 ! ori s=cpd+alv*alv*qg/(rrv*ticb(i)*ticb(i))
740 ! ori s=1./s
741 ! ori ahg=cpd*tg+(cl-cpd)*qnk(i)*ticb(i)+alv*qg+gzicb(i)
742 238560 ahg = cpd*tg + (cl-cpd)*qnk(i)*tg + alv*qg + gzicb(i) ! convect3
743 238560 tg = tg + s*(ah0(i)-ahg)
744 ! ori tg=max(tg,35.0)
745 ! debug tc=tg-t0
746 238560 tc = tg - 273.15
747 238560 denom = 243.5 + tc
748 238560 denom = max(denom, 1.0) ! convect3
749 ! ori if(tc.ge.0.0)then
750 238560 es = 6.112*exp(17.67*tc/denom)
751 ! ori else
752 ! ori es=exp(23.33086-6111.72784/tg+0.15215*log(tg))
753 ! ori end if
754 ! ori qg=eps*es/(p(i,icb(i))-es*(1.-eps))
755 238560 qg = eps*es/(p(i,icbs(i))-es*(1.-eps))
756
757 alv = lv0 - clmcpv*(ticb(i)-273.15)
758
759 ! ori c approximation here:
760 ! ori tp(i,icb(i))=(ah0(i)-(cl-cpd)*qnk(i)*ticb(i)
761 ! ori & -gz(i,icb(i))-alv*qg)/cpd
762
763 ! convect3: no approximation:
764 238560 tp(i, icbs(i)) = (ah0(i)-gz(i,icbs(i))-alv*qg)/(cpd+(cl-cpd)*qnk(i))
765
766 ! ori clw(i,icb(i))=qnk(i)-qg
767 ! ori clw(i,icb(i))=max(0.0,clw(i,icb(i)))
768 238560 clw(i, icbs(i)) = qnk(i) - qg
769 238560 clw(i, icbs(i)) = max(0.0, clw(i,icbs(i)))
770
771 rg = qg/(1.-qnk(i))
772 ! ori tvp(i,icb(i))=tp(i,icb(i))*(1.+rg*epsi)
773 ! convect3: (qg utilise au lieu du vrai mixing ratio rg)
774 238800 tvp(i, icbs(i)) = tp(i, icbs(i))*(1.+qg/eps-qnk(i)) !whole thing
775
776 END DO
777
778 ! ori do 380 k=minorig,icbsmax2
779 ! ori do 370 i=1,len
780 ! ori tvp(i,k)=tvp(i,k)-tp(i,k)*qnk(i)
781 ! ori 370 continue
782 ! ori 380 continue
783
784
785 ! -- The following is only for convect3:
786
787 ! * icbs is the first level above the LCL:
788 ! if plcl<p(icb), then icbs=icb+1
789 ! if plcl>p(icb), then icbs=icb
790
791 ! * the routine above computes tvp from minorig to icbs (included).
792
793 ! * to compute buoybase (in cv3_trigger.F), both tvp(icb) and tvp(icb+1)
794 ! must be known. This is the case if icbs=icb+1, but not if icbs=icb.
795
796 ! * therefore, in the case icbs=icb, we compute tvp at level icb+1
797 ! (tvp at other levels will be computed in cv3_undilute2.F)
798
799
800
2/2
✓ Branch 0 taken 238560 times.
✓ Branch 1 taken 240 times.
238800 DO i = 1, len
801 238560 ticb(i) = t(i, icb(i)+1)
802 238560 gzicb(i) = gz(i, icb(i)+1)
803 238800 qsicb(i) = qs(i, icb(i)+1)
804 END DO
805
806
2/2
✓ Branch 0 taken 238560 times.
✓ Branch 1 taken 240 times.
238800 DO i = 1, len
807 238560 tg = ticb(i)
808 238560 qg = qsicb(i) ! convect3
809 ! debug alv=lv0-clmcpv*(ticb(i)-t0)
810 238560 alv = lv0 - clmcpv*(ticb(i)-273.15)
811
812 ! First iteration.
813
814 ! ori s=cpd+alv*alv*qg/(rrv*ticb(i)*ticb(i))
815 s = cpd*(1.-qnk(i)) + cl*qnk(i) & ! convect3
816 238560 +alv*alv*qg/(rrv*ticb(i)*ticb(i)) ! convect3
817 238560 s = 1./s
818 ! ori ahg=cpd*tg+(cl-cpd)*qnk(i)*ticb(i)+alv*qg+gzicb(i)
819 238560 ahg = cpd*tg + (cl-cpd)*qnk(i)*tg + alv*qg + gzicb(i) ! convect3
820 238560 tg = tg + s*(ah0(i)-ahg)
821 ! ori tg=max(tg,35.0)
822 ! debug tc=tg-t0
823 238560 tc = tg - 273.15
824 238560 denom = 243.5 + tc
825 238560 denom = max(denom, 1.0) ! convect3
826 ! ori if(tc.ge.0.0)then
827 238560 es = 6.112*exp(17.67*tc/denom)
828 ! ori else
829 ! ori es=exp(23.33086-6111.72784/tg+0.15215*log(tg))
830 ! ori endif
831 ! ori qg=eps*es/(p(i,icb(i))-es*(1.-eps))
832 238560 qg = eps*es/(p(i,icb(i)+1)-es*(1.-eps))
833
834 ! Second iteration.
835
836
837 ! ori s=cpd+alv*alv*qg/(rrv*ticb(i)*ticb(i))
838 ! ori s=1./s
839 ! ori ahg=cpd*tg+(cl-cpd)*qnk(i)*ticb(i)+alv*qg+gzicb(i)
840 238560 ahg = cpd*tg + (cl-cpd)*qnk(i)*tg + alv*qg + gzicb(i) ! convect3
841 238560 tg = tg + s*(ah0(i)-ahg)
842 ! ori tg=max(tg,35.0)
843 ! debug tc=tg-t0
844 238560 tc = tg - 273.15
845 238560 denom = 243.5 + tc
846 238560 denom = max(denom, 1.0) ! convect3
847 ! ori if(tc.ge.0.0)then
848 238560 es = 6.112*exp(17.67*tc/denom)
849 ! ori else
850 ! ori es=exp(23.33086-6111.72784/tg+0.15215*log(tg))
851 ! ori end if
852 ! ori qg=eps*es/(p(i,icb(i))-es*(1.-eps))
853 238560 qg = eps*es/(p(i,icb(i)+1)-es*(1.-eps))
854
855 alv = lv0 - clmcpv*(ticb(i)-273.15)
856
857 ! ori c approximation here:
858 ! ori tp(i,icb(i))=(ah0(i)-(cl-cpd)*qnk(i)*ticb(i)
859 ! ori & -gz(i,icb(i))-alv*qg)/cpd
860
861 ! convect3: no approximation:
862 238560 tp(i, icb(i)+1) = (ah0(i)-gz(i,icb(i)+1)-alv*qg)/(cpd+(cl-cpd)*qnk(i))
863
864 ! ori clw(i,icb(i))=qnk(i)-qg
865 ! ori clw(i,icb(i))=max(0.0,clw(i,icb(i)))
866 238560 clw(i, icb(i)+1) = qnk(i) - qg
867 238560 clw(i, icb(i)+1) = max(0.0, clw(i,icb(i)+1))
868
869 rg = qg/(1.-qnk(i))
870 ! ori tvp(i,icb(i))=tp(i,icb(i))*(1.+rg*epsi)
871 ! convect3: (qg utilise au lieu du vrai mixing ratio rg)
872 238800 tvp(i, icb(i)+1) = tp(i, icb(i)+1)*(1.+qg/eps-qnk(i)) !whole thing
873
874 END DO
875
876 240 RETURN
877 END SUBROUTINE cv3_undilute1
878
879 8814891 SUBROUTINE cv3_trigger(len, nd, icb, plcl, p, th, tv, tvp, thnk, &
880 240 pbase, buoybase, iflag, sig, w0)
881 IMPLICIT NONE
882
883 ! -------------------------------------------------------------------
884 ! --- TRIGGERING
885
886 ! - computes the cloud base
887 ! - triggering (crude in this version)
888 ! - relaxation of sig and w0 when no convection
889
890 ! Caution1: if no convection, we set iflag=14
891 ! (it used to be 0 in convect3)
892
893 ! Caution2: at this stage, tvp (and thus buoy) are know up
894 ! through icb only!
895 ! -> the buoyancy below cloud base not (yet) set to the cloud base buoyancy
896 ! -------------------------------------------------------------------
897
898 include "cv3param.h"
899
900 ! input:
901 INTEGER len, nd
902 INTEGER icb(len)
903 REAL plcl(len), p(len, nd)
904 REAL th(len, nd), tv(len, nd), tvp(len, nd)
905 REAL thnk(len)
906
907 ! output:
908 REAL pbase(len), buoybase(len)
909
910 ! input AND output:
911 INTEGER iflag(len)
912 REAL sig(len, nd), w0(len, nd)
913
914 ! local variables:
915 INTEGER i, k
916 REAL tvpbase, tvbase, tdif, ath, ath1
917
918
919 ! *** set cloud base buoyancy at (plcl+dpbase) level buoyancy
920
921
2/2
✓ Branch 0 taken 238560 times.
✓ Branch 1 taken 240 times.
238800 DO i = 1, len
922 238560 pbase(i) = plcl(i) + dpbase
923 tvpbase = tvp(i, icb(i)) *(pbase(i)-p(i,icb(i)+1))/(p(i,icb(i))-p(i,icb(i)+1)) + &
924 238560 tvp(i, icb(i)+1)*(p(i,icb(i))-pbase(i)) /(p(i,icb(i))-p(i,icb(i)+1))
925 tvbase = tv(i, icb(i)) *(pbase(i)-p(i,icb(i)+1))/(p(i,icb(i))-p(i,icb(i)+1)) + &
926 238560 tv(i, icb(i)+1)*(p(i,icb(i))-pbase(i)) /(p(i,icb(i))-p(i,icb(i)+1))
927 238800 buoybase(i) = tvpbase - tvbase
928 END DO
929
930
931 ! *** make sure that column is dry adiabatic between the surface ***
932 ! *** and cloud base, and that lifted air is positively buoyant ***
933 ! *** at cloud base ***
934 ! *** if not, return to calling program after resetting ***
935 ! *** sig(i) and w0(i) ***
936
937
938 ! oct3 do 200 i=1,len
939 ! oct3
940 ! oct3 tdif = buoybase(i)
941 ! oct3 ath1 = th(i,1)
942 ! oct3 ath = th(i,icb(i)-1) - dttrig
943 ! oct3
944 ! oct3 if (tdif.lt.dtcrit .or. ath.gt.ath1) then
945 ! oct3 do 60 k=1,nl
946 ! oct3 sig(i,k) = beta*sig(i,k) - 2.*alpha*tdif*tdif
947 ! oct3 sig(i,k) = AMAX1(sig(i,k),0.0)
948 ! oct3 w0(i,k) = beta*w0(i,k)
949 ! oct3 60 continue
950 ! oct3 iflag(i)=4 ! pour version vectorisee
951 ! oct3c convect3 iflag(i)=0
952 ! oct3cccc return
953 ! oct3 endif
954 ! oct3
955 ! oct3200 continue
956
957 ! -- oct3: on reecrit la boucle 200 (pour la vectorisation)
958
959
2/2
✓ Branch 0 taken 6480 times.
✓ Branch 1 taken 240 times.
6720 DO k = 1, nl
960
2/2
✓ Branch 0 taken 6441120 times.
✓ Branch 1 taken 6480 times.
6447840 DO i = 1, len
961
962 6441120 tdif = buoybase(i)
963 6441120 ath1 = thnk(i)
964 6441120 ath = th(i, icb(i)-1) - dttrig
965
966
3/4
✓ Branch 0 taken 4306149 times.
✓ Branch 1 taken 2134971 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4306149 times.
6447600 IF (tdif<dtcrit .OR. ath>ath1) THEN
967 2134971 sig(i, k) = beta*sig(i, k) - 2.*alpha*tdif*tdif
968 2134971 sig(i, k) = amax1(sig(i,k), 0.0)
969 2134971 w0(i, k) = beta*w0(i, k)
970 2134971 iflag(i) = 14 ! pour version vectorisee
971 ! convect3 iflag(i)=0
972 END IF
973
974 END DO
975 END DO
976
977 ! fin oct3 --
978
979 240 RETURN
980 END SUBROUTINE cv3_trigger
981
982 SUBROUTINE cv3_compress(len, nloc, ncum, nd, ntra, &
983 iflag1, nk1, icb1, icbs1, &
984 plcl1, tnk1, qnk1, gznk1, pbase1, buoybase1, &
985 t1, q1, qs1, u1, v1, gz1, th1, &
986 tra1, &
987 h1, lv1, cpn1, p1, ph1, tv1, tp1, tvp1, clw1, &
988 sig1, w01, &
989 iflag, nk, icb, icbs, &
990 plcl, tnk, qnk, gznk, pbase, buoybase, &
991 t, q, qs, u, v, gz, th, &
992 tra, &
993 h, lv, cpn, p, ph, tv, tp, tvp, clw, &
994 sig, w0)
995 USE print_control_mod, ONLY: lunout
996 IMPLICIT NONE
997
998 include "cv3param.h"
999
1000 !inputs:
1001 INTEGER len, ncum, nd, ntra, nloc
1002 INTEGER iflag1(len), nk1(len), icb1(len), icbs1(len)
1003 REAL plcl1(len), tnk1(len), qnk1(len), gznk1(len)
1004 REAL pbase1(len), buoybase1(len)
1005 REAL t1(len, nd), q1(len, nd), qs1(len, nd), u1(len, nd), v1(len, nd)
1006 REAL gz1(len, nd), h1(len, nd), lv1(len, nd), cpn1(len, nd)
1007 REAL p1(len, nd), ph1(len, nd+1), tv1(len, nd), tp1(len, nd)
1008 REAL tvp1(len, nd), clw1(len, nd)
1009 REAL th1(len, nd)
1010 REAL sig1(len, nd), w01(len, nd)
1011 REAL tra1(len, nd, ntra)
1012
1013 !outputs:
1014 ! en fait, on a nloc=len pour l'instant (cf cv_driver)
1015 INTEGER iflag(nloc), nk(nloc), icb(nloc), icbs(nloc)
1016 REAL plcl(nloc), tnk(nloc), qnk(nloc), gznk(nloc)
1017 REAL pbase(nloc), buoybase(nloc)
1018 REAL t(nloc, nd), q(nloc, nd), qs(nloc, nd), u(nloc, nd), v(nloc, nd)
1019 REAL gz(nloc, nd), h(nloc, nd), lv(nloc, nd), cpn(nloc, nd)
1020 REAL p(nloc, nd), ph(nloc, nd+1), tv(nloc, nd), tp(nloc, nd)
1021 REAL tvp(nloc, nd), clw(nloc, nd)
1022 REAL th(nloc, nd)
1023 REAL sig(nloc, nd), w0(nloc, nd)
1024 REAL tra(nloc, nd, ntra)
1025
1026 !local variables:
1027 INTEGER i, k, nn, j
1028
1029 CHARACTER (LEN=20) :: modname = 'cv3_compress'
1030 CHARACTER (LEN=80) :: abort_message
1031
1032 DO k = 1, nl + 1
1033 nn = 0
1034 DO i = 1, len
1035 IF (iflag1(i)==0) THEN
1036 nn = nn + 1
1037 sig(nn, k) = sig1(i, k)
1038 w0(nn, k) = w01(i, k)
1039 t(nn, k) = t1(i, k)
1040 q(nn, k) = q1(i, k)
1041 qs(nn, k) = qs1(i, k)
1042 u(nn, k) = u1(i, k)
1043 v(nn, k) = v1(i, k)
1044 gz(nn, k) = gz1(i, k)
1045 h(nn, k) = h1(i, k)
1046 lv(nn, k) = lv1(i, k)
1047 cpn(nn, k) = cpn1(i, k)
1048 p(nn, k) = p1(i, k)
1049 ph(nn, k) = ph1(i, k)
1050 tv(nn, k) = tv1(i, k)
1051 tp(nn, k) = tp1(i, k)
1052 tvp(nn, k) = tvp1(i, k)
1053 clw(nn, k) = clw1(i, k)
1054 th(nn, k) = th1(i, k)
1055 END IF
1056 END DO
1057 END DO
1058
1059 !AC! do 121 j=1,ntra
1060 !AC!ccccc do 111 k=1,nl+1
1061 !AC! do 111 k=1,nd
1062 !AC! nn=0
1063 !AC! do 101 i=1,len
1064 !AC! if(iflag1(i).eq.0)then
1065 !AC! nn=nn+1
1066 !AC! tra(nn,k,j)=tra1(i,k,j)
1067 !AC! endif
1068 !AC! 101 continue
1069 !AC! 111 continue
1070 !AC! 121 continue
1071
1072 IF (nn/=ncum) THEN
1073 WRITE (lunout, *) 'strange! nn not equal to ncum: ', nn, ncum
1074 abort_message = ''
1075 CALL abort_physic(modname, abort_message, 1)
1076 END IF
1077
1078 nn = 0
1079 DO i = 1, len
1080 IF (iflag1(i)==0) THEN
1081 nn = nn + 1
1082 pbase(nn) = pbase1(i)
1083 buoybase(nn) = buoybase1(i)
1084 plcl(nn) = plcl1(i)
1085 tnk(nn) = tnk1(i)
1086 qnk(nn) = qnk1(i)
1087 gznk(nn) = gznk1(i)
1088 nk(nn) = nk1(i)
1089 icb(nn) = icb1(i)
1090 icbs(nn) = icbs1(i)
1091 iflag(nn) = iflag1(i)
1092 END IF
1093 END DO
1094
1095 RETURN
1096 END SUBROUTINE cv3_compress
1097
1098 SUBROUTINE icefrac(t, clw, qi, nl, len)
1099 IMPLICIT NONE
1100
1101
1102 !JAM--------------------------------------------------------------------
1103 ! Calcul de la quantit� d'eau sous forme de glace
1104 ! --------------------------------------------------------------------
1105 INTEGER nl, len
1106 REAL qi(len, nl)
1107 REAL t(len, nl), clw(len, nl)
1108 REAL fracg
1109 INTEGER k, i
1110
1111 DO k = 3, nl
1112 DO i = 1, len
1113 IF (t(i,k)>263.15) THEN
1114 qi(i, k) = 0.
1115 ELSE
1116 IF (t(i,k)<243.15) THEN
1117 qi(i, k) = clw(i, k)
1118 ELSE
1119 fracg = (263.15-t(i,k))/20
1120 qi(i, k) = clw(i, k)*fracg
1121 END IF
1122 END IF
1123 ! print*,t(i,k),qi(i,k),'temp,testglace'
1124 END DO
1125 END DO
1126
1127 RETURN
1128
1129 END SUBROUTINE icefrac
1130
1131 20693345 SUBROUTINE cv3_undilute2(nloc, ncum, nd, iflag, icb, icbs, nk, &
1132 240 tnk, qnk, gznk, hnk, t, q, qs, gz, &
1133 p, ph, h, tv, lv, lf, pbase, buoybase, plcl, &
1134 inb, tp, tvp, clw, hp, ep, sigp, buoy, &
1135 frac_a, frac_s, qpreca, qta)
1136 USE print_control_mod, ONLY: prt_level
1137 IMPLICIT NONE
1138
1139 ! ---------------------------------------------------------------------
1140 ! Purpose:
1141 ! FIND THE REST OF THE LIFTED PARCEL TEMPERATURES
1142 ! &
1143 ! COMPUTE THE PRECIPITATION EFFICIENCIES AND THE
1144 ! FRACTION OF PRECIPITATION FALLING OUTSIDE OF CLOUD
1145 ! &
1146 ! FIND THE LEVEL OF NEUTRAL BUOYANCY
1147
1148 ! Main differences convect3/convect4:
1149 ! - icbs (input) is the first level above LCL (may differ from icb)
1150 ! - many minor differences in the iterations
1151 ! - condensed water not removed from tvp in convect3
1152 ! - vertical profile of buoyancy computed here (use of buoybase)
1153 ! - the determination of inb is different
1154 ! - no inb1, only inb in output
1155 ! ---------------------------------------------------------------------
1156
1157 include "cvthermo.h"
1158 include "cv3param.h"
1159 include "conema3.h"
1160 include "cvflag.h"
1161 include "YOMCST2.h"
1162
1163 !inputs:
1164 INTEGER, INTENT (IN) :: ncum, nd, nloc
1165 INTEGER, DIMENSION (nloc), INTENT (IN) :: icb, icbs, nk
1166 REAL, DIMENSION (nloc, nd), INTENT (IN) :: t, q, qs, gz
1167 REAL, DIMENSION (nloc, nd), INTENT (IN) :: p
1168 REAL, DIMENSION (nloc, nd+1), INTENT (IN) :: ph
1169 REAL, DIMENSION (nloc), INTENT (IN) :: tnk, qnk, gznk
1170 REAL, DIMENSION (nloc), INTENT (IN) :: hnk
1171 REAL, DIMENSION (nloc, nd), INTENT (IN) :: lv, lf, tv, h
1172 REAL, DIMENSION (nloc), INTENT (IN) :: pbase, buoybase, plcl
1173
1174 !input/outputs:
1175 REAL, DIMENSION (nloc, nd), INTENT (INOUT) :: tp, tvp, clw ! Input for k = 1, icb+1 (computed in cv3_undilute1)
1176 ! Output above
1177 INTEGER, DIMENSION (nloc), INTENT (INOUT) :: iflag
1178
1179 !outputs:
1180 INTEGER, DIMENSION (nloc), INTENT (OUT) :: inb
1181 REAL, DIMENSION (nloc, nd), INTENT (OUT) :: ep, sigp, hp
1182 REAL, DIMENSION (nloc, nd), INTENT (OUT) :: buoy
1183 REAL, DIMENSION (nloc, nd), INTENT (OUT) :: frac_a, frac_s
1184 REAL, DIMENSION (nloc, nd), INTENT (OUT) :: qpreca
1185 REAL, DIMENSION (nloc, nd), INTENT (OUT) :: qta
1186
1187 !local variables:
1188 INTEGER i, j, k
1189 REAL smallestreal
1190 REAL tg, qg, dqgdT, ahg, alv, alf, s, tc, es, esi, denom, rg, tca, elacrit
1191 REAL :: phinu2p
1192 REAL :: qhthreshold
1193 REAL :: als
1194 REAL :: qsat_new, snew
1195 480 REAL, DIMENSION (nloc,nd) :: qi
1196 480 REAL, DIMENSION (nloc,nd) :: ha ! moist static energy of adiabatic ascents
1197 ! taking into account precip ejection
1198 480 REAL, DIMENSION (nloc,nd) :: hla ! liquid water static energy of adiabatic ascents
1199 ! taking into account precip ejection
1200 480 REAL, DIMENSION (nloc,nd) :: qcld ! specific cloud water
1201 480 REAL, DIMENSION (nloc,nd) :: qhsat ! specific humidity at saturation
1202 REAL, DIMENSION (nloc,nd) :: dqhsatdT ! dqhsat/dT
1203 480 REAL, DIMENSION (nloc,nd) :: frac ! ice fraction function of envt temperature
1204 480 REAL, DIMENSION (nloc,nd) :: qps ! specific solid precipitation
1205 480 REAL, DIMENSION (nloc,nd) :: qpl ! specific liquid precipitation
1206 480 REAL, DIMENSION (nloc) :: ah0, cape, capem, byp
1207 LOGICAL, DIMENSION (nloc) :: lcape
1208 480 INTEGER, DIMENSION (nloc) :: iposit
1209 REAL :: denomm1
1210 REAL :: by, defrac, pden, tbis
1211 REAL :: fracg
1212 REAL :: deltap
1213 REAL, SAVE :: Tx, Tm
1214 DATA Tx/263.15/, Tm/243.15/
1215 !$OMP THREADPRIVATE(Tx, Tm)
1216 REAL :: aa, bb, dd, ddelta, discr
1217 REAL :: ff, fp
1218 REAL :: coefx, coefm, Zx, Zm, Ux, U, Um
1219
1220
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 240 times.
240 IF (prt_level >= 10) THEN
1221 print *,'cv3_undilute2.0. icvflag_Tpa, t(1,k), q(1,k), qs(1,k) ', &
1222 icvflag_Tpa, (k, t(1,k), q(1,k), qs(1,k), k = 1,nl)
1223 ENDIF
1224 smallestreal=tiny(smallestreal)
1225
1226 ! =====================================================================
1227 ! --- SOME INITIALIZATIONS
1228 ! =====================================================================
1229
1230
2/2
✓ Branch 0 taken 6480 times.
✓ Branch 1 taken 240 times.
6720 DO k = 1, nl
1231
2/2
✓ Branch 0 taken 3431619 times.
✓ Branch 1 taken 6480 times.
3438339 DO i = 1, ncum
1232 3438099 qi(i, k) = 0.
1233 END DO
1234 END DO
1235
1236
1237 ! =====================================================================
1238 ! --- FIND THE REST OF THE LIFTED PARCEL TEMPERATURES
1239 ! =====================================================================
1240
1241 ! --- The procedure is to solve the equation.
1242 ! cp*tp+L*qp+phi=cp*tnk+L*qnk+gznk.
1243
1244 ! *** Calculate certain parcel quantities, including static energy ***
1245
1246
1247
2/2
✓ Branch 0 taken 127097 times.
✓ Branch 1 taken 240 times.
127337 DO i = 1, ncum
1248 ah0(i) = (cpd*(1.-qnk(i))+cl*qnk(i))*tnk(i)+ &
1249 ! debug qnk(i)*(lv0-clmcpv*(tnk(i)-t0))+gznk(i)
1250 127337 qnk(i)*(lv0-clmcpv*(tnk(i)-273.15)) + gznk(i)
1251 END DO
1252 !
1253 ! Ice fraction
1254 !
1255
1/2
✓ Branch 0 taken 240 times.
✗ Branch 1 not taken.
240 IF (cvflag_ice) THEN
1256
2/2
✓ Branch 0 taken 6480 times.
✓ Branch 1 taken 240 times.
6720 DO k = minorig, nl
1257
2/2
✓ Branch 0 taken 3431619 times.
✓ Branch 1 taken 6480 times.
3438339 DO i = 1, ncum
1258 3431619 frac(i, k) = (Tx - t(i,k))/(Tx - Tm)
1259 3438099 frac(i, k) = min(max(frac(i,k),0.0), 1.0)
1260 END DO
1261 END DO
1262 ! Below cloud base, set ice fraction to cloud base value
1263
2/2
✓ Branch 0 taken 6480 times.
✓ Branch 1 taken 240 times.
6720 DO k = 1, nl
1264
2/2
✓ Branch 0 taken 3431619 times.
✓ Branch 1 taken 6480 times.
3438339 DO i = 1, ncum
1265
2/2
✓ Branch 0 taken 520451 times.
✓ Branch 1 taken 2911168 times.
3438099 IF (k<icb(i)) THEN
1266 520451 frac(i,k) = frac(i,icb(i))
1267 END IF
1268 END DO
1269 END DO
1270 ELSE
1271 DO k = 1, nl
1272 DO i = 1, ncum
1273 frac(i,k) = 0.
1274 END DO
1275 END DO
1276 ENDIF ! (cvflag_ice)
1277
1278
1279
2/2
✓ Branch 0 taken 6480 times.
✓ Branch 1 taken 240 times.
6720 DO k = minorig, nl
1280
2/2
✓ Branch 0 taken 3431619 times.
✓ Branch 1 taken 6480 times.
3438339 DO i = 1,ncum
1281 3431619 ha(i,k) = ah0(i)
1282 3431619 hla(i,k) = hnk(i)
1283 3431619 qta(i,k) = qnk(i)
1284 3431619 qpreca(i,k) = 0.
1285 3431619 frac_a(i,k) = 0.
1286 3431619 frac_s(i,k) = frac(i,k)
1287 3431619 qpl(i,k) = 0.
1288 3431619 qps(i,k) = 0.
1289 3431619 qhsat(i,k) = qs(i,k)
1290 3431619 qcld(i,k) = max(qta(i,k)-qhsat(i,k),0.)
1291
2/2
✓ Branch 0 taken 774645 times.
✓ Branch 1 taken 2656974 times.
3438099 IF (k <= icb(i)+1) THEN
1292 774645 qhsat(i,k) = qnk(i)-clw(i,k)
1293 774645 qcld(i,k) = clw(i,k)
1294 ENDIF
1295 ENDDO
1296 ENDDO
1297
1298 !jyg<
1299 ! =====================================================================
1300 ! --- SET THE THE FRACTION OF PRECIPITATION FALLING OUTSIDE OF CLOUD
1301 ! =====================================================================
1302
2/2
✓ Branch 0 taken 6480 times.
✓ Branch 1 taken 240 times.
6720 DO k = 1, nl
1303
2/2
✓ Branch 0 taken 3431619 times.
✓ Branch 1 taken 6480 times.
3438339 DO i = 1, ncum
1304 3431619 ep(i, k) = 0.0
1305 3438099 sigp(i, k) = spfac
1306 END DO
1307 END DO
1308 !>jyg
1309 !
1310
1311 ! *** Find lifted parcel quantities above cloud base ***
1312
1313 !----------------------------------------------------------------------------
1314 !
1315
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 240 times.
240 IF (icvflag_Tpa == 2) THEN
1316 !
1317 !----------------------------------------------------------------------------
1318 !
1319 DO k = minorig + 1, nl
1320 DO i = 1,ncum
1321 tp(i,k) = t(i,k)
1322 ENDDO
1323 !! alv = lv0 - clmcpv*(t(i,k)-273.15)
1324 !! alf = lf0 + clmci*(t(i,k)-273.15)
1325 !! als = alf + alv
1326 DO j = 1,4
1327 DO i = 1, ncum
1328 ! ori if(k.ge.(icb(i)+1))then
1329 IF (k>=(icbs(i)+1)) THEN ! convect3
1330 tg = tp(i, k)
1331 IF (tg .gt. Tx) THEN
1332 es = 6.112*exp(17.67*(tg - 273.15)/(tg + 243.5 - 273.15))
1333 qg = eps*es/(p(i,k)-es*(1.-eps))
1334 ELSE
1335 esi = exp(23.33086-(6111.72784/tg)+0.15215*log(tg))
1336 qg = eps*esi/(p(i,k)-esi*(1.-eps))
1337 ENDIF
1338 ! Ice fraction
1339 ff = 0.
1340 fp = 1./(Tx - Tm)
1341 IF (tg < Tx) THEN
1342 IF (tg > Tm) THEN
1343 ff = (Tx - tg)*fp
1344 ELSE
1345 ff = 1.
1346 ENDIF ! (tg > Tm)
1347 ENDIF ! (tg < Tx)
1348 ! Intermediate variables
1349 aa = cpd + (cl-cpd)*qnk(i) + lv(i,k)*lv(i,k)*qg/(rrv*tg*tg)
1350 ahg = (cpd + (cl-cpd)*qnk(i))*tg + lv(i,k)*qg - &
1351 lf(i,k)*ff*(qnk(i) - qg) + gz(i,k)
1352 dd = lf(i,k)*lv(i,k)*qg/(rrv*tg*tg)
1353 ddelta = lf(i,k)*(qnk(i) - qg)
1354 bb = aa + ddelta*fp + dd*fp*(Tx-tg)
1355 ! Compute Zx and Zm
1356 coefx = aa
1357 coefm = aa + dd
1358 IF (tg .gt. Tx) THEN
1359 Zx = ahg + coefx*(Tx - tg)
1360 Zm = ahg - ddelta + coefm*(Tm - tg)
1361 ELSE
1362 IF (tg .gt. Tm) THEN
1363 Zx = ahg + (coefx +fp*ddelta)*(Tx - Tg)
1364 Zm = ahg + (coefm +fp*ddelta)*(Tm - Tg)
1365 ELSE
1366 Zx = ahg + ddelta + coefx*(Tx - tg)
1367 Zm = ahg + coefm*(Tm - tg)
1368 ENDIF ! (tg .gt. Tm)
1369 ENDIF ! (tg .gt. Tx)
1370 ! Compute the masks Um, U, Ux
1371 Um = (sign(1., Zm-ah0(i))+1.)/2.
1372 Ux = (sign(1., ah0(i)-Zx)+1.)/2.
1373 U = (1. - Um)*(1. - Ux)
1374 ! Compute the updated parcell temperature Tp : 3 cases depending on tg value
1375 IF (tg .gt. Tx) THEN
1376 discr = bb*bb - 4*dd*fp*(ah0(i) - ahg + ddelta*fp*(Tx-tg))
1377 Tp(i,k) = tg + &
1378 Um* (ah0(i) - ahg + ddelta) /(aa + dd) + &
1379 U *2*(ah0(i) - ahg + ddelta*fp*(Tx-tg))/(bb + sqrt(discr)) + &
1380 Ux* (ah0(i) - ahg) /aa
1381 ELSEIF (tg .gt. Tm) THEN
1382 discr = bb*bb - 4*dd*fp*(ah0(i) - ahg)
1383 Tp(i,k) = tg + &
1384 Um* (ah0(i) - ahg + ddelta*fp*(tg-Tm))/(aa + dd) + &
1385 U *2*(ah0(i) - ahg) /(bb + sqrt(discr)) + &
1386 Ux* (ah0(i) - ahg + ddelta*fp*(tg-Tx))/aa
1387 ELSE
1388 discr = bb*bb - 4*dd*fp*(ah0(i) - ahg + ddelta*fp*(Tm-tg))
1389 Tp(i,k) = tg + &
1390 Um* (ah0(i) - ahg) /(aa + dd) + &
1391 U *2*(ah0(i) - ahg + ddelta*fp*(Tm-tg))/(bb + sqrt(discr)) + &
1392 Ux* (ah0(i) - ahg - ddelta) /aa
1393 ENDIF ! (tg .gt. Tx)
1394 !
1395 !! print *,' j, k, Um, U, Ux, aa, bb, discr, dd, ddelta ', j, k, Um, U, Ux, aa, bb, discr, dd, ddelta
1396 !! print *,' j, k, ah0(i), ahg, tg, qg, tp(i,k), ff ', j, k, ah0(i), ahg, tg, qg, tp(i,k), ff
1397 END IF ! (k>=(icbs(i)+1))
1398 END DO ! i = 1, ncum
1399 END DO ! j = 1,4
1400 DO i = 1, ncum
1401 IF (k>=(icbs(i)+1)) THEN ! convect3
1402 tg = tp(i, k)
1403 IF (tg .gt. Tx) THEN
1404 es = 6.112*exp(17.67*(tg - 273.15)/(tg + 243.5 - 273.15))
1405 qg = eps*es/(p(i,k)-es*(1.-eps))
1406 ELSE
1407 esi = exp(23.33086-(6111.72784/tg)+0.15215*log(tg))
1408 qg = eps*esi/(p(i,k)-esi*(1.-eps))
1409 ENDIF
1410 clw(i, k) = qnk(i) - qg
1411 clw(i, k) = max(0.0, clw(i,k))
1412 tvp(i, k) = max(0., tp(i,k)*(1.+qg/eps-qnk(i)))
1413 ! print*,tvp(i,k),'tvp'
1414 IF (clw(i,k)<1.E-11) THEN
1415 tp(i, k) = tv(i, k)
1416 tvp(i, k) = tv(i, k)
1417 END IF ! (clw(i,k)<1.E-11)
1418 END IF ! (k>=(icbs(i)+1))
1419 END DO ! i = 1, ncum
1420 END DO ! k = minorig + 1, nl
1421 !----------------------------------------------------------------------------
1422 !
1423
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 240 times.
240 ELSE IF (icvflag_Tpa == 1) THEN ! (icvflag_Tpa == 2)
1424 !
1425 !----------------------------------------------------------------------------
1426 !
1427 DO k = minorig + 1, nl
1428 DO i = 1,ncum
1429 tp(i,k) = t(i,k)
1430 ENDDO
1431 !! alv = lv0 - clmcpv*(t(i,k)-273.15)
1432 !! alf = lf0 + clmci*(t(i,k)-273.15)
1433 !! als = alf + alv
1434 DO j = 1,4
1435 DO i = 1, ncum
1436 ! ori if(k.ge.(icb(i)+1))then
1437 IF (k>=(icbs(i)+1)) THEN ! convect3
1438 tg = tp(i, k)
1439 IF (tg .gt. Tx .OR. .NOT.cvflag_ice) THEN
1440 es = 6.112*exp(17.67*(tg - 273.15)/(tg + 243.5 - 273.15))
1441 qg = eps*es/(p(i,k)-es*(1.-eps))
1442 dqgdT = lv(i,k)*qg/(rrv*tg*tg)
1443 ELSE
1444 esi = exp(23.33086-(6111.72784/tg)+0.15215*log(tg))
1445 qg = eps*esi/(p(i,k)-esi*(1.-eps))
1446 dqgdT = (lv(i,k)+lf(i,k))*qg/(rrv*tg*tg)
1447 ENDIF
1448 IF (qsat_depends_on_qt) THEN
1449 dqgdT = dqgdT*(1.-qta(i,k-1))/(1.-qg)**2
1450 qg = qg*(1.-qta(i,k-1))/(1.-qg)
1451 ENDIF
1452 ahg = (cpd + (cl-cpd)*qta(i,k-1))*tg + lv(i,k)*qg - &
1453 lf(i,k)*frac(i,k)*(qta(i,k-1) - qg) + gz(i,k)
1454 Tp(i,k) = tg + (ah0(i) - ahg)/ &
1455 (cpd + (cl-cpd)*qta(i,k-1) + (lv(i,k)+frac(i,k)*lf(i,k))*dqgdT)
1456 !! print *,'undilute2 iterations k, Tp(i,k), ah0(i), ahg ', &
1457 !! k, Tp(i,k), ah0(i), ahg
1458 END IF ! (k>=(icbs(i)+1))
1459 END DO ! i = 1, ncum
1460 END DO ! j = 1,4
1461 DO i = 1, ncum
1462 IF (k>=(icbs(i)+1)) THEN ! convect3
1463 tg = tp(i, k)
1464 IF (tg .gt. Tx .OR. .NOT.cvflag_ice) THEN
1465 es = 6.112*exp(17.67*(tg - 273.15)/(tg + 243.5 - 273.15))
1466 qg = eps*es/(p(i,k)-es*(1.-eps))
1467 ELSE
1468 esi = exp(23.33086-(6111.72784/tg)+0.15215*log(tg))
1469 qg = eps*esi/(p(i,k)-esi*(1.-eps))
1470 ENDIF
1471 IF (qsat_depends_on_qt) THEN
1472 qg = qg*(1.-qta(i,k-1))/(1.-qg)
1473 ENDIF
1474 qhsat(i,k) = qg
1475 END IF ! (k>=(icbs(i)+1))
1476 END DO ! i = 1, ncum
1477 DO i = 1, ncum
1478 IF (k>=(icbs(i)+1)) THEN ! convect3
1479 clw(i, k) = qta(i,k-1) - qhsat(i,k)
1480 clw(i, k) = max(0.0, clw(i,k))
1481 tvp(i, k) = max(0., tp(i,k)*(1.+qhsat(i,k)/eps-qta(i,k-1)))
1482 ! print*,tvp(i,k),'tvp'
1483 IF (clw(i,k)<1.E-11) THEN
1484 tp(i, k) = tv(i, k)
1485 tvp(i, k) = tv(i, k)
1486 END IF ! (clw(i,k)<1.E-11)
1487 END IF ! (k>=(icbs(i)+1))
1488 END DO ! i = 1, ncum
1489 !
1490 IF (cvflag_prec_eject) THEN
1491 DO i = 1, ncum
1492 IF (k>=(icbs(i)+1)) THEN ! convect3
1493 ! Specific precipitation (liquid and solid) and ice content
1494 ! before ejection of precipitation !!jygprl
1495 elacrit = elcrit*min(max(1.-(tp(i,k)-T0)/Tlcrit, 0.), 1.) !!jygprl
1496 !!!! qcld(i,k) = min(clw(i,k), elacrit) !!jygprl
1497 qhthreshold = elacrit*(1.-qta(i,k-1))/(1.-elacrit)
1498 qcld(i,k) = min(clw(i,k), qhthreshold) !!jygprl
1499 !!!! phinu2p = max(qhsat(i,k-1) + qcld(i,k-1) - (qhsat(i,k) + qcld(i,k)),0.) !!jygprl
1500 phinu2p = max(clw(i,k) - max(qta(i,k-1) - qhsat(i,k-1), qhthreshold), 0.)
1501 qpl(i,k) = qpl(i,k-1) + (1.-frac(i,k))*phinu2p !!jygprl
1502 qps(i,k) = qps(i,k-1) + frac(i,k) *phinu2p !!jygprl
1503 qi(i,k) = (1.-ejectliq)*clw(i,k)*frac(i,k) + & !!jygprl
1504 ejectliq*(qps(i,k-1) + frac(i,k)*(phinu2p+qcld(i,k))) !!jygprl
1505 !!
1506 ! =====================================================================================
1507 ! Ejection of precipitation from adiabatic ascents if requested (cvflag_prec_eject=True):
1508 ! Compute the steps of total water (qta), of moist static energy (ha), of specific
1509 ! precipitation (qpl and qps) and of specific cloud water (qcld) associated with precipitation
1510 ! ejection.
1511 ! =====================================================================================
1512 !
1513 ! Verif
1514 qpreca(i,k) = ejectliq*qpl(i,k) + ejectice*qps(i,k) !!jygprl
1515 frac_a(i,k) = ejectice*qps(i,k)/max(qpreca(i,k),smallestreal) !!jygprl
1516 frac_s(i,k) = (1.-ejectliq)*frac(i,k) + & !!jygprl
1517 ejectliq*(1. - (qpl(i,k)+(1.-frac(i,k))*qcld(i,k))/max(clw(i,k),smallestreal)) !!jygprl
1518 !
1519 denomm1 = 1./(1. - qpreca(i,k))
1520 !
1521 qta(i,k) = qta(i,k-1) - &
1522 qpreca(i,k)*(1.-qta(i,k-1))*denomm1
1523 ha(i,k) = ha(i,k-1) + &
1524 ( qpreca(i,k)*(-(1.-qta(i,k-1))*(cl-cpd)*tp(i,k) + &
1525 lv(i,k)*qhsat(i,k) - lf(i,k)*(frac_s(i,k)*qcld(i,k)+qps(i,k))) + &
1526 lf(i,k)*ejectice*qps(i,k))*denomm1
1527 hla(i,k) = hla(i,k-1) + &
1528 ( qpreca(i,k)*(-(1.-qta(i,k-1))*(cpv-cpd)*tp(i,k) - &
1529 lv(i,k)*((1.-frac_s(i,k))*qcld(i,k)+qpl(i,k)) - &
1530 (lv(i,k)+lf(i,k))*(frac_s(i,k)*qcld(i,k)+qps(i,k))) + &
1531 lv(i,k)*ejectliq*qpl(i,k) + (lv(i,k)+lf(i,k))*ejectice*qps(i,k))*denomm1
1532 qpl(i,k) = qpl(i,k)*(1.-ejectliq)*denomm1
1533 qps(i,k) = qps(i,k)*(1.-ejectice)*denomm1
1534 qcld(i,k) = qcld(i,k)*denomm1
1535 qhsat(i,k) = qhsat(i,k)*(1.-qta(i,k))/(1.-qta(i,k-1))
1536 END IF ! (k>=(icbs(i)+1))
1537 END DO ! i = 1, ncum
1538 ENDIF ! (cvflag_prec_eject)
1539 !
1540 END DO ! k = minorig + 1, nl
1541 !
1542 !----------------------------------------------------------------------------
1543 !
1544
1/2
✓ Branch 0 taken 240 times.
✗ Branch 1 not taken.
240 ELSE IF (icvflag_Tpa == 0) THEN! (icvflag_Tpa == 2) ELSE IF(icvflag_Tpa == 1)
1545 !
1546 !----------------------------------------------------------------------------
1547 !
1548
2/2
✓ Branch 0 taken 240 times.
✓ Branch 1 taken 6240 times.
6480 DO k = minorig + 1, nl
1549
2/2
✓ Branch 0 taken 3304522 times.
✓ Branch 1 taken 6240 times.
3311002 DO i = 1, ncum
1550 ! ori if(k.ge.(icb(i)+1))then
1551
2/2
✓ Branch 0 taken 2715198 times.
✓ Branch 1 taken 589324 times.
3310762 IF (k>=(icbs(i)+1)) THEN ! convect3
1552 2715198 tg = t(i, k)
1553 2715198 qg = qs(i, k)
1554 ! debug alv=lv0-clmcpv*(t(i,k)-t0)
1555 2715198 alv = lv0 - clmcpv*(t(i,k)-273.15)
1556
1557 ! First iteration.
1558
1559 ! ori s=cpd+alv*alv*qg/(rrv*t(i,k)*t(i,k))
1560 s = cpd*(1.-qnk(i)) + cl*qnk(i) + & ! convect3
1561 2715198 alv*alv*qg/(rrv*t(i,k)*t(i,k)) ! convect3
1562 2715198 s = 1./s
1563 ! ori ahg=cpd*tg+(cl-cpd)*qnk(i)*t(i,k)+alv*qg+gz(i,k)
1564 2715198 ahg = cpd*tg + (cl-cpd)*qnk(i)*tg + alv*qg + gz(i, k) ! convect3
1565 2715198 tg = tg + s*(ah0(i)-ahg)
1566 ! ori tg=max(tg,35.0)
1567 ! debug tc=tg-t0
1568 2715198 tc = tg - 273.15
1569 2715198 denom = 243.5 + tc
1570 2715198 denom = max(denom, 1.0) ! convect3
1571 ! ori if(tc.ge.0.0)then
1572 2715198 es = 6.112*exp(17.67*tc/denom)
1573 ! ori else
1574 ! ori es=exp(23.33086-6111.72784/tg+0.15215*log(tg))
1575 ! ori endif
1576 2715198 qg = eps*es/(p(i,k)-es*(1.-eps))
1577
1578 ! Second iteration.
1579
1580 ! ori s=cpd+alv*alv*qg/(rrv*t(i,k)*t(i,k))
1581 ! ori s=1./s
1582 ! ori ahg=cpd*tg+(cl-cpd)*qnk(i)*t(i,k)+alv*qg+gz(i,k)
1583 2715198 ahg = cpd*tg + (cl-cpd)*qnk(i)*tg + alv*qg + gz(i, k) ! convect3
1584 2715198 tg = tg + s*(ah0(i)-ahg)
1585 ! ori tg=max(tg,35.0)
1586 ! debug tc=tg-t0
1587 2715198 tc = tg - 273.15
1588 2715198 denom = 243.5 + tc
1589 2715198 denom = max(denom, 1.0) ! convect3
1590 ! ori if(tc.ge.0.0)then
1591 2715198 es = 6.112*exp(17.67*tc/denom)
1592 ! ori else
1593 ! ori es=exp(23.33086-6111.72784/tg+0.15215*log(tg))
1594 ! ori endif
1595 2715198 qg = eps*es/(p(i,k)-es*(1.-eps))
1596
1597 ! debug alv=lv0-clmcpv*(t(i,k)-t0)
1598 alv = lv0 - clmcpv*(t(i,k)-273.15)
1599 ! print*,'cpd dans convect2 ',cpd
1600 ! print*,'tp(i,k),ah0(i),cl,cpd,qnk(i),t(i,k),gz(i,k),alv,qg,cpd'
1601 ! print*,tp(i,k),ah0(i),cl,cpd,qnk(i),t(i,k),gz(i,k),alv,qg,cpd
1602
1603 ! ori c approximation here:
1604 ! ori tp(i,k)=(ah0(i)-(cl-cpd)*qnk(i)*t(i,k)-gz(i,k)-alv*qg)/cpd
1605
1606 ! convect3: no approximation:
1607
1/2
✓ Branch 0 taken 2715198 times.
✗ Branch 1 not taken.
2715198 IF (cvflag_ice) THEN
1608 2715198 tp(i, k) = max(0., (ah0(i)-gz(i,k)-alv*qg)/(cpd+(cl-cpd)*qnk(i)))
1609 ELSE
1610 tp(i, k) = (ah0(i)-gz(i,k)-alv*qg)/(cpd+(cl-cpd)*qnk(i))
1611 END IF
1612
1613 2715198 clw(i, k) = qnk(i) - qg
1614 2715198 clw(i, k) = max(0.0, clw(i,k))
1615 rg = qg/(1.-qnk(i))
1616 ! ori tvp(i,k)=tp(i,k)*(1.+rg*epsi)
1617 ! convect3: (qg utilise au lieu du vrai mixing ratio rg):
1618 2715198 tvp(i, k) = tp(i, k)*(1.+qg/eps-qnk(i)) ! whole thing
1619
1/2
✓ Branch 0 taken 2715198 times.
✗ Branch 1 not taken.
2715198 IF (cvflag_ice) THEN
1620
2/2
✓ Branch 0 taken 748 times.
✓ Branch 1 taken 2714450 times.
2715198 IF (clw(i,k)<1.E-11) THEN
1621 748 tp(i, k) = tv(i, k)
1622 748 tvp(i, k) = tv(i, k)
1623 END IF
1624 END IF
1625 !jyg<
1626 !! END IF ! Endif moved to the end of the loop
1627 !>jyg
1628
1629
1/2
✓ Branch 0 taken 2715198 times.
✗ Branch 1 not taken.
2715198 IF (cvflag_ice) THEN
1630 !CR:attention boucle en klon dans Icefrac
1631 ! Call Icefrac(t,clw,qi,nl,nloc)
1632
2/2
✓ Branch 0 taken 599190 times.
✓ Branch 1 taken 2116008 times.
2715198 IF (t(i,k)>263.15) THEN
1633 599190 qi(i, k) = 0.
1634 ELSE
1635
2/2
✓ Branch 0 taken 1778803 times.
✓ Branch 1 taken 337205 times.
2116008 IF (t(i,k)<243.15) THEN
1636 1778803 qi(i, k) = clw(i, k)
1637 ELSE
1638 337205 fracg = (263.15-t(i,k))/20
1639 337205 qi(i, k) = clw(i, k)*fracg
1640 END IF
1641 END IF
1642 !CR: fin test
1643
2/2
✓ Branch 0 taken 2116008 times.
✓ Branch 1 taken 599190 times.
2715198 IF (t(i,k)<263.15) THEN
1644 !CR: on commente les calculs d'Arnaud car division par zero
1645 ! nouveau calcul propose par JYG
1646 ! alv=lv0-clmcpv*(t(i,k)-273.15)
1647 ! alf=lf0-clmci*(t(i,k)-273.15)
1648 ! tg=tp(i,k)
1649 ! tc=tp(i,k)-273.15
1650 ! denom=243.5+tc
1651 ! do j=1,3
1652 ! cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
1653 ! il faudra que esi vienne en argument de la convection
1654 ! cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
1655 ! tbis=t(i,k)+(tp(i,k)-tg)
1656 ! esi=exp(23.33086-(6111.72784/tbis) + &
1657 ! 0.15215*log(tbis))
1658 ! qsat_new=eps*esi/(p(i,k)-esi*(1.-eps))
1659 ! snew=cpd*(1.-qnk(i))+cl*qnk(i)+alv*alv*qsat_new/ &
1660 ! (rrv*tbis*tbis)
1661 ! snew=1./snew
1662 ! print*,esi,qsat_new,snew,'esi,qsat,snew'
1663 ! tp(i,k)=tg+(alf*qi(i,k)+alv*qg*(1.-(esi/es)))*snew
1664 ! print*,k,tp(i,k),qnk(i),'avec glace'
1665 ! print*,'tpNAN',tg,alf,qi(i,k),alv,qg,esi,es,snew
1666 ! enddo
1667
1668 alv = lv0 - clmcpv*(t(i,k)-273.15)
1669 2116008 alf = lf0 + clmci*(t(i,k)-273.15)
1670 2116008 als = alf + alv
1671 2116008 tg = tp(i, k)
1672 2116008 tp(i, k) = t(i, k)
1673
2/2
✓ Branch 0 taken 6348024 times.
✓ Branch 1 taken 2116008 times.
8464032 DO j = 1, 3
1674 6348024 esi = exp(23.33086-(6111.72784/tp(i,k))+0.15215*log(tp(i,k)))
1675 6348024 qsat_new = eps*esi/(p(i,k)-esi*(1.-eps))
1676 snew = cpd*(1.-qnk(i)) + cl*qnk(i) + alv*als*qsat_new/ &
1677 6348024 (rrv*tp(i,k)*tp(i,k))
1678 6348024 snew = 1./snew
1679 ! c print*,esi,qsat_new,snew,'esi,qsat,snew'
1680 tp(i, k) = tp(i, k) + &
1681 ((cpd*(1.-qnk(i))+cl*qnk(i))*(tg-tp(i,k)) + &
1682 8464032 alv*(qg-qsat_new)+alf*qi(i,k))*snew
1683 ! print*,k,tp(i,k),qsat_new,qnk(i),qi(i,k), &
1684 ! 'k,tp,q,qt,qi avec glace'
1685 END DO
1686
1687 !CR:reprise du code AJ
1688 2116008 clw(i, k) = qnk(i) - qsat_new
1689 2116008 clw(i, k) = max(0.0, clw(i,k))
1690 2116008 tvp(i, k) = max(0., tp(i,k)*(1.+qsat_new/eps-qnk(i)))
1691 ! print*,tvp(i,k),'tvp'
1692 END IF
1693
2/2
✓ Branch 0 taken 9 times.
✓ Branch 1 taken 2715189 times.
2715198 IF (clw(i,k)<1.E-11) THEN
1694 9 tp(i, k) = tv(i, k)
1695 9 tvp(i, k) = tv(i, k)
1696 END IF
1697 END IF ! (cvflag_ice)
1698 !jyg<
1699 END IF ! (k>=(icbs(i)+1))
1700 !>jyg
1701 END DO
1702 END DO
1703
1704 !----------------------------------------------------------------------------
1705 !
1706 ENDIF ! (icvflag_Tpa == 2) ELSEIF (icvflag_Tpa == 1) ELSE (icvflag_Tpa == 0)
1707 !
1708 !----------------------------------------------------------------------------
1709 !
1710 ! =====================================================================
1711 ! --- SET THE PRECIPITATION EFFICIENCIES
1712 ! --- THESE MAY BE FUNCTIONS OF TP(I), P(I) AND CLW(I)
1713 ! =====================================================================
1714 !
1715
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 240 times.
240 IF (flag_epkeorig/=1) THEN
1716 DO k = 1, nl ! convect3
1717 DO i = 1, ncum
1718 !jyg<
1719 IF(k>=icb(i)) THEN
1720 !>jyg
1721 pden = ptcrit - pbcrit
1722 ep(i, k) = (plcl(i)-p(i,k)-pbcrit)/pden*epmax
1723 ep(i, k) = max(ep(i,k), 0.0)
1724 ep(i, k) = min(ep(i,k), epmax)
1725 !! sigp(i, k) = spfac ! jyg
1726 ENDIF ! (k>=icb(i))
1727 END DO
1728 END DO
1729 ELSE
1730
2/2
✓ Branch 0 taken 240 times.
✓ Branch 1 taken 6480 times.
6720 DO k = 1, nl
1731
2/2
✓ Branch 0 taken 3431619 times.
✓ Branch 1 taken 6480 times.
3438339 DO i = 1, ncum
1732
2/2
✓ Branch 0 taken 2911168 times.
✓ Branch 1 taken 520451 times.
3438099 IF(k>=icb(i)) THEN
1733 !! IF (k>=(nk(i)+1)) THEN
1734 !>jyg
1735 2911168 tca = tp(i, k) - t0
1736
2/2
✓ Branch 0 taken 563593 times.
✓ Branch 1 taken 2347575 times.
2911168 IF (tca>=0.0) THEN
1737 563593 elacrit = elcrit
1738 ELSE
1739 2347575 elacrit = elcrit*(1.0-tca/tlcrit)
1740 END IF
1741 2911168 elacrit = max(elacrit, 0.0)
1742 2911168 ep(i, k) = 1.0 - elacrit/max(clw(i,k), 1.0E-8)
1743 2911168 ep(i, k) = max(ep(i,k), 0.0)
1744 2911168 ep(i, k) = min(ep(i,k), epmax)
1745 !! sigp(i, k) = spfac ! jyg
1746 END IF ! (k>=icb(i))
1747 END DO
1748 END DO
1749 END IF
1750 !
1751 ! =========================================================================
1752
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 240 times.
240 IF (prt_level >= 10) THEN
1753 print *,'cv3_undilute2.1. tp(1,k), tvp(1,k) ', &
1754 (k, tp(1,k), tvp(1,k), k = 1,nl)
1755 ENDIF
1756 !
1757 ! =====================================================================
1758 ! --- CALCULATE VIRTUAL TEMPERATURE AND LIFTED PARCEL
1759 ! --- VIRTUAL TEMPERATURE
1760 ! =====================================================================
1761
1762 ! dans convect3, tvp est calcule en une seule fois, et sans retirer
1763 ! l'eau condensee (~> reversible CAPE)
1764
1765 ! ori do 340 k=minorig+1,nl
1766 ! ori do 330 i=1,ncum
1767 ! ori if(k.ge.(icb(i)+1))then
1768 ! ori tvp(i,k)=tvp(i,k)*(1.0-qnk(i)+ep(i,k)*clw(i,k))
1769 ! oric print*,'i,k,tvp(i,k),qnk(i),ep(i,k),clw(i,k)'
1770 ! oric print*, i,k,tvp(i,k),qnk(i),ep(i,k),clw(i,k)
1771 ! ori endif
1772 ! ori 330 continue
1773 ! ori 340 continue
1774
1775 ! ori do 350 i=1,ncum
1776 ! ori tvp(i,nlp)=tvp(i,nl)-(gz(i,nlp)-gz(i,nl))/cpd
1777 ! ori 350 continue
1778
1779
2/2
✓ Branch 0 taken 127097 times.
✓ Branch 1 taken 240 times.
127337 DO i = 1, ncum ! convect3
1780 127337 tp(i, nlp) = tp(i, nl) ! convect3
1781 END DO ! convect3
1782
1783 ! =====================================================================
1784 ! --- EFFECTIVE VERTICAL PROFILE OF BUOYANCY (convect3 only):
1785 ! =====================================================================
1786
1787 ! -- this is for convect3 only:
1788
1789 ! first estimate of buoyancy:
1790
1791 !jyg : k-loop outside i-loop (07042015)
1792
2/2
✓ Branch 0 taken 6480 times.
✓ Branch 1 taken 240 times.
6720 DO k = 1, nl
1793
2/2
✓ Branch 0 taken 3431619 times.
✓ Branch 1 taken 6480 times.
3438339 DO i = 1, ncum
1794 3438099 buoy(i, k) = tvp(i, k) - tv(i, k)
1795 END DO
1796 END DO
1797
1798 ! set buoyancy=buoybase for all levels below base
1799 ! for safety, set buoy(icb)=buoybase
1800
1801 !jyg : k-loop outside i-loop (07042015)
1802
2/2
✓ Branch 0 taken 6480 times.
✓ Branch 1 taken 240 times.
6720 DO k = 1, nl
1803
2/2
✓ Branch 0 taken 3431619 times.
✓ Branch 1 taken 6480 times.
3438339 DO i = 1, ncum
1804
4/4
✓ Branch 0 taken 2911168 times.
✓ Branch 1 taken 520451 times.
✓ Branch 2 taken 229384 times.
✓ Branch 3 taken 2681784 times.
3438099 IF ((k>=icb(i)) .AND. (k<=nl) .AND. (p(i,k)>=pbase(i))) THEN
1805 229384 buoy(i, k) = buoybase(i)
1806 END IF
1807 END DO
1808 END DO
1809
2/2
✓ Branch 0 taken 127097 times.
✓ Branch 1 taken 240 times.
127337 DO i = 1, ncum
1810 ! buoy(icb(i),k)=buoybase(i)
1811 127337 buoy(i, icb(i)) = buoybase(i)
1812 END DO
1813
1814 ! -- end convect3
1815
1816 ! =====================================================================
1817 ! --- FIND THE FIRST MODEL LEVEL (INB) ABOVE THE PARCEL'S
1818 ! --- LEVEL OF NEUTRAL BUOYANCY
1819 ! =====================================================================
1820
1821 ! -- this is for convect3 only:
1822
1823
2/2
✓ Branch 0 taken 127097 times.
✓ Branch 1 taken 240 times.
127337 DO i = 1, ncum
1824 127097 inb(i) = nl - 1
1825 127337 iposit(i) = nl
1826 END DO
1827
1828
1829 ! -- iposit(i) = first level, above icb, with positive buoyancy
1830
2/2
✓ Branch 0 taken 6240 times.
✓ Branch 1 taken 240 times.
6480 DO k = 1, nl - 1
1831
2/2
✓ Branch 0 taken 3304522 times.
✓ Branch 1 taken 6240 times.
3311002 DO i = 1, ncum
1832
4/4
✓ Branch 0 taken 2784071 times.
✓ Branch 1 taken 520451 times.
✓ Branch 2 taken 992890 times.
✓ Branch 3 taken 1791181 times.
3310762 IF (k>=icb(i) .AND. buoy(i,k)>0.) THEN
1833 992890 iposit(i) = min(iposit(i), k)
1834 END IF
1835 END DO
1836 END DO
1837
1838
2/2
✓ Branch 0 taken 127097 times.
✓ Branch 1 taken 240 times.
127337 DO i = 1, ncum
1839
2/2
✓ Branch 0 taken 8529 times.
✓ Branch 1 taken 118568 times.
127337 IF (iposit(i)==nl) THEN
1840 8529 iposit(i) = icb(i)
1841 END IF
1842 END DO
1843
1844
2/2
✓ Branch 0 taken 6240 times.
✓ Branch 1 taken 240 times.
6480 DO k = 1, nl - 1
1845
2/2
✓ Branch 0 taken 3304522 times.
✓ Branch 1 taken 6240 times.
3311002 DO i = 1, ncum
1846
4/4
✓ Branch 0 taken 2732454 times.
✓ Branch 1 taken 572068 times.
✓ Branch 2 taken 1715764 times.
✓ Branch 3 taken 1016690 times.
3310762 IF ((k>=iposit(i)) .AND. (buoy(i,k)<dtovsh)) THEN
1847 1715764 inb(i) = min(inb(i), k)
1848 END IF
1849 END DO
1850 END DO
1851
1852 !CR fix computation of inb
1853 !keep flag or modify in all cases?
1854
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 240 times.
240 IF (iflag_mix_adiab.eq.1) THEN
1855 DO i = 1, ncum
1856 cape(i)=0.
1857 inb(i)=icb(i)+1
1858 ENDDO
1859
1860 DO k = 2, nl
1861 DO i = 1, ncum
1862 IF ((k>=iposit(i))) THEN
1863 deltap = min(plcl(i), ph(i,k-1)) - min(plcl(i), ph(i,k))
1864 cape(i) = cape(i) + rrd*buoy(i, k-1)*deltap/p(i, k-1)
1865 IF (cape(i).gt.0.) THEN
1866 inb(i) = max(inb(i), k)
1867 END IF
1868 ENDIF
1869 ENDDO
1870 ENDDO
1871
1872 ! DO i = 1, ncum
1873 ! print*,"inb",inb(i)
1874 ! ENDDO
1875
1876 endif
1877
1878 ! -- end convect3
1879
1880 ! ori do 510 i=1,ncum
1881 ! ori cape(i)=0.0
1882 ! ori capem(i)=0.0
1883 ! ori inb(i)=icb(i)+1
1884 ! ori inb1(i)=inb(i)
1885 ! ori 510 continue
1886
1887 ! Originial Code
1888
1889 ! do 530 k=minorig+1,nl-1
1890 ! do 520 i=1,ncum
1891 ! if(k.ge.(icb(i)+1))then
1892 ! by=(tvp(i,k)-tv(i,k))*dph(i,k)/p(i,k)
1893 ! byp=(tvp(i,k+1)-tv(i,k+1))*dph(i,k+1)/p(i,k+1)
1894 ! cape(i)=cape(i)+by
1895 ! if(by.ge.0.0)inb1(i)=k+1
1896 ! if(cape(i).gt.0.0)then
1897 ! inb(i)=k+1
1898 ! capem(i)=cape(i)
1899 ! endif
1900 ! endif
1901 !520 continue
1902 !530 continue
1903 ! do 540 i=1,ncum
1904 ! byp=(tvp(i,nl)-tv(i,nl))*dph(i,nl)/p(i,nl)
1905 ! cape(i)=capem(i)+byp
1906 ! defrac=capem(i)-cape(i)
1907 ! defrac=max(defrac,0.001)
1908 ! frac(i)=-cape(i)/defrac
1909 ! frac(i)=min(frac(i),1.0)
1910 ! frac(i)=max(frac(i),0.0)
1911 !540 continue
1912
1913 ! K Emanuel fix
1914
1915 ! call zilch(byp,ncum)
1916 ! do 530 k=minorig+1,nl-1
1917 ! do 520 i=1,ncum
1918 ! if(k.ge.(icb(i)+1))then
1919 ! by=(tvp(i,k)-tv(i,k))*dph(i,k)/p(i,k)
1920 ! cape(i)=cape(i)+by
1921 ! if(by.ge.0.0)inb1(i)=k+1
1922 ! if(cape(i).gt.0.0)then
1923 ! inb(i)=k+1
1924 ! capem(i)=cape(i)
1925 ! byp(i)=(tvp(i,k+1)-tv(i,k+1))*dph(i,k+1)/p(i,k+1)
1926 ! endif
1927 ! endif
1928 !520 continue
1929 !530 continue
1930 ! do 540 i=1,ncum
1931 ! inb(i)=max(inb(i),inb1(i))
1932 ! cape(i)=capem(i)+byp(i)
1933 ! defrac=capem(i)-cape(i)
1934 ! defrac=max(defrac,0.001)
1935 ! frac(i)=-cape(i)/defrac
1936 ! frac(i)=min(frac(i),1.0)
1937 ! frac(i)=max(frac(i),0.0)
1938 !540 continue
1939
1940 ! J Teixeira fix
1941
1942 ! ori call zilch(byp,ncum)
1943 ! ori do 515 i=1,ncum
1944 ! ori lcape(i)=.true.
1945 ! ori 515 continue
1946 ! ori do 530 k=minorig+1,nl-1
1947 ! ori do 520 i=1,ncum
1948 ! ori if(cape(i).lt.0.0)lcape(i)=.false.
1949 ! ori if((k.ge.(icb(i)+1)).and.lcape(i))then
1950 ! ori by=(tvp(i,k)-tv(i,k))*dph(i,k)/p(i,k)
1951 ! ori byp(i)=(tvp(i,k+1)-tv(i,k+1))*dph(i,k+1)/p(i,k+1)
1952 ! ori cape(i)=cape(i)+by
1953 ! ori if(by.ge.0.0)inb1(i)=k+1
1954 ! ori if(cape(i).gt.0.0)then
1955 ! ori inb(i)=k+1
1956 ! ori capem(i)=cape(i)
1957 ! ori endif
1958 ! ori endif
1959 ! ori 520 continue
1960 ! ori 530 continue
1961 ! ori do 540 i=1,ncum
1962 ! ori cape(i)=capem(i)+byp(i)
1963 ! ori defrac=capem(i)-cape(i)
1964 ! ori defrac=max(defrac,0.001)
1965 ! ori frac(i)=-cape(i)/defrac
1966 ! ori frac(i)=min(frac(i),1.0)
1967 ! ori frac(i)=max(frac(i),0.0)
1968 ! ori 540 continue
1969
1970 ! --------------------------------------------------------------------
1971 ! Prevent convection when top is too hot
1972 ! --------------------------------------------------------------------
1973
2/2
✓ Branch 0 taken 127097 times.
✓ Branch 1 taken 240 times.
127337 DO i = 1,ncum
1974
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 127097 times.
127337 IF (t(i,inb(i)) > T_top_max) iflag(i) = 10
1975 ENDDO
1976
1977 ! =====================================================================
1978 ! --- CALCULATE LIQUID WATER STATIC ENERGY OF LIFTED PARCEL
1979 ! =====================================================================
1980
1981
2/2
✓ Branch 0 taken 6480 times.
✓ Branch 1 taken 240 times.
6720 DO k = 1, nl
1982
2/2
✓ Branch 0 taken 3431619 times.
✓ Branch 1 taken 6480 times.
3438339 DO i = 1, ncum
1983 3438099 hp(i, k) = h(i, k)
1984 END DO
1985 END DO
1986
1987 !jyg : cvflag_ice test outside the loops (07042015)
1988 !
1989
1/2
✓ Branch 0 taken 240 times.
✗ Branch 1 not taken.
240 IF (cvflag_ice) THEN
1990 !
1991
1/2
✓ Branch 0 taken 240 times.
✗ Branch 1 not taken.
240 IF (cvflag_prec_eject) THEN
1992 !! DO k = minorig + 1, nl
1993 !! DO i = 1, ncum
1994 !! IF ((k>=icb(i)) .AND. (k<=inb(i))) THEN
1995 !! frac_s(i,k) = qi(i,k)/max(clw(i,k),smallestreal)
1996 !! frac_s(i,k) = 1. - (qpl(i,k)+(1.-frac_s(i,k))*qcld(i,k))/max(clw(i,k),smallestreal)
1997 !! END IF
1998 !! END DO
1999 !! END DO
2000 ELSE ! (cvflag_prec_eject)
2001
2/2
✓ Branch 0 taken 6240 times.
✓ Branch 1 taken 240 times.
6480 DO k = minorig + 1, nl
2002
2/2
✓ Branch 0 taken 3304522 times.
✓ Branch 1 taken 6240 times.
3311002 DO i = 1, ncum
2003
4/4
✓ Branch 0 taken 2911168 times.
✓ Branch 1 taken 393354 times.
✓ Branch 2 taken 1144704 times.
✓ Branch 3 taken 1766464 times.
3310762 IF ((k>=icb(i)) .AND. (k<=inb(i))) THEN
2004 !jyg< frac computation moved to beginning of cv3_undilute2.
2005 ! kept here for compatibility test with CMip6 version
2006 1144704 frac_s(i, k) = 1. - (t(i,k)-243.15)/(263.15-243.15)
2007 1144704 frac_s(i, k) = min(max(frac_s(i,k),0.0), 1.0)
2008 END IF
2009 END DO
2010 END DO
2011 ENDIF ! (cvflag_prec_eject) ELSE
2012
2/2
✓ Branch 0 taken 6240 times.
✓ Branch 1 taken 240 times.
6480 DO k = minorig + 1, nl
2013
2/2
✓ Branch 0 taken 3304522 times.
✓ Branch 1 taken 6240 times.
3311002 DO i = 1, ncum
2014
4/4
✓ Branch 0 taken 2911168 times.
✓ Branch 1 taken 393354 times.
✓ Branch 2 taken 1144704 times.
✓ Branch 3 taken 1766464 times.
3310762 IF ((k>=icb(i)) .AND. (k<=inb(i))) THEN
2015 !! hp(i, k) = hnk(i) + (lv(i,k)+(cpd-cpv)*t(i,k)+frac_s(i,k)*lf(i,k))* & !!jygprl
2016 !! ep(i, k)*clw(i, k) !!jygprl
2017 hp(i, k) = hla(i,k-1) + (lv(i,k)+(cpd-cpv)*t(i,k)+frac_s(i,k)*lf(i,k))* & !!jygprl
2018 1144704 ep(i, k)*clw(i, k) !!jygprl
2019 END IF
2020 END DO
2021 END DO
2022 !
2023 ELSE ! (cvflag_ice)
2024 !
2025 DO k = minorig + 1, nl
2026 DO i = 1, ncum
2027 IF ((k>=icb(i)) .AND. (k<=inb(i))) THEN
2028 !jyg< (energy conservation tests)
2029 !! hp(i, k) = hnk(i) + (lv(i,k)+(cpd-cpv)*tp(i,k))*ep(i, k)*clw(i, k)
2030 !! hp(i, k) = ( hnk(i) + (lv(i,k)+(cpd-cpv)*t(i,k))*ep(i, k)*clw(i, k) ) / &
2031 !! (1. - ep(i,k)*clw(i,k))
2032 !! hp(i, k) = ( hnk(i) + (lv(i,k)+(cpd-cl)*t(i,k))*ep(i, k)*clw(i, k) ) / &
2033 !! (1. - ep(i,k)*clw(i,k))
2034 hp(i, k) = hnk(i) + (lv(i,k)+(cpd-cpv)*t(i,k))*ep(i, k)*clw(i, k)
2035 END IF
2036 END DO
2037 END DO
2038 !
2039 END IF ! (cvflag_ice)
2040
2041 240 RETURN
2042 END SUBROUTINE cv3_undilute2
2043
2044 SUBROUTINE cv3_closure(nloc, ncum, nd, icb, inb, &
2045 pbase, p, ph, tv, buoy, &
2046 sig, w0, cape, m, iflag)
2047 IMPLICIT NONE
2048
2049 ! ===================================================================
2050 ! --- CLOSURE OF CONVECT3
2051 !
2052 ! vectorization: S. Bony
2053 ! ===================================================================
2054
2055 include "cvthermo.h"
2056 include "cv3param.h"
2057
2058 !input:
2059 INTEGER ncum, nd, nloc
2060 INTEGER icb(nloc), inb(nloc)
2061 REAL pbase(nloc)
2062 REAL p(nloc, nd), ph(nloc, nd+1)
2063 REAL tv(nloc, nd), buoy(nloc, nd)
2064
2065 !input/output:
2066 REAL sig(nloc, nd), w0(nloc, nd)
2067 INTEGER iflag(nloc)
2068
2069 !output:
2070 REAL cape(nloc)
2071 REAL m(nloc, nd)
2072
2073 !local variables:
2074 INTEGER i, j, k, icbmax
2075 REAL deltap, fac, w, amu
2076 REAL dtmin(nloc, nd), sigold(nloc, nd)
2077 REAL cbmflast(nloc)
2078
2079
2080 ! -------------------------------------------------------
2081 ! -- Initialization
2082 ! -------------------------------------------------------
2083
2084 DO k = 1, nl
2085 DO i = 1, ncum
2086 m(i, k) = 0.0
2087 END DO
2088 END DO
2089
2090 ! -------------------------------------------------------
2091 ! -- Reset sig(i) and w0(i) for i>inb and i<icb
2092 ! -------------------------------------------------------
2093
2094 ! update sig and w0 above LNB:
2095
2096 DO k = 1, nl - 1
2097 DO i = 1, ncum
2098 IF ((inb(i)<(nl-1)) .AND. (k>=(inb(i)+1))) THEN
2099 sig(i, k) = beta*sig(i, k) + &
2100 2.*alpha*buoy(i, inb(i))*abs(buoy(i,inb(i)))
2101 sig(i, k) = amax1(sig(i,k), 0.0)
2102 w0(i, k) = beta*w0(i, k)
2103 END IF
2104 END DO
2105 END DO
2106
2107 ! compute icbmax:
2108
2109 icbmax = 2
2110 DO i = 1, ncum
2111 icbmax = max(icbmax, icb(i))
2112 END DO
2113
2114 ! update sig and w0 below cloud base:
2115
2116 DO k = 1, icbmax
2117 DO i = 1, ncum
2118 IF (k<=icb(i)) THEN
2119 sig(i, k) = beta*sig(i, k) - &
2120 2.*alpha*buoy(i, icb(i))*buoy(i, icb(i))
2121 sig(i, k) = max(sig(i,k), 0.0)
2122 w0(i, k) = beta*w0(i, k)
2123 END IF
2124 END DO
2125 END DO
2126
2127 !! if(inb.lt.(nl-1))then
2128 !! do 85 i=inb+1,nl-1
2129 !! sig(i)=beta*sig(i)+2.*alpha*buoy(inb)*
2130 !! 1 abs(buoy(inb))
2131 !! sig(i)=max(sig(i),0.0)
2132 !! w0(i)=beta*w0(i)
2133 !! 85 continue
2134 !! end if
2135
2136 !! do 87 i=1,icb
2137 !! sig(i)=beta*sig(i)-2.*alpha*buoy(icb)*buoy(icb)
2138 !! sig(i)=max(sig(i),0.0)
2139 !! w0(i)=beta*w0(i)
2140 !! 87 continue
2141
2142 ! -------------------------------------------------------------
2143 ! -- Reset fractional areas of updrafts and w0 at initial time
2144 ! -- and after 10 time steps of no convection
2145 ! -------------------------------------------------------------
2146
2147 DO k = 1, nl - 1
2148 DO i = 1, ncum
2149 IF (sig(i,nd)<1.5 .OR. sig(i,nd)>12.0) THEN
2150 sig(i, k) = 0.0
2151 w0(i, k) = 0.0
2152 END IF
2153 END DO
2154 END DO
2155
2156 ! -------------------------------------------------------------
2157 ! -- Calculate convective available potential energy (cape),
2158 ! -- vertical velocity (w), fractional area covered by
2159 ! -- undilute updraft (sig), and updraft mass flux (m)
2160 ! -------------------------------------------------------------
2161
2162 DO i = 1, ncum
2163 cape(i) = 0.0
2164 END DO
2165
2166 ! compute dtmin (minimum buoyancy between ICB and given level k):
2167
2168 DO i = 1, ncum
2169 DO k = 1, nl
2170 dtmin(i, k) = 100.0
2171 END DO
2172 END DO
2173
2174 DO i = 1, ncum
2175 DO k = 1, nl
2176 DO j = minorig, nl
2177 IF ((k>=(icb(i)+1)) .AND. (k<=inb(i)) .AND. (j>=icb(i)) .AND. (j<=(k-1))) THEN
2178 dtmin(i, k) = amin1(dtmin(i,k), buoy(i,j))
2179 END IF
2180 END DO
2181 END DO
2182 END DO
2183
2184 ! the interval on which cape is computed starts at pbase :
2185
2186 DO k = 1, nl
2187 DO i = 1, ncum
2188
2189 IF ((k>=(icb(i)+1)) .AND. (k<=inb(i))) THEN
2190
2191 deltap = min(pbase(i), ph(i,k-1)) - min(pbase(i), ph(i,k))
2192 cape(i) = cape(i) + rrd*buoy(i, k-1)*deltap/p(i, k-1)
2193 cape(i) = amax1(0.0, cape(i))
2194 sigold(i, k) = sig(i, k)
2195
2196 ! dtmin(i,k)=100.0
2197 ! do 97 j=icb(i),k-1 ! mauvaise vectorisation
2198 ! dtmin(i,k)=AMIN1(dtmin(i,k),buoy(i,j))
2199 ! 97 continue
2200
2201 sig(i, k) = beta*sig(i, k) + alpha*dtmin(i, k)*abs(dtmin(i,k))
2202 sig(i, k) = max(sig(i,k), 0.0)
2203 sig(i, k) = amin1(sig(i,k), 0.01)
2204 fac = amin1(((dtcrit-dtmin(i,k))/dtcrit), 1.0)
2205 w = (1.-beta)*fac*sqrt(cape(i)) + beta*w0(i, k)
2206 amu = 0.5*(sig(i,k)+sigold(i,k))*w
2207 m(i, k) = amu*0.007*p(i, k)*(ph(i,k)-ph(i,k+1))/tv(i, k)
2208 w0(i, k) = w
2209 END IF
2210
2211 END DO
2212 END DO
2213
2214 DO i = 1, ncum
2215 w0(i, icb(i)) = 0.5*w0(i, icb(i)+1)
2216 m(i, icb(i)) = 0.5*m(i, icb(i)+1)*(ph(i,icb(i))-ph(i,icb(i)+1))/(ph(i,icb(i)+1)-ph(i,icb(i)+2))
2217 sig(i, icb(i)) = sig(i, icb(i)+1)
2218 sig(i, icb(i)-1) = sig(i, icb(i))
2219 END DO
2220
2221 ! ccc 3. Compute final cloud base mass flux and set iflag to 3 if
2222 ! ccc cloud base mass flux is exceedingly small and is decreasing (i.e. if
2223 ! ccc the final mass flux (cbmflast) is greater than the target mass flux
2224 ! ccc (cbmf) ??).
2225 ! cc
2226 ! c do i = 1,ncum
2227 ! c cbmflast(i) = 0.
2228 ! c enddo
2229 ! cc
2230 ! c do k= 1,nl
2231 ! c do i = 1,ncum
2232 ! c IF (k .ge. icb(i) .and. k .le. inb(i)) THEN
2233 ! c cbmflast(i) = cbmflast(i)+M(i,k)
2234 ! c ENDIF
2235 ! c enddo
2236 ! c enddo
2237 ! cc
2238 ! c do i = 1,ncum
2239 ! c IF (cbmflast(i) .lt. 1.e-6) THEN
2240 ! c iflag(i) = 3
2241 ! c ENDIF
2242 ! c enddo
2243 ! cc
2244 ! c do k= 1,nl
2245 ! c do i = 1,ncum
2246 ! c IF (iflag(i) .ge. 3) THEN
2247 ! c M(i,k) = 0.
2248 ! c sig(i,k) = 0.
2249 ! c w0(i,k) = 0.
2250 ! c ENDIF
2251 ! c enddo
2252 ! c enddo
2253 ! cc
2254 !! cape=0.0
2255 !! do 98 i=icb+1,inb
2256 !! deltap = min(pbase,ph(i-1))-min(pbase,ph(i))
2257 !! cape=cape+rrd*buoy(i-1)*deltap/p(i-1)
2258 !! dcape=rrd*buoy(i-1)*deltap/p(i-1)
2259 !! dlnp=deltap/p(i-1)
2260 !! cape=max(0.0,cape)
2261 !! sigold=sig(i)
2262
2263 !! dtmin=100.0
2264 !! do 97 j=icb,i-1
2265 !! dtmin=amin1(dtmin,buoy(j))
2266 !! 97 continue
2267
2268 !! sig(i)=beta*sig(i)+alpha*dtmin*abs(dtmin)
2269 !! sig(i)=max(sig(i),0.0)
2270 !! sig(i)=amin1(sig(i),0.01)
2271 !! fac=amin1(((dtcrit-dtmin)/dtcrit),1.0)
2272 !! w=(1.-beta)*fac*sqrt(cape)+beta*w0(i)
2273 !! amu=0.5*(sig(i)+sigold)*w
2274 !! m(i)=amu*0.007*p(i)*(ph(i)-ph(i+1))/tv(i)
2275 !! w0(i)=w
2276 !! 98 continue
2277 !! w0(icb)=0.5*w0(icb+1)
2278 !! m(icb)=0.5*m(icb+1)*(ph(icb)-ph(icb+1))/(ph(icb+1)-ph(icb+2))
2279 !! sig(icb)=sig(icb+1)
2280 !! sig(icb-1)=sig(icb)
2281
2282 RETURN
2283 END SUBROUTINE cv3_closure
2284
2285 SUBROUTINE cv3_mixing(nloc, ncum, nd, na, ntra, icb, nk, inb, &
2286 ph, t, rr, rs, u, v, tra, h, lv, lf, frac, qnk, &
2287 unk, vnk, hp, tv, tvp, ep, clw, m, sig, &
2288 ment, qent, uent, vent, nent, sij, elij, ments, qents, traent)
2289 IMPLICIT NONE
2290
2291 ! ---------------------------------------------------------------------
2292 ! a faire:
2293 ! - vectorisation de la partie normalisation des flux (do 789...)
2294 ! ---------------------------------------------------------------------
2295
2296 include "cvthermo.h"
2297 include "cv3param.h"
2298 include "cvflag.h"
2299
2300 !inputs:
2301 INTEGER, INTENT (IN) :: ncum, nd, na, ntra, nloc
2302 INTEGER, DIMENSION (nloc), INTENT (IN) :: icb, inb, nk
2303 REAL, DIMENSION (nloc, nd), INTENT (IN) :: sig
2304 REAL, DIMENSION (nloc), INTENT (IN) :: qnk, unk, vnk
2305 REAL, DIMENSION (nloc, nd+1), INTENT (IN) :: ph
2306 REAL, DIMENSION (nloc, nd), INTENT (IN) :: t, rr, rs
2307 REAL, DIMENSION (nloc, nd), INTENT (IN) :: u, v
2308 REAL, DIMENSION (nloc, nd, ntra), INTENT (IN) :: tra ! input of convect3
2309 REAL, DIMENSION (nloc, na), INTENT (IN) :: lv, h, hp
2310 REAL, DIMENSION (nloc, na), INTENT (IN) :: lf, frac
2311 REAL, DIMENSION (nloc, na), INTENT (IN) :: tv, tvp, ep, clw
2312 REAL, DIMENSION (nloc, na), INTENT (IN) :: m ! input of convect3
2313
2314 !outputs:
2315 REAL, DIMENSION (nloc, na, na), INTENT (OUT) :: ment, qent
2316 REAL, DIMENSION (nloc, na, na), INTENT (OUT) :: uent, vent
2317 REAL, DIMENSION (nloc, na, na), INTENT (OUT) :: sij, elij
2318 REAL, DIMENSION (nloc, nd, nd, ntra), INTENT (OUT) :: traent
2319 REAL, DIMENSION (nloc, nd, nd), INTENT (OUT) :: ments, qents
2320 INTEGER, DIMENSION (nloc, nd), INTENT (OUT) :: nent
2321
2322 !local variables:
2323 INTEGER i, j, k, il, im, jm
2324 INTEGER num1, num2
2325 REAL rti, bf2, anum, denom, dei, altem, cwat, stemp, qp
2326 REAL alt, smid, sjmin, sjmax, delp, delm
2327 REAL asij(nloc), smax(nloc), scrit(nloc)
2328 REAL asum(nloc, nd), bsum(nloc, nd), csum(nloc, nd)
2329 REAL sigij(nloc, nd, nd)
2330 REAL wgh
2331 REAL zm(nloc, na)
2332 LOGICAL lwork(nloc)
2333
2334 ! =====================================================================
2335 ! --- INITIALIZE VARIOUS ARRAYS USED IN THE COMPUTATIONS
2336 ! =====================================================================
2337
2338 ! ori do 360 i=1,ncum*nlp
2339 DO j = 1, nl
2340 DO i = 1, ncum
2341 nent(i, j) = 0
2342 ! in convect3, m is computed in cv3_closure
2343 ! ori m(i,1)=0.0
2344 END DO
2345 END DO
2346
2347 ! ori do 400 k=1,nlp
2348 ! ori do 390 j=1,nlp
2349 DO j = 1, nl
2350 DO k = 1, nl
2351 DO i = 1, ncum
2352 qent(i, k, j) = rr(i, j)
2353 uent(i, k, j) = u(i, j)
2354 vent(i, k, j) = v(i, j)
2355 elij(i, k, j) = 0.0
2356 !ym ment(i,k,j)=0.0
2357 !ym sij(i,k,j)=0.0
2358 END DO
2359 END DO
2360 END DO
2361
2362 !ym
2363 ment(1:ncum, 1:nd, 1:nd) = 0.0
2364 sij(1:ncum, 1:nd, 1:nd) = 0.0
2365
2366 !AC! do k=1,ntra
2367 !AC! do j=1,nd ! instead nlp
2368 !AC! do i=1,nd ! instead nlp
2369 !AC! do il=1,ncum
2370 !AC! traent(il,i,j,k)=tra(il,j,k)
2371 !AC! enddo
2372 !AC! enddo
2373 !AC! enddo
2374 !AC! enddo
2375 zm(:, :) = 0.
2376
2377 ! =====================================================================
2378 ! --- CALCULATE ENTRAINED AIR MASS FLUX (ment), TOTAL WATER MIXING
2379 ! --- RATIO (QENT), TOTAL CONDENSED WATER (elij), AND MIXING
2380 ! --- FRACTION (sij)
2381 ! =====================================================================
2382
2383 DO i = minorig + 1, nl
2384
2385 DO j = minorig, nl
2386 DO il = 1, ncum
2387 IF ((i>=icb(il)) .AND. (i<=inb(il)) .AND. (j>=(icb(il)-1)) .AND. (j<=inb(il))) THEN
2388
2389 rti = qnk(il) - ep(il, i)*clw(il, i)
2390 bf2 = 1. + lv(il, j)*lv(il, j)*rs(il, j)/(rrv*t(il,j)*t(il,j)*cpd)
2391
2392
2393 IF (cvflag_ice) THEN
2394 ! print*,cvflag_ice,'cvflag_ice dans do 700'
2395 IF (t(il,j)<=263.15) THEN
2396 bf2 = 1. + (lf(il,j)+lv(il,j))*(lv(il,j)+frac(il,j)* &
2397 lf(il,j))*rs(il, j)/(rrv*t(il,j)*t(il,j)*cpd)
2398 END IF
2399 END IF
2400
2401 anum = h(il, j) - hp(il, i) + (cpv-cpd)*t(il, j)*(rti-rr(il,j))
2402 denom = h(il, i) - hp(il, i) + (cpd-cpv)*(rr(il,i)-rti)*t(il, j)
2403 dei = denom
2404 IF (abs(dei)<0.01) dei = 0.01
2405 sij(il, i, j) = anum/dei
2406 sij(il, i, i) = 1.0
2407 altem = sij(il, i, j)*rr(il, i) + (1.-sij(il,i,j))*rti - rs(il, j)
2408 altem = altem/bf2
2409 cwat = clw(il, j)*(1.-ep(il,j))
2410 stemp = sij(il, i, j)
2411 IF ((stemp<0.0 .OR. stemp>1.0 .OR. altem>cwat) .AND. j>i) THEN
2412
2413 IF (cvflag_ice) THEN
2414 anum = anum - (lv(il,j)+frac(il,j)*lf(il,j))*(rti-rs(il,j)-cwat*bf2)
2415 denom = denom + (lv(il,j)+frac(il,j)*lf(il,j))*(rr(il,i)-rti)
2416 ELSE
2417 anum = anum - lv(il, j)*(rti-rs(il,j)-cwat*bf2)
2418 denom = denom + lv(il, j)*(rr(il,i)-rti)
2419 END IF
2420
2421 IF (abs(denom)<0.01) denom = 0.01
2422 sij(il, i, j) = anum/denom
2423 altem = sij(il, i, j)*rr(il, i) + (1.-sij(il,i,j))*rti - rs(il, j)
2424 altem = altem - (bf2-1.)*cwat
2425 END IF
2426 IF (sij(il,i,j)>0.0 .AND. sij(il,i,j)<0.95) THEN
2427 qent(il, i, j) = sij(il, i, j)*rr(il, i) + (1.-sij(il,i,j))*rti
2428 uent(il, i, j) = sij(il, i, j)*u(il, i) + (1.-sij(il,i,j))*unk(il)
2429 vent(il, i, j) = sij(il, i, j)*v(il, i) + (1.-sij(il,i,j))*vnk(il)
2430 !!!! do k=1,ntra
2431 !!!! traent(il,i,j,k)=sij(il,i,j)*tra(il,i,k)
2432 !!!! : +(1.-sij(il,i,j))*tra(il,nk(il),k)
2433 !!!! end do
2434 elij(il, i, j) = altem
2435 elij(il, i, j) = max(0.0, elij(il,i,j))
2436 ment(il, i, j) = m(il, i)/(1.-sij(il,i,j))
2437 nent(il, i) = nent(il, i) + 1
2438 END IF
2439 sij(il, i, j) = max(0.0, sij(il,i,j))
2440 sij(il, i, j) = amin1(1.0, sij(il,i,j))
2441 END IF ! new
2442 END DO
2443 END DO
2444
2445 !AC! do k=1,ntra
2446 !AC! do j=minorig,nl
2447 !AC! do il=1,ncum
2448 !AC! if( (i.ge.icb(il)).and.(i.le.inb(il)).and.
2449 !AC! : (j.ge.(icb(il)-1)).and.(j.le.inb(il)))then
2450 !AC! traent(il,i,j,k)=sij(il,i,j)*tra(il,i,k)
2451 !AC! : +(1.-sij(il,i,j))*tra(il,nk(il),k)
2452 !AC! endif
2453 !AC! enddo
2454 !AC! enddo
2455 !AC! enddo
2456
2457
2458 ! *** if no air can entrain at level i assume that updraft detrains ***
2459 ! *** at that level and calculate detrained air flux and properties ***
2460
2461
2462 ! @ do 170 i=icb(il),inb(il)
2463
2464 DO il = 1, ncum
2465 IF ((i>=icb(il)) .AND. (i<=inb(il)) .AND. (nent(il,i)==0)) THEN
2466 ! @ if(nent(il,i).eq.0)then
2467 ment(il, i, i) = m(il, i)
2468 qent(il, i, i) = qnk(il) - ep(il, i)*clw(il, i)
2469 uent(il, i, i) = unk(il)
2470 vent(il, i, i) = vnk(il)
2471 elij(il, i, i) = clw(il, i)
2472 ! MAF sij(il,i,i)=1.0
2473 sij(il, i, i) = 0.0
2474 END IF
2475 END DO
2476 END DO
2477
2478 !AC! do j=1,ntra
2479 !AC! do i=minorig+1,nl
2480 !AC! do il=1,ncum
2481 !AC! if (i.ge.icb(il) .and. i.le.inb(il) .and. nent(il,i).eq.0) then
2482 !AC! traent(il,i,i,j)=tra(il,nk(il),j)
2483 !AC! endif
2484 !AC! enddo
2485 !AC! enddo
2486 !AC! enddo
2487
2488 DO j = minorig, nl
2489 DO i = minorig, nl
2490 DO il = 1, ncum
2491 IF ((j>=(icb(il)-1)) .AND. (j<=inb(il)) .AND. (i>=icb(il)) .AND. (i<=inb(il))) THEN
2492 sigij(il, i, j) = sij(il, i, j)
2493 END IF
2494 END DO
2495 END DO
2496 END DO
2497 ! @ enddo
2498
2499 ! @170 continue
2500
2501 ! =====================================================================
2502 ! --- NORMALIZE ENTRAINED AIR MASS FLUXES
2503 ! --- TO REPRESENT EQUAL PROBABILITIES OF MIXING
2504 ! =====================================================================
2505
2506 CALL zilch(asum, nloc*nd)
2507 CALL zilch(csum, nloc*nd)
2508 CALL zilch(csum, nloc*nd)
2509
2510 DO il = 1, ncum
2511 lwork(il) = .FALSE.
2512 END DO
2513
2514 DO i = minorig + 1, nl
2515
2516 num1 = 0
2517 DO il = 1, ncum
2518 IF (i>=icb(il) .AND. i<=inb(il)) num1 = num1 + 1
2519 END DO
2520 IF (num1<=0) GO TO 789
2521
2522
2523 DO il = 1, ncum
2524 IF (i>=icb(il) .AND. i<=inb(il)) THEN
2525 lwork(il) = (nent(il,i)/=0)
2526 qp = qnk(il) - ep(il, i)*clw(il, i)
2527
2528 IF (cvflag_ice) THEN
2529
2530 anum = h(il, i) - hp(il, i) - (lv(il,i)+frac(il,i)*lf(il,i))* &
2531 (qp-rs(il,i)) + (cpv-cpd)*t(il, i)*(qp-rr(il,i))
2532 denom = h(il, i) - hp(il, i) + (lv(il,i)+frac(il,i)*lf(il,i))* &
2533 (rr(il,i)-qp) + (cpd-cpv)*t(il, i)*(rr(il,i)-qp)
2534 ELSE
2535
2536 anum = h(il, i) - hp(il, i) - lv(il, i)*(qp-rs(il,i)) + &
2537 (cpv-cpd)*t(il, i)*(qp-rr(il,i))
2538 denom = h(il, i) - hp(il, i) + lv(il, i)*(rr(il,i)-qp) + &
2539 (cpd-cpv)*t(il, i)*(rr(il,i)-qp)
2540 END IF
2541
2542 IF (abs(denom)<0.01) denom = 0.01
2543 scrit(il) = anum/denom
2544 alt = qp - rs(il, i) + scrit(il)*(rr(il,i)-qp)
2545 IF (scrit(il)<=0.0 .OR. alt<=0.0) scrit(il) = 1.0
2546 smax(il) = 0.0
2547 asij(il) = 0.0
2548 END IF
2549 END DO
2550
2551 DO j = nl, minorig, -1
2552
2553 num2 = 0
2554 DO il = 1, ncum
2555 IF (i>=icb(il) .AND. i<=inb(il) .AND. &
2556 j>=(icb(il)-1) .AND. j<=inb(il) .AND. &
2557 lwork(il)) num2 = num2 + 1
2558 END DO
2559 IF (num2<=0) GO TO 175
2560
2561 DO il = 1, ncum
2562 IF (i>=icb(il) .AND. i<=inb(il) .AND. &
2563 j>=(icb(il)-1) .AND. j<=inb(il) .AND. &
2564 lwork(il)) THEN
2565
2566 IF (sij(il,i,j)>1.0E-16 .AND. sij(il,i,j)<0.95) THEN
2567 wgh = 1.0
2568 IF (j>i) THEN
2569 sjmax = max(sij(il,i,j+1), smax(il))
2570 sjmax = amin1(sjmax, scrit(il))
2571 smax(il) = max(sij(il,i,j), smax(il))
2572 sjmin = max(sij(il,i,j-1), smax(il))
2573 sjmin = amin1(sjmin, scrit(il))
2574 IF (sij(il,i,j)<(smax(il)-1.0E-16)) wgh = 0.0
2575 smid = amin1(sij(il,i,j), scrit(il))
2576 ELSE
2577 sjmax = max(sij(il,i,j+1), scrit(il))
2578 smid = max(sij(il,i,j), scrit(il))
2579 sjmin = 0.0
2580 IF (j>1) sjmin = sij(il, i, j-1)
2581 sjmin = max(sjmin, scrit(il))
2582 END IF
2583 delp = abs(sjmax-smid)
2584 delm = abs(sjmin-smid)
2585 asij(il) = asij(il) + wgh*(delp+delm)
2586 ment(il, i, j) = ment(il, i, j)*(delp+delm)*wgh
2587 END IF
2588 END IF
2589 END DO
2590
2591 175 END DO
2592
2593 DO il = 1, ncum
2594 IF (i>=icb(il) .AND. i<=inb(il) .AND. lwork(il)) THEN
2595 asij(il) = max(1.0E-16, asij(il))
2596 asij(il) = 1.0/asij(il)
2597 asum(il, i) = 0.0
2598 bsum(il, i) = 0.0
2599 csum(il, i) = 0.0
2600 END IF
2601 END DO
2602
2603 DO j = minorig, nl
2604 DO il = 1, ncum
2605 IF (i>=icb(il) .AND. i<=inb(il) .AND. lwork(il) .AND. &
2606 j>=(icb(il)-1) .AND. j<=inb(il)) THEN
2607 ment(il, i, j) = ment(il, i, j)*asij(il)
2608 END IF
2609 END DO
2610 END DO
2611
2612 DO j = minorig, nl
2613 DO il = 1, ncum
2614 IF (i>=icb(il) .AND. i<=inb(il) .AND. lwork(il) .AND. &
2615 j>=(icb(il)-1) .AND. j<=inb(il)) THEN
2616 asum(il, i) = asum(il, i) + ment(il, i, j)
2617 ment(il, i, j) = ment(il, i, j)*sig(il, j)
2618 bsum(il, i) = bsum(il, i) + ment(il, i, j)
2619 END IF
2620 END DO
2621 END DO
2622
2623 DO il = 1, ncum
2624 IF (i>=icb(il) .AND. i<=inb(il) .AND. lwork(il)) THEN
2625 bsum(il, i) = max(bsum(il,i), 1.0E-16)
2626 bsum(il, i) = 1.0/bsum(il, i)
2627 END IF
2628 END DO
2629
2630 DO j = minorig, nl
2631 DO il = 1, ncum
2632 IF (i>=icb(il) .AND. i<=inb(il) .AND. lwork(il) .AND. &
2633 j>=(icb(il)-1) .AND. j<=inb(il)) THEN
2634 ment(il, i, j) = ment(il, i, j)*asum(il, i)*bsum(il, i)
2635 END IF
2636 END DO
2637 END DO
2638
2639 DO j = minorig, nl
2640 DO il = 1, ncum
2641 IF (i>=icb(il) .AND. i<=inb(il) .AND. lwork(il) .AND. &
2642 j>=(icb(il)-1) .AND. j<=inb(il)) THEN
2643 csum(il, i) = csum(il, i) + ment(il, i, j)
2644 END IF
2645 END DO
2646 END DO
2647
2648 DO il = 1, ncum
2649 IF (i>=icb(il) .AND. i<=inb(il) .AND. lwork(il) .AND. &
2650 csum(il,i)<m(il,i)) THEN
2651 nent(il, i) = 0
2652 ment(il, i, i) = m(il, i)
2653 qent(il, i, i) = qnk(il) - ep(il, i)*clw(il, i)
2654 uent(il, i, i) = unk(il)
2655 vent(il, i, i) = vnk(il)
2656 elij(il, i, i) = clw(il, i)
2657 ! MAF sij(il,i,i)=1.0
2658 sij(il, i, i) = 0.0
2659 END IF
2660 END DO ! il
2661
2662 !AC! do j=1,ntra
2663 !AC! do il=1,ncum
2664 !AC! if ( i.ge.icb(il) .and. i.le.inb(il) .and. lwork(il)
2665 !AC! : .and. csum(il,i).lt.m(il,i) ) then
2666 !AC! traent(il,i,i,j)=tra(il,nk(il),j)
2667 !AC! endif
2668 !AC! enddo
2669 !AC! enddo
2670 789 END DO
2671
2672 ! MAF: renormalisation de MENT
2673 CALL zilch(zm, nloc*na)
2674 DO jm = 1, nl
2675 DO im = 1, nl
2676 DO il = 1, ncum
2677 zm(il, im) = zm(il, im) + (1.-sij(il,im,jm))*ment(il, im, jm)
2678 END DO
2679 END DO
2680 END DO
2681
2682 DO jm = 1, nl
2683 DO im = 1, nl
2684 DO il = 1, ncum
2685 IF (zm(il,im)/=0.) THEN
2686 ment(il, im, jm) = ment(il, im, jm)*m(il, im)/zm(il, im)
2687 END IF
2688 END DO
2689 END DO
2690 END DO
2691
2692 DO jm = 1, nl
2693 DO im = 1, nl
2694 DO il = 1, ncum
2695 qents(il, im, jm) = qent(il, im, jm)
2696 ments(il, im, jm) = ment(il, im, jm)
2697 END DO
2698 END DO
2699 END DO
2700
2701 RETURN
2702 END SUBROUTINE cv3_mixing
2703
2704 15008698 SUBROUTINE cv3_unsat(nloc, ncum, nd, na, ntra, icb, inb, iflag, &
2705 t, rr, rs, gz, u, v, tra, p, ph, &
2706 th, tv, lv, lf, cpn, ep, sigp, clw, frac_s, qpreca, frac_a, qta , & !!jygprl
2707 240 m, ment, elij, delt, plcl, coef_clos, &
2708 240 mp, rp, up, vp, trap, wt, water, evap, fondue, ice, &
2709 240 faci, b, sigd, &
2710 wdtrainA, wdtrainS, wdtrainM) ! RomP
2711 USE print_control_mod, ONLY: prt_level, lunout
2712 IMPLICIT NONE
2713
2714
2715 include "cvthermo.h"
2716 include "cv3param.h"
2717 include "cvflag.h"
2718 include "nuage.h"
2719
2720 !inputs:
2721 INTEGER, INTENT (IN) :: ncum, nd, na, ntra, nloc
2722 INTEGER, DIMENSION (nloc), INTENT (IN) :: icb, inb
2723 REAL, INTENT(IN) :: delt
2724 REAL, DIMENSION (nloc), INTENT (IN) :: plcl
2725 REAL, DIMENSION (nloc, nd), INTENT (IN) :: t, rr, rs
2726 REAL, DIMENSION (nloc, na), INTENT (IN) :: gz
2727 REAL, DIMENSION (nloc, nd), INTENT (IN) :: u, v
2728 REAL, DIMENSION (nloc, nd, ntra), INTENT(IN) :: tra
2729 REAL, DIMENSION (nloc, nd), INTENT (IN) :: p
2730 REAL, DIMENSION (nloc, nd+1), INTENT (IN) :: ph
2731 REAL, DIMENSION (nloc, na), INTENT (IN) :: ep, sigp, clw !adiab ascent shedding
2732 REAL, DIMENSION (nloc, na), INTENT (IN) :: frac_s !ice fraction in adiab ascent shedding !!jygprl
2733 REAL, DIMENSION (nloc, na), INTENT (IN) :: qpreca !adiab ascent precip !!jygprl
2734 REAL, DIMENSION (nloc, na), INTENT (IN) :: frac_a !ice fraction in adiab ascent precip !!jygprl
2735 REAL, DIMENSION (nloc, na), INTENT (IN) :: qta !adiab ascent specific total water !!jygprl
2736 REAL, DIMENSION (nloc, na), INTENT (IN) :: th, tv, lv, cpn
2737 REAL, DIMENSION (nloc, na), INTENT (IN) :: lf
2738 REAL, DIMENSION (nloc, na), INTENT (IN) :: m
2739 REAL, DIMENSION (nloc, na, na), INTENT (IN) :: ment, elij
2740 REAL, DIMENSION (nloc), INTENT (IN) :: coef_clos
2741
2742 !input/output
2743 INTEGER, DIMENSION (nloc), INTENT (INOUT) :: iflag(nloc)
2744
2745 !outputs:
2746 REAL, DIMENSION (nloc, na), INTENT (OUT) :: mp, rp, up, vp
2747 REAL, DIMENSION (nloc, na), INTENT (OUT) :: water, evap, wt
2748 REAL, DIMENSION (nloc, na), INTENT (OUT) :: ice, fondue
2749 REAL, DIMENSION (nloc, na), INTENT (OUT) :: faci ! ice fraction in precipitation
2750 REAL, DIMENSION (nloc, na, ntra), INTENT (OUT) :: trap
2751 REAL, DIMENSION (nloc, na), INTENT (OUT) :: b
2752 REAL, DIMENSION (nloc), INTENT (OUT) :: sigd
2753 ! 25/08/10 - RomP---- ajout des masses precipitantes ejectees
2754 ! de l ascendance adiabatique et des flux melanges Pa et Pm.
2755 ! Distinction des wdtrain
2756 ! Pa = wdtrainA Pm = wdtrainM
2757 REAL, DIMENSION (nloc, na), INTENT (OUT) :: wdtrainA, wdtrainS, wdtrainM
2758
2759 !local variables
2760 INTEGER i, j, k, il, num1, ndp1
2761 REAL smallestreal
2762 REAL tinv, delti, coef
2763 REAL awat, afac, afac1, afac2, bfac
2764 REAL pr1, pr2, sigt, b6, c6, d6, e6, f6, revap, delth
2765 REAL amfac, amp2, xf, tf, fac2, ur, sru, fac, d, af, bf
2766 REAL ampmax, thaw
2767 480 REAL tevap(nloc)
2768 480 REAL, DIMENSION (nloc, na) :: lvcp, lfcp
2769 REAL, DIMENSION (nloc, na) :: h, hm
2770 480 REAL, DIMENSION (nloc, na) :: ma
2771 480 REAL, DIMENSION (nloc, na) :: frac ! ice fraction in precipitation source
2772 480 REAL, DIMENSION (nloc, na) :: fraci ! provisionnal ice fraction in precipitation
2773 480 REAL, DIMENSION (nloc, na) :: prec
2774 480 REAL wdtrain(nloc)
2775 480 LOGICAL lwork(nloc), mplus(nloc)
2776
2777
2778 ! ------------------------------------------------------
2779
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 240 times.
240 IF (prt_level .GE. 10) print *,' ->cv3_unsat, iflag(1) ', iflag(1)
2780
2781 smallestreal=tiny(smallestreal)
2782
2783 ! =============================
2784 ! --- INITIALIZE OUTPUT ARRAYS
2785 ! =============================
2786 ! (loops up to nl+1)
2787
4/4
✓ Branch 0 taken 9360 times.
✓ Branch 1 taken 240 times.
✓ Branch 2 taken 9303840 times.
✓ Branch 3 taken 9360 times.
9313440 mp(:,:) = 0.
2788
4/4
✓ Branch 0 taken 9360 times.
✓ Branch 1 taken 240 times.
✓ Branch 2 taken 9303840 times.
✓ Branch 3 taken 9360 times.
9313440 rp(:,:) = 0.
2789
4/4
✓ Branch 0 taken 9360 times.
✓ Branch 1 taken 240 times.
✓ Branch 2 taken 9303840 times.
✓ Branch 3 taken 9360 times.
9313440 up(:,:) = 0.
2790
4/4
✓ Branch 0 taken 9360 times.
✓ Branch 1 taken 240 times.
✓ Branch 2 taken 9303840 times.
✓ Branch 3 taken 9360 times.
9313440 vp(:,:) = 0.
2791
4/4
✓ Branch 0 taken 9360 times.
✓ Branch 1 taken 240 times.
✓ Branch 2 taken 9303840 times.
✓ Branch 3 taken 9360 times.
9313440 water(:,:) = 0.
2792
4/4
✓ Branch 0 taken 9360 times.
✓ Branch 1 taken 240 times.
✓ Branch 2 taken 9303840 times.
✓ Branch 3 taken 9360 times.
9313440 evap(:,:) = 0.
2793
4/4
✓ Branch 0 taken 9360 times.
✓ Branch 1 taken 240 times.
✓ Branch 2 taken 9303840 times.
✓ Branch 3 taken 9360 times.
9313440 wt(:,:) = 0.
2794
4/4
✓ Branch 0 taken 9360 times.
✓ Branch 1 taken 240 times.
✓ Branch 2 taken 9303840 times.
✓ Branch 3 taken 9360 times.
9313440 ice(:,:) = 0.
2795
4/4
✓ Branch 0 taken 9360 times.
✓ Branch 1 taken 240 times.
✓ Branch 2 taken 9303840 times.
✓ Branch 3 taken 9360 times.
9313440 fondue(:,:) = 0.
2796
4/4
✓ Branch 0 taken 9360 times.
✓ Branch 1 taken 240 times.
✓ Branch 2 taken 9303840 times.
✓ Branch 3 taken 9360 times.
9313440 faci(:,:) = 0.
2797
4/4
✓ Branch 0 taken 9360 times.
✓ Branch 1 taken 240 times.
✓ Branch 2 taken 9303840 times.
✓ Branch 3 taken 9360 times.
9313440 b(:,:) = 0.
2798
2/2
✓ Branch 0 taken 238560 times.
✓ Branch 1 taken 240 times.
238800 sigd(:) = 0.
2799 !! RomP >>>
2800
4/4
✓ Branch 0 taken 9360 times.
✓ Branch 1 taken 240 times.
✓ Branch 2 taken 9303840 times.
✓ Branch 3 taken 9360 times.
9313440 wdtrainA(:,:) = 0.
2801
4/4
✓ Branch 0 taken 9360 times.
✓ Branch 1 taken 240 times.
✓ Branch 2 taken 9303840 times.
✓ Branch 3 taken 9360 times.
9313440 wdtrainS(:,:) = 0.
2802
4/4
✓ Branch 0 taken 9360 times.
✓ Branch 1 taken 240 times.
✓ Branch 2 taken 9303840 times.
✓ Branch 3 taken 9360 times.
9313440 wdtrainM(:,:) = 0.
2803 !! RomP <<<
2804
2805
2/2
✓ Branch 0 taken 6720 times.
✓ Branch 1 taken 240 times.
6960 DO i = 1, nlp
2806
2/2
✓ Branch 0 taken 3558716 times.
✓ Branch 1 taken 6720 times.
3565676 DO il = 1, ncum
2807 3558716 rp(il, i) = rr(il, i)
2808 3558716 up(il, i) = u(il, i)
2809 3558716 vp(il, i) = v(il, i)
2810 3565436 wt(il, i) = 0.001
2811 END DO
2812 END DO
2813
2814 ! *** Set the fractionnal area sigd of precipitating downdraughts
2815
2/2
✓ Branch 0 taken 127097 times.
✓ Branch 1 taken 240 times.
127337 DO il = 1, ncum
2816 127337 sigd(il) = sigdz*coef_clos(il)
2817 END DO
2818
2819 ! =====================================================================
2820 ! --- INITIALIZE VARIOUS ARRAYS AND PARAMETERS USED IN THE COMPUTATIONS
2821 ! =====================================================================
2822 ! (loops up to nl+1)
2823
2824 240 delti = 1./delt
2825 tinv = 1./3.
2826
2827
2/2
✓ Branch 0 taken 6720 times.
✓ Branch 1 taken 240 times.
6960 DO i = 1, nlp
2828
2/2
✓ Branch 0 taken 3558716 times.
✓ Branch 1 taken 6720 times.
3565676 DO il = 1, ncum
2829 3558716 frac(il, i) = 0.0
2830 3558716 fraci(il, i) = 0.0
2831 3558716 prec(il, i) = 0.0
2832 3558716 lvcp(il, i) = lv(il, i)/cpn(il, i)
2833 3565436 lfcp(il, i) = lf(il, i)/cpn(il, i)
2834 END DO
2835 END DO
2836
2837 !AC! do k=1,ntra
2838 !AC! do i=1,nd
2839 !AC! do il=1,ncum
2840 !AC! trap(il,i,k)=tra(il,i,k)
2841 !AC! enddo
2842 !AC! enddo
2843 !AC! enddo
2844
2845 ! *** check whether ep(inb)=0, if so, skip precipitating ***
2846 ! *** downdraft calculation ***
2847
2848
2849
2/2
✓ Branch 0 taken 127097 times.
✓ Branch 1 taken 240 times.
127337 DO il = 1, ncum
2850 !! lwork(il)=.TRUE.
2851 !! if(ep(il,inb(il)).lt.0.0001)lwork(il)=.FALSE.
2852 !jyg<
2853 !! lwork(il) = ep(il, inb(il)) >= 0.0001
2854
4/4
✓ Branch 0 taken 119852 times.
✓ Branch 1 taken 7245 times.
✓ Branch 2 taken 76043 times.
✓ Branch 3 taken 43809 times.
210625 lwork(il) = ep(il, inb(il)) >= 0.0001 .AND. iflag(il) <= 2
2855 END DO
2856
2857 !
2858 ! Get adiabatic ascent mass flux
2859 !
2860 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2861
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 240 times.
240 IF (adiab_ascent_mass_flux_depends_on_ejectliq) THEN
2862 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2863 !!! Warning : this option leads to water conservation violation
2864 !!! Expert only
2865 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2866 DO il = 1, ncum
2867 ma(il, nlp) = 0.
2868 ma(il, 1) = 0.
2869 END DO
2870
2871 DO i = nl, 2, -1
2872 DO il = 1, ncum
2873 ma(il, i) = ma(il, i+1)*(1.-qta(il,i))/(1.-qta(il,i-1)) + m(il, i)
2874 END DO
2875 END DO
2876 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2877 ELSE ! (adiab_ascent_mass_flux_depends_on_ejectliq)
2878 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2879
2/2
✓ Branch 0 taken 127097 times.
✓ Branch 1 taken 240 times.
127337 DO il = 1, ncum
2880 127097 ma(il, nlp) = 0.
2881 127337 ma(il, 1) = 0.
2882 END DO
2883
2884
2/2
✓ Branch 0 taken 240 times.
✓ Branch 1 taken 6240 times.
6480 DO i = nl, 2, -1
2885
2/2
✓ Branch 0 taken 3304522 times.
✓ Branch 1 taken 6240 times.
3311002 DO il = 1, ncum
2886 3310762 ma(il, i) = ma(il, i+1) + m(il, i)
2887 END DO
2888 END DO
2889
2890 ENDIF ! (adiab_ascent_mass_flux_depends_on_ejectliq) ELSE
2891 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2892
2893 ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2894 !
2895 ! *** begin downdraft loop ***
2896 !
2897 ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2898
2899
2/2
✓ Branch 0 taken 6720 times.
✓ Branch 1 taken 240 times.
6960 DO i = nl + 1, 1, -1
2900
2901 num1 = 0
2902
2/2
✓ Branch 0 taken 3558716 times.
✓ Branch 1 taken 6720 times.
3565436 DO il = 1, ncum
2903
4/4
✓ Branch 0 taken 1665155 times.
✓ Branch 1 taken 1893561 times.
✓ Branch 2 taken 758407 times.
✓ Branch 3 taken 906748 times.
3565436 IF (i<=inb(il) .AND. lwork(il)) num1 = num1 + 1
2904 END DO
2905
2/2
✓ Branch 0 taken 5110 times.
✓ Branch 1 taken 1610 times.
6720 IF (num1<=0) GO TO 400
2906
2907 5110 CALL zilch(wdtrain, ncum)
2908
2909
2910 ! *** integrate liquid water equation to find condensed water ***
2911 ! *** and condensed water flux ***
2912 !
2913 !
2914 ! *** calculate detrained precipitation ***
2915
2916
2917
2/2
✓ Branch 0 taken 2706078 times.
✓ Branch 1 taken 5110 times.
2711188 DO il = 1, ncum
2918
4/4
✓ Branch 0 taken 1665152 times.
✓ Branch 1 taken 1040926 times.
✓ Branch 2 taken 758407 times.
✓ Branch 3 taken 906745 times.
2711188 IF (i<=inb(il) .AND. lwork(il)) THEN
2919 758407 wdtrain(il) = grav*ep(il, i)*m(il, i)*clw(il, i)
2920 758407 wdtrainS(il, i) = wdtrain(il)/grav ! Ps jyg
2921 !! wdtrainA(il, i) = wdtrain(il)/grav ! Ps RomP
2922 END IF
2923 END DO
2924
2925
2/2
✓ Branch 0 taken 4870 times.
✓ Branch 1 taken 240 times.
5110 IF (i>1) THEN
2926
2/2
✓ Branch 0 taken 51870 times.
✓ Branch 1 taken 4870 times.
56740 DO j = 1, i - 1
2927
2/2
✓ Branch 0 taken 27468231 times.
✓ Branch 1 taken 51870 times.
27524971 DO il = 1, ncum
2928
4/4
✓ Branch 0 taken 11445203 times.
✓ Branch 1 taken 16023028 times.
✓ Branch 2 taken 6410667 times.
✓ Branch 3 taken 5034536 times.
27520101 IF (i<=inb(il) .AND. lwork(il)) THEN
2929 6410667 awat = elij(il, j, i) - (1.-ep(il,i))*clw(il, i)
2930 6410667 awat = max(awat, 0.0)
2931 6410667 wdtrain(il) = wdtrain(il) + grav*awat*ment(il, j, i)
2932 6410667 wdtrainM(il, i) = wdtrain(il)/grav - wdtrainS(il, i) ! Pm jyg
2933 !! wdtrainM(il, i) = wdtrain(il)/grav - wdtrainA(il, i) ! Pm RomP
2934 END IF
2935 END DO
2936 END DO
2937 END IF
2938
2939
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5110 times.
5110 IF (cvflag_prec_eject) THEN
2940 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2941 IF (adiab_ascent_mass_flux_depends_on_ejectliq) THEN
2942 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2943 !!! Warning : this option leads to water conservation violation
2944 !!! Expert only
2945 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2946 IF ( i > 1) THEN
2947 DO il = 1, ncum
2948 IF (i<=inb(il) .AND. lwork(il)) THEN
2949 wdtrainA(il,i) = ma(il, i+1)*(qta(il, i-1)-qta(il,i))/(1. - qta(il, i-1)) ! Pa jygprl
2950 wdtrain(il) = wdtrain(il) + grav*wdtrainA(il,i)
2951 END IF
2952 END DO
2953 ENDIF ! ( i > 1)
2954 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2955 ELSE ! (adiab_ascent_mass_flux_depends_on_ejectliq)
2956 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2957 IF ( i > 1) THEN
2958 DO il = 1, ncum
2959 IF (i<=inb(il) .AND. lwork(il)) THEN
2960 wdtrainA(il,i) = ma(il, i+1)*(qta(il, i-1)-qta(il,i)) ! Pa jygprl
2961 wdtrain(il) = wdtrain(il) + grav*wdtrainA(il,i)
2962 END IF
2963 END DO
2964 ENDIF ! ( i > 1)
2965
2966 ENDIF ! (adiab_ascent_mass_flux_depends_on_ejectliq) ELSE
2967 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2968 ENDIF ! (cvflag_prec_eject)
2969
2970
2971 ! *** find rain water and evaporation using provisional ***
2972 ! *** estimates of rp(i)and rp(i-1) ***
2973
2974
2975
1/2
✓ Branch 0 taken 5110 times.
✗ Branch 1 not taken.
5110 IF (cvflag_ice) THEN !!jygprl
2976
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5110 times.
5110 IF (cvflag_prec_eject) THEN
2977 DO il = 1, ncum !!jygprl
2978 IF (i<=inb(il) .AND. lwork(il)) THEN !!jygprl
2979 frac(il, i) = (frac_a(il,i)*wdtrainA(il,i)+frac_s(il,i)*(wdtrainS(il,i)+wdtrainM(il,i))) / & !!jygprl
2980 max(wdtrainA(il,i)+wdtrainS(il,i)+wdtrainM(il,i),smallestreal) !!jygprl
2981 fraci(il, i) = frac(il, i) !!jygprl
2982 END IF !!jygprl
2983 END DO !!jygprl
2984 ELSE ! (cvflag_prec_eject)
2985
2/2
✓ Branch 0 taken 5110 times.
✓ Branch 1 taken 2706078 times.
2711188 DO il = 1, ncum !!jygprl
2986
4/4
✓ Branch 0 taken 1665152 times.
✓ Branch 1 taken 1040926 times.
✓ Branch 2 taken 758407 times.
✓ Branch 3 taken 906745 times.
2711188 IF (i<=inb(il) .AND. lwork(il)) THEN !!jygprl
2987 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2988
1/2
✓ Branch 0 taken 758407 times.
✗ Branch 1 not taken.
758407 IF (keepbug_ice_frac) THEN
2989 758407 frac(il, i) = frac_s(il, i)
2990 ! Ice fraction computed again here as a function of the temperature seen by unsaturated downdraughts
2991 ! (i.e. the cold pool temperature) for compatibility with earlier versions.
2992 758407 fraci(il, i) = 1. - (t(il,i)-243.15)/(263.15-243.15)
2993 758407 fraci(il, i) = min(max(fraci(il,i),0.0), 1.0)
2994 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2995 ELSE ! (keepbug_ice_frac)
2996 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2997 frac(il, i) = frac_s(il, i)
2998 fraci(il, i) = frac(il, i) !!jygprl
2999 ENDIF ! (keepbug_ice_frac)
3000 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3001 END IF !!jygprl
3002 END DO !!jygprl
3003 ENDIF ! (cvflag_prec_eject)
3004 END IF !!jygprl
3005
3006
3007
2/2
✓ Branch 0 taken 5110 times.
✓ Branch 1 taken 2706078 times.
2711188 DO il = 1, ncum
3008
4/4
✓ Branch 0 taken 1665152 times.
✓ Branch 1 taken 1040926 times.
✓ Branch 2 taken 758407 times.
✓ Branch 3 taken 906745 times.
2711188 IF (i<=inb(il) .AND. lwork(il)) THEN
3009
3010 758407 wt(il, i) = 45.0
3011
3012
2/2
✓ Branch 0 taken 714598 times.
✓ Branch 1 taken 43809 times.
758407 IF (i<inb(il)) THEN
3013 rp(il, i) = rp(il, i+1) + &
3014 714598 (cpd*(t(il,i+1)-t(il,i))+gz(il,i+1)-gz(il,i))/lv(il, i)
3015 714598 rp(il, i) = 0.5*(rp(il,i)+rr(il,i))
3016 END IF
3017 758407 rp(il, i) = max(rp(il,i), 0.0)
3018 758407 rp(il, i) = amin1(rp(il,i), rs(il,i))
3019 758407 rp(il, inb(il)) = rr(il, inb(il))
3020
3021
2/2
✓ Branch 0 taken 43809 times.
✓ Branch 1 taken 714598 times.
758407 IF (i==1) THEN
3022 43809 afac = p(il, 1)*(rs(il,1)-rp(il,1))/(1.0E4+2000.0*p(il,1)*rs(il,1))
3023
1/2
✓ Branch 0 taken 43809 times.
✗ Branch 1 not taken.
43809 IF (cvflag_ice) THEN
3024 43809 afac1 = p(il, i)*(rs(il,1)-rp(il,1))/(1.0E4+2000.0*p(il,1)*rs(il,1))
3025 END IF
3026 ELSE
3027 714598 rp(il, i-1) = rp(il, i) + (cpd*(t(il,i)-t(il,i-1))+gz(il,i)-gz(il,i-1))/lv(il, i)
3028 714598 rp(il, i-1) = 0.5*(rp(il,i-1)+rr(il,i-1))
3029 714598 rp(il, i-1) = amin1(rp(il,i-1), rs(il,i-1))
3030 714598 rp(il, i-1) = max(rp(il,i-1), 0.0)
3031 714598 afac1 = p(il, i)*(rs(il,i)-rp(il,i))/(1.0E4+2000.0*p(il,i)*rs(il,i))
3032 714598 afac2 = p(il, i-1)*(rs(il,i-1)-rp(il,i-1))/(1.0E4+2000.0*p(il,i-1)*rs(il,i-1))
3033 714598 afac = 0.5*(afac1+afac2)
3034 END IF
3035
2/2
✓ Branch 0 taken 43809 times.
✓ Branch 1 taken 714598 times.
758407 IF (i==inb(il)) afac = 0.0
3036 758407 afac = max(afac, 0.0)
3037 758407 bfac = 1./(sigd(il)*wt(il,i))
3038
3039 !
3040
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 758407 times.
758407 IF (prt_level >= 20) THEN
3041 Print*, 'cv3_unsat after provisional rp estimate: rp, afac, bfac ', &
3042 i, rp(1, i), afac,bfac
3043 ENDIF
3044 !
3045 !JYG1
3046 ! cc sigt=1.0
3047 ! cc if(i.ge.icb)sigt=sigp(i)
3048 ! prise en compte de la variation progressive de sigt dans
3049 ! les couches icb et icb-1:
3050 ! pour plcl<ph(i+1), pr1=0 & pr2=1
3051 ! pour plcl>ph(i), pr1=1 & pr2=0
3052 ! pour ph(i+1)<plcl<ph(i), pr1 est la proportion a cheval
3053 ! sur le nuage, et pr2 est la proportion sous la base du
3054 ! nuage.
3055 758407 pr1 = (plcl(il)-ph(il,i+1))/(ph(il,i)-ph(il,i+1))
3056 758407 pr1 = max(0., min(1.,pr1))
3057 758407 pr2 = (ph(il,i)-plcl(il))/(ph(il,i)-ph(il,i+1))
3058 758407 pr2 = max(0., min(1.,pr2))
3059 758407 sigt = sigp(il, i)*pr1 + pr2
3060 !JYG2
3061
3062 !JYG----
3063 ! b6 = bfac*100.*sigd(il)*(ph(il,i)-ph(il,i+1))*sigt*afac
3064 ! c6 = water(il,i+1) + wdtrain(il)*bfac
3065 ! c6 = prec(il,i+1) + wdtrain(il)*bfac
3066 ! revap=0.5*(-b6+sqrt(b6*b6+4.*c6))
3067 ! evap(il,i)=sigt*afac*revap
3068 ! water(il,i)=revap*revap
3069 ! prec(il,i)=revap*revap
3070 !! print *,' i,b6,c6,revap,evap(il,i),water(il,i),wdtrain(il) ', &
3071 !! i,b6,c6,revap,evap(il,i),water(il,i),wdtrain(il)
3072 !!---end jyg---
3073
3074 ! --------retour � la formulation originale d'Emanuel.
3075
1/2
✓ Branch 0 taken 758407 times.
✗ Branch 1 not taken.
758407 IF (cvflag_ice) THEN
3076
3077 ! b6=bfac*50.*sigd(il)*(ph(il,i)-ph(il,i+1))*sigt*afac
3078 ! c6=prec(il,i+1)+bfac*wdtrain(il) &
3079 ! -50.*sigd(il)*bfac*(ph(il,i)-ph(il,i+1))*evap(il,i+1)
3080 ! if(c6.gt.0.0)then
3081 ! revap=0.5*(-b6+sqrt(b6*b6+4.*c6))
3082
3083 !JAM Attention: evap=sigt*E
3084 ! Modification: evap devient l'�vaporation en milieu de couche
3085 ! car n�cessaire dans cv3_yield
3086 ! Du coup, il faut modifier pas mal d'�quations...
3087 ! et l'expression de afac qui devient afac1
3088 ! revap=sqrt((prec(i+1)+prec(i))/2)
3089
3090 758407 b6 = bfac*50.*sigd(il)*(ph(il,i)-ph(il,i+1))*sigt*afac1
3091 758407 c6 = prec(il, i+1) + 0.5*bfac*wdtrain(il)
3092 ! print *,'bfac,sigd(il),sigt,afac1 ',bfac,sigd(il),sigt,afac1
3093 ! print *,'prec(il,i+1),wdtrain(il) ',prec(il,i+1),wdtrain(il)
3094 ! print *,'b6,c6,b6*b6+4.*c6 ',b6,c6,b6*b6+4.*c6
3095
2/2
✓ Branch 0 taken 743966 times.
✓ Branch 1 taken 14441 times.
758407 IF (c6>b6*b6+1.E-20) THEN
3096 743966 revap = 2.*c6/(b6+sqrt(b6*b6+4.*c6))
3097 ELSE
3098 14441 revap = (-b6+sqrt(b6*b6+4.*c6))/2.
3099 END IF
3100 758407 prec(il, i) = max(0., 2.*revap*revap-prec(il,i+1))
3101 ! print*,prec(il,i),'neige'
3102
3103 !JYG Dans sa formulation originale, Emanuel calcule l'evaporation par:
3104 ! c evap(il,i)=sigt*afac*revap
3105 ! ce qui n'est pas correct. Dans cv_routines, la formulation a �t� modifiee.
3106 ! Ici,l'evaporation evap est simplement calculee par l'equation de
3107 ! conservation.
3108 ! prec(il,i)=revap*revap
3109 ! else
3110 !JYG---- Correction : si c6 <= 0, water(il,i)=0.
3111 ! prec(il,i)=0.
3112 ! endif
3113
3114 !JYG--- Dans tous les cas, evaporation = [tt ce qui entre dans la couche i]
3115 ! moins [tt ce qui sort de la couche i]
3116 ! print *, 'evap avec ice'
3117 evap(il, i) = (wdtrain(il)+sigd(il)*wt(il,i)*(prec(il,i+1)-prec(il,i))) / &
3118 758407 (sigd(il)*(ph(il,i)-ph(il,i+1))*100.)
3119 !
3120
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 758407 times.
758407 IF (prt_level >= 20) THEN
3121 Print*, 'cv3_unsat after evap computation: wdtrain, sigd, wt, prec(i+1),prec(i) ', &
3122 i, wdtrain(1), sigd(1), wt(1,i), prec(1,i+1),prec(1,i)
3123 ENDIF
3124 !
3125
3126 !jyg<
3127 758407 d6 = prec(il,i)-prec(il,i+1)
3128
3129 !! d6 = bfac*wdtrain(il) - 100.*sigd(il)*bfac*(ph(il,i)-ph(il,i+1))*evap(il, i)
3130 !! e6 = bfac*wdtrain(il)
3131 !! f6 = -100.*sigd(il)*bfac*(ph(il,i)-ph(il,i+1))*evap(il, i)
3132 !>jyg
3133 !CR:tmax_fonte_cv: T for which ice is totally melted (used to be 275.15)
3134 758407 thaw = (t(il,i)-273.15)/(tmax_fonte_cv-273.15)
3135 758407 thaw = min(max(thaw,0.0), 1.0)
3136 !jyg<
3137 758407 water(il, i) = water(il, i+1) + (1-fraci(il,i))*d6
3138 758407 ice(il, i) = ice(il, i+1) + fraci(il, i)*d6
3139 758407 water(il, i) = min(prec(il,i), max(water(il,i), 0.))
3140 758407 ice(il, i) = min(prec(il,i), max(ice(il,i), 0.))
3141
3142 !! water(il, i) = water(il, i+1) + (1-fraci(il,i))*d6
3143 !! water(il, i) = max(water(il,i), 0.)
3144 !! ice(il, i) = ice(il, i+1) + fraci(il, i)*d6
3145 !! ice(il, i) = max(ice(il,i), 0.)
3146 !>jyg
3147 758407 fondue(il, i) = ice(il, i)*thaw
3148 758407 water(il, i) = water(il, i) + fondue(il, i)
3149 758407 ice(il, i) = ice(il, i) - fondue(il, i)
3150
3151
2/2
✓ Branch 0 taken 12612 times.
✓ Branch 1 taken 745795 times.
758407 IF (water(il,i)+ice(il,i)<1.E-30) THEN
3152 12612 faci(il, i) = 0.
3153 ELSE
3154 745795 faci(il, i) = ice(il, i)/(water(il,i)+ice(il,i))
3155 END IF
3156
3157 ! water(il,i)=water(il,i+1)+(1.-fraci(il,i))*e6+(1.-faci(il,i))*f6
3158 ! water(il,i)=max(water(il,i),0.)
3159 ! ice(il,i)=ice(il,i+1)+fraci(il,i)*e6+faci(il,i)*f6
3160 ! ice(il,i)=max(ice(il,i),0.)
3161 ! fondue(il,i)=ice(il,i)*thaw
3162 ! water(il,i)=water(il,i)+fondue(il,i)
3163 ! ice(il,i)=ice(il,i)-fondue(il,i)
3164
3165 ! if((water(il,i)+ice(il,i)).lt.1.e-30)then
3166 ! faci(il,i)=0.
3167 ! else
3168 ! faci(il,i)=ice(il,i)/(water(il,i)+ice(il,i))
3169 ! endif
3170
3171 ELSE
3172 b6 = bfac*50.*sigd(il)*(ph(il,i)-ph(il,i+1))*sigt*afac
3173 c6 = water(il, i+1) + bfac*wdtrain(il) - &
3174 50.*sigd(il)*bfac*(ph(il,i)-ph(il,i+1))*evap(il, i+1)
3175 IF (c6>0.0) THEN
3176 revap = 0.5*(-b6+sqrt(b6*b6+4.*c6))
3177 water(il, i) = revap*revap
3178 ELSE
3179 water(il, i) = 0.
3180 END IF
3181 ! print *, 'evap sans ice'
3182 evap(il, i) = (wdtrain(il)+sigd(il)*wt(il,i)*(water(il,i+1)-water(il,i)))/ &
3183 (sigd(il)*(ph(il,i)-ph(il,i+1))*100.)
3184
3185 END IF
3186 END IF !(i.le.inb(il) .and. lwork(il))
3187 END DO
3188 ! ----------------------------------------------------------------
3189
3190 ! cc
3191 ! *** calculate precipitating downdraft mass flux under ***
3192 ! *** hydrostatic approximation ***
3193
3194
2/2
✓ Branch 0 taken 2706078 times.
✓ Branch 1 taken 5110 times.
2711188 DO il = 1, ncum
3195
6/6
✓ Branch 0 taken 1665152 times.
✓ Branch 1 taken 1040926 times.
✓ Branch 2 taken 758407 times.
✓ Branch 3 taken 906745 times.
✓ Branch 4 taken 714598 times.
✓ Branch 5 taken 43809 times.
2706078 IF (i<=inb(il) .AND. lwork(il) .AND. i/=1) THEN
3196
3197 714598 tevap(il) = max(0.0, evap(il,i))
3198 714598 delth = max(0.001, (th(il,i)-th(il,i-1)))
3199
1/2
✓ Branch 0 taken 714598 times.
✗ Branch 1 not taken.
714598 IF (cvflag_ice) THEN
3200
1/2
✓ Branch 0 taken 714598 times.
✗ Branch 1 not taken.
714598 IF (cvflag_grav) THEN
3201 mp(il, i) = 100.*ginv*(lvcp(il,i)*sigd(il)*tevap(il)* &
3202 (p(il,i-1)-p(il,i))/delth + &
3203 lfcp(il,i)*sigd(il)*faci(il,i)*tevap(il)* &
3204 (p(il,i-1)-p(il,i))/delth + &
3205 lfcp(il,i)*sigd(il)*wt(il,i)/100.*fondue(il,i)* &
3206 714598 (p(il,i-1)-p(il,i))/delth/(ph(il,i)-ph(il,i+1)))
3207 ELSE
3208 mp(il, i) = 10.*(lvcp(il,i)*sigd(il)*tevap(il)* &
3209 (p(il,i-1)-p(il,i))/delth + &
3210 lfcp(il,i)*sigd(il)*faci(il,i)*tevap(il)* &
3211 (p(il,i-1)-p(il,i))/delth + &
3212 lfcp(il,i)*sigd(il)*wt(il,i)/100.*fondue(il,i)* &
3213 (p(il,i-1)-p(il,i))/delth/(ph(il,i)-ph(il,i+1)))
3214
3215 END IF
3216 ELSE
3217 IF (cvflag_grav) THEN
3218 mp(il, i) = 100.*ginv*lvcp(il, i)*sigd(il)*tevap(il)* &
3219 (p(il,i-1)-p(il,i))/delth
3220 ELSE
3221 mp(il, i) = 10.*lvcp(il, i)*sigd(il)*tevap(il)* &
3222 (p(il,i-1)-p(il,i))/delth
3223 END IF
3224
3225 END IF
3226
3227 END IF !(i.le.inb(il) .and. lwork(il) .and. i.ne.1)
3228
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2706078 times.
2711188 IF (prt_level .GE. 20) THEN
3229 PRINT *,'cv3_unsat, mp hydrostatic ', i, mp(il,i)
3230 ENDIF
3231 END DO
3232 ! ----------------------------------------------------------------
3233
3234 ! *** if hydrostatic assumption fails, ***
3235 ! *** solve cubic difference equation for downdraft theta ***
3236 ! *** and mass flux from two simultaneous differential eqns ***
3237
3238
2/2
✓ Branch 0 taken 2706078 times.
✓ Branch 1 taken 5110 times.
2711188 DO il = 1, ncum
3239
6/6
✓ Branch 0 taken 1665152 times.
✓ Branch 1 taken 1040926 times.
✓ Branch 2 taken 758407 times.
✓ Branch 3 taken 906745 times.
✓ Branch 4 taken 714598 times.
✓ Branch 5 taken 43809 times.
2711188 IF (i<=inb(il) .AND. lwork(il) .AND. i/=1) THEN
3240
3241 amfac = sigd(il)*sigd(il)*70.0*ph(il, i)*(p(il,i-1)-p(il,i))* &
3242 714598 (th(il,i)-th(il,i-1))/(tv(il,i)*th(il,i))
3243 714598 amp2 = abs(mp(il,i+1)*mp(il,i+1)-mp(il,i)*mp(il,i))
3244
3245
2/2
✓ Branch 0 taken 178727 times.
✓ Branch 1 taken 535871 times.
714598 IF (amp2>(0.1*amfac)) THEN
3246 178727 xf = 100.0*sigd(il)*sigd(il)*sigd(il)*(ph(il,i)-ph(il,i+1))
3247 tf = b(il, i) - 5.0*(th(il,i)-th(il,i-1))*t(il, i) / &
3248 178727 (lvcp(il,i)*sigd(il)*th(il,i))
3249 178727 af = xf*tf + mp(il, i+1)*mp(il, i+1)*tinv
3250
3251
1/2
✓ Branch 0 taken 178727 times.
✗ Branch 1 not taken.
178727 IF (cvflag_ice) THEN
3252 bf = 2.*(tinv*mp(il,i+1))**3 + tinv*mp(il, i+1)*xf*tf + &
3253 50.*(p(il,i-1)-p(il,i))*xf*(tevap(il)*(1.+(lf(il,i)/lv(il,i))*faci(il,i)) + &
3254 178727 (lf(il,i)/lv(il,i))*wt(il,i)/100.*fondue(il,i)/(ph(il,i)-ph(il,i+1)))
3255 ELSE
3256
3257 bf = 2.*(tinv*mp(il,i+1))**3 + tinv*mp(il, i+1)*xf*tf + &
3258 50.*(p(il,i-1)-p(il,i))*xf*tevap(il)
3259 END IF
3260
3261 fac2 = 1.0
3262
2/2
✓ Branch 0 taken 1044 times.
✓ Branch 1 taken 177683 times.
178727 IF (bf<0.0) fac2 = -1.0
3263 178727 bf = abs(bf)
3264 178727 ur = 0.25*bf*bf - af*af*af*tinv*tinv*tinv
3265
2/2
✓ Branch 0 taken 118899 times.
✓ Branch 1 taken 59828 times.
178727 IF (ur>=0.0) THEN
3266 118899 sru = sqrt(ur)
3267 fac = 1.0
3268
2/2
✓ Branch 0 taken 50463 times.
✓ Branch 1 taken 68436 times.
118899 IF ((0.5*bf-sru)<0.0) fac = -1.0
3269 mp(il, i) = mp(il, i+1)*tinv + (0.5*bf+sru)**tinv + &
3270 118899 fac*(abs(0.5*bf-sru))**tinv
3271 ELSE
3272 59828 d = atan(2.*sqrt(-ur)/(bf+1.0E-28))
3273
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 59828 times.
59828 IF (fac2<0.0) d = 3.14159 - d
3274 59828 mp(il, i) = mp(il, i+1)*tinv + 2.*sqrt(af*tinv)*cos(d*tinv)
3275 END IF
3276 178727 mp(il, i) = max(0.0, mp(il,i))
3277
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 178727 times.
178727 IF (prt_level .GE. 20) THEN
3278 PRINT *,'cv3_unsat, mp cubic ', i, mp(il,i)
3279 ENDIF
3280
3281
1/2
✓ Branch 0 taken 178727 times.
✗ Branch 1 not taken.
178727 IF (cvflag_ice) THEN
3282
1/2
✓ Branch 0 taken 178727 times.
✗ Branch 1 not taken.
178727 IF (cvflag_grav) THEN
3283 !JYG : il y a vraisemblablement une erreur dans la ligne 2 suivante:
3284 ! il faut diviser par (mp(il,i)*sigd(il)*grav) et non par (mp(il,i)+sigd(il)*0.1).
3285 ! Et il faut bien revoir les facteurs 100.
3286 b(il, i-1) = b(il, i) + 100.0*(p(il,i-1)-p(il,i))* &
3287 (tevap(il)*(1.+(lf(il,i)/lv(il,i))*faci(il,i)) + &
3288 (lf(il,i)/lv(il,i))*wt(il,i)/100.*fondue(il,i) / &
3289 (ph(il,i)-ph(il,i+1))) / &
3290 (mp(il,i)+sigd(il)*0.1) - &
3291 10.0*(th(il,i)-th(il,i-1))*t(il, i) / &
3292 178727 (lvcp(il,i)*sigd(il)*th(il,i))
3293 ELSE
3294 b(il, i-1) = b(il, i) + 100.0*(p(il,i-1)-p(il,i))*&
3295 (tevap(il)*(1.+(lf(il,i)/lv(il,i))*faci(il,i)) + &
3296 (lf(il,i)/lv(il,i))*wt(il,i)/100.*fondue(il,i) / &
3297 (ph(il,i)-ph(il,i+1))) / &
3298 (mp(il,i)+sigd(il)*0.1) - &
3299 10.0*(th(il,i)-th(il,i-1))*t(il, i) / &
3300 (lvcp(il,i)*sigd(il)*th(il,i))
3301 END IF
3302 ELSE
3303 IF (cvflag_grav) THEN
3304 b(il, i-1) = b(il, i) + 100.0*(p(il,i-1)-p(il,i))*tevap(il) / &
3305 (mp(il,i)+sigd(il)*0.1) - &
3306 10.0*(th(il,i)-th(il,i-1))*t(il, i) / &
3307 (lvcp(il,i)*sigd(il)*th(il,i))
3308 ELSE
3309 b(il, i-1) = b(il, i) + 100.0*(p(il,i-1)-p(il,i))*tevap(il) / &
3310 (mp(il,i)+sigd(il)*0.1) - &
3311 10.0*(th(il,i)-th(il,i-1))*t(il, i) / &
3312 (lvcp(il,i)*sigd(il)*th(il,i))
3313 END IF
3314 END IF
3315 178727 b(il, i-1) = max(b(il,i-1), 0.0)
3316
3317 END IF !(amp2.gt.(0.1*amfac))
3318
3319 !jyg< This part shifted 10 lines farther
3320 !!! *** limit magnitude of mp(i) to meet cfl condition ***
3321 !!
3322 !! ampmax = 2.0*(ph(il,i)-ph(il,i+1))*delti
3323 !! amp2 = 2.0*(ph(il,i-1)-ph(il,i))*delti
3324 !! ampmax = min(ampmax, amp2)
3325 !! mp(il, i) = min(mp(il,i), ampmax)
3326 !>jyg
3327
3328 ! *** force mp to decrease linearly to zero ***
3329 ! *** between cloud base and the surface ***
3330
3331
3332 ! c if(p(il,i).gt.p(il,icb(il)))then
3333 ! c mp(il,i)=mp(il,icb(il))*(p(il,1)-p(il,i))/(p(il,1)-p(il,icb(il)))
3334 ! c endif
3335
2/2
✓ Branch 0 taken 283602 times.
✓ Branch 1 taken 430996 times.
714598 IF (ph(il,i)>0.9*plcl(il)) THEN
3336 283602 mp(il, i) = mp(il, i)*(ph(il,1)-ph(il,i))/(ph(il,1)-0.9*plcl(il))
3337 END IF
3338
3339 !jyg< Shifted part
3340 ! *** limit magnitude of mp(i) to meet cfl condition ***
3341
3342 714598 ampmax = 2.0*(ph(il,i)-ph(il,i+1))*delti
3343 714598 amp2 = 2.0*(ph(il,i-1)-ph(il,i))*delti
3344 714598 ampmax = min(ampmax, amp2)
3345 714598 mp(il, i) = min(mp(il,i), ampmax)
3346 !>jyg
3347
3348 END IF ! (i.le.inb(il) .and. lwork(il) .and. i.ne.1)
3349 END DO
3350 ! ----------------------------------------------------------------
3351 !
3352
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5110 times.
5110 IF (prt_level >= 20) THEN
3353 Print*, 'cv3_unsat after mp computation: mp, b(i), b(i-1) ', &
3354 i, mp(1, i), b(1,i), b(1,max(i-1,1))
3355 ENDIF
3356 !
3357
3358 ! *** find mixing ratio of precipitating downdraft ***
3359
3360
2/2
✓ Branch 0 taken 2706078 times.
✓ Branch 1 taken 5110 times.
2711188 DO il = 1, ncum
3361
4/4
✓ Branch 0 taken 1538058 times.
✓ Branch 1 taken 1168020 times.
✓ Branch 2 taken 714598 times.
✓ Branch 3 taken 823460 times.
2711188 IF (i<inb(il) .AND. lwork(il)) THEN
3362 714598 mplus(il) = mp(il, i) > mp(il, i+1)
3363 END IF ! (i.lt.inb(il) .and. lwork(il))
3364 END DO
3365
3366
2/2
✓ Branch 0 taken 5110 times.
✓ Branch 1 taken 2706078 times.
2711188 DO il = 1, ncum
3367
4/4
✓ Branch 0 taken 1538058 times.
✓ Branch 1 taken 1168020 times.
✓ Branch 2 taken 714598 times.
✓ Branch 3 taken 823460 times.
2712798 IF (i<inb(il) .AND. lwork(il)) THEN
3368
3369 714598 rp(il, i) = rr(il, i)
3370
3371
2/2
✓ Branch 0 taken 290923 times.
✓ Branch 1 taken 423675 times.
714598 IF (mplus(il)) THEN
3372
3373
1/2
✓ Branch 0 taken 290923 times.
✗ Branch 1 not taken.
290923 IF (cvflag_grav) THEN
3374 rp(il, i) = rp(il, i+1)*mp(il, i+1) + rr(il, i)*(mp(il,i)-mp(il,i+1)) + &
3375 290923 100.*ginv*0.5*sigd(il)*(ph(il,i)-ph(il,i+1))*(evap(il,i+1)+evap(il,i))
3376 ELSE
3377 rp(il, i) = rp(il, i+1)*mp(il, i+1) + rr(il, i)*(mp(il,i)-mp(il,i+1)) + &
3378 5.*sigd(il)*(ph(il,i)-ph(il,i+1))*(evap(il,i+1)+evap(il,i))
3379 END IF
3380 290923 rp(il, i) = rp(il, i)/mp(il, i)
3381 290923 up(il, i) = up(il, i+1)*mp(il, i+1) + u(il, i)*(mp(il,i)-mp(il,i+1))
3382 290923 up(il, i) = up(il, i)/mp(il, i)
3383 290923 vp(il, i) = vp(il, i+1)*mp(il, i+1) + v(il, i)*(mp(il,i)-mp(il,i+1))
3384 290923 vp(il, i) = vp(il, i)/mp(il, i)
3385
3386 ELSE ! if (mplus(il))
3387
3388
2/2
✓ Branch 0 taken 345770 times.
✓ Branch 1 taken 77905 times.
423675 IF (mp(il,i+1)>1.0E-16) THEN
3389
1/2
✓ Branch 0 taken 345770 times.
✗ Branch 1 not taken.
345770 IF (cvflag_grav) THEN
3390 rp(il, i) = rp(il,i+1) + 100.*ginv*0.5*sigd(il)*(ph(il,i)-ph(il,i+1)) * &
3391 345770 (evap(il,i+1)+evap(il,i))/mp(il,i+1)
3392 ELSE
3393 rp(il, i) = rp(il,i+1) + 5.*sigd(il)*(ph(il,i)-ph(il,i+1)) * &
3394 (evap(il,i+1)+evap(il,i))/mp(il, i+1)
3395 END IF
3396 345770 up(il, i) = up(il, i+1)
3397 345770 vp(il, i) = vp(il, i+1)
3398 END IF ! (mp(il,i+1).gt.1.0e-16)
3399 END IF ! (mplus(il)) else if (.not.mplus(il))
3400
3401 714598 rp(il, i) = amin1(rp(il,i), rs(il,i))
3402 714598 rp(il, i) = max(rp(il,i), 0.0)
3403
3404 END IF ! (i.lt.inb(il) .and. lwork(il))
3405 END DO
3406 ! ----------------------------------------------------------------
3407
3408 ! *** find tracer concentrations in precipitating downdraft ***
3409
3410 !AC! do j=1,ntra
3411 !AC! do il = 1,ncum
3412 !AC! if (i.lt.inb(il) .and. lwork(il)) then
3413 !AC!c
3414 !AC! if(mplus(il))then
3415 !AC! trap(il,i,j)=trap(il,i+1,j)*mp(il,i+1)
3416 !AC! : +trap(il,i,j)*(mp(il,i)-mp(il,i+1))
3417 !AC! trap(il,i,j)=trap(il,i,j)/mp(il,i)
3418 !AC! else ! if (mplus(il))
3419 !AC! if(mp(il,i+1).gt.1.0e-16)then
3420 !AC! trap(il,i,j)=trap(il,i+1,j)
3421 !AC! endif
3422 !AC! endif ! (mplus(il)) else if (.not.mplus(il))
3423 !AC!c
3424 !AC! endif ! (i.lt.inb(il) .and. lwork(il))
3425 !AC! enddo
3426 !AC! end do
3427
3428 240 400 END DO
3429 ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3430
3431 ! *** end of downdraft loop ***
3432
3433 ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3434
3435
3436 240 RETURN
3437
3438 END SUBROUTINE cv3_unsat
3439
3440 38727653 SUBROUTINE cv3_yield(nloc, ncum, nd, na, ntra, ok_conserv_q, &
3441 icb, inb, delt, &
3442 t, rr, t_wake, rr_wake, s_wake, u, v, tra, &
3443 240 gz, p, ph, h, hp, lv, lf, cpn, th, th_wake, &
3444 ep, clw, qpreca, m, tp, mp, rp, up, vp, trap, &
3445 wt, water, ice, evap, fondue, faci, b, sigd, &
3446 240 ment, qent, hent, iflag_mix, uent, vent, &
3447 nent, elij, traent, sig, &
3448 tv, tvp, wghti, &
3449 240 iflag, precip, Vprecip, Vprecipi, & ! jyg: Vprecipi
3450 ft, fr, fu, fv, ftra, & ! jyg
3451 240 cbmf, upwd, dnwd, dnwd0, ma, mip, &
3452 !! tls, tps, ! useless . jyg
3453 qcondc, wd, &
3454 ftd, fqd, qta, qtc, sigt, tau_cld_cv, coefw_cld_cv)
3455
3456 USE print_control_mod, ONLY: lunout, prt_level
3457 USE add_phys_tend_mod, only : fl_cor_ebil
3458
3459 IMPLICIT NONE
3460
3461 include "cvthermo.h"
3462 include "cv3param.h"
3463 include "cvflag.h"
3464 include "conema3.h"
3465
3466 !inputs:
3467 INTEGER, INTENT (IN) :: iflag_mix
3468 INTEGER, INTENT (IN) :: ncum, nd, na, ntra, nloc
3469 LOGICAL, INTENT (IN) :: ok_conserv_q
3470 INTEGER, DIMENSION (nloc), INTENT (IN) :: icb, inb
3471 REAL, INTENT (IN) :: delt
3472 REAL, DIMENSION (nloc, nd), INTENT (IN) :: t, rr, u, v
3473 REAL, DIMENSION (nloc, nd), INTENT (IN) :: t_wake, rr_wake
3474 REAL, DIMENSION (nloc), INTENT (IN) :: s_wake
3475 REAL, DIMENSION (nloc, nd, ntra), INTENT (IN) :: tra
3476 REAL, DIMENSION (nloc, nd), INTENT (IN) :: p
3477 REAL, DIMENSION (nloc, nd+1), INTENT (IN) :: ph
3478 REAL, DIMENSION (nloc, na), INTENT (IN) :: gz, h, hp
3479 REAL, DIMENSION (nloc, na), INTENT (IN) :: th, tp
3480 REAL, DIMENSION (nloc, na), INTENT (IN) :: lv, cpn, ep, clw
3481 REAL, DIMENSION (nloc, na), INTENT (IN) :: lf
3482 REAL, DIMENSION (nloc, na), INTENT (IN) :: rp, up
3483 REAL, DIMENSION (nloc, na), INTENT (IN) :: vp
3484 REAL, DIMENSION (nloc, nd), INTENT (IN) :: wt
3485 REAL, DIMENSION (nloc, nd, ntra), INTENT (IN) :: trap
3486 REAL, DIMENSION (nloc, na), INTENT (IN) :: water, evap, b
3487 REAL, DIMENSION (nloc, na), INTENT (IN) :: fondue, faci, ice
3488 REAL, DIMENSION (nloc, na, na), INTENT (IN) :: qent, uent
3489 REAL, DIMENSION (nloc, na, na), INTENT (IN) :: hent
3490 REAL, DIMENSION (nloc, na, na), INTENT (IN) :: vent, elij
3491 INTEGER, DIMENSION (nloc, nd), INTENT (IN) :: nent
3492 REAL, DIMENSION (nloc, na, na, ntra), INTENT (IN) :: traent
3493 REAL, DIMENSION (nloc, nd), INTENT (IN) :: tv, tvp, wghti
3494 REAL, DIMENSION (nloc, nd), INTENT (IN) :: qta
3495 REAL, DIMENSION (nloc, na),INTENT(IN) :: qpreca
3496 REAL, INTENT(IN) :: tau_cld_cv, coefw_cld_cv
3497 !
3498 !input/output:
3499 REAL, DIMENSION (nloc, na), INTENT (INOUT) :: m, mp
3500 REAL, DIMENSION (nloc, na, na), INTENT (INOUT) :: ment
3501 INTEGER, DIMENSION (nloc), INTENT (INOUT) :: iflag
3502 REAL, DIMENSION (nloc, nd), INTENT (INOUT) :: sig
3503 REAL, DIMENSION (nloc), INTENT (INOUT) :: sigd
3504 !
3505 !outputs:
3506 REAL, DIMENSION (nloc), INTENT (OUT) :: precip
3507 REAL, DIMENSION (nloc, nd), INTENT (OUT) :: ft, fr, fu, fv
3508 REAL, DIMENSION (nloc, nd), INTENT (OUT) :: ftd, fqd
3509 REAL, DIMENSION (nloc, nd, ntra), INTENT (OUT) :: ftra
3510 REAL, DIMENSION (nloc, nd), INTENT (OUT) :: upwd, dnwd, ma
3511 REAL, DIMENSION (nloc, nd), INTENT (OUT) :: dnwd0, mip
3512 REAL, DIMENSION (nloc, nd+1), INTENT (OUT) :: Vprecip
3513 REAL, DIMENSION (nloc, nd+1), INTENT (OUT) :: Vprecipi
3514 !! REAL tls(nloc, nd), tps(nloc, nd) ! useless . jyg
3515 REAL, DIMENSION (nloc, nd), INTENT (OUT) :: qcondc ! cld
3516 REAL, DIMENSION (nloc, nd), INTENT (OUT) :: qtc, sigt ! cld
3517 REAL, DIMENSION (nloc), INTENT (OUT) :: wd ! gust
3518 REAL, DIMENSION (nloc), INTENT (OUT) :: cbmf
3519 !
3520 !local variables:
3521 INTEGER :: i, k, il, n, j, num1
3522 REAL :: rat, delti
3523 REAL :: ax, bx, cx, dx, ex
3524 REAL :: cpinv, rdcp, dpinv
3525 REAL :: sigaq
3526 480 REAL, DIMENSION (nloc) :: awat
3527 480 REAL, DIMENSION (nloc, nd) :: lvcp, lfcp ! , mke ! unused . jyg
3528 480 REAL, DIMENSION (nloc) :: am, work, ad, amp1
3529 !! real up1(nloc), dn1(nloc)
3530 480 REAL, DIMENSION (nloc, nd, nd) :: up1, dn1
3531 !jyg<
3532 480 REAL, DIMENSION (nloc, nd) :: up_to, up_from
3533 480 REAL, DIMENSION (nloc, nd) :: dn_to, dn_from
3534 !>jyg
3535 480 REAL, DIMENSION (nloc) :: asum, bsum, csum, dsum
3536 480 REAL, DIMENSION (nloc) :: esum, fsum, gsum, hsum
3537 REAL, DIMENSION (nloc, nd) :: th_wake
3538 480 REAL, DIMENSION (nloc) :: alpha_qpos, alpha_qpos1
3539 480 REAL, DIMENSION (nloc, nd) :: qcond, nqcond, wa ! cld
3540 480 REAL, DIMENSION (nloc, nd) :: siga, sax, mac ! cld
3541 480 REAL, DIMENSION (nloc) :: sument
3542 480 REAL, DIMENSION (nloc, nd) :: sigment, qtment ! cld
3543 REAL sumdq !jyg
3544 !
3545 ! -------------------------------------------------------------
3546
3547 ! initialization:
3548
3549 240 delti = 1.0/delt
3550 ! print*,'cv3_yield initialisation delt', delt
3551
3552
2/2
✓ Branch 0 taken 127097 times.
✓ Branch 1 taken 240 times.
127337 DO il = 1, ncum
3553 127097 precip(il) = 0.0
3554 127337 wd(il) = 0.0 ! gust
3555 END DO
3556
3557 ! Fluxes are on a staggered grid : loops extend up to nl+1
3558
2/2
✓ Branch 0 taken 6720 times.
✓ Branch 1 taken 240 times.
6960 DO i = 1, nlp
3559
2/2
✓ Branch 0 taken 3558716 times.
✓ Branch 1 taken 6720 times.
3565676 DO il = 1, ncum
3560 3558716 Vprecip(il, i) = 0.0
3561 3558716 Vprecipi(il, i) = 0.0 ! jyg
3562 3558716 upwd(il, i) = 0.0
3563 3558716 dnwd(il, i) = 0.0
3564 3558716 dnwd0(il, i) = 0.0
3565 3565436 mip(il, i) = 0.0
3566 END DO
3567 END DO
3568
2/2
✓ Branch 0 taken 6480 times.
✓ Branch 1 taken 240 times.
6720 DO i = 1, nl
3569
2/2
✓ Branch 0 taken 3431619 times.
✓ Branch 1 taken 6480 times.
3438339 DO il = 1, ncum
3570 3431619 ft(il, i) = 0.0
3571 3431619 fr(il, i) = 0.0
3572 3431619 fu(il, i) = 0.0
3573 3431619 fv(il, i) = 0.0
3574 3431619 ftd(il, i) = 0.0
3575 3431619 fqd(il, i) = 0.0
3576 3431619 qcondc(il, i) = 0.0 ! cld
3577 3431619 qcond(il, i) = 0.0 ! cld
3578 3431619 qtc(il, i) = 0.0 ! cld
3579 3431619 qtment(il, i) = 0.0 ! cld
3580 3431619 sigment(il, i) = 0.0 ! cld
3581 3431619 sigt(il, i) = 0.0 ! cld
3582 3438099 nqcond(il, i) = 0.0 ! cld
3583 END DO
3584 END DO
3585 ! print*,'cv3_yield initialisation 2'
3586 !AC! do j=1,ntra
3587 !AC! do i=1,nd
3588 !AC! do il=1,ncum
3589 !AC! ftra(il,i,j)=0.0
3590 !AC! enddo
3591 !AC! enddo
3592 !AC! enddo
3593 ! print*,'cv3_yield initialisation 3'
3594
2/2
✓ Branch 0 taken 6480 times.
✓ Branch 1 taken 240 times.
6720 DO i = 1, nl
3595
2/2
✓ Branch 0 taken 3431619 times.
✓ Branch 1 taken 6480 times.
3438339 DO il = 1, ncum
3596 3431619 lvcp(il, i) = lv(il, i)/cpn(il, i)
3597 3438099 lfcp(il, i) = lf(il, i)/cpn(il, i)
3598 END DO
3599 END DO
3600
3601
3602
3603 ! *** calculate surface precipitation in mm/day ***
3604
3605
2/2
✓ Branch 0 taken 127097 times.
✓ Branch 1 taken 240 times.
127337 DO il = 1, ncum
3606
4/4
✓ Branch 0 taken 119852 times.
✓ Branch 1 taken 7245 times.
✓ Branch 2 taken 43809 times.
✓ Branch 3 taken 76043 times.
127337 IF (ep(il,inb(il))>=0.0001 .AND. iflag(il)<=1) THEN
3607
1/2
✓ Branch 0 taken 43809 times.
✗ Branch 1 not taken.
43809 IF (cvflag_ice) THEN
3608 precip(il) = wt(il, 1)*sigd(il)*(water(il,1)+ice(il,1)) &
3609 43809 *86400.*1000./(rowl*grav)
3610 ELSE
3611 precip(il) = wt(il, 1)*sigd(il)*water(il, 1) &
3612 *86400.*1000./(rowl*grav)
3613 END IF
3614 END IF
3615 END DO
3616 ! print*,'cv3_yield apres calcul precip'
3617
3618
3619 ! === calculate vertical profile of precipitation in kg/m2/s ===
3620
3621
2/2
✓ Branch 0 taken 6480 times.
✓ Branch 1 taken 240 times.
6720 DO i = 1, nl
3622
2/2
✓ Branch 0 taken 3431619 times.
✓ Branch 1 taken 6480 times.
3438339 DO il = 1, ncum
3623
6/6
✓ Branch 0 taken 3236004 times.
✓ Branch 1 taken 195615 times.
✓ Branch 2 taken 1619734 times.
✓ Branch 3 taken 1616270 times.
✓ Branch 4 taken 758407 times.
✓ Branch 5 taken 861327 times.
3438099 IF (ep(il,inb(il))>=0.0001 .AND. i<=inb(il) .AND. iflag(il)<=1) THEN
3624
1/2
✓ Branch 0 taken 758407 times.
✗ Branch 1 not taken.
758407 IF (cvflag_ice) THEN
3625 758407 Vprecip(il, i) = wt(il, i)*sigd(il)*(water(il,i)+ice(il,i))/grav
3626 758407 Vprecipi(il, i) = wt(il, i)*sigd(il)*ice(il,i)/grav ! jyg
3627 ELSE
3628 Vprecip(il, i) = wt(il, i)*sigd(il)*water(il, i)/grav
3629 Vprecipi(il, i) = 0. ! jyg
3630 END IF
3631 END IF
3632 END DO
3633 END DO
3634
3635
3636 ! *** Calculate downdraft velocity scale ***
3637 ! *** NE PAS UTILISER POUR L'INSTANT ***
3638
3639 !! do il=1,ncum
3640 !! wd(il)=betad*abs(mp(il,icb(il)))*0.01*rrd*t(il,icb(il)) &
3641 !! /(sigd(il)*p(il,icb(il)))
3642 !! enddo
3643
3644
3645 ! *** calculate tendencies of lowest level potential temperature ***
3646 ! *** and mixing ratio ***
3647
3648
2/2
✓ Branch 0 taken 127097 times.
✓ Branch 1 taken 240 times.
127337 DO il = 1, ncum
3649 127097 work(il) = 1.0/(ph(il,1)-ph(il,2))
3650 127337 cbmf(il) = 0.0
3651 END DO
3652
3653 ! - Adiabatic ascent mass flux "ma" and cloud base mass flux "cbmf"
3654 !-----------------------------------------------------------------
3655 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3656
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 240 times.
240 IF (adiab_ascent_mass_flux_depends_on_ejectliq) THEN
3657 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3658 !!! Warning : this option leads to water conservation violation
3659 !!! Expert only
3660 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3661 DO il = 1, ncum
3662 ma(il, nlp) = 0.
3663 ma(il, 1) = 0.
3664 END DO
3665 DO k = nl, 2, -1
3666 DO il = 1, ncum
3667 ma(il, k) = ma(il, k+1)*(1.-qta(il, k))/(1.-qta(il, k-1)) + m(il, k)
3668 cbmf(il) = max(cbmf(il), ma(il,k))
3669 END DO
3670 END DO
3671 DO k = 2,nl
3672 DO il = 1, ncum
3673 IF (k <icb(il)) THEN
3674 ma(il, k) = ma(il, k-1) + wghti(il,k-1)*cbmf(il)
3675 ENDIF
3676 END DO
3677 END DO
3678 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3679 ELSE ! (adiab_ascent_mass_flux_depends_on_ejectliq)
3680 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3681 !! Line kept for compatibility with earlier versions
3682
2/2
✓ Branch 0 taken 6240 times.
✓ Branch 1 taken 240 times.
6480 DO k = 2, nl
3683
2/2
✓ Branch 0 taken 3304522 times.
✓ Branch 1 taken 6240 times.
3311002 DO il = 1, ncum
3684
2/2
✓ Branch 0 taken 2911168 times.
✓ Branch 1 taken 393354 times.
3310762 IF (k>=icb(il)) THEN
3685 2911168 cbmf(il) = cbmf(il) + m(il, k)
3686 END IF
3687 END DO
3688 END DO
3689
3690
2/2
✓ Branch 0 taken 127097 times.
✓ Branch 1 taken 240 times.
127337 DO il = 1, ncum
3691 127097 ma(il, nlp) = 0.
3692 127337 ma(il, 1) = 0.
3693 END DO
3694
2/2
✓ Branch 0 taken 6240 times.
✓ Branch 1 taken 240 times.
6480 DO k = nl, 2, -1
3695
2/2
✓ Branch 0 taken 3304522 times.
✓ Branch 1 taken 6240 times.
3311002 DO il = 1, ncum
3696 3310762 ma(il, k) = ma(il, k+1) + m(il, k)
3697 END DO
3698 END DO
3699
2/2
✓ Branch 0 taken 240 times.
✓ Branch 1 taken 6240 times.
6480 DO k = 2,nl
3700
2/2
✓ Branch 0 taken 3304522 times.
✓ Branch 1 taken 6240 times.
3311002 DO il = 1, ncum
3701
2/2
✓ Branch 0 taken 393354 times.
✓ Branch 1 taken 2911168 times.
3310762 IF (k <icb(il)) THEN
3702 393354 ma(il, k) = ma(il, k-1) + wghti(il,k-1)*cbmf(il)
3703 ENDIF
3704 END DO
3705 END DO
3706
3707 ENDIF ! (adiab_ascent_mass_flux_depends_on_ejectliq) ELSE
3708 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3709 !
3710 ! print*,'cv3_yield avant ft'
3711 ! am is the part of cbmf taken from the first level
3712
2/2
✓ Branch 0 taken 127097 times.
✓ Branch 1 taken 240 times.
127337 DO il = 1, ncum
3713 127337 am(il) = cbmf(il)*wghti(il, 1)
3714 END DO
3715
3716
2/2
✓ Branch 0 taken 127097 times.
✓ Branch 1 taken 240 times.
127337 DO il = 1, ncum
3717
2/2
✓ Branch 0 taken 43809 times.
✓ Branch 1 taken 83288 times.
127337 IF (iflag(il)<=1) THEN
3718 ! convect3 if((0.1*dpinv*am).ge.delti)iflag(il)=4
3719 !JYG Correction pour conserver l'eau
3720 ! cc ft(il,1)=-0.5*lvcp(il,1)*sigd(il)*(evap(il,1)+evap(il,2)) !precip
3721
1/2
✓ Branch 0 taken 43809 times.
✗ Branch 1 not taken.
43809 IF (cvflag_ice) THEN
3722 ft(il, 1) = -lvcp(il, 1)*sigd(il)*evap(il, 1) - &
3723 lfcp(il, 1)*sigd(il)*evap(il, 1)*faci(il, 1) - &
3724 lfcp(il, 1)*sigd(il)*(fondue(il,1)*wt(il,1)) / &
3725 43809 (100.*(ph(il,1)-ph(il,2))) !precip
3726 ELSE
3727 ft(il, 1) = -lvcp(il, 1)*sigd(il)*evap(il, 1)
3728 END IF
3729
3730 43809 ft(il, 1) = ft(il, 1) - 0.009*grav*sigd(il)*mp(il, 2)*t_wake(il, 1)*b(il, 1)*work(il)
3731
3732
1/2
✓ Branch 0 taken 43809 times.
✗ Branch 1 not taken.
43809 IF (cvflag_ice) THEN
3733 ft(il, 1) = ft(il, 1) + 0.01*sigd(il)*wt(il, 1)*(cl-cpd)*water(il, 2) * &
3734 (t_wake(il,2)-t_wake(il,1))*work(il)/cpn(il, 1) + &
3735 0.01*sigd(il)*wt(il, 1)*(ci-cpd)*ice(il, 2) * &
3736 43809 (t_wake(il,2)-t_wake(il,1))*work(il)/cpn(il, 1)
3737 ELSE
3738 ft(il, 1) = ft(il, 1) + 0.01*sigd(il)*wt(il, 1)*(cl-cpd)*water(il, 2) * &
3739 (t_wake(il,2)-t_wake(il,1))*work(il)/cpn(il, 1)
3740 END IF
3741
3742 43809 ftd(il, 1) = ft(il, 1) ! fin precip
3743
3744
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 43809 times.
43809 IF ((0.01*grav*work(il)*am(il))>=delti) iflag(il) = 1 !consist vect
3745 !jyg<
3746
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 43809 times.
43809 IF (fl_cor_ebil >= 2) THEN
3747 ft(il, 1) = ft(il, 1) + 0.01*grav*work(il)*am(il) * &
3748 ((t(il,2)-t(il,1))*cpn(il,2)+gz(il,2)-gz(il,1))/cpn(il,1)
3749 ELSE
3750 ft(il, 1) = ft(il, 1) + 0.01*grav*work(il)*am(il) * &
3751 43809 (t(il,2)-t(il,1)+(gz(il,2)-gz(il,1))/cpn(il,1))
3752 ENDIF
3753 !>jyg
3754 END IF ! iflag
3755 END DO
3756
3757
3758
2/2
✓ Branch 0 taken 6240 times.
✓ Branch 1 taken 240 times.
6480 DO j = 2, nl
3759
1/2
✓ Branch 0 taken 6240 times.
✗ Branch 1 not taken.
6480 IF (iflag_mix>0) THEN
3760
2/2
✓ Branch 0 taken 3304522 times.
✓ Branch 1 taken 6240 times.
3310762 DO il = 1, ncum
3761 ! FH WARNING a modifier :
3762 cpinv = 0.
3763 ! cpinv=1.0/cpn(il,1)
3764
4/4
✓ Branch 0 taken 1538058 times.
✓ Branch 1 taken 1766464 times.
✓ Branch 2 taken 714598 times.
✓ Branch 3 taken 823460 times.
3310762 IF (j<=inb(il) .AND. iflag(il)<=1) THEN
3765 ft(il, 1) = ft(il, 1) + 0.01*grav*work(il)*ment(il, j, 1) * &
3766 714598 (hent(il,j,1)-h(il,1)+t(il,1)*(cpv-cpd)*(rr(il,1)-qent(il,j,1)))*cpinv
3767 END IF ! j
3768 END DO
3769 END IF
3770 END DO
3771 ! fin sature
3772
3773
3774
2/2
✓ Branch 0 taken 127097 times.
✓ Branch 1 taken 240 times.
127337 DO il = 1, ncum
3775
2/2
✓ Branch 0 taken 43809 times.
✓ Branch 1 taken 83288 times.
127337 IF (iflag(il)<=1) THEN
3776 !JYG1 Correction pour mieux conserver l'eau (conformite avec CONVECT4.3)
3777 fr(il, 1) = 0.01*grav*mp(il, 2)*(rp(il,2)-rr_wake(il,1))*work(il) + &
3778 43809 sigd(il)*evap(il, 1)
3779 !!! sigd(il)*0.5*(evap(il,1)+evap(il,2))
3780
3781 43809 fqd(il, 1) = fr(il, 1) !precip
3782
3783 43809 fr(il, 1) = fr(il, 1) + 0.01*grav*am(il)*(rr(il,2)-rr(il,1))*work(il) !sature
3784
3785 fu(il, 1) = fu(il, 1) + 0.01*grav*work(il)*(mp(il,2)*(up(il,2)-u(il,1)) + &
3786 43809 am(il)*(u(il,2)-u(il,1)))
3787 fv(il, 1) = fv(il, 1) + 0.01*grav*work(il)*(mp(il,2)*(vp(il,2)-v(il,1)) + &
3788 43809 am(il)*(v(il,2)-v(il,1)))
3789 END IF ! iflag
3790 END DO ! il
3791
3792
3793 !AC! do j=1,ntra
3794 !AC! do il=1,ncum
3795 !AC! if (iflag(il) .le. 1) then
3796 !AC! if (cvflag_grav) then
3797 !AC! ftra(il,1,j)=ftra(il,1,j)+0.01*grav*work(il)
3798 !AC! : *(mp(il,2)*(trap(il,2,j)-tra(il,1,j))
3799 !AC! : +am(il)*(tra(il,2,j)-tra(il,1,j)))
3800 !AC! else
3801 !AC! ftra(il,1,j)=ftra(il,1,j)+0.1*work(il)
3802 !AC! : *(mp(il,2)*(trap(il,2,j)-tra(il,1,j))
3803 !AC! : +am(il)*(tra(il,2,j)-tra(il,1,j)))
3804 !AC! endif
3805 !AC! endif ! iflag
3806 !AC! enddo
3807 !AC! enddo
3808
3809
2/2
✓ Branch 0 taken 6240 times.
✓ Branch 1 taken 240 times.
6480 DO j = 2, nl
3810
2/2
✓ Branch 0 taken 3304522 times.
✓ Branch 1 taken 6240 times.
3311002 DO il = 1, ncum
3811
4/4
✓ Branch 0 taken 1538058 times.
✓ Branch 1 taken 1766464 times.
✓ Branch 2 taken 714598 times.
✓ Branch 3 taken 823460 times.
3310762 IF (j<=inb(il) .AND. iflag(il)<=1) THEN
3812 714598 fr(il, 1) = fr(il, 1) + 0.01*grav*work(il)*ment(il, j, 1)*(qent(il,j,1)-rr(il,1))
3813 714598 fu(il, 1) = fu(il, 1) + 0.01*grav*work(il)*ment(il, j, 1)*(uent(il,j,1)-u(il,1))
3814 714598 fv(il, 1) = fv(il, 1) + 0.01*grav*work(il)*ment(il, j, 1)*(vent(il,j,1)-v(il,1))
3815 END IF ! j
3816 END DO
3817 END DO
3818
3819 !AC! do k=1,ntra
3820 !AC! do j=2,nl
3821 !AC! do il=1,ncum
3822 !AC! if (j.le.inb(il) .and. iflag(il) .le. 1) then
3823 !AC!
3824 !AC! if (cvflag_grav) then
3825 !AC! ftra(il,1,k)=ftra(il,1,k)+0.01*grav*work(il)*ment(il,j,1)
3826 !AC! : *(traent(il,j,1,k)-tra(il,1,k))
3827 !AC! else
3828 !AC! ftra(il,1,k)=ftra(il,1,k)+0.1*work(il)*ment(il,j,1)
3829 !AC! : *(traent(il,j,1,k)-tra(il,1,k))
3830 !AC! endif
3831 !AC!
3832 !AC! endif
3833 !AC! enddo
3834 !AC! enddo
3835 !AC! enddo
3836 ! print*,'cv3_yield apres ft'
3837
3838 !jyg<
3839 !-----------------------------------------------------------
3840
1/2
✓ Branch 0 taken 240 times.
✗ Branch 1 not taken.
240 IF (ok_optim_yield) THEN !|
3841 !-----------------------------------------------------------
3842 !
3843 !*** ***
3844 !*** Compute convective mass fluxes upwd and dnwd ***
3845
3846 !
3847 ! =================================================
3848 ! upward fluxes |
3849 ! ------------------------------------------------
3850 !
3851
4/4
✓ Branch 0 taken 9360 times.
✓ Branch 1 taken 240 times.
✓ Branch 2 taken 9303840 times.
✓ Branch 3 taken 9360 times.
9313440 upwd(:,:) = 0.
3852
4/4
✓ Branch 0 taken 9360 times.
✓ Branch 1 taken 240 times.
✓ Branch 2 taken 9303840 times.
✓ Branch 3 taken 9360 times.
9313440 up_to(:,:) = 0.
3853
4/4
✓ Branch 0 taken 9360 times.
✓ Branch 1 taken 240 times.
✓ Branch 2 taken 9303840 times.
✓ Branch 3 taken 9360 times.
9313440 up_from(:,:) = 0.
3854 !
3855 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3856
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 240 times.
240 IF (adiab_ascent_mass_flux_depends_on_ejectliq) THEN
3857 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3858 !! The decrease of the adiabatic ascent mass flux due to ejection of precipitation
3859 !! is taken into account.
3860 !! WARNING : in the present version, taking into account the mass-flux decrease due to
3861 !! precipitation ejection leads to water conservation violation.
3862 !
3863 ! - Upward mass flux of mixed draughts
3864 !---------------------------------------
3865 DO i = 2, nl
3866 DO j = 1, i-1
3867 DO il = 1, ncum
3868 IF (i<=inb(il)) THEN
3869 up_to(il,i) = up_to(il,i) + ment(il,j,i)
3870 ENDIF
3871 ENDDO
3872 ENDDO
3873 ENDDO
3874 !
3875 DO j = 3, nl
3876 DO i = 2, j-1
3877 DO il = 1, ncum
3878 IF (j<=inb(il)) THEN
3879 up_from(il,i) = up_from(il,i) + ment(il,i,j)
3880 ENDIF
3881 ENDDO
3882 ENDDO
3883 ENDDO
3884 !
3885 ! The difference between upwd(il,i) and upwd(il,i-1) is due to updrafts ending in layer
3886 !(i-1) (theses drafts cross interface (i-1) but not interface(i)) and to updrafts starting
3887 !from layer (i-1) (theses drafts cross interface (i) but not interface(i-1)):
3888 !
3889 DO i = 2, nlp
3890 DO il = 1, ncum
3891 IF (i<=inb(il)+1) THEN
3892 upwd(il,i) = max(0., upwd(il,i-1) - up_to(il,i-1) + up_from(il,i-1))
3893 ENDIF
3894 ENDDO
3895 ENDDO
3896 !
3897 ! - Total upward mass flux
3898 !---------------------------
3899 DO i = 2, nlp
3900 DO il = 1, ncum
3901 IF (i<=inb(il)+1) THEN
3902 upwd(il,i) = upwd(il,i) + ma(il,i)
3903 ENDIF
3904 ENDDO
3905 ENDDO
3906 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3907 ELSE ! (adiab_ascent_mass_flux_depends_on_ejectliq)
3908 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3909 !! The decrease of the adiabatic ascent mass flux due to ejection of precipitation
3910 !! is not taken into account.
3911 !
3912 ! - Upward mass flux
3913 !-------------------
3914
2/2
✓ Branch 0 taken 6240 times.
✓ Branch 1 taken 240 times.
6480 DO i = 2, nl
3915
2/2
✓ Branch 0 taken 3304522 times.
✓ Branch 1 taken 6240 times.
3310762 DO il = 1, ncum
3916
2/2
✓ Branch 0 taken 1538058 times.
✓ Branch 1 taken 1766464 times.
3310762 IF (i<=inb(il)) THEN
3917 1538058 up_to(il,i) = m(il,i)
3918 ENDIF
3919 ENDDO
3920
2/2
✓ Branch 0 taken 84240 times.
✓ Branch 1 taken 6240 times.
90720 DO j = 1, i-1
3921
2/2
✓ Branch 0 taken 44611047 times.
✓ Branch 1 taken 84240 times.
44701527 DO il = 1, ncum
3922
2/2
✓ Branch 0 taken 11445266 times.
✓ Branch 1 taken 33165781 times.
44695287 IF (i<=inb(il)) THEN
3923 11445266 up_to(il,i) = up_to(il,i) + ment(il,j,i)
3924 ENDIF
3925 ENDDO
3926 ENDDO
3927 ENDDO
3928 !
3929
2/2
✓ Branch 0 taken 6480 times.
✓ Branch 1 taken 240 times.
6720 DO i = 1, nl
3930
2/2
✓ Branch 0 taken 3431619 times.
✓ Branch 1 taken 6480 times.
3438339 DO il = 1, ncum
3931
2/2
✓ Branch 0 taken 1665155 times.
✓ Branch 1 taken 1766464 times.
3438099 IF (i<=inb(il)) THEN
3932 1665155 up_from(il,i) = cbmf(il)*wghti(il,i)
3933 ENDIF
3934 ENDDO
3935 ENDDO
3936 !
3937
2/2
✓ Branch 0 taken 6000 times.
✓ Branch 1 taken 240 times.
6240 DO j = 3, nl
3938
2/2
✓ Branch 0 taken 78000 times.
✓ Branch 1 taken 6000 times.
84240 DO i = 2, j-1
3939
2/2
✓ Branch 0 taken 41306525 times.
✓ Branch 1 taken 78000 times.
41390525 DO il = 1, ncum
3940
2/2
✓ Branch 0 taken 9907208 times.
✓ Branch 1 taken 31399317 times.
41384525 IF (j<=inb(il)) THEN
3941 9907208 up_from(il,i) = up_from(il,i) + ment(il,i,j)
3942 ENDIF
3943 ENDDO
3944 ENDDO
3945 ENDDO
3946 !
3947 ! The difference between upwd(il,i) and upwd(il,i-1) is due to updrafts ending in layer
3948 !(i-1) (theses drafts cross interface (i-1) but not interface(i)) and to updrafts starting
3949 !from layer (i-1) (theses drafts cross interface (i) but not interface(i-1)):
3950 !
3951
2/2
✓ Branch 0 taken 240 times.
✓ Branch 1 taken 6480 times.
6720 DO i = 2, nlp
3952
2/2
✓ Branch 0 taken 3431619 times.
✓ Branch 1 taken 6480 times.
3438339 DO il = 1, ncum
3953
2/2
✓ Branch 0 taken 1665155 times.
✓ Branch 1 taken 1766464 times.
3438099 IF (i<=inb(il)+1) THEN
3954 1665155 upwd(il,i) = max(0., upwd(il,i-1) - up_to(il,i-1) + up_from(il,i-1))
3955 ENDIF
3956 ENDDO
3957 ENDDO
3958
3959
3960 ENDIF ! (adiab_ascent_mass_flux_depends_on_ejectliq) ELSE
3961 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3962
3963 !
3964 ! =================================================
3965 ! downward fluxes |
3966 ! ------------------------------------------------
3967
4/4
✓ Branch 0 taken 9360 times.
✓ Branch 1 taken 240 times.
✓ Branch 2 taken 9303840 times.
✓ Branch 3 taken 9360 times.
9313440 dnwd(:,:) = 0.
3968
4/4
✓ Branch 0 taken 9360 times.
✓ Branch 1 taken 240 times.
✓ Branch 2 taken 9303840 times.
✓ Branch 3 taken 9360 times.
9313440 dn_to(:,:) = 0.
3969
4/4
✓ Branch 0 taken 9360 times.
✓ Branch 1 taken 240 times.
✓ Branch 2 taken 9303840 times.
✓ Branch 3 taken 9360 times.
9313440 dn_from(:,:) = 0.
3970
2/2
✓ Branch 0 taken 6480 times.
✓ Branch 1 taken 240 times.
6720 DO i = 1, nl
3971
2/2
✓ Branch 0 taken 6480 times.
✓ Branch 1 taken 84240 times.
90960 DO j = i+1, nl
3972
2/2
✓ Branch 0 taken 44611047 times.
✓ Branch 1 taken 84240 times.
44701767 DO il = 1, ncum
3973
2/2
✓ Branch 0 taken 11445266 times.
✓ Branch 1 taken 33165781 times.
44695287 IF (j<=inb(il)) THEN
3974 11445266 dn_to(il,i) = dn_to(il,i) + ment(il,j,i)
3975 ENDIF
3976 ENDDO
3977 ENDDO
3978 ENDDO
3979 !
3980
2/2
✓ Branch 0 taken 6480 times.
✓ Branch 1 taken 240 times.
6720 DO j = 1, nl
3981
2/2
✓ Branch 0 taken 6480 times.
✓ Branch 1 taken 84240 times.
90960 DO i = j+1, nl
3982
2/2
✓ Branch 0 taken 44611047 times.
✓ Branch 1 taken 84240 times.
44701767 DO il = 1, ncum
3983
2/2
✓ Branch 0 taken 11445266 times.
✓ Branch 1 taken 33165781 times.
44695287 IF (i<=inb(il)) THEN
3984 11445266 dn_from(il,i) = dn_from(il,i) + ment(il,i,j)
3985 ENDIF
3986 ENDDO
3987 ENDDO
3988 ENDDO
3989 !
3990 ! The difference between dnwd(il,i) and dnwd(il,i+1) is due to downdrafts ending in layer
3991 !(i) (theses drafts cross interface (i+1) but not interface(i)) and to downdrafts
3992 !starting from layer (i) (theses drafts cross interface (i) but not interface(i+1)):
3993 !
3994
2/2
✓ Branch 0 taken 240 times.
✓ Branch 1 taken 6240 times.
6480 DO i = nl-1, 1, -1
3995
2/2
✓ Branch 0 taken 3304522 times.
✓ Branch 1 taken 6240 times.
3311002 DO il = 1, ncum
3996 3310762 dnwd(il,i) = max(0., dnwd(il,i+1) - dn_to(il,i) + dn_from(il,i))
3997 ENDDO
3998 ENDDO
3999 ! =================================================
4000 !
4001 !-----------------------------------------------------------
4002 ENDIF !(ok_optim_yield) !|
4003 !-----------------------------------------------------------
4004 !>jyg
4005
4006 ! *** calculate tendencies of potential temperature and mixing ratio ***
4007 ! *** at levels above the lowest level ***
4008
4009 ! *** first find the net saturated updraft and downdraft mass fluxes ***
4010 ! *** through each level ***
4011
4012
4013 !jyg<
4014 !! DO i = 2, nl + 1 ! newvecto: mettre nl au lieu nl+1?
4015
2/2
✓ Branch 0 taken 6240 times.
✓ Branch 1 taken 240 times.
6480 DO i = 2, nl
4016 !>jyg
4017
4018 num1 = 0
4019
2/2
✓ Branch 0 taken 3304522 times.
✓ Branch 1 taken 6240 times.
3310762 DO il = 1, ncum
4020
4/4
✓ Branch 0 taken 1538058 times.
✓ Branch 1 taken 1766464 times.
✓ Branch 2 taken 714598 times.
✓ Branch 3 taken 823460 times.
3310762 IF (i<=inb(il) .AND. iflag(il)<=1) num1 = num1 + 1
4021 END DO
4022
2/2
✓ Branch 0 taken 4870 times.
✓ Branch 1 taken 1370 times.
6240 IF (num1<=0) GO TO 500
4023
4024 !
4025 !jyg<
4026 !-----------------------------------------------------------
4027
1/2
✓ Branch 0 taken 4870 times.
✗ Branch 1 not taken.
4870 IF (ok_optim_yield) THEN !|
4028 !-----------------------------------------------------------
4029
2/2
✓ Branch 0 taken 4870 times.
✓ Branch 1 taken 2578981 times.
2583851 DO il = 1, ncum
4030 2578981 amp1(il) = upwd(il,i+1)
4031 2583851 ad(il) = dnwd(il,i)
4032 ENDDO
4033 !-----------------------------------------------------------
4034 ELSE !(ok_optim_yield) !|
4035 !-----------------------------------------------------------
4036 !>jyg
4037 DO il = 1,ncum
4038 amp1(il) = 0.
4039 ad(il) = 0.
4040 ENDDO
4041
4042 DO k = 1, nl + 1
4043 DO il = 1, ncum
4044 IF (i>=icb(il)) THEN
4045 IF (k>=i+1 .AND. k<=(inb(il)+1)) THEN
4046 amp1(il) = amp1(il) + m(il, k)
4047 END IF
4048 ELSE
4049 ! AMP1 is the part of cbmf taken from layers I and lower
4050 IF (k<=i) THEN
4051 amp1(il) = amp1(il) + cbmf(il)*wghti(il, k)
4052 END IF
4053 END IF
4054 END DO
4055 END DO
4056
4057 DO j = i + 1, nl + 1
4058 DO k = 1, i
4059 !yor! reverted j and k loops
4060 DO il = 1, ncum
4061 !yor! IF (i<=inb(il) .AND. j<=(inb(il)+1)) THEN ! the second condition implies the first !
4062 IF (j<=(inb(il)+1)) THEN
4063 amp1(il) = amp1(il) + ment(il, k, j)
4064 END IF
4065 END DO
4066 END DO
4067 END DO
4068
4069 DO k = 1, i - 1
4070 !jyg<
4071 !! DO j = i, nl + 1 ! newvecto: nl au lieu nl+1?
4072 DO j = i, nl
4073 !>jyg
4074 DO il = 1, ncum
4075 !yor! IF (i<=inb(il) .AND. j<=inb(il)) THEN ! the second condition implies the 1st !
4076 IF (j<=inb(il)) THEN
4077 ad(il) = ad(il) + ment(il, j, k)
4078 END IF
4079 END DO
4080 END DO
4081 END DO
4082 !
4083 !-----------------------------------------------------------
4084 ENDIF !(ok_optim_yield) !|
4085 !-----------------------------------------------------------
4086 !
4087 !! print *,'yield, i, amp1, ad', i, amp1(1), ad(1)
4088
4089
2/2
✓ Branch 0 taken 2578981 times.
✓ Branch 1 taken 4870 times.
2583851 DO il = 1, ncum
4090
4/4
✓ Branch 0 taken 1538055 times.
✓ Branch 1 taken 1040926 times.
✓ Branch 2 taken 714598 times.
✓ Branch 3 taken 823457 times.
2583851 IF (i<=inb(il) .AND. iflag(il)<=1) THEN
4091 714598 dpinv = 1.0/(ph(il,i)-ph(il,i+1))
4092 714598 cpinv = 1.0/cpn(il, i)
4093
4094 ! convect3 if((0.1*dpinv*amp1).ge.delti)iflag(il)=4
4095
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 714597 times.
714598 IF ((0.01*grav*dpinv*amp1(il))>=delti) iflag(il) = 1 ! vecto
4096
4097 ! precip
4098 ! cc ft(il,i)= -0.5*sigd(il)*lvcp(il,i)*(evap(il,i)+evap(il,i+1))
4099
1/2
✓ Branch 0 taken 714598 times.
✗ Branch 1 not taken.
714598 IF (cvflag_ice) THEN
4100 ft(il, i) = -sigd(il)*lvcp(il, i)*evap(il, i) - &
4101 sigd(il)*lfcp(il, i)*evap(il, i)*faci(il, i) - &
4102 714598 sigd(il)*lfcp(il, i)*fondue(il, i)*wt(il, i)/(100.*(p(il,i-1)-p(il,i)))
4103 ELSE
4104 ft(il, i) = -sigd(il)*lvcp(il, i)*evap(il, i)
4105 END IF
4106
4107 714598 rat = cpn(il, i-1)*cpinv
4108
4109 ft(il, i) = ft(il, i) - 0.009*grav*sigd(il) * &
4110 714598 (mp(il,i+1)*t_wake(il,i)*b(il,i)-mp(il,i)*t_wake(il,i-1)*rat*b(il,i-1))*dpinv
4111
1/2
✓ Branch 0 taken 714598 times.
✗ Branch 1 not taken.
714598 IF (cvflag_ice) THEN
4112 ft(il, i) = ft(il, i) + 0.01*sigd(il)*wt(il, i)*(cl-cpd)*water(il, i+1) * &
4113 (t_wake(il,i+1)-t_wake(il,i))*dpinv*cpinv + &
4114 0.01*sigd(il)*wt(il, i)*(ci-cpd)*ice(il, i+1) * &
4115 714598 (t_wake(il,i+1)-t_wake(il,i))*dpinv*cpinv
4116 ELSE
4117 ft(il, i) = ft(il, i) + 0.01*sigd(il)*wt(il, i)*(cl-cpd)*water(il, i+1) * &
4118 (t_wake(il,i+1)-t_wake(il,i))*dpinv* &
4119 cpinv
4120 END IF
4121
4122 714598 ftd(il, i) = ft(il, i)
4123 ! fin precip
4124
4125 ! sature
4126 !jyg<
4127
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 714598 times.
714598 IF (fl_cor_ebil >= 2) THEN
4128 ft(il, i) = ft(il, i) + 0.01*grav*dpinv * &
4129 ( amp1(il)*( (t(il,i+1)-t(il,i))*cpn(il,i+1) + gz(il,i+1)-gz(il,i))*cpinv - &
4130 ad(il)*( (t(il,i)-t(il,i-1))*cpn(il,i-1) + gz(il,i)-gz(il,i-1))*cpinv)
4131 ELSE
4132 ft(il, i) = ft(il, i) + 0.01*grav*dpinv * &
4133 (amp1(il)*(t(il,i+1)-t(il,i) + (gz(il,i+1)-gz(il,i))*cpinv) - &
4134 714598 ad(il)*(t(il,i)-t(il,i-1)+(gz(il,i)-gz(il,i-1))*cpinv))
4135 ENDIF
4136 !>jyg
4137
4138
4139
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 714598 times.
714598 IF (iflag_mix==0) THEN
4140 ft(il, i) = ft(il, i) + 0.01*grav*dpinv*ment(il, i, i)*(hp(il,i)-h(il,i) + &
4141 t(il,i)*(cpv-cpd)*(rr(il,i)-qent(il,i,i)))*cpinv
4142 END IF
4143 !
4144 ! sb: on ne fait pas encore la correction permettant de mieux
4145 ! conserver l'eau:
4146 !JYG: correction permettant de mieux conserver l'eau:
4147 ! cc fr(il,i)=0.5*sigd(il)*(evap(il,i)+evap(il,i+1))
4148 fr(il, i) = sigd(il)*evap(il, i) + 0.01*grav*(mp(il,i+1)*(rp(il,i+1)-rr_wake(il,i)) - &
4149 714598 mp(il,i)*(rp(il,i)-rr_wake(il,i-1)))*dpinv
4150 714598 fqd(il, i) = fr(il, i) ! precip
4151
4152 fu(il, i) = 0.01*grav*(mp(il,i+1)*(up(il,i+1)-u(il,i)) - &
4153 714598 mp(il,i)*(up(il,i)-u(il,i-1)))*dpinv
4154 fv(il, i) = 0.01*grav*(mp(il,i+1)*(vp(il,i+1)-v(il,i)) - &
4155 714598 mp(il,i)*(vp(il,i)-v(il,i-1)))*dpinv
4156
4157
4158 fr(il, i) = fr(il, i) + 0.01*grav*dpinv*(amp1(il)*(rr(il,i+1)-rr(il,i)) - &
4159 714598 ad(il)*(rr(il,i)-rr(il,i-1)))
4160 fu(il, i) = fu(il, i) + 0.01*grav*dpinv*(amp1(il)*(u(il,i+1)-u(il,i)) - &
4161 714598 ad(il)*(u(il,i)-u(il,i-1)))
4162 fv(il, i) = fv(il, i) + 0.01*grav*dpinv*(amp1(il)*(v(il,i+1)-v(il,i)) - &
4163 714598 ad(il)*(v(il,i)-v(il,i-1)))
4164
4165 END IF ! i
4166 END DO
4167
4168 !AC! do k=1,ntra
4169 !AC! do il=1,ncum
4170 !AC! if (i.le.inb(il) .and. iflag(il) .le. 1) then
4171 !AC! dpinv=1.0/(ph(il,i)-ph(il,i+1))
4172 !AC! cpinv=1.0/cpn(il,i)
4173 !AC! if (cvflag_grav) then
4174 !AC! ftra(il,i,k)=ftra(il,i,k)+0.01*grav*dpinv
4175 !AC! : *(amp1(il)*(tra(il,i+1,k)-tra(il,i,k))
4176 !AC! : -ad(il)*(tra(il,i,k)-tra(il,i-1,k)))
4177 !AC! else
4178 !AC! ftra(il,i,k)=ftra(il,i,k)+0.1*dpinv
4179 !AC! : *(amp1(il)*(tra(il,i+1,k)-tra(il,i,k))
4180 !AC! : -ad(il)*(tra(il,i,k)-tra(il,i-1,k)))
4181 !AC! endif
4182 !AC! endif
4183 !AC! enddo
4184 !AC! enddo
4185
4186
2/2
✓ Branch 0 taken 51870 times.
✓ Branch 1 taken 4870 times.
56740 DO k = 1, i - 1
4187
4188
2/2
✓ Branch 0 taken 27468231 times.
✓ Branch 1 taken 51870 times.
27520101 DO il = 1, ncum
4189 27468231 awat(il) = elij(il, k, i) - (1.-ep(il,i))*clw(il, i)
4190 27520101 awat(il) = max(awat(il), 0.0)
4191 END DO
4192
4193
1/2
✓ Branch 0 taken 51870 times.
✗ Branch 1 not taken.
51870 IF (iflag_mix/=0) THEN
4194
2/2
✓ Branch 0 taken 51870 times.
✓ Branch 1 taken 27468231 times.
27520101 DO il = 1, ncum
4195
4/4
✓ Branch 0 taken 11445203 times.
✓ Branch 1 taken 16023028 times.
✓ Branch 2 taken 6410667 times.
✓ Branch 3 taken 5034536 times.
27520101 IF (i<=inb(il) .AND. iflag(il)<=1) THEN
4196 6410667 dpinv = 1.0/(ph(il,i)-ph(il,i+1))
4197 6410667 cpinv = 1.0/cpn(il, i)
4198 ft(il, i) = ft(il, i) + 0.01*grav*dpinv*ment(il, k, i) * &
4199 6410667 (hent(il,k,i)-h(il,i)+t(il,i)*(cpv-cpd)*(rr(il,i)+awat(il)-qent(il,k,i)))*cpinv
4200 !
4201 !
4202 END IF ! i
4203 END DO
4204 END IF
4205
4206
2/2
✓ Branch 0 taken 27468231 times.
✓ Branch 1 taken 51870 times.
27524971 DO il = 1, ncum
4207
4/4
✓ Branch 0 taken 11445203 times.
✓ Branch 1 taken 16023028 times.
✓ Branch 2 taken 6410667 times.
✓ Branch 3 taken 5034536 times.
27520101 IF (i<=inb(il) .AND. iflag(il)<=1) THEN
4208 6410667 dpinv = 1.0/(ph(il,i)-ph(il,i+1))
4209 cpinv = 1.0/cpn(il, i)
4210 fr(il, i) = fr(il, i) + 0.01*grav*dpinv*ment(il, k, i) * &
4211 6410667 (qent(il,k,i)-awat(il)-rr(il,i))
4212 6410667 fu(il, i) = fu(il, i) + 0.01*grav*dpinv*ment(il, k, i)*(uent(il,k,i)-u(il,i))
4213 6410667 fv(il, i) = fv(il, i) + 0.01*grav*dpinv*ment(il, k, i)*(vent(il,k,i)-v(il,i))
4214
4215 ! (saturated updrafts resulting from mixing) ! cld
4216 6410667 qcond(il, i) = qcond(il, i) + (elij(il,k,i)-awat(il)) ! cld
4217 6410667 qtment(il, i) = qtment(il, i) + qent(il,k,i) ! cld
4218 6410667 nqcond(il, i) = nqcond(il, i) + 1. ! cld
4219 END IF ! i
4220 END DO
4221 END DO
4222
4223 !AC! do j=1,ntra
4224 !AC! do k=1,i-1
4225 !AC! do il=1,ncum
4226 !AC! if (i.le.inb(il) .and. iflag(il) .le. 1) then
4227 !AC! dpinv=1.0/(ph(il,i)-ph(il,i+1))
4228 !AC! cpinv=1.0/cpn(il,i)
4229 !AC! if (cvflag_grav) then
4230 !AC! ftra(il,i,j)=ftra(il,i,j)+0.01*grav*dpinv*ment(il,k,i)
4231 !AC! : *(traent(il,k,i,j)-tra(il,i,j))
4232 !AC! else
4233 !AC! ftra(il,i,j)=ftra(il,i,j)+0.1*dpinv*ment(il,k,i)
4234 !AC! : *(traent(il,k,i,j)-tra(il,i,j))
4235 !AC! endif
4236 !AC! endif
4237 !AC! enddo
4238 !AC! enddo
4239 !AC! enddo
4240
4241 !jyg<
4242 !! DO k = i, nl + 1
4243
2/2
✓ Branch 0 taken 79620 times.
✓ Branch 1 taken 4870 times.
84490 DO k = i, nl
4244 !>jyg
4245
4246
1/2
✓ Branch 0 taken 79620 times.
✗ Branch 1 not taken.
79620 IF (iflag_mix/=0) THEN
4247
2/2
✓ Branch 0 taken 79620 times.
✓ Branch 1 taken 42164256 times.
42243876 DO il = 1, ncum
4248
6/6
✓ Branch 0 taken 30082282 times.
✓ Branch 1 taken 12081974 times.
✓ Branch 2 taken 11445263 times.
✓ Branch 3 taken 18637019 times.
✓ Branch 4 taken 6410667 times.
✓ Branch 5 taken 5034596 times.
42243876 IF (i<=inb(il) .AND. k<=inb(il) .AND. iflag(il)<=1) THEN
4249 6410667 dpinv = 1.0/(ph(il,i)-ph(il,i+1))
4250 6410667 cpinv = 1.0/cpn(il, i)
4251 ft(il, i) = ft(il, i) + 0.01*grav*dpinv*ment(il, k, i) * &
4252 6410667 (hent(il,k,i)-h(il,i)+t(il,i)*(cpv-cpd)*(rr(il,i)-qent(il,k,i)))*cpinv
4253
4254
4255 END IF ! i
4256 END DO
4257 END IF
4258
4259
2/2
✓ Branch 0 taken 42164256 times.
✓ Branch 1 taken 79620 times.
42248746 DO il = 1, ncum
4260
6/6
✓ Branch 0 taken 30082282 times.
✓ Branch 1 taken 12081974 times.
✓ Branch 2 taken 11445263 times.
✓ Branch 3 taken 18637019 times.
✓ Branch 4 taken 6410667 times.
✓ Branch 5 taken 5034596 times.
42243876 IF (i<=inb(il) .AND. k<=inb(il) .AND. iflag(il)<=1) THEN
4261 6410667 dpinv = 1.0/(ph(il,i)-ph(il,i+1))
4262 cpinv = 1.0/cpn(il, i)
4263
4264 6410667 fr(il, i) = fr(il, i) + 0.01*grav*dpinv*ment(il, k, i)*(qent(il,k,i)-rr(il,i))
4265 6410667 fu(il, i) = fu(il, i) + 0.01*grav*dpinv*ment(il, k, i)*(uent(il,k,i)-u(il,i))
4266 6410667 fv(il, i) = fv(il, i) + 0.01*grav*dpinv*ment(il, k, i)*(vent(il,k,i)-v(il,i))
4267 END IF ! i and k
4268 END DO
4269 END DO
4270
4271 !AC! do j=1,ntra
4272 !AC! do k=i,nl+1
4273 !AC! do il=1,ncum
4274 !AC! if (i.le.inb(il) .and. k.le.inb(il)
4275 !AC! $ .and. iflag(il) .le. 1) then
4276 !AC! dpinv=1.0/(ph(il,i)-ph(il,i+1))
4277 !AC! cpinv=1.0/cpn(il,i)
4278 !AC! if (cvflag_grav) then
4279 !AC! ftra(il,i,j)=ftra(il,i,j)+0.01*grav*dpinv*ment(il,k,i)
4280 !AC! : *(traent(il,k,i,j)-tra(il,i,j))
4281 !AC! else
4282 !AC! ftra(il,i,j)=ftra(il,i,j)+0.1*dpinv*ment(il,k,i)
4283 !AC! : *(traent(il,k,i,j)-tra(il,i,j))
4284 !AC! endif
4285 !AC! endif ! i and k
4286 !AC! enddo
4287 !AC! enddo
4288 !AC! enddo
4289
4290 ! sb: interface with the cloud parameterization: ! cld
4291
4292
2/2
✓ Branch 0 taken 74750 times.
✓ Branch 1 taken 4870 times.
79620 DO k = i + 1, nl
4293
2/2
✓ Branch 0 taken 39585275 times.
✓ Branch 1 taken 74750 times.
39664895 DO il = 1, ncum
4294
5/6
✓ Branch 0 taken 9907208 times.
✓ Branch 1 taken 29678067 times.
✓ Branch 2 taken 9907208 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 5696069 times.
✓ Branch 5 taken 4211139 times.
39660025 IF (k<=inb(il) .AND. i<=inb(il) .AND. iflag(il)<=1) THEN ! cld
4295 ! (saturated downdrafts resulting from mixing) ! cld
4296 5696069 qcond(il, i) = qcond(il, i) + elij(il, k, i) ! cld
4297 5696069 qtment(il, i) = qent(il,k,i) + qtment(il,i) ! cld
4298 5696069 nqcond(il, i) = nqcond(il, i) + 1. ! cld
4299 END IF ! cld
4300 END DO ! cld
4301 END DO ! cld
4302
4303 !ym BIG Warning : it seems that the k loop is missing !!!
4304 !ym Strong advice to check this
4305 !ym add a k loop temporary
4306
4307 ! (particular case: no detraining level is found) ! cld
4308 ! Verif merge Dynamico<<<<<<< .working
4309
2/2
✓ Branch 0 taken 2578981 times.
✓ Branch 1 taken 4870 times.
2583851 DO il = 1, ncum ! cld
4310
6/6
✓ Branch 0 taken 1538055 times.
✓ Branch 1 taken 1040926 times.
✓ Branch 2 taken 466699 times.
✓ Branch 3 taken 1071356 times.
✓ Branch 4 taken 150092 times.
✓ Branch 5 taken 316607 times.
2583851 IF (i<=inb(il) .AND. nent(il,i)==0 .AND. iflag(il)<=1) THEN ! cld
4311 150092 qcond(il, i) = qcond(il, i) + (1.-ep(il,i))*clw(il, i) ! cld
4312 !jyg< Bug correction 20180620
4313 ! PROBLEM: Should not qent(il,i,i) be taken into account even if nent(il,i)/=0?
4314 !! qtment(il, i) = qent(il,k,i) + qtment(il,i) ! cld
4315 150092 qtment(il, i) = qent(il,i,i) + qtment(il,i) ! cld
4316 !>jyg
4317 150092 nqcond(il, i) = nqcond(il, i) + 1. ! cld
4318 END IF ! cld
4319 END DO ! cld
4320 ! Verif merge Dynamico =======
4321 ! Verif merge Dynamico DO k = i + 1, nl
4322 ! Verif merge Dynamico DO il = 1, ncum !ym k loop added ! cld
4323 ! Verif merge Dynamico IF (i<=inb(il) .AND. nent(il,i)==0 .AND. iflag(il)<=1) THEN ! cld
4324 ! Verif merge Dynamico qcond(il, i) = qcond(il, i) + (1.-ep(il,i))*clw(il, i) ! cld
4325 ! Verif merge Dynamico qtment(il, i) = qent(il,k,i) + qtment(il,i) ! cld
4326 ! Verif merge Dynamico nqcond(il, i) = nqcond(il, i) + 1. ! cld
4327 ! Verif merge Dynamico END IF ! cld
4328 ! Verif merge Dynamico END DO
4329 ! Verif merge Dynamico ENDDO ! cld
4330 ! Verif merge Dynamico >>>>>>> .merge-right.r3413
4331
4332
2/2
✓ Branch 0 taken 4870 times.
✓ Branch 1 taken 2578981 times.
2583851 DO il = 1, ncum ! cld
4333
5/6
✓ Branch 0 taken 1538055 times.
✓ Branch 1 taken 1040926 times.
✓ Branch 2 taken 714598 times.
✓ Branch 3 taken 823457 times.
✓ Branch 4 taken 714598 times.
✗ Branch 5 not taken.
2585221 IF (i<=inb(il) .AND. nqcond(il,i)/=0 .AND. iflag(il)<=1) THEN ! cld
4334 714598 qcond(il, i) = qcond(il, i)/nqcond(il, i) ! cld
4335 714598 qtment(il, i) = qtment(il,i)/nqcond(il, i) ! cld
4336 END IF ! cld
4337 END DO
4338
4339 !AC! do j=1,ntra
4340 !AC! do il=1,ncum
4341 !AC! if (i.le.inb(il) .and. iflag(il) .le. 1) then
4342 !AC! dpinv=1.0/(ph(il,i)-ph(il,i+1))
4343 !AC! cpinv=1.0/cpn(il,i)
4344 !AC!
4345 !AC! if (cvflag_grav) then
4346 !AC! ftra(il,i,j)=ftra(il,i,j)+0.01*grav*dpinv
4347 !AC! : *(mp(il,i+1)*(trap(il,i+1,j)-tra(il,i,j))
4348 !AC! : -mp(il,i)*(trap(il,i,j)-trap(il,i-1,j)))
4349 !AC! else
4350 !AC! ftra(il,i,j)=ftra(il,i,j)+0.1*dpinv
4351 !AC! : *(mp(il,i+1)*(trap(il,i+1,j)-tra(il,i,j))
4352 !AC! : -mp(il,i)*(trap(il,i,j)-trap(il,i-1,j)))
4353 !AC! endif
4354 !AC! endif ! i
4355 !AC! enddo
4356 !AC! enddo
4357
4358
4359 240 500 END DO
4360
4361 !JYG<
4362 !Conservation de l'eau
4363 ! sumdq = 0.
4364 ! DO k = 1, nl
4365 ! sumdq = sumdq + fr(1, k)*100.*(ph(1,k)-ph(1,k+1))/grav
4366 ! END DO
4367 ! PRINT *, 'cv3_yield, apres 500, sum(dq), precip, somme ', sumdq, Vprecip(1, 1), sumdq + vprecip(1, 1)
4368 !JYG>
4369 ! *** move the detrainment at level inb down to level inb-1 ***
4370 ! *** in such a way as to preserve the vertically ***
4371 ! *** integrated enthalpy and water tendencies ***
4372
4373 ! Correction bug le 18-03-09
4374
2/2
✓ Branch 0 taken 127097 times.
✓ Branch 1 taken 240 times.
127337 DO il = 1, ncum
4375
2/2
✓ Branch 0 taken 43809 times.
✓ Branch 1 taken 83288 times.
127337 IF (iflag(il)<=1) THEN
4376 ax = 0.01*grav*ment(il, inb(il), inb(il))* &
4377 (hp(il,inb(il))-h(il,inb(il))+t(il,inb(il))*(cpv-cpd)*(rr(il,inb(il))-qent(il,inb(il),inb(il))))/ &
4378 43809 (cpn(il,inb(il))*(ph(il,inb(il))-ph(il,inb(il)+1)))
4379 43809 ft(il, inb(il)) = ft(il, inb(il)) - ax
4380 ft(il, inb(il)-1) = ft(il, inb(il)-1) + ax*cpn(il, inb(il))*(ph(il,inb(il))-ph(il,inb(il)+1))/ &
4381 43809 (cpn(il,inb(il)-1)*(ph(il,inb(il)-1)-ph(il,inb(il))))
4382
4383 bx = 0.01*grav*ment(il, inb(il), inb(il))*(qent(il,inb(il),inb(il))-rr(il,inb(il)))/ &
4384 43809 (ph(il,inb(il))-ph(il,inb(il)+1))
4385 43809 fr(il, inb(il)) = fr(il, inb(il)) - bx
4386 fr(il, inb(il)-1) = fr(il, inb(il)-1) + bx*(ph(il,inb(il))-ph(il,inb(il)+1))/ &
4387 43809 (ph(il,inb(il)-1)-ph(il,inb(il)))
4388
4389 cx = 0.01*grav*ment(il, inb(il), inb(il))*(uent(il,inb(il),inb(il))-u(il,inb(il)))/ &
4390 43809 (ph(il,inb(il))-ph(il,inb(il)+1))
4391 43809 fu(il, inb(il)) = fu(il, inb(il)) - cx
4392 fu(il, inb(il)-1) = fu(il, inb(il)-1) + cx*(ph(il,inb(il))-ph(il,inb(il)+1))/ &
4393 43809 (ph(il,inb(il)-1)-ph(il,inb(il)))
4394
4395 dx = 0.01*grav*ment(il, inb(il), inb(il))*(vent(il,inb(il),inb(il))-v(il,inb(il)))/ &
4396 43809 (ph(il,inb(il))-ph(il,inb(il)+1))
4397 43809 fv(il, inb(il)) = fv(il, inb(il)) - dx
4398 fv(il, inb(il)-1) = fv(il, inb(il)-1) + dx*(ph(il,inb(il))-ph(il,inb(il)+1))/ &
4399 43809 (ph(il,inb(il)-1)-ph(il,inb(il)))
4400 END IF !iflag
4401 END DO
4402
4403 !JYG<
4404 !Conservation de l'eau
4405 ! sumdq = 0.
4406 ! DO k = 1, nl
4407 ! sumdq = sumdq + fr(1, k)*100.*(ph(1,k)-ph(1,k+1))/grav
4408 ! END DO
4409 ! PRINT *, 'cv3_yield, apres 503, sum(dq), precip, somme ', sumdq, Vprecip(1, 1), sumdq + vprecip(1, 1)
4410 !JYG>
4411
4412 !AC! do j=1,ntra
4413 !AC! do il=1,ncum
4414 !AC! IF (iflag(il) .le. 1) THEN
4415 !AC! IF (cvflag_grav) then
4416 !AC! ex=0.01*grav*ment(il,inb(il),inb(il))
4417 !AC! : *(traent(il,inb(il),inb(il),j)-tra(il,inb(il),j))
4418 !AC! : /(ph(i l,inb(il))-ph(il,inb(il)+1))
4419 !AC! ftra(il,inb(il),j)=ftra(il,inb(il),j)-ex
4420 !AC! ftra(il,inb(il)-1,j)=ftra(il,inb(il)-1,j)
4421 !AC! : +ex*(ph(il,inb(il))-ph(il,inb(il)+1))
4422 !AC! : /(ph(il,inb(il)-1)-ph(il,inb(il)))
4423 !AC! else
4424 !AC! ex=0.1*ment(il,inb(il),inb(il))
4425 !AC! : *(traent(il,inb(il),inb(il),j)-tra(il,inb(il),j))
4426 !AC! : /(ph(i l,inb(il))-ph(il,inb(il)+1))
4427 !AC! ftra(il,inb(il),j)=ftra(il,inb(il),j)-ex
4428 !AC! ftra(il,inb(il)-1,j)=ftra(il,inb(il)-1,j)
4429 !AC! : +ex*(ph(il,inb(il))-ph(il,inb(il)+1))
4430 !AC! : /(ph(il,inb(il)-1)-ph(il,inb(il)))
4431 !AC! ENDIF !cvflag grav
4432 !AC! ENDIF !iflag
4433 !AC! enddo
4434 !AC! enddo
4435
4436
4437 ! *** homogenize tendencies below cloud base ***
4438
4439
4440
2/2
✓ Branch 0 taken 127097 times.
✓ Branch 1 taken 240 times.
127337 DO il = 1, ncum
4441 127097 asum(il) = 0.0
4442 127097 bsum(il) = 0.0
4443 127097 csum(il) = 0.0
4444 127097 dsum(il) = 0.0
4445 127097 esum(il) = 0.0
4446 127097 fsum(il) = 0.0
4447 127097 gsum(il) = 0.0
4448 127337 hsum(il) = 0.0
4449 END DO
4450
4451 !do i=1,nl
4452 !do il=1,ncum
4453 !th_wake(il,i)=t_wake(il,i)*(1000.0/p(il,i))**rdcp
4454 !enddo
4455 !enddo
4456
4457
2/2
✓ Branch 0 taken 6480 times.
✓ Branch 1 taken 240 times.
6720 DO i = 1, nl
4458
2/2
✓ Branch 0 taken 3431619 times.
✓ Branch 1 taken 6480 times.
3438339 DO il = 1, ncum
4459
4/4
✓ Branch 0 taken 520451 times.
✓ Branch 1 taken 2911168 times.
✓ Branch 2 taken 183170 times.
✓ Branch 3 taken 337281 times.
3438099 IF (i<=(icb(il)-1) .AND. iflag(il)<=1) THEN
4460 !jyg Saturated part : use T profile
4461 183170 asum(il) = asum(il) + (ft(il,i)-ftd(il,i))*(ph(il,i)-ph(il,i+1))
4462 !jyg<20140311
4463 !Correction pour conserver l eau
4464
1/2
✓ Branch 0 taken 183170 times.
✗ Branch 1 not taken.
183170 IF (ok_conserv_q) THEN
4465 183170 bsum(il) = bsum(il) + (fr(il,i)-fqd(il,i))*(ph(il,i)-ph(il,i+1))
4466 183170 csum(il) = csum(il) + (ph(il,i)-ph(il,i+1))
4467
4468 ELSE
4469 bsum(il)=bsum(il)+(fr(il,i)-fqd(il,i))*(lv(il,i)+(cl-cpd)*(t(il,i)-t(il,1)))* &
4470 (ph(il,i)-ph(il,i+1))
4471 csum(il)=csum(il)+(lv(il,i)+(cl-cpd)*(t(il,i)-t(il,1)))* &
4472 (ph(il,i)-ph(il,i+1))
4473 ENDIF ! (ok_conserv_q)
4474 !jyg>
4475 183170 dsum(il) = dsum(il) + t(il, i)*(ph(il,i)-ph(il,i+1))/th(il, i)
4476 !jyg Unsaturated part : use T_wake profile
4477 183170 esum(il) = esum(il) + ftd(il, i)*(ph(il,i)-ph(il,i+1))
4478 !jyg<20140311
4479 !Correction pour conserver l eau
4480
1/2
✓ Branch 0 taken 183170 times.
✗ Branch 1 not taken.
183170 IF (ok_conserv_q) THEN
4481 183170 fsum(il) = fsum(il) + fqd(il, i)*(ph(il,i)-ph(il,i+1))
4482 183170 gsum(il) = gsum(il) + (ph(il,i)-ph(il,i+1))
4483 ELSE
4484 fsum(il)=fsum(il)+fqd(il,i)*(lv(il,i)+(cl-cpd)*(t_wake(il,i)-t_wake(il,1)))* &
4485 (ph(il,i)-ph(il,i+1))
4486 gsum(il)=gsum(il)+(lv(il,i)+(cl-cpd)*(t_wake(il,i)-t_wake(il,1)))* &
4487 (ph(il,i)-ph(il,i+1))
4488 ENDIF ! (ok_conserv_q)
4489 !jyg>
4490 183170 hsum(il) = hsum(il) + t_wake(il, i)*(ph(il,i)-ph(il,i+1))/th_wake(il, i)
4491 END IF
4492 END DO
4493 END DO
4494
4495 !!!! do 700 i=1,icb(il)-1
4496
1/2
✓ Branch 0 taken 240 times.
✗ Branch 1 not taken.
240 IF (ok_homo_tend) THEN
4497
2/2
✓ Branch 0 taken 240 times.
✓ Branch 1 taken 6480 times.
6720 DO i = 1, nl
4498
2/2
✓ Branch 0 taken 3431619 times.
✓ Branch 1 taken 6480 times.
3438339 DO il = 1, ncum
4499
4/4
✓ Branch 0 taken 520451 times.
✓ Branch 1 taken 2911168 times.
✓ Branch 2 taken 183170 times.
✓ Branch 3 taken 337281 times.
3438099 IF (i<=(icb(il)-1) .AND. iflag(il)<=1) THEN
4500 183170 ftd(il, i) = esum(il)*t_wake(il, i)/(th_wake(il,i)*hsum(il))
4501 183170 fqd(il, i) = fsum(il)/gsum(il)
4502 183170 ft(il, i) = ftd(il, i) + asum(il)*t(il, i)/(th(il,i)*dsum(il))
4503 183170 fr(il, i) = fqd(il, i) + bsum(il)/csum(il)
4504 END IF
4505 END DO
4506 END DO
4507 ENDIF
4508
4509 !jyg<
4510 !Conservation de l'eau
4511 !! sumdq = 0.
4512 !! DO k = 1, nl
4513 !! sumdq = sumdq + fr(1, k)*100.*(ph(1,k)-ph(1,k+1))/grav
4514 !! END DO
4515 !! PRINT *, 'cv3_yield, apres hom, sum(dq), precip, somme ', sumdq, Vprecip(1, 1), sumdq + vprecip(1, 1)
4516 !jyg>
4517
4518
4519 ! *** Check that moisture stays positive. If not, scale tendencies
4520 ! in order to ensure moisture positivity
4521
2/2
✓ Branch 0 taken 127097 times.
✓ Branch 1 taken 240 times.
127337 DO il = 1, ncum
4522 127097 alpha_qpos(il) = 1.
4523
2/2
✓ Branch 0 taken 43809 times.
✓ Branch 1 taken 83288 times.
127337 IF (iflag(il)<=1) THEN
4524
2/2
✓ Branch 0 taken 9168 times.
✓ Branch 1 taken 34641 times.
43809 IF (fr(il,1)<=0.) THEN
4525 9168 alpha_qpos(il) = max(alpha_qpos(il), (-delt*fr(il,1))/(s_wake(il)*rr_wake(il,1)+(1.-s_wake(il))*rr(il,1)))
4526 END IF
4527 END IF
4528 END DO
4529
2/2
✓ Branch 0 taken 6240 times.
✓ Branch 1 taken 240 times.
6480 DO i = 2, nl
4530
2/2
✓ Branch 0 taken 3304522 times.
✓ Branch 1 taken 6240 times.
3311002 DO il = 1, ncum
4531
2/2
✓ Branch 0 taken 1139034 times.
✓ Branch 1 taken 2165488 times.
3310762 IF (iflag(il)<=1) THEN
4532
2/2
✓ Branch 0 taken 823945 times.
✓ Branch 1 taken 315089 times.
1139034 IF (fr(il,i)<=0.) THEN
4533 823945 alpha_qpos1(il) = max(1., (-delt*fr(il,i))/(s_wake(il)*rr_wake(il,i)+(1.-s_wake(il))*rr(il,i)))
4534
1/2
✓ Branch 0 taken 823945 times.
✗ Branch 1 not taken.
823945 IF (alpha_qpos1(il)>=alpha_qpos(il)) alpha_qpos(il) = alpha_qpos1(il)
4535 END IF
4536 END IF
4537 END DO
4538 END DO
4539
2/2
✓ Branch 0 taken 127097 times.
✓ Branch 1 taken 240 times.
127337 DO il = 1, ncum
4540
3/4
✓ Branch 0 taken 43809 times.
✓ Branch 1 taken 83288 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 43809 times.
127337 IF (iflag(il)<=1 .AND. alpha_qpos(il)>1.001) THEN
4541 alpha_qpos(il) = alpha_qpos(il)*1.1
4542 END IF
4543 END DO
4544 !
4545
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 240 times.
240 IF (prt_level .GE. 5) THEN
4546 print *,' CV3_YIELD : alpha_qpos ',alpha_qpos(1)
4547 ENDIF
4548 !
4549
2/2
✓ Branch 0 taken 127097 times.
✓ Branch 1 taken 240 times.
127337 DO il = 1, ncum
4550
2/2
✓ Branch 0 taken 43809 times.
✓ Branch 1 taken 83288 times.
127337 IF (iflag(il)<=1) THEN
4551 43809 sigd(il) = sigd(il)/alpha_qpos(il)
4552 43809 precip(il) = precip(il)/alpha_qpos(il)
4553 43809 cbmf(il) = cbmf(il)/alpha_qpos(il)
4554 END IF
4555 END DO
4556
2/2
✓ Branch 0 taken 6480 times.
✓ Branch 1 taken 240 times.
6720 DO i = 1, nl
4557
2/2
✓ Branch 0 taken 3431619 times.
✓ Branch 1 taken 6480 times.
3438339 DO il = 1, ncum
4558
2/2
✓ Branch 0 taken 1182843 times.
✓ Branch 1 taken 2248776 times.
3438099 IF (iflag(il)<=1) THEN
4559 1182843 fr(il, i) = fr(il, i)/alpha_qpos(il)
4560 1182843 ft(il, i) = ft(il, i)/alpha_qpos(il)
4561 1182843 fqd(il, i) = fqd(il, i)/alpha_qpos(il)
4562 1182843 ftd(il, i) = ftd(il, i)/alpha_qpos(il)
4563 1182843 fu(il, i) = fu(il, i)/alpha_qpos(il)
4564 1182843 fv(il, i) = fv(il, i)/alpha_qpos(il)
4565 1182843 m(il, i) = m(il, i)/alpha_qpos(il)
4566 1182843 mp(il, i) = mp(il, i)/alpha_qpos(il)
4567 1182843 Vprecip(il, i) = Vprecip(il, i)/alpha_qpos(il)
4568 1182843 Vprecipi(il, i) = Vprecipi(il, i)/alpha_qpos(il) ! jyg
4569 END IF
4570 END DO
4571 END DO
4572 !jyg<
4573 !-----------------------------------------------------------
4574
1/2
✓ Branch 0 taken 240 times.
✗ Branch 1 not taken.
240 IF (ok_optim_yield) THEN !|
4575 !-----------------------------------------------------------
4576
2/2
✓ Branch 0 taken 240 times.
✓ Branch 1 taken 6480 times.
6720 DO i = 1, nl
4577
2/2
✓ Branch 0 taken 3431619 times.
✓ Branch 1 taken 6480 times.
3438339 DO il = 1, ncum
4578
2/2
✓ Branch 0 taken 1182843 times.
✓ Branch 1 taken 2248776 times.
3438099 IF (iflag(il)<=1) THEN
4579 1182843 upwd(il, i) = upwd(il, i)/alpha_qpos(il)
4580 1182843 dnwd(il, i) = dnwd(il, i)/alpha_qpos(il)
4581 END IF
4582 END DO
4583 END DO
4584 !-----------------------------------------------------------
4585 ENDIF !(ok_optim_yield) !|
4586 !-----------------------------------------------------------
4587 !>jyg
4588
2/2
✓ Branch 0 taken 6480 times.
✓ Branch 1 taken 240 times.
6720 DO j = 1, nl !yor! inverted i and j loops
4589
2/2
✓ Branch 0 taken 174960 times.
✓ Branch 1 taken 6480 times.
181680 DO i = 1, nl
4590
2/2
✓ Branch 0 taken 92653713 times.
✓ Branch 1 taken 174960 times.
92835153 DO il = 1, ncum
4591
2/2
✓ Branch 0 taken 31936761 times.
✓ Branch 1 taken 60716952 times.
92828673 IF (iflag(il)<=1) THEN
4592 31936761 ment(il, i, j) = ment(il, i, j)/alpha_qpos(il)
4593 END IF
4594 END DO
4595 END DO
4596 END DO
4597
4598 !AC! DO j = 1,ntra
4599 !AC! DO i = 1,nl
4600 !AC! DO il = 1,ncum
4601 !AC! IF (iflag(il) .le. 1) THEN
4602 !AC! ftra(il,i,j) = ftra(il,i,j)/alpha_qpos(il)
4603 !AC! ENDIF
4604 !AC! ENDDO
4605 !AC! ENDDO
4606 !AC! ENDDO
4607
4608
4609 ! *** reset counter and return ***
4610
4611 ! Reset counter only for points actually convective (jyg)
4612 ! In order take into account the possibility of changing the compression,
4613 ! reset m, sig and w0 to zero for non-convecting points.
4614
2/2
✓ Branch 0 taken 127097 times.
✓ Branch 1 taken 240 times.
127337 DO il = 1, ncum
4615
2/2
✓ Branch 0 taken 43809 times.
✓ Branch 1 taken 83288 times.
127337 IF (iflag(il) < 3) THEN
4616 43809 sig(il, nd) = 2.0
4617 ENDIF
4618 END DO
4619
4620
4621
2/2
✓ Branch 0 taken 6480 times.
✓ Branch 1 taken 240 times.
6720 DO i = 1, nl
4622
2/2
✓ Branch 0 taken 3431619 times.
✓ Branch 1 taken 6480 times.
3438339 DO il = 1, ncum
4623 3438099 dnwd0(il, i) = -mp(il, i)
4624 END DO
4625 END DO
4626 !jyg< (loops stop at nl)
4627 !! DO i = nl + 1, nd
4628 !! DO il = 1, ncum
4629 !! dnwd0(il, i) = 0.
4630 !! END DO
4631 !! END DO
4632 !>jyg
4633
4634
4635 !jyg<
4636 !-----------------------------------------------------------
4637
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 240 times.
240 IF (.NOT.ok_optim_yield) THEN !|
4638 !-----------------------------------------------------------
4639 DO i = 1, nl
4640 DO il = 1, ncum
4641 upwd(il, i) = 0.0
4642 dnwd(il, i) = 0.0
4643 END DO
4644 END DO
4645
4646 !! DO i = 1, nl ! useless; jyg
4647 !! DO il = 1, ncum ! useless; jyg
4648 !! IF (i>=icb(il) .AND. i<=inb(il)) THEN ! useless; jyg
4649 !! upwd(il, i) = 0.0 ! useless; jyg
4650 !! dnwd(il, i) = 0.0 ! useless; jyg
4651 !! END IF ! useless; jyg
4652 !! END DO ! useless; jyg
4653 !! END DO ! useless; jyg
4654
4655 DO i = 1, nl
4656 DO k = 1, nl
4657 DO il = 1, ncum
4658 up1(il, k, i) = 0.0
4659 dn1(il, k, i) = 0.0
4660 END DO
4661 END DO
4662 END DO
4663
4664 !yor! commented original
4665 ! DO i = 1, nl
4666 ! DO k = i, nl
4667 ! DO n = 1, i - 1
4668 ! DO il = 1, ncum
4669 ! IF (i>=icb(il) .AND. i<=inb(il) .AND. k<=inb(il)) THEN
4670 ! up1(il, k, i) = up1(il, k, i) + ment(il, n, k)
4671 ! dn1(il, k, i) = dn1(il, k, i) - ment(il, k, n)
4672 ! END IF
4673 ! END DO
4674 ! END DO
4675 ! END DO
4676 ! END DO
4677 !yor! replaced with
4678 DO i = 1, nl
4679 DO k = i, nl
4680 DO n = 1, i - 1
4681 DO il = 1, ncum
4682 IF (i>=icb(il) .AND. k<=inb(il)) THEN ! yor ! as i always <= k
4683 up1(il, k, i) = up1(il, k, i) + ment(il, n, k)
4684 END IF
4685 END DO
4686 END DO
4687 END DO
4688 END DO
4689 DO i = 1, nl
4690 DO n = 1, i - 1
4691 DO k = i, nl
4692 DO il = 1, ncum
4693 IF (i>=icb(il) .AND. k<=inb(il)) THEN ! yor ! i always <= k
4694 dn1(il, k, i) = dn1(il, k, i) - ment(il, k, n)
4695 END IF
4696 END DO
4697 END DO
4698 END DO
4699 END DO
4700 !yor! end replace
4701
4702 DO i = 1, nl
4703 DO k = 1, nl
4704 DO il = 1, ncum
4705 IF (i>=icb(il)) THEN
4706 IF (k>=i .AND. k<=(inb(il))) THEN
4707 upwd(il, i) = upwd(il, i) + m(il, k)
4708 END IF
4709 ELSE
4710 IF (k<i) THEN
4711 upwd(il, i) = upwd(il, i) + cbmf(il)*wghti(il, k)
4712 END IF
4713 END IF
4714 ! c print *,'cbmf',il,i,k,cbmf(il),wghti(il,k)
4715 END DO
4716 END DO
4717 END DO
4718
4719 DO i = 2, nl
4720 DO k = i, nl
4721 DO il = 1, ncum
4722 ! test if (i.ge.icb(il).and.i.le.inb(il).and.k.le.inb(il)) then
4723 IF (i<=inb(il) .AND. k<=inb(il)) THEN
4724 upwd(il, i) = upwd(il, i) + up1(il, k, i)
4725 dnwd(il, i) = dnwd(il, i) + dn1(il, k, i)
4726 END IF
4727 ! c print *,'upwd',il,i,k,inb(il),upwd(il,i),m(il,k),up1(il,k,i)
4728 END DO
4729 END DO
4730 END DO
4731
4732
4733 !!!! DO il=1,ncum
4734 !!!! do i=icb(il),inb(il)
4735 !!!!
4736 !!!! upwd(il,i)=0.0
4737 !!!! dnwd(il,i)=0.0
4738 !!!! do k=i,inb(il)
4739 !!!! up1=0.0
4740 !!!! dn1=0.0
4741 !!!! do n=1,i-1
4742 !!!! up1=up1+ment(il,n,k)
4743 !!!! dn1=dn1-ment(il,k,n)
4744 !!!! enddo
4745 !!!! upwd(il,i)=upwd(il,i)+m(il,k)+up1
4746 !!!! dnwd(il,i)=dnwd(il,i)+dn1
4747 !!!! enddo
4748 !!!! enddo
4749 !!!!
4750 !!!! ENDDO
4751
4752 !! DO i = 1, nlp
4753 !! DO il = 1, ncum
4754 !! ma(il, i) = 0
4755 !! END DO
4756 !! END DO
4757 !!
4758 !! DO i = 1, nl
4759 !! DO j = i, nl
4760 !! DO il = 1, ncum
4761 !! ma(il, i) = ma(il, i) + m(il, j)
4762 !! END DO
4763 !! END DO
4764 !! END DO
4765
4766 !jyg< (loops stop at nl)
4767 !! DO i = nl + 1, nd
4768 !! DO il = 1, ncum
4769 !! ma(il, i) = 0.
4770 !! END DO
4771 !! END DO
4772 !>jyg
4773
4774 !! DO i = 1, nl
4775 !! DO il = 1, ncum
4776 !! IF (i<=(icb(il)-1)) THEN
4777 !! ma(il, i) = 0
4778 !! END IF
4779 !! END DO
4780 !! END DO
4781
4782 !-----------------------------------------------------------
4783 ENDIF !(.NOT.ok_optim_yield) !|
4784 !-----------------------------------------------------------
4785 !>jyg
4786
4787 ! ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
4788 ! determination de la variation de flux ascendant entre
4789 ! deux niveau non dilue mip
4790 ! ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
4791
4792
2/2
✓ Branch 0 taken 6480 times.
✓ Branch 1 taken 240 times.
6720 DO i = 1, nl
4793
2/2
✓ Branch 0 taken 3431619 times.
✓ Branch 1 taken 6480 times.
3438339 DO il = 1, ncum
4794 3438099 mip(il, i) = m(il, i)
4795 END DO
4796 END DO
4797
4798 !jyg< (loops stop at nl)
4799 !! DO i = nl + 1, nd
4800 !! DO il = 1, ncum
4801 !! mip(il, i) = 0.
4802 !! END DO
4803 !! END DO
4804 !>jyg
4805
4806
4807 ! cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
4808 ! icb represente de niveau ou se trouve la
4809 ! base du nuage , et inb le top du nuage
4810 ! ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
4811
4812 !! DO i = 1, nd ! unused . jyg
4813 !! DO il = 1, ncum ! unused . jyg
4814 !! mke(il, i) = upwd(il, i) + dnwd(il, i) ! unused . jyg
4815 !! END DO ! unused . jyg
4816 !! END DO ! unused . jyg
4817
4818 !! DO i = 1, nd ! unused . jyg
4819 !! DO il = 1, ncum ! unused . jyg
4820 !! rdcp = (rrd*(1.-rr(il,i))-rr(il,i)*rrv)/(cpd*(1.-rr(il,i))+rr(il,i)*cpv) ! unused . jyg
4821 !! tls(il, i) = t(il, i)*(1000.0/p(il,i))**rdcp ! unused . jyg
4822 !! tps(il, i) = tp(il, i) ! unused . jyg
4823 !! END DO ! unused . jyg
4824 !! END DO ! unused . jyg
4825
4826
4827 ! *** diagnose the in-cloud mixing ratio *** ! cld
4828 ! *** of condensed water *** ! cld
4829 !! cld
4830
4831
2/2
✓ Branch 0 taken 6720 times.
✓ Branch 1 taken 240 times.
6960 DO i = 1, nl+1 ! cld
4832
2/2
✓ Branch 0 taken 3558716 times.
✓ Branch 1 taken 6720 times.
3565676 DO il = 1, ncum ! cld
4833 3558716 mac(il, i) = 0.0 ! cld
4834 3558716 wa(il, i) = 0.0 ! cld
4835 3558716 siga(il, i) = 0.0 ! cld
4836 3565436 sax(il, i) = 0.0 ! cld
4837 END DO ! cld
4838 END DO ! cld
4839
4840
2/2
✓ Branch 0 taken 6480 times.
✓ Branch 1 taken 240 times.
6720 DO i = minorig, nl ! cld
4841
2/2
✓ Branch 0 taken 6480 times.
✓ Branch 1 taken 90720 times.
97440 DO k = i + 1, nl + 1 ! cld
4842
2/2
✓ Branch 0 taken 48042666 times.
✓ Branch 1 taken 90720 times.
48139866 DO il = 1, ncum ! cld
4843
6/6
✓ Branch 0 taken 33513919 times.
✓ Branch 1 taken 14528747 times.
✓ Branch 2 taken 13110421 times.
✓ Branch 3 taken 20403498 times.
✓ Branch 4 taken 7169074 times.
✓ Branch 5 taken 5941347 times.
48133386 IF (i<=inb(il) .AND. k<=(inb(il)+1) .AND. iflag(il)<=1) THEN ! cld
4844 7169074 mac(il, i) = mac(il, i) + m(il, k) ! cld
4845 END IF ! cld
4846 END DO ! cld
4847 END DO ! cld
4848 END DO ! cld
4849
4850
2/2
✓ Branch 0 taken 6480 times.
✓ Branch 1 taken 240 times.
6720 DO i = 1, nl ! cld
4851
2/2
✓ Branch 0 taken 90720 times.
✓ Branch 1 taken 6480 times.
97440 DO j = 1, i ! cld
4852
2/2
✓ Branch 0 taken 48042666 times.
✓ Branch 1 taken 90720 times.
48139866 DO il = 1, ncum ! cld
4853 IF (i>=icb(il) .AND. i<=(inb(il)-1) & ! cld
4854
8/8
✓ Branch 0 taken 46588131 times.
✓ Branch 1 taken 1454535 times.
✓ Branch 2 taken 9990731 times.
✓ Branch 3 taken 36597400 times.
✓ Branch 4 taken 6033943 times.
✓ Branch 5 taken 3956788 times.
✓ Branch 6 taken 3768483 times.
✓ Branch 7 taken 2265460 times.
48133386 .AND. j>=icb(il) .AND. iflag(il)<=1) THEN ! cld
4855 sax(il, i) = sax(il, i) + rrd*(tvp(il,j)-tv(il,j)) & ! cld
4856 3768483 *(ph(il,j)-ph(il,j+1))/p(il, j) ! cld
4857 END IF ! cld
4858 END DO ! cld
4859 END DO ! cld
4860 END DO ! cld
4861
4862
2/2
✓ Branch 0 taken 6480 times.
✓ Branch 1 taken 240 times.
6720 DO i = 1, nl ! cld
4863
2/2
✓ Branch 0 taken 3431619 times.
✓ Branch 1 taken 6480 times.
3438339 DO il = 1, ncum ! cld
4864 IF (i>=icb(il) .AND. i<=(inb(il)-1) & ! cld
4865
7/8
✓ Branch 0 taken 2911168 times.
✓ Branch 1 taken 520451 times.
✓ Branch 2 taken 1017607 times.
✓ Branch 3 taken 1893561 times.
✓ Branch 4 taken 487216 times.
✓ Branch 5 taken 530391 times.
✓ Branch 6 taken 487216 times.
✗ Branch 7 not taken.
3438099 .AND. sax(il,i)>0.0 .AND. iflag(il)<=1) THEN ! cld
4866 487216 wa(il, i) = sqrt(2.*sax(il,i)) ! cld
4867 END IF ! cld
4868 END DO ! cld
4869 END DO
4870 ! cld
4871
2/2
✓ Branch 0 taken 6480 times.
✓ Branch 1 taken 240 times.
6720 DO i = 1, nl
4872
4873 ! 14/01/15 AJ je remets les parties manquantes cf JYG
4874 ! Initialize sument to 0
4875
4876
2/2
✓ Branch 0 taken 3431619 times.
✓ Branch 1 taken 6480 times.
3438099 DO il = 1,ncum
4877 3438099 sument(il) = 0.
4878 ENDDO
4879
4880 ! Sum mixed mass fluxes in sument
4881
4882
2/2
✓ Branch 0 taken 174960 times.
✓ Branch 1 taken 6480 times.
181440 DO k = 1,nl
4883
2/2
✓ Branch 0 taken 92653713 times.
✓ Branch 1 taken 174960 times.
92835153 DO il = 1,ncum
4884
6/6
✓ Branch 0 taken 44959185 times.
✓ Branch 1 taken 47694528 times.
✓ Branch 2 taken 24555687 times.
✓ Branch 3 taken 20403498 times.
✓ Branch 4 taken 13579741 times.
✓ Branch 5 taken 10975946 times.
92828673 IF (k<=inb(il) .AND. i<=inb(il) .AND. iflag(il)<=1) THEN ! cld
4885 13579741 sument(il) =sument(il) + abs(ment(il,k,i))
4886 ENDIF
4887 ENDDO ! il
4888 ENDDO ! k
4889
4890 ! 14/01/15 AJ delta n'a rien � faire l�...
4891
2/2
✓ Branch 0 taken 3431619 times.
✓ Branch 1 taken 6480 times.
3438339 DO il = 1, ncum ! cld
4892 !! IF (wa(il,i)>0.0 .AND. iflag(il)<=1) & ! cld
4893 !! siga(il, i) = mac(il, i)/(coefw_cld_cv*wa(il, i)) & ! cld
4894 !! *rrd*tvp(il, i)/p(il, i)/100. ! cld
4895 !!
4896 !! siga(il, i) = min(siga(il,i), 1.0) ! cld
4897 sigaq = 0.
4898
3/4
✓ Branch 0 taken 487216 times.
✓ Branch 1 taken 2944403 times.
✓ Branch 2 taken 487216 times.
✗ Branch 3 not taken.
3431619 IF (wa(il,i)>0.0 .AND. iflag(il)<=1) THEN ! cld
4899 siga(il, i) = mac(il, i)/(coefw_cld_cv*wa(il, i)) & ! cld
4900 487216 *rrd*tvp(il, i)/p(il, i)/100. ! cld
4901 487216 siga(il, i) = min(siga(il,i), 1.0) ! cld
4902 487216 sigaq = siga(il,i)*qta(il,i-1) ! cld
4903 ENDIF
4904
4905 ! IM cf. FH
4906 ! 14/01/15 AJ ne correspond pas � ce qui a �t� cod� par JYG et SB
4907
4908
1/2
✓ Branch 0 taken 3431619 times.
✗ Branch 1 not taken.
3438099 IF (iflag_clw==0) THEN ! cld
4909 qcondc(il, i) = siga(il, i)*clw(il, i)*(1.-ep(il,i)) & ! cld
4910 3431619 +(1.-siga(il,i))*qcond(il, i) ! cld
4911
4912
4913 3431619 sigment(il,i)=sument(il)*tau_cld_cv/(ph(il,i)-ph(il,i+1)) ! cld
4914 3431619 sigment(il, i) = min(1.e-4+sigment(il,i), 1.0 - siga(il,i)) ! cld
4915 !! qtc(il, i) = (siga(il,i)*qta(il,i-1)+sigment(il,i)*qtment(il,i)) & ! cld
4916 qtc(il, i) = (sigaq+sigment(il,i)*qtment(il,i)) & ! cld
4917 3431619 /(siga(il,i)+sigment(il,i)) ! cld
4918 3431619 sigt(il,i) = sigment(il, i) + siga(il, i)
4919
4920 ! qtc(il, i) = siga(il,i)*qta(il,i-1)+(1.-siga(il,i))*qtment(il,i) ! cld
4921 ! print*,'BIGAUSSIAN CONV',siga(il,i),sigment(il,i),qtc(il,i)
4922
4923 ELSE IF (iflag_clw==1) THEN ! cld
4924 qcondc(il, i) = qcond(il, i) ! cld
4925 qtc(il,i) = qtment(il,i) ! cld
4926 END IF ! cld
4927
4928 END DO ! cld
4929 END DO
4930 ! print*,'cv3_yield fin'
4931
4932 240 RETURN
4933 END SUBROUTINE cv3_yield
4934
4935 !AC! et !RomP >>>
4936 240 SUBROUTINE cv3_tracer(nloc, len, ncum, nd, na, &
4937 240 ment, sigij, da, phi, phi2, d1a, dam, &
4938 240 ep, Vprecip, elij, clw, epmlmMm, eplaMm, &
4939 icb, inb)
4940 IMPLICIT NONE
4941
4942 include "cv3param.h"
4943
4944 !inputs:
4945 INTEGER, INTENT (IN) :: ncum, nd, na, nloc, len
4946 INTEGER, DIMENSION (len), INTENT (IN) :: icb, inb
4947 REAL, DIMENSION (len, na, na), INTENT (IN) :: ment, sigij, elij
4948 REAL, DIMENSION (len, nd), INTENT (IN) :: clw
4949 REAL, DIMENSION (len, na), INTENT (IN) :: ep
4950 REAL, DIMENSION (len, nd+1), INTENT (IN) :: Vprecip
4951 !ouputs:
4952 REAL, DIMENSION (len, na, na), INTENT (OUT) :: phi, phi2, epmlmMm
4953 REAL, DIMENSION (len, na), INTENT (OUT) :: da, d1a, dam, eplaMm
4954 !
4955 ! variables pour tracer dans precip de l'AA et des mel
4956 !local variables:
4957 INTEGER i, j, k
4958 240 REAL epm(nloc, na, na)
4959
4960 ! variables d'Emanuel : du second indice au troisieme
4961 ! ---> tab(i,k,j) -> de l origine k a l arrivee j
4962 ! ment, sigij, elij
4963 ! variables personnelles : du troisieme au second indice
4964 ! ---> tab(i,j,k) -> de k a j
4965 ! phi, phi2
4966
4967 ! initialisations
4968
4969
4/4
✓ Branch 0 taken 240 times.
✓ Branch 1 taken 9360 times.
✓ Branch 2 taken 9303840 times.
✓ Branch 3 taken 9360 times.
9313440 da(:, :) = 0.
4970
4/4
✓ Branch 0 taken 240 times.
✓ Branch 1 taken 9360 times.
✓ Branch 2 taken 9303840 times.
✓ Branch 3 taken 9360 times.
9313440 d1a(:, :) = 0.
4971
4/4
✓ Branch 0 taken 240 times.
✓ Branch 1 taken 9360 times.
✓ Branch 2 taken 9303840 times.
✓ Branch 3 taken 9360 times.
9313440 dam(:, :) = 0.
4972
6/6
✓ Branch 0 taken 240 times.
✓ Branch 1 taken 9360 times.
✓ Branch 2 taken 365040 times.
✓ Branch 3 taken 9360 times.
✓ Branch 4 taken 362849760 times.
✓ Branch 5 taken 365040 times.
363224400 epm(:, :, :) = 0.
4973
4/4
✓ Branch 0 taken 240 times.
✓ Branch 1 taken 9360 times.
✓ Branch 2 taken 9303840 times.
✓ Branch 3 taken 9360 times.
9313440 eplaMm(:, :) = 0.
4974
6/6
✓ Branch 0 taken 240 times.
✓ Branch 1 taken 9360 times.
✓ Branch 2 taken 365040 times.
✓ Branch 3 taken 9360 times.
✓ Branch 4 taken 362849760 times.
✓ Branch 5 taken 365040 times.
363224400 epmlmMm(:, :, :) = 0.
4975
6/6
✓ Branch 0 taken 240 times.
✓ Branch 1 taken 9360 times.
✓ Branch 2 taken 365040 times.
✓ Branch 3 taken 9360 times.
✓ Branch 4 taken 362849760 times.
✓ Branch 5 taken 365040 times.
363224400 phi(:, :, :) = 0.
4976
6/6
✓ Branch 0 taken 9360 times.
✓ Branch 1 taken 240 times.
✓ Branch 2 taken 365040 times.
✓ Branch 3 taken 9360 times.
✓ Branch 4 taken 362849760 times.
✓ Branch 5 taken 365040 times.
363224400 phi2(:, :, :) = 0.
4977
4978 ! fraction deau condensee dans les melanges convertie en precip : epm
4979 ! et eau condens�e pr�cipit�e dans masse d'air satur� : l_m*dM_m/dzdz.dzdz
4980
2/2
✓ Branch 0 taken 6480 times.
✓ Branch 1 taken 240 times.
6720 DO j = 1, nl
4981
2/2
✓ Branch 0 taken 174960 times.
✓ Branch 1 taken 6480 times.
181680 DO k = 1, nl
4982
2/2
✓ Branch 0 taken 92653713 times.
✓ Branch 1 taken 174960 times.
92835153 DO i = 1, ncum
4983 IF (k>=icb(i) .AND. k<=inb(i) .AND. &
4984 !!jyg j.ge.k.and.j.le.inb(i)) then
4985 !!jyg epm(i,j,k)=1.-(1.-ep(i,j))*clw(i,j)/elij(i,k,j)
4986
8/8
✓ Branch 0 taken 78601536 times.
✓ Branch 1 taken 14052177 times.
✓ Branch 2 taken 30907008 times.
✓ Branch 3 taken 47694528 times.
✓ Branch 4 taken 19251122 times.
✓ Branch 5 taken 11655886 times.
✓ Branch 6 taken 6033943 times.
✓ Branch 7 taken 13217179 times.
92828673 j>k .AND. j<=inb(i)) THEN
4987 6033943 epm(i, j, k) = 1. - (1.-ep(i,j))*clw(i, j)/max(elij(i,k,j), 1.E-16)
4988 !!
4989 6033943 epm(i, j, k) = max(epm(i,j,k), 0.0)
4990 END IF
4991 END DO
4992 END DO
4993 END DO
4994
4995
4996
2/2
✓ Branch 0 taken 6480 times.
✓ Branch 1 taken 240 times.
6720 DO j = 1, nl
4997
2/2
✓ Branch 0 taken 174960 times.
✓ Branch 1 taken 6480 times.
181680 DO k = 1, nl
4998
2/2
✓ Branch 0 taken 92653713 times.
✓ Branch 1 taken 174960 times.
92835153 DO i = 1, ncum
4999
4/4
✓ Branch 0 taken 78601536 times.
✓ Branch 1 taken 14052177 times.
✓ Branch 2 taken 30907008 times.
✓ Branch 3 taken 47694528 times.
92828673 IF (k>=icb(i) .AND. k<=inb(i)) THEN
5000 eplaMm(i, j) = eplamm(i, j) + &
5001 30907008 ep(i, j)*clw(i, j)*ment(i, j, k)*(1.-sigij(i,j,k))
5002 END IF
5003 END DO
5004 END DO
5005 END DO
5006
5007
2/2
✓ Branch 0 taken 6480 times.
✓ Branch 1 taken 240 times.
6720 DO j = 1, nl
5008
2/2
✓ Branch 0 taken 84240 times.
✓ Branch 1 taken 6480 times.
90960 DO k = 1, j - 1
5009
2/2
✓ Branch 0 taken 44611047 times.
✓ Branch 1 taken 84240 times.
44701767 DO i = 1, ncum
5010
6/6
✓ Branch 0 taken 32013405 times.
✓ Branch 1 taken 12597642 times.
✓ Branch 2 taken 19251122 times.
✓ Branch 3 taken 12762283 times.
✓ Branch 4 taken 6033943 times.
✓ Branch 5 taken 13217179 times.
44695287 IF (k>=icb(i) .AND. k<=inb(i) .AND. j<=inb(i)) THEN
5011 6033943 epmlmMm(i, j, k) = epm(i, j, k)*elij(i, k, j)*ment(i, k, j)
5012 END IF
5013 END DO
5014 END DO
5015 END DO
5016
5017 ! matrices pour calculer la tendance des concentrations dans cvltr.F90
5018
2/2
✓ Branch 0 taken 6480 times.
✓ Branch 1 taken 240 times.
6720 DO j = 1, nl
5019
2/2
✓ Branch 0 taken 174960 times.
✓ Branch 1 taken 6480 times.
181680 DO k = 1, nl
5020
2/2
✓ Branch 0 taken 92653713 times.
✓ Branch 1 taken 174960 times.
92835153 DO i = 1, ncum
5021 92653713 da(i, j) = da(i, j) + (1.-sigij(i,k,j))*ment(i, k, j)
5022 92653713 phi(i, j, k) = sigij(i, k, j)*ment(i, k, j)
5023 92653713 d1a(i, j) = d1a(i, j) + ment(i, k, j)*ep(i, k)*(1.-sigij(i,k,j))
5024
2/2
✓ Branch 0 taken 48042666 times.
✓ Branch 1 taken 44611047 times.
92828673 IF (k<=j) THEN
5025 48042666 dam(i, j) = dam(i, j) + ment(i, k, j)*epm(i, k, j)*(1.-ep(i,k))*(1.-sigij(i,k,j))
5026 48042666 phi2(i, j, k) = phi(i, j, k)*epm(i, j, k)
5027 END IF
5028 END DO
5029 END DO
5030 END DO
5031
5032 240 RETURN
5033 END SUBROUTINE cv3_tracer
5034 !AC! et !RomP <<<
5035
5036 SUBROUTINE cv3_uncompress(nloc, len, ncum, nd, ntra, idcum, &
5037 iflag, &
5038 precip, sig, w0, &
5039 ft, fq, fu, fv, ftra, &
5040 Ma, upwd, dnwd, dnwd0, qcondc, wd, cape, &
5041 epmax_diag, & ! epmax_cape
5042 iflag1, &
5043 precip1, sig1, w01, &
5044 ft1, fq1, fu1, fv1, ftra1, &
5045 Ma1, upwd1, dnwd1, dnwd01, qcondc1, wd1, cape1, &
5046 epmax_diag1) ! epmax_cape
5047 IMPLICIT NONE
5048
5049 include "cv3param.h"
5050
5051 !inputs:
5052 INTEGER len, ncum, nd, ntra, nloc
5053 INTEGER idcum(nloc)
5054 INTEGER iflag(nloc)
5055 REAL precip(nloc)
5056 REAL sig(nloc, nd), w0(nloc, nd)
5057 REAL ft(nloc, nd), fq(nloc, nd), fu(nloc, nd), fv(nloc, nd)
5058 REAL ftra(nloc, nd, ntra)
5059 REAL ma(nloc, nd)
5060 REAL upwd(nloc, nd), dnwd(nloc, nd), dnwd0(nloc, nd)
5061 REAL qcondc(nloc, nd)
5062 REAL wd(nloc), cape(nloc)
5063 REAL epmax_diag(nloc)
5064
5065 !outputs:
5066 INTEGER iflag1(len)
5067 REAL precip1(len)
5068 REAL sig1(len, nd), w01(len, nd)
5069 REAL ft1(len, nd), fq1(len, nd), fu1(len, nd), fv1(len, nd)
5070 REAL ftra1(len, nd, ntra)
5071 REAL ma1(len, nd)
5072 REAL upwd1(len, nd), dnwd1(len, nd), dnwd01(len, nd)
5073 REAL qcondc1(nloc, nd)
5074 REAL wd1(nloc), cape1(nloc)
5075 REAL epmax_diag1(len) ! epmax_cape
5076
5077 !local variables:
5078 INTEGER i, k, j
5079
5080 DO i = 1, ncum
5081 precip1(idcum(i)) = precip(i)
5082 iflag1(idcum(i)) = iflag(i)
5083 wd1(idcum(i)) = wd(i)
5084 cape1(idcum(i)) = cape(i)
5085 epmax_diag1(idcum(i))=epmax_diag(i) ! epmax_cape
5086 END DO
5087
5088 DO k = 1, nl
5089 DO i = 1, ncum
5090 sig1(idcum(i), k) = sig(i, k)
5091 w01(idcum(i), k) = w0(i, k)
5092 ft1(idcum(i), k) = ft(i, k)
5093 fq1(idcum(i), k) = fq(i, k)
5094 fu1(idcum(i), k) = fu(i, k)
5095 fv1(idcum(i), k) = fv(i, k)
5096 ma1(idcum(i), k) = ma(i, k)
5097 upwd1(idcum(i), k) = upwd(i, k)
5098 dnwd1(idcum(i), k) = dnwd(i, k)
5099 dnwd01(idcum(i), k) = dnwd0(i, k)
5100 qcondc1(idcum(i), k) = qcondc(i, k)
5101 END DO
5102 END DO
5103
5104 DO i = 1, ncum
5105 sig1(idcum(i), nd) = sig(i, nd)
5106 END DO
5107
5108
5109 !AC! do 2100 j=1,ntra
5110 !AC!c oct3 do 2110 k=1,nl
5111 !AC! do 2110 k=1,nd ! oct3
5112 !AC! do 2120 i=1,ncum
5113 !AC! ftra1(idcum(i),k,j)=ftra(i,k,j)
5114 !AC! 2120 continue
5115 !AC! 2110 continue
5116 !AC! 2100 continue
5117 !
5118 RETURN
5119 END SUBROUTINE cv3_uncompress
5120
5121
5122 240 subroutine cv3_epmax_fn_cape(nloc,ncum,nd &
5123 , ep,hp,icb,inb,clw,nk,t,h,hnk,lv,lf,frac &
5124 240 , pbase, p, ph, tv, buoy, sig, w0,iflag &
5125 , epmax_diag)
5126 implicit none
5127
5128 ! On fait varier epmax en fn de la cape
5129 ! Il faut donc recalculer ep, et hp qui a d�j� �t� calcul� et
5130 ! qui en d�pend
5131 ! Toutes les autres variables fn de ep sont calcul�es plus bas.
5132
5133 include "cvthermo.h"
5134 include "cv3param.h"
5135 include "conema3.h"
5136 include "cvflag.h"
5137
5138 ! inputs:
5139 INTEGER, INTENT (IN) :: ncum, nd, nloc
5140 INTEGER, DIMENSION (nloc), INTENT (IN) :: icb, inb, nk
5141 REAL, DIMENSION (nloc), INTENT (IN) :: hnk,pbase
5142 REAL, DIMENSION (nloc, nd), INTENT (IN) :: t, lv, lf, tv, h
5143 REAL, DIMENSION (nloc, nd), INTENT (IN) :: clw, buoy,frac
5144 REAL, DIMENSION (nloc, nd), INTENT (IN) :: sig,w0
5145 INTEGER, DIMENSION (nloc), INTENT (IN) :: iflag(nloc)
5146 REAL, DIMENSION (nloc, nd), INTENT (IN) :: p
5147 REAL, DIMENSION (nloc, nd+1), INTENT (IN) :: ph
5148 ! inouts:
5149 REAL, DIMENSION (nloc, nd), INTENT (INOUT) :: ep,hp
5150 ! outputs
5151 REAL, DIMENSION (nloc), INTENT (OUT) :: epmax_diag
5152
5153 ! local
5154 integer i,k
5155 ! real hp_bak(nloc,nd)
5156 ! real ep_bak(nloc,nd)
5157 480 real m_loc(nloc,nd)
5158 480 real sig_loc(nloc,nd)
5159 480 real w0_loc(nloc,nd)
5160 480 integer iflag_loc(nloc)
5161 480 real cape(nloc)
5162
5163
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 240 times.
240 if (coef_epmax_cape.gt.1e-12) then
5164
5165 ! il faut calculer la cape: on fait un calcule simple car tant qu'on ne
5166 ! connait pas ep, on ne connait pas les m�langes, ddfts etc... qui sont
5167 ! necessaires au calcul de la cape dans la nouvelle physique
5168
5169 ! write(*,*) 'cv3_routines check 4303'
5170 do i=1,ncum
5171 do k=1,nd
5172 sig_loc(i,k)=sig(i,k)
5173 w0_loc(i,k)=w0(i,k)
5174 iflag_loc(i)=iflag(i)
5175 ! ep_bak(i,k)=ep(i,k)
5176 enddo ! do k=1,nd
5177 enddo !do i=1,ncum
5178
5179 ! write(*,*) 'cv3_routines check 4311'
5180 ! write(*,*) 'nl=',nl
5181 CALL cv3_closure(nloc, ncum, nd, icb, inb, & ! na->nd
5182 pbase, p, ph, tv, buoy, &
5183 sig_loc, w0_loc, cape, m_loc,iflag_loc)
5184
5185 ! write(*,*) 'cv3_routines check 4316'
5186 ! write(*,*) 'ep(1,:)=',ep(1,:)
5187 do i=1,ncum
5188 epmax_diag(i)=epmax-coef_epmax_cape*sqrt(cape(i))
5189 epmax_diag(i)=amax1(epmax_diag(i),0.0)
5190 ! write(*,*) 'i,icb,inb,cape,epmax_diag=', &
5191 ! i,icb(i),inb(i),cape(i),epmax_diag(i)
5192 do k=1,nl
5193 ep(i,k)=ep(i,k)/epmax*epmax_diag(i)
5194 ep(i,k)=amax1(ep(i,k),0.0)
5195 ep(i,k)=amin1(ep(i,k),epmax_diag(i))
5196 enddo
5197 enddo
5198 ! write(*,*) 'ep(1,:)=',ep(1,:)
5199
5200 !write(*,*) 'cv3_routines check 4326'
5201 ! On recalcule hp:
5202 ! do k=1,nl
5203 ! do i=1,ncum
5204 ! hp_bak(i,k)=hp(i,k)
5205 ! enddo
5206 ! enddo
5207 do k=1,nl
5208 do i=1,ncum
5209 hp(i,k)=h(i,k)
5210 enddo
5211 enddo
5212
5213 IF (cvflag_ice) THEN
5214
5215 do k=minorig+1,nl
5216 do i=1,ncum
5217 if((k.ge.icb(i)).and.(k.le.inb(i)))then
5218 hp(i, k) = hnk(i) + (lv(i,k)+(cpd-cpv)*t(i,k)+frac(i,k)*lf(i,k))* &
5219 ep(i, k)*clw(i, k)
5220 endif
5221 enddo
5222 enddo !do k=minorig+1,n
5223 ELSE !IF (cvflag_ice) THEN
5224
5225 DO k = minorig + 1, nl
5226 DO i = 1, ncum
5227 IF ((k>=icb(i)) .AND. (k<=inb(i))) THEN
5228 hp(i,k)=hnk(i)+(lv(i,k)+(cpd-cpv)*t(i,k))*ep(i,k)*clw(i,k)
5229 endif
5230 enddo
5231 enddo !do k=minorig+1,n
5232
5233 ENDIF !IF (cvflag_ice) THEN
5234 !write(*,*) 'cv3_routines check 4345'
5235 ! do i=1,ncum
5236 ! do k=1,nl
5237 ! if ((abs(hp_bak(i,k)-hp(i,k))/hp_bak(i,k).gt.1e-1).or. &
5238 ! ((abs(hp_bak(i,k)-hp(i,k))/hp_bak(i,k).gt.1e-4).and. &
5239 ! (ep(i,k)-ep_bak(i,k).lt.1e-4))) then
5240 ! write(*,*) 'i,k=',i,k
5241 ! write(*,*) 'coef_epmax_cape=',coef_epmax_cape
5242 ! write(*,*) 'epmax_diag(i)=',epmax_diag(i)
5243 ! write(*,*) 'ep(i,k)=',ep(i,k)
5244 ! write(*,*) 'ep_bak(i,k)=',ep_bak(i,k)
5245 ! write(*,*) 'hp(i,k)=',hp(i,k)
5246 ! write(*,*) 'hp_bak(i,k)=',hp_bak(i,k)
5247 ! write(*,*) 'h(i,k)=',h(i,k)
5248 ! write(*,*) 'nk(i)=',nk(i)
5249 ! write(*,*) 'h(i,nk(i))=',h(i,nk(i))
5250 ! write(*,*) 'lv(i,k)=',lv(i,k)
5251 ! write(*,*) 't(i,k)=',t(i,k)
5252 ! write(*,*) 'clw(i,k)=',clw(i,k)
5253 ! write(*,*) 'cpd,cpv=',cpd,cpv
5254 ! stop
5255 ! endif
5256 ! enddo !do k=1,nl
5257 ! enddo !do i=1,ncum
5258 endif !if (coef_epmax_cape.gt.1e-12) then
5259 !write(*,*) 'cv3_routines check 4367'
5260
5261 240 return
5262 end subroutine cv3_epmax_fn_cape
5263
5264
5265
5266