CCPP SciDoc v7.0.x  v7.0.0
Common Community Physics Package Developed at DTC
 
Loading...
Searching...
No Matches
progsigma_calc.f90
1
2
7 module progsigma
8
9 implicit none
10
11 public progsigma_calc
12
13 contains
14
20 subroutine progsigma_calc (im,km,flag_init,flag_restart,flag_shallow,&
21 flag_mid,del,tmf,qmicro,dbyo1,zdqca,omega_u,zeta,hvap, &
22 delt,qadv,kb,kbcon1,ktcon,cnvflg,betascu,betamcu,betadcu, &
23 sigmind,sigminm,sigmins,sigmain,sigmaout,sigmab)
24!
25!
26 use machine, only : kind_phys
27 use funcphys, only : fpvs
28
29 implicit none
30
31! intent in
32 integer, intent(in) :: im,km,kb(im),kbcon1(im),ktcon(im)
33 real(kind=kind_phys), intent(in) :: hvap,delt,betascu,betamcu,betadcu, &
34 sigmind,sigminm,sigmins
35 real(kind=kind_phys), intent(in) :: qadv(im,km),del(im,km), &
36 qmicro(im,km),tmf(im,km),dbyo1(im,km),zdqca(im,km), &
37 omega_u(im,km),zeta(im,km)
38 logical, intent(in) :: flag_init,flag_restart,cnvflg(im),flag_shallow,flag_mid
39 real(kind=kind_phys), intent(in) :: sigmain(im,km)
40
41! intent out
42 real(kind=kind_phys), intent(inout) :: sigmaout(im,km)
43 real(kind=kind_phys), intent(out) :: sigmab(im)
44
45
46! Local variables
47 integer :: i,k,km1
48 real(kind=kind_phys) :: terma(im),termb(im),termc(im),termd(im)
49 real(kind=kind_phys) :: fdqa(im),form(im,km), &
50 dp(im,km),inbu(im,km)
51 real(kind=kind_phys) :: sumx(im)
52
53 real(kind=kind_phys) :: gcvalmx,epsilon,zz,cvg,mcon,buy2, &
54 fdqb,dtdyn,dxlim,rmulacvg,tem, &
55 den,dp1,invdelt,sigmind_new
56
57 !Parameters
58 gcvalmx = 0.1
59 rmulacvg=10.
60 epsilon=1.e-11
61 km1=km-1
62 invdelt = 1./delt
63
64 if(flag_init .and. .not. flag_restart) then
65 sigmind_new=0.0
66 else
67 sigmind_new=sigmind
68 end if
69
70 !Initialization 2D
71 do k = 1,km
72 do i = 1,im
73 inbu(i,k)=0.
74 form(i,k)=0.
75 dp(i,k)=0.
76 enddo
77 enddo
78
79 !Initialization 1D
80 do i=1,im
81 sigmab(i)=0.
82 terma(i)=0.
83 termb(i)=0.
84 termc(i)=0.
85 termd(i)=0.
86 fdqa(i)=0.
87 sumx(i)=0.
88 enddo
89
90 do k = 2,km1
91 do i = 1,im
92 if(cnvflg(i))then
93 dp(i,k) = 1000. * del(i,k)
94 endif
95 enddo
96 enddo
97
98!compute sigmain averaged over cloud layers after advection and place it in sigmab
99 do k=2,km1
100 do i=1,im
101 if(cnvflg(i))then
102 if(k > kbcon1(i) .and. k < ktcon(i)) then
103 sigmab(i) = sigmab(i) + sigmain(i,k) * dp(i,k)
104 sumx(i) = sumx(i) + dp(i,k)
105 endif
106 endif
107 enddo
108 enddo
109 do i = 1, im
110 if(cnvflg(i)) then
111 if(sumx(i) == 0.) then
112 k = kbcon1(i)
113 sigmab(i) = sigmain(i,k)
114 else
115 sigmab(i) = sigmab(i) / sumx(i)
116 sigmab(i) = min(sigmab(i), 1._kind_phys)
117 if(sigmab(i) < 1.e-5) sigmab(i)=0.
118 endif
119 endif
120 enddo
121
122 !compute termD "The vertical integral of the latent heat convergence is limited to the
123 ! layers with positive moisture convergence (accumulated from the updraft starting level).
124 do k = 1,km1
125 do i = 1,im
126 if(cnvflg(i))then
127 if(k >= kb(i) .and. k < ktcon(i)) then
128 mcon = (hvap*(qadv(i,k)+tmf(i,k)+qmicro(i,k))*dp(i,k))
129 buy2 = termd(i)+mcon
130!
131! Do the integral over buoyant layers with positive mcon acc from
132! updraft starting level
133!
134 if(buy2 > 0.)then
135 inbu(i,k)=1.
136 termd(i) = termd(i) + mcon
137 endif
138 endif
139 endif
140 enddo
141 enddo
142
143 !termA
144 do k = 2,km1
145 do i = 1,im
146 if(cnvflg(i))then
147 if(k >= kbcon1(i) .and. k < ktcon(i)) then
148 tem=sigmab(i)*zeta(i,k)*inbu(i,k)*dbyo1(i,k)*dp(i,k)
149 terma(i)=terma(i)+tem
150 endif
151 endif
152 enddo
153 enddo
154
155 !termB
156 do k = 2,km1
157 do i = 1,im
158 if(cnvflg(i))then
159 if(k >= kbcon1(i) .and. k < ktcon(i)) then
160 tem=zeta(i,k)*dbyo1(i,k)*inbu(i,k)*dp(i,k)
161 termb(i)=termb(i)+tem
162 endif
163 endif
164 enddo
165 enddo
166
167 !termC
168 do k = 2,km1
169 do i = 1,im
170 if(cnvflg(i))then
171 if(k >= kbcon1(i) .and. k < ktcon(i)) then
172 form(i,k)=-1.0*inbu(i,k)*(omega_u(i,k)*delt)
173 fdqb=0.5*((form(i,k)*zdqca(i,k)))
174 termc(i)=termc(i)+inbu(i,k)* &
175 (fdqb+fdqa(i))*hvap*zeta(i,k)
176 fdqa(i)=fdqb
177 endif
178 endif
179 enddo
180 enddo
181
182 !sigmab
183 do i = 1,im
184 if(cnvflg(i))then
185 den=min(termc(i)+termb(i),1.e8_kind_phys)
186 cvg=termd(i)*delt
187 zz=max(0.0,sign(1.0,terma(i))) &
188 *max(0.0,sign(1.0,termb(i))) &
189 *max(0.0,sign(1.0,termc(i)-epsilon))
190 cvg=max(0.0,cvg)
191 sigmab(i)=(zz*(terma(i)+cvg))/(den+(1.0-zz))
192 if(sigmab(i)>0.)then
193 sigmab(i)=min(sigmab(i),0.95)
194 sigmab(i)=max(sigmab(i),sigmind_new)
195 endif
196 endif!cnvflg
197 enddo
198
199 do k=1,km
200 do i=1,im
201 if(cnvflg(i))then
202 sigmaout(i,k)=sigmab(i)
203 endif
204 enddo
205 enddo
206
207 !Reduce area fraction before coupling back to mass-flux computation.
208 if(flag_shallow)then
209 do i= 1, im
210 if(cnvflg(i)) then
211 sigmab(i)=sigmab(i)/betascu
212 sigmab(i)=max(sigmins,sigmab(i))
213 endif
214 enddo
215 elseif(flag_mid)then
216 do i= 1, im
217 if(cnvflg(i)) then
218 sigmab(i)=sigmab(i)/betamcu
219 sigmab(i)=max(sigminm,sigmab(i))
220 endif
221 enddo
222 else
223 do i= 1, im
224 if(cnvflg(i)) then
225 sigmab(i)=sigmab(i)/betadcu
226 sigmab(i)=max(sigmind_new,sigmab(i))
227 endif
228 enddo
229 endif
230 do i= 1, im
231 sigmab(i) = min(0.95,sigmab(i))
232 enddo
233
234 end subroutine progsigma_calc
235
236end module progsigma
This module contains the subroutine that calculates the prognostic updraft area fraction that is used...