5 : ,pbase,plcl,p,ph,tv,tvp
8 ***************************************************************
13 * written
by : frederique cheruy *
14 * vectorization: jean-yves grandpeix, 19/06/2003, 11.54.43 *
16 ***************************************************************
24 integer ncum, nd, nloc
25 integer icb(nloc), inb(nloc)
26 real pbase(nloc),plcl(nloc)
27 real p(nloc,nd), ph(nloc,nd+1)
28 real tv(nloc,nd),tvp(nloc,nd)
31 real cina(nloc),cinb(nloc),plfc(nloc)
35 integer itop(nloc),ineg(nloc),ilow(nloc)
36 integer ifst(nloc),isublcl(nloc)
37 logical lswitch(nloc),lswitch1(nloc),lswitch2(nloc)
38 logical exist_lfc(nloc)
41 real buoylcl(nloc),tvplcl(nloc),tvlcl(nloc)
43 real buoyz(nloc), buoy(nloc,nd)
45 c-------------------------------------------------------------
47 c-------------------------------------------------------------
53 c--------------------------------------------------------------
54 c recompute buoyancies
55 c--------------------------------------------------------------
59 buoy(il,
k) = tvp(il,
k) - tv(il,
k)
62 c---------------------------------------------------------------
64 c calcul
de la flottabilite a
lcl(buoylcl)
65 c ifst = first p-level above
lcl
66 c isublcl = highest p-level below
lcl.
67 c---------------------------------------------------------------
70 tvplcl(il) = tvp(il,1)*(plcl(il)/p(il,1))**(2./7.)
74 IF (plcl(il) .GT. p(il,icb(il)))
THEN
76 isublcl(il) = icb(il)-1
84 tvlcl(il)=tv(il,ifst(il)-1)+(tv(il,ifst(il))-tv(il,ifst(il)-1))
85 $ *(plcl(il)-p(il,ifst(il)-1))/(p(il,ifst(il))-p(il,ifst(il)-1))
89 buoylcl(il) = tvplcl(il)-tvlcl(il)
92 c---------------------------------------------------------------
93 c premiere couche contenant un niveau
de flotabilite positive
94 c et premiere couche contenant un niveau
de flotabilite negative
95 c au dessus du niveau
de condensation
96 c---------------------------------------------------------------
100 exist_lfc(il) = .
false.
104 if (
k .ge. ifst(il))
then
105 if (buoy(il,
k) .gt. 0.)
then
107 exist_lfc(il) = .true.
115 c---------------------------------------------------------------
116 c when there is no positive buoyancy level, set plfc, cina and cinb
118 c---------------------------------------------------------------
120 IF (.NOT.exist_lfc(il))
THEN
128 c---------------------------------------------------------------
129 c -- two cases : buoylcl >= 0 and buoylcl < 0.
130 c---------------------------------------------------------------
132 c--------------------
133 c -- 1.0 buoylcl >=0.
134 c--------------------
138 lswitch1(il)=buoylcl(il) .GE. 0. .AND. exist_lfc(il)
139 lswitch(il) = lswitch1(il)
142 c 1.1 no inhibition
case
143 c ----------------------
144 c If buoyancy is positive at
lcl and stays positive over a large enough
145 c pressure interval(=dpmax), inhibition is set to zero,
148 IF (lswitch(il))
THEN
149 IF (p(il,ineg(il)) .LT. p(il,icb(il))-dpmax)
THEN
157 c 1.2 upper inhibition only
case
158 c ------------------------------
160 lswitch2(il)= p(il,ineg(il)) .GE. p(il,icb(il))-dpmax
161 lswitch(il) = lswitch1(il) .AND. lswitch2(il)
165 IF (lswitch(il))
THEN
169 c ---------------------------------------------------------------------------
170 IF (ineg(il) .GT. isublcl(il)+1)
THEN
171 c in order to get p0, one may interpolate linearly buoyancies
172 c between p(ineg) and p(ineg-1).
173 p0(il)=(buoy(il,ineg(il))*p(il,ineg(il)-1)
174 $ -buoy(il,ineg(il)-1)*p(il,ineg(il)))
175 : / (buoy(il,ineg(il))-buoy(il,ineg(il)-1))
177 c in order to get p0, one has to interpolate between p(ineg) and plcl.
178 p0(il) = (buoy(il,ineg(il))*plcl(il)-buoylcl(il)*p(il,ineg(il)))
179 $ /(buoy(il,ineg(il)) -buoylcl(il))
184 c 1.2.2 recompute itop(=1st layer with positive buoyancy above ineg)
185 c -------------------------------------------------------------------
187 IF (lswitch(il))
THEN
194 IF (lswitch(il))
THEN
195 if (
k .ge. ineg(il) .and. buoy(il,
k) .gt. 0)
then
202 c 1.2.3 computation of plfc
203 c -------------------------
205 IF (lswitch(il))
THEN
206 plfc(il)=(buoy(il,itop(il))*p(il,itop(il)-1)
207 $ -buoy(il,itop(il)-1)*p(il,itop(il)))
208 $ / (buoy(il,itop(il))-buoy(il,itop(il)-1))
212 c 1.2.4 computation of cina
213 c -------------------------
215 c upper part of cina : integral from p(itop-1) to plfc
217 IF (lswitch(il))
THEN
218 deltap = p(il,itop(il)-1)-plfc(il)
219 dcin = rd*buoy(il,itop(il)-1)*deltap
220 $ / (p(il,itop(il)-1)+plfc(il))
221 cina(il) = min(0.,dcin)
225 c middle part of cina : integral from p(ineg) to p(itop-1)
228 IF (lswitch(il))
THEN
229 IF (
k .GE. ineg(il) .AND.
k .LE. itop(il)-2)
THEN
230 deltap = p(il,
k)-p(il,
k+1)
231 dcin = 0.5*rd*(buoy(il,
k)+buoy(il,
k+1))*deltap/ph(il,
k+1)
232 cina(il) = cina(il) + min(0.,dcin)
238 c lower part of cina : integral from p0 to p(ineg)
240 IF (lswitch(il))
THEN
241 deltap = p0(il)-p(il,ineg(il))
242 dcin = rd*buoy(il,ineg(il))*deltap/(p(il,ineg(il))+p0(il))
243 cina(il) = cina(il) + min(0.,dcin)
253 lswitch1(il)=buoylcl(il) .LT. 0. .AND. exist_lfc(il)
254 lswitch(il) = lswitch1(il)
257 c 2.0.1 premiere couche ou la flotabilite est negative au dessus du sol
258 c ----------------------------------------------------
259 c au cas ou elle existe sinon ilow=1 (nk apres)
260 c on suppose que la parcelle part
de la premiere couche
263 IF (lswitch(il))
THEN
270 IF (lswitch(il) .AND.
k .LE.icb(il)-1)
THEN
271 if(buoy(il,
k).lt. 0.)
then
279 c ----------------------------------------------------
281 IF (lswitch(il))
THEN
282 if(ilow(il).gt. 1)
then
283 p0(il)=(buoy(il,ilow(il))*p(il,ilow(il)-1)
284 $ -buoy(il,ilow(il)-1)*p(il,ilow(il)))
285 : / (buoy(il,ilow(il))-buoy(il,ilow(il)-1))
289 buoyz(il) = buoy(il,1)
294 c 2.1. computation of cinb
295 c -----------------------
298 lswitch2(il)= (isublcl(il) .EQ. 1 .AND. ilow(il) .EQ. 1)
299 $ .OR.(isublcl(il) .EQ. ilow(il)-1)
300 lswitch(il) = lswitch1(il) .AND. lswitch2(il)
302 cc
IF ( (isublcl .EQ. 1 .AND. ilow .EQ. 1)
303 cc $ .OR.(isublcl .EQ. ilow-1))
THEN
305 c 2.1.1 first
case : plcl just above p0
306 c -------------------------------------
308 IF (lswitch(il))
THEN
309 deltap = p0(il)-plcl(il)
310 dcin = rd*(buoyz(il)+buoylcl(il))*deltap/(p0(il)+plcl(il))
311 cinb(il) = min(0.,dcin)
316 lswitch(il) = lswitch1(il) .AND. .NOT. lswitch2(il)
320 c 2.1.2 second
case : there is at least one p-level between p0 and plcl
321 c ---------------------------------------------------------------------
323 c lower part of cinb : integral from p0 to p(ilow)
325 IF (lswitch(il))
THEN
326 deltap = p0(il)-p(il,ilow(il))
327 dcin = rd*(buoyz(il)+buoy(il,ilow(il)))*deltap
328 $ /(p0(il)+p(il,ilow(il)))
329 cinb(il) = min(0.,dcin)
334 c middle part of cinb : integral from p(ilow) to p(isublcl)
335 cc
DO k = ilow,isublcl-1
339 $ .AND.
k .GE. ilow(il) .AND.
k .LE. isublcl(il)-1)
THEN
340 deltap = p(il,
k)-p(il,
k+1)
341 dcin = 0.5*rd*(buoy(il,
k)+buoy(il,
k+1))*deltap/ph(il,
k+1)
342 cinb(il) = cinb(il) + min(0.,dcin)
347 c upper part of cinb : integral from p(isublcl) to plcl
349 IF (lswitch(il))
THEN
350 deltap = p(il,isublcl(il)) - plcl(il)
351 dcin = rd*(buoy(il,isublcl(il))+buoylcl(il))*deltap
352 $ /(p(il,isublcl(il))+plcl(il))
353 cinb(il) = cinb(il)+min(0.,dcin)
360 c 2.2 computation of cina
361 c ---------------------
364 lswitch2(il)= plcl(il) .GT. p(il,itop(il)-1)
365 lswitch(il) = lswitch1(il) .AND. lswitch2(il)
368 c 2.2.1 first
case : plcl > p(itop-1)
369 c ---------------------------------
370 c in order to get plfc, one may interpolate linearly buoyancies
371 c between p(itop) and p(itop-1).
373 IF (lswitch(il))
THEN
374 plfc(il)=(buoy(il,itop(il))*p(il,itop(il)-1)
375 $ -buoy(il,itop(il)-1)*p(il,itop(il)))
376 $ / (buoy(il,itop(il))-buoy(il,itop(il)-1))
380 c upper part of cina : integral from p(itop-1) to plfc
382 IF (lswitch(il))
THEN
383 deltap = p(il,itop(il)-1)-plfc(il)
384 dcin = rd*buoy(il,itop(il)-1)*deltap
385 $ /(p(il,itop(il)-1)+plfc(il))
386 cina(il) = min(0.,dcin)
390 c middle part of cina : integral from p(icb+1) to p(itop-1)
394 $ .AND.
k .GE. icb(il)+1 .AND.
k .LE. itop(il)-2)
THEN
395 deltap = p(il,
k)-p(il,
k+1)
396 dcin = 0.5*rd*(buoy(il,
k)+buoy(il,
k+1))*deltap/ph(il,
k+1)
397 cina(il) = cina(il) + min(0.,dcin)
402 c lower part of cina : integral from plcl to p(icb+1)
404 IF (lswitch(il))
THEN
405 IF (plcl(il) .GT. p(il,icb(il)))
THEN
406 IF (icb(il) .LT. itop(il)-1)
THEN
407 deltap = p(il,icb(il))-p(il,icb(il)+1)
408 dcin = 0.5*rd*(buoy(il,icb(il))+buoy(il,icb(il)+1))
409 $ *deltap/ph(il,icb(il)+1)
410 cina(il) = cina(il)+min(0.,dcin)
413 deltap = plcl(il)-p(il,icb(il))
414 dcin = rd*(buoylcl(il)+buoy(il,icb(il)))
415 $ *deltap/(plcl(il)+p(il,icb(il)))
416 cina(il) = cina(il)+min(0.,dcin)
418 deltap = plcl(il)-p(il,icb(il)+1)
419 dcin = rd*(buoylcl(il)+buoy(il,icb(il)+1))
420 $ *deltap/(plcl(il)+p(il,icb(il)+1))
421 cina(il) = cina(il)+min(0.,dcin)
427 lswitch(il) = lswitch1(il) .AND. .NOT. lswitch2(il)
431 c 2.2.2 second
case : plcl lies between p(itop-1) and p(itop);
432 c ----------------------------------------------------------
433 c in order to get plfc, one has to interpolate between p(itop) and plcl.
435 IF (lswitch(il))
THEN
437 $ (buoy(il,itop(il))*plcl(il)-buoylcl(il)*p(il,itop(il)))
438 $ /(buoy(il,itop(il)) -buoylcl(il))
443 IF (lswitch(il))
THEN
444 deltap = plcl(il)-plfc(il)
445 dcin = rd*buoylcl(il)*deltap/(plcl(il)+plfc(il))
446 cina(il) = min(0.,dcin)