/[lmdze]/trunk/libf/phylmd/cv3_routines.f
ViewVC logotype

Contents of /trunk/libf/phylmd/cv3_routines.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3 - (show annotations)
Wed Feb 27 13:16:39 2008 UTC (16 years, 2 months ago) by guez
File size: 95973 byte(s)
Initial import
1 !
2 ! $Header: /home/cvsroot/LMDZ4/libf/phylmd/cv3_routines.F,v 1.5 2005/07/11 15:20:02 lmdzadmin Exp $
3 !
4 c
5 c
6 SUBROUTINE cv3_param(nd,delt)
7 use conema3_m
8 implicit none
9
10 c------------------------------------------------------------
11 c Set parameters for convectL for iflag_con = 3
12 c------------------------------------------------------------
13
14 C
15 C *** PBCRIT IS THE CRITICAL CLOUD DEPTH (MB) BENEATH WHICH THE ***
16 C *** PRECIPITATION EFFICIENCY IS ASSUMED TO BE ZERO ***
17 C *** PTCRIT IS THE CLOUD DEPTH (MB) ABOVE WHICH THE PRECIP. ***
18 C *** EFFICIENCY IS ASSUMED TO BE UNITY ***
19 C *** SIGD IS THE FRACTIONAL AREA COVERED BY UNSATURATED DNDRAFT ***
20 C *** SPFAC IS THE FRACTION OF PRECIPITATION FALLING OUTSIDE ***
21 C *** OF CLOUD ***
22 C
23 C [TAU: CHARACTERISTIC TIMESCALE USED TO COMPUTE ALPHA & BETA]
24 C *** ALPHA AND BETA ARE PARAMETERS THAT CONTROL THE RATE OF ***
25 C *** APPROACH TO QUASI-EQUILIBRIUM ***
26 C *** (THEIR STANDARD VALUES ARE 1.0 AND 0.96, RESPECTIVELY) ***
27 C *** (BETA MUST BE LESS THAN OR EQUAL TO 1) ***
28 C
29 C *** DTCRIT IS THE CRITICAL BUOYANCY (K) USED TO ADJUST THE ***
30 C *** APPROACH TO QUASI-EQUILIBRIUM ***
31 C *** IT MUST BE LESS THAN 0 ***
32
33 include "cvparam3.h"
34
35 integer nd
36 real delt ! timestep (seconds)
37
38 c noff: integer limit for convection (nd-noff)
39 c minorig: First level of convection
40
41 c -- limit levels for convection:
42
43 noff = 1
44 minorig = 1
45 nl=nd-noff
46 nlp=nl+1
47 nlm=nl-1
48
49 c -- "microphysical" parameters:
50
51 sigd = 0.01
52 spfac = 0.15
53 pbcrit = 150.0
54 ptcrit = 500.0
55 cIM cf. FH epmax = 0.993
56
57 omtrain = 45.0 ! used also for snow (no disctinction rain/snow)
58
59 c -- misc:
60
61 dtovsh = -0.2 ! dT for overshoot
62 dpbase = -40. ! definition cloud base (400m above LCL)
63 dttrig = 5. ! (loose) condition for triggering
64
65 c -- rate of approach to quasi-equilibrium:
66
67 dtcrit = -2.0
68 tau = 8000.
69 beta = 1.0 - delt/tau
70 alpha = 1.5E-3 * delt/tau
71 c increase alpha to compensate W decrease:
72 alpha = alpha*1.5
73
74 c -- interface cloud parameterization:
75
76 delta=0.01 ! cld
77
78 c -- interface with boundary-layer (gust factor): (sb)
79
80 betad=10.0 ! original value (from convect 4.3)
81
82 return
83 end
84
85 SUBROUTINE cv3_prelim(len,nd,ndp1,t,q,p,ph
86 : ,lv,cpn,tv,gz,h,hm,th)
87 implicit none
88
89 !=====================================================================
90 ! --- CALCULATE ARRAYS OF GEOPOTENTIAL, HEAT CAPACITY & STATIC ENERGY
91 ! "ori": from convect4.3 (vectorized)
92 ! "convect3": to be exactly consistent with convect3
93 !=====================================================================
94
95 c inputs:
96 integer len, nd, ndp1
97 real t(len,nd), q(len,nd), p(len,nd), ph(len,ndp1)
98
99 c outputs:
100 real lv(len,nd), cpn(len,nd), tv(len,nd)
101 real gz(len,nd), h(len,nd), hm(len,nd)
102 real th(len,nd)
103
104 c local variables:
105 integer k, i
106 real rdcp
107 real tvx,tvy ! convect3
108 real cpx(len,nd)
109
110 include "cvthermo.h"
111 include "cvparam3.h"
112
113
114 c ori do 110 k=1,nlp
115 do 110 k=1,nl ! convect3
116 do 100 i=1,len
117 cdebug lv(i,k)= lv0-clmcpv*(t(i,k)-t0)
118 lv(i,k)= lv0-clmcpv*(t(i,k)-273.15)
119 cpn(i,k)=cpd*(1.0-q(i,k))+cpv*q(i,k)
120 cpx(i,k)=cpd*(1.0-q(i,k))+cl*q(i,k)
121 c ori tv(i,k)=t(i,k)*(1.0+q(i,k)*epsim1)
122 tv(i,k)=t(i,k)*(1.0+q(i,k)/eps-q(i,k))
123 rdcp=(rrd*(1.-q(i,k))+q(i,k)*rrv)/cpn(i,k)
124 th(i,k)=t(i,k)*(1000.0/p(i,k))**rdcp
125 100 continue
126 110 continue
127 c
128 c gz = phi at the full levels (same as p).
129 c
130 do 120 i=1,len
131 gz(i,1)=0.0
132 120 continue
133 c ori do 140 k=2,nlp
134 do 140 k=2,nl ! convect3
135 do 130 i=1,len
136 tvx=t(i,k)*(1.+q(i,k)/eps-q(i,k)) !convect3
137 tvy=t(i,k-1)*(1.+q(i,k-1)/eps-q(i,k-1)) !convect3
138 gz(i,k)=gz(i,k-1)+0.5*rrd*(tvx+tvy) !convect3
139 & *(p(i,k-1)-p(i,k))/ph(i,k) !convect3
140
141 c ori gz(i,k)=gz(i,k-1)+hrd*(tv(i,k-1)+tv(i,k))
142 c ori & *(p(i,k-1)-p(i,k))/ph(i,k)
143 130 continue
144 140 continue
145 c
146 c h = phi + cpT (dry static energy).
147 c hm = phi + cp(T-Tbase)+Lq
148 c
149 c ori do 170 k=1,nlp
150 do 170 k=1,nl ! convect3
151 do 160 i=1,len
152 h(i,k)=gz(i,k)+cpn(i,k)*t(i,k)
153 hm(i,k)=gz(i,k)+cpx(i,k)*(t(i,k)-t(i,1))+lv(i,k)*q(i,k)
154 160 continue
155 170 continue
156
157 return
158 end
159
160 SUBROUTINE cv3_feed(len,nd,t,q,qs,p,ph,hm,gz
161 : ,nk,icb,icbmax,iflag,tnk,qnk,gznk,plcl)
162 implicit none
163
164 C================================================================
165 C Purpose: CONVECTIVE FEED
166 C
167 C Main differences with cv_feed:
168 C - ph added in input
169 C - here, nk(i)=minorig
170 C - icb defined differently (plcl compared with ph instead of p)
171 C
172 C Main differences with convect3:
173 C - we do not compute dplcldt and dplcldr of CLIFT anymore
174 C - values iflag different (but tests identical)
175 C - A,B explicitely defined (!...)
176 C================================================================
177
178 include "cvparam3.h"
179
180 c inputs:
181 integer len, nd
182 real t(len,nd), q(len,nd), qs(len,nd), p(len,nd)
183 real hm(len,nd), gz(len,nd)
184 real ph(len,nd+1)
185
186 c outputs:
187 integer iflag(len), nk(len), icb(len), icbmax
188 real tnk(len), qnk(len), gznk(len), plcl(len)
189
190 c local variables:
191 integer i, k
192 integer ihmin(len)
193 real work(len)
194 real pnk(len), qsnk(len), rh(len), chi(len)
195 real A, B ! convect3
196 cym
197 plcl=0.0
198 c@ !-------------------------------------------------------------------
199 c@ ! --- Find level of minimum moist static energy
200 c@ ! --- If level of minimum moist static energy coincides with
201 c@ ! --- or is lower than minimum allowable parcel origin level,
202 c@ ! --- set iflag to 6.
203 c@ !-------------------------------------------------------------------
204 c@
205 c@ do 180 i=1,len
206 c@ work(i)=1.0e12
207 c@ ihmin(i)=nl
208 c@ 180 continue
209 c@ do 200 k=2,nlp
210 c@ do 190 i=1,len
211 c@ if((hm(i,k).lt.work(i)).and.
212 c@ & (hm(i,k).lt.hm(i,k-1)))then
213 c@ work(i)=hm(i,k)
214 c@ ihmin(i)=k
215 c@ endif
216 c@ 190 continue
217 c@ 200 continue
218 c@ do 210 i=1,len
219 c@ ihmin(i)=min(ihmin(i),nlm)
220 c@ if(ihmin(i).le.minorig)then
221 c@ iflag(i)=6
222 c@ endif
223 c@ 210 continue
224 c@ c
225 c@ !-------------------------------------------------------------------
226 c@ ! --- Find that model level below the level of minimum moist static
227 c@ ! --- energy that has the maximum value of moist static energy
228 c@ !-------------------------------------------------------------------
229 c@
230 c@ do 220 i=1,len
231 c@ work(i)=hm(i,minorig)
232 c@ nk(i)=minorig
233 c@ 220 continue
234 c@ do 240 k=minorig+1,nl
235 c@ do 230 i=1,len
236 c@ if((hm(i,k).gt.work(i)).and.(k.le.ihmin(i)))then
237 c@ work(i)=hm(i,k)
238 c@ nk(i)=k
239 c@ endif
240 c@ 230 continue
241 c@ 240 continue
242
243 !-------------------------------------------------------------------
244 ! --- Origin level of ascending parcels for convect3:
245 !-------------------------------------------------------------------
246
247 do 220 i=1,len
248 nk(i)=minorig
249 220 continue
250
251 !-------------------------------------------------------------------
252 ! --- Check whether parcel level temperature and specific humidity
253 ! --- are reasonable
254 !-------------------------------------------------------------------
255 do 250 i=1,len
256 if( ( ( t(i,nk(i)).lt.250.0 )
257 & .or.( q(i,nk(i)).le.0.0 ) )
258 c@ & .or.( p(i,ihmin(i)).lt.400.0 ) )
259 & .and.
260 & ( iflag(i).eq.0) ) iflag(i)=7
261 250 continue
262 !-------------------------------------------------------------------
263 ! --- Calculate lifted condensation level of air at parcel origin level
264 ! --- (Within 0.2% of formula of Bolton, MON. WEA. REV.,1980)
265 !-------------------------------------------------------------------
266
267 A = 1669.0 ! convect3
268 B = 122.0 ! convect3
269
270 do 260 i=1,len
271
272 if (iflag(i).ne.7) then ! modif sb Jun7th 2002
273
274 tnk(i)=t(i,nk(i))
275 qnk(i)=q(i,nk(i))
276 gznk(i)=gz(i,nk(i))
277 pnk(i)=p(i,nk(i))
278 qsnk(i)=qs(i,nk(i))
279 c
280 rh(i)=qnk(i)/qsnk(i)
281 c ori rh(i)=min(1.0,rh(i)) ! removed for convect3
282 c ori chi(i)=tnk(i)/(1669.0-122.0*rh(i)-tnk(i))
283 chi(i)=tnk(i)/(A-B*rh(i)-tnk(i)) ! convect3
284 plcl(i)=pnk(i)*(rh(i)**chi(i))
285 if(((plcl(i).lt.200.0).or.(plcl(i).ge.2000.0))
286 & .and.(iflag(i).eq.0))iflag(i)=8
287
288 endif ! iflag=7
289
290 260 continue
291
292 !-------------------------------------------------------------------
293 ! --- Calculate first level above lcl (=icb)
294 !-------------------------------------------------------------------
295
296 c@ do 270 i=1,len
297 c@ icb(i)=nlm
298 c@ 270 continue
299 c@c
300 c@ do 290 k=minorig,nl
301 c@ do 280 i=1,len
302 c@ if((k.ge.(nk(i)+1)).and.(p(i,k).lt.plcl(i)))
303 c@ & icb(i)=min(icb(i),k)
304 c@ 280 continue
305 c@ 290 continue
306 c@c
307 c@ do 300 i=1,len
308 c@ if((icb(i).ge.nlm).and.(iflag(i).eq.0))iflag(i)=9
309 c@ 300 continue
310
311 do 270 i=1,len
312 icb(i)=nlm
313 270 continue
314 c
315 c la modification consiste a comparer plcl a ph et non a p:
316 c icb est defini par : ph(icb)<plcl<ph(icb-1)
317 c@ do 290 k=minorig,nl
318 do 290 k=3,nl-1 ! modif pour que icb soit sup/egal a 2
319 do 280 i=1,len
320 if( ph(i,k).lt.plcl(i) ) icb(i)=min(icb(i),k)
321 280 continue
322 290 continue
323 c
324 do 300 i=1,len
325 c@ if((icb(i).ge.nlm).and.(iflag(i).eq.0))iflag(i)=9
326 if((icb(i).eq.nlm).and.(iflag(i).eq.0))iflag(i)=9
327 300 continue
328
329 do 400 i=1,len
330 icb(i) = icb(i)-1 ! icb sup ou egal a 2
331 400 continue
332 c
333 c Compute icbmax.
334 c
335 icbmax=2
336 do 310 i=1,len
337 c! icbmax=max(icbmax,icb(i))
338 if (iflag(i).lt.7) icbmax=max(icbmax,icb(i)) ! sb Jun7th02
339 310 continue
340
341 return
342 end
343
344 SUBROUTINE cv3_undilute1(len,nd,t,q,qs,gz,plcl,p,nk,icb
345 : ,tp,tvp,clw,icbs)
346 implicit none
347
348 !----------------------------------------------------------------
349 ! Equivalent de TLIFT entre NK et ICB+1 inclus
350 !
351 ! Differences with convect4:
352 ! - specify plcl in input
353 ! - icbs is the first level above LCL (may differ from icb)
354 ! - in the iterations, used x(icbs) instead x(icb)
355 ! - many minor differences in the iterations
356 ! - tvp is computed in only one time
357 ! - icbs: first level above Plcl (IMIN de TLIFT) in output
358 ! - if icbs=icb, compute also tp(icb+1),tvp(icb+1) & clw(icb+1)
359 !----------------------------------------------------------------
360
361 include "cvthermo.h"
362 include "cvparam3.h"
363
364 c inputs:
365 integer len, nd
366 integer nk(len), icb(len)
367 real t(len,nd), q(len,nd), qs(len,nd), gz(len,nd)
368 real p(len,nd)
369 real plcl(len) ! convect3
370
371 c outputs:
372 real tp(len,nd), tvp(len,nd), clw(len,nd)
373
374 c local variables:
375 integer i, k
376 integer icb1(len), icbs(len), icbsmax2 ! convect3
377 real tg, qg, alv, s, ahg, tc, denom, es, rg
378 real ah0(len), cpp(len)
379 real tnk(len), qnk(len), gznk(len), ticb(len), gzicb(len)
380 real qsicb(len) ! convect3
381 real cpinv(len) ! convect3
382
383 !-------------------------------------------------------------------
384 ! --- Calculates the lifted parcel virtual temperature at nk,
385 ! --- the actual temperature, and the adiabatic
386 ! --- liquid water content. The procedure is to solve the equation.
387 ! cp*tp+L*qp+phi=cp*tnk+L*qnk+gznk.
388 !-------------------------------------------------------------------
389
390 do 320 i=1,len
391 tnk(i)=t(i,nk(i))
392 qnk(i)=q(i,nk(i))
393 gznk(i)=gz(i,nk(i))
394 c ori ticb(i)=t(i,icb(i))
395 c ori gzicb(i)=gz(i,icb(i))
396 320 continue
397 c
398 c *** Calculate certain parcel quantities, including static energy ***
399 c
400 do 330 i=1,len
401 ah0(i)=(cpd*(1.-qnk(i))+cl*qnk(i))*tnk(i)
402 & +qnk(i)*(lv0-clmcpv*(tnk(i)-273.15))+gznk(i)
403 cpp(i)=cpd*(1.-qnk(i))+qnk(i)*cpv
404 cpinv(i)=1./cpp(i)
405 330 continue
406 c
407 c *** Calculate lifted parcel quantities below cloud base ***
408 c
409 do i=1,len !convect3
410 icb1(i)=MAX(icb(i),2) !convect3
411 icb1(i)=MIN(icb(i),nl) !convect3
412 c if icb is below LCL, start loop at ICB+1:
413 c (icbs est le premier niveau au-dessus du LCL)
414 icbs(i)=icb1(i) !convect3
415 if (plcl(i).lt.p(i,icb1(i))) then
416 icbs(i)=MIN(icbs(i)+1,nl) !convect3
417 endif
418 enddo !convect3
419
420 do i=1,len !convect3
421 ticb(i)=t(i,icbs(i)) !convect3
422 gzicb(i)=gz(i,icbs(i)) !convect3
423 qsicb(i)=qs(i,icbs(i)) !convect3
424 enddo !convect3
425
426 c
427 c Re-compute icbsmax (icbsmax2): !convect3
428 c !convect3
429 icbsmax2=2 !convect3
430 do 310 i=1,len !convect3
431 icbsmax2=max(icbsmax2,icbs(i)) !convect3
432 310 continue !convect3
433
434 c initialization outputs:
435
436 do k=1,icbsmax2 ! convect3
437 do i=1,len ! convect3
438 tp(i,k) = 0.0 ! convect3
439 tvp(i,k) = 0.0 ! convect3
440 clw(i,k) = 0.0 ! convect3
441 enddo ! convect3
442 enddo ! convect3
443
444 c tp and tvp below cloud base:
445
446 do 350 k=minorig,icbsmax2-1
447 do 340 i=1,len
448 tp(i,k)=tnk(i)-(gz(i,k)-gznk(i))*cpinv(i)
449 tvp(i,k)=tp(i,k)*(1.+qnk(i)/eps-qnk(i)) !whole thing (convect3)
450 340 continue
451 350 continue
452 c
453 c *** Find lifted parcel quantities above cloud base ***
454 c
455 do 360 i=1,len
456 tg=ticb(i)
457 c ori qg=qs(i,icb(i))
458 qg=qsicb(i) ! convect3
459 cdebug alv=lv0-clmcpv*(ticb(i)-t0)
460 alv=lv0-clmcpv*(ticb(i)-273.15)
461 c
462 c First iteration.
463 c
464 c ori s=cpd+alv*alv*qg/(rrv*ticb(i)*ticb(i))
465 s=cpd*(1.-qnk(i))+cl*qnk(i) ! convect3
466 : +alv*alv*qg/(rrv*ticb(i)*ticb(i)) ! convect3
467 s=1./s
468 c ori ahg=cpd*tg+(cl-cpd)*qnk(i)*ticb(i)+alv*qg+gzicb(i)
469 ahg=cpd*tg+(cl-cpd)*qnk(i)*tg+alv*qg+gzicb(i) ! convect3
470 tg=tg+s*(ah0(i)-ahg)
471 c ori tg=max(tg,35.0)
472 cdebug tc=tg-t0
473 tc=tg-273.15
474 denom=243.5+tc
475 denom=MAX(denom,1.0) ! convect3
476 c ori if(tc.ge.0.0)then
477 es=6.112*exp(17.67*tc/denom)
478 c ori else
479 c ori es=exp(23.33086-6111.72784/tg+0.15215*log(tg))
480 c ori endif
481 c ori qg=eps*es/(p(i,icb(i))-es*(1.-eps))
482 qg=eps*es/(p(i,icbs(i))-es*(1.-eps))
483 c
484 c Second iteration.
485 c
486
487 c ori s=cpd+alv*alv*qg/(rrv*ticb(i)*ticb(i))
488 c ori s=1./s
489 c ori ahg=cpd*tg+(cl-cpd)*qnk(i)*ticb(i)+alv*qg+gzicb(i)
490 ahg=cpd*tg+(cl-cpd)*qnk(i)*tg+alv*qg+gzicb(i) ! convect3
491 tg=tg+s*(ah0(i)-ahg)
492 c ori tg=max(tg,35.0)
493 cdebug tc=tg-t0
494 tc=tg-273.15
495 denom=243.5+tc
496 denom=MAX(denom,1.0) ! convect3
497 c ori if(tc.ge.0.0)then
498 es=6.112*exp(17.67*tc/denom)
499 c ori else
500 c ori es=exp(23.33086-6111.72784/tg+0.15215*log(tg))
501 c ori end if
502 c ori qg=eps*es/(p(i,icb(i))-es*(1.-eps))
503 qg=eps*es/(p(i,icbs(i))-es*(1.-eps))
504
505 alv=lv0-clmcpv*(ticb(i)-273.15)
506
507 c ori c approximation here:
508 c ori tp(i,icb(i))=(ah0(i)-(cl-cpd)*qnk(i)*ticb(i)
509 c ori & -gz(i,icb(i))-alv*qg)/cpd
510
511 c convect3: no approximation:
512 tp(i,icbs(i))=(ah0(i)-gz(i,icbs(i))-alv*qg)
513 : /(cpd+(cl-cpd)*qnk(i))
514
515 c ori clw(i,icb(i))=qnk(i)-qg
516 c ori clw(i,icb(i))=max(0.0,clw(i,icb(i)))
517 clw(i,icbs(i))=qnk(i)-qg
518 clw(i,icbs(i))=max(0.0,clw(i,icbs(i)))
519
520 rg=qg/(1.-qnk(i))
521 c ori tvp(i,icb(i))=tp(i,icb(i))*(1.+rg*epsi)
522 c convect3: (qg utilise au lieu du vrai mixing ratio rg)
523 tvp(i,icbs(i))=tp(i,icbs(i))*(1.+qg/eps-qnk(i)) !whole thing
524
525 360 continue
526 c
527 c ori do 380 k=minorig,icbsmax2
528 c ori do 370 i=1,len
529 c ori tvp(i,k)=tvp(i,k)-tp(i,k)*qnk(i)
530 c ori 370 continue
531 c ori 380 continue
532 c
533
534 c -- The following is only for convect3:
535 c
536 c * icbs is the first level above the LCL:
537 c if plcl<p(icb), then icbs=icb+1
538 c if plcl>p(icb), then icbs=icb
539 c
540 c * the routine above computes tvp from minorig to icbs (included).
541 c
542 c * to compute buoybase (in cv3_trigger.F), both tvp(icb) and tvp(icb+1)
543 c must be known. This is the case if icbs=icb+1, but not if icbs=icb.
544 c
545 c * therefore, in the case icbs=icb, we compute tvp at level icb+1
546 c (tvp at other levels will be computed in cv3_undilute2.F)
547 c
548
549 do i=1,len
550 ticb(i)=t(i,icb(i)+1)
551 gzicb(i)=gz(i,icb(i)+1)
552 qsicb(i)=qs(i,icb(i)+1)
553 enddo
554
555 do 460 i=1,len
556 tg=ticb(i)
557 qg=qsicb(i) ! convect3
558 cdebug alv=lv0-clmcpv*(ticb(i)-t0)
559 alv=lv0-clmcpv*(ticb(i)-273.15)
560 c
561 c First iteration.
562 c
563 c ori s=cpd+alv*alv*qg/(rrv*ticb(i)*ticb(i))
564 s=cpd*(1.-qnk(i))+cl*qnk(i) ! convect3
565 : +alv*alv*qg/(rrv*ticb(i)*ticb(i)) ! convect3
566 s=1./s
567 c ori ahg=cpd*tg+(cl-cpd)*qnk(i)*ticb(i)+alv*qg+gzicb(i)
568 ahg=cpd*tg+(cl-cpd)*qnk(i)*tg+alv*qg+gzicb(i) ! convect3
569 tg=tg+s*(ah0(i)-ahg)
570 c ori tg=max(tg,35.0)
571 cdebug tc=tg-t0
572 tc=tg-273.15
573 denom=243.5+tc
574 denom=MAX(denom,1.0) ! convect3
575 c ori if(tc.ge.0.0)then
576 es=6.112*exp(17.67*tc/denom)
577 c ori else
578 c ori es=exp(23.33086-6111.72784/tg+0.15215*log(tg))
579 c ori endif
580 c ori qg=eps*es/(p(i,icb(i))-es*(1.-eps))
581 qg=eps*es/(p(i,icb(i)+1)-es*(1.-eps))
582 c
583 c Second iteration.
584 c
585
586 c ori s=cpd+alv*alv*qg/(rrv*ticb(i)*ticb(i))
587 c ori s=1./s
588 c ori ahg=cpd*tg+(cl-cpd)*qnk(i)*ticb(i)+alv*qg+gzicb(i)
589 ahg=cpd*tg+(cl-cpd)*qnk(i)*tg+alv*qg+gzicb(i) ! convect3
590 tg=tg+s*(ah0(i)-ahg)
591 c ori tg=max(tg,35.0)
592 cdebug tc=tg-t0
593 tc=tg-273.15
594 denom=243.5+tc
595 denom=MAX(denom,1.0) ! convect3
596 c ori if(tc.ge.0.0)then
597 es=6.112*exp(17.67*tc/denom)
598 c ori else
599 c ori es=exp(23.33086-6111.72784/tg+0.15215*log(tg))
600 c ori end if
601 c ori qg=eps*es/(p(i,icb(i))-es*(1.-eps))
602 qg=eps*es/(p(i,icb(i)+1)-es*(1.-eps))
603
604 alv=lv0-clmcpv*(ticb(i)-273.15)
605
606 c ori c approximation here:
607 c ori tp(i,icb(i))=(ah0(i)-(cl-cpd)*qnk(i)*ticb(i)
608 c ori & -gz(i,icb(i))-alv*qg)/cpd
609
610 c convect3: no approximation:
611 tp(i,icb(i)+1)=(ah0(i)-gz(i,icb(i)+1)-alv*qg)
612 : /(cpd+(cl-cpd)*qnk(i))
613
614 c ori clw(i,icb(i))=qnk(i)-qg
615 c ori clw(i,icb(i))=max(0.0,clw(i,icb(i)))
616 clw(i,icb(i)+1)=qnk(i)-qg
617 clw(i,icb(i)+1)=max(0.0,clw(i,icb(i)+1))
618
619 rg=qg/(1.-qnk(i))
620 c ori tvp(i,icb(i))=tp(i,icb(i))*(1.+rg*epsi)
621 c convect3: (qg utilise au lieu du vrai mixing ratio rg)
622 tvp(i,icb(i)+1)=tp(i,icb(i)+1)*(1.+qg/eps-qnk(i)) !whole thing
623
624 460 continue
625
626 return
627 end
628
629 SUBROUTINE cv3_trigger(len,nd,icb,plcl,p,th,tv,tvp
630 o ,pbase,buoybase,iflag,sig,w0)
631 implicit none
632
633 !-------------------------------------------------------------------
634 ! --- TRIGGERING
635 !
636 ! - computes the cloud base
637 ! - triggering (crude in this version)
638 ! - relaxation of sig and w0 when no convection
639 !
640 ! Caution1: if no convection, we set iflag=4
641 ! (it used to be 0 in convect3)
642 !
643 ! Caution2: at this stage, tvp (and thus buoy) are know up
644 ! through icb only!
645 ! -> the buoyancy below cloud base not (yet) set to the cloud base buoyancy
646 !-------------------------------------------------------------------
647
648 include "cvparam3.h"
649
650 c input:
651 integer len, nd
652 integer icb(len)
653 real plcl(len), p(len,nd)
654 real th(len,nd), tv(len,nd), tvp(len,nd)
655
656 c output:
657 real pbase(len), buoybase(len)
658
659 c input AND output:
660 integer iflag(len)
661 real sig(len,nd), w0(len,nd)
662
663 c local variables:
664 integer i,k
665 real tvpbase, tvbase, tdif, ath, ath1
666
667 c
668 c *** set cloud base buoyancy at (plcl+dpbase) level buoyancy
669 c
670 do 100 i=1,len
671 pbase(i) = plcl(i) + dpbase
672 tvpbase = tvp(i,icb(i))*(pbase(i)-p(i,icb(i)+1))
673 : /(p(i,icb(i))-p(i,icb(i)+1))
674 : + tvp(i,icb(i)+1)*(p(i,icb(i))-pbase(i))
675 : /(p(i,icb(i))-p(i,icb(i)+1))
676 tvbase = tv(i,icb(i))*(pbase(i)-p(i,icb(i)+1))
677 : /(p(i,icb(i))-p(i,icb(i)+1))
678 : + tv(i,icb(i)+1)*(p(i,icb(i))-pbase(i))
679 : /(p(i,icb(i))-p(i,icb(i)+1))
680 buoybase(i) = tvpbase - tvbase
681 100 continue
682
683 c
684 c *** make sure that column is dry adiabatic between the surface ***
685 c *** and cloud base, and that lifted air is positively buoyant ***
686 c *** at cloud base ***
687 c *** if not, return to calling program after resetting ***
688 c *** sig(i) and w0(i) ***
689 c
690
691 c oct3 do 200 i=1,len
692 c oct3
693 c oct3 tdif = buoybase(i)
694 c oct3 ath1 = th(i,1)
695 c oct3 ath = th(i,icb(i)-1) - dttrig
696 c oct3
697 c oct3 if (tdif.lt.dtcrit .or. ath.gt.ath1) then
698 c oct3 do 60 k=1,nl
699 c oct3 sig(i,k) = beta*sig(i,k) - 2.*alpha*tdif*tdif
700 c oct3 sig(i,k) = AMAX1(sig(i,k),0.0)
701 c oct3 w0(i,k) = beta*w0(i,k)
702 c oct3 60 continue
703 c oct3 iflag(i)=4 ! pour version vectorisee
704 c oct3c convect3 iflag(i)=0
705 c oct3cccc return
706 c oct3 endif
707 c oct3
708 c oct3200 continue
709
710 c -- oct3: on reecrit la boucle 200 (pour la vectorisation)
711
712 do 60 k=1,nl
713 do 200 i=1,len
714
715 tdif = buoybase(i)
716 ath1 = th(i,1)
717 ath = th(i,icb(i)-1) - dttrig
718
719 if (tdif.lt.dtcrit .or. ath.gt.ath1) then
720 sig(i,k) = beta*sig(i,k) - 2.*alpha*tdif*tdif
721 sig(i,k) = AMAX1(sig(i,k),0.0)
722 w0(i,k) = beta*w0(i,k)
723 iflag(i)=4 ! pour version vectorisee
724 c convect3 iflag(i)=0
725 endif
726
727 200 continue
728 60 continue
729
730 c fin oct3 --
731
732 return
733 end
734
735 SUBROUTINE cv3_compress( len,nloc,ncum,nd,ntra
736 : ,iflag1,nk1,icb1,icbs1
737 : ,plcl1,tnk1,qnk1,gznk1,pbase1,buoybase1
738 : ,t1,q1,qs1,u1,v1,gz1,th1
739 : ,tra1
740 : ,h1,lv1,cpn1,p1,ph1,tv1,tp1,tvp1,clw1
741 : ,sig1,w01
742 o ,iflag,nk,icb,icbs
743 o ,plcl,tnk,qnk,gznk,pbase,buoybase
744 o ,t,q,qs,u,v,gz,th
745 o ,tra
746 o ,h,lv,cpn,p,ph,tv,tp,tvp,clw
747 o ,sig,w0 )
748 implicit none
749
750 include "cvparam3.h"
751
752 c inputs:
753 integer len,ncum,nd,ntra,nloc
754 integer iflag1(len),nk1(len),icb1(len),icbs1(len)
755 real plcl1(len),tnk1(len),qnk1(len),gznk1(len)
756 real pbase1(len),buoybase1(len)
757 real t1(len,nd),q1(len,nd),qs1(len,nd),u1(len,nd),v1(len,nd)
758 real gz1(len,nd),h1(len,nd),lv1(len,nd),cpn1(len,nd)
759 real p1(len,nd),ph1(len,nd+1),tv1(len,nd),tp1(len,nd)
760 real tvp1(len,nd),clw1(len,nd)
761 real th1(len,nd)
762 real sig1(len,nd), w01(len,nd)
763 real, intent(in):: tra1(len,nd,ntra)
764
765 c outputs:
766 c en fait, on a nloc=len pour l'instant (cf cv_driver)
767 integer iflag(nloc),nk(nloc),icb(nloc),icbs(nloc)
768 real plcl(nloc),tnk(nloc),qnk(nloc),gznk(nloc)
769 real pbase(nloc),buoybase(nloc)
770 real t(nloc,nd),q(nloc,nd),qs(nloc,nd),u(nloc,nd),v(nloc,nd)
771 real gz(nloc,nd),h(nloc,nd),lv(nloc,nd),cpn(nloc,nd)
772 real p(nloc,nd),ph(nloc,nd+1),tv(nloc,nd),tp(nloc,nd)
773 real tvp(nloc,nd),clw(nloc,nd)
774 real th(nloc,nd)
775 real sig(nloc,nd), w0(nloc,nd)
776 real tra(nloc,nd,ntra)
777
778 c local variables:
779 integer i,k,nn,j
780
781
782 do 110 k=1,nl+1
783 nn=0
784 do 100 i=1,len
785 if(iflag1(i).eq.0)then
786 nn=nn+1
787 sig(nn,k)=sig1(i,k)
788 w0(nn,k)=w01(i,k)
789 t(nn,k)=t1(i,k)
790 q(nn,k)=q1(i,k)
791 qs(nn,k)=qs1(i,k)
792 u(nn,k)=u1(i,k)
793 v(nn,k)=v1(i,k)
794 gz(nn,k)=gz1(i,k)
795 h(nn,k)=h1(i,k)
796 lv(nn,k)=lv1(i,k)
797 cpn(nn,k)=cpn1(i,k)
798 p(nn,k)=p1(i,k)
799 ph(nn,k)=ph1(i,k)
800 tv(nn,k)=tv1(i,k)
801 tp(nn,k)=tp1(i,k)
802 tvp(nn,k)=tvp1(i,k)
803 clw(nn,k)=clw1(i,k)
804 th(nn,k)=th1(i,k)
805 endif
806 100 continue
807 110 continue
808
809 c do 121 j=1,ntra
810 c do 111 k=1,nd
811 c nn=0
812 c do 101 i=1,len
813 c if(iflag1(i).eq.0)then
814 c nn=nn+1
815 c tra(nn,k,j)=tra1(i,k,j)
816 c endif
817 c 101 continue
818 c 111 continue
819 c 121 continue
820
821 if (nn.ne.ncum) then
822 print*,'strange! nn not equal to ncum: ',nn,ncum
823 stop
824 endif
825
826 nn=0
827 do 150 i=1,len
828 if(iflag1(i).eq.0)then
829 nn=nn+1
830 pbase(nn)=pbase1(i)
831 buoybase(nn)=buoybase1(i)
832 plcl(nn)=plcl1(i)
833 tnk(nn)=tnk1(i)
834 qnk(nn)=qnk1(i)
835 gznk(nn)=gznk1(i)
836 nk(nn)=nk1(i)
837 icb(nn)=icb1(i)
838 icbs(nn)=icbs1(i)
839 iflag(nn)=iflag1(i)
840 endif
841 150 continue
842
843 return
844 end
845
846 SUBROUTINE cv3_undilute2(nloc,ncum,nd,icb,icbs,nk
847 : ,tnk,qnk,gznk,t,q,qs,gz
848 : ,p,h,tv,lv,pbase,buoybase,plcl
849 o ,inb,tp,tvp,clw,hp,ep,sigp,buoy)
850 use conema3_m
851 implicit none
852
853 C---------------------------------------------------------------------
854 C Purpose:
855 C FIND THE REST OF THE LIFTED PARCEL TEMPERATURES
856 C &
857 C COMPUTE THE PRECIPITATION EFFICIENCIES AND THE
858 C FRACTION OF PRECIPITATION FALLING OUTSIDE OF CLOUD
859 C &
860 C FIND THE LEVEL OF NEUTRAL BUOYANCY
861 C
862 C Main differences convect3/convect4:
863 C - icbs (input) is the first level above LCL (may differ from icb)
864 C - many minor differences in the iterations
865 C - condensed water not removed from tvp in convect3
866 C - vertical profile of buoyancy computed here (use of buoybase)
867 C - the determination of inb is different
868 C - no inb1, only inb in output
869 C---------------------------------------------------------------------
870
871 include "cvthermo.h"
872 include "cvparam3.h"
873
874 c inputs:
875 integer ncum, nd, nloc
876 integer icb(nloc), icbs(nloc), nk(nloc)
877 real t(nloc,nd), q(nloc,nd), qs(nloc,nd), gz(nloc,nd)
878 real p(nloc,nd)
879 real tnk(nloc), qnk(nloc), gznk(nloc)
880 real lv(nloc,nd), tv(nloc,nd), h(nloc,nd)
881 real pbase(nloc), buoybase(nloc), plcl(nloc)
882
883 c outputs:
884 integer inb(nloc)
885 real tp(nloc,nd), tvp(nloc,nd), clw(nloc,nd)
886 real ep(nloc,nd), sigp(nloc,nd), hp(nloc,nd)
887 real buoy(nloc,nd)
888
889 c local variables:
890 integer i, k
891 real tg,qg,ahg,alv,s,tc,es,denom,rg,tca,elacrit
892 real by, defrac, pden
893 real ah0(nloc), cape(nloc), capem(nloc), byp(nloc)
894 logical lcape(nloc)
895
896 !=====================================================================
897 ! --- SOME INITIALIZATIONS
898 !=====================================================================
899
900 do 170 k=1,nl
901 do 160 i=1,ncum
902 ep(i,k)=0.0
903 sigp(i,k)=spfac
904 160 continue
905 170 continue
906
907 !=====================================================================
908 ! --- FIND THE REST OF THE LIFTED PARCEL TEMPERATURES
909 !=====================================================================
910 c
911 c --- The procedure is to solve the equation.
912 c cp*tp+L*qp+phi=cp*tnk+L*qnk+gznk.
913 c
914 c *** Calculate certain parcel quantities, including static energy ***
915 c
916 c
917 do 240 i=1,ncum
918 ah0(i)=(cpd*(1.-qnk(i))+cl*qnk(i))*tnk(i)
919 cdebug & +qnk(i)*(lv0-clmcpv*(tnk(i)-t0))+gznk(i)
920 & +qnk(i)*(lv0-clmcpv*(tnk(i)-273.15))+gznk(i)
921 240 continue
922 c
923 c
924 c *** Find lifted parcel quantities above cloud base ***
925 c
926 c
927 do 300 k=minorig+1,nl
928 do 290 i=1,ncum
929 c ori if(k.ge.(icb(i)+1))then
930 if(k.ge.(icbs(i)+1))then ! convect3
931 tg=t(i,k)
932 qg=qs(i,k)
933 cdebug alv=lv0-clmcpv*(t(i,k)-t0)
934 alv=lv0-clmcpv*(t(i,k)-273.15)
935 c
936 c First iteration.
937 c
938 c ori s=cpd+alv*alv*qg/(rrv*t(i,k)*t(i,k))
939 s=cpd*(1.-qnk(i))+cl*qnk(i) ! convect3
940 : +alv*alv*qg/(rrv*t(i,k)*t(i,k)) ! convect3
941 s=1./s
942 c ori ahg=cpd*tg+(cl-cpd)*qnk(i)*t(i,k)+alv*qg+gz(i,k)
943 ahg=cpd*tg+(cl-cpd)*qnk(i)*tg+alv*qg+gz(i,k) ! convect3
944 tg=tg+s*(ah0(i)-ahg)
945 c ori tg=max(tg,35.0)
946 cdebug tc=tg-t0
947 tc=tg-273.15
948 denom=243.5+tc
949 denom=MAX(denom,1.0) ! convect3
950 c ori if(tc.ge.0.0)then
951 es=6.112*exp(17.67*tc/denom)
952 c ori else
953 c ori es=exp(23.33086-6111.72784/tg+0.15215*log(tg))
954 c ori endif
955 qg=eps*es/(p(i,k)-es*(1.-eps))
956 c
957 c Second iteration.
958 c
959 c ori s=cpd+alv*alv*qg/(rrv*t(i,k)*t(i,k))
960 c ori s=1./s
961 c ori ahg=cpd*tg+(cl-cpd)*qnk(i)*t(i,k)+alv*qg+gz(i,k)
962 ahg=cpd*tg+(cl-cpd)*qnk(i)*tg+alv*qg+gz(i,k) ! convect3
963 tg=tg+s*(ah0(i)-ahg)
964 c ori tg=max(tg,35.0)
965 cdebug tc=tg-t0
966 tc=tg-273.15
967 denom=243.5+tc
968 denom=MAX(denom,1.0) ! convect3
969 c ori if(tc.ge.0.0)then
970 es=6.112*exp(17.67*tc/denom)
971 c ori else
972 c ori es=exp(23.33086-6111.72784/tg+0.15215*log(tg))
973 c ori endif
974 qg=eps*es/(p(i,k)-es*(1.-eps))
975 c
976 cdebug alv=lv0-clmcpv*(t(i,k)-t0)
977 alv=lv0-clmcpv*(t(i,k)-273.15)
978 c print*,'cpd dans convect2 ',cpd
979 c print*,'tp(i,k),ah0(i),cl,cpd,qnk(i),t(i,k),gz(i,k),alv,qg,cpd'
980 c print*,tp(i,k),ah0(i),cl,cpd,qnk(i),t(i,k),gz(i,k),alv,qg,cpd
981
982 c ori c approximation here:
983 c ori tp(i,k)=(ah0(i)-(cl-cpd)*qnk(i)*t(i,k)-gz(i,k)-alv*qg)/cpd
984
985 c convect3: no approximation:
986 tp(i,k)=(ah0(i)-gz(i,k)-alv*qg)/(cpd+(cl-cpd)*qnk(i))
987
988 clw(i,k)=qnk(i)-qg
989 clw(i,k)=max(0.0,clw(i,k))
990 rg=qg/(1.-qnk(i))
991 c ori tvp(i,k)=tp(i,k)*(1.+rg*epsi)
992 c convect3: (qg utilise au lieu du vrai mixing ratio rg):
993 tvp(i,k)=tp(i,k)*(1.+qg/eps-qnk(i)) ! whole thing
994 endif
995 290 continue
996 300 continue
997 c
998 !=====================================================================
999 ! --- SET THE PRECIPITATION EFFICIENCIES AND THE FRACTION OF
1000 ! --- PRECIPITATION FALLING OUTSIDE OF CLOUD
1001 ! --- THESE MAY BE FUNCTIONS OF TP(I), P(I) AND CLW(I)
1002 !=====================================================================
1003 c
1004 c ori do 320 k=minorig+1,nl
1005 do 320 k=1,nl ! convect3
1006 do 310 i=1,ncum
1007 pden=ptcrit-pbcrit
1008 ep(i,k)=(plcl(i)-p(i,k)-pbcrit)/pden*epmax
1009 ep(i,k)=amax1(ep(i,k),0.0)
1010 ep(i,k)=amin1(ep(i,k),epmax)
1011 sigp(i,k)=spfac
1012 c ori if(k.ge.(nk(i)+1))then
1013 c ori tca=tp(i,k)-t0
1014 c ori if(tca.ge.0.0)then
1015 c ori elacrit=elcrit
1016 c ori else
1017 c ori elacrit=elcrit*(1.0-tca/tlcrit)
1018 c ori endif
1019 c ori elacrit=max(elacrit,0.0)
1020 c ori ep(i,k)=1.0-elacrit/max(clw(i,k),1.0e-8)
1021 c ori ep(i,k)=max(ep(i,k),0.0 )
1022 c ori ep(i,k)=min(ep(i,k),1.0 )
1023 c ori sigp(i,k)=sigs
1024 c ori endif
1025 310 continue
1026 320 continue
1027 c
1028 !=====================================================================
1029 ! --- CALCULATE VIRTUAL TEMPERATURE AND LIFTED PARCEL
1030 ! --- VIRTUAL TEMPERATURE
1031 !=====================================================================
1032 c
1033 c dans convect3, tvp est calcule en une seule fois, et sans retirer
1034 c l'eau condensee (~> reversible CAPE)
1035 c
1036 c ori do 340 k=minorig+1,nl
1037 c ori do 330 i=1,ncum
1038 c ori if(k.ge.(icb(i)+1))then
1039 c ori tvp(i,k)=tvp(i,k)*(1.0-qnk(i)+ep(i,k)*clw(i,k))
1040 c oric print*,'i,k,tvp(i,k),qnk(i),ep(i,k),clw(i,k)'
1041 c oric print*, i,k,tvp(i,k),qnk(i),ep(i,k),clw(i,k)
1042 c ori endif
1043 c ori 330 continue
1044 c ori 340 continue
1045
1046 c ori do 350 i=1,ncum
1047 c ori tvp(i,nlp)=tvp(i,nl)-(gz(i,nlp)-gz(i,nl))/cpd
1048 c ori 350 continue
1049
1050 do 350 i=1,ncum ! convect3
1051 tp(i,nlp)=tp(i,nl) ! convect3
1052 350 continue ! convect3
1053 c
1054 c=====================================================================
1055 c --- EFFECTIVE VERTICAL PROFILE OF BUOYANCY (convect3 only):
1056 c=====================================================================
1057
1058 c-- this is for convect3 only:
1059
1060 c first estimate of buoyancy:
1061
1062 do 500 i=1,ncum
1063 do 501 k=1,nl
1064 buoy(i,k)=tvp(i,k)-tv(i,k)
1065 501 continue
1066 500 continue
1067
1068 c set buoyancy=buoybase for all levels below base
1069 c for safety, set buoy(icb)=buoybase
1070
1071 do 505 i=1,ncum
1072 do 506 k=1,nl
1073 if((k.ge.icb(i)).and.(k.le.nl).and.(p(i,k).ge.pbase(i)))then
1074 buoy(i,k)=buoybase(i)
1075 endif
1076 506 continue
1077 buoy(icb(i),k)=buoybase(i)
1078 505 continue
1079
1080 c-- end convect3
1081
1082 c=====================================================================
1083 c --- FIND THE FIRST MODEL LEVEL (INB) ABOVE THE PARCEL'S
1084 c --- LEVEL OF NEUTRAL BUOYANCY
1085 c=====================================================================
1086 c
1087 c-- this is for convect3 only:
1088
1089 do 510 i=1,ncum
1090 inb(i)=nl-1
1091 510 continue
1092
1093 do 530 i=1,ncum
1094 do 535 k=1,nl-1
1095 if ((k.ge.icb(i)).and.(buoy(i,k).lt.dtovsh)) then
1096 inb(i)=MIN(inb(i),k)
1097 endif
1098 535 continue
1099 530 continue
1100
1101 c-- end convect3
1102
1103 c ori do 510 i=1,ncum
1104 c ori cape(i)=0.0
1105 c ori capem(i)=0.0
1106 c ori inb(i)=icb(i)+1
1107 c ori inb1(i)=inb(i)
1108 c ori 510 continue
1109 c
1110 c Originial Code
1111 c
1112 c do 530 k=minorig+1,nl-1
1113 c do 520 i=1,ncum
1114 c if(k.ge.(icb(i)+1))then
1115 c by=(tvp(i,k)-tv(i,k))*dph(i,k)/p(i,k)
1116 c byp=(tvp(i,k+1)-tv(i,k+1))*dph(i,k+1)/p(i,k+1)
1117 c cape(i)=cape(i)+by
1118 c if(by.ge.0.0)inb1(i)=k+1
1119 c if(cape(i).gt.0.0)then
1120 c inb(i)=k+1
1121 c capem(i)=cape(i)
1122 c endif
1123 c endif
1124 c520 continue
1125 c530 continue
1126 c do 540 i=1,ncum
1127 c byp=(tvp(i,nl)-tv(i,nl))*dph(i,nl)/p(i,nl)
1128 c cape(i)=capem(i)+byp
1129 c defrac=capem(i)-cape(i)
1130 c defrac=max(defrac,0.001)
1131 c frac(i)=-cape(i)/defrac
1132 c frac(i)=min(frac(i),1.0)
1133 c frac(i)=max(frac(i),0.0)
1134 c540 continue
1135 c
1136 c K Emanuel fix
1137 c
1138 c call zilch(byp,ncum)
1139 c do 530 k=minorig+1,nl-1
1140 c do 520 i=1,ncum
1141 c if(k.ge.(icb(i)+1))then
1142 c by=(tvp(i,k)-tv(i,k))*dph(i,k)/p(i,k)
1143 c cape(i)=cape(i)+by
1144 c if(by.ge.0.0)inb1(i)=k+1
1145 c if(cape(i).gt.0.0)then
1146 c inb(i)=k+1
1147 c capem(i)=cape(i)
1148 c byp(i)=(tvp(i,k+1)-tv(i,k+1))*dph(i,k+1)/p(i,k+1)
1149 c endif
1150 c endif
1151 c520 continue
1152 c530 continue
1153 c do 540 i=1,ncum
1154 c inb(i)=max(inb(i),inb1(i))
1155 c cape(i)=capem(i)+byp(i)
1156 c defrac=capem(i)-cape(i)
1157 c defrac=max(defrac,0.001)
1158 c frac(i)=-cape(i)/defrac
1159 c frac(i)=min(frac(i),1.0)
1160 c frac(i)=max(frac(i),0.0)
1161 c540 continue
1162 c
1163 c J Teixeira fix
1164 c
1165 c ori call zilch(byp,ncum)
1166 c ori do 515 i=1,ncum
1167 c ori lcape(i)=.true.
1168 c ori 515 continue
1169 c ori do 530 k=minorig+1,nl-1
1170 c ori do 520 i=1,ncum
1171 c ori if(cape(i).lt.0.0)lcape(i)=.false.
1172 c ori if((k.ge.(icb(i)+1)).and.lcape(i))then
1173 c ori by=(tvp(i,k)-tv(i,k))*dph(i,k)/p(i,k)
1174 c ori byp(i)=(tvp(i,k+1)-tv(i,k+1))*dph(i,k+1)/p(i,k+1)
1175 c ori cape(i)=cape(i)+by
1176 c ori if(by.ge.0.0)inb1(i)=k+1
1177 c ori if(cape(i).gt.0.0)then
1178 c ori inb(i)=k+1
1179 c ori capem(i)=cape(i)
1180 c ori endif
1181 c ori endif
1182 c ori 520 continue
1183 c ori 530 continue
1184 c ori do 540 i=1,ncum
1185 c ori cape(i)=capem(i)+byp(i)
1186 c ori defrac=capem(i)-cape(i)
1187 c ori defrac=max(defrac,0.001)
1188 c ori frac(i)=-cape(i)/defrac
1189 c ori frac(i)=min(frac(i),1.0)
1190 c ori frac(i)=max(frac(i),0.0)
1191 c ori 540 continue
1192 c
1193 c=====================================================================
1194 c --- CALCULATE LIQUID WATER STATIC ENERGY OF LIFTED PARCEL
1195 c=====================================================================
1196 c
1197 cym do i=1,ncum*nlp
1198 cym hp(i,1)=h(i,1)
1199 cym enddo
1200
1201 do k=1,nlp
1202 do i=1,ncum
1203 hp(i,k)=h(i,k)
1204 enddo
1205 enddo
1206
1207 do 600 k=minorig+1,nl
1208 do 590 i=1,ncum
1209 if((k.ge.icb(i)).and.(k.le.inb(i)))then
1210 hp(i,k)=h(i,nk(i))+(lv(i,k)+(cpd-cpv)*t(i,k))*ep(i,k)*clw(i,k)
1211 endif
1212 590 continue
1213 600 continue
1214
1215 return
1216 end
1217
1218 SUBROUTINE cv3_closure(nloc,ncum,nd,icb,inb
1219 : ,pbase,p,ph,tv,buoy
1220 o ,sig,w0,cape,m)
1221 implicit none
1222
1223 !===================================================================
1224 ! --- CLOSURE OF CONVECT3
1225 !
1226 ! vectorization: S. Bony
1227 !===================================================================
1228
1229 include "cvthermo.h"
1230 include "cvparam3.h"
1231
1232 c input:
1233 integer ncum, nd, nloc
1234 integer icb(nloc), inb(nloc)
1235 real pbase(nloc)
1236 real p(nloc,nd), ph(nloc,nd+1)
1237 real tv(nloc,nd), buoy(nloc,nd)
1238
1239 c input/output:
1240 real sig(nloc,nd), w0(nloc,nd)
1241
1242 c output:
1243 real cape(nloc)
1244 real m(nloc,nd)
1245
1246 c local variables:
1247 integer i, j, k, icbmax
1248 real deltap, fac, w, amu
1249 real dtmin(nloc,nd), sigold(nloc,nd)
1250
1251
1252 c -------------------------------------------------------
1253 c -- Initialization
1254 c -------------------------------------------------------
1255
1256 do k=1,nl
1257 do i=1,ncum
1258 m(i,k)=0.0
1259 enddo
1260 enddo
1261
1262 c -------------------------------------------------------
1263 c -- Reset sig(i) and w0(i) for i>inb and i<icb
1264 c -------------------------------------------------------
1265
1266 c update sig and w0 above LNB:
1267
1268 do 100 k=1,nl-1
1269 do 110 i=1,ncum
1270 if ((inb(i).lt.(nl-1)).and.(k.ge.(inb(i)+1)))then
1271 sig(i,k)=beta*sig(i,k)
1272 : +2.*alpha*buoy(i,inb(i))*ABS(buoy(i,inb(i)))
1273 sig(i,k)=AMAX1(sig(i,k),0.0)
1274 w0(i,k)=beta*w0(i,k)
1275 endif
1276 110 continue
1277 100 continue
1278
1279 c compute icbmax:
1280
1281 icbmax=2
1282 do 200 i=1,ncum
1283 icbmax=MAX(icbmax,icb(i))
1284 200 continue
1285
1286 c update sig and w0 below cloud base:
1287
1288 do 300 k=1,icbmax
1289 do 310 i=1,ncum
1290 if (k.le.icb(i))then
1291 sig(i,k)=beta*sig(i,k)-2.*alpha*buoy(i,icb(i))*buoy(i,icb(i))
1292 sig(i,k)=amax1(sig(i,k),0.0)
1293 w0(i,k)=beta*w0(i,k)
1294 endif
1295 310 continue
1296 300 continue
1297
1298 c! if(inb.lt.(nl-1))then
1299 c! do 85 i=inb+1,nl-1
1300 c! sig(i)=beta*sig(i)+2.*alpha*buoy(inb)*
1301 c! 1 abs(buoy(inb))
1302 c! sig(i)=amax1(sig(i),0.0)
1303 c! w0(i)=beta*w0(i)
1304 c! 85 continue
1305 c! end if
1306
1307 c! do 87 i=1,icb
1308 c! sig(i)=beta*sig(i)-2.*alpha*buoy(icb)*buoy(icb)
1309 c! sig(i)=amax1(sig(i),0.0)
1310 c! w0(i)=beta*w0(i)
1311 c! 87 continue
1312
1313 c -------------------------------------------------------------
1314 c -- Reset fractional areas of updrafts and w0 at initial time
1315 c -- and after 10 time steps of no convection
1316 c -------------------------------------------------------------
1317
1318 do 400 k=1,nl-1
1319 do 410 i=1,ncum
1320 if (sig(i,nd).lt.1.5.or.sig(i,nd).gt.12.0)then
1321 sig(i,k)=0.0
1322 w0(i,k)=0.0
1323 endif
1324 410 continue
1325 400 continue
1326
1327 c -------------------------------------------------------------
1328 c -- Calculate convective available potential energy (cape),
1329 c -- vertical velocity (w), fractional area covered by
1330 c -- undilute updraft (sig), and updraft mass flux (m)
1331 c -------------------------------------------------------------
1332
1333 do 500 i=1,ncum
1334 cape(i)=0.0
1335 500 continue
1336
1337 c compute dtmin (minimum buoyancy between ICB and given level k):
1338
1339 do i=1,ncum
1340 do k=1,nl
1341 dtmin(i,k)=100.0
1342 enddo
1343 enddo
1344
1345 do 550 i=1,ncum
1346 do 560 k=1,nl
1347 do 570 j=minorig,nl
1348 if ( (k.ge.(icb(i)+1)).and.(k.le.inb(i)).and.
1349 : (j.ge.icb(i)).and.(j.le.(k-1)) )then
1350 dtmin(i,k)=AMIN1(dtmin(i,k),buoy(i,j))
1351 endif
1352 570 continue
1353 560 continue
1354 550 continue
1355
1356 c the interval on which cape is computed starts at pbase :
1357
1358 do 600 k=1,nl
1359 do 610 i=1,ncum
1360
1361 if ((k.ge.(icb(i)+1)).and.(k.le.inb(i))) then
1362
1363 deltap = MIN(pbase(i),ph(i,k-1))-MIN(pbase(i),ph(i,k))
1364 cape(i)=cape(i)+rrd*buoy(i,k-1)*deltap/p(i,k-1)
1365 cape(i)=AMAX1(0.0,cape(i))
1366 sigold(i,k)=sig(i,k)
1367
1368 c dtmin(i,k)=100.0
1369 c do 97 j=icb(i),k-1 ! mauvaise vectorisation
1370 c dtmin(i,k)=AMIN1(dtmin(i,k),buoy(i,j))
1371 c 97 continue
1372
1373 sig(i,k)=beta*sig(i,k)+alpha*dtmin(i,k)*ABS(dtmin(i,k))
1374 sig(i,k)=amax1(sig(i,k),0.0)
1375 sig(i,k)=amin1(sig(i,k),0.01)
1376 fac=AMIN1(((dtcrit-dtmin(i,k))/dtcrit),1.0)
1377 w=(1.-beta)*fac*SQRT(cape(i))+beta*w0(i,k)
1378 amu=0.5*(sig(i,k)+sigold(i,k))*w
1379 m(i,k)=amu*0.007*p(i,k)*(ph(i,k)-ph(i,k+1))/tv(i,k)
1380 w0(i,k)=w
1381 endif
1382
1383 610 continue
1384 600 continue
1385
1386 do 700 i=1,ncum
1387 w0(i,icb(i))=0.5*w0(i,icb(i)+1)
1388 m(i,icb(i))=0.5*m(i,icb(i)+1)
1389 : *(ph(i,icb(i))-ph(i,icb(i)+1))
1390 : /(ph(i,icb(i)+1)-ph(i,icb(i)+2))
1391 sig(i,icb(i))=sig(i,icb(i)+1)
1392 sig(i,icb(i)-1)=sig(i,icb(i))
1393 700 continue
1394
1395
1396 c! cape=0.0
1397 c! do 98 i=icb+1,inb
1398 c! deltap = min(pbase,ph(i-1))-min(pbase,ph(i))
1399 c! cape=cape+rrd*buoy(i-1)*deltap/p(i-1)
1400 c! dcape=rrd*buoy(i-1)*deltap/p(i-1)
1401 c! dlnp=deltap/p(i-1)
1402 c! cape=amax1(0.0,cape)
1403 c! sigold=sig(i)
1404
1405 c! dtmin=100.0
1406 c! do 97 j=icb,i-1
1407 c! dtmin=amin1(dtmin,buoy(j))
1408 c! 97 continue
1409
1410 c! sig(i)=beta*sig(i)+alpha*dtmin*abs(dtmin)
1411 c! sig(i)=amax1(sig(i),0.0)
1412 c! sig(i)=amin1(sig(i),0.01)
1413 c! fac=amin1(((dtcrit-dtmin)/dtcrit),1.0)
1414 c! w=(1.-beta)*fac*sqrt(cape)+beta*w0(i)
1415 c! amu=0.5*(sig(i)+sigold)*w
1416 c! m(i)=amu*0.007*p(i)*(ph(i)-ph(i+1))/tv(i)
1417 c! w0(i)=w
1418 c! 98 continue
1419 c! w0(icb)=0.5*w0(icb+1)
1420 c! m(icb)=0.5*m(icb+1)*(ph(icb)-ph(icb+1))/(ph(icb+1)-ph(icb+2))
1421 c! sig(icb)=sig(icb+1)
1422 c! sig(icb-1)=sig(icb)
1423
1424 return
1425 end
1426
1427 SUBROUTINE cv3_mixing(nloc,ncum,nd,na,ntra,icb,nk,inb
1428 : ,ph,t,rr,rs,u,v,tra,h,lv,qnk
1429 : ,hp,tv,tvp,ep,clw,m,sig
1430 : ,ment,qent,uent,vent,sij,elij,ments,qents,traent)
1431 implicit none
1432
1433 !---------------------------------------------------------------------
1434 ! a faire:
1435 ! - changer rr(il,1) -> qnk(il)
1436 ! - vectorisation de la partie normalisation des flux (do 789...)
1437 !---------------------------------------------------------------------
1438
1439 include "cvthermo.h"
1440 include "cvparam3.h"
1441
1442 c inputs:
1443 integer ncum, nd, na, ntra, nloc
1444 integer icb(nloc), inb(nloc), nk(nloc)
1445 real sig(nloc,nd)
1446 real qnk(nloc)
1447 real ph(nloc,nd+1)
1448 real t(nloc,nd), rr(nloc,nd), rs(nloc,nd)
1449 real u(nloc,nd), v(nloc,nd)
1450 real tra(nloc,nd,ntra) ! input of convect3
1451 real lv(nloc,na), h(nloc,na), hp(nloc,na)
1452 real tv(nloc,na), tvp(nloc,na), ep(nloc,na), clw(nloc,na)
1453 real m(nloc,na) ! input of convect3
1454
1455 c outputs:
1456 real ment(nloc,na,na), qent(nloc,na,na)
1457 real uent(nloc,na,na), vent(nloc,na,na)
1458 real sij(nloc,na,na), elij(nloc,na,na)
1459 real traent(nloc,nd,nd,ntra)
1460 real ments(nloc,nd,nd), qents(nloc,nd,nd)
1461 real sigij(nloc,nd,nd)
1462
1463 c local variables:
1464 integer i, j, k, il, im, jm
1465 integer num1, num2
1466 integer nent(nloc,na)
1467 real rti, bf2, anum, denom, dei, altem, cwat, stemp, qp
1468 real alt, smid, sjmin, sjmax, delp, delm
1469 real asij(nloc), smax(nloc), scrit(nloc)
1470 real asum(nloc,nd),bsum(nloc,nd),csum(nloc,nd)
1471 real wgh
1472 real zm(nloc,na)
1473 logical lwork(nloc)
1474
1475 c=====================================================================
1476 c --- INITIALIZE VARIOUS ARRAYS USED IN THE COMPUTATIONS
1477 c=====================================================================
1478
1479 c ori do 360 i=1,ncum*nlp
1480 do 361 j=1,nl
1481 do 360 i=1,ncum
1482 nent(i,j)=0
1483 c in convect3, m is computed in cv3_closure
1484 c ori m(i,1)=0.0
1485 360 continue
1486 361 continue
1487
1488 c ori do 400 k=1,nlp
1489 c ori do 390 j=1,nlp
1490 do 400 j=1,nl
1491 do 390 k=1,nl
1492 do 385 i=1,ncum
1493 qent(i,k,j)=rr(i,j)
1494 uent(i,k,j)=u(i,j)
1495 vent(i,k,j)=v(i,j)
1496 elij(i,k,j)=0.0
1497 cym ment(i,k,j)=0.0
1498 cym sij(i,k,j)=0.0
1499 385 continue
1500 390 continue
1501 400 continue
1502
1503 cym
1504 ment(1:ncum,1:nd,1:nd)=0.0
1505 sij(1:ncum,1:nd,1:nd)=0.0
1506
1507 c do k=1,ntra
1508 c do j=1,nd ! instead nlp
1509 c do i=1,nd ! instead nlp
1510 c do il=1,ncum
1511 c traent(il,i,j,k)=tra(il,j,k)
1512 c enddo
1513 c enddo
1514 c enddo
1515 c enddo
1516 zm(:,:)=0.
1517
1518 c=====================================================================
1519 c --- CALCULATE ENTRAINED AIR MASS FLUX (ment), TOTAL WATER MIXING
1520 c --- RATIO (QENT), TOTAL CONDENSED WATER (elij), AND MIXING
1521 c --- FRACTION (sij)
1522 c=====================================================================
1523
1524 do 750 i=minorig+1, nl
1525
1526 do 710 j=minorig,nl
1527 do 700 il=1,ncum
1528 if( (i.ge.icb(il)).and.(i.le.inb(il)).and.
1529 : (j.ge.(icb(il)-1)).and.(j.le.inb(il)))then
1530
1531 rti=rr(il,1)-ep(il,i)*clw(il,i)
1532 bf2=1.+lv(il,j)*lv(il,j)*rs(il,j)/(rrv*t(il,j)*t(il,j)*cpd)
1533 anum=h(il,j)-hp(il,i)+(cpv-cpd)*t(il,j)*(rti-rr(il,j))
1534 denom=h(il,i)-hp(il,i)+(cpd-cpv)*(rr(il,i)-rti)*t(il,j)
1535 dei=denom
1536 if(abs(dei).lt.0.01)dei=0.01
1537 sij(il,i,j)=anum/dei
1538 sij(il,i,i)=1.0
1539 altem=sij(il,i,j)*rr(il,i)+(1.-sij(il,i,j))*rti-rs(il,j)
1540 altem=altem/bf2
1541 cwat=clw(il,j)*(1.-ep(il,j))
1542 stemp=sij(il,i,j)
1543 if((stemp.lt.0.0.or.stemp.gt.1.0.or.altem.gt.cwat)
1544 : .and.j.gt.i)then
1545 anum=anum-lv(il,j)*(rti-rs(il,j)-cwat*bf2)
1546 denom=denom+lv(il,j)*(rr(il,i)-rti)
1547 if(abs(denom).lt.0.01)denom=0.01
1548 sij(il,i,j)=anum/denom
1549 altem=sij(il,i,j)*rr(il,i)+(1.-sij(il,i,j))*rti-rs(il,j)
1550 altem=altem-(bf2-1.)*cwat
1551 end if
1552 if(sij(il,i,j).gt.0.0.and.sij(il,i,j).lt.0.95)then
1553 qent(il,i,j)=sij(il,i,j)*rr(il,i)+(1.-sij(il,i,j))*rti
1554 uent(il,i,j)=sij(il,i,j)*u(il,i)+(1.-sij(il,i,j))*u(il,nk(il))
1555 vent(il,i,j)=sij(il,i,j)*v(il,i)+(1.-sij(il,i,j))*v(il,nk(il))
1556 c!!! do k=1,ntra
1557 c!!! traent(il,i,j,k)=sij(il,i,j)*tra(il,i,k)
1558 c!!! : +(1.-sij(il,i,j))*tra(il,nk(il),k)
1559 c!!! end do
1560 elij(il,i,j)=altem
1561 elij(il,i,j)=amax1(0.0,elij(il,i,j))
1562 ment(il,i,j)=m(il,i)/(1.-sij(il,i,j))
1563 nent(il,i)=nent(il,i)+1
1564 end if
1565 sij(il,i,j)=amax1(0.0,sij(il,i,j))
1566 sij(il,i,j)=amin1(1.0,sij(il,i,j))
1567 endif ! new
1568 700 continue
1569 710 continue
1570
1571 c do k=1,ntra
1572 c do j=minorig,nl
1573 c do il=1,ncum
1574 c if( (i.ge.icb(il)).and.(i.le.inb(il)).and.
1575 c : (j.ge.(icb(il)-1)).and.(j.le.inb(il)))then
1576 c traent(il,i,j,k)=sij(il,i,j)*tra(il,i,k)
1577 c : +(1.-sij(il,i,j))*tra(il,nk(il),k)
1578 c endif
1579 c enddo
1580 c enddo
1581 c enddo
1582
1583 c
1584 c *** if no air can entrain at level i assume that updraft detrains ***
1585 c *** at that level and calculate detrained air flux and properties ***
1586 c
1587
1588 c@ do 170 i=icb(il),inb(il)
1589
1590 do 740 il=1,ncum
1591 if ((i.ge.icb(il)).and.(i.le.inb(il)).and.(nent(il,i).eq.0)) then
1592 c@ if(nent(il,i).eq.0)then
1593 ment(il,i,i)=m(il,i)
1594 qent(il,i,i)=rr(il,nk(il))-ep(il,i)*clw(il,i)
1595 uent(il,i,i)=u(il,nk(il))
1596 vent(il,i,i)=v(il,nk(il))
1597 elij(il,i,i)=clw(il,i)
1598 cMAF sij(il,i,i)=1.0
1599 sij(il,i,i)=0.0
1600 end if
1601 740 continue
1602 750 continue
1603
1604 c do j=1,ntra
1605 c do i=minorig+1,nl
1606 c do il=1,ncum
1607 c if (i.ge.icb(il) .and. i.le.inb(il) .and. nent(il,i).eq.0) then
1608 c traent(il,i,i,j)=tra(il,nk(il),j)
1609 c endif
1610 c enddo
1611 c enddo
1612 c enddo
1613
1614 do 100 j=minorig,nl
1615 do 101 i=minorig,nl
1616 do 102 il=1,ncum
1617 if ((j.ge.(icb(il)-1)).and.(j.le.inb(il))
1618 : .and.(i.ge.icb(il)).and.(i.le.inb(il)))then
1619 sigij(il,i,j)=sij(il,i,j)
1620 endif
1621 102 continue
1622 101 continue
1623 100 continue
1624 c@ enddo
1625
1626 c@170 continue
1627
1628 c=====================================================================
1629 c --- NORMALIZE ENTRAINED AIR MASS FLUXES
1630 c --- TO REPRESENT EQUAL PROBABILITIES OF MIXING
1631 c=====================================================================
1632
1633 cym call zilch(asum,ncum*nd)
1634 cym call zilch(bsum,ncum*nd)
1635 cym call zilch(csum,ncum*nd)
1636 call zilch(asum,nloc*nd)
1637 call zilch(csum,nloc*nd)
1638 call zilch(csum,nloc*nd)
1639
1640 do il=1,ncum
1641 lwork(il) = .FALSE.
1642 enddo
1643
1644 DO 789 i=minorig+1,nl
1645
1646 num1=0
1647 do il=1,ncum
1648 if ( i.ge.icb(il) .and. i.le.inb(il) ) num1=num1+1
1649 enddo
1650 if (num1.le.0) goto 789
1651
1652
1653 do 781 il=1,ncum
1654 if ( i.ge.icb(il) .and. i.le.inb(il) ) then
1655 lwork(il)=(nent(il,i).ne.0)
1656 qp=rr(il,1)-ep(il,i)*clw(il,i)
1657 anum=h(il,i)-hp(il,i)-lv(il,i)*(qp-rs(il,i))
1658 : +(cpv-cpd)*t(il,i)*(qp-rr(il,i))
1659 denom=h(il,i)-hp(il,i)+lv(il,i)*(rr(il,i)-qp)
1660 : +(cpd-cpv)*t(il,i)*(rr(il,i)-qp)
1661 if(abs(denom).lt.0.01)denom=0.01
1662 scrit(il)=anum/denom
1663 alt=qp-rs(il,i)+scrit(il)*(rr(il,i)-qp)
1664 if(scrit(il).le.0.0.or.alt.le.0.0)scrit(il)=1.0
1665 smax(il)=0.0
1666 asij(il)=0.0
1667 endif
1668 781 continue
1669
1670 do 175 j=nl,minorig,-1
1671
1672 num2=0
1673 do il=1,ncum
1674 if ( i.ge.icb(il) .and. i.le.inb(il) .and.
1675 : j.ge.(icb(il)-1) .and. j.le.inb(il)
1676 : .and. lwork(il) ) num2=num2+1
1677 enddo
1678 if (num2.le.0) goto 175
1679
1680 do 782 il=1,ncum
1681 if ( i.ge.icb(il) .and. i.le.inb(il) .and.
1682 : j.ge.(icb(il)-1) .and. j.le.inb(il)
1683 : .and. lwork(il) ) then
1684
1685 if(sij(il,i,j).gt.1.0e-16.and.sij(il,i,j).lt.0.95)then
1686 wgh=1.0
1687 if(j.gt.i)then
1688 sjmax=amax1(sij(il,i,j+1),smax(il))
1689 sjmax=amin1(sjmax,scrit(il))
1690 smax(il)=amax1(sij(il,i,j),smax(il))
1691 sjmin=amax1(sij(il,i,j-1),smax(il))
1692 sjmin=amin1(sjmin,scrit(il))
1693 if(sij(il,i,j).lt.(smax(il)-1.0e-16))wgh=0.0
1694 smid=amin1(sij(il,i,j),scrit(il))
1695 else
1696 sjmax=amax1(sij(il,i,j+1),scrit(il))
1697 smid=amax1(sij(il,i,j),scrit(il))
1698 sjmin=0.0
1699 if(j.gt.1)sjmin=sij(il,i,j-1)
1700 sjmin=amax1(sjmin,scrit(il))
1701 endif
1702 delp=abs(sjmax-smid)
1703 delm=abs(sjmin-smid)
1704 asij(il)=asij(il)+wgh*(delp+delm)
1705 ment(il,i,j)=ment(il,i,j)*(delp+delm)*wgh
1706 endif
1707 endif
1708 782 continue
1709
1710 175 continue
1711
1712 do il=1,ncum
1713 if (i.ge.icb(il).and.i.le.inb(il).and.lwork(il)) then
1714 asij(il)=amax1(1.0e-16,asij(il))
1715 asij(il)=1.0/asij(il)
1716 asum(il,i)=0.0
1717 bsum(il,i)=0.0
1718 csum(il,i)=0.0
1719 endif
1720 enddo
1721
1722 do 180 j=minorig,nl
1723 do il=1,ncum
1724 if ( i.ge.icb(il) .and. i.le.inb(il) .and. lwork(il)
1725 : .and. j.ge.(icb(il)-1) .and. j.le.inb(il) ) then
1726 ment(il,i,j)=ment(il,i,j)*asij(il)
1727 endif
1728 enddo
1729 180 continue
1730
1731 do 190 j=minorig,nl
1732 do il=1,ncum
1733 if ( i.ge.icb(il) .and. i.le.inb(il) .and. lwork(il)
1734 : .and. j.ge.(icb(il)-1) .and. j.le.inb(il) ) then
1735 asum(il,i)=asum(il,i)+ment(il,i,j)
1736 ment(il,i,j)=ment(il,i,j)*sig(il,j)
1737 bsum(il,i)=bsum(il,i)+ment(il,i,j)
1738 endif
1739 enddo
1740 190 continue
1741
1742 do il=1,ncum
1743 if (i.ge.icb(il).and.i.le.inb(il).and.lwork(il)) then
1744 bsum(il,i)=amax1(bsum(il,i),1.0e-16)
1745 bsum(il,i)=1.0/bsum(il,i)
1746 endif
1747 enddo
1748
1749 do 195 j=minorig,nl
1750 do il=1,ncum
1751 if ( i.ge.icb(il) .and. i.le.inb(il) .and. lwork(il)
1752 : .and. j.ge.(icb(il)-1) .and. j.le.inb(il) ) then
1753 ment(il,i,j)=ment(il,i,j)*asum(il,i)*bsum(il,i)
1754 endif
1755 enddo
1756 195 continue
1757
1758 do 197 j=minorig,nl
1759 do il=1,ncum
1760 if ( i.ge.icb(il) .and. i.le.inb(il) .and. lwork(il)
1761 : .and. j.ge.(icb(il)-1) .and. j.le.inb(il) ) then
1762 csum(il,i)=csum(il,i)+ment(il,i,j)
1763 endif
1764 enddo
1765 197 continue
1766
1767 do il=1,ncum
1768 if ( i.ge.icb(il) .and. i.le.inb(il) .and. lwork(il)
1769 : .and. csum(il,i).lt.m(il,i) ) then
1770 nent(il,i)=0
1771 ment(il,i,i)=m(il,i)
1772 qent(il,i,i)=rr(il,1)-ep(il,i)*clw(il,i)
1773 uent(il,i,i)=u(il,nk(il))
1774 vent(il,i,i)=v(il,nk(il))
1775 elij(il,i,i)=clw(il,i)
1776 cMAF sij(il,i,i)=1.0
1777 sij(il,i,i)=0.0
1778 endif
1779 enddo ! il
1780
1781 c do j=1,ntra
1782 c do il=1,ncum
1783 c if ( i.ge.icb(il) .and. i.le.inb(il) .and. lwork(il)
1784 c : .and. csum(il,i).lt.m(il,i) ) then
1785 c traent(il,i,i,j)=tra(il,nk(il),j)
1786 c endif
1787 c enddo
1788 c enddo
1789 789 continue
1790 c
1791 c MAF: renormalisation de MENT
1792 do jm=1,nd
1793 do im=1,nd
1794 do il=1,ncum
1795 zm(il,im)=zm(il,im)+(1.-sij(il,im,jm))*ment(il,im,jm)
1796 end do
1797 end do
1798 end do
1799 c
1800 do jm=1,nd
1801 do im=1,nd
1802 do il=1,ncum
1803 if(zm(il,im).ne.0.) then
1804 ment(il,im,jm)=ment(il,im,jm)*m(il,im)/zm(il,im)
1805 endif
1806 end do
1807 end do
1808 end do
1809 c
1810 do jm=1,nd
1811 do im=1,nd
1812 do 999 il=1,ncum
1813 qents(il,im,jm)=qent(il,im,jm)
1814 ments(il,im,jm)=ment(il,im,jm)
1815 999 continue
1816 enddo
1817 enddo
1818
1819 return
1820 end
1821
1822
1823 SUBROUTINE cv3_unsat(nloc,ncum,nd,na,ntra,icb,inb
1824 : ,t,rr,rs,gz,u,v,tra,p,ph
1825 : ,th,tv,lv,cpn,ep,sigp,clw
1826 : ,m,ment,elij,delt,plcl
1827 : ,mp,rp,up,vp,trap,wt,water,evap,b)
1828 implicit none
1829
1830
1831 include "cvthermo.h"
1832 include "cvparam3.h"
1833 include "cvflag.h"
1834
1835 c inputs:
1836 integer ncum, nd, na, ntra, nloc
1837 integer icb(nloc), inb(nloc)
1838 real delt, plcl(nloc)
1839 real t(nloc,nd), rr(nloc,nd), rs(nloc,nd)
1840 real u(nloc,nd), v(nloc,nd)
1841 real tra(nloc,nd,ntra)
1842 real p(nloc,nd), ph(nloc,nd+1)
1843 real th(nloc,na), gz(nloc,na)
1844 real lv(nloc,na), ep(nloc,na), sigp(nloc,na), clw(nloc,na)
1845 real cpn(nloc,na), tv(nloc,na)
1846 real m(nloc,na), ment(nloc,na,na), elij(nloc,na,na)
1847
1848 c outputs:
1849 real mp(nloc,na), rp(nloc,na), up(nloc,na), vp(nloc,na)
1850 real water(nloc,na), evap(nloc,na), wt(nloc,na)
1851 real trap(nloc,na,ntra)
1852 real b(nloc,na)
1853
1854 c local variables
1855 integer i,j,k,il,num1
1856 real tinv, delti
1857 real awat, afac, afac1, afac2, bfac
1858 real pr1, pr2, sigt, b6, c6, revap, tevap, delth
1859 real amfac, amp2, xf, tf, fac2, ur, sru, fac, d, af, bf
1860 real ampmax
1861 real lvcp(nloc,na)
1862 real wdtrain(nloc)
1863 logical lwork(nloc)
1864
1865
1866 c------------------------------------------------------
1867
1868 delti = 1./delt
1869 tinv=1./3.
1870
1871 mp(:,:)=0.
1872
1873 do i=1,nl
1874 do il=1,ncum
1875 mp(il,i)=0.0
1876 rp(il,i)=rr(il,i)
1877 up(il,i)=u(il,i)
1878 vp(il,i)=v(il,i)
1879 wt(il,i)=0.001
1880 water(il,i)=0.0
1881 evap(il,i)=0.0
1882 b(il,i)=0.0
1883 lvcp(il,i)=lv(il,i)/cpn(il,i)
1884 enddo
1885 enddo
1886
1887 c do k=1,ntra
1888 c do i=1,nd
1889 c do il=1,ncum
1890 c trap(il,i,k)=tra(il,i,k)
1891 c enddo
1892 c enddo
1893 c enddo
1894
1895 c
1896 c *** check whether ep(inb)=0, if so, skip precipitating ***
1897 c *** downdraft calculation ***
1898 c
1899
1900 do il=1,ncum
1901 lwork(il)=.TRUE.
1902 if(ep(il,inb(il)).lt.0.0001)lwork(il)=.FALSE.
1903 enddo
1904
1905 call zilch(wdtrain,ncum)
1906
1907 DO 400 i=nl+1,1,-1
1908
1909 num1=0
1910 do il=1,ncum
1911 if ( i.le.inb(il) .and. lwork(il) ) num1=num1+1
1912 enddo
1913 if (num1.le.0) goto 400
1914
1915 c
1916 c *** integrate liquid water equation to find condensed water ***
1917 c *** and condensed water flux ***
1918 c
1919
1920 c
1921 c *** begin downdraft loop ***
1922 c
1923
1924 c
1925 c *** calculate detrained precipitation ***
1926 c
1927 do il=1,ncum
1928 if (i.le.inb(il) .and. lwork(il)) then
1929 if (cvflag_grav) then
1930 wdtrain(il)=grav*ep(il,i)*m(il,i)*clw(il,i)
1931 else
1932 wdtrain(il)=10.0*ep(il,i)*m(il,i)*clw(il,i)
1933 endif
1934 endif
1935 enddo
1936
1937 if(i.gt.1)then
1938 do 320 j=1,i-1
1939 do il=1,ncum
1940 if (i.le.inb(il) .and. lwork(il)) then
1941 awat=elij(il,j,i)-(1.-ep(il,i))*clw(il,i)
1942 awat=amax1(awat,0.0)
1943 if (cvflag_grav) then
1944 wdtrain(il)=wdtrain(il)+grav*awat*ment(il,j,i)
1945 else
1946 wdtrain(il)=wdtrain(il)+10.0*awat*ment(il,j,i)
1947 endif
1948 endif
1949 enddo
1950 320 continue
1951 endif
1952
1953 c
1954 c *** find rain water and evaporation using provisional ***
1955 c *** estimates of rp(i)and rp(i-1) ***
1956 c
1957
1958 do 999 il=1,ncum
1959
1960 if (i.le.inb(il) .and. lwork(il)) then
1961
1962 wt(il,i)=45.0
1963
1964 if(i.lt.inb(il))then
1965 rp(il,i)=rp(il,i+1)
1966 : +(cpd*(t(il,i+1)-t(il,i))+gz(il,i+1)-gz(il,i))/lv(il,i)
1967 rp(il,i)=0.5*(rp(il,i)+rr(il,i))
1968 endif
1969 rp(il,i)=amax1(rp(il,i),0.0)
1970 rp(il,i)=amin1(rp(il,i),rs(il,i))
1971 rp(il,inb(il))=rr(il,inb(il))
1972
1973 if(i.eq.1)then
1974 afac=p(il,1)*(rs(il,1)-rp(il,1))/(1.0e4+2000.0*p(il,1)*rs(il,1))
1975 else
1976 rp(il,i-1)=rp(il,i)
1977 : +(cpd*(t(il,i)-t(il,i-1))+gz(il,i)-gz(il,i-1))/lv(il,i)
1978 rp(il,i-1)=0.5*(rp(il,i-1)+rr(il,i-1))
1979 rp(il,i-1)=amin1(rp(il,i-1),rs(il,i-1))
1980 rp(il,i-1)=amax1(rp(il,i-1),0.0)
1981 afac1=p(il,i)*(rs(il,i)-rp(il,i))/(1.0e4+2000.0*p(il,i)*rs(il,i))
1982 afac2=p(il,i-1)*(rs(il,i-1)-rp(il,i-1))
1983 : /(1.0e4+2000.0*p(il,i-1)*rs(il,i-1))
1984 afac=0.5*(afac1+afac2)
1985 endif
1986 if(i.eq.inb(il))afac=0.0
1987 afac=amax1(afac,0.0)
1988 bfac=1./(sigd*wt(il,i))
1989 c
1990 cjyg1
1991 ccc sigt=1.0
1992 ccc if(i.ge.icb)sigt=sigp(i)
1993 c prise en compte de la variation progressive de sigt dans
1994 c les couches icb et icb-1:
1995 c pour plcl<ph(i+1), pr1=0 & pr2=1
1996 c pour plcl>ph(i), pr1=1 & pr2=0
1997 c pour ph(i+1)<plcl<ph(i), pr1 est la proportion a cheval
1998 c sur le nuage, et pr2 est la proportion sous la base du
1999 c nuage.
2000 pr1=(plcl(il)-ph(il,i+1))/(ph(il,i)-ph(il,i+1))
2001 pr1=max(0.,min(1.,pr1))
2002 pr2=(ph(il,i)-plcl(il))/(ph(il,i)-ph(il,i+1))
2003 pr2=max(0.,min(1.,pr2))
2004 sigt=sigp(il,i)*pr1+pr2
2005 cjyg2
2006 c
2007 b6=bfac*50.*sigd*(ph(il,i)-ph(il,i+1))*sigt*afac
2008 c6=water(il,i+1)+bfac*wdtrain(il)
2009 : -50.*sigd*bfac*(ph(il,i)-ph(il,i+1))*evap(il,i+1)
2010 if(c6.gt.0.0)then
2011 revap=0.5*(-b6+sqrt(b6*b6+4.*c6))
2012 evap(il,i)=sigt*afac*revap
2013 water(il,i)=revap*revap
2014 else
2015 evap(il,i)=-evap(il,i+1)
2016 : +0.02*(wdtrain(il)+sigd*wt(il,i)*water(il,i+1))
2017 : /(sigd*(ph(il,i)-ph(il,i+1)))
2018 end if
2019 c
2020 c *** calculate precipitating downdraft mass flux under ***
2021 c *** hydrostatic approximation ***
2022 c
2023 if (i.ne.1) then
2024
2025 tevap=amax1(0.0,evap(il,i))
2026 delth=amax1(0.001,(th(il,i)-th(il,i-1)))
2027 if (cvflag_grav) then
2028 mp(il,i)=100.*ginv*lvcp(il,i)*sigd*tevap
2029 : *(p(il,i-1)-p(il,i))/delth
2030 else
2031 mp(il,i)=10.*lvcp(il,i)*sigd*tevap*(p(il,i-1)-p(il,i))/delth
2032 endif
2033 c
2034 c *** if hydrostatic assumption fails, ***
2035 c *** solve cubic difference equation for downdraft theta ***
2036 c *** and mass flux from two simultaneous differential eqns ***
2037 c
2038 amfac=sigd*sigd*70.0*ph(il,i)*(p(il,i-1)-p(il,i))
2039 : *(th(il,i)-th(il,i-1))/(tv(il,i)*th(il,i))
2040 amp2=abs(mp(il,i+1)*mp(il,i+1)-mp(il,i)*mp(il,i))
2041 if(amp2.gt.(0.1*amfac))then
2042 xf=100.0*sigd*sigd*sigd*(ph(il,i)-ph(il,i+1))
2043 tf=b(il,i)-5.0*(th(il,i)-th(il,i-1))*t(il,i)
2044 : /(lvcp(il,i)*sigd*th(il,i))
2045 af=xf*tf+mp(il,i+1)*mp(il,i+1)*tinv
2046 bf=2.*(tinv*mp(il,i+1))**3+tinv*mp(il,i+1)*xf*tf
2047 : +50.*(p(il,i-1)-p(il,i))*xf*tevap
2048 fac2=1.0
2049 if(bf.lt.0.0)fac2=-1.0
2050 bf=abs(bf)
2051 ur=0.25*bf*bf-af*af*af*tinv*tinv*tinv
2052 if(ur.ge.0.0)then
2053 sru=sqrt(ur)
2054 fac=1.0
2055 if((0.5*bf-sru).lt.0.0)fac=-1.0
2056 mp(il,i)=mp(il,i+1)*tinv+(0.5*bf+sru)**tinv
2057 : +fac*(abs(0.5*bf-sru))**tinv
2058 else
2059 d=atan(2.*sqrt(-ur)/(bf+1.0e-28))
2060 if(fac2.lt.0.0)d=3.14159-d
2061 mp(il,i)=mp(il,i+1)*tinv+2.*sqrt(af*tinv)*cos(d*tinv)
2062 endif
2063 mp(il,i)=amax1(0.0,mp(il,i))
2064
2065 if (cvflag_grav) then
2066 Cjyg : il y a vraisemblablement une erreur dans la ligne 2 suivante:
2067 C il faut diviser par (mp(il,i)*sigd*grav) et non par (mp(il,i)+sigd*0.1).
2068 C Et il faut bien revoir les facteurs 100.
2069 b(il,i-1)=b(il,i)+100.0*(p(il,i-1)-p(il,i))*tevap
2070 2 /(mp(il,i)+sigd*0.1)
2071 3 -10.0*(th(il,i)-th(il,i-1))*t(il,i)/(lvcp(il,i)*sigd*th(il,i))
2072 else
2073 b(il,i-1)=b(il,i)+100.0*(p(il,i-1)-p(il,i))*tevap
2074 2 /(mp(il,i)+sigd*0.1)
2075 3 -10.0*(th(il,i)-th(il,i-1))*t(il,i)/(lvcp(il,i)*sigd*th(il,i))
2076 endif
2077 b(il,i-1)=amax1(b(il,i-1),0.0)
2078 endif
2079 c
2080 c *** limit magnitude of mp(i) to meet cfl condition ***
2081 c
2082 ampmax=2.0*(ph(il,i)-ph(il,i+1))*delti
2083 amp2=2.0*(ph(il,i-1)-ph(il,i))*delti
2084 ampmax=amin1(ampmax,amp2)
2085 mp(il,i)=amin1(mp(il,i),ampmax)
2086 c
2087 c *** force mp to decrease linearly to zero ***
2088 c *** between cloud base and the surface ***
2089 c
2090 if(p(il,i).gt.p(il,icb(il)))then
2091 mp(il,i)=mp(il,icb(il))*(p(il,1)-p(il,i))/(p(il,1)-p(il,icb(il)))
2092 endif
2093
2094 360 continue
2095 endif ! i.eq.1
2096 c
2097 c *** find mixing ratio of precipitating downdraft ***
2098 c
2099
2100 if (i.ne.inb(il)) then
2101
2102 rp(il,i)=rr(il,i)
2103
2104 if(mp(il,i).gt.mp(il,i+1))then
2105
2106 if (cvflag_grav) then
2107 rp(il,i)=rp(il,i+1)*mp(il,i+1)+rr(il,i)*(mp(il,i)-mp(il,i+1))
2108 : +100.*ginv*0.5*sigd*(ph(il,i)-ph(il,i+1))
2109 : *(evap(il,i+1)+evap(il,i))
2110 else
2111 rp(il,i)=rp(il,i+1)*mp(il,i+1)+rr(il,i)*(mp(il,i)-mp(il,i+1))
2112 : +5.*sigd*(ph(il,i)-ph(il,i+1))
2113 : *(evap(il,i+1)+evap(il,i))
2114 endif
2115 rp(il,i)=rp(il,i)/mp(il,i)
2116 up(il,i)=up(il,i+1)*mp(il,i+1)+u(il,i)*(mp(il,i)-mp(il,i+1))
2117 up(il,i)=up(il,i)/mp(il,i)
2118 vp(il,i)=vp(il,i+1)*mp(il,i+1)+v(il,i)*(mp(il,i)-mp(il,i+1))
2119 vp(il,i)=vp(il,i)/mp(il,i)
2120
2121 c do j=1,ntra
2122 c trap(il,i,j)=trap(il,i+1,j)*mp(il,i+1)
2123 ctestmaf : +trap(il,i,j)*(mp(il,i)-mp(il,i+1))
2124 c : +tra(il,i,j)*(mp(il,i)-mp(il,i+1))
2125 c trap(il,i,j)=trap(il,i,j)/mp(il,i)
2126 c end do
2127
2128 else
2129
2130 if(mp(il,i+1).gt.1.0e-16)then
2131 if (cvflag_grav) then
2132 rp(il,i)=rp(il,i+1)
2133 : +100.*ginv*0.5*sigd*(ph(il,i)-ph(il,i+1))
2134 : *(evap(il,i+1)+evap(il,i))/mp(il,i+1)
2135 else
2136 rp(il,i)=rp(il,i+1)
2137 : +5.*sigd*(ph(il,i)-ph(il,i+1))
2138 : *(evap(il,i+1)+evap(il,i))/mp(il,i+1)
2139 endif
2140 up(il,i)=up(il,i+1)
2141 vp(il,i)=vp(il,i+1)
2142
2143 c do j=1,ntra
2144 c trap(il,i,j)=trap(il,i+1,j)
2145 c end do
2146
2147 endif
2148 endif
2149 rp(il,i)=amin1(rp(il,i),rs(il,i))
2150 rp(il,i)=amax1(rp(il,i),0.0)
2151
2152 endif
2153 endif
2154 999 continue
2155
2156 400 continue
2157
2158 return
2159 end
2160
2161 SUBROUTINE cv3_yield(nloc,ncum,nd,na,ntra
2162 : ,icb,inb,delt
2163 : ,t,rr,u,v,tra,gz,p,ph,h,hp,lv,cpn,th
2164 : ,ep,clw,m,tp,mp,rp,up,vp,trap
2165 : ,wt,water,evap,b
2166 : ,ment,qent,uent,vent,nent,elij,traent,sig
2167 : ,tv,tvp
2168 : ,iflag,precip,VPrecip,ft,fr,fu,fv,ftra
2169 : ,upwd,dnwd,dnwd0,ma,mike,tls,tps,qcondc,wd)
2170 use conema3_m
2171 implicit none
2172
2173 include "cvthermo.h"
2174 include "cvparam3.h"
2175 include "cvflag.h"
2176
2177 c inputs:
2178 integer ncum,nd,na,ntra,nloc
2179 integer icb(nloc), inb(nloc)
2180 real delt
2181 real t(nloc,nd), rr(nloc,nd), u(nloc,nd), v(nloc,nd)
2182 real tra(nloc,nd,ntra), sig(nloc,nd)
2183 real gz(nloc,na), ph(nloc,nd+1), h(nloc,na), hp(nloc,na)
2184 real th(nloc,na), p(nloc,nd), tp(nloc,na)
2185 real lv(nloc,na), cpn(nloc,na), ep(nloc,na), clw(nloc,na)
2186 real m(nloc,na), mp(nloc,na), rp(nloc,na), up(nloc,na)
2187 real vp(nloc,na), wt(nloc,nd), trap(nloc,nd,ntra)
2188 real water(nloc,na), evap(nloc,na), b(nloc,na)
2189 real ment(nloc,na,na), qent(nloc,na,na), uent(nloc,na,na)
2190 cym real vent(nloc,na,na), nent(nloc,na), elij(nloc,na,na)
2191 real vent(nloc,na,na), elij(nloc,na,na)
2192 integer nent(nloc,na)
2193 real traent(nloc,na,na,ntra)
2194 real tv(nloc,nd), tvp(nloc,nd)
2195
2196 c input/output:
2197 integer iflag(nloc)
2198
2199 c outputs:
2200 real precip(nloc)
2201 real VPrecip(nloc,nd+1)
2202 real ft(nloc,nd), fr(nloc,nd), fu(nloc,nd), fv(nloc,nd)
2203 real ftra(nloc,nd,ntra)
2204 real upwd(nloc,nd), dnwd(nloc,nd), ma(nloc,nd)
2205 real dnwd0(nloc,nd), mike(nloc,nd)
2206 real tls(nloc,nd), tps(nloc,nd)
2207 real qcondc(nloc,nd) ! cld
2208 real wd(nloc) ! gust
2209
2210 c local variables:
2211 integer i,k,il,n,j,num1
2212 real rat, awat, delti
2213 real ax, bx, cx, dx, ex
2214 real cpinv, rdcp, dpinv
2215 real lvcp(nloc,na), mke(nloc,na)
2216 real am(nloc), work(nloc), ad(nloc), amp1(nloc)
2217 c!! real up1(nloc), dn1(nloc)
2218 real up1(nloc,nd,nd), dn1(nloc,nd,nd)
2219 real asum(nloc), bsum(nloc), csum(nloc), dsum(nloc)
2220 real qcond(nloc,nd), nqcond(nloc,nd), wa(nloc,nd) ! cld
2221 real siga(nloc,nd), sax(nloc,nd), mac(nloc,nd) ! cld
2222
2223
2224 c-------------------------------------------------------------
2225
2226 c initialization:
2227
2228 delti = 1.0/delt
2229
2230 do il=1,ncum
2231 precip(il)=0.0
2232 wd(il)=0.0 ! gust
2233 VPrecip(il,nd+1)=0.
2234 enddo
2235
2236 do i=1,nd
2237 do il=1,ncum
2238 VPrecip(il,i)=0.0
2239 ft(il,i)=0.0
2240 fr(il,i)=0.0
2241 fu(il,i)=0.0
2242 fv(il,i)=0.0
2243 qcondc(il,i)=0.0 ! cld
2244 qcond(il,i)=0.0 ! cld
2245 nqcond(il,i)=0.0 ! cld
2246 enddo
2247 enddo
2248
2249 c do j=1,ntra
2250 c do i=1,nd
2251 c do il=1,ncum
2252 c ftra(il,i,j)=0.0
2253 c enddo
2254 c enddo
2255 c enddo
2256
2257 do i=1,nl
2258 do il=1,ncum
2259 lvcp(il,i)=lv(il,i)/cpn(il,i)
2260 enddo
2261 enddo
2262
2263
2264 c
2265 c *** calculate surface precipitation in mm/day ***
2266 c
2267 do il=1,ncum
2268 if(ep(il,inb(il)).ge.0.0001)then
2269 if (cvflag_grav) then
2270 precip(il)=wt(il,1)*sigd*water(il,1)*86400.*1000./(rowl*grav)
2271 else
2272 precip(il)=wt(il,1)*sigd*water(il,1)*8640.
2273 endif
2274 endif
2275 enddo
2276
2277 C *** CALCULATE VERTICAL PROFILE OF PRECIPITATIONs IN kg/m2/s ===
2278 C
2279 c MAF rajout pour lessivage
2280 do k=1,nl
2281 do il=1,ncum
2282 if (k.le.inb(il)) then
2283 if (cvflag_grav) then
2284 VPrecip(il,k) = wt(il,k)*sigd*water(il,k)/grav
2285 else
2286 VPrecip(il,k) = wt(il,k)*sigd*water(il,k)/10.
2287 endif
2288 endif
2289 end do
2290 end do
2291 C
2292 c
2293 c *** Calculate downdraft velocity scale ***
2294 c *** NE PAS UTILISER POUR L'INSTANT ***
2295 c
2296 c! do il=1,ncum
2297 c! wd(il)=betad*abs(mp(il,icb(il)))*0.01*rrd*t(il,icb(il))
2298 c! : /(sigd*p(il,icb(il)))
2299 c! enddo
2300
2301 c
2302 c *** calculate tendencies of lowest level potential temperature ***
2303 c *** and mixing ratio ***
2304 c
2305 do il=1,ncum
2306 work(il)=1.0/(ph(il,1)-ph(il,2))
2307 am(il)=0.0
2308 enddo
2309
2310 do k=2,nl
2311 do il=1,ncum
2312 if (k.le.inb(il)) then
2313 am(il)=am(il)+m(il,k)
2314 endif
2315 enddo
2316 enddo
2317
2318 do il=1,ncum
2319
2320 c convect3 if((0.1*dpinv*am).ge.delti)iflag(il)=4
2321 if (cvflag_grav) then
2322 if((0.01*grav*work(il)*am(il)).ge.delti)iflag(il)=1!consist vect
2323 ft(il,1)=0.01*grav*work(il)*am(il)*(t(il,2)-t(il,1)
2324 : +(gz(il,2)-gz(il,1))/cpn(il,1))
2325 else
2326 if((0.1*work(il)*am(il)).ge.delti)iflag(il)=1 !consistency vect
2327 ft(il,1)=0.1*work(il)*am(il)*(t(il,2)-t(il,1)
2328 : +(gz(il,2)-gz(il,1))/cpn(il,1))
2329 endif
2330
2331 ft(il,1)=ft(il,1)-0.5*lvcp(il,1)*sigd*(evap(il,1)+evap(il,2))
2332
2333 if (cvflag_grav) then
2334 ft(il,1)=ft(il,1)-0.009*grav*sigd*mp(il,2)
2335 : *t(il,1)*b(il,1)*work(il)
2336 else
2337 ft(il,1)=ft(il,1)-0.09*sigd*mp(il,2)*t(il,1)*b(il,1)*work(il)
2338 endif
2339
2340 ft(il,1)=ft(il,1)+0.01*sigd*wt(il,1)*(cl-cpd)*water(il,2)*(t(il,2)
2341 :-t(il,1))*work(il)/cpn(il,1)
2342
2343 if (cvflag_grav) then
2344 Cjyg1 Correction pour mieux conserver l'eau (conformite avec CONVECT4.3)
2345 c (sb: pour l'instant, on ne fait que le chgt concernant grav, pas evap)
2346 fr(il,1)=0.01*grav*mp(il,2)*(rp(il,2)-rr(il,1))*work(il)
2347 : +sigd*0.5*(evap(il,1)+evap(il,2))
2348 c+tard : +sigd*evap(il,1)
2349
2350 fr(il,1)=fr(il,1)+0.01*grav*am(il)*(rr(il,2)-rr(il,1))*work(il)
2351
2352 fu(il,1)=fu(il,1)+0.01*grav*work(il)*(mp(il,2)*(up(il,2)-u(il,1))
2353 : +am(il)*(u(il,2)-u(il,1)))
2354 fv(il,1)=fv(il,1)+0.01*grav*work(il)*(mp(il,2)*(vp(il,2)-v(il,1))
2355 : +am(il)*(v(il,2)-v(il,1)))
2356 else ! cvflag_grav
2357 fr(il,1)=0.1*mp(il,2)*(rp(il,2)-rr(il,1))*work(il)
2358 : +sigd*0.5*(evap(il,1)+evap(il,2))
2359 fr(il,1)=fr(il,1)+0.1*am(il)*(rr(il,2)-rr(il,1))*work(il)
2360 fu(il,1)=fu(il,1)+0.1*work(il)*(mp(il,2)*(up(il,2)-u(il,1))
2361 : +am(il)*(u(il,2)-u(il,1)))
2362 fv(il,1)=fv(il,1)+0.1*work(il)*(mp(il,2)*(vp(il,2)-v(il,1))
2363 : +am(il)*(v(il,2)-v(il,1)))
2364 endif ! cvflag_grav
2365
2366 enddo ! il
2367
2368 c do j=1,ntra
2369 c do il=1,ncum
2370 c if (cvflag_grav) then
2371 c ftra(il,1,j)=ftra(il,1,j)+0.01*grav*work(il)
2372 c : *(mp(il,2)*(trap(il,2,j)-tra(il,1,j))
2373 c : +am(il)*(tra(il,2,j)-tra(il,1,j)))
2374 c else
2375 c ftra(il,1,j)=ftra(il,1,j)+0.1*work(il)
2376 c : *(mp(il,2)*(trap(il,2,j)-tra(il,1,j))
2377 c : +am(il)*(tra(il,2,j)-tra(il,1,j)))
2378 c endif
2379 c enddo
2380 c enddo
2381
2382 do j=2,nl
2383 do il=1,ncum
2384 if (j.le.inb(il)) then
2385 if (cvflag_grav) then
2386 fr(il,1)=fr(il,1)
2387 : +0.01*grav*work(il)*ment(il,j,1)*(qent(il,j,1)-rr(il,1))
2388 fu(il,1)=fu(il,1)
2389 : +0.01*grav*work(il)*ment(il,j,1)*(uent(il,j,1)-u(il,1))
2390 fv(il,1)=fv(il,1)
2391 : +0.01*grav*work(il)*ment(il,j,1)*(vent(il,j,1)-v(il,1))
2392 else ! cvflag_grav
2393 fr(il,1)=fr(il,1)
2394 : +0.1*work(il)*ment(il,j,1)*(qent(il,j,1)-rr(il,1))
2395 fu(il,1)=fu(il,1)
2396 : +0.1*work(il)*ment(il,j,1)*(uent(il,j,1)-u(il,1))
2397 fv(il,1)=fv(il,1)
2398 : +0.1*work(il)*ment(il,j,1)*(vent(il,j,1)-v(il,1))
2399 endif ! cvflag_grav
2400 endif ! j
2401 enddo
2402 enddo
2403
2404 c do k=1,ntra
2405 c do j=2,nl
2406 c do il=1,ncum
2407 c if (j.le.inb(il)) then
2408
2409 c if (cvflag_grav) then
2410 c ftra(il,1,k)=ftra(il,1,k)+0.01*grav*work(il)*ment(il,j,1)
2411 c : *(traent(il,j,1,k)-tra(il,1,k))
2412 c else
2413 c ftra(il,1,k)=ftra(il,1,k)+0.1*work(il)*ment(il,j,1)
2414 c : *(traent(il,j,1,k)-tra(il,1,k))
2415 c endif
2416
2417 c endif
2418 c enddo
2419 c enddo
2420 c enddo
2421
2422 c
2423 c *** calculate tendencies of potential temperature and mixing ratio ***
2424 c *** at levels above the lowest level ***
2425 c
2426 c *** first find the net saturated updraft and downdraft mass fluxes ***
2427 c *** through each level ***
2428 c
2429
2430 do 500 i=2,nl+1 ! newvecto: mettre nl au lieu nl+1?
2431
2432 num1=0
2433 do il=1,ncum
2434 if(i.le.inb(il))num1=num1+1
2435 enddo
2436 if(num1.le.0)go to 500
2437
2438 call zilch(amp1,ncum)
2439 call zilch(ad,ncum)
2440
2441 do 440 k=i+1,nl+1
2442 do 441 il=1,ncum
2443 if (i.le.inb(il) .and. k.le.(inb(il)+1)) then
2444 amp1(il)=amp1(il)+m(il,k)
2445 endif
2446 441 continue
2447 440 continue
2448
2449 do 450 k=1,i
2450 do 451 j=i+1,nl+1
2451 do 452 il=1,ncum
2452 if (i.le.inb(il) .and. j.le.(inb(il)+1)) then
2453 amp1(il)=amp1(il)+ment(il,k,j)
2454 endif
2455 452 continue
2456 451 continue
2457 450 continue
2458
2459 do 470 k=1,i-1
2460 do 471 j=i,nl+1 ! newvecto: nl au lieu nl+1?
2461 do 472 il=1,ncum
2462 if (i.le.inb(il) .and. j.le.inb(il)) then
2463 ad(il)=ad(il)+ment(il,j,k)
2464 endif
2465 472 continue
2466 471 continue
2467 470 continue
2468
2469 do 1350 il=1,ncum
2470 if (i.le.inb(il)) then
2471 dpinv=1.0/(ph(il,i)-ph(il,i+1))
2472 cpinv=1.0/cpn(il,i)
2473
2474 c convect3 if((0.1*dpinv*amp1).ge.delti)iflag(il)=4
2475 if (cvflag_grav) then
2476 if((0.01*grav*dpinv*amp1(il)).ge.delti)iflag(il)=1 ! vecto
2477 else
2478 if((0.1*dpinv*amp1(il)).ge.delti)iflag(il)=1 ! vecto
2479 endif
2480
2481 if (cvflag_grav) then
2482 ft(il,i)=0.01*grav*dpinv*(amp1(il)*(t(il,i+1)-t(il,i)
2483 : +(gz(il,i+1)-gz(il,i))*cpinv)
2484 : -ad(il)*(t(il,i)-t(il,i-1)+(gz(il,i)-gz(il,i-1))*cpinv))
2485 : -0.5*sigd*lvcp(il,i)*(evap(il,i)+evap(il,i+1))
2486 rat=cpn(il,i-1)*cpinv
2487 ft(il,i)=ft(il,i)-0.009*grav*sigd*(mp(il,i+1)*t(il,i)*b(il,i)
2488 : -mp(il,i)*t(il,i-1)*rat*b(il,i-1))*dpinv
2489 ft(il,i)=ft(il,i)+0.01*grav*dpinv*ment(il,i,i)*(hp(il,i)-h(il,i)
2490 : +t(il,i)*(cpv-cpd)*(rr(il,i)-qent(il,i,i)))*cpinv
2491 else ! cvflag_grav
2492 ft(il,i)=0.1*dpinv*(amp1(il)*(t(il,i+1)-t(il,i)
2493 : +(gz(il,i+1)-gz(il,i))*cpinv)
2494 : -ad(il)*(t(il,i)-t(il,i-1)+(gz(il,i)-gz(il,i-1))*cpinv))
2495 : -0.5*sigd*lvcp(il,i)*(evap(il,i)+evap(il,i+1))
2496 rat=cpn(il,i-1)*cpinv
2497 ft(il,i)=ft(il,i)-0.09*sigd*(mp(il,i+1)*t(il,i)*b(il,i)
2498 : -mp(il,i)*t(il,i-1)*rat*b(il,i-1))*dpinv
2499 ft(il,i)=ft(il,i)+0.1*dpinv*ment(il,i,i)*(hp(il,i)-h(il,i)
2500 : +t(il,i)*(cpv-cpd)*(rr(il,i)-qent(il,i,i)))*cpinv
2501 endif ! cvflag_grav
2502
2503
2504 ft(il,i)=ft(il,i)+0.01*sigd*wt(il,i)*(cl-cpd)*water(il,i+1)
2505 : *(t(il,i+1)-t(il,i))*dpinv*cpinv
2506
2507 if (cvflag_grav) then
2508 fr(il,i)=0.01*grav*dpinv*(amp1(il)*(rr(il,i+1)-rr(il,i))
2509 : -ad(il)*(rr(il,i)-rr(il,i-1)))
2510 fu(il,i)=fu(il,i)+0.01*grav*dpinv*(amp1(il)*(u(il,i+1)-u(il,i))
2511 : -ad(il)*(u(il,i)-u(il,i-1)))
2512 fv(il,i)=fv(il,i)+0.01*grav*dpinv*(amp1(il)*(v(il,i+1)-v(il,i))
2513 : -ad(il)*(v(il,i)-v(il,i-1)))
2514 else ! cvflag_grav
2515 fr(il,i)=0.1*dpinv*(amp1(il)*(rr(il,i+1)-rr(il,i))
2516 : -ad(il)*(rr(il,i)-rr(il,i-1)))
2517 fu(il,i)=fu(il,i)+0.1*dpinv*(amp1(il)*(u(il,i+1)-u(il,i))
2518 : -ad(il)*(u(il,i)-u(il,i-1)))
2519 fv(il,i)=fv(il,i)+0.1*dpinv*(amp1(il)*(v(il,i+1)-v(il,i))
2520 : -ad(il)*(v(il,i)-v(il,i-1)))
2521 endif ! cvflag_grav
2522
2523 endif ! i
2524 1350 continue
2525
2526 c do k=1,ntra
2527 c do il=1,ncum
2528 c if (i.le.inb(il)) then
2529 c dpinv=1.0/(ph(il,i)-ph(il,i+1))
2530 c cpinv=1.0/cpn(il,i)
2531 c if (cvflag_grav) then
2532 c ftra(il,i,k)=ftra(il,i,k)+0.01*grav*dpinv
2533 c : *(amp1(il)*(tra(il,i+1,k)-tra(il,i,k))
2534 c : -ad(il)*(tra(il,i,k)-tra(il,i-1,k)))
2535 c else
2536 c ftra(il,i,k)=ftra(il,i,k)+0.1*dpinv
2537 c : *(amp1(il)*(tra(il,i+1,k)-tra(il,i,k))
2538 c : -ad(il)*(tra(il,i,k)-tra(il,i-1,k)))
2539 c endif
2540 c endif
2541 c enddo
2542 c enddo
2543
2544 do 480 k=1,i-1
2545 do 1370 il=1,ncum
2546 if (i.le.inb(il)) then
2547 dpinv=1.0/(ph(il,i)-ph(il,i+1))
2548 cpinv=1.0/cpn(il,i)
2549
2550 awat=elij(il,k,i)-(1.-ep(il,i))*clw(il,i)
2551 awat=amax1(awat,0.0)
2552
2553 if (cvflag_grav) then
2554 fr(il,i)=fr(il,i)
2555 : +0.01*grav*dpinv*ment(il,k,i)*(qent(il,k,i)-awat-rr(il,i))
2556 fu(il,i)=fu(il,i)
2557 : +0.01*grav*dpinv*ment(il,k,i)*(uent(il,k,i)-u(il,i))
2558 fv(il,i)=fv(il,i)
2559 : +0.01*grav*dpinv*ment(il,k,i)*(vent(il,k,i)-v(il,i))
2560 else ! cvflag_grav
2561 fr(il,i)=fr(il,i)
2562 : +0.1*dpinv*ment(il,k,i)*(qent(il,k,i)-awat-rr(il,i))
2563 fu(il,i)=fu(il,i)
2564 : +0.01*grav*dpinv*ment(il,k,i)*(uent(il,k,i)-u(il,i))
2565 fv(il,i)=fv(il,i)
2566 : +0.1*dpinv*ment(il,k,i)*(vent(il,k,i)-v(il,i))
2567 endif ! cvflag_grav
2568
2569 c (saturated updrafts resulting from mixing) ! cld
2570 qcond(il,i)=qcond(il,i)+(elij(il,k,i)-awat) ! cld
2571 nqcond(il,i)=nqcond(il,i)+1. ! cld
2572 endif ! i
2573 1370 continue
2574 480 continue
2575
2576 c do j=1,ntra
2577 c do k=1,i-1
2578 c do il=1,ncum
2579 c if (i.le.inb(il)) then
2580 c dpinv=1.0/(ph(il,i)-ph(il,i+1))
2581 c cpinv=1.0/cpn(il,i)
2582 c if (cvflag_grav) then
2583 c ftra(il,i,j)=ftra(il,i,j)+0.01*grav*dpinv*ment(il,k,i)
2584 c : *(traent(il,k,i,j)-tra(il,i,j))
2585 c else
2586 c ftra(il,i,j)=ftra(il,i,j)+0.1*dpinv*ment(il,k,i)
2587 c : *(traent(il,k,i,j)-tra(il,i,j))
2588 c endif
2589 c endif
2590 c enddo
2591 c enddo
2592 c enddo
2593
2594 do 490 k=i,nl+1
2595 do 1380 il=1,ncum
2596 if (i.le.inb(il) .and. k.le.inb(il)) then
2597 dpinv=1.0/(ph(il,i)-ph(il,i+1))
2598 cpinv=1.0/cpn(il,i)
2599
2600 if (cvflag_grav) then
2601 fr(il,i)=fr(il,i)
2602 : +0.01*grav*dpinv*ment(il,k,i)*(qent(il,k,i)-rr(il,i))
2603 fu(il,i)=fu(il,i)
2604 : +0.01*grav*dpinv*ment(il,k,i)*(uent(il,k,i)-u(il,i))
2605 fv(il,i)=fv(il,i)
2606 : +0.01*grav*dpinv*ment(il,k,i)*(vent(il,k,i)-v(il,i))
2607 else ! cvflag_grav
2608 fr(il,i)=fr(il,i)
2609 : +0.1*dpinv*ment(il,k,i)*(qent(il,k,i)-rr(il,i))
2610 fu(il,i)=fu(il,i)
2611 : +0.1*dpinv*ment(il,k,i)*(uent(il,k,i)-u(il,i))
2612 fv(il,i)=fv(il,i)
2613 : +0.1*dpinv*ment(il,k,i)*(vent(il,k,i)-v(il,i))
2614 endif ! cvflag_grav
2615 endif ! i and k
2616 1380 continue
2617 490 continue
2618
2619 c do j=1,ntra
2620 c do k=i,nl+1
2621 c do il=1,ncum
2622 c if (i.le.inb(il) .and. k.le.inb(il)) then
2623 c dpinv=1.0/(ph(il,i)-ph(il,i+1))
2624 c cpinv=1.0/cpn(il,i)
2625 c if (cvflag_grav) then
2626 c ftra(il,i,j)=ftra(il,i,j)+0.01*grav*dpinv*ment(il,k,i)
2627 c : *(traent(il,k,i,j)-tra(il,i,j))
2628 c else
2629 c ftra(il,i,j)=ftra(il,i,j)+0.1*dpinv*ment(il,k,i)
2630 c : *(traent(il,k,i,j)-tra(il,i,j))
2631 c endif
2632 c endif ! i and k
2633 c enddo
2634 c enddo
2635 c enddo
2636
2637 do 1400 il=1,ncum
2638 if (i.le.inb(il)) then
2639 dpinv=1.0/(ph(il,i)-ph(il,i+1))
2640 cpinv=1.0/cpn(il,i)
2641
2642 if (cvflag_grav) then
2643 c sb: on ne fait pas encore la correction permettant de mieux
2644 c conserver l'eau:
2645 fr(il,i)=fr(il,i)+0.5*sigd*(evap(il,i)+evap(il,i+1))
2646 : +0.01*grav*(mp(il,i+1)*(rp(il,i+1)-rr(il,i))-mp(il,i)
2647 : *(rp(il,i)-rr(il,i-1)))*dpinv
2648
2649 fu(il,i)=fu(il,i)+0.01*grav*(mp(il,i+1)*(up(il,i+1)-u(il,i))
2650 : -mp(il,i)*(up(il,i)-u(il,i-1)))*dpinv
2651 fv(il,i)=fv(il,i)+0.01*grav*(mp(il,i+1)*(vp(il,i+1)-v(il,i))
2652 : -mp(il,i)*(vp(il,i)-v(il,i-1)))*dpinv
2653 else ! cvflag_grav
2654 fr(il,i)=fr(il,i)+0.5*sigd*(evap(il,i)+evap(il,i+1))
2655 : +0.1*(mp(il,i+1)*(rp(il,i+1)-rr(il,i))-mp(il,i)
2656 : *(rp(il,i)-rr(il,i-1)))*dpinv
2657 fu(il,i)=fu(il,i)+0.1*(mp(il,i+1)*(up(il,i+1)-u(il,i))
2658 : -mp(il,i)*(up(il,i)-u(il,i-1)))*dpinv
2659 fv(il,i)=fv(il,i)+0.1*(mp(il,i+1)*(vp(il,i+1)-v(il,i))
2660 : -mp(il,i)*(vp(il,i)-v(il,i-1)))*dpinv
2661 endif ! cvflag_grav
2662
2663 endif ! i
2664 1400 continue
2665
2666 c sb: interface with the cloud parameterization: ! cld
2667
2668 do k=i+1,nl
2669 do il=1,ncum
2670 if (k.le.inb(il) .and. i.le.inb(il)) then ! cld
2671 C (saturated downdrafts resulting from mixing) ! cld
2672 qcond(il,i)=qcond(il,i)+elij(il,k,i) ! cld
2673 nqcond(il,i)=nqcond(il,i)+1. ! cld
2674 endif ! cld
2675 enddo ! cld
2676 enddo ! cld
2677
2678 C (particular case: no detraining level is found) ! cld
2679 do il=1,ncum ! cld
2680 if (i.le.inb(il) .and. nent(il,i).eq.0) then ! cld
2681 qcond(il,i)=qcond(il,i)+(1.-ep(il,i))*clw(il,i) ! cld
2682 nqcond(il,i)=nqcond(il,i)+1. ! cld
2683 endif ! cld
2684 enddo ! cld
2685
2686 do il=1,ncum ! cld
2687 if (i.le.inb(il) .and. nqcond(il,i).ne.0.) then ! cld
2688 qcond(il,i)=qcond(il,i)/nqcond(il,i) ! cld
2689 endif ! cld
2690 enddo
2691
2692 c do j=1,ntra
2693 c do il=1,ncum
2694 c if (i.le.inb(il)) then
2695 c dpinv=1.0/(ph(il,i)-ph(il,i+1))
2696 c cpinv=1.0/cpn(il,i)
2697
2698 c if (cvflag_grav) then
2699 c ftra(il,i,j)=ftra(il,i,j)+0.01*grav*dpinv
2700 c : *(mp(il,i+1)*(trap(il,i+1,j)-tra(il,i,j))
2701 c : -mp(il,i)*(trap(il,i,j)-tra(il,i-1,j)))
2702 c else
2703 c ftra(il,i,j)=ftra(il,i,j)+0.1*dpinv
2704 c : *(mp(il,i+1)*(trap(il,i+1,j)-tra(il,i,j))
2705 c : -mp(il,i)*(trap(il,i,j)-tra(il,i-1,j)))
2706 c endif
2707 c endif ! i
2708 c enddo
2709 c enddo
2710
2711 500 continue
2712
2713
2714 c *** move the detrainment at level inb down to level inb-1 ***
2715 c *** in such a way as to preserve the vertically ***
2716 c *** integrated enthalpy and water tendencies ***
2717 c
2718 do 503 il=1,ncum
2719
2720 ax=0.1*ment(il,inb(il),inb(il))*(hp(il,inb(il))-h(il,inb(il))
2721 : +t(il,inb(il))*(cpv-cpd)
2722 : *(rr(il,inb(il))-qent(il,inb(il),inb(il))))
2723 : /(cpn(il,inb(il))*(ph(il,inb(il))-ph(il,inb(il)+1)))
2724 ft(il,inb(il))=ft(il,inb(il))-ax
2725 ft(il,inb(il)-1)=ft(il,inb(il)-1)+ax*cpn(il,inb(il))
2726 : *(ph(il,inb(il))-ph(il,inb(il)+1))/(cpn(il,inb(il)-1)
2727 : *(ph(il,inb(il)-1)-ph(il,inb(il))))
2728
2729 bx=0.1*ment(il,inb(il),inb(il))*(qent(il,inb(il),inb(il))
2730 : -rr(il,inb(il)))/(ph(il,inb(il))-ph(il,inb(il)+1))
2731 fr(il,inb(il))=fr(il,inb(il))-bx
2732 fr(il,inb(il)-1)=fr(il,inb(il)-1)
2733 : +bx*(ph(il,inb(il))-ph(il,inb(il)+1))
2734 : /(ph(il,inb(il)-1)-ph(il,inb(il)))
2735
2736 cx=0.1*ment(il,inb(il),inb(il))*(uent(il,inb(il),inb(il))
2737 : -u(il,inb(il)))/(ph(il,inb(il))-ph(il,inb(il)+1))
2738 fu(il,inb(il))=fu(il,inb(il))-cx
2739 fu(il,inb(il)-1)=fu(il,inb(il)-1)
2740 : +cx*(ph(il,inb(il))-ph(il,inb(il)+1))
2741 : /(ph(il,inb(il)-1)-ph(il,inb(il)))
2742
2743 dx=0.1*ment(il,inb(il),inb(il))*(vent(il,inb(il),inb(il))
2744 : -v(il,inb(il)))/(ph(il,inb(il))-ph(il,inb(il)+1))
2745 fv(il,inb(il))=fv(il,inb(il))-dx
2746 fv(il,inb(il)-1)=fv(il,inb(il)-1)
2747 : +dx*(ph(il,inb(il))-ph(il,inb(il)+1))
2748 : /(ph(il,inb(il)-1)-ph(il,inb(il)))
2749
2750 503 continue
2751
2752 c do j=1,ntra
2753 c do il=1,ncum
2754 c ex=0.1*ment(il,inb(il),inb(il))
2755 c : *(traent(il,inb(il),inb(il),j)-tra(il,inb(il),j))
2756 c : /(ph(il,inb(il))-ph(il,inb(il)+1))
2757 c ftra(il,inb(il),j)=ftra(il,inb(il),j)-ex
2758 c ftra(il,inb(il)-1,j)=ftra(il,inb(il)-1,j)
2759 c : +ex*(ph(il,inb(il))-ph(il,inb(il)+1))
2760 c : /(ph(il,inb(il)-1)-ph(il,inb(il)))
2761 c enddo
2762 c enddo
2763
2764 c
2765 c *** homoginize tendencies below cloud base ***
2766 c
2767 c
2768 do il=1,ncum
2769 asum(il)=0.0
2770 bsum(il)=0.0
2771 csum(il)=0.0
2772 dsum(il)=0.0
2773 enddo
2774
2775 do i=1,nl
2776 do il=1,ncum
2777 if (i.le.(icb(il)-1)) then
2778 asum(il)=asum(il)+ft(il,i)*(ph(il,i)-ph(il,i+1))
2779 bsum(il)=bsum(il)+fr(il,i)*(lv(il,i)+(cl-cpd)*(t(il,i)-t(il,1)))
2780 : *(ph(il,i)-ph(il,i+1))
2781 csum(il)=csum(il)+(lv(il,i)+(cl-cpd)*(t(il,i)-t(il,1)))
2782 : *(ph(il,i)-ph(il,i+1))
2783 dsum(il)=dsum(il)+t(il,i)*(ph(il,i)-ph(il,i+1))/th(il,i)
2784 endif
2785 enddo
2786 enddo
2787
2788 c!!! do 700 i=1,icb(il)-1
2789 do i=1,nl
2790 do il=1,ncum
2791 if (i.le.(icb(il)-1)) then
2792 ft(il,i)=asum(il)*t(il,i)/(th(il,i)*dsum(il))
2793 fr(il,i)=bsum(il)/csum(il)
2794 endif
2795 enddo
2796 enddo
2797
2798 c
2799 c *** reset counter and return ***
2800 c
2801 do il=1,ncum
2802 sig(il,nd)=2.0
2803 enddo
2804
2805
2806 do i=1,nd
2807 do il=1,ncum
2808 upwd(il,i)=0.0
2809 dnwd(il,i)=0.0
2810 enddo
2811 enddo
2812
2813 do i=1,nl
2814 do il=1,ncum
2815 dnwd0(il,i)=-mp(il,i)
2816 enddo
2817 enddo
2818 do i=nl+1,nd
2819 do il=1,ncum
2820 dnwd0(il,i)=0.
2821 enddo
2822 enddo
2823
2824
2825 do i=1,nl
2826 do il=1,ncum
2827 if (i.ge.icb(il) .and. i.le.inb(il)) then
2828 upwd(il,i)=0.0
2829 dnwd(il,i)=0.0
2830 endif
2831 enddo
2832 enddo
2833
2834 do i=1,nl
2835 do k=1,nl
2836 do il=1,ncum
2837 up1(il,k,i)=0.0
2838 dn1(il,k,i)=0.0
2839 enddo
2840 enddo
2841 enddo
2842
2843 do i=1,nl
2844 do k=i,nl
2845 do n=1,i-1
2846 do il=1,ncum
2847 if (i.ge.icb(il).and.i.le.inb(il).and.k.le.inb(il)) then
2848 up1(il,k,i)=up1(il,k,i)+ment(il,n,k)
2849 dn1(il,k,i)=dn1(il,k,i)-ment(il,k,n)
2850 endif
2851 enddo
2852 enddo
2853 enddo
2854 enddo
2855
2856 do i=2,nl
2857 do k=i,nl
2858 do il=1,ncum
2859 ctest if (i.ge.icb(il).and.i.le.inb(il).and.k.le.inb(il)) then
2860 if (i.le.inb(il).and.k.le.inb(il)) then
2861 upwd(il,i)=upwd(il,i)+m(il,k)+up1(il,k,i)
2862 dnwd(il,i)=dnwd(il,i)+dn1(il,k,i)
2863 endif
2864 enddo
2865 enddo
2866 enddo
2867
2868
2869 c!!! DO il=1,ncum
2870 c!!! do i=icb(il),inb(il)
2871 c!!!
2872 c!!! upwd(il,i)=0.0
2873 c!!! dnwd(il,i)=0.0
2874 c!!! do k=i,inb(il)
2875 c!!! up1=0.0
2876 c!!! dn1=0.0
2877 c!!! do n=1,i-1
2878 c!!! up1=up1+ment(il,n,k)
2879 c!!! dn1=dn1-ment(il,k,n)
2880 c!!! enddo
2881 c!!! upwd(il,i)=upwd(il,i)+m(il,k)+up1
2882 c!!! dnwd(il,i)=dnwd(il,i)+dn1
2883 c!!! enddo
2884 c!!! enddo
2885 c!!!
2886 c!!! ENDDO
2887
2888 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
2889 c determination de la variation de flux ascendant entre
2890 c deux niveau non dilue mike
2891 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
2892
2893 do i=1,nl
2894 do il=1,ncum
2895 mike(il,i)=m(il,i)
2896 enddo
2897 enddo
2898
2899 do i=nl+1,nd
2900 do il=1,ncum
2901 mike(il,i)=0.
2902 enddo
2903 enddo
2904
2905 do i=1,nd
2906 do il=1,ncum
2907 ma(il,i)=0
2908 enddo
2909 enddo
2910
2911 do i=1,nl
2912 do j=i,nl
2913 do il=1,ncum
2914 ma(il,i)=ma(il,i)+m(il,j)
2915 enddo
2916 enddo
2917 enddo
2918
2919 do i=nl+1,nd
2920 do il=1,ncum
2921 ma(il,i)=0.
2922 enddo
2923 enddo
2924
2925 do i=1,nl
2926 do il=1,ncum
2927 if (i.le.(icb(il)-1)) then
2928 ma(il,i)=0
2929 endif
2930 enddo
2931 enddo
2932
2933 ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
2934 c icb represente de niveau ou se trouve la
2935 c base du nuage , et inb le top du nuage
2936 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
2937
2938 do i=1,nd
2939 do il=1,ncum
2940 mke(il,i)=upwd(il,i)+dnwd(il,i)
2941 enddo
2942 enddo
2943
2944 do i=1,nd
2945 DO 999 il=1,ncum
2946 rdcp=(rrd*(1.-rr(il,i))-rr(il,i)*rrv)
2947 : /(cpd*(1.-rr(il,i))+rr(il,i)*cpv)
2948 tls(il,i)=t(il,i)*(1000.0/p(il,i))**rdcp
2949 tps(il,i)=tp(il,i)
2950 999 CONTINUE
2951 enddo
2952
2953 c
2954 c *** diagnose the in-cloud mixing ratio *** ! cld
2955 c *** of condensed water *** ! cld
2956 c ! cld
2957
2958 do i=1,nd ! cld
2959 do il=1,ncum ! cld
2960 mac(il,i)=0.0 ! cld
2961 wa(il,i)=0.0 ! cld
2962 siga(il,i)=0.0 ! cld
2963 sax(il,i)=0.0 ! cld
2964 enddo ! cld
2965 enddo ! cld
2966
2967 do i=minorig, nl ! cld
2968 do k=i+1,nl+1 ! cld
2969 do il=1,ncum ! cld
2970 if (i.le.inb(il) .and. k.le.(inb(il)+1)) then ! cld
2971 mac(il,i)=mac(il,i)+m(il,k) ! cld
2972 endif ! cld
2973 enddo ! cld
2974 enddo ! cld
2975 enddo ! cld
2976
2977 do i=1,nl ! cld
2978 do j=1,i ! cld
2979 do il=1,ncum ! cld
2980 if (i.ge.icb(il) .and. i.le.(inb(il)-1) ! cld
2981 : .and. j.ge.icb(il) ) then ! cld
2982 sax(il,i)=sax(il,i)+rrd*(tvp(il,j)-tv(il,j)) ! cld
2983 : *(ph(il,j)-ph(il,j+1))/p(il,j) ! cld
2984 endif ! cld
2985 enddo ! cld
2986 enddo ! cld
2987 enddo ! cld
2988
2989 do i=1,nl ! cld
2990 do il=1,ncum ! cld
2991 if (i.ge.icb(il) .and. i.le.(inb(il)-1) ! cld
2992 : .and. sax(il,i).gt.0.0 ) then ! cld
2993 wa(il,i)=sqrt(2.*sax(il,i)) ! cld
2994 endif ! cld
2995 enddo ! cld
2996 enddo ! cld
2997
2998 do i=1,nl ! cld
2999 do il=1,ncum ! cld
3000 if (wa(il,i).gt.0.0) ! cld
3001 : siga(il,i)=mac(il,i)/wa(il,i) ! cld
3002 : *rrd*tvp(il,i)/p(il,i)/100./delta ! cld
3003 siga(il,i) = min(siga(il,i),1.0) ! cld
3004 cIM cf. FH
3005 if (iflag_clw.eq.0) then
3006 qcondc(il,i)=siga(il,i)*clw(il,i)*(1.-ep(il,i)) ! cld
3007 : + (1.-siga(il,i))*qcond(il,i) ! cld
3008 else if (iflag_clw.eq.1) then
3009 qcondc(il,i)=qcond(il,i) ! cld
3010 endif
3011
3012 enddo ! cld
3013 enddo ! cld
3014
3015 return
3016 end
3017
3018 SUBROUTINE cv3_tracer(nloc,len,ncum,nd,na,
3019 & ment,sij,da,phi)
3020 implicit none
3021 c inputs:
3022 integer ncum, nd, na, nloc,len
3023 real ment(nloc,na,na),sij(nloc,na,na)
3024 c ouputs:
3025 real da(nloc,na),phi(nloc,na,na)
3026 c local variables:
3027 integer i,j,k
3028 c
3029 da(:,:)=0.
3030 c
3031 do j=1,na
3032 do k=1,na
3033 do i=1,ncum
3034 da(i,j)=da(i,j)+(1.-sij(i,k,j))*ment(i,k,j)
3035 phi(i,j,k)=sij(i,k,j)*ment(i,k,j)
3036 c print *,'da',j,k,da(i,j),sij(i,k,j),ment(i,k,j)
3037 end do
3038 end do
3039 end do
3040
3041 return
3042 end
3043
3044
3045 SUBROUTINE cv3_uncompress(nloc,len,ncum,nd,ntra,idcum
3046 : ,iflag
3047 : ,precip,VPrecip,sig,w0
3048 : ,ft,fq,fu,fv,ftra
3049 : ,inb
3050 : ,Ma,upwd,dnwd,dnwd0,qcondc,wd,cape
3051 : ,da,phi,mp
3052 : ,iflag1
3053 : ,precip1,VPrecip1,sig1,w01
3054 : ,ft1,fq1,fu1,fv1,ftra1
3055 : ,inb1
3056 : ,Ma1,upwd1,dnwd1,dnwd01,qcondc1,wd1,cape1
3057 : ,da1,phi1,mp1)
3058 implicit none
3059
3060 include "cvparam3.h"
3061
3062 c inputs:
3063 integer len, ncum, nd, ntra, nloc
3064 integer idcum(nloc)
3065 integer iflag(nloc)
3066 integer inb(nloc)
3067 real precip(nloc)
3068 real VPrecip(nloc,nd+1)
3069 real sig(nloc,nd), w0(nloc,nd)
3070 real ft(nloc,nd), fq(nloc,nd), fu(nloc,nd), fv(nloc,nd)
3071 real ftra(nloc,nd,ntra)
3072 real Ma(nloc,nd)
3073 real upwd(nloc,nd),dnwd(nloc,nd),dnwd0(nloc,nd)
3074 real qcondc(nloc,nd)
3075 real wd(nloc),cape(nloc)
3076 real da(nloc,nd),phi(nloc,nd,nd),mp(nloc,nd)
3077
3078 c outputs:
3079 integer iflag1(len)
3080 integer inb1(len)
3081 real precip1(len)
3082 real VPrecip1(len,nd+1)
3083 real sig1(len,nd), w01(len,nd)
3084 real ft1(len,nd), fq1(len,nd), fu1(len,nd), fv1(len,nd)
3085 real ftra1(len,nd,ntra)
3086 real Ma1(len,nd)
3087 real upwd1(len,nd),dnwd1(len,nd),dnwd01(len,nd)
3088 real qcondc1(nloc,nd)
3089 real wd1(nloc),cape1(nloc)
3090 real da1(nloc,nd),phi1(nloc,nd,nd),mp1(nloc,nd)
3091
3092 c local variables:
3093 integer i,k,j
3094
3095 do 2000 i=1,ncum
3096 precip1(idcum(i))=precip(i)
3097 iflag1(idcum(i))=iflag(i)
3098 wd1(idcum(i))=wd(i)
3099 inb1(idcum(i))=inb(i)
3100 cape1(idcum(i))=cape(i)
3101 2000 continue
3102
3103 do 2020 k=1,nl
3104 do 2010 i=1,ncum
3105 VPrecip1(idcum(i),k)=VPrecip(i,k)
3106 sig1(idcum(i),k)=sig(i,k)
3107 w01(idcum(i),k)=w0(i,k)
3108 ft1(idcum(i),k)=ft(i,k)
3109 fq1(idcum(i),k)=fq(i,k)
3110 fu1(idcum(i),k)=fu(i,k)
3111 fv1(idcum(i),k)=fv(i,k)
3112 Ma1(idcum(i),k)=Ma(i,k)
3113 upwd1(idcum(i),k)=upwd(i,k)
3114 dnwd1(idcum(i),k)=dnwd(i,k)
3115 dnwd01(idcum(i),k)=dnwd0(i,k)
3116 qcondc1(idcum(i),k)=qcondc(i,k)
3117 da1(idcum(i),k)=da(i,k)
3118 mp1(idcum(i),k)=mp(i,k)
3119 2010 continue
3120 2020 continue
3121
3122 do 2200 i=1,ncum
3123 sig1(idcum(i),nd)=sig(i,nd)
3124 2200 continue
3125
3126
3127 c do 2100 j=1,ntra
3128 c do 2110 k=1,nd ! oct3
3129 c do 2120 i=1,ncum
3130 c ftra1(idcum(i),k,j)=ftra(i,k,j)
3131 c 2120 continue
3132 c 2110 continue
3133 c 2100 continue
3134 do j=1,nd
3135 do k=1,nd
3136 do i=1,ncum
3137 phi1(idcum(i),k,j)=phi(i,k,j)
3138 end do
3139 end do
3140 end do
3141
3142 return
3143 end
3144

  ViewVC Help
Powered by ViewVC 1.1.21