/[lmdze]/trunk/phylmd/CV30_routines/cv30_closure.f
ViewVC logotype

Annotation of /trunk/phylmd/CV30_routines/cv30_closure.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 195 - (hide annotations)
Wed May 18 17:56:44 2016 UTC (8 years, 1 month ago) by guez
Original Path: trunk/Sources/phylmd/CV30_routines/cv30_closure.f
File size: 3891 byte(s)
In cv30_feed, iflag1 is 0 on entry so we can simplify the test for
iflag1 = 7.

In cv30_feed, for the computation of icb, replaced sequential search
(with a useless end of loop on k) by a call to locate.

In CV30 routines, replaced len, nloc, nd, na by klon or
klev. Philosophy: no more generality than actually necessary.

Converted as many variables as possible to named constants in
cv30_param_m and downgraded pbcrit, ptcrit, dtovsh, dpbase, dttrig,
tau, delta to local objects in procedures. spfac, betad and omtrain
are useless and removed.

Instead of filling the array sigp with the constant spfac in
cv30_undilute2, just made sigp a constant in cv30_unsat.

In cv_driver, define as allocatable variables that are only
used on the range (ncum, nl).

1 guez 187 module cv30_closure_m
2 guez 47
3 guez 187 implicit none
4 guez 47
5 guez 187 contains
6 guez 47
7 guez 195 SUBROUTINE cv30_closure(icb, inb, pbase, p, ph, tv, buoy, sig, w0, cape, m)
8 guez 47
9 guez 195 ! CLOSURE
10 guez 187 ! Vectorization: S. Bony
11 guez 47
12 guez 187 use cv30_param_m, only: alpha, beta, dtcrit, minorig, nl
13 guez 190 use cv_thermo_m, only: rrd
14 guez 195 USE dimphy, ONLY: klev, klon
15 guez 47
16 guez 187 ! input:
17 guez 195 integer, intent(in):: icb(:), inb(:) ! (ncum)
18     real pbase(klon)
19     real p(klon, klev), ph(klon, klev+1)
20     real tv(klon, klev), buoy(klon, klev)
21 guez 47
22 guez 187 ! input/output:
23 guez 195 real sig(klon, klev), w0(klon, klev)
24 guez 47
25 guez 187 ! output:
26 guez 195 real cape(klon)
27     real m(klon, klev)
28 guez 47
29 guez 187 ! Local:
30 guez 195 integer ncum
31 guez 187 integer i, j, k, icbmax
32     real deltap, fac, w, amu
33 guez 195 real dtmin(klon, klev), sigold(klon, klev)
34 guez 47
35 guez 187 !-------------------------------------------------------
36 guez 47
37 guez 195 ncum = size(icb)
38    
39 guez 187 ! Initialization
40 guez 47
41 guez 187 do k=1, nl
42     do i=1, ncum
43     m(i, k)=0.0
44     enddo
45     enddo
46 guez 47
47 guez 187 ! Reset sig(i) and w0(i) for i>inb and i<icb
48 guez 47
49 guez 187 ! update sig and w0 above LNB:
50 guez 47
51 guez 187 do k=1, nl-1
52     do i=1, ncum
53     if ((inb(i) < (nl-1)).and.(k >= (inb(i)+1)))then
54     sig(i, k)=beta*sig(i, k) &
55     +2.*alpha*buoy(i, inb(i))*ABS(buoy(i, inb(i)))
56     sig(i, k)=AMAX1(sig(i, k), 0.0)
57     w0(i, k)=beta*w0(i, k)
58     endif
59     end do
60     end do
61 guez 47
62 guez 187 ! compute icbmax:
63 guez 47
64 guez 187 icbmax=2
65     do i=1, ncum
66     icbmax=MAX(icbmax, icb(i))
67     end do
68 guez 47
69 guez 187 ! update sig and w0 below cloud base:
70 guez 47
71 guez 187 do k=1, icbmax
72     do i=1, ncum
73     if (k <= icb(i))then
74     sig(i, k)=beta*sig(i, k)-2.*alpha*buoy(i, icb(i))*buoy(i, icb(i))
75     sig(i, k)=amax1(sig(i, k), 0.0)
76     w0(i, k)=beta*w0(i, k)
77     endif
78     end do
79     end do
80 guez 47
81 guez 187 ! Reset fractional areas of updrafts and w0 at initial time
82     ! and after 10 time steps of no convection
83 guez 47
84 guez 187 do k=1, nl-1
85     do i=1, ncum
86 guez 195 if (sig(i, klev) < 1.5.or.sig(i, klev) > 12.0)then
87 guez 187 sig(i, k)=0.0
88     w0(i, k)=0.0
89     endif
90     end do
91     end do
92 guez 47
93 guez 187 ! Calculate convective available potential energy (cape),
94     ! vertical velocity (w), fractional area covered by
95     ! undilute updraft (sig), and updraft mass flux (m)
96 guez 47
97 guez 187 do i=1, ncum
98 guez 47 cape(i)=0.0
99 guez 187 end do
100 guez 47
101 guez 187 ! compute dtmin (minimum buoyancy between ICB and given level k):
102 guez 47
103 guez 187 do i=1, ncum
104     do k=1, nl
105     dtmin(i, k)=100.0
106 guez 47 enddo
107 guez 187 enddo
108 guez 47
109 guez 187 do i=1, ncum
110     do k=1, nl
111     do j=minorig, nl
112     if ((k >= (icb(i)+1)).and.(k <= inb(i)).and. &
113     (j >= icb(i)).and.(j <= (k-1)))then
114     dtmin(i, k)=AMIN1(dtmin(i, k), buoy(i, j))
115     endif
116     end do
117     end do
118     end do
119 guez 47
120 guez 187 ! the interval on which cape is computed starts at pbase :
121 guez 47
122 guez 187 do k=1, nl
123     do i=1, ncum
124 guez 47
125 guez 187 if ((k >= (icb(i)+1)).and.(k <= inb(i))) then
126 guez 47
127 guez 187 deltap = MIN(pbase(i), ph(i, k-1))-MIN(pbase(i), ph(i, k))
128     cape(i)=cape(i)+rrd*buoy(i, k-1)*deltap/p(i, k-1)
129     cape(i)=AMAX1(0.0, cape(i))
130     sigold(i, k)=sig(i, k)
131 guez 47
132 guez 187 sig(i, k)=beta*sig(i, k)+alpha*dtmin(i, k)*ABS(dtmin(i, k))
133     sig(i, k)=amax1(sig(i, k), 0.0)
134     sig(i, k)=amin1(sig(i, k), 0.01)
135     fac=AMIN1(((dtcrit-dtmin(i, k))/dtcrit), 1.0)
136     w=(1.-beta)*fac*SQRT(cape(i))+beta*w0(i, k)
137     amu=0.5*(sig(i, k)+sigold(i, k))*w
138     m(i, k)=amu*0.007*p(i, k)*(ph(i, k)-ph(i, k+1))/tv(i, k)
139     w0(i, k)=w
140     endif
141 guez 47
142 guez 187 end do
143     end do
144 guez 47
145 guez 187 do i=1, ncum
146     w0(i, icb(i))=0.5*w0(i, icb(i)+1)
147     m(i, icb(i))=0.5*m(i, icb(i)+1) &
148     *(ph(i, icb(i))-ph(i, icb(i)+1)) &
149     /(ph(i, icb(i)+1)-ph(i, icb(i)+2))
150     sig(i, icb(i))=sig(i, icb(i)+1)
151     sig(i, icb(i)-1)=sig(i, icb(i))
152     end do
153 guez 47
154 guez 187 end SUBROUTINE cv30_closure
155 guez 47
156 guez 187 end module cv30_closure_m

  ViewVC Help
Powered by ViewVC 1.1.21