/[lmdze]/trunk/Sources/phylmd/CV30_routines/cv30_mixing.f
ViewVC logotype

Annotation of /trunk/Sources/phylmd/CV30_routines/cv30_mixing.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 189 - (hide annotations)
Tue Mar 29 15:20:23 2016 UTC (8 years, 2 months ago) by guez
File size: 10274 byte(s)
There was a function gr_phy_write_3d in dyn3d and a function
gr_phy_write_2d in module grid_change. Moved them into a new module
gr_phy_write_m under a generic interface gr_phy_write. Replaced calls
to gr_fi_ecrit by calls to gr_phy_write.

Removed arguments len, nloc and nd of cv30_compress.

Removed arguments wd and wd1 of cv30_uncompress, wd of cv30_yield, wd
of concvl, wd1 of cv_driver. Was just filled with 0. Removed option
ok_gust in physiq, never used.

In cv30_unsat, cv30_yield and cv_driver, we only need to define b to
level nl - 1.

1 guez 185 module cv30_mixing_m
2 guez 47
3 guez 97 implicit none
4 guez 47
5 guez 97 contains
6 guez 47
7 guez 185 SUBROUTINE cv30_mixing(nloc, ncum, nd, na, icb, nk, inb, t, rr, rs, u, v, h, &
8 guez 145 lv, hp, ep, clw, m, sig, ment, qent, uent, vent, nent, sij, elij, &
9     ments, qents)
10 guez 185 use cv30_param_m
11 guez 97 use cvthermo
12 guez 47
13 guez 189 !
14 guez 97 ! a faire:
15 guez 145 ! - changer rr(il, 1) -> qnk(il)
16     ! - vectorisation de la partie normalisation des flux (do 789)
17 guez 189 !
18 guez 47
19 guez 97 ! inputs:
20     integer, intent(in):: ncum, nd, na, nloc
21 guez 187 integer, intent(in):: icb(nloc), inb(nloc), nk(nloc)
22 guez 145 real sig(nloc, nd)
23     real t(nloc, nd), rr(nloc, nd), rs(nloc, nd)
24     real u(nloc, nd), v(nloc, nd)
25     real lv(nloc, na), h(nloc, na), hp(nloc, na)
26     real ep(nloc, na), clw(nloc, na)
27     real m(nloc, na) ! input of convect3
28 guez 47
29 guez 97 ! outputs:
30 guez 145 real ment(nloc, na, na), qent(nloc, na, na)
31     real uent(nloc, na, na), vent(nloc, na, na)
32     real sij(nloc, na, na), elij(nloc, na, na)
33     real ments(nloc, nd, nd), qents(nloc, nd, nd)
34     integer nent(nloc, nd)
35 guez 47
36 guez 97 ! local variables:
37     integer i, j, k, il, im, jm
38     integer num1, num2
39     real rti, bf2, anum, denom, dei, altem, cwat, stemp, qp
40     real alt, smid, sjmin, sjmax, delp, delm
41     real asij(nloc), smax(nloc), scrit(nloc)
42 guez 145 real asum(nloc, nd), bsum(nloc, nd), csum(nloc, nd)
43 guez 97 real wgh
44 guez 145 real zm(nloc, na)
45 guez 97 logical lwork(nloc)
46    
47 guez 189 ! INITIALIZE VARIOUS ARRAYS USED IN THE COMPUTATIONS
48 guez 97
49 guez 145 do j=1, nl
50     do i=1, ncum
51     nent(i, j)=0
52 guez 185 ! in convect3, m is computed in cv30_closure
53 guez 145 ! ori m(i, 1)=0.0
54 guez 97 end do
55     end do
56 guez 47
57 guez 145 do j=1, nl
58     do k=1, nl
59     do i=1, ncum
60     qent(i, k, j)=rr(i, j)
61     uent(i, k, j)=u(i, j)
62     vent(i, k, j)=v(i, j)
63     elij(i, k, j)=0.0
64     !ym ment(i, k, j)=0.0
65     !ym sij(i, k, j)=0.0
66 guez 97 end do
67     end do
68     end do
69 guez 47
70 guez 97 !ym
71 guez 145 ment(1:ncum, 1:nd, 1:nd)=0.0
72     sij(1:ncum, 1:nd, 1:nd)=0.0
73 guez 47
74 guez 145 zm(:, :)=0.
75 guez 47
76 guez 189 ! CALCULATE ENTRAINED AIR MASS FLUX (ment), TOTAL WATER MIXING
77     ! RATIO (QENT), TOTAL CONDENSED WATER (elij), AND MIXING
78     ! FRACTION (sij)
79 guez 47
80 guez 145 do i=minorig+1, nl
81 guez 47
82 guez 145 do j=minorig, nl
83     do il=1, ncum
84     if((i >= icb(il)).and.(i <= inb(il)).and. &
85     (j >= (icb(il)-1)).and.(j <= inb(il)))then
86 guez 47
87 guez 145 rti=rr(il, 1)-ep(il, i)*clw(il, i)
88     bf2=1.+lv(il, j)*lv(il, j)*rs(il, j)/(rrv*t(il, j)*t(il, j)*cpd)
89     anum=h(il, j)-hp(il, i)+(cpv-cpd)*t(il, j)*(rti-rr(il, j))
90     denom=h(il, i)-hp(il, i)+(cpd-cpv)*(rr(il, i)-rti)*t(il, j)
91 guez 97 dei=denom
92 guez 145 if(abs(dei) < 0.01)dei=0.01
93     sij(il, i, j)=anum/dei
94     sij(il, i, i)=1.0
95     altem=sij(il, i, j)*rr(il, i)+(1.-sij(il, i, j))*rti-rs(il, j)
96 guez 97 altem=altem/bf2
97 guez 145 cwat=clw(il, j)*(1.-ep(il, j))
98     stemp=sij(il, i, j)
99     if((stemp < 0.0.or.stemp > 1.0.or.altem > cwat) &
100     .and.j > i)then
101     anum=anum-lv(il, j)*(rti-rs(il, j)-cwat*bf2)
102     denom=denom+lv(il, j)*(rr(il, i)-rti)
103     if(abs(denom) < 0.01)denom=0.01
104     sij(il, i, j)=anum/denom
105     altem=sij(il, i, j)*rr(il, i)+(1.-sij(il, i, j))*rti-rs(il, j)
106 guez 97 altem=altem-(bf2-1.)*cwat
107     end if
108 guez 145 if(sij(il, i, j) > 0.0.and.sij(il, i, j) < 0.95)then
109     qent(il, i, j)=sij(il, i, j)*rr(il, i)+(1.-sij(il, i, j))*rti
110     uent(il, i, j)=sij(il, i, j)*u(il, i)+(1.-sij(il, i, j))*u(il, nk(il))
111     vent(il, i, j)=sij(il, i, j)*v(il, i)+(1.-sij(il, i, j))*v(il, nk(il))
112     elij(il, i, j)=altem
113     elij(il, i, j)=amax1(0.0, elij(il, i, j))
114     ment(il, i, j)=m(il, i)/(1.-sij(il, i, j))
115     nent(il, i)=nent(il, i)+1
116 guez 97 end if
117 guez 145 sij(il, i, j)=amax1(0.0, sij(il, i, j))
118     sij(il, i, j)=amin1(1.0, sij(il, i, j))
119 guez 97 endif ! new
120     end do
121     end do
122 guez 47
123 guez 189 ! if no air can entrain at level i assume that updraft detrains
124     ! at that level and calculate detrained air flux and properties
125 guez 47
126 guez 145 do il=1, ncum
127     if ((i >= icb(il)).and.(i <= inb(il)).and.(nent(il, i) == 0)) then
128     !@ if(nent(il, i) == 0)then
129     ment(il, i, i)=m(il, i)
130     qent(il, i, i)=rr(il, nk(il))-ep(il, i)*clw(il, i)
131     uent(il, i, i)=u(il, nk(il))
132     vent(il, i, i)=v(il, nk(il))
133     elij(il, i, i)=clw(il, i)
134     !MAF sij(il, i, i)=1.0
135     sij(il, i, i)=0.0
136 guez 97 end if
137     end do
138     end do
139 guez 47
140 guez 189 ! NORMALIZE ENTRAINED AIR MASS FLUXES
141     ! TO REPRESENT EQUAL PROBABILITIES OF MIXING
142 guez 47
143 guez 186 asum = 0.
144     csum = 0.
145 guez 47
146 guez 145 do il=1, ncum
147 guez 47 lwork(il) = .FALSE.
148 guez 97 enddo
149 guez 47
150 guez 145 DO i=minorig+1, nl
151 guez 47
152 guez 97 num1=0
153 guez 145 do il=1, ncum
154     if (i >= icb(il) .and. i <= inb(il)) num1=num1+1
155 guez 97 enddo
156 guez 145 if (num1 <= 0) cycle
157 guez 47
158 guez 145 do il=1, ncum
159     if (i >= icb(il) .and. i <= inb(il)) then
160     lwork(il)=(nent(il, i) /= 0)
161     qp=rr(il, 1)-ep(il, i)*clw(il, i)
162     anum=h(il, i)-hp(il, i)-lv(il, i)*(qp-rs(il, i)) &
163     +(cpv-cpd)*t(il, i)*(qp-rr(il, i))
164     denom=h(il, i)-hp(il, i)+lv(il, i)*(rr(il, i)-qp) &
165     +(cpd-cpv)*t(il, i)*(rr(il, i)-qp)
166     if(abs(denom) < 0.01)denom=0.01
167 guez 97 scrit(il)=anum/denom
168 guez 145 alt=qp-rs(il, i)+scrit(il)*(rr(il, i)-qp)
169     if(scrit(il) <= 0.0.or.alt <= 0.0)scrit(il)=1.0
170 guez 97 smax(il)=0.0
171     asij(il)=0.0
172     endif
173     end do
174 guez 47
175 guez 145 do j=nl, minorig, -1
176 guez 47
177 guez 97 num2=0
178 guez 145 do il=1, ncum
179     if (i >= icb(il) .and. i <= inb(il) .and. &
180     j >= (icb(il)-1) .and. j <= inb(il) &
181     .and. lwork(il)) num2=num2+1
182 guez 97 enddo
183 guez 145 if (num2 <= 0) cycle
184 guez 47
185 guez 145 do il=1, ncum
186     if (i >= icb(il) .and. i <= inb(il) .and. &
187     j >= (icb(il)-1) .and. j <= inb(il) &
188     .and. lwork(il)) then
189 guez 47
190 guez 145 if(sij(il, i, j) > 1.0e-16.and.sij(il, i, j) < 0.95)then
191 guez 97 wgh=1.0
192 guez 145 if(j > i)then
193     sjmax=amax1(sij(il, i, j+1), smax(il))
194     sjmax=amin1(sjmax, scrit(il))
195     smax(il)=amax1(sij(il, i, j), smax(il))
196     sjmin=amax1(sij(il, i, j-1), smax(il))
197     sjmin=amin1(sjmin, scrit(il))
198     if(sij(il, i, j) < (smax(il)-1.0e-16))wgh=0.0
199     smid=amin1(sij(il, i, j), scrit(il))
200 guez 97 else
201 guez 145 sjmax=amax1(sij(il, i, j+1), scrit(il))
202     smid=amax1(sij(il, i, j), scrit(il))
203 guez 97 sjmin=0.0
204 guez 145 if(j > 1)sjmin=sij(il, i, j-1)
205     sjmin=amax1(sjmin, scrit(il))
206 guez 97 endif
207     delp=abs(sjmax-smid)
208     delm=abs(sjmin-smid)
209     asij(il)=asij(il)+wgh*(delp+delm)
210 guez 145 ment(il, i, j)=ment(il, i, j)*(delp+delm)*wgh
211 guez 97 endif
212     endif
213     end do
214 guez 47
215 guez 97 end do
216 guez 47
217 guez 145 do il=1, ncum
218     if (i >= icb(il).and.i <= inb(il).and.lwork(il)) then
219     asij(il)=amax1(1.0e-16, asij(il))
220 guez 97 asij(il)=1.0/asij(il)
221 guez 145 asum(il, i)=0.0
222     bsum(il, i)=0.0
223     csum(il, i)=0.0
224 guez 97 endif
225 guez 47 enddo
226    
227 guez 145 do j=minorig, nl
228     do il=1, ncum
229     if (i >= icb(il) .and. i <= inb(il) .and. lwork(il) &
230     .and. j >= (icb(il)-1) .and. j <= inb(il)) then
231     ment(il, i, j)=ment(il, i, j)*asij(il)
232 guez 97 endif
233     enddo
234     end do
235 guez 47
236 guez 145 do j=minorig, nl
237     do il=1, ncum
238     if (i >= icb(il) .and. i <= inb(il) .and. lwork(il) &
239     .and. j >= (icb(il)-1) .and. j <= inb(il)) then
240     asum(il, i)=asum(il, i)+ment(il, i, j)
241     ment(il, i, j)=ment(il, i, j)*sig(il, j)
242     bsum(il, i)=bsum(il, i)+ment(il, i, j)
243 guez 97 endif
244     enddo
245     end do
246 guez 47
247 guez 145 do il=1, ncum
248     if (i >= icb(il).and.i <= inb(il).and.lwork(il)) then
249     bsum(il, i)=amax1(bsum(il, i), 1.0e-16)
250     bsum(il, i)=1.0/bsum(il, i)
251 guez 97 endif
252 guez 47 enddo
253    
254 guez 145 do j=minorig, nl
255     do il=1, ncum
256     if (i >= icb(il) .and. i <= inb(il) .and. lwork(il) &
257     .and. j >= (icb(il)-1) .and. j <= inb(il)) then
258     ment(il, i, j)=ment(il, i, j)*asum(il, i)*bsum(il, i)
259 guez 97 endif
260     enddo
261     end do
262    
263 guez 145 do j=minorig, nl
264     do il=1, ncum
265     if (i >= icb(il) .and. i <= inb(il) .and. lwork(il) &
266     .and. j >= (icb(il)-1) .and. j <= inb(il)) then
267     csum(il, i)=csum(il, i)+ment(il, i, j)
268 guez 97 endif
269     enddo
270     end do
271    
272 guez 145 do il=1, ncum
273     if (i >= icb(il) .and. i <= inb(il) .and. lwork(il) &
274     .and. csum(il, i) < m(il, i)) then
275     nent(il, i)=0
276     ment(il, i, i)=m(il, i)
277     qent(il, i, i)=rr(il, 1)-ep(il, i)*clw(il, i)
278     uent(il, i, i)=u(il, nk(il))
279     vent(il, i, i)=v(il, nk(il))
280     elij(il, i, i)=clw(il, i)
281     !MAF sij(il, i, i)=1.0
282     sij(il, i, i)=0.0
283 guez 97 endif
284     enddo ! il
285 guez 47
286 guez 97 end DO
287 guez 145
288 guez 97 ! MAF: renormalisation de MENT
289 guez 145 do jm=1, nd
290     do im=1, nd
291     do il=1, ncum
292     zm(il, im)=zm(il, im)+(1.-sij(il, im, jm))*ment(il, im, jm)
293 guez 97 end do
294     end do
295     end do
296 guez 145
297     do jm=1, nd
298     do im=1, nd
299     do il=1, ncum
300     if(zm(il, im) /= 0.) then
301     ment(il, im, jm)=ment(il, im, jm)*m(il, im)/zm(il, im)
302 guez 97 endif
303     end do
304 guez 47 end do
305 guez 97 end do
306 guez 145
307     do jm=1, nd
308     do im=1, nd
309     do il=1, ncum
310     qents(il, im, jm)=qent(il, im, jm)
311     ments(il, im, jm)=ment(il, im, jm)
312 guez 97 end do
313 guez 47 enddo
314 guez 97 enddo
315 guez 47
316 guez 185 end SUBROUTINE cv30_mixing
317 guez 97
318 guez 185 end module cv30_mixing_m

  ViewVC Help
Powered by ViewVC 1.1.21