4 |
|
|
5 |
contains |
contains |
6 |
|
|
7 |
SUBROUTINE cv30_unsat(nloc,ncum,nd,na,icb,inb & |
SUBROUTINE cv30_unsat(icb, inb, t, q, qs, gz, u, v, p, ph, th, tv, lv, cpn, & |
8 |
,t,rr,rs,gz,u,v,p,ph & |
ep, clw, m, ment, elij, delt, plcl, mp, qp, up, vp, wt, water, evap, b) |
|
,th,tv,lv,cpn,ep,sigp,clw & |
|
|
,m,ment,elij,delt,plcl & |
|
|
,mp,rp,up,vp,wt,water,evap,b) |
|
|
use cv30_param_m |
|
|
use cvthermo |
|
|
use cvflag |
|
9 |
|
|
10 |
|
! Unsaturated (precipitating) downdrafts |
11 |
|
|
12 |
! inputs: |
use cv30_param_m, only: nl, sigd |
13 |
integer, intent(in):: ncum, nd, na, nloc |
use cv_thermo_m, only: cpd, ginv, grav |
14 |
integer icb(nloc), inb(nloc) |
|
15 |
|
integer, intent(in):: icb(:) ! (ncum) |
16 |
|
|
17 |
|
integer, intent(in):: inb(:) ! (ncum) |
18 |
|
! first model level above the level of neutral buoyancy of the |
19 |
|
! parcel (1 <= inb <= nl - 1) |
20 |
|
|
21 |
|
real, intent(in):: t(:, :), q(:, :), qs(:, :) ! (ncum, nl) |
22 |
|
real, intent(in):: gz(:, :) ! (klon, klev) |
23 |
|
real, intent(in):: u(:, :), v(:, :) ! (klon, klev) |
24 |
|
real, intent(in):: p(:, :) ! (klon, klev) pressure at full level, in hPa |
25 |
|
real, intent(in):: ph(:, :) ! (klon, klev + 1) |
26 |
|
real, intent(in):: th(:, :) ! (ncum, nl - 1) |
27 |
|
real, intent(in):: tv(:, :) ! (klon, klev) |
28 |
|
real, intent(in):: lv(:, :) ! (klon, klev) |
29 |
|
real, intent(in):: cpn(:, :) ! (klon, klev) |
30 |
|
real, intent(in):: ep(:, :) ! (ncum, klev) |
31 |
|
real, intent(in):: clw(:, :) ! (ncum, klev) |
32 |
|
real, intent(in):: m(:, :) ! (ncum, klev) |
33 |
|
real, intent(in):: ment(:, :, :) ! (ncum, klev, klev) |
34 |
|
real, intent(in):: elij(:, :, :) ! (ncum, klev, klev) |
35 |
real, intent(in):: delt |
real, intent(in):: delt |
36 |
real plcl(nloc) |
real, intent(in):: plcl(:) ! (klon) |
37 |
real t(nloc,nd), rr(nloc,nd), rs(nloc,nd) |
|
38 |
real u(nloc,nd), v(nloc,nd) |
real, intent(out):: mp(:, :) ! (klon, klev) |
39 |
real p(nloc,nd), ph(nloc,nd+1) |
real, intent(out):: qp(:, :), up(:, :), vp(:, :) ! (ncum, nl) |
40 |
real th(nloc,na), gz(nloc,na) |
real, intent(out):: wt(:, :) ! (ncum, nl) |
41 |
real lv(nloc,na), ep(nloc,na), sigp(nloc,na), clw(nloc,na) |
real, intent(out):: water(:, :), evap(:, :) ! (ncum, nl) |
42 |
real cpn(nloc,na), tv(nloc,na) |
real, intent(out):: b(:, :) ! (ncum, nl - 1) |
43 |
real m(nloc,na), ment(nloc,na,na), elij(nloc,na,na) |
|
44 |
|
! Local: |
45 |
! outputs: |
|
46 |
real mp(nloc,na), rp(nloc,na), up(nloc,na), vp(nloc,na) |
real, parameter:: sigp = 0.15 |
47 |
real water(nloc,na), evap(nloc,na), wt(nloc,na) |
! fraction of precipitation falling outside of cloud, \sig_s in |
48 |
real b(nloc,na) |
! Emanuel (1991 928) |
49 |
|
|
50 |
! local variables |
integer ncum |
51 |
integer i,j,il,num1 |
integer i, il, imax |
52 |
real tinv, delti |
real tinv, delti |
53 |
real awat, afac, afac1, afac2, bfac |
real afac, afac1, afac2, bfac |
54 |
real pr1, pr2, sigt, b6, c6, revap, tevap, delth |
real pr1, pr2, sigt, b6, c6, revap, tevap, delth |
55 |
real amfac, amp2, xf, tf, fac2, ur, sru, fac, d, af, bf |
real amfac, amp2, xf, tf, fac2, ur, sru, fac, d, af, bf |
56 |
real ampmax |
real ampmax |
57 |
real lvcp(nloc,na) |
real lvcp(size(icb), nl) ! (ncum, nl) |
58 |
real wdtrain(nloc) |
real wdtrain(size(icb)) ! (ncum) |
59 |
logical lwork(nloc) |
logical lwork(size(icb)) ! (ncum) |
|
|
|
60 |
|
|
61 |
!------------------------------------------------------ |
!------------------------------------------------------ |
62 |
|
|
63 |
delti = 1./delt |
ncum = size(icb) |
64 |
tinv=1./3. |
delti = 1. / delt |
65 |
|
tinv = 1. / 3. |
66 |
mp(:,:)=0. |
mp = 0. |
67 |
|
b = 0. |
68 |
do i=1,nl |
|
69 |
do il=1,ncum |
do i = 1, nl |
70 |
mp(il,i)=0.0 |
do il = 1, ncum |
71 |
rp(il,i)=rr(il,i) |
qp(il, i) = q(il, i) |
72 |
up(il,i)=u(il,i) |
up(il, i) = u(il, i) |
73 |
vp(il,i)=v(il,i) |
vp(il, i) = v(il, i) |
74 |
wt(il,i)=0.001 |
wt(il, i) = 0.001 |
75 |
water(il,i)=0.0 |
water(il, i) = 0. |
76 |
evap(il,i)=0.0 |
evap(il, i) = 0. |
77 |
b(il,i)=0.0 |
lvcp(il, i) = lv(il, i) / cpn(il, i) |
|
lvcp(il,i)=lv(il,i)/cpn(il,i) |
|
78 |
enddo |
enddo |
79 |
enddo |
enddo |
80 |
|
|
81 |
! |
! Check whether ep(inb) = 0. If so, skip precipitating downdraft |
82 |
! *** check whether ep(inb)=0, if so, skip precipitating *** |
! calculation. |
|
! *** downdraft calculation *** |
|
|
! |
|
|
|
|
|
do il=1,ncum |
|
|
lwork(il)=.TRUE. |
|
|
if(ep(il,inb(il)).lt.0.0001)lwork(il)=.FALSE. |
|
|
enddo |
|
|
|
|
|
call zilch(wdtrain,ncum) |
|
83 |
|
|
84 |
DO i=nl+1,1,-1 |
forall (il = 1:ncum) lwork(il) = ep(il, inb(il)) >= 1e-4 |
85 |
|
|
86 |
num1=0 |
imax = nl - 1 |
87 |
do il=1,ncum |
do while (.not. any(inb >= imax .and. lwork) .and. imax >= 1) |
88 |
if ( i.le.inb(il) .and. lwork(il) ) num1=num1+1 |
imax = imax - 1 |
89 |
enddo |
end do |
90 |
if (num1.le.0) cycle |
|
91 |
|
downdraft_loop: DO i = imax, 1, - 1 |
92 |
! |
! Integrate liquid water equation to find condensed water |
93 |
! *** integrate liquid water equation to find condensed water *** |
! and condensed water flux |
94 |
! *** and condensed water flux *** |
|
95 |
! |
! Calculate detrained precipitation |
96 |
|
forall (il = 1:ncum, inb(il) >= i .and. lwork(il)) wdtrain(il) = grav & |
97 |
! |
* (ep(il, i) * m(il, i) * clw(il, i) & |
98 |
! *** begin downdraft loop *** |
+ sum(max(elij(il, :i - 1, i) - (1. - ep(il, i)) * clw(il, i), 0.) & |
99 |
! |
* ment(il, :i - 1, i))) |
100 |
|
|
101 |
! |
! Find rain water and evaporation using provisional |
102 |
! *** calculate detrained precipitation *** |
! estimates of qp(i) and qp(i - 1) |
103 |
! |
|
104 |
do il=1,ncum |
loop_horizontal: do il = 1, ncum |
105 |
if (i.le.inb(il) .and. lwork(il)) then |
if (i <= inb(il) .and. lwork(il)) then |
106 |
if (cvflag_grav) then |
wt(il, i) = 45. |
107 |
wdtrain(il)=grav*ep(il,i)*m(il,i)*clw(il,i) |
|
108 |
else |
if (i < inb(il)) then |
109 |
wdtrain(il)=10.0*ep(il,i)*m(il,i)*clw(il,i) |
qp(il, i) = qp(il, i + 1) + (cpd * (t(il, i + 1) - t(il, i)) & |
110 |
|
+ gz(il, i + 1) - gz(il, i)) / lv(il, i) |
111 |
|
qp(il, i) = 0.5 * (qp(il, i) + q(il, i)) |
112 |
endif |
endif |
|
endif |
|
|
enddo |
|
|
|
|
|
if(i.gt.1)then |
|
|
do j=1,i-1 |
|
|
do il=1,ncum |
|
|
if (i.le.inb(il) .and. lwork(il)) then |
|
|
awat=elij(il,j,i)-(1.-ep(il,i))*clw(il,i) |
|
|
awat=amax1(awat,0.0) |
|
|
if (cvflag_grav) then |
|
|
wdtrain(il)=wdtrain(il)+grav*awat*ment(il,j,i) |
|
|
else |
|
|
wdtrain(il)=wdtrain(il)+10.0*awat*ment(il,j,i) |
|
|
endif |
|
|
endif |
|
|
enddo |
|
|
end do |
|
|
endif |
|
|
|
|
|
! |
|
|
! *** find rain water and evaporation using provisional *** |
|
|
! *** estimates of rp(i)and rp(i-1) *** |
|
|
! |
|
|
|
|
|
do il=1,ncum |
|
|
|
|
|
if (i.le.inb(il) .and. lwork(il)) then |
|
|
|
|
|
wt(il,i)=45.0 |
|
113 |
|
|
114 |
if(i.lt.inb(il))then |
qp(il, i) = max(qp(il, i), 0.) |
115 |
rp(il,i)=rp(il,i+1) & |
qp(il, i) = min(qp(il, i), qs(il, i)) |
116 |
+(cpd*(t(il,i+1)-t(il,i))+gz(il,i+1)-gz(il,i))/lv(il,i) |
qp(il, inb(il)) = q(il, inb(il)) |
117 |
rp(il,i)=0.5*(rp(il,i)+rr(il,i)) |
|
118 |
endif |
if (i == 1) then |
119 |
rp(il,i)=amax1(rp(il,i),0.0) |
afac = p(il, 1) * (qs(il, 1) - qp(il, 1)) & |
120 |
rp(il,i)=amin1(rp(il,i),rs(il,i)) |
/ (1e4 + 2000. * p(il, 1) * qs(il, 1)) |
|
rp(il,inb(il))=rr(il,inb(il)) |
|
|
|
|
|
if(i.eq.1)then |
|
|
afac=p(il,1)*(rs(il,1)-rp(il,1))/(1.0e4+2000.0*p(il,1)*rs(il,1)) |
|
121 |
else |
else |
122 |
rp(il,i-1)=rp(il,i) & |
qp(il, i - 1) = qp(il, i) + (cpd * (t(il, i) - t(il, i - 1)) & |
123 |
+(cpd*(t(il,i)-t(il,i-1))+gz(il,i)-gz(il,i-1))/lv(il,i) |
+ gz(il, i) - gz(il, i - 1)) / lv(il, i) |
124 |
rp(il,i-1)=0.5*(rp(il,i-1)+rr(il,i-1)) |
qp(il, i - 1) = 0.5 * (qp(il, i - 1) + q(il, i - 1)) |
125 |
rp(il,i-1)=amin1(rp(il,i-1),rs(il,i-1)) |
qp(il, i - 1) = min(qp(il, i - 1), qs(il, i - 1)) |
126 |
rp(il,i-1)=amax1(rp(il,i-1),0.0) |
qp(il, i - 1) = max(qp(il, i - 1), 0.) |
127 |
afac1=p(il,i)*(rs(il,i)-rp(il,i))/(1.0e4+2000.0*p(il,i)*rs(il,i)) |
afac1 = p(il, i) * (qs(il, i) - qp(il, i)) & |
128 |
afac2=p(il,i-1)*(rs(il,i-1)-rp(il,i-1)) & |
/ (1e4 + 2000. * p(il, i) * qs(il, i)) |
129 |
/(1.0e4+2000.0*p(il,i-1)*rs(il,i-1)) |
afac2 = p(il, i - 1) * (qs(il, i - 1) - qp(il, i - 1)) & |
130 |
afac=0.5*(afac1+afac2) |
/ (1e4 + 2000. * p(il, i - 1) * qs(il, i - 1)) |
131 |
|
afac = 0.5 * (afac1 + afac2) |
132 |
endif |
endif |
133 |
if(i.eq.inb(il))afac=0.0 |
|
134 |
afac=amax1(afac,0.0) |
if (i == inb(il)) afac = 0. |
135 |
bfac=1./(sigd*wt(il,i)) |
afac = max(afac, 0.) |
136 |
! |
bfac = 1. / (sigd * wt(il, i)) |
137 |
!jyg1 |
|
138 |
!cc sigt=1.0 |
! Prise en compte de la variation progressive de sigt dans |
139 |
!cc if(i.ge.icb)sigt=sigp(i) |
! les couches icb et icb - 1: |
140 |
! prise en compte de la variation progressive de sigt dans |
! pour plcl <= ph(i + 1), pr1 = 0 et pr2 = 1 |
141 |
! les couches icb et icb-1: |
! pour plcl >= ph(i), pr1 = 1 et pr2 = 0 |
142 |
! pour plcl<ph(i+1), pr1=0 & pr2=1 |
! pour ph(i + 1) < plcl < ph(i), pr1 est la proportion \`a cheval |
143 |
! pour plcl>ph(i), pr1=1 & pr2=0 |
! sur le nuage, et pr2 est la proportion sous la base du |
144 |
! pour ph(i+1)<plcl<ph(i), pr1 est la proportion a cheval |
! nuage. |
145 |
! sur le nuage, et pr2 est la proportion sous la base du |
pr1 = max(0., min(1., & |
146 |
! nuage. |
(plcl(il) - ph(il, i + 1)) / (ph(il, i) - ph(il, i + 1)))) |
147 |
pr1=(plcl(il)-ph(il,i+1))/(ph(il,i)-ph(il,i+1)) |
pr2 = max(0., min(1., & |
148 |
pr1=max(0.,min(1.,pr1)) |
(ph(il, i) - plcl(il)) / (ph(il, i) - ph(il, i + 1)))) |
149 |
pr2=(ph(il,i)-plcl(il))/(ph(il,i)-ph(il,i+1)) |
sigt = sigp * pr1 + pr2 |
150 |
pr2=max(0.,min(1.,pr2)) |
|
151 |
sigt=sigp(il,i)*pr1+pr2 |
b6 = bfac * 50. * sigd * (ph(il, i) - ph(il, i + 1)) * sigt * afac |
152 |
!jyg2 |
c6 = water(il, i + 1) + bfac * wdtrain(il) - 50. * sigd * bfac & |
153 |
! |
* (ph(il, i) - ph(il, i + 1)) * evap(il, i + 1) |
154 |
b6=bfac*50.*sigd*(ph(il,i)-ph(il,i+1))*sigt*afac |
|
155 |
c6=water(il,i+1)+bfac*wdtrain(il) & |
if (c6 > 0.) then |
156 |
-50.*sigd*bfac*(ph(il,i)-ph(il,i+1))*evap(il,i+1) |
revap = 0.5 * (- b6 + sqrt(b6 * b6 + 4. * c6)) |
157 |
if(c6.gt.0.0)then |
evap(il, i) = sigt * afac * revap |
158 |
revap=0.5*(-b6+sqrt(b6*b6+4.*c6)) |
water(il, i) = revap * revap |
|
evap(il,i)=sigt*afac*revap |
|
|
water(il,i)=revap*revap |
|
159 |
else |
else |
160 |
evap(il,i)=-evap(il,i+1) & |
evap(il, i) = - evap(il, i + 1) + 0.02 * (wdtrain(il) + sigd & |
161 |
+0.02*(wdtrain(il)+sigd*wt(il,i)*water(il,i+1)) & |
* wt(il, i) * water(il, i + 1)) / (sigd * (ph(il, i) & |
162 |
/(sigd*(ph(il,i)-ph(il,i+1))) |
- ph(il, i + 1))) |
163 |
end if |
end if |
|
! |
|
|
! *** calculate precipitating downdraft mass flux under *** |
|
|
! *** hydrostatic approximation *** |
|
|
! |
|
|
if (i.ne.1) then |
|
|
|
|
|
tevap=amax1(0.0,evap(il,i)) |
|
|
delth=amax1(0.001,(th(il,i)-th(il,i-1))) |
|
|
if (cvflag_grav) then |
|
|
mp(il,i)=100.*ginv*lvcp(il,i)*sigd*tevap & |
|
|
*(p(il,i-1)-p(il,i))/delth |
|
|
else |
|
|
mp(il,i)=10.*lvcp(il,i)*sigd*tevap*(p(il,i-1)-p(il,i))/delth |
|
|
endif |
|
|
! |
|
|
! *** if hydrostatic assumption fails, *** |
|
|
! *** solve cubic difference equation for downdraft theta *** |
|
|
! *** and mass flux from two simultaneous differential eqns *** |
|
|
! |
|
|
amfac=sigd*sigd*70.0*ph(il,i)*(p(il,i-1)-p(il,i)) & |
|
|
*(th(il,i)-th(il,i-1))/(tv(il,i)*th(il,i)) |
|
|
amp2=abs(mp(il,i+1)*mp(il,i+1)-mp(il,i)*mp(il,i)) |
|
|
if(amp2.gt.(0.1*amfac))then |
|
|
xf=100.0*sigd*sigd*sigd*(ph(il,i)-ph(il,i+1)) |
|
|
tf=b(il,i)-5.0*(th(il,i)-th(il,i-1))*t(il,i) & |
|
|
/(lvcp(il,i)*sigd*th(il,i)) |
|
|
af=xf*tf+mp(il,i+1)*mp(il,i+1)*tinv |
|
|
bf=2.*(tinv*mp(il,i+1))**3+tinv*mp(il,i+1)*xf*tf & |
|
|
+50.*(p(il,i-1)-p(il,i))*xf*tevap |
|
|
fac2=1.0 |
|
|
if(bf.lt.0.0)fac2=-1.0 |
|
|
bf=abs(bf) |
|
|
ur=0.25*bf*bf-af*af*af*tinv*tinv*tinv |
|
|
if(ur.ge.0.0)then |
|
|
sru=sqrt(ur) |
|
|
fac=1.0 |
|
|
if((0.5*bf-sru).lt.0.0)fac=-1.0 |
|
|
mp(il,i)=mp(il,i+1)*tinv+(0.5*bf+sru)**tinv & |
|
|
+fac*(abs(0.5*bf-sru))**tinv |
|
|
else |
|
|
d=atan(2.*sqrt(-ur)/(bf+1.0e-28)) |
|
|
if(fac2.lt.0.0)d=3.14159-d |
|
|
mp(il,i)=mp(il,i+1)*tinv+2.*sqrt(af*tinv)*cos(d*tinv) |
|
|
endif |
|
|
mp(il,i)=amax1(0.0,mp(il,i)) |
|
164 |
|
|
165 |
if (cvflag_grav) then |
! Calculate precipitating downdraft mass flux under |
166 |
!jyg : il y a vraisemblablement une erreur dans la ligne 2 suivante: |
! hydrostatic approximation |
|
! il faut diviser par (mp(il,i)*sigd*grav) et non par (mp(il,i)+sigd*0.1). |
|
|
! Et il faut bien revoir les facteurs 100. |
|
|
b(il,i-1)=b(il,i)+100.0*(p(il,i-1)-p(il,i))*tevap & |
|
|
/(mp(il,i)+sigd*0.1) & |
|
|
-10.0*(th(il,i)-th(il,i-1))*t(il,i)/(lvcp(il,i)*sigd*th(il,i)) |
|
|
else |
|
|
b(il,i-1)=b(il,i)+100.0*(p(il,i-1)-p(il,i))*tevap & |
|
|
/(mp(il,i)+sigd*0.1) & |
|
|
-10.0*(th(il,i)-th(il,i-1))*t(il,i)/(lvcp(il,i)*sigd*th(il,i)) |
|
|
endif |
|
|
b(il,i-1)=amax1(b(il,i-1),0.0) |
|
|
endif |
|
|
! |
|
|
! *** limit magnitude of mp(i) to meet cfl condition *** |
|
|
! |
|
|
ampmax=2.0*(ph(il,i)-ph(il,i+1))*delti |
|
|
amp2=2.0*(ph(il,i-1)-ph(il,i))*delti |
|
|
ampmax=amin1(ampmax,amp2) |
|
|
mp(il,i)=amin1(mp(il,i),ampmax) |
|
|
! |
|
|
! *** force mp to decrease linearly to zero *** |
|
|
! *** between cloud base and the surface *** |
|
|
! |
|
|
if(p(il,i).gt.p(il,icb(il)))then |
|
|
mp(il,i)=mp(il,icb(il))*(p(il,1)-p(il,i))/(p(il,1)-p(il,icb(il))) |
|
|
endif |
|
|
|
|
|
endif ! i.eq.1 |
|
|
! |
|
|
! *** find mixing ratio of precipitating downdraft *** |
|
|
! |
|
|
|
|
|
if (i.ne.inb(il)) then |
|
|
|
|
|
rp(il,i)=rr(il,i) |
|
|
|
|
|
if(mp(il,i).gt.mp(il,i+1))then |
|
167 |
|
|
168 |
if (cvflag_grav) then |
test_above_surface: if (i /= 1) then |
169 |
rp(il,i)=rp(il,i+1)*mp(il,i+1)+rr(il,i)*(mp(il,i)-mp(il,i+1)) & |
tevap = max(0., evap(il, i)) |
170 |
+100.*ginv*0.5*sigd*(ph(il,i)-ph(il,i+1)) & |
delth = max(0.001, (th(il, i) - th(il, i - 1))) |
171 |
*(evap(il,i+1)+evap(il,i)) |
mp(il, i) = 100. * ginv * lvcp(il, i) * sigd * tevap & |
172 |
|
* (p(il, i - 1) - p(il, i)) / delth |
173 |
|
|
174 |
|
! If hydrostatic assumption fails, solve cubic |
175 |
|
! difference equation for downdraft theta and mass |
176 |
|
! flux from two simultaneous differential equations |
177 |
|
|
178 |
|
amfac = sigd * sigd * 70. * ph(il, i) & |
179 |
|
* (p(il, i - 1) - p(il, i)) & |
180 |
|
* (th(il, i) - th(il, i - 1)) / (tv(il, i) * th(il, i)) |
181 |
|
amp2 = abs(mp(il, i + 1) * mp(il, i + 1) - mp(il, i) & |
182 |
|
* mp(il, i)) |
183 |
|
|
184 |
|
if (amp2 > 0.1 * amfac) then |
185 |
|
xf = 100. * sigd * sigd * sigd * (ph(il, i) - ph(il, i + 1)) |
186 |
|
tf = b(il, i) - 5. * (th(il, i) - th(il, i - 1)) & |
187 |
|
* t(il, i) / (lvcp(il, i) * sigd * th(il, i)) |
188 |
|
af = xf * tf + mp(il, i + 1) * mp(il, i + 1) * tinv |
189 |
|
bf = 2. * (tinv * mp(il, i + 1))**3 + tinv & |
190 |
|
* mp(il, i + 1) * xf * tf + 50. * (p(il, i - 1) & |
191 |
|
- p(il, i)) * xf * tevap |
192 |
|
fac2 = 1. |
193 |
|
if (bf < 0.) fac2 = - 1. |
194 |
|
bf = abs(bf) |
195 |
|
ur = 0.25 * bf * bf - af * af * af * tinv * tinv * tinv |
196 |
|
|
197 |
|
if (ur >= 0.) then |
198 |
|
sru = sqrt(ur) |
199 |
|
fac = 1. |
200 |
|
if ((0.5 * bf - sru) < 0.) fac = - 1. |
201 |
|
mp(il, i) = mp(il, i + 1) * tinv + (0.5 * bf & |
202 |
|
+ sru)**tinv + fac * (abs(0.5 * bf - sru))**tinv |
203 |
else |
else |
204 |
rp(il,i)=rp(il,i+1)*mp(il,i+1)+rr(il,i)*(mp(il,i)-mp(il,i+1)) & |
d = atan(2. * sqrt(- ur) / (bf + 1e-28)) |
205 |
+5.*sigd*(ph(il,i)-ph(il,i+1)) & |
if (fac2 < 0.)d = 3.14159 - d |
206 |
*(evap(il,i+1)+evap(il,i)) |
mp(il, i) = mp(il, i + 1) * tinv + 2. * sqrt(af * tinv) & |
207 |
|
* cos(d * tinv) |
208 |
endif |
endif |
|
rp(il,i)=rp(il,i)/mp(il,i) |
|
|
up(il,i)=up(il,i+1)*mp(il,i+1)+u(il,i)*(mp(il,i)-mp(il,i+1)) |
|
|
up(il,i)=up(il,i)/mp(il,i) |
|
|
vp(il,i)=vp(il,i+1)*mp(il,i+1)+v(il,i)*(mp(il,i)-mp(il,i+1)) |
|
|
vp(il,i)=vp(il,i)/mp(il,i) |
|
209 |
|
|
210 |
else |
mp(il, i) = max(0., mp(il, i)) |
211 |
|
|
212 |
if(mp(il,i+1).gt.1.0e-16)then |
! Il y a vraisemblablement une erreur dans la |
213 |
if (cvflag_grav) then |
! ligne suivante : il faut diviser par (mp(il, |
214 |
rp(il,i)=rp(il,i+1) & |
! i) * sigd * grav) et non par (mp(il, i) + sigd |
215 |
+100.*ginv*0.5*sigd*(ph(il,i)-ph(il,i+1)) & |
! * 0.1). Et il faut bien revoir les facteurs |
216 |
*(evap(il,i+1)+evap(il,i))/mp(il,i+1) |
! 100. |
217 |
else |
b(il, i - 1) = b(il, i) + 100. * (p(il, i - 1) - p(il, i)) & |
218 |
rp(il,i)=rp(il,i+1) & |
* tevap / (mp(il, i) + sigd * 0.1) - 10. * (th(il, i) & |
219 |
+5.*sigd*(ph(il,i)-ph(il,i+1)) & |
- th(il, i - 1)) * t(il, i) / (lvcp(il, i) * sigd & |
220 |
*(evap(il,i+1)+evap(il,i))/mp(il,i+1) |
* th(il, i)) |
221 |
endif |
b(il, i - 1) = max(b(il, i - 1), 0.) |
222 |
up(il,i)=up(il,i+1) |
endif |
|
vp(il,i)=vp(il,i+1) |
|
223 |
|
|
224 |
|
! Limit magnitude of mp(i) to meet CFL condition: |
225 |
|
ampmax = 2. * (ph(il, i) - ph(il, i + 1)) * delti |
226 |
|
amp2 = 2. * (ph(il, i - 1) - ph(il, i)) * delti |
227 |
|
ampmax = min(ampmax, amp2) |
228 |
|
mp(il, i) = min(mp(il, i), ampmax) |
229 |
|
|
230 |
|
! Force mp to decrease linearly to zero between cloud |
231 |
|
! base and the surface: |
232 |
|
if (p(il, i) > p(il, icb(il))) mp(il, i) = mp(il, icb(il)) & |
233 |
|
* (p(il, 1) - p(il, i)) / (p(il, 1) - p(il, icb(il))) |
234 |
|
endif test_above_surface |
235 |
|
|
236 |
|
! Find mixing ratio of precipitating downdraft |
237 |
|
|
238 |
|
if (i /= inb(il)) then |
239 |
|
qp(il, i) = q(il, i) |
240 |
|
|
241 |
|
if (mp(il, i) > mp(il, i + 1)) then |
242 |
|
qp(il, i) = qp(il, i + 1) * mp(il, i + 1) + q(il, i) & |
243 |
|
* (mp(il, i) - mp(il, i + 1)) + 100. * ginv * 0.5 & |
244 |
|
* sigd * (ph(il, i) - ph(il, i + 1)) & |
245 |
|
* (evap(il, i + 1) + evap(il, i)) |
246 |
|
qp(il, i) = qp(il, i) / mp(il, i) |
247 |
|
up(il, i) = up(il, i + 1) * mp(il, i + 1) + u(il, i) & |
248 |
|
* (mp(il, i) - mp(il, i + 1)) |
249 |
|
up(il, i) = up(il, i) / mp(il, i) |
250 |
|
vp(il, i) = vp(il, i + 1) * mp(il, i + 1) + v(il, i) & |
251 |
|
* (mp(il, i) - mp(il, i + 1)) |
252 |
|
vp(il, i) = vp(il, i) / mp(il, i) |
253 |
|
else |
254 |
|
if (mp(il, i + 1) > 1e-16) then |
255 |
|
qp(il, i) = qp(il, i + 1) + 100. * ginv * 0.5 * sigd & |
256 |
|
* (ph(il, i) - ph(il, i + 1)) * (evap(il, i + 1) & |
257 |
|
+ evap(il, i)) / mp(il, i + 1) |
258 |
|
up(il, i) = up(il, i + 1) |
259 |
|
vp(il, i) = vp(il, i + 1) |
260 |
endif |
endif |
261 |
endif |
endif |
|
rp(il,i)=amin1(rp(il,i),rs(il,i)) |
|
|
rp(il,i)=amax1(rp(il,i),0.0) |
|
262 |
|
|
263 |
|
qp(il, i) = min(qp(il, i), qs(il, i)) |
264 |
|
qp(il, i) = max(qp(il, i), 0.) |
265 |
endif |
endif |
266 |
endif |
endif |
267 |
end do |
end do loop_horizontal |
268 |
|
end DO downdraft_loop |
|
end DO |
|
269 |
|
|
270 |
end SUBROUTINE cv30_unsat |
end SUBROUTINE cv30_unsat |
271 |
|
|