GCC Code Coverage Report | |||||||||||||||||||||
|
|||||||||||||||||||||
Line | Branch | Exec | Source |
1 |
|||
2 |
! $Id: cv3_routines.F90 4076 2022-02-04 08:37:44Z jyg $ |
||
3 |
|||
4 |
|||
5 |
|||
6 |
|||
7 |
288 |
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 |
144 |
noff = min(max(nd-k_upper, 1), (nd+1)/2) |
|
60 |
!! noff = 1 |
||
61 |
!>jyg |
||
62 |
144 |
minorig = 1 |
|
63 |
144 |
nl = nd - noff |
|
64 |
144 |
nlp = nl + 1 |
|
65 |
144 |
nlm = nl - 1 |
|
66 |
|||
67 |
✓✓ | 144 |
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 |
144 |
beta = 1.0 - delt/tau |
|
170 |
alpha1 = 1.5E-3 |
||
171 |
!JYG Correction bug alpha |
||
172 |
144 |
alpha1 = alpha1*1.5 |
|
173 |
144 |
alpha = alpha1*delt/tau |
|
174 |
!JYG Bug |
||
175 |
! cc increase alpha to compensate W decrease: |
||
176 |
! c alpha = alpha*1.5 |
||
177 |
|||
178 |
144 |
noconv_stop = max(2.,tau_stop/delt) |
|
179 |
|||
180 |
144 |
RETURN |
|
181 |
END SUBROUTINE cv3_param |
||
182 |
|||
183 |
144 |
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 |
✓✗ | 144 |
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 |
✓✓ | 143280 |
DO il = 1, len |
214 |
143136 |
sig(il, nd) = sig(il, nd) + 1. |
|
215 |
143280 |
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 |
144 |
RETURN |
|
221 |
END SUBROUTINE cv3_incrcount |
||
222 |
|||
223 |
15458976 |
SUBROUTINE cv3_prelim(len, nd, ndp1, t, q, p, ph, & |
|
224 |
288 |
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 |
576 |
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 |
✓✓ | 8352 |
DO k = 1, nlp |
255 |
|||
256 |
✓✓ | 8023968 |
DO i = 1, len |
257 |
! debug lv(i,k)= lv0-clmcpv*(t(i,k)-t0) |
||
258 |
8015616 |
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 |
8015616 |
lf(i, k) = lf0 + clmci*(t(i,k)-273.15) |
|
261 |
8015616 |
cpn(i, k) = cpd*(1.0-q(i,k)) + cpv*q(i, k) |
|
262 |
8015616 |
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 |
8015616 |
tv(i, k) = t(i, k)*(1.0+q(i,k)/eps-q(i,k)) |
|
265 |
8015616 |
rdcp = (rrd*(1.-q(i,k))+q(i,k)*rrv)/cpn(i, k) |
|
266 |
8023680 |
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 |
✓✓✓✓ |
11176128 |
gz(:,:) = 0. !jyg: initialization of the whole array |
276 |
! ori do 140 k=2,nlp |
||
277 |
✓✓ | 7776 |
DO k = 2, nl ! convect3 |
278 |
✓✓ | 7450848 |
DO i = 1, len |
279 |
7443072 |
tvx = t(i, k)*(1.+q(i,k)/eps-q(i,k)) !convect3 |
|
280 |
7443072 |
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 |
7450560 |
(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 |
✓✓ | 8064 |
DO k = 1, nl ! convect3 |
296 |
✓✓ | 7737408 |
DO i = 1, len |
297 |
7729344 |
h(i, k) = gz(i, k) + cpn(i, k)*t(i, k) |
|
298 |
7737120 |
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 |
288 |
RETURN |
|
303 |
END SUBROUTINE cv3_prelim |
||
304 |
|||
305 |
144 |
SUBROUTINE cv3_feed(len, nd, ok_conserv_q, & |
|
306 |
144 |
t, q, u, v, p, ph, h, gz, & |
|
307 |
p1feed, p2feed, wght, & |
||
308 |
wghti, tnk, thnk, qnk, qsnk, unk, vnk, & |
||
309 |
144 |
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 |
288 |
REAL pup(len), plo(len), pfeed(len) |
|
359 |
288 |
REAL plclup(len), plcllo(len), plclfeed(len) |
|
360 |
288 |
REAL pfeedmin(len) |
|
361 |
288 |
REAL posit(len) |
|
362 |
288 |
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 |
✓✓ | 144 |
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 |
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 |
✓✓ | 143280 |
DO i = 1, len |
393 |
143136 |
nk(i) = minorig |
|
394 |
143280 |
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 |
✓✓ | 143280 |
DO i = 1, len |
408 |
143280 |
pup(i) = p2feed(i) |
|
409 |
END DO |
||
410 |
✗✓ | 144 |
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 |
144 |
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 |
✓✓ | 143280 |
DO i = 1, len |
421 |
143280 |
plo(i) = ph(i, nk(i)+1) |
|
422 |
END DO |
||
423 |
✗✓ | 144 |
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 |
144 |
wghti, nk, tnk, thnk, qnk, qsnk, unk, vnk, plcllo) |
|
431 |
ENDIF ! (fl_cor_ebil >=2 ) |
||
432 |
! 2- Iterations |
||
433 |
niter = 5 |
||
434 |
✓✓ | 864 |
DO iter = 1, niter |
435 |
✓✓ | 716400 |
DO i = 1, len |
436 |
715680 |
plcllo(i) = min(plo(i), plcllo(i)) |
|
437 |
715680 |
plclup(i) = max(pup(i), plclup(i)) |
|
438 |
716400 |
nocond(i) = plclup(i) <= pup(i) |
|
439 |
END DO |
||
440 |
✓✓ | 716400 |
DO i = 1, len |
441 |
✓✓ | 716400 |
IF (nocond(i)) THEN |
442 |
502765 |
pfeed(i) = pup(i) |
|
443 |
ELSE |
||
444 |
!JYG20140217< |
||
445 |
✓✗ | 212915 |
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 |
212915 |
(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 |
✓✗ | 720 |
IF (ok_new_feed) THEN |
461 |
✓✓ | 720 |
IF (iter==niter) THEN |
462 |
✓✓ | 143280 |
DO i = 1,len !jyg |
463 |
143280 |
pfeedmin(i) = ph(i,minorig+1) !jyg |
|
464 |
ENDDO !jyg |
||
465 |
✓✓ | 3888 |
DO k = minorig+1, nl !jyg |
466 |
!! DO k = minorig, nl !jyg |
||
467 |
✓✓ | 3725424 |
DO i = 1, len |
468 |
✓✓ | 3725280 |
IF (ph(i,k)>=plclfeed(i)) pfeedmin(i) = ph(i, k) |
469 |
END DO |
||
470 |
END DO |
||
471 |
✓✓ | 143280 |
DO i = 1, len |
472 |
143280 |
pfeed(i) = max(pfeedmin(i), pfeed(i)) |
|
473 |
END DO |
||
474 |
END IF |
||
475 |
END IF |
||
476 |
!jyg> |
||
477 |
|||
478 |
✗✓ | 720 |
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 |
720 |
wghti, nk, tnk, thnk, qnk, qsnk, unk, vnk, plclfeed) |
|
486 |
ENDIF ! (fl_cor_ebil >=2 ) |
||
487 |
!jyg20140217< |
||
488 |
✓✗ | 720 |
IF (ok_new_feed) THEN |
489 |
✓✓ | 716400 |
DO i = 1, len |
490 |
715680 |
posit(i) = (sign(1.,plclfeed(i)-pfeed(i)+dp_lcl_feed)+1.)*0.5 |
|
491 |
✓✓ | 716400 |
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 |
✓✓ | 716544 |
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 |
715680 |
pup(i) = posit(i)*pfeed(i) + (1.-posit(i))*pup(i) |
|
506 |
715680 |
plo(i) = (1.-posit(i))*pfeed(i) + posit(i)*plo(i) |
|
507 |
715680 |
plclup(i) = posit(i)*plclfeed(i) + (1.-posit(i))*plclup(i) |
|
508 |
716400 |
plcllo(i) = (1.-posit(i))*plclfeed(i) + posit(i)*plcllo(i) |
|
509 |
END DO |
||
510 |
END DO ! iter |
||
511 |
|||
512 |
✓✓ | 143280 |
DO i = 1, len |
513 |
143136 |
p2feed(i) = pfeed(i) |
|
514 |
143280 |
plcl(i) = plclfeed(i) |
|
515 |
END DO |
||
516 |
|||
517 |
✓✓ | 143280 |
DO i = 1, len |
518 |
143136 |
cpnk(i) = cpd*(1.0-qnk(i)) + cpv*qnk(i) |
|
519 |
143280 |
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 |
✗✓ | 144 |
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 |
✓✗ | 144 |
ELSEIF (cv_flag_feed >= 2) THEN |
533 |
! --- and demand that LCL be high enough |
||
534 |
✓✓ | 143280 |
DO i = 1, len |
535 |
IF (((tnk(i)<250.0) .OR. & |
||
536 |
(qnk(i)<=0.0) .OR. & |
||
537 |
✓✓✓✗ ✓✓✓✗ |
143136 |
(plcl(i)>min(0.99*ph(i,1),ph(i,3)))) .AND. & |
538 |
55628 |
(iflag(i)==0)) iflag(i) = 7 |
|
539 |
END DO |
||
540 |
ENDIF |
||
541 |
✗✓ | 144 |
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 |
✓✓ | 143280 |
DO i = 1, len |
566 |
143280 |
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 |
✓✓ | 3600 |
DO k = 3, nl - 1 ! modif pour que icb soit sup/egal a 2 |
573 |
✓✓ | 3438864 |
DO i = 1, len |
574 |
✓✓ | 3438720 |
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 |
✓✓ | 143280 |
DO i = 1, len |
584 |
!@ if((icb(i).ge.nlm).and.(iflag(i).eq.0))iflag(i)=9 |
||
585 |
✗✓✗✗ |
143280 |
IF ((icb(i)==nlm) .AND. (iflag(i)==0)) iflag(i) = 9 |
586 |
END DO |
||
587 |
|||
588 |
✓✓ | 143280 |
DO i = 1, len |
589 |
143280 |
icb(i) = icb(i) - 1 ! icb sup ou egal a 2 |
|
590 |
END DO |
||
591 |
|||
592 |
! Compute icbmax. |
||
593 |
|||
594 |
144 |
icbmax = 2 |
|
595 |
✓✓ | 143280 |
DO i = 1, len |
596 |
!! icbmax=max(icbmax,icb(i)) |
||
597 |
✓✓ | 143280 |
IF (iflag(i)<7) icbmax = max(icbmax, icb(i)) ! sb Jun7th02 |
598 |
END DO |
||
599 |
|||
600 |
144 |
RETURN |
|
601 |
END SUBROUTINE cv3_feed |
||
602 |
|||
603 |
1996096 |
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 |
288 |
INTEGER icb1(len), icbsmax2 ! convect3 |
|
638 |
REAL tg, qg, alv, s, ahg, tc, denom, es, rg |
||
639 |
288 |
REAL ah0(len), cpp(len) |
|
640 |
288 |
REAL ticb(len), gzicb(len) |
|
641 |
288 |
REAL qsicb(len) ! convect3 |
|
642 |
144 |
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 |
✓✓ | 143280 |
DO i = 1, len |
655 |
143136 |
ah0(i) = (cpd*(1.-qnk(i))+cl*qnk(i))*tnk(i) + qnk(i)*(lv0-clmcpv*(tnk(i)-273.15)) + gznk(i) |
|
656 |
143136 |
cpp(i) = cpd*(1.-qnk(i)) + qnk(i)*cpv |
|
657 |
143280 |
cpinv(i) = 1./cpp(i) |
|
658 |
END DO |
||
659 |
|||
660 |
! *** Calculate lifted parcel quantities below cloud base *** |
||
661 |
|||
662 |
✓✓ | 143280 |
DO i = 1, len !convect3 |
663 |
143136 |
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 |
143136 |
icbs(i) = icb1(i) !convect3 |
|
667 |
✓✓ | 143280 |
IF (plcl(i)<p(i,icb1(i))) THEN |
668 |
52252 |
icbs(i) = min(icbs(i)+1, nl) !convect3 |
|
669 |
END IF |
||
670 |
END DO !convect3 |
||
671 |
|||
672 |
✓✓ | 143280 |
DO i = 1, len !convect3 |
673 |
143136 |
ticb(i) = t(i, icbs(i)) !convect3 |
|
674 |
143136 |
gzicb(i) = gz(i, icbs(i)) !convect3 |
|
675 |
143280 |
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 |
✓✓ | 143280 |
DO i = 1, len !convect3 |
683 |
143280 |
icbsmax2 = max(icbsmax2, icbs(i)) !convect3 |
|
684 |
END DO !convect3 |
||
685 |
|||
686 |
! initialization outputs: |
||
687 |
|||
688 |
✓✓ | 1720 |
DO k = 1, icbsmax2 ! convect3 |
689 |
✓✓ | 1568264 |
DO i = 1, len ! convect3 |
690 |
1566544 |
tp(i, k) = 0.0 ! convect3 |
|
691 |
1566544 |
tvp(i, k) = 0.0 ! convect3 |
|
692 |
1568120 |
clw(i, k) = 0.0 ! convect3 |
|
693 |
END DO ! convect3 |
||
694 |
END DO ! convect3 |
||
695 |
|||
696 |
! tp and tvp below cloud base: |
||
697 |
|||
698 |
✓✓ | 1576 |
DO k = minorig, icbsmax2 - 1 |
699 |
✓✓ | 1424984 |
DO i = 1, len |
700 |
1423408 |
tp(i, k) = tnk(i) - (gz(i,k)-gznk(i))*cpinv(i) |
|
701 |
1424840 |
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 |
✓✓ | 143280 |
DO i = 1, len |
708 |
143136 |
tg = ticb(i) |
|
709 |
! ori qg=qs(i,icb(i)) |
||
710 |
143136 |
qg = qsicb(i) ! convect3 |
|
711 |
! debug alv=lv0-clmcpv*(ticb(i)-t0) |
||
712 |
143136 |
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 |
143136 |
alv*alv*qg/(rrv*ticb(i)*ticb(i)) ! convect3 |
|
719 |
143136 |
s = 1./s |
|
720 |
! ori ahg=cpd*tg+(cl-cpd)*qnk(i)*ticb(i)+alv*qg+gzicb(i) |
||
721 |
143136 |
ahg = cpd*tg + (cl-cpd)*qnk(i)*tg + alv*qg + gzicb(i) ! convect3 |
|
722 |
143136 |
tg = tg + s*(ah0(i)-ahg) |
|
723 |
! ori tg=max(tg,35.0) |
||
724 |
! debug tc=tg-t0 |
||
725 |
143136 |
tc = tg - 273.15 |
|
726 |
143136 |
denom = 243.5 + tc |
|
727 |
143136 |
denom = max(denom, 1.0) ! convect3 |
|
728 |
! ori if(tc.ge.0.0)then |
||
729 |
143136 |
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 |
143136 |
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 |
143136 |
ahg = cpd*tg + (cl-cpd)*qnk(i)*tg + alv*qg + gzicb(i) ! convect3 |
|
743 |
143136 |
tg = tg + s*(ah0(i)-ahg) |
|
744 |
! ori tg=max(tg,35.0) |
||
745 |
! debug tc=tg-t0 |
||
746 |
143136 |
tc = tg - 273.15 |
|
747 |
143136 |
denom = 243.5 + tc |
|
748 |
143136 |
denom = max(denom, 1.0) ! convect3 |
|
749 |
! ori if(tc.ge.0.0)then |
||
750 |
143136 |
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 |
143136 |
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 |
143136 |
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 |
143136 |
clw(i, icbs(i)) = qnk(i) - qg |
|
769 |
143136 |
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 |
143280 |
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 |
✓✓ | 143280 |
DO i = 1, len |
801 |
143136 |
ticb(i) = t(i, icb(i)+1) |
|
802 |
143136 |
gzicb(i) = gz(i, icb(i)+1) |
|
803 |
143280 |
qsicb(i) = qs(i, icb(i)+1) |
|
804 |
END DO |
||
805 |
|||
806 |
✓✓ | 143280 |
DO i = 1, len |
807 |
143136 |
tg = ticb(i) |
|
808 |
143136 |
qg = qsicb(i) ! convect3 |
|
809 |
! debug alv=lv0-clmcpv*(ticb(i)-t0) |
||
810 |
143136 |
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 |
143136 |
+alv*alv*qg/(rrv*ticb(i)*ticb(i)) ! convect3 |
|
817 |
143136 |
s = 1./s |
|
818 |
! ori ahg=cpd*tg+(cl-cpd)*qnk(i)*ticb(i)+alv*qg+gzicb(i) |
||
819 |
143136 |
ahg = cpd*tg + (cl-cpd)*qnk(i)*tg + alv*qg + gzicb(i) ! convect3 |
|
820 |
143136 |
tg = tg + s*(ah0(i)-ahg) |
|
821 |
! ori tg=max(tg,35.0) |
||
822 |
! debug tc=tg-t0 |
||
823 |
143136 |
tc = tg - 273.15 |
|
824 |
143136 |
denom = 243.5 + tc |
|
825 |
143136 |
denom = max(denom, 1.0) ! convect3 |
|
826 |
! ori if(tc.ge.0.0)then |
||
827 |
143136 |
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 |
143136 |
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 |
143136 |
ahg = cpd*tg + (cl-cpd)*qnk(i)*tg + alv*qg + gzicb(i) ! convect3 |
|
841 |
143136 |
tg = tg + s*(ah0(i)-ahg) |
|
842 |
! ori tg=max(tg,35.0) |
||
843 |
! debug tc=tg-t0 |
||
844 |
143136 |
tc = tg - 273.15 |
|
845 |
143136 |
denom = 243.5 + tc |
|
846 |
143136 |
denom = max(denom, 1.0) ! convect3 |
|
847 |
! ori if(tc.ge.0.0)then |
||
848 |
143136 |
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 |
143136 |
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 |
143136 |
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 |
143136 |
clw(i, icb(i)+1) = qnk(i) - qg |
|
867 |
143136 |
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 |
143280 |
tvp(i, icb(i)+1) = tp(i, icb(i)+1)*(1.+qg/eps-qnk(i)) !whole thing |
|
873 |
|||
874 |
END DO |
||
875 |
|||
876 |
144 |
RETURN |
|
877 |
END SUBROUTINE cv3_undilute1 |
||
878 |
|||
879 |
5249736 |
SUBROUTINE cv3_trigger(len, nd, icb, plcl, p, th, tv, tvp, thnk, & |
|
880 |
144 |
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 |
✓✓ | 143280 |
DO i = 1, len |
922 |
143136 |
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 |
143136 |
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 |
143136 |
tv(i, icb(i)+1)*(p(i,icb(i))-pbase(i)) /(p(i,icb(i))-p(i,icb(i)+1)) |
|
927 |
143280 |
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 |
✓✓ | 4032 |
DO k = 1, nl |
960 |
✓✓ | 3868704 |
DO i = 1, len |
961 |
|||
962 |
3864672 |
tdif = buoybase(i) |
|
963 |
3864672 |
ath1 = thnk(i) |
|
964 |
3864672 |
ath = th(i, icb(i)-1) - dttrig |
|
965 |
|||
966 |
✓✓✗✓ |
3868560 |
IF (tdif<dtcrit .OR. ath>ath1) THEN |
967 |
1241784 |
sig(i, k) = beta*sig(i, k) - 2.*alpha*tdif*tdif |
|
968 |
1241784 |
sig(i, k) = amax1(sig(i,k), 0.0) |
|
969 |
1241784 |
w0(i, k) = beta*w0(i, k) |
|
970 |
1241784 |
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 |
144 |
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 |
11044093 |
SUBROUTINE cv3_undilute2(nloc, ncum, nd, iflag, icb, icbs, nk, & |
|
1132 |
144 |
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 |
288 |
REAL, DIMENSION (nloc,nd) :: qi |
|
1196 |
288 |
REAL, DIMENSION (nloc,nd) :: ha ! moist static energy of adiabatic ascents |
|
1197 |
! taking into account precip ejection |
||
1198 |
288 |
REAL, DIMENSION (nloc,nd) :: hla ! liquid water static energy of adiabatic ascents |
|
1199 |
! taking into account precip ejection |
||
1200 |
288 |
REAL, DIMENSION (nloc,nd) :: qcld ! specific cloud water |
|
1201 |
288 |
REAL, DIMENSION (nloc,nd) :: qhsat ! specific humidity at saturation |
|
1202 |
REAL, DIMENSION (nloc,nd) :: dqhsatdT ! dqhsat/dT |
||
1203 |
288 |
REAL, DIMENSION (nloc,nd) :: frac ! ice fraction function of envt temperature |
|
1204 |
288 |
REAL, DIMENSION (nloc,nd) :: qps ! specific solid precipitation |
|
1205 |
288 |
REAL, DIMENSION (nloc,nd) :: qpl ! specific liquid precipitation |
|
1206 |
288 |
REAL, DIMENSION (nloc) :: ah0, cape, capem, byp |
|
1207 |
LOGICAL, DIMENSION (nloc) :: lcape |
||
1208 |
288 |
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 |
✗✓ | 144 |
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 |
✓✓ | 4032 |
DO k = 1, nl |
1231 |
✓✓ | 1866114 |
DO i = 1, ncum |
1232 |
1865970 |
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 |
✓✓ | 69110 |
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 |
69110 |
qnk(i)*(lv0-clmcpv*(tnk(i)-273.15)) + gznk(i) |
|
1251 |
END DO |
||
1252 |
! |
||
1253 |
! Ice fraction |
||
1254 |
! |
||
1255 |
✓✗ | 144 |
IF (cvflag_ice) THEN |
1256 |
✓✓ | 4032 |
DO k = minorig, nl |
1257 |
✓✓ | 1866114 |
DO i = 1, ncum |
1258 |
1862082 |
frac(i, k) = (Tx - t(i,k))/(Tx - Tm) |
|
1259 |
1865970 |
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 |
✓✓ | 4032 |
DO k = 1, nl |
1264 |
✓✓ | 1866114 |
DO i = 1, ncum |
1265 |
✓✓ | 1865970 |
IF (k<icb(i)) THEN |
1266 |
305964 |
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 |
✓✓ | 4032 |
DO k = minorig, nl |
1280 |
✓✓ | 1866114 |
DO i = 1,ncum |
1281 |
1862082 |
ha(i,k) = ah0(i) |
|
1282 |
1862082 |
hla(i,k) = hnk(i) |
|
1283 |
1862082 |
qta(i,k) = qnk(i) |
|
1284 |
1862082 |
qpreca(i,k) = 0. |
|
1285 |
1862082 |
frac_a(i,k) = 0. |
|
1286 |
1862082 |
frac_s(i,k) = frac(i,k) |
|
1287 |
1862082 |
qpl(i,k) = 0. |
|
1288 |
1862082 |
qps(i,k) = 0. |
|
1289 |
1862082 |
qhsat(i,k) = qs(i,k) |
|
1290 |
1862082 |
qcld(i,k) = max(qta(i,k)-qhsat(i,k),0.) |
|
1291 |
✓✓ | 1865970 |
IF (k <= icb(i)+1) THEN |
1292 |
443896 |
qhsat(i,k) = qnk(i)-clw(i,k) |
|
1293 |
443896 |
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 |
✓✓ | 4032 |
DO k = 1, nl |
1303 |
✓✓ | 1866114 |
DO i = 1, ncum |
1304 |
1862082 |
ep(i, k) = 0.0 |
|
1305 |
1865970 |
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 |
✗✓ | 144 |
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 |
✗✓ | 144 |
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 |
✓✗ | 144 |
ELSE IF (icvflag_Tpa == 0) THEN! (icvflag_Tpa == 2) ELSE IF(icvflag_Tpa == 1) |
1545 |
! |
||
1546 |
!---------------------------------------------------------------------------- |
||
1547 |
! |
||
1548 |
✓✓ | 3888 |
DO k = minorig + 1, nl |
1549 |
✓✓ | 1797004 |
DO i = 1, ncum |
1550 |
! ori if(k.ge.(icb(i)+1))then |
||
1551 |
✓✓ | 1796860 |
IF (k>=(icbs(i)+1)) THEN ! convect3 |
1552 |
1449226 |
tg = t(i, k) |
|
1553 |
1449226 |
qg = qs(i, k) |
|
1554 |
! debug alv=lv0-clmcpv*(t(i,k)-t0) |
||
1555 |
1449226 |
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 |
1449226 |
alv*alv*qg/(rrv*t(i,k)*t(i,k)) ! convect3 |
|
1562 |
1449226 |
s = 1./s |
|
1563 |
! ori ahg=cpd*tg+(cl-cpd)*qnk(i)*t(i,k)+alv*qg+gz(i,k) |
||
1564 |
1449226 |
ahg = cpd*tg + (cl-cpd)*qnk(i)*tg + alv*qg + gz(i, k) ! convect3 |
|
1565 |
1449226 |
tg = tg + s*(ah0(i)-ahg) |
|
1566 |
! ori tg=max(tg,35.0) |
||
1567 |
! debug tc=tg-t0 |
||
1568 |
1449226 |
tc = tg - 273.15 |
|
1569 |
1449226 |
denom = 243.5 + tc |
|
1570 |
1449226 |
denom = max(denom, 1.0) ! convect3 |
|
1571 |
! ori if(tc.ge.0.0)then |
||
1572 |
1449226 |
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 |
1449226 |
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 |
1449226 |
ahg = cpd*tg + (cl-cpd)*qnk(i)*tg + alv*qg + gz(i, k) ! convect3 |
|
1584 |
1449226 |
tg = tg + s*(ah0(i)-ahg) |
|
1585 |
! ori tg=max(tg,35.0) |
||
1586 |
! debug tc=tg-t0 |
||
1587 |
1449226 |
tc = tg - 273.15 |
|
1588 |
1449226 |
denom = 243.5 + tc |
|
1589 |
1449226 |
denom = max(denom, 1.0) ! convect3 |
|
1590 |
! ori if(tc.ge.0.0)then |
||
1591 |
1449226 |
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 |
1449226 |
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 |
✓✗ | 1449226 |
IF (cvflag_ice) THEN |
1608 |
1449226 |
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 |
1449226 |
clw(i, k) = qnk(i) - qg |
|
1614 |
1449226 |
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 |
1449226 |
tvp(i, k) = tp(i, k)*(1.+qg/eps-qnk(i)) ! whole thing |
|
1619 |
✓✗ | 1449226 |
IF (cvflag_ice) THEN |
1620 |
✓✓ | 1449226 |
IF (clw(i,k)<1.E-11) THEN |
1621 |
263 |
tp(i, k) = tv(i, k) |
|
1622 |
263 |
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 |
✓✗ | 1449226 |
IF (cvflag_ice) THEN |
1630 |
!CR:attention boucle en klon dans Icefrac |
||
1631 |
! Call Icefrac(t,clw,qi,nl,nloc) |
||
1632 |
✓✓ | 1449226 |
IF (t(i,k)>263.15) THEN |
1633 |
322715 |
qi(i, k) = 0. |
|
1634 |
ELSE |
||
1635 |
✓✓ | 1126511 |
IF (t(i,k)<243.15) THEN |
1636 |
951380 |
qi(i, k) = clw(i, k) |
|
1637 |
ELSE |
||
1638 |
175131 |
fracg = (263.15-t(i,k))/20 |
|
1639 |
175131 |
qi(i, k) = clw(i, k)*fracg |
|
1640 |
END IF |
||
1641 |
END IF |
||
1642 |
!CR: fin test |
||
1643 |
✓✓ | 1449226 |
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 |
1126511 |
alf = lf0 + clmci*(t(i,k)-273.15) |
|
1670 |
1126511 |
als = alf + alv |
|
1671 |
1126511 |
tg = tp(i, k) |
|
1672 |
1126511 |
tp(i, k) = t(i, k) |
|
1673 |
✓✓ | 4506044 |
DO j = 1, 3 |
1674 |
3379533 |
esi = exp(23.33086-(6111.72784/tp(i,k))+0.15215*log(tp(i,k))) |
|
1675 |
3379533 |
qsat_new = eps*esi/(p(i,k)-esi*(1.-eps)) |
|
1676 |
snew = cpd*(1.-qnk(i)) + cl*qnk(i) + alv*als*qsat_new/ & |
||
1677 |
3379533 |
(rrv*tp(i,k)*tp(i,k)) |
|
1678 |
3379533 |
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 |
4506044 |
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 |
1126511 |
clw(i, k) = qnk(i) - qsat_new |
|
1689 |
1126511 |
clw(i, k) = max(0.0, clw(i,k)) |
|
1690 |
1126511 |
tvp(i, k) = max(0., tp(i,k)*(1.+qsat_new/eps-qnk(i))) |
|
1691 |
! print*,tvp(i,k),'tvp' |
||
1692 |
END IF |
||
1693 |
✗✓ | 1449226 |
IF (clw(i,k)<1.E-11) THEN |
1694 |
tp(i, k) = tv(i, k) |
||
1695 |
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 |
✗✓ | 144 |
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 |
✓✓ | 4032 |
DO k = 1, nl |
1731 |
✓✓ | 1866114 |
DO i = 1, ncum |
1732 |
✓✓ | 1865970 |
IF(k>=icb(i)) THEN |
1733 |
!! IF (k>=(nk(i)+1)) THEN |
||
1734 |
!>jyg |
||
1735 |
1556118 |
tca = tp(i, k) - t0 |
|
1736 |
✓✓ | 1556118 |
IF (tca>=0.0) THEN |
1737 |
308269 |
elacrit = elcrit |
|
1738 |
ELSE |
||
1739 |
1247849 |
elacrit = elcrit*(1.0-tca/tlcrit) |
|
1740 |
END IF |
||
1741 |
1556118 |
elacrit = max(elacrit, 0.0) |
|
1742 |
1556118 |
ep(i, k) = 1.0 - elacrit/max(clw(i,k), 1.0E-8) |
|
1743 |
1556118 |
ep(i, k) = max(ep(i,k), 0.0) |
|
1744 |
1556118 |
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 |
✗✓ | 144 |
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 |
✓✓ | 69110 |
DO i = 1, ncum ! convect3 |
1780 |
69110 |
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 |
✓✓ | 4032 |
DO k = 1, nl |
1793 |
✓✓ | 1866114 |
DO i = 1, ncum |
1794 |
1865970 |
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 |
✓✓ | 4032 |
DO k = 1, nl |
1803 |
✓✓ | 1866114 |
DO i = 1, ncum |
1804 |
✓✓✓✓ |
1865970 |
IF ((k>=icb(i)) .AND. (k<=nl) .AND. (p(i,k)>=pbase(i))) THEN |
1805 |
117979 |
buoy(i, k) = buoybase(i) |
|
1806 |
END IF |
||
1807 |
END DO |
||
1808 |
END DO |
||
1809 |
✓✓ | 69110 |
DO i = 1, ncum |
1810 |
! buoy(icb(i),k)=buoybase(i) |
||
1811 |
69110 |
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 |
✓✓ | 69110 |
DO i = 1, ncum |
1824 |
68966 |
inb(i) = nl - 1 |
|
1825 |
69110 |
iposit(i) = nl |
|
1826 |
END DO |
||
1827 |
|||
1828 |
|||
1829 |
! -- iposit(i) = first level, above icb, with positive buoyancy |
||
1830 |
✓✓ | 3888 |
DO k = 1, nl - 1 |
1831 |
✓✓ | 1797004 |
DO i = 1, ncum |
1832 |
✓✓✓✓ |
1796860 |
IF (k>=icb(i) .AND. buoy(i,k)>0.) THEN |
1833 |
501077 |
iposit(i) = min(iposit(i), k) |
|
1834 |
END IF |
||
1835 |
END DO |
||
1836 |
END DO |
||
1837 |
|||
1838 |
✓✓ | 69110 |
DO i = 1, ncum |
1839 |
✓✓ | 69110 |
IF (iposit(i)==nl) THEN |
1840 |
4617 |
iposit(i) = icb(i) |
|
1841 |
END IF |
||
1842 |
END DO |
||
1843 |
|||
1844 |
✓✓ | 3888 |
DO k = 1, nl - 1 |
1845 |
✓✓ | 1797004 |
DO i = 1, ncum |
1846 |
✓✓✓✓ |
1796860 |
IF ((k>=iposit(i)) .AND. (buoy(i,k)<dtovsh)) THEN |
1847 |
935323 |
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 |
✗✓ | 144 |
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 |
✓✓ | 69110 |
DO i = 1,ncum |
1974 |
✗✓ | 69110 |
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 |
✓✓ | 4032 |
DO k = 1, nl |
1982 |
✓✓ | 1866114 |
DO i = 1, ncum |
1983 |
1865970 |
hp(i, k) = h(i, k) |
|
1984 |
END DO |
||
1985 |
END DO |
||
1986 |
|||
1987 |
!jyg : cvflag_ice test outside the loops (07042015) |
||
1988 |
! |
||
1989 |
✓✗ | 144 |
IF (cvflag_ice) THEN |
1990 |
! |
||
1991 |
✓✗ | 144 |
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 |
✓✓ | 3888 |
DO k = minorig + 1, nl |
2002 |
✓✓ | 1797004 |
DO i = 1, ncum |
2003 |
✓✓✓✓ |
1796860 |
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 |
586707 |
frac_s(i, k) = 1. - (t(i,k)-243.15)/(263.15-243.15) |
|
2007 |
586707 |
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 |
✓✓ | 3888 |
DO k = minorig + 1, nl |
2013 |
✓✓ | 1797004 |
DO i = 1, ncum |
2014 |
✓✓✓✓ |
1796860 |
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 |
586707 |
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 |
144 |
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 |
7605067 |
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 |
144 |
m, ment, elij, delt, plcl, coef_clos, & |
|
2708 |
144 |
mp, rp, up, vp, trap, wt, water, evap, fondue, ice, & |
|
2709 |
144 |
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 |
288 |
REAL tevap(nloc) |
|
2768 |
288 |
REAL, DIMENSION (nloc, na) :: lvcp, lfcp |
|
2769 |
REAL, DIMENSION (nloc, na) :: h, hm |
||
2770 |
288 |
REAL, DIMENSION (nloc, na) :: ma |
|
2771 |
288 |
REAL, DIMENSION (nloc, na) :: frac ! ice fraction in precipitation source |
|
2772 |
288 |
REAL, DIMENSION (nloc, na) :: fraci ! provisionnal ice fraction in precipitation |
|
2773 |
288 |
REAL, DIMENSION (nloc, na) :: prec |
|
2774 |
288 |
REAL wdtrain(nloc) |
|
2775 |
288 |
LOGICAL lwork(nloc), mplus(nloc) |
|
2776 |
|||
2777 |
|||
2778 |
! ------------------------------------------------------ |
||
2779 |
✗✓ | 144 |
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 |
✓✓✓✓ |
5588064 |
mp(:,:) = 0. |
2788 |
✓✓✓✓ |
5588064 |
rp(:,:) = 0. |
2789 |
✓✓✓✓ |
5588064 |
up(:,:) = 0. |
2790 |
✓✓✓✓ |
5588064 |
vp(:,:) = 0. |
2791 |
✓✓✓✓ |
5588064 |
water(:,:) = 0. |
2792 |
✓✓✓✓ |
5588064 |
evap(:,:) = 0. |
2793 |
✓✓✓✓ |
5588064 |
wt(:,:) = 0. |
2794 |
✓✓✓✓ |
5588064 |
ice(:,:) = 0. |
2795 |
✓✓✓✓ |
5588064 |
fondue(:,:) = 0. |
2796 |
✓✓✓✓ |
5588064 |
faci(:,:) = 0. |
2797 |
✓✓✓✓ |
5588064 |
b(:,:) = 0. |
2798 |
✓✓ | 143280 |
sigd(:) = 0. |
2799 |
!! RomP >>> |
||
2800 |
✓✓✓✓ |
5588064 |
wdtrainA(:,:) = 0. |
2801 |
✓✓✓✓ |
5588064 |
wdtrainS(:,:) = 0. |
2802 |
✓✓✓✓ |
5588064 |
wdtrainM(:,:) = 0. |
2803 |
!! RomP <<< |
||
2804 |
|||
2805 |
✓✓ | 4176 |
DO i = 1, nlp |
2806 |
✓✓ | 1935224 |
DO il = 1, ncum |
2807 |
1931048 |
rp(il, i) = rr(il, i) |
|
2808 |
1931048 |
up(il, i) = u(il, i) |
|
2809 |
1931048 |
vp(il, i) = v(il, i) |
|
2810 |
1935080 |
wt(il, i) = 0.001 |
|
2811 |
END DO |
||
2812 |
END DO |
||
2813 |
|||
2814 |
! *** Set the fractionnal area sigd of precipitating downdraughts |
||
2815 |
✓✓ | 69110 |
DO il = 1, ncum |
2816 |
69110 |
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 |
144 |
delti = 1./delt |
|
2825 |
tinv = 1./3. |
||
2826 |
|||
2827 |
✓✓ | 4176 |
DO i = 1, nlp |
2828 |
✓✓ | 1935224 |
DO il = 1, ncum |
2829 |
1931048 |
frac(il, i) = 0.0 |
|
2830 |
1931048 |
fraci(il, i) = 0.0 |
|
2831 |
1931048 |
prec(il, i) = 0.0 |
|
2832 |
1931048 |
lvcp(il, i) = lv(il, i)/cpn(il, i) |
|
2833 |
1935080 |
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 |
✓✓ | 69110 |
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 |
✓✓✓✓ |
115057 |
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 |
✗✓ | 144 |
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 |
✓✓ | 69110 |
DO il = 1, ncum |
2880 |
68966 |
ma(il, nlp) = 0. |
|
2881 |
69110 |
ma(il, 1) = 0. |
|
2882 |
END DO |
||
2883 |
|||
2884 |
✓✓ | 3888 |
DO i = nl, 2, -1 |
2885 |
✓✓ | 1797004 |
DO il = 1, ncum |
2886 |
1796860 |
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 |
✓✓ | 4176 |
DO i = nl + 1, 1, -1 |
2900 |
|||
2901 |
num1 = 0 |
||
2902 |
✓✓ | 1935080 |
DO il = 1, ncum |
2903 |
✓✓✓✓ |
1935080 |
IF (i<=inb(il) .AND. lwork(il)) num1 = num1 + 1 |
2904 |
END DO |
||
2905 |
✓✓ | 4032 |
IF (num1<=0) GO TO 400 |
2906 |
|||
2907 |
3027 |
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 |
✓✓ | 1452914 |
DO il = 1, ncum |
2918 |
✓✓✓✓ |
1452914 |
IF (i<=inb(il) .AND. lwork(il)) THEN |
2919 |
386747 |
wdtrain(il) = grav*ep(il, i)*m(il, i)*clw(il, i) |
|
2920 |
386747 |
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 |
✓✓ | 3027 |
IF (i>1) THEN |
2926 |
✓✓ | 33186 |
DO j = 1, i - 1 |
2927 |
✓✓ | 14549667 |
DO il = 1, ncum |
2928 |
✓✓✓✓ |
14546784 |
IF (i<=inb(il) .AND. lwork(il)) THEN |
2929 |
3192455 |
awat = elij(il, j, i) - (1.-ep(il,i))*clw(il, i) |
|
2930 |
3192455 |
awat = max(awat, 0.0) |
|
2931 |
3192455 |
wdtrain(il) = wdtrain(il) + grav*awat*ment(il, j, i) |
|
2932 |
3192455 |
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 |
✗✓ | 3027 |
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 |
✓✗ | 3027 |
IF (cvflag_ice) THEN !!jygprl |
2976 |
✗✓ | 3027 |
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 |
✓✓ | 1452914 |
DO il = 1, ncum !!jygprl |
2986 |
✓✓✓✓ |
1452914 |
IF (i<=inb(il) .AND. lwork(il)) THEN !!jygprl |
2987 |
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
||
2988 |
✗✓ | 386747 |
IF (keepbug_ice_frac) THEN |
2989 |
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 |
fraci(il, i) = 1. - (t(il,i)-243.15)/(263.15-243.15) |
||
2993 |
fraci(il, i) = min(max(fraci(il,i),0.0), 1.0) |
||
2994 |
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
||
2995 |
ELSE ! (keepbug_ice_frac) |
||
2996 |
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
||
2997 |
386747 |
frac(il, i) = frac_s(il, i) |
|
2998 |
386747 |
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 |
✓✓ | 1452914 |
DO il = 1, ncum |
3008 |
✓✓✓✓ |
1452914 |
IF (i<=inb(il) .AND. lwork(il)) THEN |
3009 |
|||
3010 |
386747 |
wt(il, i) = 45.0 |
|
3011 |
|||
3012 |
✓✓ | 386747 |
IF (i<inb(il)) THEN |
3013 |
rp(il, i) = rp(il, i+1) + & |
||
3014 |
363728 |
(cpd*(t(il,i+1)-t(il,i))+gz(il,i+1)-gz(il,i))/lv(il, i) |
|
3015 |
363728 |
rp(il, i) = 0.5*(rp(il,i)+rr(il,i)) |
|
3016 |
END IF |
||
3017 |
386747 |
rp(il, i) = max(rp(il,i), 0.0) |
|
3018 |
386747 |
rp(il, i) = amin1(rp(il,i), rs(il,i)) |
|
3019 |
386747 |
rp(il, inb(il)) = rr(il, inb(il)) |
|
3020 |
|||
3021 |
✓✓ | 386747 |
IF (i==1) THEN |
3022 |
23019 |
afac = p(il, 1)*(rs(il,1)-rp(il,1))/(1.0E4+2000.0*p(il,1)*rs(il,1)) |
|
3023 |
✓✗ | 23019 |
IF (cvflag_ice) THEN |
3024 |
23019 |
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 |
363728 |
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 |
363728 |
rp(il, i-1) = 0.5*(rp(il,i-1)+rr(il,i-1)) |
|
3029 |
363728 |
rp(il, i-1) = amin1(rp(il,i-1), rs(il,i-1)) |
|
3030 |
363728 |
rp(il, i-1) = max(rp(il,i-1), 0.0) |
|
3031 |
363728 |
afac1 = p(il, i)*(rs(il,i)-rp(il,i))/(1.0E4+2000.0*p(il,i)*rs(il,i)) |
|
3032 |
363728 |
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 |
363728 |
afac = 0.5*(afac1+afac2) |
|
3034 |
END IF |
||
3035 |
✓✓ | 386747 |
IF (i==inb(il)) afac = 0.0 |
3036 |
386747 |
afac = max(afac, 0.0) |
|
3037 |
386747 |
bfac = 1./(sigd(il)*wt(il,i)) |
|
3038 |
|||
3039 |
! |
||
3040 |
✗✓ | 386747 |
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 |
386747 |
pr1 = (plcl(il)-ph(il,i+1))/(ph(il,i)-ph(il,i+1)) |
|
3056 |
386747 |
pr1 = max(0., min(1.,pr1)) |
|
3057 |
386747 |
pr2 = (ph(il,i)-plcl(il))/(ph(il,i)-ph(il,i+1)) |
|
3058 |
386747 |
pr2 = max(0., min(1.,pr2)) |
|
3059 |
386747 |
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 |
✓✗ | 386747 |
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 |
386747 |
b6 = bfac*50.*sigd(il)*(ph(il,i)-ph(il,i+1))*sigt*afac1 |
|
3091 |
386747 |
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 |
✓✓ | 386747 |
IF (c6>b6*b6+1.E-20) THEN |
3096 |
381250 |
revap = 2.*c6/(b6+sqrt(b6*b6+4.*c6)) |
|
3097 |
ELSE |
||
3098 |
5497 |
revap = (-b6+sqrt(b6*b6+4.*c6))/2. |
|
3099 |
END IF |
||
3100 |
386747 |
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 |
386747 |
(sigd(il)*(ph(il,i)-ph(il,i+1))*100.) |
|
3119 |
! |
||
3120 |
✗✓ | 386747 |
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 |
386747 |
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 |
386747 |
thaw = (t(il,i)-273.15)/(tmax_fonte_cv-273.15) |
|
3135 |
386747 |
thaw = min(max(thaw,0.0), 1.0) |
|
3136 |
!jyg< |
||
3137 |
386747 |
water(il, i) = water(il, i+1) + (1-fraci(il,i))*d6 |
|
3138 |
386747 |
ice(il, i) = ice(il, i+1) + fraci(il, i)*d6 |
|
3139 |
386747 |
water(il, i) = min(prec(il,i), max(water(il,i), 0.)) |
|
3140 |
386747 |
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 |
386747 |
fondue(il, i) = ice(il, i)*thaw |
|
3148 |
386747 |
water(il, i) = water(il, i) + fondue(il, i) |
|
3149 |
386747 |
ice(il, i) = ice(il, i) - fondue(il, i) |
|
3150 |
|||
3151 |
✓✓ | 386747 |
IF (water(il,i)+ice(il,i)<1.E-30) THEN |
3152 |
4681 |
faci(il, i) = 0. |
|
3153 |
ELSE |
||
3154 |
382066 |
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 |
✓✓ | 1452914 |
DO il = 1, ncum |
3195 |
✓✓✓✓ ✓✓ |
1449887 |
IF (i<=inb(il) .AND. lwork(il) .AND. i/=1) THEN |
3196 |
|||
3197 |
363728 |
tevap(il) = max(0.0, evap(il,i)) |
|
3198 |
363728 |
delth = max(0.001, (th(il,i)-th(il,i-1))) |
|
3199 |
✓✗ | 363728 |
IF (cvflag_ice) THEN |
3200 |
✓✗ | 363728 |
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 |
363728 |
(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 |
✗✓ | 1452914 |
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 |
✓✓ | 1452914 |
DO il = 1, ncum |
3239 |
✓✓✓✓ ✓✓ |
1452914 |
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 |
363728 |
(th(il,i)-th(il,i-1))/(tv(il,i)*th(il,i)) |
|
3243 |
363728 |
amp2 = abs(mp(il,i+1)*mp(il,i+1)-mp(il,i)*mp(il,i)) |
|
3244 |
|||
3245 |
✓✓ | 363728 |
IF (amp2>(0.1*amfac)) THEN |
3246 |
97873 |
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 |
97873 |
(lvcp(il,i)*sigd(il)*th(il,i)) |
|
3249 |
97873 |
af = xf*tf + mp(il, i+1)*mp(il, i+1)*tinv |
|
3250 |
|||
3251 |
✓✗ | 97873 |
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 |
97873 |
(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 |
✓✓ | 97873 |
IF (bf<0.0) fac2 = -1.0 |
3263 |
97873 |
bf = abs(bf) |
|
3264 |
97873 |
ur = 0.25*bf*bf - af*af*af*tinv*tinv*tinv |
|
3265 |
✓✓ | 97873 |
IF (ur>=0.0) THEN |
3266 |
63062 |
sru = sqrt(ur) |
|
3267 |
fac = 1.0 |
||
3268 |
✓✓ | 63062 |
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 |
63062 |
fac*(abs(0.5*bf-sru))**tinv |
|
3271 |
ELSE |
||
3272 |
34811 |
d = atan(2.*sqrt(-ur)/(bf+1.0E-28)) |
|
3273 |
✗✓ | 34811 |
IF (fac2<0.0) d = 3.14159 - d |
3274 |
34811 |
mp(il, i) = mp(il, i+1)*tinv + 2.*sqrt(af*tinv)*cos(d*tinv) |
|
3275 |
END IF |
||
3276 |
97873 |
mp(il, i) = max(0.0, mp(il,i)) |
|
3277 |
✗✓ | 97873 |
IF (prt_level .GE. 20) THEN |
3278 |
PRINT *,'cv3_unsat, mp cubic ', i, mp(il,i) |
||
3279 |
ENDIF |
||
3280 |
|||
3281 |
✓✗ | 97873 |
IF (cvflag_ice) THEN |
3282 |
✓✗ | 97873 |
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 |
97873 |
(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 |
97873 |
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 |
✓✓ | 363728 |
IF (ph(il,i)>0.9*plcl(il)) THEN |
3336 |
152436 |
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 |
363728 |
ampmax = 2.0*(ph(il,i)-ph(il,i+1))*delti |
|
3343 |
363728 |
amp2 = 2.0*(ph(il,i-1)-ph(il,i))*delti |
|
3344 |
363728 |
ampmax = min(ampmax, amp2) |
|
3345 |
363728 |
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 |
✗✓ | 3027 |
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 |
✓✓ | 1452914 |
DO il = 1, ncum |
3361 |
✓✓✓✓ |
1452914 |
IF (i<inb(il) .AND. lwork(il)) THEN |
3362 |
363728 |
mplus(il) = mp(il, i) > mp(il, i+1) |
|
3363 |
END IF ! (i.lt.inb(il) .and. lwork(il)) |
||
3364 |
END DO |
||
3365 |
|||
3366 |
✓✓ | 1452914 |
DO il = 1, ncum |
3367 |
✓✓✓✓ |
1453919 |
IF (i<inb(il) .AND. lwork(il)) THEN |
3368 |
|||
3369 |
363728 |
rp(il, i) = rr(il, i) |
|
3370 |
|||
3371 |
✓✓ | 363728 |
IF (mplus(il)) THEN |
3372 |
|||
3373 |
✓✗ | 157029 |
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 |
157029 |
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 |
157029 |
rp(il, i) = rp(il, i)/mp(il, i) |
|
3381 |
157029 |
up(il, i) = up(il, i+1)*mp(il, i+1) + u(il, i)*(mp(il,i)-mp(il,i+1)) |
|
3382 |
157029 |
up(il, i) = up(il, i)/mp(il, i) |
|
3383 |
157029 |
vp(il, i) = vp(il, i+1)*mp(il, i+1) + v(il, i)*(mp(il,i)-mp(il,i+1)) |
|
3384 |
157029 |
vp(il, i) = vp(il, i)/mp(il, i) |
|
3385 |
|||
3386 |
ELSE ! if (mplus(il)) |
||
3387 |
|||
3388 |
✓✓ | 206699 |
IF (mp(il,i+1)>1.0E-16) THEN |
3389 |
✓✗ | 170418 |
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 |
170418 |
(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 |
170418 |
up(il, i) = up(il, i+1) |
|
3397 |
170418 |
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 |
363728 |
rp(il, i) = amin1(rp(il,i), rs(il,i)) |
|
3402 |
363728 |
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 |
144 |
400 END DO |
|
3429 |
! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
||
3430 |
|||
3431 |
! *** end of downdraft loop *** |
||
3432 |
|||
3433 |
! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
||
3434 |
|||
3435 |
|||
3436 |
144 |
RETURN |
|
3437 |
|||
3438 |
END SUBROUTINE cv3_unsat |
||
3439 |
|||
3440 |
19406870 |
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 |
144 |
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 |
144 |
ment, qent, hent, iflag_mix, uent, vent, & |
|
3447 |
nent, elij, traent, sig, & |
||
3448 |
tv, tvp, wghti, & |
||
3449 |
144 |
iflag, precip, Vprecip, Vprecipi, & ! jyg: Vprecipi |
|
3450 |
ft, fr, fu, fv, ftra, & ! jyg |
||
3451 |
144 |
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 |
288 |
REAL, DIMENSION (nloc) :: awat |
|
3527 |
288 |
REAL, DIMENSION (nloc, nd) :: lvcp, lfcp ! , mke ! unused . jyg |
|
3528 |
288 |
REAL, DIMENSION (nloc) :: am, work, ad, amp1 |
|
3529 |
!! real up1(nloc), dn1(nloc) |
||
3530 |
288 |
REAL, DIMENSION (nloc, nd, nd) :: up1, dn1 |
|
3531 |
!jyg< |
||
3532 |
288 |
REAL, DIMENSION (nloc, nd) :: up_to, up_from |
|
3533 |
288 |
REAL, DIMENSION (nloc, nd) :: dn_to, dn_from |
|
3534 |
!>jyg |
||
3535 |
288 |
REAL, DIMENSION (nloc) :: asum, bsum, csum, dsum |
|
3536 |
288 |
REAL, DIMENSION (nloc) :: esum, fsum, gsum, hsum |
|
3537 |
REAL, DIMENSION (nloc, nd) :: th_wake |
||
3538 |
288 |
REAL, DIMENSION (nloc) :: alpha_qpos, alpha_qpos1 |
|
3539 |
288 |
REAL, DIMENSION (nloc, nd) :: qcond, nqcond, wa ! cld |
|
3540 |
288 |
REAL, DIMENSION (nloc, nd) :: siga, sax, mac ! cld |
|
3541 |
288 |
REAL, DIMENSION (nloc) :: sument |
|
3542 |
288 |
REAL, DIMENSION (nloc, nd) :: sigment, qtment ! cld |
|
3543 |
REAL sumdq !jyg |
||
3544 |
! |
||
3545 |
! ------------------------------------------------------------- |
||
3546 |
|||
3547 |
! initialization: |
||
3548 |
|||
3549 |
144 |
delti = 1.0/delt |
|
3550 |
! print*,'cv3_yield initialisation delt', delt |
||
3551 |
|||
3552 |
✓✓ | 69110 |
DO il = 1, ncum |
3553 |
68966 |
precip(il) = 0.0 |
|
3554 |
69110 |
wd(il) = 0.0 ! gust |
|
3555 |
END DO |
||
3556 |
|||
3557 |
! Fluxes are on a staggered grid : loops extend up to nl+1 |
||
3558 |
✓✓ | 4176 |
DO i = 1, nlp |
3559 |
✓✓ | 1935224 |
DO il = 1, ncum |
3560 |
1931048 |
Vprecip(il, i) = 0.0 |
|
3561 |
1931048 |
Vprecipi(il, i) = 0.0 ! jyg |
|
3562 |
1931048 |
upwd(il, i) = 0.0 |
|
3563 |
1931048 |
dnwd(il, i) = 0.0 |
|
3564 |
1931048 |
dnwd0(il, i) = 0.0 |
|
3565 |
1935080 |
mip(il, i) = 0.0 |
|
3566 |
END DO |
||
3567 |
END DO |
||
3568 |
✓✓ | 4032 |
DO i = 1, nl |
3569 |
✓✓ | 1866114 |
DO il = 1, ncum |
3570 |
1862082 |
ft(il, i) = 0.0 |
|
3571 |
1862082 |
fr(il, i) = 0.0 |
|
3572 |
1862082 |
fu(il, i) = 0.0 |
|
3573 |
1862082 |
fv(il, i) = 0.0 |
|
3574 |
1862082 |
ftd(il, i) = 0.0 |
|
3575 |
1862082 |
fqd(il, i) = 0.0 |
|
3576 |
1862082 |
qcondc(il, i) = 0.0 ! cld |
|
3577 |
1862082 |
qcond(il, i) = 0.0 ! cld |
|
3578 |
1862082 |
qtc(il, i) = 0.0 ! cld |
|
3579 |
1862082 |
qtment(il, i) = 0.0 ! cld |
|
3580 |
1862082 |
sigment(il, i) = 0.0 ! cld |
|
3581 |
1862082 |
sigt(il, i) = 0.0 ! cld |
|
3582 |
1865970 |
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 |
✓✓ | 4032 |
DO i = 1, nl |
3595 |
✓✓ | 1866114 |
DO il = 1, ncum |
3596 |
1862082 |
lvcp(il, i) = lv(il, i)/cpn(il, i) |
|
3597 |
1865970 |
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 |
✓✓ | 69110 |
DO il = 1, ncum |
3606 |
✓✓✓✓ |
69110 |
IF (ep(il,inb(il))>=0.0001 .AND. iflag(il)<=1) THEN |
3607 |
✓✗ | 23019 |
IF (cvflag_ice) THEN |
3608 |
precip(il) = wt(il, 1)*sigd(il)*(water(il,1)+ice(il,1)) & |
||
3609 |
23019 |
*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 |
✓✓ | 4032 |
DO i = 1, nl |
3622 |
✓✓ | 1866114 |
DO il = 1, ncum |
3623 |
✓✓✓✓ ✓✓ |
1865970 |
IF (ep(il,inb(il))>=0.0001 .AND. i<=inb(il) .AND. iflag(il)<=1) THEN |
3624 |
✓✗ | 386747 |
IF (cvflag_ice) THEN |
3625 |
386747 |
Vprecip(il, i) = wt(il, i)*sigd(il)*(water(il,i)+ice(il,i))/grav |
|
3626 |
386747 |
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 |
✓✓ | 69110 |
DO il = 1, ncum |
3649 |
68966 |
work(il) = 1.0/(ph(il,1)-ph(il,2)) |
|
3650 |
69110 |
cbmf(il) = 0.0 |
|
3651 |
END DO |
||
3652 |
|||
3653 |
! - Adiabatic ascent mass flux "ma" and cloud base mass flux "cbmf" |
||
3654 |
!----------------------------------------------------------------- |
||
3655 |
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
||
3656 |
✗✓ | 144 |
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 |
✓✓ | 3888 |
DO k = 2, nl |
3683 |
✓✓ | 1797004 |
DO il = 1, ncum |
3684 |
✓✓ | 1796860 |
IF (k>=icb(il)) THEN |
3685 |
1556118 |
cbmf(il) = cbmf(il) + m(il, k) |
|
3686 |
END IF |
||
3687 |
END DO |
||
3688 |
END DO |
||
3689 |
|||
3690 |
✓✓ | 69110 |
DO il = 1, ncum |
3691 |
68966 |
ma(il, nlp) = 0. |
|
3692 |
69110 |
ma(il, 1) = 0. |
|
3693 |
END DO |
||
3694 |
✓✓ | 3888 |
DO k = nl, 2, -1 |
3695 |
✓✓ | 1797004 |
DO il = 1, ncum |
3696 |
1796860 |
ma(il, k) = ma(il, k+1) + m(il, k) |
|
3697 |
END DO |
||
3698 |
END DO |
||
3699 |
✓✓ | 3888 |
DO k = 2,nl |
3700 |
✓✓ | 1797004 |
DO il = 1, ncum |
3701 |
✓✓ | 1796860 |
IF (k <icb(il)) THEN |
3702 |
236998 |
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 |
✓✓ | 69110 |
DO il = 1, ncum |
3713 |
69110 |
am(il) = cbmf(il)*wghti(il, 1) |
|
3714 |
END DO |
||
3715 |
|||
3716 |
✓✓ | 69110 |
DO il = 1, ncum |
3717 |
✓✓ | 69110 |
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 |
✓✗ | 23019 |
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 |
23019 |
(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 |
23019 |
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 |
✓✗ | 23019 |
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 |
23019 |
(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 |
23019 |
ftd(il, 1) = ft(il, 1) ! fin precip |
|
3743 |
|||
3744 |
✗✓ | 23019 |
IF ((0.01*grav*work(il)*am(il))>=delti) iflag(il) = 1 !consist vect |
3745 |
!jyg< |
||
3746 |
✗✓ | 23019 |
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 |
23019 |
(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 |
✓✓ | 3888 |
DO j = 2, nl |
3759 |
✓✗ | 3888 |
IF (iflag_mix>0) THEN |
3760 |
✓✓ | 1796860 |
DO il = 1, ncum |
3761 |
! FH WARNING a modifier : |
||
3762 |
cpinv = 0. |
||
3763 |
! cpinv=1.0/cpn(il,1) |
||
3764 |
✓✓✓✓ |
1796860 |
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 |
363728 |
(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 |
✓✓ | 69110 |
DO il = 1, ncum |
3775 |
✓✓ | 69110 |
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 |
23019 |
sigd(il)*evap(il, 1) |
|
3779 |
!!! sigd(il)*0.5*(evap(il,1)+evap(il,2)) |
||
3780 |
|||
3781 |
23019 |
fqd(il, 1) = fr(il, 1) !precip |
|
3782 |
|||
3783 |
23019 |
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 |
23019 |
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 |
23019 |
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 |
✓✓ | 3888 |
DO j = 2, nl |
3810 |
✓✓ | 1797004 |
DO il = 1, ncum |
3811 |
✓✓✓✓ |
1796860 |
IF (j<=inb(il) .AND. iflag(il)<=1) THEN |
3812 |
363728 |
fr(il, 1) = fr(il, 1) + 0.01*grav*work(il)*ment(il, j, 1)*(qent(il,j,1)-rr(il,1)) |
|
3813 |
363728 |
fu(il, 1) = fu(il, 1) + 0.01*grav*work(il)*ment(il, j, 1)*(uent(il,j,1)-u(il,1)) |
|
3814 |
363728 |
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 |
✓✗ | 144 |
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 |
✓✓✓✓ |
5588064 |
upwd(:,:) = 0. |
3852 |
✓✓✓✓ |
5588064 |
up_to(:,:) = 0. |
3853 |
✓✓✓✓ |
5588064 |
up_from(:,:) = 0. |
3854 |
! |
||
3855 |
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
||
3856 |
✗✓ | 144 |
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 |
✓✓ | 3888 |
DO i = 2, nl |
3915 |
✓✓ | 1796860 |
DO il = 1, ncum |
3916 |
✓✓ | 1796860 |
IF (i<=inb(il)) THEN |
3917 |
823705 |
up_to(il,i) = m(il,i) |
|
3918 |
ENDIF |
||
3919 |
ENDDO |
||
3920 |
✓✓ | 54432 |
DO j = 1, i-1 |
3921 |
✓✓ | 24261354 |
DO il = 1, ncum |
3922 |
✓✓ | 24257610 |
IF (i<=inb(il)) THEN |
3923 |
6037065 |
up_to(il,i) = up_to(il,i) + ment(il,j,i) |
|
3924 |
ENDIF |
||
3925 |
ENDDO |
||
3926 |
ENDDO |
||
3927 |
ENDDO |
||
3928 |
! |
||
3929 |
✓✓ | 4032 |
DO i = 1, nl |
3930 |
✓✓ | 1866114 |
DO il = 1, ncum |
3931 |
✓✓ | 1865970 |
IF (i<=inb(il)) THEN |
3932 |
892671 |
up_from(il,i) = cbmf(il)*wghti(il,i) |
|
3933 |
ENDIF |
||
3934 |
ENDDO |
||
3935 |
ENDDO |
||
3936 |
! |
||
3937 |
✓✓ | 3744 |
DO j = 3, nl |
3938 |
✓✓ | 50544 |
DO i = 2, j-1 |
3939 |
✓✓ | 22464350 |
DO il = 1, ncum |
3940 |
✓✓ | 22460750 |
IF (j<=inb(il)) THEN |
3941 |
5213360 |
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 |
✓✓ | 4032 |
DO i = 2, nlp |
3952 |
✓✓ | 1866114 |
DO il = 1, ncum |
3953 |
✓✓ | 1865970 |
IF (i<=inb(il)+1) THEN |
3954 |
892671 |
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 |
✓✓✓✓ |
5588064 |
dnwd(:,:) = 0. |
3968 |
✓✓✓✓ |
5588064 |
dn_to(:,:) = 0. |
3969 |
✓✓✓✓ |
5588064 |
dn_from(:,:) = 0. |
3970 |
✓✓ | 4032 |
DO i = 1, nl |
3971 |
✓✓ | 54576 |
DO j = i+1, nl |
3972 |
✓✓ | 24261498 |
DO il = 1, ncum |
3973 |
✓✓ | 24257610 |
IF (j<=inb(il)) THEN |
3974 |
!! dn_to(il,i) = dn_to(il,i) + ment(il,j,i) !jyg,20220202 |
||
3975 |
6037065 |
dn_to(il,i) = dn_to(il,i) - ment(il,j,i) |
|
3976 |
ENDIF |
||
3977 |
ENDDO |
||
3978 |
ENDDO |
||
3979 |
ENDDO |
||
3980 |
! |
||
3981 |
✓✓ | 4032 |
DO j = 1, nl |
3982 |
✓✓ | 54576 |
DO i = j+1, nl |
3983 |
✓✓ | 24261498 |
DO il = 1, ncum |
3984 |
✓✓ | 24257610 |
IF (i<=inb(il)) THEN |
3985 |
!! dn_from(il,i) = dn_from(il,i) + ment(il,i,j) !jyg,20220202 |
||
3986 |
6037065 |
dn_from(il,i) = dn_from(il,i) - ment(il,i,j) |
|
3987 |
ENDIF |
||
3988 |
ENDDO |
||
3989 |
ENDDO |
||
3990 |
ENDDO |
||
3991 |
! |
||
3992 |
! The difference between dnwd(il,i) and dnwd(il,i+1) is due to downdrafts ending in layer |
||
3993 |
!(i) (theses drafts cross interface (i+1) but not interface(i)) and to downdrafts |
||
3994 |
!starting from layer (i) (theses drafts cross interface (i) but not interface(i+1)): |
||
3995 |
! |
||
3996 |
✓✓ | 3888 |
DO i = nl-1, 1, -1 |
3997 |
✓✓ | 1797004 |
DO il = 1, ncum |
3998 |
!! dnwd(il,i) = max(0., dnwd(il,i+1) - dn_to(il,i) + dn_from(il,i)) !jyg,20220202 |
||
3999 |
1796860 |
dnwd(il,i) = min(0., dnwd(il,i+1) - dn_to(il,i) + dn_from(il,i)) |
|
4000 |
ENDDO |
||
4001 |
ENDDO |
||
4002 |
! ================================================= |
||
4003 |
! |
||
4004 |
!----------------------------------------------------------- |
||
4005 |
ENDIF !(ok_optim_yield) !| |
||
4006 |
!----------------------------------------------------------- |
||
4007 |
!>jyg |
||
4008 |
|||
4009 |
! *** calculate tendencies of potential temperature and mixing ratio *** |
||
4010 |
! *** at levels above the lowest level *** |
||
4011 |
|||
4012 |
! *** first find the net saturated updraft and downdraft mass fluxes *** |
||
4013 |
! *** through each level *** |
||
4014 |
|||
4015 |
|||
4016 |
!jyg< |
||
4017 |
!! DO i = 2, nl + 1 ! newvecto: mettre nl au lieu nl+1? |
||
4018 |
✓✓ | 3888 |
DO i = 2, nl |
4019 |
!>jyg |
||
4020 |
|||
4021 |
num1 = 0 |
||
4022 |
✓✓ | 1796860 |
DO il = 1, ncum |
4023 |
✓✓✓✓ |
1796860 |
IF (i<=inb(il) .AND. iflag(il)<=1) num1 = num1 + 1 |
4024 |
END DO |
||
4025 |
✓✓ | 3744 |
IF (num1<=0) GO TO 500 |
4026 |
|||
4027 |
! |
||
4028 |
!jyg< |
||
4029 |
!----------------------------------------------------------- |
||
4030 |
✓✗ | 2883 |
IF (ok_optim_yield) THEN !| |
4031 |
!----------------------------------------------------------- |
||
4032 |
✓✓ | 1383804 |
DO il = 1, ncum |
4033 |
1380921 |
amp1(il) = upwd(il,i+1) |
|
4034 |
1383804 |
ad(il) = dnwd(il,i) |
|
4035 |
ENDDO |
||
4036 |
!----------------------------------------------------------- |
||
4037 |
ELSE !(ok_optim_yield) !| |
||
4038 |
!----------------------------------------------------------- |
||
4039 |
!>jyg |
||
4040 |
DO il = 1,ncum |
||
4041 |
amp1(il) = 0. |
||
4042 |
ad(il) = 0. |
||
4043 |
ENDDO |
||
4044 |
|||
4045 |
DO k = 1, nl + 1 |
||
4046 |
DO il = 1, ncum |
||
4047 |
IF (i>=icb(il)) THEN |
||
4048 |
IF (k>=i+1 .AND. k<=(inb(il)+1)) THEN |
||
4049 |
amp1(il) = amp1(il) + m(il, k) |
||
4050 |
END IF |
||
4051 |
ELSE |
||
4052 |
! AMP1 is the part of cbmf taken from layers I and lower |
||
4053 |
IF (k<=i) THEN |
||
4054 |
amp1(il) = amp1(il) + cbmf(il)*wghti(il, k) |
||
4055 |
END IF |
||
4056 |
END IF |
||
4057 |
END DO |
||
4058 |
END DO |
||
4059 |
|||
4060 |
DO j = i + 1, nl + 1 |
||
4061 |
DO k = 1, i |
||
4062 |
!yor! reverted j and k loops |
||
4063 |
DO il = 1, ncum |
||
4064 |
!yor! IF (i<=inb(il) .AND. j<=(inb(il)+1)) THEN ! the second condition implies the first ! |
||
4065 |
IF (j<=(inb(il)+1)) THEN |
||
4066 |
amp1(il) = amp1(il) + ment(il, k, j) |
||
4067 |
END IF |
||
4068 |
END DO |
||
4069 |
END DO |
||
4070 |
END DO |
||
4071 |
|||
4072 |
DO k = 1, i - 1 |
||
4073 |
!jyg< |
||
4074 |
!! DO j = i, nl + 1 ! newvecto: nl au lieu nl+1? |
||
4075 |
DO j = i, nl |
||
4076 |
!>jyg |
||
4077 |
DO il = 1, ncum |
||
4078 |
!yor! IF (i<=inb(il) .AND. j<=inb(il)) THEN ! the second condition implies the 1st ! |
||
4079 |
IF (j<=inb(il)) THEN |
||
4080 |
ad(il) = ad(il) + ment(il, j, k) |
||
4081 |
END IF |
||
4082 |
END DO |
||
4083 |
END DO |
||
4084 |
END DO |
||
4085 |
! |
||
4086 |
!----------------------------------------------------------- |
||
4087 |
ENDIF !(ok_optim_yield) !| |
||
4088 |
!----------------------------------------------------------- |
||
4089 |
! |
||
4090 |
!! print *,'yield, i, amp1, ad', i, amp1(1), ad(1) |
||
4091 |
|||
4092 |
✓✓ | 1383804 |
DO il = 1, ncum |
4093 |
✓✓✓✓ |
1383804 |
IF (i<=inb(il) .AND. iflag(il)<=1) THEN |
4094 |
363728 |
dpinv = 1.0/(ph(il,i)-ph(il,i+1)) |
|
4095 |
363728 |
cpinv = 1.0/cpn(il, i) |
|
4096 |
|||
4097 |
! convect3 if((0.1*dpinv*amp1).ge.delti)iflag(il)=4 |
||
4098 |
✓✓ | 363728 |
IF ((0.01*grav*dpinv*amp1(il))>=delti) iflag(il) = 1 ! vecto |
4099 |
|||
4100 |
! precip |
||
4101 |
! cc ft(il,i)= -0.5*sigd(il)*lvcp(il,i)*(evap(il,i)+evap(il,i+1)) |
||
4102 |
✓✗ | 363728 |
IF (cvflag_ice) THEN |
4103 |
ft(il, i) = -sigd(il)*lvcp(il, i)*evap(il, i) - & |
||
4104 |
sigd(il)*lfcp(il, i)*evap(il, i)*faci(il, i) - & |
||
4105 |
363728 |
sigd(il)*lfcp(il, i)*fondue(il, i)*wt(il, i)/(100.*(p(il,i-1)-p(il,i))) |
|
4106 |
ELSE |
||
4107 |
ft(il, i) = -sigd(il)*lvcp(il, i)*evap(il, i) |
||
4108 |
END IF |
||
4109 |
|||
4110 |
363728 |
rat = cpn(il, i-1)*cpinv |
|
4111 |
|||
4112 |
ft(il, i) = ft(il, i) - 0.009*grav*sigd(il) * & |
||
4113 |
363728 |
(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 |
|
4114 |
✓✗ | 363728 |
IF (cvflag_ice) THEN |
4115 |
ft(il, i) = ft(il, i) + 0.01*sigd(il)*wt(il, i)*(cl-cpd)*water(il, i+1) * & |
||
4116 |
(t_wake(il,i+1)-t_wake(il,i))*dpinv*cpinv + & |
||
4117 |
0.01*sigd(il)*wt(il, i)*(ci-cpd)*ice(il, i+1) * & |
||
4118 |
363728 |
(t_wake(il,i+1)-t_wake(il,i))*dpinv*cpinv |
|
4119 |
ELSE |
||
4120 |
ft(il, i) = ft(il, i) + 0.01*sigd(il)*wt(il, i)*(cl-cpd)*water(il, i+1) * & |
||
4121 |
(t_wake(il,i+1)-t_wake(il,i))*dpinv* & |
||
4122 |
cpinv |
||
4123 |
END IF |
||
4124 |
|||
4125 |
363728 |
ftd(il, i) = ft(il, i) |
|
4126 |
! fin precip |
||
4127 |
|||
4128 |
! sature |
||
4129 |
!jyg< |
||
4130 |
✗✓ | 363728 |
IF (fl_cor_ebil >= 2) THEN |
4131 |
ft(il, i) = ft(il, i) + 0.01*grav*dpinv * & |
||
4132 |
( amp1(il)*( (t(il,i+1)-t(il,i))*cpn(il,i+1) + gz(il,i+1)-gz(il,i))*cpinv - & |
||
4133 |
ad(il)*( (t(il,i)-t(il,i-1))*cpn(il,i-1) + gz(il,i)-gz(il,i-1))*cpinv) |
||
4134 |
ELSE |
||
4135 |
ft(il, i) = ft(il, i) + 0.01*grav*dpinv * & |
||
4136 |
(amp1(il)*(t(il,i+1)-t(il,i) + (gz(il,i+1)-gz(il,i))*cpinv) - & |
||
4137 |
363728 |
ad(il)*(t(il,i)-t(il,i-1)+(gz(il,i)-gz(il,i-1))*cpinv)) |
|
4138 |
ENDIF |
||
4139 |
!>jyg |
||
4140 |
|||
4141 |
|||
4142 |
✗✓ | 363728 |
IF (iflag_mix==0) THEN |
4143 |
ft(il, i) = ft(il, i) + 0.01*grav*dpinv*ment(il, i, i)*(hp(il,i)-h(il,i) + & |
||
4144 |
t(il,i)*(cpv-cpd)*(rr(il,i)-qent(il,i,i)))*cpinv |
||
4145 |
END IF |
||
4146 |
! |
||
4147 |
! sb: on ne fait pas encore la correction permettant de mieux |
||
4148 |
! conserver l'eau: |
||
4149 |
!JYG: correction permettant de mieux conserver l'eau: |
||
4150 |
! cc fr(il,i)=0.5*sigd(il)*(evap(il,i)+evap(il,i+1)) |
||
4151 |
fr(il, i) = sigd(il)*evap(il, i) + 0.01*grav*(mp(il,i+1)*(rp(il,i+1)-rr_wake(il,i)) - & |
||
4152 |
363728 |
mp(il,i)*(rp(il,i)-rr_wake(il,i-1)))*dpinv |
|
4153 |
363728 |
fqd(il, i) = fr(il, i) ! precip |
|
4154 |
|||
4155 |
fu(il, i) = 0.01*grav*(mp(il,i+1)*(up(il,i+1)-u(il,i)) - & |
||
4156 |
363728 |
mp(il,i)*(up(il,i)-u(il,i-1)))*dpinv |
|
4157 |
fv(il, i) = 0.01*grav*(mp(il,i+1)*(vp(il,i+1)-v(il,i)) - & |
||
4158 |
363728 |
mp(il,i)*(vp(il,i)-v(il,i-1)))*dpinv |
|
4159 |
|||
4160 |
|||
4161 |
fr(il, i) = fr(il, i) + 0.01*grav*dpinv*(amp1(il)*(rr(il,i+1)-rr(il,i)) - & |
||
4162 |
363728 |
ad(il)*(rr(il,i)-rr(il,i-1))) |
|
4163 |
fu(il, i) = fu(il, i) + 0.01*grav*dpinv*(amp1(il)*(u(il,i+1)-u(il,i)) - & |
||
4164 |
363728 |
ad(il)*(u(il,i)-u(il,i-1))) |
|
4165 |
fv(il, i) = fv(il, i) + 0.01*grav*dpinv*(amp1(il)*(v(il,i+1)-v(il,i)) - & |
||
4166 |
363728 |
ad(il)*(v(il,i)-v(il,i-1))) |
|
4167 |
|||
4168 |
END IF ! i |
||
4169 |
END DO |
||
4170 |
|||
4171 |
!AC! do k=1,ntra |
||
4172 |
!AC! do il=1,ncum |
||
4173 |
!AC! if (i.le.inb(il) .and. iflag(il) .le. 1) then |
||
4174 |
!AC! dpinv=1.0/(ph(il,i)-ph(il,i+1)) |
||
4175 |
!AC! cpinv=1.0/cpn(il,i) |
||
4176 |
!AC! if (cvflag_grav) then |
||
4177 |
!AC! ftra(il,i,k)=ftra(il,i,k)+0.01*grav*dpinv |
||
4178 |
!AC! : *(amp1(il)*(tra(il,i+1,k)-tra(il,i,k)) |
||
4179 |
!AC! : -ad(il)*(tra(il,i,k)-tra(il,i-1,k))) |
||
4180 |
!AC! else |
||
4181 |
!AC! ftra(il,i,k)=ftra(il,i,k)+0.1*dpinv |
||
4182 |
!AC! : *(amp1(il)*(tra(il,i+1,k)-tra(il,i,k)) |
||
4183 |
!AC! : -ad(il)*(tra(il,i,k)-tra(il,i-1,k))) |
||
4184 |
!AC! endif |
||
4185 |
!AC! endif |
||
4186 |
!AC! enddo |
||
4187 |
!AC! enddo |
||
4188 |
|||
4189 |
✓✓ | 33186 |
DO k = 1, i - 1 |
4190 |
|||
4191 |
✓✓ | 14546784 |
DO il = 1, ncum |
4192 |
14516481 |
awat(il) = elij(il, k, i) - (1.-ep(il,i))*clw(il, i) |
|
4193 |
14546784 |
awat(il) = max(awat(il), 0.0) |
|
4194 |
END DO |
||
4195 |
|||
4196 |
✓✗ | 30303 |
IF (iflag_mix/=0) THEN |
4197 |
✓✓ | 14546784 |
DO il = 1, ncum |
4198 |
✓✓✓✓ |
14546784 |
IF (i<=inb(il) .AND. iflag(il)<=1) THEN |
4199 |
3192455 |
dpinv = 1.0/(ph(il,i)-ph(il,i+1)) |
|
4200 |
3192455 |
cpinv = 1.0/cpn(il, i) |
|
4201 |
ft(il, i) = ft(il, i) + 0.01*grav*dpinv*ment(il, k, i) * & |
||
4202 |
3192455 |
(hent(il,k,i)-h(il,i)+t(il,i)*(cpv-cpd)*(rr(il,i)+awat(il)-qent(il,k,i)))*cpinv |
|
4203 |
! |
||
4204 |
! |
||
4205 |
END IF ! i |
||
4206 |
END DO |
||
4207 |
END IF |
||
4208 |
|||
4209 |
✓✓ | 14549667 |
DO il = 1, ncum |
4210 |
✓✓✓✓ |
14546784 |
IF (i<=inb(il) .AND. iflag(il)<=1) THEN |
4211 |
3192455 |
dpinv = 1.0/(ph(il,i)-ph(il,i+1)) |
|
4212 |
cpinv = 1.0/cpn(il, i) |
||
4213 |
fr(il, i) = fr(il, i) + 0.01*grav*dpinv*ment(il, k, i) * & |
||
4214 |
3192455 |
(qent(il,k,i)-awat(il)-rr(il,i)) |
|
4215 |
3192455 |
fu(il, i) = fu(il, i) + 0.01*grav*dpinv*ment(il, k, i)*(uent(il,k,i)-u(il,i)) |
|
4216 |
3192455 |
fv(il, i) = fv(il, i) + 0.01*grav*dpinv*ment(il, k, i)*(vent(il,k,i)-v(il,i)) |
|
4217 |
|||
4218 |
! (saturated updrafts resulting from mixing) ! cld |
||
4219 |
3192455 |
qcond(il, i) = qcond(il, i) + (elij(il,k,i)-awat(il)) ! cld |
|
4220 |
3192455 |
qtment(il, i) = qtment(il, i) + qent(il,k,i) ! cld |
|
4221 |
3192455 |
nqcond(il, i) = nqcond(il, i) + 1. ! cld |
|
4222 |
END IF ! i |
||
4223 |
END DO |
||
4224 |
END DO |
||
4225 |
|||
4226 |
!AC! do j=1,ntra |
||
4227 |
!AC! do k=1,i-1 |
||
4228 |
!AC! do il=1,ncum |
||
4229 |
!AC! if (i.le.inb(il) .and. iflag(il) .le. 1) then |
||
4230 |
!AC! dpinv=1.0/(ph(il,i)-ph(il,i+1)) |
||
4231 |
!AC! cpinv=1.0/cpn(il,i) |
||
4232 |
!AC! if (cvflag_grav) then |
||
4233 |
!AC! ftra(il,i,j)=ftra(il,i,j)+0.01*grav*dpinv*ment(il,k,i) |
||
4234 |
!AC! : *(traent(il,k,i,j)-tra(il,i,j)) |
||
4235 |
!AC! else |
||
4236 |
!AC! ftra(il,i,j)=ftra(il,i,j)+0.1*dpinv*ment(il,k,i) |
||
4237 |
!AC! : *(traent(il,k,i,j)-tra(il,i,j)) |
||
4238 |
!AC! endif |
||
4239 |
!AC! endif |
||
4240 |
!AC! enddo |
||
4241 |
!AC! enddo |
||
4242 |
!AC! enddo |
||
4243 |
|||
4244 |
!jyg< |
||
4245 |
!! DO k = i, nl + 1 |
||
4246 |
✓✓ | 50421 |
DO k = i, nl |
4247 |
!>jyg |
||
4248 |
|||
4249 |
✓✗ | 47538 |
IF (iflag_mix/=0) THEN |
4250 |
✓✓ | 22815924 |
DO il = 1, ncum |
4251 |
✓✓✓✓ ✓✓ |
22815924 |
IF (i<=inb(il) .AND. k<=inb(il) .AND. iflag(il)<=1) THEN |
4252 |
3192455 |
dpinv = 1.0/(ph(il,i)-ph(il,i+1)) |
|
4253 |
3192455 |
cpinv = 1.0/cpn(il, i) |
|
4254 |
ft(il, i) = ft(il, i) + 0.01*grav*dpinv*ment(il, k, i) * & |
||
4255 |
3192455 |
(hent(il,k,i)-h(il,i)+t(il,i)*(cpv-cpd)*(rr(il,i)-qent(il,k,i)))*cpinv |
|
4256 |
|||
4257 |
|||
4258 |
END IF ! i |
||
4259 |
END DO |
||
4260 |
END IF |
||
4261 |
|||
4262 |
✓✓ | 22818807 |
DO il = 1, ncum |
4263 |
✓✓✓✓ ✓✓ |
22815924 |
IF (i<=inb(il) .AND. k<=inb(il) .AND. iflag(il)<=1) THEN |
4264 |
3192455 |
dpinv = 1.0/(ph(il,i)-ph(il,i+1)) |
|
4265 |
cpinv = 1.0/cpn(il, i) |
||
4266 |
|||
4267 |
3192455 |
fr(il, i) = fr(il, i) + 0.01*grav*dpinv*ment(il, k, i)*(qent(il,k,i)-rr(il,i)) |
|
4268 |
3192455 |
fu(il, i) = fu(il, i) + 0.01*grav*dpinv*ment(il, k, i)*(uent(il,k,i)-u(il,i)) |
|
4269 |
3192455 |
fv(il, i) = fv(il, i) + 0.01*grav*dpinv*ment(il, k, i)*(vent(il,k,i)-v(il,i)) |
|
4270 |
END IF ! i and k |
||
4271 |
END DO |
||
4272 |
END DO |
||
4273 |
|||
4274 |
!AC! do j=1,ntra |
||
4275 |
!AC! do k=i,nl+1 |
||
4276 |
!AC! do il=1,ncum |
||
4277 |
!AC! if (i.le.inb(il) .and. k.le.inb(il) |
||
4278 |
!AC! $ .and. iflag(il) .le. 1) then |
||
4279 |
!AC! dpinv=1.0/(ph(il,i)-ph(il,i+1)) |
||
4280 |
!AC! cpinv=1.0/cpn(il,i) |
||
4281 |
!AC! if (cvflag_grav) then |
||
4282 |
!AC! ftra(il,i,j)=ftra(il,i,j)+0.01*grav*dpinv*ment(il,k,i) |
||
4283 |
!AC! : *(traent(il,k,i,j)-tra(il,i,j)) |
||
4284 |
!AC! else |
||
4285 |
!AC! ftra(il,i,j)=ftra(il,i,j)+0.1*dpinv*ment(il,k,i) |
||
4286 |
!AC! : *(traent(il,k,i,j)-tra(il,i,j)) |
||
4287 |
!AC! endif |
||
4288 |
!AC! endif ! i and k |
||
4289 |
!AC! enddo |
||
4290 |
!AC! enddo |
||
4291 |
!AC! enddo |
||
4292 |
|||
4293 |
! sb: interface with the cloud parameterization: ! cld |
||
4294 |
|||
4295 |
✓✓ | 47538 |
DO k = i + 1, nl |
4296 |
✓✓ | 21435003 |
DO il = 1, ncum |
4297 |
✓✓✓✗ ✓✓ |
21432120 |
IF (k<=inb(il) .AND. i<=inb(il) .AND. iflag(il)<=1) THEN ! cld |
4298 |
! (saturated downdrafts resulting from mixing) ! cld |
||
4299 |
2828727 |
qcond(il, i) = qcond(il, i) + elij(il, k, i) ! cld |
|
4300 |
2828727 |
qtment(il, i) = qent(il,k,i) + qtment(il,i) ! cld |
|
4301 |
2828727 |
nqcond(il, i) = nqcond(il, i) + 1. ! cld |
|
4302 |
END IF ! cld |
||
4303 |
END DO ! cld |
||
4304 |
END DO ! cld |
||
4305 |
|||
4306 |
!ym BIG Warning : it seems that the k loop is missing !!! |
||
4307 |
!ym Strong advice to check this |
||
4308 |
!ym add a k loop temporary |
||
4309 |
|||
4310 |
! (particular case: no detraining level is found) ! cld |
||
4311 |
! Verif merge Dynamico<<<<<<< .working |
||
4312 |
✓✓ | 1383804 |
DO il = 1, ncum ! cld |
4313 |
✓✓✓✓ ✓✓ |
1383804 |
IF (i<=inb(il) .AND. nent(il,i)==0 .AND. iflag(il)<=1) THEN ! cld |
4314 |
82931 |
qcond(il, i) = qcond(il, i) + (1.-ep(il,i))*clw(il, i) ! cld |
|
4315 |
!jyg< Bug correction 20180620 |
||
4316 |
! PROBLEM: Should not qent(il,i,i) be taken into account even if nent(il,i)/=0? |
||
4317 |
!! qtment(il, i) = qent(il,k,i) + qtment(il,i) ! cld |
||
4318 |
82931 |
qtment(il, i) = qent(il,i,i) + qtment(il,i) ! cld |
|
4319 |
!>jyg |
||
4320 |
82931 |
nqcond(il, i) = nqcond(il, i) + 1. ! cld |
|
4321 |
END IF ! cld |
||
4322 |
END DO ! cld |
||
4323 |
! Verif merge Dynamico ======= |
||
4324 |
! Verif merge Dynamico DO k = i + 1, nl |
||
4325 |
! Verif merge Dynamico DO il = 1, ncum !ym k loop added ! cld |
||
4326 |
! Verif merge Dynamico IF (i<=inb(il) .AND. nent(il,i)==0 .AND. iflag(il)<=1) THEN ! cld |
||
4327 |
! Verif merge Dynamico qcond(il, i) = qcond(il, i) + (1.-ep(il,i))*clw(il, i) ! cld |
||
4328 |
! Verif merge Dynamico qtment(il, i) = qent(il,k,i) + qtment(il,i) ! cld |
||
4329 |
! Verif merge Dynamico nqcond(il, i) = nqcond(il, i) + 1. ! cld |
||
4330 |
! Verif merge Dynamico END IF ! cld |
||
4331 |
! Verif merge Dynamico END DO |
||
4332 |
! Verif merge Dynamico ENDDO ! cld |
||
4333 |
! Verif merge Dynamico >>>>>>> .merge-right.r3413 |
||
4334 |
|||
4335 |
✓✓ | 1383804 |
DO il = 1, ncum ! cld |
4336 |
✓✓✓✓ ✓✗ |
1384665 |
IF (i<=inb(il) .AND. nqcond(il,i)/=0 .AND. iflag(il)<=1) THEN ! cld |
4337 |
363728 |
qcond(il, i) = qcond(il, i)/nqcond(il, i) ! cld |
|
4338 |
363728 |
qtment(il, i) = qtment(il,i)/nqcond(il, i) ! cld |
|
4339 |
END IF ! cld |
||
4340 |
END DO |
||
4341 |
|||
4342 |
!AC! do j=1,ntra |
||
4343 |
!AC! do il=1,ncum |
||
4344 |
!AC! if (i.le.inb(il) .and. iflag(il) .le. 1) then |
||
4345 |
!AC! dpinv=1.0/(ph(il,i)-ph(il,i+1)) |
||
4346 |
!AC! cpinv=1.0/cpn(il,i) |
||
4347 |
!AC! |
||
4348 |
!AC! if (cvflag_grav) then |
||
4349 |
!AC! ftra(il,i,j)=ftra(il,i,j)+0.01*grav*dpinv |
||
4350 |
!AC! : *(mp(il,i+1)*(trap(il,i+1,j)-tra(il,i,j)) |
||
4351 |
!AC! : -mp(il,i)*(trap(il,i,j)-trap(il,i-1,j))) |
||
4352 |
!AC! else |
||
4353 |
!AC! ftra(il,i,j)=ftra(il,i,j)+0.1*dpinv |
||
4354 |
!AC! : *(mp(il,i+1)*(trap(il,i+1,j)-tra(il,i,j)) |
||
4355 |
!AC! : -mp(il,i)*(trap(il,i,j)-trap(il,i-1,j))) |
||
4356 |
!AC! endif |
||
4357 |
!AC! endif ! i |
||
4358 |
!AC! enddo |
||
4359 |
!AC! enddo |
||
4360 |
|||
4361 |
|||
4362 |
144 |
500 END DO |
|
4363 |
|||
4364 |
!JYG< |
||
4365 |
!Conservation de l'eau |
||
4366 |
! sumdq = 0. |
||
4367 |
! DO k = 1, nl |
||
4368 |
! sumdq = sumdq + fr(1, k)*100.*(ph(1,k)-ph(1,k+1))/grav |
||
4369 |
! END DO |
||
4370 |
! PRINT *, 'cv3_yield, apres 500, sum(dq), precip, somme ', sumdq, Vprecip(1, 1), sumdq + vprecip(1, 1) |
||
4371 |
!JYG> |
||
4372 |
! *** move the detrainment at level inb down to level inb-1 *** |
||
4373 |
! *** in such a way as to preserve the vertically *** |
||
4374 |
! *** integrated enthalpy and water tendencies *** |
||
4375 |
|||
4376 |
! Correction bug le 18-03-09 |
||
4377 |
✓✓ | 69110 |
DO il = 1, ncum |
4378 |
✓✓ | 69110 |
IF (iflag(il)<=1) THEN |
4379 |
ax = 0.01*grav*ment(il, inb(il), inb(il))* & |
||
4380 |
(hp(il,inb(il))-h(il,inb(il))+t(il,inb(il))*(cpv-cpd)*(rr(il,inb(il))-qent(il,inb(il),inb(il))))/ & |
||
4381 |
23019 |
(cpn(il,inb(il))*(ph(il,inb(il))-ph(il,inb(il)+1))) |
|
4382 |
23019 |
ft(il, inb(il)) = ft(il, inb(il)) - ax |
|
4383 |
ft(il, inb(il)-1) = ft(il, inb(il)-1) + ax*cpn(il, inb(il))*(ph(il,inb(il))-ph(il,inb(il)+1))/ & |
||
4384 |
23019 |
(cpn(il,inb(il)-1)*(ph(il,inb(il)-1)-ph(il,inb(il)))) |
|
4385 |
|||
4386 |
bx = 0.01*grav*ment(il, inb(il), inb(il))*(qent(il,inb(il),inb(il))-rr(il,inb(il)))/ & |
||
4387 |
23019 |
(ph(il,inb(il))-ph(il,inb(il)+1)) |
|
4388 |
23019 |
fr(il, inb(il)) = fr(il, inb(il)) - bx |
|
4389 |
fr(il, inb(il)-1) = fr(il, inb(il)-1) + bx*(ph(il,inb(il))-ph(il,inb(il)+1))/ & |
||
4390 |
23019 |
(ph(il,inb(il)-1)-ph(il,inb(il))) |
|
4391 |
|||
4392 |
cx = 0.01*grav*ment(il, inb(il), inb(il))*(uent(il,inb(il),inb(il))-u(il,inb(il)))/ & |
||
4393 |
23019 |
(ph(il,inb(il))-ph(il,inb(il)+1)) |
|
4394 |
23019 |
fu(il, inb(il)) = fu(il, inb(il)) - cx |
|
4395 |
fu(il, inb(il)-1) = fu(il, inb(il)-1) + cx*(ph(il,inb(il))-ph(il,inb(il)+1))/ & |
||
4396 |
23019 |
(ph(il,inb(il)-1)-ph(il,inb(il))) |
|
4397 |
|||
4398 |
dx = 0.01*grav*ment(il, inb(il), inb(il))*(vent(il,inb(il),inb(il))-v(il,inb(il)))/ & |
||
4399 |
23019 |
(ph(il,inb(il))-ph(il,inb(il)+1)) |
|
4400 |
23019 |
fv(il, inb(il)) = fv(il, inb(il)) - dx |
|
4401 |
fv(il, inb(il)-1) = fv(il, inb(il)-1) + dx*(ph(il,inb(il))-ph(il,inb(il)+1))/ & |
||
4402 |
23019 |
(ph(il,inb(il)-1)-ph(il,inb(il))) |
|
4403 |
END IF !iflag |
||
4404 |
END DO |
||
4405 |
|||
4406 |
!JYG< |
||
4407 |
!Conservation de l'eau |
||
4408 |
! sumdq = 0. |
||
4409 |
! DO k = 1, nl |
||
4410 |
! sumdq = sumdq + fr(1, k)*100.*(ph(1,k)-ph(1,k+1))/grav |
||
4411 |
! END DO |
||
4412 |
! PRINT *, 'cv3_yield, apres 503, sum(dq), precip, somme ', sumdq, Vprecip(1, 1), sumdq + vprecip(1, 1) |
||
4413 |
!JYG> |
||
4414 |
|||
4415 |
!AC! do j=1,ntra |
||
4416 |
!AC! do il=1,ncum |
||
4417 |
!AC! IF (iflag(il) .le. 1) THEN |
||
4418 |
!AC! IF (cvflag_grav) then |
||
4419 |
!AC! ex=0.01*grav*ment(il,inb(il),inb(il)) |
||
4420 |
!AC! : *(traent(il,inb(il),inb(il),j)-tra(il,inb(il),j)) |
||
4421 |
!AC! : /(ph(i l,inb(il))-ph(il,inb(il)+1)) |
||
4422 |
!AC! ftra(il,inb(il),j)=ftra(il,inb(il),j)-ex |
||
4423 |
!AC! ftra(il,inb(il)-1,j)=ftra(il,inb(il)-1,j) |
||
4424 |
!AC! : +ex*(ph(il,inb(il))-ph(il,inb(il)+1)) |
||
4425 |
!AC! : /(ph(il,inb(il)-1)-ph(il,inb(il))) |
||
4426 |
!AC! else |
||
4427 |
!AC! ex=0.1*ment(il,inb(il),inb(il)) |
||
4428 |
!AC! : *(traent(il,inb(il),inb(il),j)-tra(il,inb(il),j)) |
||
4429 |
!AC! : /(ph(i l,inb(il))-ph(il,inb(il)+1)) |
||
4430 |
!AC! ftra(il,inb(il),j)=ftra(il,inb(il),j)-ex |
||
4431 |
!AC! ftra(il,inb(il)-1,j)=ftra(il,inb(il)-1,j) |
||
4432 |
!AC! : +ex*(ph(il,inb(il))-ph(il,inb(il)+1)) |
||
4433 |
!AC! : /(ph(il,inb(il)-1)-ph(il,inb(il))) |
||
4434 |
!AC! ENDIF !cvflag grav |
||
4435 |
!AC! ENDIF !iflag |
||
4436 |
!AC! enddo |
||
4437 |
!AC! enddo |
||
4438 |
|||
4439 |
|||
4440 |
! *** homogenize tendencies below cloud base *** |
||
4441 |
|||
4442 |
|||
4443 |
✓✓ | 69110 |
DO il = 1, ncum |
4444 |
68966 |
asum(il) = 0.0 |
|
4445 |
68966 |
bsum(il) = 0.0 |
|
4446 |
68966 |
csum(il) = 0.0 |
|
4447 |
68966 |
dsum(il) = 0.0 |
|
4448 |
68966 |
esum(il) = 0.0 |
|
4449 |
68966 |
fsum(il) = 0.0 |
|
4450 |
68966 |
gsum(il) = 0.0 |
|
4451 |
69110 |
hsum(il) = 0.0 |
|
4452 |
END DO |
||
4453 |
|||
4454 |
!do i=1,nl |
||
4455 |
!do il=1,ncum |
||
4456 |
!th_wake(il,i)=t_wake(il,i)*(1000.0/p(il,i))**rdcp |
||
4457 |
!enddo |
||
4458 |
!enddo |
||
4459 |
|||
4460 |
✓✓ | 4032 |
DO i = 1, nl |
4461 |
✓✓ | 1866114 |
DO il = 1, ncum |
4462 |
✓✓✓✓ |
1865970 |
IF (i<=(icb(il)-1) .AND. iflag(il)<=1) THEN |
4463 |
!jyg Saturated part : use T profile |
||
4464 |
101189 |
asum(il) = asum(il) + (ft(il,i)-ftd(il,i))*(ph(il,i)-ph(il,i+1)) |
|
4465 |
!jyg<20140311 |
||
4466 |
!Correction pour conserver l eau |
||
4467 |
✓✗ | 101189 |
IF (ok_conserv_q) THEN |
4468 |
101189 |
bsum(il) = bsum(il) + (fr(il,i)-fqd(il,i))*(ph(il,i)-ph(il,i+1)) |
|
4469 |
101189 |
csum(il) = csum(il) + (ph(il,i)-ph(il,i+1)) |
|
4470 |
|||
4471 |
ELSE |
||
4472 |
bsum(il)=bsum(il)+(fr(il,i)-fqd(il,i))*(lv(il,i)+(cl-cpd)*(t(il,i)-t(il,1)))* & |
||
4473 |
(ph(il,i)-ph(il,i+1)) |
||
4474 |
csum(il)=csum(il)+(lv(il,i)+(cl-cpd)*(t(il,i)-t(il,1)))* & |
||
4475 |
(ph(il,i)-ph(il,i+1)) |
||
4476 |
ENDIF ! (ok_conserv_q) |
||
4477 |
!jyg> |
||
4478 |
101189 |
dsum(il) = dsum(il) + t(il, i)*(ph(il,i)-ph(il,i+1))/th(il, i) |
|
4479 |
!jyg Unsaturated part : use T_wake profile |
||
4480 |
101189 |
esum(il) = esum(il) + ftd(il, i)*(ph(il,i)-ph(il,i+1)) |
|
4481 |
!jyg<20140311 |
||
4482 |
!Correction pour conserver l eau |
||
4483 |
✓✗ | 101189 |
IF (ok_conserv_q) THEN |
4484 |
101189 |
fsum(il) = fsum(il) + fqd(il, i)*(ph(il,i)-ph(il,i+1)) |
|
4485 |
101189 |
gsum(il) = gsum(il) + (ph(il,i)-ph(il,i+1)) |
|
4486 |
ELSE |
||
4487 |
fsum(il)=fsum(il)+fqd(il,i)*(lv(il,i)+(cl-cpd)*(t_wake(il,i)-t_wake(il,1)))* & |
||
4488 |
(ph(il,i)-ph(il,i+1)) |
||
4489 |
gsum(il)=gsum(il)+(lv(il,i)+(cl-cpd)*(t_wake(il,i)-t_wake(il,1)))* & |
||
4490 |
(ph(il,i)-ph(il,i+1)) |
||
4491 |
ENDIF ! (ok_conserv_q) |
||
4492 |
!jyg> |
||
4493 |
101189 |
hsum(il) = hsum(il) + t_wake(il, i)*(ph(il,i)-ph(il,i+1))/th_wake(il, i) |
|
4494 |
END IF |
||
4495 |
END DO |
||
4496 |
END DO |
||
4497 |
|||
4498 |
!!!! do 700 i=1,icb(il)-1 |
||
4499 |
✓✗ | 144 |
IF (ok_homo_tend) THEN |
4500 |
✓✓ | 4032 |
DO i = 1, nl |
4501 |
✓✓ | 1866114 |
DO il = 1, ncum |
4502 |
✓✓✓✓ |
1865970 |
IF (i<=(icb(il)-1) .AND. iflag(il)<=1) THEN |
4503 |
101189 |
ftd(il, i) = esum(il)*t_wake(il, i)/(th_wake(il,i)*hsum(il)) |
|
4504 |
101189 |
fqd(il, i) = fsum(il)/gsum(il) |
|
4505 |
101189 |
ft(il, i) = ftd(il, i) + asum(il)*t(il, i)/(th(il,i)*dsum(il)) |
|
4506 |
101189 |
fr(il, i) = fqd(il, i) + bsum(il)/csum(il) |
|
4507 |
END IF |
||
4508 |
END DO |
||
4509 |
END DO |
||
4510 |
ENDIF |
||
4511 |
|||
4512 |
!jyg< |
||
4513 |
!Conservation de l'eau |
||
4514 |
!! sumdq = 0. |
||
4515 |
!! DO k = 1, nl |
||
4516 |
!! sumdq = sumdq + fr(1, k)*100.*(ph(1,k)-ph(1,k+1))/grav |
||
4517 |
!! END DO |
||
4518 |
!! PRINT *, 'cv3_yield, apres hom, sum(dq), precip, somme ', sumdq, Vprecip(1, 1), sumdq + vprecip(1, 1) |
||
4519 |
!jyg> |
||
4520 |
|||
4521 |
|||
4522 |
! *** Check that moisture stays positive. If not, scale tendencies |
||
4523 |
! in order to ensure moisture positivity |
||
4524 |
✓✓ | 69110 |
DO il = 1, ncum |
4525 |
68966 |
alpha_qpos(il) = 1. |
|
4526 |
✓✓ | 69110 |
IF (iflag(il)<=1) THEN |
4527 |
✓✓ | 23019 |
IF (fr(il,1)<=0.) THEN |
4528 |
4849 |
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))) |
|
4529 |
END IF |
||
4530 |
END IF |
||
4531 |
END DO |
||
4532 |
✓✓ | 3888 |
DO i = 2, nl |
4533 |
✓✓ | 1797004 |
DO il = 1, ncum |
4534 |
✓✓ | 1796860 |
IF (iflag(il)<=1) THEN |
4535 |
✓✓ | 598494 |
IF (fr(il,i)<=0.) THEN |
4536 |
437433 |
alpha_qpos1(il) = max(1., (-delt*fr(il,i))/(s_wake(il)*rr_wake(il,i)+(1.-s_wake(il))*rr(il,i))) |
|
4537 |
✓✗ | 437433 |
IF (alpha_qpos1(il)>=alpha_qpos(il)) alpha_qpos(il) = alpha_qpos1(il) |
4538 |
END IF |
||
4539 |
END IF |
||
4540 |
END DO |
||
4541 |
END DO |
||
4542 |
✓✓ | 69110 |
DO il = 1, ncum |
4543 |
✓✓✗✓ |
69110 |
IF (iflag(il)<=1 .AND. alpha_qpos(il)>1.001) THEN |
4544 |
alpha_qpos(il) = alpha_qpos(il)*1.1 |
||
4545 |
END IF |
||
4546 |
END DO |
||
4547 |
! |
||
4548 |
✗✓ | 144 |
IF (prt_level .GE. 5) THEN |
4549 |
print *,' CV3_YIELD : alpha_qpos ',alpha_qpos(1) |
||
4550 |
ENDIF |
||
4551 |
! |
||
4552 |
✓✓ | 69110 |
DO il = 1, ncum |
4553 |
✓✓ | 69110 |
IF (iflag(il)<=1) THEN |
4554 |
23019 |
sigd(il) = sigd(il)/alpha_qpos(il) |
|
4555 |
23019 |
precip(il) = precip(il)/alpha_qpos(il) |
|
4556 |
23019 |
cbmf(il) = cbmf(il)/alpha_qpos(il) |
|
4557 |
END IF |
||
4558 |
END DO |
||
4559 |
✓✓ | 4032 |
DO i = 1, nl |
4560 |
✓✓ | 1866114 |
DO il = 1, ncum |
4561 |
✓✓ | 1865970 |
IF (iflag(il)<=1) THEN |
4562 |
621513 |
fr(il, i) = fr(il, i)/alpha_qpos(il) |
|
4563 |
621513 |
ft(il, i) = ft(il, i)/alpha_qpos(il) |
|
4564 |
621513 |
fqd(il, i) = fqd(il, i)/alpha_qpos(il) |
|
4565 |
621513 |
ftd(il, i) = ftd(il, i)/alpha_qpos(il) |
|
4566 |
621513 |
fu(il, i) = fu(il, i)/alpha_qpos(il) |
|
4567 |
621513 |
fv(il, i) = fv(il, i)/alpha_qpos(il) |
|
4568 |
621513 |
m(il, i) = m(il, i)/alpha_qpos(il) |
|
4569 |
621513 |
mp(il, i) = mp(il, i)/alpha_qpos(il) |
|
4570 |
621513 |
Vprecip(il, i) = Vprecip(il, i)/alpha_qpos(il) |
|
4571 |
621513 |
Vprecipi(il, i) = Vprecipi(il, i)/alpha_qpos(il) ! jyg |
|
4572 |
END IF |
||
4573 |
END DO |
||
4574 |
END DO |
||
4575 |
!jyg< |
||
4576 |
!----------------------------------------------------------- |
||
4577 |
✓✗ | 144 |
IF (ok_optim_yield) THEN !| |
4578 |
!----------------------------------------------------------- |
||
4579 |
✓✓ | 4032 |
DO i = 1, nl |
4580 |
✓✓ | 1866114 |
DO il = 1, ncum |
4581 |
✓✓ | 1865970 |
IF (iflag(il)<=1) THEN |
4582 |
621513 |
upwd(il, i) = upwd(il, i)/alpha_qpos(il) |
|
4583 |
621513 |
dnwd(il, i) = dnwd(il, i)/alpha_qpos(il) |
|
4584 |
END IF |
||
4585 |
END DO |
||
4586 |
END DO |
||
4587 |
!----------------------------------------------------------- |
||
4588 |
ENDIF !(ok_optim_yield) !| |
||
4589 |
!----------------------------------------------------------- |
||
4590 |
!>jyg |
||
4591 |
✓✓ | 4032 |
DO j = 1, nl !yor! inverted i and j loops |
4592 |
✓✓ | 109008 |
DO i = 1, nl |
4593 |
✓✓ | 50385078 |
DO il = 1, ncum |
4594 |
✓✓ | 50381190 |
IF (iflag(il)<=1) THEN |
4595 |
16780851 |
ment(il, i, j) = ment(il, i, j)/alpha_qpos(il) |
|
4596 |
END IF |
||
4597 |
END DO |
||
4598 |
END DO |
||
4599 |
END DO |
||
4600 |
|||
4601 |
!AC! DO j = 1,ntra |
||
4602 |
!AC! DO i = 1,nl |
||
4603 |
!AC! DO il = 1,ncum |
||
4604 |
!AC! IF (iflag(il) .le. 1) THEN |
||
4605 |
!AC! ftra(il,i,j) = ftra(il,i,j)/alpha_qpos(il) |
||
4606 |
!AC! ENDIF |
||
4607 |
!AC! ENDDO |
||
4608 |
!AC! ENDDO |
||
4609 |
!AC! ENDDO |
||
4610 |
|||
4611 |
|||
4612 |
! *** reset counter and return *** |
||
4613 |
|||
4614 |
! Reset counter only for points actually convective (jyg) |
||
4615 |
! In order take into account the possibility of changing the compression, |
||
4616 |
! reset m, sig and w0 to zero for non-convecting points. |
||
4617 |
✓✓ | 69110 |
DO il = 1, ncum |
4618 |
✓✓ | 69110 |
IF (iflag(il) < 3) THEN |
4619 |
23019 |
sig(il, nd) = 2.0 |
|
4620 |
ENDIF |
||
4621 |
END DO |
||
4622 |
|||
4623 |
|||
4624 |
✓✓ | 4032 |
DO i = 1, nl |
4625 |
✓✓ | 1866114 |
DO il = 1, ncum |
4626 |
1865970 |
dnwd0(il, i) = -mp(il, i) |
|
4627 |
END DO |
||
4628 |
END DO |
||
4629 |
!jyg< (loops stop at nl) |
||
4630 |
!! DO i = nl + 1, nd |
||
4631 |
!! DO il = 1, ncum |
||
4632 |
!! dnwd0(il, i) = 0. |
||
4633 |
!! END DO |
||
4634 |
!! END DO |
||
4635 |
!>jyg |
||
4636 |
|||
4637 |
|||
4638 |
!jyg< |
||
4639 |
!----------------------------------------------------------- |
||
4640 |
✗✓ | 144 |
IF (.NOT.ok_optim_yield) THEN !| |
4641 |
!----------------------------------------------------------- |
||
4642 |
DO i = 1, nl |
||
4643 |
DO il = 1, ncum |
||
4644 |
upwd(il, i) = 0.0 |
||
4645 |
dnwd(il, i) = 0.0 |
||
4646 |
END DO |
||
4647 |
END DO |
||
4648 |
|||
4649 |
!! DO i = 1, nl ! useless; jyg |
||
4650 |
!! DO il = 1, ncum ! useless; jyg |
||
4651 |
!! IF (i>=icb(il) .AND. i<=inb(il)) THEN ! useless; jyg |
||
4652 |
!! upwd(il, i) = 0.0 ! useless; jyg |
||
4653 |
!! dnwd(il, i) = 0.0 ! useless; jyg |
||
4654 |
!! END IF ! useless; jyg |
||
4655 |
!! END DO ! useless; jyg |
||
4656 |
!! END DO ! useless; jyg |
||
4657 |
|||
4658 |
DO i = 1, nl |
||
4659 |
DO k = 1, nl |
||
4660 |
DO il = 1, ncum |
||
4661 |
up1(il, k, i) = 0.0 |
||
4662 |
dn1(il, k, i) = 0.0 |
||
4663 |
END DO |
||
4664 |
END DO |
||
4665 |
END DO |
||
4666 |
|||
4667 |
!yor! commented original |
||
4668 |
! DO i = 1, nl |
||
4669 |
! DO k = i, nl |
||
4670 |
! DO n = 1, i - 1 |
||
4671 |
! DO il = 1, ncum |
||
4672 |
! IF (i>=icb(il) .AND. i<=inb(il) .AND. k<=inb(il)) THEN |
||
4673 |
! up1(il, k, i) = up1(il, k, i) + ment(il, n, k) |
||
4674 |
! dn1(il, k, i) = dn1(il, k, i) - ment(il, k, n) |
||
4675 |
! END IF |
||
4676 |
! END DO |
||
4677 |
! END DO |
||
4678 |
! END DO |
||
4679 |
! END DO |
||
4680 |
!yor! replaced with |
||
4681 |
DO i = 1, nl |
||
4682 |
DO k = i, nl |
||
4683 |
DO n = 1, i - 1 |
||
4684 |
DO il = 1, ncum |
||
4685 |
IF (i>=icb(il) .AND. k<=inb(il)) THEN ! yor ! as i always <= k |
||
4686 |
up1(il, k, i) = up1(il, k, i) + ment(il, n, k) |
||
4687 |
END IF |
||
4688 |
END DO |
||
4689 |
END DO |
||
4690 |
END DO |
||
4691 |
END DO |
||
4692 |
DO i = 1, nl |
||
4693 |
DO n = 1, i - 1 |
||
4694 |
DO k = i, nl |
||
4695 |
DO il = 1, ncum |
||
4696 |
IF (i>=icb(il) .AND. k<=inb(il)) THEN ! yor ! i always <= k |
||
4697 |
dn1(il, k, i) = dn1(il, k, i) - ment(il, k, n) |
||
4698 |
END IF |
||
4699 |
END DO |
||
4700 |
END DO |
||
4701 |
END DO |
||
4702 |
END DO |
||
4703 |
!yor! end replace |
||
4704 |
|||
4705 |
DO i = 1, nl |
||
4706 |
DO k = 1, nl |
||
4707 |
DO il = 1, ncum |
||
4708 |
IF (i>=icb(il)) THEN |
||
4709 |
IF (k>=i .AND. k<=(inb(il))) THEN |
||
4710 |
upwd(il, i) = upwd(il, i) + m(il, k) |
||
4711 |
END IF |
||
4712 |
ELSE |
||
4713 |
IF (k<i) THEN |
||
4714 |
upwd(il, i) = upwd(il, i) + cbmf(il)*wghti(il, k) |
||
4715 |
END IF |
||
4716 |
END IF |
||
4717 |
! c print *,'cbmf',il,i,k,cbmf(il),wghti(il,k) |
||
4718 |
END DO |
||
4719 |
END DO |
||
4720 |
END DO |
||
4721 |
|||
4722 |
DO i = 2, nl |
||
4723 |
DO k = i, nl |
||
4724 |
DO il = 1, ncum |
||
4725 |
! test if (i.ge.icb(il).and.i.le.inb(il).and.k.le.inb(il)) then |
||
4726 |
IF (i<=inb(il) .AND. k<=inb(il)) THEN |
||
4727 |
upwd(il, i) = upwd(il, i) + up1(il, k, i) |
||
4728 |
dnwd(il, i) = dnwd(il, i) + dn1(il, k, i) |
||
4729 |
END IF |
||
4730 |
! c print *,'upwd',il,i,k,inb(il),upwd(il,i),m(il,k),up1(il,k,i) |
||
4731 |
END DO |
||
4732 |
END DO |
||
4733 |
END DO |
||
4734 |
|||
4735 |
|||
4736 |
!!!! DO il=1,ncum |
||
4737 |
!!!! do i=icb(il),inb(il) |
||
4738 |
!!!! |
||
4739 |
!!!! upwd(il,i)=0.0 |
||
4740 |
!!!! dnwd(il,i)=0.0 |
||
4741 |
!!!! do k=i,inb(il) |
||
4742 |
!!!! up1=0.0 |
||
4743 |
!!!! dn1=0.0 |
||
4744 |
!!!! do n=1,i-1 |
||
4745 |
!!!! up1=up1+ment(il,n,k) |
||
4746 |
!!!! dn1=dn1-ment(il,k,n) |
||
4747 |
!!!! enddo |
||
4748 |
!!!! upwd(il,i)=upwd(il,i)+m(il,k)+up1 |
||
4749 |
!!!! dnwd(il,i)=dnwd(il,i)+dn1 |
||
4750 |
!!!! enddo |
||
4751 |
!!!! enddo |
||
4752 |
!!!! |
||
4753 |
!!!! ENDDO |
||
4754 |
|||
4755 |
!! DO i = 1, nlp |
||
4756 |
!! DO il = 1, ncum |
||
4757 |
!! ma(il, i) = 0 |
||
4758 |
!! END DO |
||
4759 |
!! END DO |
||
4760 |
!! |
||
4761 |
!! DO i = 1, nl |
||
4762 |
!! DO j = i, nl |
||
4763 |
!! DO il = 1, ncum |
||
4764 |
!! ma(il, i) = ma(il, i) + m(il, j) |
||
4765 |
!! END DO |
||
4766 |
!! END DO |
||
4767 |
!! END DO |
||
4768 |
|||
4769 |
!jyg< (loops stop at nl) |
||
4770 |
!! DO i = nl + 1, nd |
||
4771 |
!! DO il = 1, ncum |
||
4772 |
!! ma(il, i) = 0. |
||
4773 |
!! END DO |
||
4774 |
!! END DO |
||
4775 |
!>jyg |
||
4776 |
|||
4777 |
!! DO i = 1, nl |
||
4778 |
!! DO il = 1, ncum |
||
4779 |
!! IF (i<=(icb(il)-1)) THEN |
||
4780 |
!! ma(il, i) = 0 |
||
4781 |
!! END IF |
||
4782 |
!! END DO |
||
4783 |
!! END DO |
||
4784 |
|||
4785 |
!----------------------------------------------------------- |
||
4786 |
ENDIF !(.NOT.ok_optim_yield) !| |
||
4787 |
!----------------------------------------------------------- |
||
4788 |
!>jyg |
||
4789 |
|||
4790 |
! ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc |
||
4791 |
! determination de la variation de flux ascendant entre |
||
4792 |
! deux niveau non dilue mip |
||
4793 |
! ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc |
||
4794 |
|||
4795 |
✓✓ | 4032 |
DO i = 1, nl |
4796 |
✓✓ | 1866114 |
DO il = 1, ncum |
4797 |
1865970 |
mip(il, i) = m(il, i) |
|
4798 |
END DO |
||
4799 |
END DO |
||
4800 |
|||
4801 |
!jyg< (loops stop at nl) |
||
4802 |
!! DO i = nl + 1, nd |
||
4803 |
!! DO il = 1, ncum |
||
4804 |
!! mip(il, i) = 0. |
||
4805 |
!! END DO |
||
4806 |
!! END DO |
||
4807 |
!>jyg |
||
4808 |
|||
4809 |
|||
4810 |
! cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc |
||
4811 |
! icb represente de niveau ou se trouve la |
||
4812 |
! base du nuage , et inb le top du nuage |
||
4813 |
! ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc |
||
4814 |
|||
4815 |
!! DO i = 1, nd ! unused . jyg |
||
4816 |
!! DO il = 1, ncum ! unused . jyg |
||
4817 |
!! mke(il, i) = upwd(il, i) + dnwd(il, i) ! unused . jyg |
||
4818 |
!! END DO ! unused . jyg |
||
4819 |
!! END DO ! unused . jyg |
||
4820 |
|||
4821 |
!! DO i = 1, nd ! unused . jyg |
||
4822 |
!! DO il = 1, ncum ! unused . jyg |
||
4823 |
!! rdcp = (rrd*(1.-rr(il,i))-rr(il,i)*rrv)/(cpd*(1.-rr(il,i))+rr(il,i)*cpv) ! unused . jyg |
||
4824 |
!! tls(il, i) = t(il, i)*(1000.0/p(il,i))**rdcp ! unused . jyg |
||
4825 |
!! tps(il, i) = tp(il, i) ! unused . jyg |
||
4826 |
!! END DO ! unused . jyg |
||
4827 |
!! END DO ! unused . jyg |
||
4828 |
|||
4829 |
|||
4830 |
! *** diagnose the in-cloud mixing ratio *** ! cld |
||
4831 |
! *** of condensed water *** ! cld |
||
4832 |
!! cld |
||
4833 |
|||
4834 |
✓✓ | 4176 |
DO i = 1, nl+1 ! cld |
4835 |
✓✓ | 1935224 |
DO il = 1, ncum ! cld |
4836 |
1931048 |
mac(il, i) = 0.0 ! cld |
|
4837 |
1931048 |
wa(il, i) = 0.0 ! cld |
|
4838 |
1931048 |
siga(il, i) = 0.0 ! cld |
|
4839 |
1935080 |
sax(il, i) = 0.0 ! cld |
|
4840 |
END DO ! cld |
||
4841 |
END DO ! cld |
||
4842 |
|||
4843 |
✓✓ | 4032 |
DO i = minorig, nl ! cld |
4844 |
✓✓ | 58464 |
DO k = i + 1, nl + 1 ! cld |
4845 |
✓✓ | 26127468 |
DO il = 1, ncum ! cld |
4846 |
✓✓✓✓ ✓✓ |
26123580 |
IF (i<=inb(il) .AND. k<=(inb(il)+1) .AND. iflag(il)<=1) THEN ! cld |
4847 |
3579202 |
mac(il, i) = mac(il, i) + m(il, k) ! cld |
|
4848 |
END IF ! cld |
||
4849 |
END DO ! cld |
||
4850 |
END DO ! cld |
||
4851 |
END DO ! cld |
||
4852 |
|||
4853 |
✓✓ | 4032 |
DO i = 1, nl ! cld |
4854 |
✓✓ | 58464 |
DO j = 1, i ! cld |
4855 |
✓✓ | 26127468 |
DO il = 1, ncum ! cld |
4856 |
IF (i>=icb(il) .AND. i<=(inb(il)-1) & ! cld |
||
4857 |
✓✓✓✓ ✓✓✓✓ |
26123580 |
.AND. j>=icb(il) .AND. iflag(il)<=1) THEN ! cld |
4858 |
sax(il, i) = sax(il, i) + rrd*(tvp(il,j)-tv(il,j)) & ! cld |
||
4859 |
1790910 |
*(ph(il,j)-ph(il,j+1))/p(il, j) ! cld |
|
4860 |
END IF ! cld |
||
4861 |
END DO ! cld |
||
4862 |
END DO ! cld |
||
4863 |
END DO ! cld |
||
4864 |
|||
4865 |
✓✓ | 4032 |
DO i = 1, nl ! cld |
4866 |
✓✓ | 1866114 |
DO il = 1, ncum ! cld |
4867 |
IF (i>=icb(il) .AND. i<=(inb(il)-1) & ! cld |
||
4868 |
✓✓✓✓ ✓✓✓✗ |
1865970 |
.AND. sax(il,i)>0.0 .AND. iflag(il)<=1) THEN ! cld |
4869 |
230071 |
wa(il, i) = sqrt(2.*sax(il,i)) ! cld |
|
4870 |
END IF ! cld |
||
4871 |
END DO ! cld |
||
4872 |
END DO |
||
4873 |
! cld |
||
4874 |
✓✓ | 4032 |
DO i = 1, nl |
4875 |
|||
4876 |
! 14/01/15 AJ je remets les parties manquantes cf JYG |
||
4877 |
! Initialize sument to 0 |
||
4878 |
|||
4879 |
✓✓ | 1865970 |
DO il = 1,ncum |
4880 |
1865970 |
sument(il) = 0. |
|
4881 |
ENDDO |
||
4882 |
|||
4883 |
! Sum mixed mass fluxes in sument |
||
4884 |
|||
4885 |
✓✓ | 108864 |
DO k = 1,nl |
4886 |
✓✓ | 50385078 |
DO il = 1,ncum |
4887 |
✓✓✓✓ ✓✓ |
50381190 |
IF (k<=inb(il) .AND. i<=inb(il) .AND. iflag(il)<=1) THEN ! cld |
4888 |
6771657 |
sument(il) =sument(il) + abs(ment(il,k,i)) |
|
4889 |
ENDIF |
||
4890 |
ENDDO ! il |
||
4891 |
ENDDO ! k |
||
4892 |
|||
4893 |
! 14/01/15 AJ delta n'a rien � faire l�... |
||
4894 |
✓✓ | 1866114 |
DO il = 1, ncum ! cld |
4895 |
!! IF (wa(il,i)>0.0 .AND. iflag(il)<=1) & ! cld |
||
4896 |
!! siga(il, i) = mac(il, i)/(coefw_cld_cv*wa(il, i)) & ! cld |
||
4897 |
!! *rrd*tvp(il, i)/p(il, i)/100. ! cld |
||
4898 |
!! |
||
4899 |
!! siga(il, i) = min(siga(il,i), 1.0) ! cld |
||
4900 |
sigaq = 0. |
||
4901 |
✓✓✓✗ |
1862082 |
IF (wa(il,i)>0.0 .AND. iflag(il)<=1) THEN ! cld |
4902 |
siga(il, i) = mac(il, i)/(coefw_cld_cv*wa(il, i)) & ! cld |
||
4903 |
230071 |
*rrd*tvp(il, i)/p(il, i)/100. ! cld |
|
4904 |
230071 |
siga(il, i) = min(siga(il,i), 1.0) ! cld |
|
4905 |
230071 |
sigaq = siga(il,i)*qta(il,i-1) ! cld |
|
4906 |
ENDIF |
||
4907 |
|||
4908 |
! IM cf. FH |
||
4909 |
! 14/01/15 AJ ne correspond pas � ce qui a �t� cod� par JYG et SB |
||
4910 |
|||
4911 |
✓✗ | 1865970 |
IF (iflag_clw==0) THEN ! cld |
4912 |
qcondc(il, i) = siga(il, i)*clw(il, i)*(1.-ep(il,i)) & ! cld |
||
4913 |
1862082 |
+(1.-siga(il,i))*qcond(il, i) ! cld |
|
4914 |
|||
4915 |
|||
4916 |
1862082 |
sigment(il,i)=sument(il)*tau_cld_cv/(ph(il,i)-ph(il,i+1)) ! cld |
|
4917 |
1862082 |
sigment(il, i) = min(1.e-4+sigment(il,i), 1.0 - siga(il,i)) ! cld |
|
4918 |
!! qtc(il, i) = (siga(il,i)*qta(il,i-1)+sigment(il,i)*qtment(il,i)) & ! cld |
||
4919 |
qtc(il, i) = (sigaq+sigment(il,i)*qtment(il,i)) & ! cld |
||
4920 |
1862082 |
/(siga(il,i)+sigment(il,i)) ! cld |
|
4921 |
1862082 |
sigt(il,i) = sigment(il, i) + siga(il, i) |
|
4922 |
|||
4923 |
! qtc(il, i) = siga(il,i)*qta(il,i-1)+(1.-siga(il,i))*qtment(il,i) ! cld |
||
4924 |
! print*,'BIGAUSSIAN CONV',siga(il,i),sigment(il,i),qtc(il,i) |
||
4925 |
|||
4926 |
ELSE IF (iflag_clw==1) THEN ! cld |
||
4927 |
qcondc(il, i) = qcond(il, i) ! cld |
||
4928 |
qtc(il,i) = qtment(il,i) ! cld |
||
4929 |
END IF ! cld |
||
4930 |
|||
4931 |
END DO ! cld |
||
4932 |
END DO |
||
4933 |
! print*,'cv3_yield fin' |
||
4934 |
|||
4935 |
144 |
RETURN |
|
4936 |
END SUBROUTINE cv3_yield |
||
4937 |
|||
4938 |
!AC! et !RomP >>> |
||
4939 |
144 |
SUBROUTINE cv3_tracer(nloc, len, ncum, nd, na, & |
|
4940 |
144 |
ment, sigij, da, phi, phi2, d1a, dam, & |
|
4941 |
144 |
ep, Vprecip, elij, clw, epmlmMm, eplaMm, & |
|
4942 |
icb, inb) |
||
4943 |
IMPLICIT NONE |
||
4944 |
|||
4945 |
include "cv3param.h" |
||
4946 |
|||
4947 |
!inputs: |
||
4948 |
INTEGER, INTENT (IN) :: ncum, nd, na, nloc, len |
||
4949 |
INTEGER, DIMENSION (len), INTENT (IN) :: icb, inb |
||
4950 |
REAL, DIMENSION (len, na, na), INTENT (IN) :: ment, sigij, elij |
||
4951 |
REAL, DIMENSION (len, nd), INTENT (IN) :: clw |
||
4952 |
REAL, DIMENSION (len, na), INTENT (IN) :: ep |
||
4953 |
REAL, DIMENSION (len, nd+1), INTENT (IN) :: Vprecip |
||
4954 |
!ouputs: |
||
4955 |
REAL, DIMENSION (len, na, na), INTENT (OUT) :: phi, phi2, epmlmMm |
||
4956 |
REAL, DIMENSION (len, na), INTENT (OUT) :: da, d1a, dam, eplaMm |
||
4957 |
! |
||
4958 |
! variables pour tracer dans precip de l'AA et des mel |
||
4959 |
!local variables: |
||
4960 |
INTEGER i, j, k |
||
4961 |
144 |
REAL epm(nloc, na, na) |
|
4962 |
|||
4963 |
! variables d'Emanuel : du second indice au troisieme |
||
4964 |
! ---> tab(i,k,j) -> de l origine k a l arrivee j |
||
4965 |
! ment, sigij, elij |
||
4966 |
! variables personnelles : du troisieme au second indice |
||
4967 |
! ---> tab(i,j,k) -> de k a j |
||
4968 |
! phi, phi2 |
||
4969 |
|||
4970 |
! initialisations |
||
4971 |
|||
4972 |
✓✓✓✓ |
5588064 |
da(:, :) = 0. |
4973 |
✓✓✓✓ |
5588064 |
d1a(:, :) = 0. |
4974 |
✓✓✓✓ |
5588064 |
dam(:, :) = 0. |
4975 |
✓✓✓✓ ✓✓ |
217934640 |
epm(:, :, :) = 0. |
4976 |
✓✓✓✓ |
5588064 |
eplaMm(:, :) = 0. |
4977 |
✓✓✓✓ ✓✓ |
217934640 |
epmlmMm(:, :, :) = 0. |
4978 |
✓✓✓✓ ✓✓ |
217934640 |
phi(:, :, :) = 0. |
4979 |
✓✓✓✓ ✓✓ |
217934640 |
phi2(:, :, :) = 0. |
4980 |
|||
4981 |
! fraction deau condensee dans les melanges convertie en precip : epm |
||
4982 |
! et eau condens�e pr�cipit�e dans masse d'air satur� : l_m*dM_m/dzdz.dzdz |
||
4983 |
✓✓ | 4032 |
DO j = 1, nl |
4984 |
✓✓ | 109008 |
DO k = 1, nl |
4985 |
✓✓ | 50385078 |
DO i = 1, ncum |
4986 |
IF (k>=icb(i) .AND. k<=inb(i) .AND. & |
||
4987 |
!!jyg j.ge.k.and.j.le.inb(i)) then |
||
4988 |
!!jyg epm(i,j,k)=1.-(1.-ep(i,j))*clw(i,j)/elij(i,k,j) |
||
4989 |
✓✓✓✓ ✓✓✓✓ |
50381190 |
j>k .AND. j<=inb(i)) THEN |
4990 |
2960946 |
epm(i, j, k) = 1. - (1.-ep(i,j))*clw(i, j)/max(elij(i,k,j), 1.E-16) |
|
4991 |
!! |
||
4992 |
2960946 |
epm(i, j, k) = max(epm(i,j,k), 0.0) |
|
4993 |
END IF |
||
4994 |
END DO |
||
4995 |
END DO |
||
4996 |
END DO |
||
4997 |
|||
4998 |
|||
4999 |
✓✓ | 4032 |
DO j = 1, nl |
5000 |
✓✓ | 109008 |
DO k = 1, nl |
5001 |
✓✓ | 50385078 |
DO i = 1, ncum |
5002 |
✓✓✓✓ |
50381190 |
IF (k>=icb(i) .AND. k<=inb(i)) THEN |
5003 |
eplaMm(i, j) = eplamm(i, j) + & |
||
5004 |
15841089 |
ep(i, j)*clw(i, j)*ment(i, j, k)*(1.-sigij(i,j,k)) |
|
5005 |
END IF |
||
5006 |
END DO |
||
5007 |
END DO |
||
5008 |
END DO |
||
5009 |
|||
5010 |
✓✓ | 4032 |
DO j = 1, nl |
5011 |
✓✓ | 54576 |
DO k = 1, j - 1 |
5012 |
✓✓ | 24261498 |
DO i = 1, ncum |
5013 |
✓✓✓✓ ✓✓ |
24257610 |
IF (k>=icb(i) .AND. k<=inb(i) .AND. j<=inb(i)) THEN |
5014 |
2960946 |
epmlmMm(i, j, k) = epm(i, j, k)*elij(i, k, j)*ment(i, k, j) |
|
5015 |
END IF |
||
5016 |
END DO |
||
5017 |
END DO |
||
5018 |
END DO |
||
5019 |
|||
5020 |
! matrices pour calculer la tendance des concentrations dans cvltr.F90 |
||
5021 |
✓✓ | 4032 |
DO j = 1, nl |
5022 |
✓✓ | 109008 |
DO k = 1, nl |
5023 |
✓✓ | 50385078 |
DO i = 1, ncum |
5024 |
50276214 |
da(i, j) = da(i, j) + (1.-sigij(i,k,j))*ment(i, k, j) |
|
5025 |
50276214 |
phi(i, j, k) = sigij(i, k, j)*ment(i, k, j) |
|
5026 |
50276214 |
d1a(i, j) = d1a(i, j) + ment(i, k, j)*ep(i, k)*(1.-sigij(i,k,j)) |
|
5027 |
✓✓ | 50381190 |
IF (k<=j) THEN |
5028 |
26069148 |
dam(i, j) = dam(i, j) + ment(i, k, j)*epm(i, k, j)*(1.-ep(i,k))*(1.-sigij(i,k,j)) |
|
5029 |
26069148 |
phi2(i, j, k) = phi(i, j, k)*epm(i, j, k) |
|
5030 |
END IF |
||
5031 |
END DO |
||
5032 |
END DO |
||
5033 |
END DO |
||
5034 |
|||
5035 |
144 |
RETURN |
|
5036 |
END SUBROUTINE cv3_tracer |
||
5037 |
!AC! et !RomP <<< |
||
5038 |
|||
5039 |
SUBROUTINE cv3_uncompress(nloc, len, ncum, nd, ntra, idcum, & |
||
5040 |
iflag, & |
||
5041 |
precip, sig, w0, & |
||
5042 |
ft, fq, fu, fv, ftra, & |
||
5043 |
Ma, upwd, dnwd, dnwd0, qcondc, wd, cape, & |
||
5044 |
epmax_diag, & ! epmax_cape |
||
5045 |
iflag1, & |
||
5046 |
precip1, sig1, w01, & |
||
5047 |
ft1, fq1, fu1, fv1, ftra1, & |
||
5048 |
Ma1, upwd1, dnwd1, dnwd01, qcondc1, wd1, cape1, & |
||
5049 |
epmax_diag1) ! epmax_cape |
||
5050 |
IMPLICIT NONE |
||
5051 |
|||
5052 |
include "cv3param.h" |
||
5053 |
|||
5054 |
!inputs: |
||
5055 |
INTEGER len, ncum, nd, ntra, nloc |
||
5056 |
INTEGER idcum(nloc) |
||
5057 |
INTEGER iflag(nloc) |
||
5058 |
REAL precip(nloc) |
||
5059 |
REAL sig(nloc, nd), w0(nloc, nd) |
||
5060 |
REAL ft(nloc, nd), fq(nloc, nd), fu(nloc, nd), fv(nloc, nd) |
||
5061 |
REAL ftra(nloc, nd, ntra) |
||
5062 |
REAL ma(nloc, nd) |
||
5063 |
REAL upwd(nloc, nd), dnwd(nloc, nd), dnwd0(nloc, nd) |
||
5064 |
REAL qcondc(nloc, nd) |
||
5065 |
REAL wd(nloc), cape(nloc) |
||
5066 |
REAL epmax_diag(nloc) |
||
5067 |
|||
5068 |
!outputs: |
||
5069 |
INTEGER iflag1(len) |
||
5070 |
REAL precip1(len) |
||
5071 |
REAL sig1(len, nd), w01(len, nd) |
||
5072 |
REAL ft1(len, nd), fq1(len, nd), fu1(len, nd), fv1(len, nd) |
||
5073 |
REAL ftra1(len, nd, ntra) |
||
5074 |
REAL ma1(len, nd) |
||
5075 |
REAL upwd1(len, nd), dnwd1(len, nd), dnwd01(len, nd) |
||
5076 |
REAL qcondc1(nloc, nd) |
||
5077 |
REAL wd1(nloc), cape1(nloc) |
||
5078 |
REAL epmax_diag1(len) ! epmax_cape |
||
5079 |
|||
5080 |
!local variables: |
||
5081 |
INTEGER i, k, j |
||
5082 |
|||
5083 |
DO i = 1, ncum |
||
5084 |
precip1(idcum(i)) = precip(i) |
||
5085 |
iflag1(idcum(i)) = iflag(i) |
||
5086 |
wd1(idcum(i)) = wd(i) |
||
5087 |
cape1(idcum(i)) = cape(i) |
||
5088 |
epmax_diag1(idcum(i))=epmax_diag(i) ! epmax_cape |
||
5089 |
END DO |
||
5090 |
|||
5091 |
DO k = 1, nl |
||
5092 |
DO i = 1, ncum |
||
5093 |
sig1(idcum(i), k) = sig(i, k) |
||
5094 |
w01(idcum(i), k) = w0(i, k) |
||
5095 |
ft1(idcum(i), k) = ft(i, k) |
||
5096 |
fq1(idcum(i), k) = fq(i, k) |
||
5097 |
fu1(idcum(i), k) = fu(i, k) |
||
5098 |
fv1(idcum(i), k) = fv(i, k) |
||
5099 |
ma1(idcum(i), k) = ma(i, k) |
||
5100 |
upwd1(idcum(i), k) = upwd(i, k) |
||
5101 |
dnwd1(idcum(i), k) = dnwd(i, k) |
||
5102 |
dnwd01(idcum(i), k) = dnwd0(i, k) |
||
5103 |
qcondc1(idcum(i), k) = qcondc(i, k) |
||
5104 |
END DO |
||
5105 |
END DO |
||
5106 |
|||
5107 |
DO i = 1, ncum |
||
5108 |
sig1(idcum(i), nd) = sig(i, nd) |
||
5109 |
END DO |
||
5110 |
|||
5111 |
|||
5112 |
!AC! do 2100 j=1,ntra |
||
5113 |
!AC!c oct3 do 2110 k=1,nl |
||
5114 |
!AC! do 2110 k=1,nd ! oct3 |
||
5115 |
!AC! do 2120 i=1,ncum |
||
5116 |
!AC! ftra1(idcum(i),k,j)=ftra(i,k,j) |
||
5117 |
!AC! 2120 continue |
||
5118 |
!AC! 2110 continue |
||
5119 |
!AC! 2100 continue |
||
5120 |
! |
||
5121 |
RETURN |
||
5122 |
END SUBROUTINE cv3_uncompress |
||
5123 |
|||
5124 |
|||
5125 |
144 |
subroutine cv3_epmax_fn_cape(nloc,ncum,nd & |
|
5126 |
, ep,hp,icb,inb,clw,nk,t,h,hnk,lv,lf,frac & |
||
5127 |
144 |
, pbase, p, ph, tv, buoy, sig, w0,iflag & |
|
5128 |
, epmax_diag) |
||
5129 |
implicit none |
||
5130 |
|||
5131 |
! On fait varier epmax en fn de la cape |
||
5132 |
! Il faut donc recalculer ep, et hp qui a d�j� �t� calcul� et |
||
5133 |
! qui en d�pend |
||
5134 |
! Toutes les autres variables fn de ep sont calcul�es plus bas. |
||
5135 |
|||
5136 |
include "cvthermo.h" |
||
5137 |
include "cv3param.h" |
||
5138 |
include "conema3.h" |
||
5139 |
include "cvflag.h" |
||
5140 |
|||
5141 |
! inputs: |
||
5142 |
INTEGER, INTENT (IN) :: ncum, nd, nloc |
||
5143 |
INTEGER, DIMENSION (nloc), INTENT (IN) :: icb, inb, nk |
||
5144 |
REAL, DIMENSION (nloc), INTENT (IN) :: hnk,pbase |
||
5145 |
REAL, DIMENSION (nloc, nd), INTENT (IN) :: t, lv, lf, tv, h |
||
5146 |
REAL, DIMENSION (nloc, nd), INTENT (IN) :: clw, buoy,frac |
||
5147 |
REAL, DIMENSION (nloc, nd), INTENT (IN) :: sig,w0 |
||
5148 |
INTEGER, DIMENSION (nloc), INTENT (IN) :: iflag(nloc) |
||
5149 |
REAL, DIMENSION (nloc, nd), INTENT (IN) :: p |
||
5150 |
REAL, DIMENSION (nloc, nd+1), INTENT (IN) :: ph |
||
5151 |
! inouts: |
||
5152 |
REAL, DIMENSION (nloc, nd), INTENT (INOUT) :: ep,hp |
||
5153 |
! outputs |
||
5154 |
REAL, DIMENSION (nloc), INTENT (OUT) :: epmax_diag |
||
5155 |
|||
5156 |
! local |
||
5157 |
integer i,k |
||
5158 |
! real hp_bak(nloc,nd) |
||
5159 |
! real ep_bak(nloc,nd) |
||
5160 |
288 |
real m_loc(nloc,nd) |
|
5161 |
288 |
real sig_loc(nloc,nd) |
|
5162 |
288 |
real w0_loc(nloc,nd) |
|
5163 |
288 |
integer iflag_loc(nloc) |
|
5164 |
288 |
real cape(nloc) |
|
5165 |
|||
5166 |
✗✓ | 144 |
if (coef_epmax_cape.gt.1e-12) then |
5167 |
|||
5168 |
! il faut calculer la cape: on fait un calcule simple car tant qu'on ne |
||
5169 |
! connait pas ep, on ne connait pas les m�langes, ddfts etc... qui sont |
||
5170 |
! necessaires au calcul de la cape dans la nouvelle physique |
||
5171 |
|||
5172 |
! write(*,*) 'cv3_routines check 4303' |
||
5173 |
do i=1,ncum |
||
5174 |
do k=1,nd |
||
5175 |
sig_loc(i,k)=sig(i,k) |
||
5176 |
w0_loc(i,k)=w0(i,k) |
||
5177 |
iflag_loc(i)=iflag(i) |
||
5178 |
! ep_bak(i,k)=ep(i,k) |
||
5179 |
enddo ! do k=1,nd |
||
5180 |
enddo !do i=1,ncum |
||
5181 |
|||
5182 |
! write(*,*) 'cv3_routines check 4311' |
||
5183 |
! write(*,*) 'nl=',nl |
||
5184 |
CALL cv3_closure(nloc, ncum, nd, icb, inb, & ! na->nd |
||
5185 |
pbase, p, ph, tv, buoy, & |
||
5186 |
sig_loc, w0_loc, cape, m_loc,iflag_loc) |
||
5187 |
|||
5188 |
! write(*,*) 'cv3_routines check 4316' |
||
5189 |
! write(*,*) 'ep(1,:)=',ep(1,:) |
||
5190 |
do i=1,ncum |
||
5191 |
epmax_diag(i)=epmax-coef_epmax_cape*sqrt(cape(i)) |
||
5192 |
epmax_diag(i)=amax1(epmax_diag(i),0.0) |
||
5193 |
! write(*,*) 'i,icb,inb,cape,epmax_diag=', & |
||
5194 |
! i,icb(i),inb(i),cape(i),epmax_diag(i) |
||
5195 |
do k=1,nl |
||
5196 |
ep(i,k)=ep(i,k)/epmax*epmax_diag(i) |
||
5197 |
ep(i,k)=amax1(ep(i,k),0.0) |
||
5198 |
ep(i,k)=amin1(ep(i,k),epmax_diag(i)) |
||
5199 |
enddo |
||
5200 |
enddo |
||
5201 |
! write(*,*) 'ep(1,:)=',ep(1,:) |
||
5202 |
|||
5203 |
!write(*,*) 'cv3_routines check 4326' |
||
5204 |
! On recalcule hp: |
||
5205 |
! do k=1,nl |
||
5206 |
! do i=1,ncum |
||
5207 |
! hp_bak(i,k)=hp(i,k) |
||
5208 |
! enddo |
||
5209 |
! enddo |
||
5210 |
do k=1,nl |
||
5211 |
do i=1,ncum |
||
5212 |
hp(i,k)=h(i,k) |
||
5213 |
enddo |
||
5214 |
enddo |
||
5215 |
|||
5216 |
IF (cvflag_ice) THEN |
||
5217 |
|||
5218 |
do k=minorig+1,nl |
||
5219 |
do i=1,ncum |
||
5220 |
if((k.ge.icb(i)).and.(k.le.inb(i)))then |
||
5221 |
hp(i, k) = hnk(i) + (lv(i,k)+(cpd-cpv)*t(i,k)+frac(i,k)*lf(i,k))* & |
||
5222 |
ep(i, k)*clw(i, k) |
||
5223 |
endif |
||
5224 |
enddo |
||
5225 |
enddo !do k=minorig+1,n |
||
5226 |
ELSE !IF (cvflag_ice) THEN |
||
5227 |
|||
5228 |
DO k = minorig + 1, nl |
||
5229 |
DO i = 1, ncum |
||
5230 |
IF ((k>=icb(i)) .AND. (k<=inb(i))) THEN |
||
5231 |
hp(i,k)=hnk(i)+(lv(i,k)+(cpd-cpv)*t(i,k))*ep(i,k)*clw(i,k) |
||
5232 |
endif |
||
5233 |
enddo |
||
5234 |
enddo !do k=minorig+1,n |
||
5235 |
|||
5236 |
ENDIF !IF (cvflag_ice) THEN |
||
5237 |
!write(*,*) 'cv3_routines check 4345' |
||
5238 |
! do i=1,ncum |
||
5239 |
! do k=1,nl |
||
5240 |
! if ((abs(hp_bak(i,k)-hp(i,k))/hp_bak(i,k).gt.1e-1).or. & |
||
5241 |
! ((abs(hp_bak(i,k)-hp(i,k))/hp_bak(i,k).gt.1e-4).and. & |
||
5242 |
! (ep(i,k)-ep_bak(i,k).lt.1e-4))) then |
||
5243 |
! write(*,*) 'i,k=',i,k |
||
5244 |
! write(*,*) 'coef_epmax_cape=',coef_epmax_cape |
||
5245 |
! write(*,*) 'epmax_diag(i)=',epmax_diag(i) |
||
5246 |
! write(*,*) 'ep(i,k)=',ep(i,k) |
||
5247 |
! write(*,*) 'ep_bak(i,k)=',ep_bak(i,k) |
||
5248 |
! write(*,*) 'hp(i,k)=',hp(i,k) |
||
5249 |
! write(*,*) 'hp_bak(i,k)=',hp_bak(i,k) |
||
5250 |
! write(*,*) 'h(i,k)=',h(i,k) |
||
5251 |
! write(*,*) 'nk(i)=',nk(i) |
||
5252 |
! write(*,*) 'h(i,nk(i))=',h(i,nk(i)) |
||
5253 |
! write(*,*) 'lv(i,k)=',lv(i,k) |
||
5254 |
! write(*,*) 't(i,k)=',t(i,k) |
||
5255 |
! write(*,*) 'clw(i,k)=',clw(i,k) |
||
5256 |
! write(*,*) 'cpd,cpv=',cpd,cpv |
||
5257 |
! stop |
||
5258 |
! endif |
||
5259 |
! enddo !do k=1,nl |
||
5260 |
! enddo !do i=1,ncum |
||
5261 |
endif !if (coef_epmax_cape.gt.1e-12) then |
||
5262 |
!write(*,*) 'cv3_routines check 4367' |
||
5263 |
|||
5264 |
144 |
return |
|
5265 |
end subroutine cv3_epmax_fn_cape |
||
5266 |
|||
5267 |
|||
5268 |
Generated by: GCOVR (Version 4.2) |