LMDZ
convect3.F90
Go to the documentation of this file.
1 
2 ! $Id: convect3.F90 2346 2015-08-21 15:13:46Z emillour $
3 
4 SUBROUTINE convect3(dtime, epmax, ok_adj, t1, r1, rs, u, v, tra, p, ph, nd, &
5  ndp1, nl, ntra, delt, iflag, ft, fr, fu, fv, ftra, precip, icb, inb, &
6  upwd, dnwd, dnwd0, sig, w0, mike, mke, ma, ments, qents, tps, tls, sigij, &
7  cape, tvp, pbase, buoybase, & ! ccc *
8  ! DTVPDT1,DTVPDQ1,DPLCLDT,DPLCLDR)
9  dtvpdt1, dtvpdq1, dplcldt, dplcldr, & ! sbl
10  ft2, fr2, fu2, fv2, wd, qcond, qcondc) ! sbl
11 
12  ! *** THE PARAMETER NA SHOULD IN GENERAL EQUAL ND ***
13 
14  ! #################################################################
15  ! Fleur Introduction des traceurs dans convect3 le 6 juin 200
16  ! #################################################################
17  USE dimphy
18  USE infotrac_phy, ONLY: nbtr
19  IMPLICIT NONE
20  INTEGER na
21  parameter(na=60)
22 
23  REAL deltac ! cld
24  parameter(deltac=0.01) ! cld
25 
26  INTEGER nent(na)
27  INTEGER nd, ndp1, nl, ntra, iflag, icb, inb
28  REAL dtime, epmax, delt, precip, cape
29  REAL dplcldt, dplcldr
30  REAL t1(nd), r1(nd), rs(nd), u(nd), v(nd), tra(nd, ntra)
31  REAL p(nd), ph(ndp1)
32  REAL ft(nd), fr(nd), fu(nd), fv(nd), ftra(nd, ntra)
33  REAL sig(nd), w0(nd)
34  REAL uent(na, na), vent(na, na), traent(na, na, nbtr), tratm(na)
35  REAL up(na), vp(na), trap(na, nbtr)
36  REAL m(na), mp(na), ment(na, na), qent(na, na), elij(na, na)
37  REAL sij(na, na), tvp(na), tv(na), water(na)
38  REAL rp(na), ep(na), th(na), wt(na), evap(na), clw(na)
39  REAL sigp(na), b(na), tp(na), cpn(na)
40  REAL lv(na), lvcp(na), h(na), hp(na), gz(na)
41  REAL t(na), rr(na)
42 
43  REAL ft2(nd), fr2(nd), fu2(nd), fv2(nd) ! added sbl
44  REAL u1(nd), v1(nd) ! added sbl
45 
46  REAL buoy(na) ! Lifted parcel buoyancy
47  REAL dtvpdt1(nd), dtvpdq1(nd) ! Derivatives of parcel virtual
48  ! temperature wrt T1 and Q1
49  REAL clw_new(na), qi(na)
50 
51  REAL wd, betad ! for gust factor (sb)
52  REAL qcondc(nd) ! interface cld param (sb)
53  REAL qcond(nd), nqcond(na), wa(na), maa(na), siga(na), axc(na) ! cld
54 
55  LOGICAL ice_conv, ok_adj
56  parameter(ice_conv=.true.)
57 
58  ! ccccccccccccccccccccccccccccccccccccccccccccc
59  ! declaration des variables a sortir
60  ! cccccccccccccccccccccccccccccccccccccccccccc
61  REAL mke(nd)
62  REAL mike(nd)
63  REAL ma(nd)
64  REAL tps(nd) !temperature dans les ascendances non diluees
65  REAL tls(nd) !temperature potentielle
66  REAL ments(nd, nd)
67  REAL qents(nd, nd)
68  REAL sigij(klev, klev)
69  REAL pbase ! pressure at the cloud base level
70  REAL buoybase ! buoyancy at the cloud base level
71  ! ccccccccccccccccccccccccccccccccccccccccccccc
72 
73 
74  REAL :: cpv,cl,cpvmcl,eps,alv0,rdcp,pbcrit,ptcrit,sigd,spfac
75  REAL :: tau,beta,alpha,dtcrit,dtovsh,ahm,rm,um,vm,dphinv
76  REAL :: a2,x,tvx,tvy,plcl,pden,dpbase,tvpbase,tvbase,tdif
77  REAL :: ath1,ath,delti,deltap,dcape,dlnp,sigold,dtmin,fac,w
78  REAL :: amu,rti,cpd,bf2,anum,denom,dei,altem,cwat,stemp,qp
79  REAL :: scrit,alt,smax,asij,wgh,sjmax,sjmin,smid,delp,delm
80  REAL :: asum,bsum,csum,wflux,tinv,wdtrain,awat,afac,afac1,afac2
81  REAL :: bfac,pr1,pr2,sigt,b6,c6,revap,tevap,delth,amfac,amp2
82  REAL :: xf,tf,af,bf,fac2,ur,sru,d,ampmax,dpinv,am,amde,cpinv
83  REAL :: amp1,ad,rat,ax,bx,cx,dx,ex,dsum
84  INTEGER :: nk,i,j,nopt,jn,k,im,jm,n
85 
86  REAL dnwd0(nd) ! precipitation driven unsaturated downdraft flux
87  REAL dnwd(nd), dn1 ! in-cloud saturated downdraft mass flux
88  REAL upwd(nd), up1 ! in-cloud saturated updraft mass flux
89 
90  ! *** ASSIGN VALUES OF THERMODYNAMIC CONSTANTS ***
91  ! *** THESE SHOULD BE CONSISTENT WITH ***
92  ! *** THOSE USED IN CALLING PROGRAM ***
93  ! *** NOTE: THESE ARE ALSO SPECIFIED IN SUBROUTINE TLIFT ***
94 
95  ! sb CPD=1005.7
96  ! sb CPV=1870.0
97  ! sb CL=4190.0
98  ! sb CPVMCL=CL-CPV
99  ! sb RV=461.5
100  ! sb RD=287.04
101  ! sb EPS=RD/RV
102  ! sb ALV0=2.501E6
103  ! cccccccccccccccccccccc
104  ! constantes coherentes avec le modele du Centre Europeen
105  ! sb RD = 1000.0 * 1.380658E-23 * 6.0221367E+23 / 28.9644
106  ! sb RV = 1000.0 * 1.380658E-23 * 6.0221367E+23 / 18.0153
107  ! sb CPD = 3.5 * RD
108  ! sb CPV = 4.0 * RV
109  ! sb CL = 4218.0
110  ! sb CPVMCL=CL-CPV
111  ! sb EPS=RD/RV
112  ! sb ALV0=2.5008E+06
113  ! ccccccccccccccccccccc
114  ! on utilise les constantes thermo du Centre Europeen: (SB)
115 
116  include "YOMCST.h"
117 
118  cpd = rcpd
119  cpv = rcpv
120  cl = rcw
121  cpvmcl = cl - cpv
122  eps = rd/rv
123  alv0 = rlvtt
124 
125  nk = 1 ! origin level of the lifted parcel
126 
127  ! ccccccccccccccccccccc
128 
129  ! *** INITIALIZE OUTPUT ARRAYS AND PARAMETERS ***
130 
131  DO i = 1, nd
132  ft(i) = 0.0
133  fr(i) = 0.0
134  fu(i) = 0.0
135  fv(i) = 0.0
136 
137  ft2(i) = 0.0
138  fr2(i) = 0.0
139  fu2(i) = 0.0
140  fv2(i) = 0.0
141 
142  DO j = 1, ntra
143  ftra(i, j) = 0.0
144  END DO
145 
146  qcondc(i) = 0.0 ! cld
147  qcond(i) = 0.0 ! cld
148  nqcond(i) = 0.0 ! cld
149 
150  t(i) = t1(i)
151  rr(i) = r1(i)
152  u1(i) = u(i) ! added sbl
153  v1(i) = v(i) ! added sbl
154  END DO
155  DO i = 1, nl
156  rdcp = (rd*(1.-rr(i))+rr(i)*rv)/(cpd*(1.-rr(i))+rr(i)*cpv)
157  th(i) = t(i)*(1000.0/p(i))**rdcp
158  END DO
159 
160  ! ************************************************************
161  ! * CALCUL DES TEMPERATURES POTENTIELLES A SORTIR
162  ! ************************************************************
163  DO i = 1, nd
164  rdcp = (rd*(1.-rr(i))+rr(i)*rv)/(cpd*(1.-rr(i))+rr(i)*cpv)
165 
166  tls(i) = t(i)*(1000.0/p(i))**rdcp
167  END DO
168 
169 
170 
171 
172  ! ***********************************************************
173 
174 
175  precip = 0.0
176  wd = 0.0 ! sb
177  iflag = 1
178 
179  ! *** SPECIFY PARAMETERS ***
180  ! *** PBCRIT IS THE CRITICAL CLOUD DEPTH (MB) BENEATH WHICH THE ***
181  ! *** PRECIPITATION EFFICIENCY IS ASSUMED TO BE ZERO ***
182  ! *** PTCRIT IS THE CLOUD DEPTH (MB) ABOVE WHICH THE PRECIP. ***
183  ! *** EFFICIENCY IS ASSUMED TO BE UNITY ***
184  ! *** SIGD IS THE FRACTIONAL AREA COVERED BY UNSATURATED DNDRAFT ***
185  ! *** SPFAC IS THE FRACTION OF PRECIPITATION FALLING OUTSIDE ***
186  ! *** OF CLOUD ***
187  ! *** ALPHA AND BETA ARE PARAMETERS THAT CONTROL THE RATE OF ***
188  ! *** APPROACH TO QUASI-EQUILIBRIUM ***
189  ! *** (THEIR STANDARD VALUES ARE 1.0 AND 0.96, RESPECTIVELY) ***
190  ! *** (BETA MUST BE LESS THAN OR EQUAL TO 1) ***
191  ! *** DTCRIT IS THE CRITICAL BUOYANCY (K) USED TO ADJUST THE ***
192  ! *** APPROACH TO QUASI-EQUILIBRIUM ***
193  ! *** IT MUST BE LESS THAN 0 ***
194 
195  pbcrit = 150.0
196  ptcrit = 500.0
197  sigd = 0.01
198  spfac = 0.15
199  ! sb:
200  ! EPMAX=0.993 ! precip efficiency less than unity
201  ! EPMAX=1. ! precip efficiency less than unity
202 
203  ! jyg
204  ! CC BETA=0.96
205  ! Beta is now expressed as a function of the characteristic time
206  ! of the convective process.
207  ! CC Old value : TAU = 15000. !(for dtime = 600.s)
208  ! CC Other value (inducing little change) :TAU = 8000.
209  tau = 8000.
210  beta = 1. - dtime/tau
211  ! jyg
212  ! CC ALPHA=1.0
213  alpha = 1.5e-3*dtime/tau
214  ! Increase alpha in order to compensate W decrease
215  alpha = alpha*1.5
216 
217  ! jyg (voir CONVECT 3)
218  ! CC DTCRIT=-0.2
219  dtcrit = -2.
220  ! gf&jyg
221  ! CC DT pour l'overshoot.
222  dtovsh = -0.2
223 
224 
225  ! *** INCREMENT THE COUNTER ***
226 
227  sig(nd) = sig(nd) + 1.0
228  sig(nd) = amin1(sig(nd), 12.1)
229 
230  ! *** IF NOPT IS AN INTEGER OTHER THAN 0, CONVECT ***
231  ! *** RETURNS ARRAYS T AND R THAT MAY HAVE BEEN ***
232  ! *** ALTERED BY DRY ADIABATIC ADJUSTMENT; OTHERWISE ***
233  ! *** THE RETURNED ARRAYS ARE UNALTERED. ***
234 
235  nopt = 0
236  ! ! NOPT=1 ! sbl
237 
238  ! *** PERFORM DRY ADIABATIC ADJUSTMENT ***
239 
240  ! *** DO NOT BYPASS THIS EVEN IF THE CALLING PROGRAM HAS A ***
241  ! *** BOUNDARY LAYER SCHEME !!! ***
242 
243  IF (ok_adj) THEN ! added sbl
244 
245  DO i = nl - 1, 1, -1
246  jn = 0
247  DO j = i + 1, nl
248  IF (th(j)<th(i)) jn = j
249  END DO
250  IF (jn==0) GO TO 30
251  ahm = 0.0
252  rm = 0.0
253  um = 0.0
254  vm = 0.0
255  DO k = 1, ntra
256  tratm(k) = 0.0
257  END DO
258  DO j = i, jn
259  ahm = ahm + (cpd*(1.-rr(j))+rr(j)*cpv)*t(j)*(ph(j)-ph(j+1))
260  rm = rm + rr(j)*(ph(j)-ph(j+1))
261  um = um + u(j)*(ph(j)-ph(j+1))
262  vm = vm + v(j)*(ph(j)-ph(j+1))
263  DO k = 1, ntra
264  tratm(k) = tratm(k) + tra(j, k)*(ph(j)-ph(j+1))
265  END DO
266  END DO
267  dphinv = 1./(ph(i)-ph(jn+1))
268  rm = rm*dphinv
269  um = um*dphinv
270  vm = vm*dphinv
271  DO k = 1, ntra
272  tratm(k) = tratm(k)*dphinv
273  END DO
274  a2 = 0.0
275  DO j = i, jn
276  rr(j) = rm
277  u(j) = um
278  v(j) = vm
279  DO k = 1, ntra
280  tra(j, k) = tratm(k)
281  END DO
282  rdcp = (rd*(1.-rr(j))+rr(j)*rv)/(cpd*(1.-rr(j))+rr(j)*cpv)
283  x = (0.001*p(j))**rdcp
284  t(j) = x
285  a2 = a2 + (cpd*(1.-rr(j))+rr(j)*cpv)*x*(ph(j)-ph(j+1))
286  END DO
287  DO j = i, jn
288  th(j) = ahm/a2
289  t(j) = t(j)*th(j)
290  END DO
291 30 END DO
292 
293  END IF ! added sbl
294 
295  ! *** RESET INPUT ARRAYS IF ok_adj 0 ***
296 
297  IF (ok_adj) THEN
298  DO i = 1, nd
299 
300  ft2(i) = (t(i)-t1(i))/delt ! sbl
301  fr2(i) = (rr(i)-r1(i))/delt ! sbl
302  fu2(i) = (u(i)-u1(i))/delt ! sbl
303  fv2(i) = (v(i)-v1(i))/delt ! sbl
304 
305  ! ! T1(I)=T(I) ! commente sbl
306  ! ! R1(I)=RR(I) ! commente sbl
307  END DO
308  END IF
309 
310  ! *** CALCULATE ARRAYS OF GEOPOTENTIAL, HEAT CAPACITY AND STATIC ENERGY
311 
312  gz(1) = 0.0
313  cpn(1) = cpd*(1.-rr(1)) + rr(1)*cpv
314  h(1) = t(1)*cpn(1)
315  DO i = 2, nl
316  tvx = t(i)*(1.+rr(i)/eps-rr(i))
317  tvy = t(i-1)*(1.+rr(i-1)/eps-rr(i-1))
318  gz(i) = gz(i-1) + 0.5*rd*(tvx+tvy)*(p(i-1)-p(i))/ph(i)
319  cpn(i) = cpd*(1.-rr(i)) + cpv*rr(i)
320  h(i) = t(i)*cpn(i) + gz(i)
321  END DO
322 
323  ! *** CALCULATE LIFTED CONDENSATION LEVEL OF AIR AT LOWEST MODEL LEVEL ***
324  ! *** (WITHIN 0.2% OF FORMULA OF BOLTON, MON. WEA. REV.,1980) ***
325 
326  IF (t(1)<250.0 .OR. rr(1)<=0.0) THEN
327  iflag = 0
328  ! sb3d print*,'je suis passe par 366'
329  RETURN
330  END IF
331 
332  ! jyg1 Utilisation de la subroutine CLIFT
333  ! C RH=RR(1)/RS(1)
334  ! C CHI=T(1)/(1669.0-122.0*RH-T(1))
335  ! C PLCL=P(1)*(RH**CHI)
336  CALL clift(p(1), t(1), rr(1), rs(1), plcl, dplcldt, dplcldr)
337  ! jyg2
338  ! sb3d PRINT *,' em_plcl,p1,t1,r1,rs1,rh '
339  ! sb3d $ ,PLCL,P(1),T(1),RR(1),RS(1),RH
340 
341  IF (plcl<200.0 .OR. plcl>=2000.0) THEN
342  iflag = 2
343  RETURN
344  END IF
345  ! jyg1
346  ! Essais de modification de ICB
347 
348  ! *** CALCULATE FIRST LEVEL ABOVE LCL (=ICB) ***
349 
350  ! C ICB=NL-1
351  ! C DO 50 I=2,NL-1
352  ! C IF(P(I).LT.PLCL)THEN
353  ! C ICB=MIN(ICB,I) ! ICB sup ou egal a 2
354  ! C END IF
355  ! C 50 CONTINUE
356  ! C IF(ICB.EQ.(NL-1))THEN
357  ! C IFLAG=3
358  ! C RETURN
359  ! C END IF
360 
361  ! *** CALCULATE LAYER CONTAINING LCL (=ICB) ***
362 
363  icb = nl - 1
364  ! sb DO 50 I=2,NL-1
365  DO i = 3, nl - 1 ! modif sb pour que ICB soit sup/egal a 2
366  ! la modification consiste a comparer PLCL a PH et non a P:
367  ! ICB est defini par : PH(ICB)<PLCL<PH(ICB-!)
368  IF (ph(i)<plcl) THEN
369  icb = min(icb, i)
370  END IF
371  END DO
372  IF (icb==(nl-1)) THEN
373  iflag = 3
374  RETURN
375  END IF
376  icb = icb - 1 ! ICB sup ou egal a 2
377  ! jyg2
378 
379 
380 
381  ! *** SUBROUTINE TLIFT CALCULATES PART OF THE LIFTED PARCEL VIRTUAL
382  ! ***
383  ! *** TEMPERATURE, THE ACTUAL TEMPERATURE AND THE ADIABATIC
384  ! ***
385  ! *** LIQUID WATER CONTENT
386  ! ***
387 
388 
389  ! jyg1
390  ! make sure that "Cloud base" seen by TLIFT is actually the
391  ! fisrt level where adiabatic ascent is saturated
392  IF (plcl>p(icb)) THEN
393  ! sb CALL TLIFT(P,T,RR,RS,GZ,PLCL,ICB,TVP,TP,CLW,ND,NL)
394  CALL tlift(p, t, rr, rs, gz, plcl, icb, nk, tvp, tp, clw, nd, nl, &
395  dtvpdt1, dtvpdq1)
396  ELSE
397  ! sb CALL TLIFT(P,T,RR,RS,GZ,PLCL,ICB+1,TVP,TP,CLW,ND,NL)
398  CALL tlift(p, t, rr, rs, gz, plcl, icb+1, nk, tvp, tp, clw, nd, nl, &
399  dtvpdt1, dtvpdq1)
400  END IF
401  ! jyg2
402 
403  ! *****************************************************************************
404  ! *** SORTIE DE LA TEMPERATURE DE L ASCENDANCE NON DILUE
405  ! *****************************************************************************
406  DO i = 1, nd
407  tps(i) = tp(i)
408  END DO
409 
410 
411  ! *****************************************************************************
412 
413 
414  ! *** SET THE PRECIPITATION EFFICIENCIES AND THE FRACTION OF ***
415  ! *** PRECIPITATION FALLING OUTSIDE OF CLOUD ***
416  ! *** THESE MAY BE FUNCTIONS OF TP(I), P(I) AND CLW(I) ***
417 
418  DO i = 1, nl
419  pden = ptcrit - pbcrit
420 
421  ! jyg
422  ! cc EP(I)=(P(ICB)-P(I)-PBCRIT)/PDEN
423  ! sb EP(I)=(PLCL-P(I)-PBCRIT)/PDEN
424  ep(i) = (plcl-p(i)-pbcrit)/pden*epmax ! sb
425 
426  ep(i) = amax1(ep(i), 0.0)
427  ! sb EP(I)=AMIN1(EP(I),1.0)
428  ep(i) = amin1(ep(i), epmax) ! sb
429  sigp(i) = spfac
430 
431  ! *** CALCULATE VIRTUAL TEMPERATURE AND LIFTED PARCEL ***
432  ! *** VIRTUAL TEMPERATURE ***
433 
434  tv(i) = t(i)*(1.+rr(i)/eps-rr(i))
435  ! cd1
436  ! . Keep all liquid water in lifted parcel (-> adiabatic CAPE)
437 
438  ! cc TVP(I)=TVP(I)-TP(I)*(RR(1)-EP(I)*CLW(I))
439  ! !!! sb TVP(I)=TVP(I)-TP(I)*RR(1) ! calcule dans tlift
440  ! cd2
441 
442  ! *** Calculate first estimate of buoyancy
443 
444  buoy(i) = tvp(i) - tv(i)
445  END DO
446 
447  ! *** Set Cloud Base Buoyancy at (Plcl+DPbase) level buoyancy
448 
449  dpbase = -40. !That is 400m above LCL
450  pbase = plcl + dpbase
451  tvpbase = tvp(icb)*(pbase-p(icb+1))/(p(icb)-p(icb+1)) + &
452  tvp(icb+1)*(p(icb)-pbase)/(p(icb)-p(icb+1))
453  tvbase = tv(icb)*(pbase-p(icb+1))/(p(icb)-p(icb+1)) + &
454  tv(icb+1)*(p(icb)-pbase)/(p(icb)-p(icb+1))
455 
456  ! test sb:
457  ! @ write(*,*) '++++++++++++++++++++++++++++++++++++++++'
458  ! @ write(*,*) 'plcl,dpbas,tvpbas,tvbas,tvp(icb),tvp(icb1)
459  ! @ : ,tv(icb),tv(icb1)'
460  ! @ write(*,*) plcl,dpbase,tvpbase,tvbase,tvp(icb)
461  ! @ L ,tvp(icb+1),tv(icb),tv(icb+1)
462  ! @ write(*,*) '++++++++++++++++++++++++++++++++++++++++'
463  ! fin test sb
464  buoybase = tvpbase - tvbase
465 
466  ! C Set buoyancy = BUOYBASE for all levels below BASE.
467  ! C For safety, set : BUOY(ICB) = BUOYBASE
468  DO i = icb, nl
469  IF (p(i)>=pbase) THEN
470  buoy(i) = buoybase
471  END IF
472  END DO
473  buoy(icb) = buoybase
474 
475  ! sb3d print *,'buoybase,tvp_tv,tvpbase,tvbase,pbase,plcl'
476  ! sb3d $, buoybase,tvp(icb)-tv(icb),tvpbase,tvbase,pbase,plcl
477  ! sb3d print *,'TVP ',(tvp(i),i=1,nl)
478  ! sb3d print *,'TV ',(tv(i),i=1,nl)
479  ! sb3d print *, 'P ',(p(i),i=1,nl)
480  ! sb3d print *,'ICB ',icb
481  ! test sb:
482  ! @ write(*,*) '@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@'
483  ! @ write(*,*) 'icb,icbs,inb,buoybase:'
484  ! @ write(*,*) icb,icb+1,inb,buoybase
485  ! @ write(*,*) 'k,tvp,tv,tp,buoy,ep: '
486  ! @ do k=1,nl
487  ! @ write(*,*) k,tvp(k),tv(k),tp(k),buoy(k),ep(k)
488  ! @ enddo
489  ! @ write(*,*) '@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@'
490  ! fin test sb
491 
492 
493 
494  ! *** MAKE SURE THAT COLUMN IS DRY ADIABATIC BETWEEN THE SURFACE ***
495  ! *** AND CLOUD BASE, AND THAT LIFTED AIR IS POSITIVELY BUOYANT ***
496  ! *** AT CLOUD BASE ***
497  ! *** IF NOT, RETURN TO CALLING PROGRAM AFTER RESETTING ***
498  ! *** SIG(I) AND W0(I) ***
499 
500  ! jyg
501  ! CC TDIF=TVP(ICB)-TV(ICB)
502  tdif = buoy(icb)
503  ath1 = th(1)
504  ! jyg
505  ! CC ATH=TH(ICB-1)-1.0
506  ath = th(icb-1) - 5.0
507  ! ATH=0. ! ajout sb
508  ! IF (ICB.GT.1) ATH=TH(ICB-1)-5.0 ! modif sb
509  IF (tdif<dtcrit .OR. ath>ath1) THEN
510  DO i = 1, nl
511  sig(i) = beta*sig(i) - 2.*alpha*tdif*tdif
512  sig(i) = amax1(sig(i), 0.0)
513  w0(i) = beta*w0(i)
514  END DO
515  iflag = 0
516  RETURN
517  END IF
518 
519 
520 
521  ! *** IF THIS POINT IS REACHED, MOIST CONVECTIVE ADJUSTMENT IS NECESSARY
522  ! ***
523  ! *** NOW INITIALIZE VARIOUS ARRAYS USED IN THE COMPUTATIONS
524  ! ***
525 
526  DO i = 1, nl
527  hp(i) = h(i)
528  wt(i) = 0.001
529  rp(i) = rr(i)
530  up(i) = u(i)
531  vp(i) = v(i)
532  DO j = 1, ntra
533  trap(i, j) = tra(i, j)
534  END DO
535  nent(i) = 0
536  water(i) = 0.0
537  evap(i) = 0.0
538  b(i) = 0.0
539  mp(i) = 0.0
540  m(i) = 0.0
541  lv(i) = alv0 - cpvmcl*(t(i)-273.15)
542  lvcp(i) = lv(i)/cpn(i)
543  DO j = 1, nl
544  qent(i, j) = rr(j)
545  elij(i, j) = 0.0
546  ment(i, j) = 0.0
547  sij(i, j) = 0.0
548  uent(i, j) = u(j)
549  vent(i, j) = v(j)
550  DO k = 1, ntra
551  traent(i, j, k) = tra(j, k)
552  END DO
553  END DO
554  END DO
555 
556  delti = 1.0/delt
557 
558  ! *** FIND THE FIRST MODEL LEVEL (INB) ABOVE THE PARCEL'S ***
559  ! *** LEVEL OF NEUTRAL BUOYANCY ***
560 
561  inb = nl - 1
562  DO i = icb, nl - 1
563  ! jyg
564  ! CC IF((TVP(I)-TV(I)).LT.DTCRIT)THEN
565  IF (buoy(i)<dtovsh) THEN
566  inb = min(inb, i)
567  END IF
568  END DO
569 
570 
571 
572 
573 
574  ! *** RESET SIG(I) AND W0(I) FOR I>INB AND I<ICB ***
575 
576  IF (inb<(nl-1)) THEN
577  DO i = inb + 1, nl - 1
578  ! jyg
579  ! CC SIG(I)=BETA*SIG(I)-2.0E-4*ALPHA*(TV(INB)-TVP(INB))*
580  ! CC 1 ABS(TV(INB)-TVP(INB))
581  sig(i) = beta*sig(i) + 2.*alpha*buoy(inb)*abs(buoy(inb))
582  sig(i) = amax1(sig(i), 0.0)
583  w0(i) = beta*w0(i)
584  END DO
585  END IF
586  DO i = 1, icb
587  ! jyg
588  ! CC SIG(I)=BETA*SIG(I)-2.0E-4*ALPHA*(TV(ICB)-TVP(ICB))*
589  ! CC 1 (TV(ICB)-TVP(ICB))
590  sig(i) = beta*sig(i) - 2.*alpha*buoy(icb)*buoy(icb)
591  sig(i) = amax1(sig(i), 0.0)
592  w0(i) = beta*w0(i)
593  END DO
594 
595  ! *** RESET FRACTIONAL AREAS OF UPDRAFTS AND W0 AT INITIAL TIME ***
596  ! *** AND AFTER 10 TIME STEPS OF NO CONVECTION ***
597 
598 
599  IF (sig(nd)<1.5 .OR. sig(nd)>12.0) THEN
600  DO i = 1, nl - 1
601  sig(i) = 0.0
602  w0(i) = 0.0
603  END DO
604  END IF
605 
606  ! *** CALCULATE LIQUID WATER STATIC ENERGY OF LIFTED PARCEL ***
607 
608  DO i = icb, inb
609  hp(i) = h(1) + (lv(i)+(cpd-cpv)*t(i))*ep(i)*clw(i)
610  END DO
611 
612  ! *** CALCULATE CONVECTIVE AVAILABLE POTENTIAL ENERGY (CAPE), ***
613  ! *** VERTICAL VELOCITY (W), FRACTIONAL AREA COVERED BY ***
614  ! *** UNDILUTE UPDRAFT (SIG), AND UPDRAFT MASS FLUX (M) ***
615 
616  cape = 0.0
617 
618  DO i = icb + 1, inb
619  ! jyg1
620  ! CC CAPE=CAPE+RD*(TVP(I-1)-TV(I-1))*(PH(I-1)-PH(I))/P(I-1)
621  ! CC DCAPE=RD*BUOY(I-1)*(PH(I-1)-PH(I))/P(I-1)
622  ! CC DLNP=(PH(I-1)-PH(I))/P(I-1)
623  ! The interval on which CAPE is computed starts at PBASE :
624  deltap = min(pbase, ph(i-1)) - min(pbase, ph(i))
625  cape = cape + rd*buoy(i-1)*deltap/p(i-1)
626  dcape = rd*buoy(i-1)*deltap/p(i-1)
627  dlnp = deltap/p(i-1)
628  ! jyg2
629  ! sb3d print *,'buoy,dlnp,dcape,cape',buoy(i-1),dlnp,dcape,cape
630  ! test sb:
631  ! @ write(*,*) '############################################'
632  ! @ write(*,*) 'cape,rrd,buoy,deltap,p,pbase,ph:'
633  ! @ : ,cape,rd,buoy(i-1),deltap,p(i-1),pbase,ph(i)
634  ! @ write(*,*) '############################################'
635 
636  ! fin test sb
637  cape = amax1(0.0, cape)
638 
639  sigold = sig(i)
640  dtmin = 100.0
641  DO j = icb, i - 1
642  ! jyg
643  ! CC DTMIN=AMIN1(DTMIN,(TVP(J)-TV(J)))
644  dtmin = amin1(dtmin, buoy(j))
645  END DO
646  ! sb3d print *, 'DTMIN, BETA, ALPHA, SIG = ',DTMIN,BETA,ALPHA,SIG(I)
647  sig(i) = beta*sig(i) + alpha*dtmin*abs(dtmin)
648  sig(i) = amax1(sig(i), 0.0)
649  sig(i) = amin1(sig(i), 0.01)
650  fac = amin1(((dtcrit-dtmin)/dtcrit), 1.0)
651  ! jyg
652  ! C Essais de reduction de la vitesse
653  ! C FAC = FAC*.5
654 
655  w = (1.-beta)*fac*sqrt(cape) + beta*w0(i)
656  amu = 0.5*(sig(i)+sigold)*w
657  m(i) = amu*0.007*p(i)*(ph(i)-ph(i+1))/tv(i)
658 
659  ! --------- test sb:
660  ! write(*,*) '############################################'
661  ! write(*,*) 'k,amu,buoy(k-1),deltap,w,beta,fac,cape,w0(k)'
662  ! write(*,*) i,amu,buoy(i-1),deltap
663  ! : ,w,beta,fac,cape,w0(i)
664  ! write(*,*) '############################################'
665  ! ---------
666 
667  w0(i) = w
668  END DO
669  w0(icb) = 0.5*w0(icb+1)
670  m(icb) = 0.5*m(icb+1)*(ph(icb)-ph(icb+1))/(ph(icb+1)-ph(icb+2))
671  sig(icb) = sig(icb+1)
672  sig(icb-1) = sig(icb)
673  ! jyg1
674  ! sb3d print *, 'Cloud base, c. top, CAPE',ICB,INB,cape
675  ! sb3d print *, 'SIG ',(sig(i),i=1,inb)
676  ! sb3d print *, 'W ',(w0(i),i=1,inb)
677  ! sb3d print *, 'M ',(m(i), i=1,inb)
678  ! sb3d print *, 'Dt1 ',(tvp(i)-tv(i),i=1,inb)
679  ! sb3d print *, 'Dt_vrai ',(buoy(i),i=1,inb)
680  ! jyg2
681 
682  ! *** CALCULATE ENTRAINED AIR MASS FLUX (MENT), TOTAL WATER MIXING ***
683  ! *** RATIO (QENT), TOTAL CONDENSED WATER (ELIJ), AND MIXING ***
684  ! *** FRACTION (SIJ) ***
685 
686 
687 
688  DO i = icb, inb
689  rti = rr(1) - ep(i)*clw(i)
690  DO j = icb - 1, inb
691  bf2 = 1. + lv(j)*lv(j)*rs(j)/(rv*t(j)*t(j)*cpd)
692  anum = h(j) - hp(i) + (cpv-cpd)*t(j)*(rti-rr(j))
693  denom = h(i) - hp(i) + (cpd-cpv)*(rr(i)-rti)*t(j)
694  dei = denom
695  IF (abs(dei)<0.01) dei = 0.01
696  sij(i, j) = anum/dei
697  sij(i, i) = 1.0
698  altem = sij(i, j)*rr(i) + (1.-sij(i,j))*rti - rs(j)
699  altem = altem/bf2
700  cwat = clw(j)*(1.-ep(j))
701  stemp = sij(i, j)
702  IF ((stemp<0.0 .OR. stemp>1.0 .OR. altem>cwat) .AND. j>i) THEN
703  anum = anum - lv(j)*(rti-rs(j)-cwat*bf2)
704  denom = denom + lv(j)*(rr(i)-rti)
705  IF (abs(denom)<0.01) denom = 0.01
706  sij(i, j) = anum/denom
707  altem = sij(i, j)*rr(i) + (1.-sij(i,j))*rti - rs(j)
708  altem = altem - (bf2-1.)*cwat
709  END IF
710 
711 
712  IF (sij(i,j)>0.0 .AND. sij(i,j)<0.95) THEN
713  qent(i, j) = sij(i, j)*rr(i) + (1.-sij(i,j))*rti
714  uent(i, j) = sij(i, j)*u(i) + (1.-sij(i,j))*u(nk)
715  vent(i, j) = sij(i, j)*v(i) + (1.-sij(i,j))*v(nk)
716  DO k = 1, ntra
717  traent(i, j, k) = sij(i, j)*tra(i, k) + (1.-sij(i,j))*tra(nk, k)
718  END DO
719  elij(i, j) = altem
720  elij(i, j) = amax1(0.0, elij(i,j))
721  ment(i, j) = m(i)/(1.-sij(i,j))
722  nent(i) = nent(i) + 1
723  END IF
724  sij(i, j) = amax1(0.0, sij(i,j))
725  sij(i, j) = amin1(1.0, sij(i,j))
726  END DO
727 
728  ! *** IF NO AIR CAN ENTRAIN AT LEVEL I ASSUME THAT UPDRAFT DETRAINS
729  ! ***
730  ! *** AT THAT LEVEL AND CALCULATE DETRAINED AIR FLUX AND PROPERTIES
731  ! ***
732 
733  IF (nent(i)==0) THEN
734  ment(i, i) = m(i)
735  qent(i, i) = rr(nk) - ep(i)*clw(i)
736  uent(i, i) = u(nk)
737  vent(i, i) = v(nk)
738  DO j = 1, ntra
739  traent(i, i, j) = tra(nk, j)
740  END DO
741  elij(i, i) = clw(i)
742  sij(i, i) = 1.0
743  END IF
744 
745  DO j = icb - 1, inb
746  sigij(i, j) = sij(i, j)
747  END DO
748 
749  END DO
750 
751  ! *** NORMALIZE ENTRAINED AIR MASS FLUXES TO REPRESENT EQUAL ***
752  ! *** PROBABILITIES OF MIXING ***
753 
754 
755  DO i = icb, inb
756  IF (nent(i)/=0) THEN
757  qp = rr(1) - ep(i)*clw(i)
758  anum = h(i) - hp(i) - lv(i)*(qp-rs(i)) + (cpv-cpd)*t(i)*(qp-rr(i))
759  denom = h(i) - hp(i) + lv(i)*(rr(i)-qp) + (cpd-cpv)*t(i)*(rr(i)-qp)
760  IF (abs(denom)<0.01) denom = 0.01
761  scrit = anum/denom
762  alt = qp - rs(i) + scrit*(rr(i)-qp)
763  IF (scrit<=0.0 .OR. alt<=0.0) scrit = 1.0
764  smax = 0.0
765  asij = 0.0
766  DO j = inb, icb - 1, -1
767  IF (sij(i,j)>1.0e-16 .AND. sij(i,j)<0.95) THEN
768  wgh = 1.0
769  IF (j>i) THEN
770  sjmax = amax1(sij(i,j+1), smax)
771  sjmax = amin1(sjmax, scrit)
772  smax = amax1(sij(i,j), smax)
773  sjmin = amax1(sij(i,j-1), smax)
774  sjmin = amin1(sjmin, scrit)
775  IF (sij(i,j)<(smax-1.0e-16)) wgh = 0.0
776  smid = amin1(sij(i,j), scrit)
777  ELSE
778  sjmax = amax1(sij(i,j+1), scrit)
779  smid = amax1(sij(i,j), scrit)
780  sjmin = 0.0
781  IF (j>1) sjmin = sij(i, j-1)
782  sjmin = amax1(sjmin, scrit)
783  END IF
784  delp = abs(sjmax-smid)
785  delm = abs(sjmin-smid)
786  asij = asij + wgh*(delp+delm)
787  ment(i, j) = ment(i, j)*(delp+delm)*wgh
788  END IF
789  END DO
790  asij = amax1(1.0e-16, asij)
791  asij = 1.0/asij
792  DO j = icb - 1, inb
793  ment(i, j) = ment(i, j)*asij
794  END DO
795  asum = 0.0
796  bsum = 0.0
797  DO j = icb - 1, inb
798  asum = asum + ment(i, j)
799  ment(i, j) = ment(i, j)*sig(j)
800  bsum = bsum + ment(i, j)
801  END DO
802  bsum = amax1(bsum, 1.0e-16)
803  bsum = 1.0/bsum
804  DO j = icb - 1, inb
805  ment(i, j) = ment(i, j)*asum*bsum
806  END DO
807  csum = 0.0
808  DO j = icb - 1, inb
809  csum = csum + ment(i, j)
810  END DO
811 
812  IF (csum<m(i)) THEN
813  nent(i) = 0
814  ment(i, i) = m(i)
815  qent(i, i) = rr(1) - ep(i)*clw(i)
816  uent(i, i) = u(nk)
817  vent(i, i) = v(nk)
818  DO j = 1, ntra
819  traent(i, i, j) = tra(nk, j)
820  END DO
821  elij(i, i) = clw(i)
822  sij(i, i) = 1.0
823  END IF
824  END IF
825  END DO
826 
827 
828 
829  ! **************************************************************
830  ! * CALCUL DES MENTS(I,J) ET DES QENTS(I,J)
831  ! *************************************************************
832 
833  DO im = 1, nd
834  DO jm = 1, nd
835 
836  qents(im, jm) = qent(im, jm)
837  ments(im, jm) = ment(im, jm)
838  END DO
839  END DO
840 
841  ! **********************************************************
842  ! --- test sb:
843  ! @ write(*,*) '^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^'
844  ! @ write(*,*) 'inb,m(inb),ment(inb,inb),sigij(inb,inb):'
845  ! @ write(*,*) inb,m(inb),ment(inb,inb),sigij(inb,inb)
846  ! @ write(*,*) '^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^'
847  ! ---
848 
849 
850 
851 
852 
853  ! *** CHECK WHETHER EP(INB)=0, IF SO, SKIP PRECIPITATING ***
854  ! *** DOWNDRAFT CALCULATION ***
855 
856  IF (ep(inb)<0.0001) GO TO 405
857 
858  ! *** INTEGRATE LIQUID WATER EQUATION TO FIND CONDENSED WATER ***
859  ! *** AND CONDENSED WATER FLUX ***
860 
861  wflux = 0.0
862  tinv = 1./3.
863 
864  ! *** BEGIN DOWNDRAFT LOOP ***
865 
866  DO i = inb, 1, -1
867 
868  ! *** CALCULATE DETRAINED PRECIPITATION ***
869 
870 
871 
872  wdtrain = 10.0*ep(i)*m(i)*clw(i)
873  IF (i>1) THEN
874  DO j = 1, i - 1
875  awat = elij(j, i) - (1.-ep(i))*clw(i)
876  awat = amax1(awat, 0.0)
877  wdtrain = wdtrain + 10.0*awat*ment(j, i)
878  END DO
879  END IF
880 
881  ! *** FIND RAIN WATER AND EVAPORATION USING PROVISIONAL ***
882  ! *** ESTIMATES OF RP(I)AND RP(I-1) ***
883 
884 
885 
886  wt(i) = 45.0
887  IF (i<inb) THEN
888  rp(i) = rp(i+1) + (cpd*(t(i+1)-t(i))+gz(i+1)-gz(i))/lv(i)
889  rp(i) = 0.5*(rp(i)+rr(i))
890  END IF
891  rp(i) = amax1(rp(i), 0.0)
892  rp(i) = amin1(rp(i), rs(i))
893  rp(inb) = rr(inb)
894  IF (i==1) THEN
895  afac = p(1)*(rs(1)-rp(1))/(1.0e4+2000.0*p(1)*rs(1))
896  ELSE
897  rp(i-1) = rp(i) + (cpd*(t(i)-t(i-1))+gz(i)-gz(i-1))/lv(i)
898  rp(i-1) = 0.5*(rp(i-1)+rr(i-1))
899  rp(i-1) = amin1(rp(i-1), rs(i-1))
900  rp(i-1) = amax1(rp(i-1), 0.0)
901  afac1 = p(i)*(rs(i)-rp(i))/(1.0e4+2000.0*p(i)*rs(i))
902  afac2 = p(i-1)*(rs(i-1)-rp(i-1))/(1.0e4+2000.0*p(i-1)*rs(i-1))
903  afac = 0.5*(afac1+afac2)
904  END IF
905  IF (i==inb) afac = 0.0
906  afac = amax1(afac, 0.0)
907  bfac = 1./(sigd*wt(i))
908 
909  ! jyg1
910  ! CC SIGT=1.0
911  ! CC IF(I.GE.ICB)SIGT=SIGP(I)
912  ! Prise en compte de la variation progressive de SIGT dans
913  ! les couches ICB et ICB-1:
914  ! Pour PLCL<PH(I+1), PR1=0 & PR2=1
915  ! Pour PLCL>PH(I), PR1=1 & PR2=0
916  ! Pour PH(I+1)<PLCL<PH(I), PR1 est la proportion a cheval
917  ! sur le nuage, et PR2 est la proportion sous la base du
918  ! nuage.
919  pr1 = (plcl-ph(i+1))/(ph(i)-ph(i+1))
920  pr1 = max(0., min(1.,pr1))
921  pr2 = (ph(i)-plcl)/(ph(i)-ph(i+1))
922  pr2 = max(0., min(1.,pr2))
923  sigt = sigp(i)*pr1 + pr2
924  ! sb3d print *,'i,sigt,pr1,pr2', i,sigt,pr1,pr2
925  ! jyg2
926 
927  b6 = bfac*50.*sigd*(ph(i)-ph(i+1))*sigt*afac
928  c6 = water(i+1) + bfac*wdtrain - 50.*sigd*bfac*(ph(i)-ph(i+1))*evap(i+1)
929  IF (c6>0.0) THEN
930  revap = 0.5*(-b6+sqrt(b6*b6+4.*c6))
931  evap(i) = sigt*afac*revap
932  water(i) = revap*revap
933  ELSE
934  evap(i) = -evap(i+1) + 0.02*(wdtrain+sigd*wt(i)*water(i+1))/(sigd*(ph(i &
935  )-ph(i+1)))
936  END IF
937 
938 
939 
940  ! *** CALCULATE PRECIPITATING DOWNDRAFT MASS FLUX UNDER ***
941  ! *** HYDROSTATIC APPROXIMATION ***
942 
943  IF (i==1) GO TO 360
944  tevap = amax1(0.0, evap(i))
945  delth = amax1(0.001, (th(i)-th(i-1)))
946  mp(i) = 10.*lvcp(i)*sigd*tevap*(p(i-1)-p(i))/delth
947 
948  ! *** IF HYDROSTATIC ASSUMPTION FAILS, ***
949  ! *** SOLVE CUBIC DIFFERENCE EQUATION FOR DOWNDRAFT THETA ***
950  ! *** AND MASS FLUX FROM TWO SIMULTANEOUS DIFFERENTIAL EQNS ***
951 
952  amfac = sigd*sigd*70.0*ph(i)*(p(i-1)-p(i))*(th(i)-th(i-1))/(tv(i)*th(i))
953  amp2 = abs(mp(i+1)*mp(i+1)-mp(i)*mp(i))
954  IF (amp2>(0.1*amfac)) THEN
955  xf = 100.0*sigd*sigd*sigd*(ph(i)-ph(i+1))
956  tf = b(i) - 5.0*(th(i)-th(i-1))*t(i)/(lvcp(i)*sigd*th(i))
957  af = xf*tf + mp(i+1)*mp(i+1)*tinv
958  bf = 2.*(tinv*mp(i+1))**3 + tinv*mp(i+1)*xf*tf + &
959  50.*(p(i-1)-p(i))*xf*tevap
960  fac2 = 1.0
961  IF (bf<0.0) fac2 = -1.0
962  bf = abs(bf)
963  ur = 0.25*bf*bf - af*af*af*tinv*tinv*tinv
964  IF (ur>=0.0) THEN
965  sru = sqrt(ur)
966  fac = 1.0
967  IF ((0.5*bf-sru)<0.0) fac = -1.0
968  mp(i) = mp(i+1)*tinv + (0.5*bf+sru)**tinv + &
969  fac*(abs(0.5*bf-sru))**tinv
970  ELSE
971  d = atan(2.*sqrt(-ur)/(bf+1.0e-28))
972  IF (fac2<0.0) d = 3.14159 - d
973  mp(i) = mp(i+1)*tinv + 2.*sqrt(af*tinv)*cos(d*tinv)
974  END IF
975  mp(i) = amax1(0.0, mp(i))
976  b(i-1) = b(i) + 100.0*(p(i-1)-p(i))*tevap/(mp(i)+sigd*0.1) - &
977  10.0*(th(i)-th(i-1))*t(i)/(lvcp(i)*sigd*th(i))
978  b(i-1) = amax1(b(i-1), 0.0)
979  END IF
980 
981 
982 
983  ! *** LIMIT MAGNITUDE OF MP(I) TO MEET CFL CONDITION ***
984 
985  ampmax = 2.0*(ph(i)-ph(i+1))*delti
986  amp2 = 2.0*(ph(i-1)-ph(i))*delti
987  ampmax = amin1(ampmax, amp2)
988  mp(i) = amin1(mp(i), ampmax)
989 
990  ! *** FORCE MP TO DECREASE LINEARLY TO ZERO ***
991  ! *** BETWEEN CLOUD BASE AND THE SURFACE ***
992 
993  IF (p(i)>p(icb)) THEN
994  mp(i) = mp(icb)*(p(1)-p(i))/(p(1)-p(icb))
995  END IF
996 360 CONTINUE
997 
998  ! *** FIND MIXING RATIO OF PRECIPITATING DOWNDRAFT ***
999 
1000  IF (i==inb) GO TO 400
1001  rp(i) = rr(i)
1002  IF (mp(i)>mp(i+1)) THEN
1003  rp(i) = rp(i+1)*mp(i+1) + rr(i)*(mp(i)-mp(i+1)) + &
1004  5.*sigd*(ph(i)-ph(i+1))*(evap(i+1)+evap(i))
1005  rp(i) = rp(i)/mp(i)
1006  up(i) = up(i+1)*mp(i+1) + u(i)*(mp(i)-mp(i+1))
1007  up(i) = up(i)/mp(i)
1008  vp(i) = vp(i+1)*mp(i+1) + v(i)*(mp(i)-mp(i+1))
1009  vp(i) = vp(i)/mp(i)
1010  DO j = 1, ntra
1011  trap(i, j) = trap(i+1, j)*mp(i+1) + trap(i, j)*(mp(i)-mp(i+1))
1012  trap(i, j) = trap(i, j)/mp(i)
1013  END DO
1014  ELSE
1015  IF (mp(i+1)>1.0e-16) THEN
1016  rp(i) = rp(i+1) + 5.0*sigd*(ph(i)-ph(i+1))*(evap(i+1)+evap(i))/mp(i+1 &
1017  )
1018  up(i) = up(i+1)
1019  vp(i) = vp(i+1)
1020  DO j = 1, ntra
1021  trap(i, j) = trap(i+1, j)
1022  END DO
1023  END IF
1024  END IF
1025  rp(i) = amin1(rp(i), rs(i))
1026  rp(i) = amax1(rp(i), 0.0)
1027 400 END DO
1028 
1029  ! *** CALCULATE SURFACE PRECIPITATION IN MM/DAY ***
1030 
1031  precip = wt(1)*sigd*water(1)*8640.0
1032 
1033  ! sb *** Calculate downdraft velocity scale and surface temperature and
1034  ! ***
1035  ! sb *** water vapor fluctuations
1036  ! ***
1037  ! sb (inspire de convect 4.3)
1038 
1039  ! BETAD=10.0
1040  betad = 5.0
1041  wd = betad*abs(mp(icb))*0.01*rd*t(icb)/(sigd*p(icb))
1042 
1043 405 CONTINUE
1044 
1045  ! *** CALCULATE TENDENCIES OF LOWEST LEVEL POTENTIAL TEMPERATURE ***
1046  ! *** AND MIXING RATIO ***
1047 
1048  dpinv = 1.0/(ph(1)-ph(2))
1049  am = 0.0
1050  DO k = 2, inb
1051  am = am + m(k)
1052  END DO
1053  IF ((0.1*dpinv*am)>=delti) iflag = 4
1054  ft(1) = 0.1*dpinv*am*(t(2)-t(1)+(gz(2)-gz(1))/cpn(1))
1055  ft(1) = ft(1) - 0.5*lvcp(1)*sigd*(evap(1)+evap(2))
1056  ft(1) = ft(1) - 0.09*sigd*mp(2)*t(1)*b(1)*dpinv
1057  ft(1) = ft(1) + 0.01*sigd*wt(1)*(cl-cpd)*water(2)*(t(2)-t(1))*dpinv/cpn(1)
1058  fr(1) = 0.1*mp(2)*(rp(2)-rr(1))* & ! correction bug conservation eau
1059  ! 1 DPINV+SIGD*0.5*(EVAP(1)+EVAP(2))
1060  dpinv + sigd*0.5*(evap(1)+evap(2))
1061  ! IM cf. SBL
1062  ! 1 DPINV+SIGD*EVAP(1)
1063  fr(1) = fr(1) + 0.1*am*(rr(2)-rr(1))*dpinv
1064  fu(1) = fu(1) + 0.1*dpinv*(mp(2)*(up(2)-u(1))+am*(u(2)-u(1)))
1065  fv(1) = fv(1) + 0.1*dpinv*(mp(2)*(vp(2)-v(1))+am*(v(2)-v(1)))
1066  DO j = 1, ntra
1067  ftra(1, j) = ftra(1, j) + 0.1*dpinv*(mp(2)*(trap(2,j)-tra(1, &
1068  j))+am*(tra(2,j)-tra(1,j)))
1069  END DO
1070  amde = 0.0
1071  DO j = 2, inb
1072  fr(1) = fr(1) + 0.1*dpinv*ment(j, 1)*(qent(j,1)-rr(1))
1073  fu(1) = fu(1) + 0.1*dpinv*ment(j, 1)*(uent(j,1)-u(1))
1074  fv(1) = fv(1) + 0.1*dpinv*ment(j, 1)*(vent(j,1)-v(1))
1075  DO k = 1, ntra
1076  ftra(1, k) = ftra(1, k) + 0.1*dpinv*ment(j, 1)*(traent(j,1,k)-tra(1,k))
1077  END DO
1078  END DO
1079 
1080  ! *** CALCULATE TENDENCIES OF POTENTIAL TEMPERATURE AND MIXING RATIO ***
1081  ! *** AT LEVELS ABOVE THE LOWEST LEVEL ***
1082 
1083  ! *** FIRST FIND THE NET SATURATED UPDRAFT AND DOWNDRAFT MASS FLUXES ***
1084  ! *** THROUGH EACH LEVEL ***
1085 
1086 
1087 
1088  DO i = 2, inb
1089  dpinv = 1.0/(ph(i)-ph(i+1))
1090  cpinv = 1.0/cpn(i)
1091  amp1 = 0.0
1092  DO k = i + 1, inb + 1
1093  amp1 = amp1 + m(k)
1094  END DO
1095  DO k = 1, i
1096  DO j = i + 1, inb + 1
1097  amp1 = amp1 + ment(k, j)
1098  END DO
1099  END DO
1100  IF ((0.1*dpinv*amp1)>=delti) iflag = 4
1101  ad = 0.0
1102  DO k = 1, i - 1
1103  DO j = i, inb
1104  ad = ad + ment(j, k)
1105  END DO
1106  END DO
1107  ft(i) = 0.1*dpinv*(amp1*(t(i+1)-t(i)+(gz(i+1)-gz(i))*cpinv)-ad*(t(i)-t(i- &
1108  1)+(gz(i)-gz(i-1))*cpinv)) - 0.5*sigd*lvcp(i)*(evap(i)+evap(i+1))
1109  rat = cpn(i-1)*cpinv
1110  ft(i) = ft(i) - 0.09*sigd*(mp(i+1)*t(i)*b(i)-mp(i)*t(i-1)*rat*b(i-1))* &
1111  dpinv
1112  ft(i) = ft(i) + 0.1*dpinv*ment(i, i)*(hp(i)-h(i)+t(i)*(cpv-cpd)*(rr(i)- &
1113  qent(i,i)))*cpinv
1114  ft(i) = ft(i) + 0.01*sigd*wt(i)*(cl-cpd)*water(i+1)*(t(i+1)-t(i))*dpinv* &
1115  cpinv
1116  fr(i) = 0.1*dpinv*(amp1*(rr(i+1)-rr(i))-ad*(rr(i)-rr(i-1)))
1117  fu(i) = fu(i) + 0.1*dpinv*(amp1*(u(i+1)-u(i))-ad*(u(i)-u(i-1)))
1118  fv(i) = fv(i) + 0.1*dpinv*(amp1*(v(i+1)-v(i))-ad*(v(i)-v(i-1)))
1119  DO k = 1, ntra
1120  ftra(i, k) = ftra(i, k) + 0.1*dpinv*(amp1*(tra(i+1,k)-tra(i, &
1121  k))-ad*(tra(i,k)-tra(i-1,k)))
1122  END DO
1123  DO k = 1, i - 1
1124  awat = elij(k, i) - (1.-ep(i))*clw(i)
1125  awat = amax1(awat, 0.0)
1126  fr(i) = fr(i) + 0.1*dpinv*ment(k, i)*(qent(k,i)-awat-rr(i))
1127  fu(i) = fu(i) + 0.1*dpinv*ment(k, i)*(uent(k,i)-u(i))
1128  fv(i) = fv(i) + 0.1*dpinv*ment(k, i)*(vent(k,i)-v(i))
1129  ! (saturated updrafts resulting from mixing) ! cld
1130  qcond(i) = qcond(i) + (elij(k,i)-awat) ! cld
1131  nqcond(i) = nqcond(i) + 1. ! cld
1132  DO j = 1, ntra
1133  ftra(i, j) = ftra(i, j) + 0.1*dpinv*ment(k, i)*(traent(k,i,j)-tra(i,j &
1134  ))
1135  END DO
1136  END DO
1137  DO k = i, inb
1138  fr(i) = fr(i) + 0.1*dpinv*ment(k, i)*(qent(k,i)-rr(i))
1139  fu(i) = fu(i) + 0.1*dpinv*ment(k, i)*(uent(k,i)-u(i))
1140  fv(i) = fv(i) + 0.1*dpinv*ment(k, i)*(vent(k,i)-v(i))
1141  DO j = 1, ntra
1142  ftra(i, j) = ftra(i, j) + 0.1*dpinv*ment(k, i)*(traent(k,i,j)-tra(i,j &
1143  ))
1144  END DO
1145  END DO
1146  fr(i) = fr(i) + 0.5*sigd*(evap(i)+evap(i+1)) + 0.1*(mp(i+1)*(rp(i+ &
1147  1)-rr(i))-mp(i)*(rp(i)-rr(i-1)))*dpinv
1148  fu(i) = fu(i) + 0.1*(mp(i+1)*(up(i+1)-u(i))-mp(i)*(up(i)-u(i-1)))*dpinv
1149  fv(i) = fv(i) + 0.1*(mp(i+1)*(vp(i+1)-v(i))-mp(i)*(vp(i)-v(i-1)))*dpinv
1150  DO j = 1, ntra
1151  ftra(i, j) = ftra(i, j) + 0.1*dpinv*(mp(i+1)*(trap(i+1,j)-tra(i, &
1152  j))-mp(i)*(trap(i,j)-trap(i-1,j)))
1153  END DO
1154  ! (saturated downdrafts resulting from mixing) ! cld
1155  DO k = i + 1, inb ! cld
1156  qcond(i) = qcond(i) + elij(k, i) ! cld
1157  nqcond(i) = nqcond(i) + 1. ! cld
1158  END DO ! cld
1159  ! (particular case: no detraining level is found) ! cld
1160  IF (nent(i)==0) THEN ! cld
1161  qcond(i) = qcond(i) + (1-ep(i))*clw(i) ! cld
1162  nqcond(i) = nqcond(i) + 1. ! cld
1163  END IF ! cld
1164  IF (nqcond(i)/=0.) THEN ! cld
1165  qcond(i) = qcond(i)/nqcond(i) ! cld
1166  END IF ! cld
1167  END DO
1168 
1169 
1170 
1171 
1172  ! *** MOVE THE DETRAINMENT AT LEVEL INB DOWN TO LEVEL INB-1 ***
1173  ! *** IN SUCH A WAY AS TO PRESERVE THE VERTICALLY ***
1174  ! *** INTEGRATED ENTHALPY AND WATER TENDENCIES ***
1175 
1176  ! test sb:
1177  ! @ write(*,*) '--------------------------------------------'
1178  ! @ write(*,*) 'inb,ft,hp,h,t,rr,qent,ment,water,waterp,wt,mp,b'
1179  ! @ write(*,*) inb,ft(inb),hp(inb),h(inb)
1180  ! @ : ,t(inb),rr(inb),qent(inb,inb)
1181  ! @ : ,ment(inb,inb),water(inb)
1182  ! @ : ,water(inb+1),wt(inb),mp(inb),b(inb)
1183  ! @ write(*,*) '--------------------------------------------'
1184  ! fin test sb:
1185 
1186  ax = 0.1*ment(inb, inb)*(hp(inb)-h(inb)+t(inb)*(cpv-cpd)*(rr(inb)-qent(inb, &
1187  inb)))/(cpn(inb)*(ph(inb)-ph(inb+1)))
1188  ft(inb) = ft(inb) - ax
1189  ft(inb-1) = ft(inb-1) + ax*cpn(inb)*(ph(inb)-ph(inb+1))/(cpn(inb-1)*(ph(inb &
1190  -1)-ph(inb)))
1191  bx = 0.1*ment(inb, inb)*(qent(inb,inb)-rr(inb))/(ph(inb)-ph(inb+1))
1192  fr(inb) = fr(inb) - bx
1193  fr(inb-1) = fr(inb-1) + bx*(ph(inb)-ph(inb+1))/(ph(inb-1)-ph(inb))
1194  cx = 0.1*ment(inb, inb)*(uent(inb,inb)-u(inb))/(ph(inb)-ph(inb+1))
1195  fu(inb) = fu(inb) - cx
1196  fu(inb-1) = fu(inb-1) + cx*(ph(inb)-ph(inb+1))/(ph(inb-1)-ph(inb))
1197  dx = 0.1*ment(inb, inb)*(vent(inb,inb)-v(inb))/(ph(inb)-ph(inb+1))
1198  fv(inb) = fv(inb) - dx
1199  fv(inb-1) = fv(inb-1) + dx*(ph(inb)-ph(inb+1))/(ph(inb-1)-ph(inb))
1200  DO j = 1, ntra
1201  ex = 0.1*ment(inb, inb)*(traent(inb,inb,j)-tra(inb,j))/ &
1202  (ph(inb)-ph(inb+1))
1203  ftra(inb, j) = ftra(inb, j) - ex
1204  ftra(inb-1, j) = ftra(inb-1, j) + ex*(ph(inb)-ph(inb+1))/(ph(inb-1)-ph( &
1205  inb))
1206  END DO
1207 
1208  ! *** HOMOGINIZE TENDENCIES BELOW CLOUD BASE ***
1209 
1210  asum = 0.0
1211  bsum = 0.0
1212  csum = 0.0
1213  dsum = 0.0
1214  DO i = 1, icb - 1
1215  asum = asum + ft(i)*(ph(i)-ph(i+1))
1216  bsum = bsum + fr(i)*(lv(i)+(cl-cpd)*(t(i)-t(1)))*(ph(i)-ph(i+1))
1217  csum = csum + (lv(i)+(cl-cpd)*(t(i)-t(1)))*(ph(i)-ph(i+1))
1218  dsum = dsum + t(i)*(ph(i)-ph(i+1))/th(i)
1219  END DO
1220  DO i = 1, icb - 1
1221  ft(i) = asum*t(i)/(th(i)*dsum)
1222  fr(i) = bsum/csum
1223  END DO
1224 
1225  ! *** RESET COUNTER AND RETURN ***
1226 
1227  sig(nd) = 2.0
1228 
1229 
1230  DO i = 1, nd
1231  upwd(i) = 0.0
1232  dnwd(i) = 0.0
1233  ! sb dnwd0(i) = - mp(i)
1234  END DO
1235 
1236  DO i = 1, nl
1237  dnwd0(i) = -mp(i)
1238  END DO
1239  DO i = nl + 1, nd
1240  dnwd0(i) = 0.
1241  END DO
1242 
1243  DO i = icb, inb
1244  upwd(i) = 0.0
1245  dnwd(i) = 0.0
1246 
1247  DO k = i, inb
1248  up1 = 0.0
1249  dn1 = 0.0
1250  DO n = 1, i - 1
1251  up1 = up1 + ment(n, k)
1252  dn1 = dn1 - ment(k, n)
1253  END DO
1254  upwd(i) = upwd(i) + m(k) + up1
1255  dnwd(i) = dnwd(i) + dn1
1256  END DO
1257  END DO
1258 
1259  ! ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
1260  ! DETERMINATION DE LA VARIATION DE FLUX ASCENDANT ENTRE
1261  ! DEUX NIVEAU NON DILUE Mike
1262  ! ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
1263 
1264 
1265  ! sb do i=1,ND
1266  ! sb Mike(i)=M(i)
1267  ! sb enddo
1268 
1269  DO i = 1, nl
1270  mike(i) = m(i)
1271  END DO
1272  DO i = nl + 1, nd
1273  mike(i) = 0.
1274  END DO
1275 
1276  DO i = 1, nd
1277  ma(i) = 0
1278  END DO
1279 
1280  ! sb do i=1,nd
1281  ! sb do j=i,nd
1282  ! sb Ma(i)=Ma(i)+M(j)
1283  ! sb enddo
1284  ! sb enddo
1285 
1286  DO i = 1, nl
1287  DO j = i, nl
1288  ma(i) = ma(i) + m(j)
1289  END DO
1290  END DO
1291 
1292  DO i = nl + 1, nd
1293  ma(i) = 0.
1294  END DO
1295 
1296  DO i = 1, icb - 1
1297  ma(i) = 0
1298  END DO
1299 
1300 
1301 
1302  ! cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
1303  ! ICB REPRESENTE DE NIVEAU OU SE TROUVE LA
1304  ! BASE DU NUAGE , ET INB LE TOP DU NUAGE
1305  ! ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
1306 
1307 
1308  DO i = 1, nd
1309  mke(i) = upwd(i) + dnwd(i)
1310  END DO
1311 
1312 
1313  ! *** Diagnose the in-cloud mixing ratio *** ! cld
1314  ! *** of condensed water *** ! cld
1315  ! ! cld
1316  DO i = 1, nd ! cld
1317  maa(i) = 0.0 ! cld
1318  wa(i) = 0.0 ! cld
1319  siga(i) = 0.0 ! cld
1320  END DO ! cld
1321  DO i = nk, inb ! cld
1322  DO k = i + 1, inb + 1 ! cld
1323  maa(i) = maa(i) + m(k) ! cld
1324  END DO ! cld
1325  END DO ! cld
1326  DO i = icb, inb - 1 ! cld
1327  axc(i) = 0. ! cld
1328  DO j = icb, i ! cld
1329  axc(i) = axc(i) + rd*(tvp(j)-tv(j))*(ph(j)-ph(j+1))/p(j) ! cld
1330  END DO ! cld
1331  IF (axc(i)>0.0) THEN ! cld
1332  wa(i) = sqrt(2.*axc(i)) ! cld
1333  END IF ! cld
1334  END DO ! cld
1335  DO i = 1, nl ! cld
1336  IF (wa(i)>0.0) & ! cld
1337  siga(i) = maa(i)/wa(i)*rd*tvp(i)/p(i)/100./deltac ! cld
1338  siga(i) = min(siga(i), 1.0) ! cld
1339  qcondc(i) = siga(i)*clw(i)*(1.-ep(i)) & ! cld
1340  +(1.-siga(i))*qcond(i) ! cld
1341  END DO ! cld
1342 
1343 
1344  ! @$$cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
1345  ! @$$ call writeg1d(1,klev,ma,'ma ','ma ')
1346  ! @$$ call writeg1d(1,klev,upwd,'upwd ','upwd ')
1347  ! @$$ call writeg1d(1,klev,dnwd,'dnwd ','dnwd ')
1348  ! @$$ call writeg1d(1,klev,dnwd0,'dnwd0 ','dnwd0 ')
1349  ! @$$ call writeg1d(1,klev,tvp,'tvp ','tvp ')
1350  ! @$$ call writeg1d(1,klev,tra(1:klev,3),'tra3 ','tra3 ')
1351  ! @$$ call writeg1d(1,klev,tra(1:klev,4),'tra4 ','tra4 ')
1352  ! @$$ call writeg1d(1,klev,tra(1:klev,5),'tra5 ','tra5 ')
1353  ! @$$ call writeg1d(1,klev,tra(1:klev,6),'tra6 ','tra6 ')
1354  ! @$$ call writeg1d(1,klev,tra(1:klev,7),'tra7 ','tra7 ')
1355  ! @$$ call writeg1d(1,klev,tra(1:klev,8),'tra8 ','tra8 ')
1356  ! @$$ call writeg1d(1,klev,tra(1:klev,9),'tra9 ','tra9 ')
1357  ! @$$ call writeg1d(1,klev,tra(1:klev,10),'tra10','tra10')
1358  ! @$$ call writeg1d(1,klev,tra(1:klev,11),'tra11','tra11')
1359  ! @$$ call writeg1d(1,klev,tra(1:klev,12),'tra12','tra12')
1360  ! @$$ call writeg1d(1,klev,tra(1:klev,13),'tra13','tra13')
1361  ! @$$ call writeg1d(1,klev,tra(1:klev,14),'tra14','tra14')
1362  ! @$$ call writeg1d(1,klev,tra(1:klev,15),'tra15','tra15')
1363  ! @$$ call writeg1d(1,klev,tra(1:klev,16),'tra16','tra16')
1364  ! @$$ call writeg1d(1,klev,tra(1:klev,17),'tra17','tra17')
1365  ! @$$ call writeg1d(1,klev,tra(1:klev,18),'tra18','tra18')
1366  ! @$$ call writeg1d(1,klev,tra(1:klev,19),'tra19','tra19')
1367  ! @$$ call writeg1d(1,klev,tra(1:klev,20),'tra20','tra20 ')
1368  ! @$$ call writeg1d(1,klev,trap(1:klev,1),'trp1','trp1')
1369  ! @$$ call writeg1d(1,klev,trap(1:klev,2),'trp2','trp2')
1370  ! @$$ call writeg1d(1,klev,trap(1:klev,3),'trp3','trp3')
1371  ! @$$ call writeg1d(1,klev,trap(1:klev,4),'trp4','trp4')
1372  ! @$$ call writeg1d(1,klev,trap(1:klev,5),'trp5','trp5')
1373  ! @$$ call writeg1d(1,klev,trap(1:klev,10),'trp10','trp10')
1374  ! @$$ call writeg1d(1,klev,trap(1:klev,12),'trp12','trp12')
1375  ! @$$ call writeg1d(1,klev,trap(1:klev,15),'trp15','trp15')
1376  ! @$$ call writeg1d(1,klev,trap(1:klev,20),'trp20','trp20')
1377  ! @$$ call writeg1d(1,klev,ftra(1:klev,1),'ftr1 ','ftr1 ')
1378  ! @$$ call writeg1d(1,klev,ftra(1:klev,2),'ftr2 ','ftr2 ')
1379  ! @$$ call writeg1d(1,klev,ftra(1:klev,3),'ftr3 ','ftr3 ')
1380  ! @$$ call writeg1d(1,klev,ftra(1:klev,4),'ftr4 ','ftr4 ')
1381  ! @$$ call writeg1d(1,klev,ftra(1:klev,5),'ftr5 ','ftr5 ')
1382  ! @$$ call writeg1d(1,klev,ftra(1:klev,6),'ftr6 ','ftr6 ')
1383  ! @$$ call writeg1d(1,klev,ftra(1:klev,7),'ftr7 ','ftr7 ')
1384  ! @$$ call writeg1d(1,klev,ftra(1:klev,8),'ftr8 ','ftr8 ')
1385  ! @$$ call writeg1d(1,klev,ftra(1:klev,9),'ftr9 ','ftr9 ')
1386  ! @$$ call writeg1d(1,klev,ftra(1:klev,10),'ftr10','ftr10')
1387  ! @$$ call writeg1d(1,klev,ftra(1:klev,11),'ftr11','ftr11')
1388  ! @$$ call writeg1d(1,klev,ftra(1:klev,12),'ftr12','ftr12')
1389  ! @$$ call writeg1d(1,klev,ftra(1:klev,13),'ftr13','ftr13')
1390  ! @$$ call writeg1d(1,klev,ftra(1:klev,14),'ftr14','ftr14')
1391  ! @$$ call writeg1d(1,klev,ftra(1:klev,15),'ftr15','ftr15')
1392  ! @$$ call writeg1d(1,klev,ftra(1:klev,16),'ftr16','ftr16')
1393  ! @$$ call writeg1d(1,klev,ftra(1:klev,17),'ftr17','ftr17')
1394  ! @$$ call writeg1d(1,klev,ftra(1:klev,18),'ftr18','ftr18')
1395  ! @$$ call writeg1d(1,klev,ftra(1:klev,19),'ftr19','ftr19')
1396  ! @$$ call writeg1d(1,klev,ftra(1:klev,20),'ftr20','ftr20 ')
1397  ! @$$ call writeg1d(1,klev,mp,'mp ','mp ')
1398  ! @$$ call writeg1d(1,klev,Mke,'Mke ','Mke ')
1399 
1400 
1401 
1402  ! cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
1403 
1404 
1405  RETURN
1406 END SUBROUTINE convect3
1407 ! ---------------------------------------------------------------------------
integer, save nbtr
subroutine clift(p, t, rr, rs, plcl, dplcldt, dplcldq)
Definition: clift.F90:5
integer, save klev
Definition: dimphy.F90:7
subroutine tlift(p, t, rr, rs, gz, plcl, icb, nk, tvp, tpk, clw, nd, nl, dtvpdt1, dtvpdq1)
Definition: tlift.F90:6
subroutine convect3(dtime, epmax, ok_adj, t1, r1, rs, u, v, tra, p, ph, nd,ndp1, nl, ntra, delt, iflag, ft, fr, fu, fv, ftra, precip, icb, inb,upwd, dnwd, dnwd0, sig, w0, mike, mke, ma, ments, qents, tps, tls, sigij,cape, tvp, pbase, buoybase,
Definition: convect3.F90:9
!$Id!Parameters for nl
Definition: cv30param.h:5
!$Header!integer nvarmx parameter(nfmx=10, imx=200, jmx=150, lmx=200, nvarmx=1000) real xd(imx
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL ulevSTD CALL &zphi philevSTD CALL &zx_rh rhlevSTD!DO klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon du jour ou toutes les read_climoz CALL true
Definition: dimphy.F90:1