1 |
! |
2 |
SUBROUTINE cv_closure(nloc,ncum,nd,nk,icb & |
3 |
,tv,tvp,p,ph,dph,plcl,cpn & |
4 |
,iflag,cbmf) |
5 |
use cvthermo |
6 |
use cvparam |
7 |
implicit none |
8 |
|
9 |
! inputs: |
10 |
integer ncum, nd, nloc |
11 |
integer nk(nloc), icb(nloc) |
12 |
real tv(nloc,nd), tvp(nloc,nd), p(nloc,nd), dph(nloc,nd) |
13 |
real ph(nloc,nd+1) ! caution nd instead ndp1 to be consistent... |
14 |
real plcl(nloc), cpn(nloc,nd) |
15 |
|
16 |
! outputs: |
17 |
integer iflag(nloc) |
18 |
real cbmf(nloc) ! also an input |
19 |
|
20 |
! local variables: |
21 |
integer i, k, icbmax |
22 |
real dtpbl(nloc), dtmin(nloc), tvpplcl(nloc), tvaplcl(nloc) |
23 |
real work(nloc) |
24 |
|
25 |
|
26 |
!------------------------------------------------------------------- |
27 |
! Compute icbmax. |
28 |
!------------------------------------------------------------------- |
29 |
|
30 |
icbmax=2 |
31 |
do 230 i=1,ncum |
32 |
icbmax=max(icbmax,icb(i)) |
33 |
230 continue |
34 |
|
35 |
!===================================================================== |
36 |
! --- CALCULATE CLOUD BASE MASS FLUX |
37 |
!===================================================================== |
38 |
! |
39 |
! tvpplcl = parcel temperature lifted adiabatically from level |
40 |
! icb-1 to the LCL. |
41 |
! tvaplcl = virtual temperature at the LCL. |
42 |
! |
43 |
do 610 i=1,ncum |
44 |
dtpbl(i)=0.0 |
45 |
tvpplcl(i)=tvp(i,icb(i)-1) & |
46 |
-rrd*tvp(i,icb(i)-1)*(p(i,icb(i)-1)-plcl(i)) & |
47 |
/(cpn(i,icb(i)-1)*p(i,icb(i)-1)) |
48 |
tvaplcl(i)=tv(i,icb(i)) & |
49 |
+(tvp(i,icb(i))-tvp(i,icb(i)+1))*(plcl(i)-p(i,icb(i))) & |
50 |
/(p(i,icb(i))-p(i,icb(i)+1)) |
51 |
610 continue |
52 |
|
53 |
!------------------------------------------------------------------- |
54 |
! --- Interpolate difference between lifted parcel and |
55 |
! --- environmental temperatures to lifted condensation level |
56 |
!------------------------------------------------------------------- |
57 |
! |
58 |
! dtpbl = average of tvp-tv in the PBL (k=nk to icb-1). |
59 |
! |
60 |
do 630 k=minorig,icbmax |
61 |
do 620 i=1,ncum |
62 |
if((k.ge.nk(i)).and.(k.le.(icb(i)-1)))then |
63 |
dtpbl(i)=dtpbl(i)+(tvp(i,k)-tv(i,k))*dph(i,k) |
64 |
endif |
65 |
620 continue |
66 |
630 continue |
67 |
do 640 i=1,ncum |
68 |
dtpbl(i)=dtpbl(i)/(ph(i,nk(i))-ph(i,icb(i))) |
69 |
dtmin(i)=tvpplcl(i)-tvaplcl(i)+dtmax+dtpbl(i) |
70 |
640 continue |
71 |
! |
72 |
!------------------------------------------------------------------- |
73 |
! --- Adjust cloud base mass flux |
74 |
!------------------------------------------------------------------- |
75 |
! |
76 |
do 650 i=1,ncum |
77 |
work(i)=cbmf(i) |
78 |
cbmf(i)=max(0.0,(1.0-damp)*cbmf(i)+0.1*alpha*dtmin(i)) |
79 |
if((work(i).eq.0.0).and.(cbmf(i).eq.0.0))then |
80 |
iflag(i)=3 |
81 |
endif |
82 |
650 continue |
83 |
|
84 |
return |
85 |
end |