1 |
guez |
3 |
SUBROUTINE thermcell(ngrid,nlay,ptimestep |
2 |
|
|
s ,pplay,pplev,pphi |
3 |
|
|
s ,pu,pv,pt,po |
4 |
|
|
s ,pduadj,pdvadj,pdtadj,pdoadj |
5 |
|
|
s ,fm0,entr0 |
6 |
|
|
c s ,pu_therm,pv_therm |
7 |
|
|
s ,r_aspect,l_mix,w2di,tho) |
8 |
|
|
|
9 |
|
|
use dimens_m |
10 |
|
|
use dimphy |
11 |
|
|
use YOMCST |
12 |
|
|
IMPLICIT NONE |
13 |
|
|
|
14 |
|
|
c======================================================================= |
15 |
|
|
c |
16 |
|
|
c Calcul du transport verticale dans la couche limite en presence |
17 |
|
|
c de "thermiques" explicitement representes |
18 |
|
|
c |
19 |
|
|
c Réécriture à partir d'un listing papier à Habas, le 14/02/00 |
20 |
|
|
c |
21 |
|
|
c le thermique est supposé homogène et dissipé par mélange avec |
22 |
|
|
c son environnement. la longueur l_mix contrôle l'efficacité du |
23 |
|
|
c mélange |
24 |
|
|
c |
25 |
|
|
c Le calcul du transport des différentes espèces se fait en prenant |
26 |
|
|
c en compte: |
27 |
|
|
c 1. un flux de masse montant |
28 |
|
|
c 2. un flux de masse descendant |
29 |
|
|
c 3. un entrainement |
30 |
|
|
c 4. un detrainement |
31 |
|
|
c |
32 |
|
|
c======================================================================= |
33 |
|
|
|
34 |
|
|
c----------------------------------------------------------------------- |
35 |
|
|
c declarations: |
36 |
|
|
c ------------- |
37 |
|
|
|
38 |
|
|
|
39 |
|
|
c arguments: |
40 |
|
|
c ---------- |
41 |
|
|
|
42 |
|
|
INTEGER ngrid,nlay,w2di,tho |
43 |
|
|
real ptimestep,l_mix,r_aspect |
44 |
|
|
REAL pt(ngrid,nlay),pdtadj(ngrid,nlay) |
45 |
|
|
REAL pu(ngrid,nlay),pduadj(ngrid,nlay) |
46 |
|
|
REAL pv(ngrid,nlay),pdvadj(ngrid,nlay) |
47 |
|
|
REAL po(ngrid,nlay),pdoadj(ngrid,nlay) |
48 |
guez |
10 |
REAL, intent(in):: pplay(ngrid,nlay) |
49 |
guez |
3 |
real, intent(in):: pplev(ngrid,nlay+1) |
50 |
|
|
real pphi(ngrid,nlay) |
51 |
|
|
|
52 |
|
|
integer idetr |
53 |
|
|
save idetr |
54 |
|
|
data idetr/3/ |
55 |
|
|
|
56 |
|
|
c local: |
57 |
|
|
c ------ |
58 |
|
|
|
59 |
|
|
INTEGER ig,k,l,lmaxa(klon),lmix(klon) |
60 |
|
|
real zsortie1d(klon) |
61 |
|
|
c CR: on remplace lmax(klon,klev+1) |
62 |
|
|
INTEGER lmax(klon),lmin(klon),lentr(klon) |
63 |
|
|
real linter(klon) |
64 |
|
|
real zmix(klon), fracazmix(klon) |
65 |
|
|
c RC |
66 |
|
|
real zmax(klon),zw,zz,zw2(klon,klev+1),ztva(klon,klev),zzz |
67 |
|
|
|
68 |
|
|
real zlev(klon,klev+1),zlay(klon,klev) |
69 |
|
|
REAL zh(klon,klev),zdhadj(klon,klev) |
70 |
|
|
REAL ztv(klon,klev) |
71 |
|
|
real zu(klon,klev),zv(klon,klev),zo(klon,klev) |
72 |
|
|
REAL wh(klon,klev+1) |
73 |
|
|
real wu(klon,klev+1),wv(klon,klev+1),wo(klon,klev+1) |
74 |
|
|
real zla(klon,klev+1) |
75 |
|
|
real zwa(klon,klev+1) |
76 |
|
|
real zld(klon,klev+1) |
77 |
|
|
real zwd(klon,klev+1) |
78 |
|
|
real zsortie(klon,klev) |
79 |
|
|
real zva(klon,klev) |
80 |
|
|
real zua(klon,klev) |
81 |
|
|
real zoa(klon,klev) |
82 |
|
|
|
83 |
|
|
real zha(klon,klev) |
84 |
|
|
real wa_moy(klon,klev+1) |
85 |
|
|
real fraca(klon,klev+1) |
86 |
|
|
real fracc(klon,klev+1) |
87 |
|
|
real zf,zf2 |
88 |
|
|
real thetath2(klon,klev),wth2(klon,klev) |
89 |
|
|
common/comtherm/thetath2,wth2 |
90 |
|
|
|
91 |
|
|
real count_time |
92 |
|
|
integer isplit,nsplit,ialt |
93 |
|
|
parameter (nsplit=10) |
94 |
|
|
data isplit/0/ |
95 |
|
|
save isplit |
96 |
|
|
|
97 |
|
|
logical sorties |
98 |
|
|
real rho(klon,klev),rhobarz(klon,klev+1),masse(klon,klev) |
99 |
|
|
real zpspsk(klon,klev) |
100 |
|
|
|
101 |
|
|
c real wmax(klon,klev),wmaxa(klon) |
102 |
|
|
real wmax(klon),wmaxa(klon) |
103 |
|
|
real wa(klon,klev,klev+1) |
104 |
|
|
real wd(klon,klev+1) |
105 |
|
|
real larg_part(klon,klev,klev+1) |
106 |
|
|
real fracd(klon,klev+1) |
107 |
|
|
real xxx(klon,klev+1) |
108 |
|
|
real larg_cons(klon,klev+1) |
109 |
|
|
real larg_detr(klon,klev+1) |
110 |
|
|
real fm0(klon,klev+1),entr0(klon,klev),detr(klon,klev) |
111 |
|
|
real pu_therm(klon,klev),pv_therm(klon,klev) |
112 |
|
|
real fm(klon,klev+1),entr(klon,klev) |
113 |
|
|
real fmc(klon,klev+1) |
114 |
|
|
|
115 |
|
|
cCR:nouvelles variables |
116 |
|
|
real f_star(klon,klev+1),entr_star(klon,klev) |
117 |
|
|
real entr_star_tot(klon),entr_star2(klon) |
118 |
|
|
real f(klon), f0(klon) |
119 |
|
|
real zlevinter(klon) |
120 |
|
|
logical first |
121 |
|
|
data first /.false./ |
122 |
|
|
save first |
123 |
|
|
cRC |
124 |
|
|
|
125 |
|
|
character*2 str2 |
126 |
|
|
character*10 str10 |
127 |
|
|
|
128 |
|
|
LOGICAL vtest(klon),down |
129 |
|
|
|
130 |
|
|
EXTERNAL SCOPY |
131 |
|
|
|
132 |
|
|
integer ncorrec,ll |
133 |
|
|
save ncorrec |
134 |
|
|
data ncorrec/0/ |
135 |
|
|
|
136 |
|
|
c |
137 |
|
|
c----------------------------------------------------------------------- |
138 |
|
|
c initialisation: |
139 |
|
|
c --------------- |
140 |
|
|
c |
141 |
|
|
sorties=.true. |
142 |
|
|
IF(ngrid.NE.klon) THEN |
143 |
|
|
PRINT* |
144 |
|
|
PRINT*,'STOP dans convadj' |
145 |
|
|
PRINT*,'ngrid =',ngrid |
146 |
|
|
PRINT*,'klon =',klon |
147 |
|
|
ENDIF |
148 |
|
|
c |
149 |
|
|
c----------------------------------------------------------------------- |
150 |
|
|
c incrementation eventuelle de tendances precedentes: |
151 |
|
|
c --------------------------------------------------- |
152 |
|
|
|
153 |
|
|
print*,'0 OK convect8' |
154 |
|
|
|
155 |
|
|
DO 1010 l=1,nlay |
156 |
|
|
DO 1015 ig=1,ngrid |
157 |
|
|
zpspsk(ig,l)=(pplay(ig,l)/pplev(ig,1))**RKAPPA |
158 |
|
|
zh(ig,l)=pt(ig,l)/zpspsk(ig,l) |
159 |
|
|
zu(ig,l)=pu(ig,l) |
160 |
|
|
zv(ig,l)=pv(ig,l) |
161 |
|
|
zo(ig,l)=po(ig,l) |
162 |
|
|
ztv(ig,l)=zh(ig,l)*(1.+0.61*zo(ig,l)) |
163 |
|
|
1015 CONTINUE |
164 |
|
|
1010 CONTINUE |
165 |
|
|
|
166 |
|
|
print*,'1 OK convect8' |
167 |
|
|
c -------------------- |
168 |
|
|
c |
169 |
|
|
c |
170 |
|
|
c + + + + + + + + + + + |
171 |
|
|
c |
172 |
|
|
c |
173 |
|
|
c wa, fraca, wd, fracd -------------------- zlev(2), rhobarz |
174 |
|
|
c wh,wt,wo ... |
175 |
|
|
c |
176 |
|
|
c + + + + + + + + + + + zh,zu,zv,zo,rho |
177 |
|
|
c |
178 |
|
|
c |
179 |
|
|
c -------------------- zlev(1) |
180 |
|
|
c \\\\\\\\\\\\\\\\\\\\ |
181 |
|
|
c |
182 |
|
|
c |
183 |
|
|
|
184 |
|
|
c----------------------------------------------------------------------- |
185 |
|
|
c Calcul des altitudes des couches |
186 |
|
|
c----------------------------------------------------------------------- |
187 |
|
|
|
188 |
|
|
do l=2,nlay |
189 |
|
|
do ig=1,ngrid |
190 |
|
|
zlev(ig,l)=0.5*(pphi(ig,l)+pphi(ig,l-1))/RG |
191 |
|
|
enddo |
192 |
|
|
enddo |
193 |
|
|
do ig=1,ngrid |
194 |
|
|
zlev(ig,1)=0. |
195 |
|
|
zlev(ig,nlay+1)=(2.*pphi(ig,klev)-pphi(ig,klev-1))/RG |
196 |
|
|
enddo |
197 |
|
|
do l=1,nlay |
198 |
|
|
do ig=1,ngrid |
199 |
|
|
zlay(ig,l)=pphi(ig,l)/RG |
200 |
|
|
enddo |
201 |
|
|
enddo |
202 |
|
|
|
203 |
|
|
c print*,'2 OK convect8' |
204 |
|
|
c----------------------------------------------------------------------- |
205 |
|
|
c Calcul des densites |
206 |
|
|
c----------------------------------------------------------------------- |
207 |
|
|
|
208 |
|
|
do l=1,nlay |
209 |
|
|
do ig=1,ngrid |
210 |
|
|
rho(ig,l)=pplay(ig,l)/(zpspsk(ig,l)*RD*zh(ig,l)) |
211 |
|
|
enddo |
212 |
|
|
enddo |
213 |
|
|
|
214 |
|
|
do l=2,nlay |
215 |
|
|
do ig=1,ngrid |
216 |
|
|
rhobarz(ig,l)=0.5*(rho(ig,l)+rho(ig,l-1)) |
217 |
|
|
enddo |
218 |
|
|
enddo |
219 |
|
|
|
220 |
|
|
do k=1,nlay |
221 |
|
|
do l=1,nlay+1 |
222 |
|
|
do ig=1,ngrid |
223 |
|
|
wa(ig,k,l)=0. |
224 |
|
|
enddo |
225 |
|
|
enddo |
226 |
|
|
enddo |
227 |
|
|
|
228 |
|
|
c print*,'3 OK convect8' |
229 |
|
|
c------------------------------------------------------------------ |
230 |
|
|
c Calcul de w2, quarre de w a partir de la cape |
231 |
|
|
c a partir de w2, on calcule wa, vitesse de l'ascendance |
232 |
|
|
c |
233 |
|
|
c ATTENTION: Dans cette version, pour cause d'economie de memoire, |
234 |
|
|
c w2 est stoke dans wa |
235 |
|
|
c |
236 |
|
|
c ATTENTION: dans convect8, on n'utilise le calcule des wa |
237 |
|
|
c independants par couches que pour calculer l'entrainement |
238 |
|
|
c a la base et la hauteur max de l'ascendance. |
239 |
|
|
c |
240 |
|
|
c Indicages: |
241 |
|
|
c l'ascendance provenant du niveau k traverse l'interface l avec |
242 |
|
|
c une vitesse wa(k,l). |
243 |
|
|
c |
244 |
|
|
c -------------------- |
245 |
|
|
c |
246 |
|
|
c + + + + + + + + + + |
247 |
|
|
c |
248 |
|
|
c wa(k,l) ---- -------------------- l |
249 |
|
|
c /\ |
250 |
|
|
c /||\ + + + + + + + + + + |
251 |
|
|
c || |
252 |
|
|
c || -------------------- |
253 |
|
|
c || |
254 |
|
|
c || + + + + + + + + + + |
255 |
|
|
c || |
256 |
|
|
c || -------------------- |
257 |
|
|
c ||__ |
258 |
|
|
c |___ + + + + + + + + + + k |
259 |
|
|
c |
260 |
|
|
c -------------------- |
261 |
|
|
c |
262 |
|
|
c |
263 |
|
|
c |
264 |
|
|
c------------------------------------------------------------------ |
265 |
|
|
|
266 |
|
|
cCR: ponderation entrainement des couches instables |
267 |
|
|
cdef des entr_star tels que entr=f*entr_star |
268 |
|
|
do l=1,klev |
269 |
|
|
do ig=1,ngrid |
270 |
|
|
entr_star(ig,l)=0. |
271 |
|
|
enddo |
272 |
|
|
enddo |
273 |
|
|
c determination de la longueur de la couche d entrainement |
274 |
|
|
do ig=1,ngrid |
275 |
|
|
lentr(ig)=1 |
276 |
|
|
enddo |
277 |
|
|
|
278 |
|
|
con ne considere que les premieres couches instables |
279 |
|
|
do k=nlay-2,1,-1 |
280 |
|
|
do ig=1,ngrid |
281 |
|
|
if (ztv(ig,k).gt.ztv(ig,k+1).and. |
282 |
|
|
s ztv(ig,k+1).le.ztv(ig,k+2)) then |
283 |
|
|
lentr(ig)=k |
284 |
|
|
endif |
285 |
|
|
enddo |
286 |
|
|
enddo |
287 |
|
|
|
288 |
|
|
c determination du lmin: couche d ou provient le thermique |
289 |
|
|
do ig=1,ngrid |
290 |
|
|
lmin(ig)=1 |
291 |
|
|
enddo |
292 |
|
|
do ig=1,ngrid |
293 |
|
|
do l=nlay,2,-1 |
294 |
|
|
if (ztv(ig,l-1).gt.ztv(ig,l)) then |
295 |
|
|
lmin(ig)=l-1 |
296 |
|
|
endif |
297 |
|
|
enddo |
298 |
|
|
enddo |
299 |
|
|
c |
300 |
|
|
c definition de l'entrainement des couches |
301 |
|
|
do l=1,klev-1 |
302 |
|
|
do ig=1,ngrid |
303 |
|
|
if (ztv(ig,l).gt.ztv(ig,l+1).and. |
304 |
|
|
s l.ge.lmin(ig).and.l.le.lentr(ig)) then |
305 |
|
|
entr_star(ig,l)=(ztv(ig,l)-ztv(ig,l+1))* |
306 |
|
|
s (zlev(ig,l+1)-zlev(ig,l)) |
307 |
|
|
endif |
308 |
|
|
enddo |
309 |
|
|
enddo |
310 |
|
|
c pas de thermique si couches 1->5 stables |
311 |
|
|
do ig=1,ngrid |
312 |
|
|
if (lmin(ig).gt.5) then |
313 |
|
|
do l=1,klev |
314 |
|
|
entr_star(ig,l)=0. |
315 |
|
|
enddo |
316 |
|
|
endif |
317 |
|
|
enddo |
318 |
|
|
c calcul de l entrainement total |
319 |
|
|
do ig=1,ngrid |
320 |
|
|
entr_star_tot(ig)=0. |
321 |
|
|
enddo |
322 |
|
|
do ig=1,ngrid |
323 |
|
|
do k=1,klev |
324 |
|
|
entr_star_tot(ig)=entr_star_tot(ig)+entr_star(ig,k) |
325 |
|
|
enddo |
326 |
|
|
enddo |
327 |
|
|
c |
328 |
|
|
print*,'fin calcul entr_star' |
329 |
|
|
do k=1,klev |
330 |
|
|
do ig=1,ngrid |
331 |
|
|
ztva(ig,k)=ztv(ig,k) |
332 |
|
|
enddo |
333 |
|
|
enddo |
334 |
|
|
cRC |
335 |
|
|
c print*,'7 OK convect8' |
336 |
|
|
do k=1,klev+1 |
337 |
|
|
do ig=1,ngrid |
338 |
|
|
zw2(ig,k)=0. |
339 |
|
|
fmc(ig,k)=0. |
340 |
|
|
cCR |
341 |
|
|
f_star(ig,k)=0. |
342 |
|
|
cRC |
343 |
|
|
larg_cons(ig,k)=0. |
344 |
|
|
larg_detr(ig,k)=0. |
345 |
|
|
wa_moy(ig,k)=0. |
346 |
|
|
enddo |
347 |
|
|
enddo |
348 |
|
|
|
349 |
|
|
c print*,'8 OK convect8' |
350 |
|
|
do ig=1,ngrid |
351 |
|
|
linter(ig)=1. |
352 |
|
|
lmaxa(ig)=1 |
353 |
|
|
lmix(ig)=1 |
354 |
|
|
wmaxa(ig)=0. |
355 |
|
|
enddo |
356 |
|
|
|
357 |
|
|
cCR: |
358 |
|
|
do l=1,nlay-2 |
359 |
|
|
do ig=1,ngrid |
360 |
|
|
if (ztv(ig,l).gt.ztv(ig,l+1) |
361 |
|
|
s .and.entr_star(ig,l).gt.1.e-10 |
362 |
|
|
s .and.zw2(ig,l).lt.1e-10) then |
363 |
|
|
f_star(ig,l+1)=entr_star(ig,l) |
364 |
|
|
ctest:calcul de dteta |
365 |
|
|
zw2(ig,l+1)=2.*RG*(ztv(ig,l)-ztv(ig,l+1))/ztv(ig,l+1) |
366 |
|
|
s *(zlev(ig,l+1)-zlev(ig,l)) |
367 |
|
|
s *0.4*pphi(ig,l)/(pphi(ig,l+1)-pphi(ig,l)) |
368 |
|
|
larg_detr(ig,l)=0. |
369 |
|
|
else if ((zw2(ig,l).ge.1e-10).and. |
370 |
|
|
s (f_star(ig,l)+entr_star(ig,l).gt.1.e-10)) then |
371 |
|
|
f_star(ig,l+1)=f_star(ig,l)+entr_star(ig,l) |
372 |
|
|
ztva(ig,l)=(f_star(ig,l)*ztva(ig,l-1)+entr_star(ig,l) |
373 |
|
|
s *ztv(ig,l))/f_star(ig,l+1) |
374 |
|
|
zw2(ig,l+1)=zw2(ig,l)*(f_star(ig,l)/f_star(ig,l+1))**2+ |
375 |
|
|
s 2.*RG*(ztva(ig,l)-ztv(ig,l))/ztv(ig,l) |
376 |
|
|
s *(zlev(ig,l+1)-zlev(ig,l)) |
377 |
|
|
endif |
378 |
|
|
c determination de zmax continu par interpolation lineaire |
379 |
|
|
if (zw2(ig,l+1).lt.0.) then |
380 |
|
|
ctest |
381 |
|
|
if (abs(zw2(ig,l+1)-zw2(ig,l)).lt.1e-10) then |
382 |
|
|
print*,'pb linter' |
383 |
|
|
endif |
384 |
|
|
linter(ig)=(l*(zw2(ig,l+1)-zw2(ig,l)) |
385 |
|
|
s -zw2(ig,l))/(zw2(ig,l+1)-zw2(ig,l)) |
386 |
|
|
zw2(ig,l+1)=0. |
387 |
|
|
lmaxa(ig)=l |
388 |
|
|
else |
389 |
|
|
if (zw2(ig,l+1).lt.0.) then |
390 |
|
|
print*,'pb1 zw2<0' |
391 |
|
|
endif |
392 |
|
|
wa_moy(ig,l+1)=sqrt(zw2(ig,l+1)) |
393 |
|
|
endif |
394 |
|
|
if (wa_moy(ig,l+1).gt.wmaxa(ig)) then |
395 |
|
|
c lmix est le niveau de la couche ou w (wa_moy) est maximum |
396 |
|
|
lmix(ig)=l+1 |
397 |
|
|
wmaxa(ig)=wa_moy(ig,l+1) |
398 |
|
|
endif |
399 |
|
|
enddo |
400 |
|
|
enddo |
401 |
|
|
print*,'fin calcul zw2' |
402 |
|
|
c |
403 |
|
|
c Calcul de la couche correspondant a la hauteur du thermique |
404 |
|
|
do ig=1,ngrid |
405 |
|
|
lmax(ig)=lentr(ig) |
406 |
|
|
enddo |
407 |
|
|
do ig=1,ngrid |
408 |
|
|
do l=nlay,lentr(ig)+1,-1 |
409 |
|
|
if (zw2(ig,l).le.1.e-10) then |
410 |
|
|
lmax(ig)=l-1 |
411 |
|
|
endif |
412 |
|
|
enddo |
413 |
|
|
enddo |
414 |
|
|
c pas de thermique si couches 1->5 stables |
415 |
|
|
do ig=1,ngrid |
416 |
|
|
if (lmin(ig).gt.5) then |
417 |
|
|
lmax(ig)=1 |
418 |
|
|
lmin(ig)=1 |
419 |
|
|
endif |
420 |
|
|
enddo |
421 |
|
|
c |
422 |
|
|
c Determination de zw2 max |
423 |
|
|
do ig=1,ngrid |
424 |
|
|
wmax(ig)=0. |
425 |
|
|
enddo |
426 |
|
|
|
427 |
|
|
do l=1,nlay |
428 |
|
|
do ig=1,ngrid |
429 |
|
|
if (l.le.lmax(ig)) then |
430 |
|
|
if (zw2(ig,l).lt.0.)then |
431 |
|
|
print*,'pb2 zw2<0' |
432 |
|
|
endif |
433 |
|
|
zw2(ig,l)=sqrt(zw2(ig,l)) |
434 |
|
|
wmax(ig)=max(wmax(ig),zw2(ig,l)) |
435 |
|
|
else |
436 |
|
|
zw2(ig,l)=0. |
437 |
|
|
endif |
438 |
|
|
enddo |
439 |
|
|
enddo |
440 |
|
|
|
441 |
|
|
c Longueur caracteristique correspondant a la hauteur des thermiques. |
442 |
|
|
do ig=1,ngrid |
443 |
|
|
zmax(ig)=0. |
444 |
|
|
zlevinter(ig)=zlev(ig,1) |
445 |
|
|
enddo |
446 |
|
|
do ig=1,ngrid |
447 |
|
|
c calcul de zlevinter |
448 |
|
|
zlevinter(ig)=(zlev(ig,lmax(ig)+1)-zlev(ig,lmax(ig)))* |
449 |
|
|
s linter(ig)+zlev(ig,lmax(ig))-lmax(ig)*(zlev(ig,lmax(ig)+1) |
450 |
|
|
s -zlev(ig,lmax(ig))) |
451 |
|
|
zmax(ig)=max(zmax(ig),zlevinter(ig)-zlev(ig,lmin(ig))) |
452 |
|
|
enddo |
453 |
|
|
|
454 |
|
|
print*,'avant fermeture' |
455 |
|
|
c Fermeture,determination de f |
456 |
|
|
do ig=1,ngrid |
457 |
|
|
entr_star2(ig)=0. |
458 |
|
|
enddo |
459 |
|
|
do ig=1,ngrid |
460 |
|
|
if (entr_star_tot(ig).LT.1.e-10) then |
461 |
|
|
f(ig)=0. |
462 |
|
|
else |
463 |
|
|
do k=lmin(ig),lentr(ig) |
464 |
|
|
entr_star2(ig)=entr_star2(ig)+entr_star(ig,k)**2 |
465 |
|
|
s /(rho(ig,k)*(zlev(ig,k+1)-zlev(ig,k))) |
466 |
|
|
enddo |
467 |
|
|
c Nouvelle fermeture |
468 |
|
|
f(ig)=wmax(ig)/(max(500.,zmax(ig))*r_aspect |
469 |
|
|
s *entr_star2(ig))*entr_star_tot(ig) |
470 |
|
|
ctest |
471 |
|
|
c if (first) then |
472 |
|
|
c f(ig)=f(ig)+(f0(ig)-f(ig))*exp(-ptimestep/zmax(ig) |
473 |
|
|
c s *wmax(ig)) |
474 |
|
|
c endif |
475 |
|
|
endif |
476 |
|
|
c f0(ig)=f(ig) |
477 |
|
|
c first=.true. |
478 |
|
|
enddo |
479 |
|
|
print*,'apres fermeture' |
480 |
|
|
|
481 |
|
|
c Calcul de l'entrainement |
482 |
|
|
do k=1,klev |
483 |
|
|
do ig=1,ngrid |
484 |
|
|
entr(ig,k)=f(ig)*entr_star(ig,k) |
485 |
|
|
enddo |
486 |
|
|
enddo |
487 |
|
|
c Calcul des flux |
488 |
|
|
do ig=1,ngrid |
489 |
|
|
do l=1,lmax(ig)-1 |
490 |
|
|
fmc(ig,l+1)=fmc(ig,l)+entr(ig,l) |
491 |
|
|
enddo |
492 |
|
|
enddo |
493 |
|
|
|
494 |
|
|
cRC |
495 |
|
|
|
496 |
|
|
|
497 |
|
|
c print*,'9 OK convect8' |
498 |
|
|
c print*,'WA1 ',wa_moy |
499 |
|
|
|
500 |
|
|
c determination de l'indice du debut de la mixed layer ou w decroit |
501 |
|
|
|
502 |
|
|
c calcul de la largeur de chaque ascendance dans le cas conservatif. |
503 |
|
|
c dans ce cas simple, on suppose que la largeur de l'ascendance provenant |
504 |
|
|
c d'une couche est égale à la hauteur de la couche alimentante. |
505 |
|
|
c La vitesse maximale dans l'ascendance est aussi prise comme estimation |
506 |
|
|
c de la vitesse d'entrainement horizontal dans la couche alimentante. |
507 |
|
|
|
508 |
|
|
do l=2,nlay |
509 |
|
|
do ig=1,ngrid |
510 |
|
|
if (l.le.lmaxa(ig)) then |
511 |
|
|
zw=max(wa_moy(ig,l),1.e-10) |
512 |
|
|
larg_cons(ig,l)=zmax(ig)*r_aspect |
513 |
|
|
s *fmc(ig,l)/(rhobarz(ig,l)*zw) |
514 |
|
|
endif |
515 |
|
|
enddo |
516 |
|
|
enddo |
517 |
|
|
|
518 |
|
|
do l=2,nlay |
519 |
|
|
do ig=1,ngrid |
520 |
|
|
if (l.le.lmaxa(ig)) then |
521 |
|
|
c if (idetr.eq.0) then |
522 |
|
|
c cette option est finalement en dur. |
523 |
|
|
if ((l_mix*zlev(ig,l)).lt.0.)then |
524 |
|
|
print*,'pb l_mix*zlev<0' |
525 |
|
|
endif |
526 |
|
|
larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l)) |
527 |
|
|
c else if (idetr.eq.1) then |
528 |
|
|
c larg_detr(ig,l)=larg_cons(ig,l) |
529 |
|
|
c s *sqrt(l_mix*zlev(ig,l))/larg_cons(ig,lmix(ig)) |
530 |
|
|
c else if (idetr.eq.2) then |
531 |
|
|
c larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l)) |
532 |
|
|
c s *sqrt(wa_moy(ig,l)) |
533 |
|
|
c else if (idetr.eq.4) then |
534 |
|
|
c larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l)) |
535 |
|
|
c s *wa_moy(ig,l) |
536 |
|
|
c endif |
537 |
|
|
endif |
538 |
|
|
enddo |
539 |
|
|
enddo |
540 |
|
|
|
541 |
|
|
c print*,'10 OK convect8' |
542 |
|
|
c print*,'WA2 ',wa_moy |
543 |
|
|
c calcul de la fraction de la maille concernée par l'ascendance en tenant |
544 |
|
|
c compte de l'epluchage du thermique. |
545 |
|
|
c |
546 |
|
|
cCR def de zmix continu (profil parabolique des vitesses) |
547 |
|
|
do ig=1,ngrid |
548 |
|
|
if (lmix(ig).gt.1.) then |
549 |
|
|
c test |
550 |
|
|
if (((zw2(ig,lmix(ig)-1)-zw2(ig,lmix(ig))) |
551 |
|
|
s *((zlev(ig,lmix(ig)))-(zlev(ig,lmix(ig)+1))) |
552 |
|
|
s -(zw2(ig,lmix(ig))-zw2(ig,lmix(ig)+1)) |
553 |
|
|
s *((zlev(ig,lmix(ig)-1))-(zlev(ig,lmix(ig))))).gt.1e-10) |
554 |
|
|
s then |
555 |
|
|
c |
556 |
|
|
zmix(ig)=((zw2(ig,lmix(ig)-1)-zw2(ig,lmix(ig))) |
557 |
|
|
s *((zlev(ig,lmix(ig)))**2-(zlev(ig,lmix(ig)+1))**2) |
558 |
|
|
s -(zw2(ig,lmix(ig))-zw2(ig,lmix(ig)+1)) |
559 |
|
|
s *((zlev(ig,lmix(ig)-1))**2-(zlev(ig,lmix(ig)))**2)) |
560 |
|
|
s /(2.*((zw2(ig,lmix(ig)-1)-zw2(ig,lmix(ig))) |
561 |
|
|
s *((zlev(ig,lmix(ig)))-(zlev(ig,lmix(ig)+1))) |
562 |
|
|
s -(zw2(ig,lmix(ig))-zw2(ig,lmix(ig)+1)) |
563 |
|
|
s *((zlev(ig,lmix(ig)-1))-(zlev(ig,lmix(ig)))))) |
564 |
|
|
else |
565 |
|
|
zmix(ig)=zlev(ig,lmix(ig)) |
566 |
|
|
print*,'pb zmix' |
567 |
|
|
endif |
568 |
|
|
else |
569 |
|
|
zmix(ig)=0. |
570 |
|
|
endif |
571 |
|
|
ctest |
572 |
|
|
if ((zmax(ig)-zmix(ig)).lt.0.) then |
573 |
|
|
zmix(ig)=0.99*zmax(ig) |
574 |
|
|
c print*,'pb zmix>zmax' |
575 |
|
|
endif |
576 |
|
|
enddo |
577 |
|
|
c |
578 |
|
|
c calcul du nouveau lmix correspondant |
579 |
|
|
do ig=1,ngrid |
580 |
|
|
do l=1,klev |
581 |
|
|
if (zmix(ig).ge.zlev(ig,l).and. |
582 |
|
|
s zmix(ig).lt.zlev(ig,l+1)) then |
583 |
|
|
lmix(ig)=l |
584 |
|
|
endif |
585 |
|
|
enddo |
586 |
|
|
enddo |
587 |
|
|
c |
588 |
|
|
do l=2,nlay |
589 |
|
|
do ig=1,ngrid |
590 |
|
|
if(larg_cons(ig,l).gt.1.) then |
591 |
|
|
c print*,ig,l,lmix(ig),lmaxa(ig),larg_cons(ig,l),' KKK' |
592 |
|
|
fraca(ig,l)=(larg_cons(ig,l)-larg_detr(ig,l)) |
593 |
|
|
s /(r_aspect*zmax(ig)) |
594 |
|
|
c test |
595 |
|
|
fraca(ig,l)=max(fraca(ig,l),0.) |
596 |
|
|
fraca(ig,l)=min(fraca(ig,l),0.5) |
597 |
|
|
fracd(ig,l)=1.-fraca(ig,l) |
598 |
|
|
fracc(ig,l)=larg_cons(ig,l)/(r_aspect*zmax(ig)) |
599 |
|
|
else |
600 |
|
|
c wa_moy(ig,l)=0. |
601 |
|
|
fraca(ig,l)=0. |
602 |
|
|
fracc(ig,l)=0. |
603 |
|
|
fracd(ig,l)=1. |
604 |
|
|
endif |
605 |
|
|
enddo |
606 |
|
|
enddo |
607 |
|
|
cCR: calcul de fracazmix |
608 |
|
|
do ig=1,ngrid |
609 |
|
|
fracazmix(ig)=(fraca(ig,lmix(ig)+1)-fraca(ig,lmix(ig)))/ |
610 |
|
|
s (zlev(ig,lmix(ig)+1)-zlev(ig,lmix(ig)))*zmix(ig) |
611 |
|
|
s +fraca(ig,lmix(ig))-zlev(ig,lmix(ig))*(fraca(ig,lmix(ig)+1) |
612 |
|
|
s -fraca(ig,lmix(ig)))/(zlev(ig,lmix(ig)+1)-zlev(ig,lmix(ig))) |
613 |
|
|
enddo |
614 |
|
|
c |
615 |
|
|
do l=2,nlay |
616 |
|
|
do ig=1,ngrid |
617 |
|
|
if(larg_cons(ig,l).gt.1.) then |
618 |
|
|
if (l.gt.lmix(ig)) then |
619 |
|
|
ctest |
620 |
|
|
if (zmax(ig)-zmix(ig).lt.1.e-10) then |
621 |
|
|
c print*,'pb xxx' |
622 |
|
|
xxx(ig,l)=(lmaxa(ig)+1.-l)/(lmaxa(ig)+1.-lmix(ig)) |
623 |
|
|
else |
624 |
|
|
xxx(ig,l)=(zmax(ig)-zlev(ig,l))/(zmax(ig)-zmix(ig)) |
625 |
|
|
endif |
626 |
|
|
if (idetr.eq.0) then |
627 |
|
|
fraca(ig,l)=fracazmix(ig) |
628 |
|
|
else if (idetr.eq.1) then |
629 |
|
|
fraca(ig,l)=fracazmix(ig)*xxx(ig,l) |
630 |
|
|
else if (idetr.eq.2) then |
631 |
|
|
fraca(ig,l)=fracazmix(ig)*(1.-(1.-xxx(ig,l))**2) |
632 |
|
|
else |
633 |
|
|
fraca(ig,l)=fracazmix(ig)*xxx(ig,l)**2 |
634 |
|
|
endif |
635 |
|
|
c print*,ig,l,lmix(ig),lmaxa(ig),xxx(ig,l),'LLLLLLL' |
636 |
|
|
fraca(ig,l)=max(fraca(ig,l),0.) |
637 |
|
|
fraca(ig,l)=min(fraca(ig,l),0.5) |
638 |
|
|
fracd(ig,l)=1.-fraca(ig,l) |
639 |
|
|
fracc(ig,l)=larg_cons(ig,l)/(r_aspect*zmax(ig)) |
640 |
|
|
endif |
641 |
|
|
endif |
642 |
|
|
enddo |
643 |
|
|
enddo |
644 |
|
|
|
645 |
|
|
print*,'fin calcul fraca' |
646 |
|
|
c print*,'11 OK convect8' |
647 |
|
|
c print*,'Ea3 ',wa_moy |
648 |
|
|
c------------------------------------------------------------------ |
649 |
|
|
c Calcul de fracd, wd |
650 |
|
|
c somme wa - wd = 0 |
651 |
|
|
c------------------------------------------------------------------ |
652 |
|
|
|
653 |
|
|
|
654 |
|
|
do ig=1,ngrid |
655 |
|
|
fm(ig,1)=0. |
656 |
|
|
fm(ig,nlay+1)=0. |
657 |
|
|
enddo |
658 |
|
|
|
659 |
|
|
do l=2,nlay |
660 |
|
|
do ig=1,ngrid |
661 |
|
|
fm(ig,l)=fraca(ig,l)*wa_moy(ig,l)*rhobarz(ig,l) |
662 |
|
|
cCR:test |
663 |
|
|
if (entr(ig,l-1).lt.1e-10.and.fm(ig,l).gt.fm(ig,l-1) |
664 |
|
|
s .and.l.gt.lmix(ig)) then |
665 |
|
|
fm(ig,l)=fm(ig,l-1) |
666 |
|
|
c write(1,*)'ajustement fm, l',l |
667 |
|
|
endif |
668 |
|
|
c write(1,*)'ig,l,fm(ig,l)',ig,l,fm(ig,l) |
669 |
|
|
cRC |
670 |
|
|
enddo |
671 |
|
|
do ig=1,ngrid |
672 |
|
|
if(fracd(ig,l).lt.0.1) then |
673 |
|
|
stop'fracd trop petit' |
674 |
|
|
else |
675 |
|
|
c vitesse descendante "diagnostique" |
676 |
|
|
wd(ig,l)=fm(ig,l)/(fracd(ig,l)*rhobarz(ig,l)) |
677 |
|
|
endif |
678 |
|
|
enddo |
679 |
|
|
enddo |
680 |
|
|
|
681 |
|
|
do l=1,nlay |
682 |
|
|
do ig=1,ngrid |
683 |
|
|
c masse(ig,l)=rho(ig,l)*(zlev(ig,l+1)-zlev(ig,l)) |
684 |
|
|
masse(ig,l)=(pplev(ig,l)-pplev(ig,l+1))/RG |
685 |
|
|
enddo |
686 |
|
|
enddo |
687 |
|
|
|
688 |
|
|
print*,'12 OK convect8' |
689 |
|
|
c print*,'WA4 ',wa_moy |
690 |
|
|
cc------------------------------------------------------------------ |
691 |
|
|
c calcul du transport vertical |
692 |
|
|
c------------------------------------------------------------------ |
693 |
|
|
|
694 |
|
|
go to 4444 |
695 |
|
|
c print*,'XXXXXXXXXXXXXXX ptimestep= ',ptimestep |
696 |
|
|
do l=2,nlay-1 |
697 |
|
|
do ig=1,ngrid |
698 |
|
|
if(fm(ig,l+1)*ptimestep.gt.masse(ig,l) |
699 |
|
|
s .and.fm(ig,l+1)*ptimestep.gt.masse(ig,l+1)) then |
700 |
|
|
c print*,'WARN!!! FM>M ig=',ig,' l=',l,' FM=' |
701 |
|
|
c s ,fm(ig,l+1)*ptimestep |
702 |
|
|
c s ,' M=',masse(ig,l),masse(ig,l+1) |
703 |
|
|
endif |
704 |
|
|
enddo |
705 |
|
|
enddo |
706 |
|
|
|
707 |
|
|
do l=1,nlay |
708 |
|
|
do ig=1,ngrid |
709 |
|
|
if(entr(ig,l)*ptimestep.gt.masse(ig,l)) then |
710 |
|
|
c print*,'WARN!!! E>M ig=',ig,' l=',l,' E==' |
711 |
|
|
c s ,entr(ig,l)*ptimestep |
712 |
|
|
c s ,' M=',masse(ig,l) |
713 |
|
|
endif |
714 |
|
|
enddo |
715 |
|
|
enddo |
716 |
|
|
|
717 |
|
|
do l=1,nlay |
718 |
|
|
do ig=1,ngrid |
719 |
|
|
if(.not.fm(ig,l).ge.0..or..not.fm(ig,l).le.10.) then |
720 |
|
|
c print*,'WARN!!! fm exagere ig=',ig,' l=',l |
721 |
|
|
c s ,' FM=',fm(ig,l) |
722 |
|
|
endif |
723 |
|
|
if(.not.masse(ig,l).ge.1.e-10 |
724 |
|
|
s .or..not.masse(ig,l).le.1.e4) then |
725 |
|
|
endif |
726 |
|
|
if(.not.entr(ig,l).ge.0..or..not.entr(ig,l).le.10.) then |
727 |
|
|
c print*,'WARN!!! entr exagere ig=',ig,' l=',l |
728 |
|
|
c s ,' E=',entr(ig,l) |
729 |
|
|
endif |
730 |
|
|
enddo |
731 |
|
|
enddo |
732 |
|
|
|
733 |
|
|
4444 continue |
734 |
|
|
|
735 |
|
|
cCR:redefinition du entr |
736 |
|
|
do l=1,nlay |
737 |
|
|
do ig=1,ngrid |
738 |
|
|
detr(ig,l)=fm(ig,l)+entr(ig,l)-fm(ig,l+1) |
739 |
|
|
if (detr(ig,l).lt.0.) then |
740 |
|
|
entr(ig,l)=entr(ig,l)-detr(ig,l) |
741 |
|
|
detr(ig,l)=0. |
742 |
|
|
c print*,'WARNING !!! detrainement negatif ',ig,l |
743 |
|
|
endif |
744 |
|
|
enddo |
745 |
|
|
enddo |
746 |
|
|
cRC |
747 |
|
|
if (w2di.eq.1) then |
748 |
|
|
fm0=fm0+ptimestep*(fm-fm0)/float(tho) |
749 |
|
|
entr0=entr0+ptimestep*(entr-entr0)/float(tho) |
750 |
|
|
else |
751 |
|
|
fm0=fm |
752 |
|
|
entr0=entr |
753 |
|
|
endif |
754 |
|
|
|
755 |
|
|
if (1.eq.1) then |
756 |
|
|
call dqthermcell(ngrid,nlay,ptimestep,fm0,entr0,masse |
757 |
|
|
. ,zh,zdhadj,zha) |
758 |
|
|
call dqthermcell(ngrid,nlay,ptimestep,fm0,entr0,masse |
759 |
|
|
. ,zo,pdoadj,zoa) |
760 |
|
|
else |
761 |
|
|
call dqthermcell2(ngrid,nlay,ptimestep,fm0,entr0,masse,fraca |
762 |
|
|
. ,zh,zdhadj,zha) |
763 |
|
|
call dqthermcell2(ngrid,nlay,ptimestep,fm0,entr0,masse,fraca |
764 |
|
|
. ,zo,pdoadj,zoa) |
765 |
|
|
endif |
766 |
|
|
|
767 |
|
|
if (1.eq.0) then |
768 |
|
|
call dvthermcell2(ngrid,nlay,ptimestep,fm0,entr0,masse |
769 |
|
|
. ,fraca,zmax |
770 |
|
|
. ,zu,zv,pduadj,pdvadj,zua,zva) |
771 |
|
|
else |
772 |
|
|
call dqthermcell(ngrid,nlay,ptimestep,fm0,entr0,masse |
773 |
|
|
. ,zu,pduadj,zua) |
774 |
|
|
call dqthermcell(ngrid,nlay,ptimestep,fm0,entr0,masse |
775 |
|
|
. ,zv,pdvadj,zva) |
776 |
|
|
endif |
777 |
|
|
|
778 |
|
|
do l=1,nlay |
779 |
|
|
do ig=1,ngrid |
780 |
|
|
zf=0.5*(fracc(ig,l)+fracc(ig,l+1)) |
781 |
|
|
zf2=zf/(1.-zf) |
782 |
|
|
thetath2(ig,l)=zf2*(zha(ig,l)-zh(ig,l))**2 |
783 |
|
|
wth2(ig,l)=zf2*(0.5*(wa_moy(ig,l)+wa_moy(ig,l+1)))**2 |
784 |
|
|
enddo |
785 |
|
|
enddo |
786 |
|
|
|
787 |
|
|
|
788 |
|
|
|
789 |
|
|
c print*,'13 OK convect8' |
790 |
|
|
c print*,'WA5 ',wa_moy |
791 |
|
|
do l=1,nlay |
792 |
|
|
do ig=1,ngrid |
793 |
|
|
pdtadj(ig,l)=zdhadj(ig,l)*zpspsk(ig,l) |
794 |
|
|
enddo |
795 |
|
|
enddo |
796 |
|
|
|
797 |
|
|
|
798 |
|
|
c do l=1,nlay |
799 |
|
|
c do ig=1,ngrid |
800 |
|
|
c if(abs(pdtadj(ig,l))*86400..gt.500.) then |
801 |
|
|
c print*,'WARN!!! ig=',ig,' l=',l |
802 |
|
|
c s ,' pdtadj=',pdtadj(ig,l) |
803 |
|
|
c endif |
804 |
|
|
c if(abs(pdoadj(ig,l))*86400..gt.1.) then |
805 |
|
|
c print*,'WARN!!! ig=',ig,' l=',l |
806 |
|
|
c s ,' pdoadj=',pdoadj(ig,l) |
807 |
|
|
c endif |
808 |
|
|
c enddo |
809 |
|
|
c enddo |
810 |
|
|
|
811 |
|
|
print*,'14 OK convect8' |
812 |
|
|
c------------------------------------------------------------------ |
813 |
|
|
c Calculs pour les sorties |
814 |
|
|
c------------------------------------------------------------------ |
815 |
|
|
|
816 |
|
|
if(sorties) then |
817 |
|
|
do l=1,nlay |
818 |
|
|
do ig=1,ngrid |
819 |
|
|
zla(ig,l)=(1.-fracd(ig,l))*zmax(ig) |
820 |
|
|
zld(ig,l)=fracd(ig,l)*zmax(ig) |
821 |
|
|
if(1.-fracd(ig,l).gt.1.e-10) |
822 |
|
|
s zwa(ig,l)=wd(ig,l)*fracd(ig,l)/(1.-fracd(ig,l)) |
823 |
|
|
enddo |
824 |
|
|
enddo |
825 |
|
|
|
826 |
|
|
cdeja fait |
827 |
|
|
c do l=1,nlay |
828 |
|
|
c do ig=1,ngrid |
829 |
|
|
c detr(ig,l)=fm(ig,l)+entr(ig,l)-fm(ig,l+1) |
830 |
|
|
c if (detr(ig,l).lt.0.) then |
831 |
|
|
c entr(ig,l)=entr(ig,l)-detr(ig,l) |
832 |
|
|
c detr(ig,l)=0. |
833 |
|
|
c print*,'WARNING !!! detrainement negatif ',ig,l |
834 |
|
|
c endif |
835 |
|
|
c enddo |
836 |
|
|
c enddo |
837 |
|
|
|
838 |
|
|
c print*,'15 OK convect8' |
839 |
|
|
|
840 |
|
|
isplit=isplit+1 |
841 |
|
|
|
842 |
|
|
|
843 |
|
|
goto 123 |
844 |
|
|
123 continue |
845 |
|
|
|
846 |
|
|
endif |
847 |
|
|
|
848 |
|
|
c if(wa_moy(1,4).gt.1.e-10) stop |
849 |
|
|
|
850 |
|
|
print*,'19 OK convect8' |
851 |
|
|
return |
852 |
|
|
end |
853 |
|
|
|
854 |
|
|
subroutine dqthermcell(ngrid,nlay,ptimestep,fm,entr,masse |
855 |
|
|
. ,q,dq,qa) |
856 |
|
|
use dimens_m |
857 |
|
|
use dimphy |
858 |
|
|
implicit none |
859 |
|
|
|
860 |
|
|
c======================================================================= |
861 |
|
|
c |
862 |
|
|
c Calcul du transport verticale dans la couche limite en presence |
863 |
|
|
c de "thermiques" explicitement representes |
864 |
|
|
c calcul du dq/dt une fois qu'on connait les ascendances |
865 |
|
|
c |
866 |
|
|
c======================================================================= |
867 |
|
|
|
868 |
|
|
|
869 |
|
|
integer ngrid,nlay |
870 |
|
|
|
871 |
|
|
real ptimestep |
872 |
|
|
real, intent(in):: masse(ngrid,nlay) |
873 |
|
|
real fm(ngrid,nlay+1) |
874 |
|
|
real entr(ngrid,nlay) |
875 |
|
|
real q(ngrid,nlay) |
876 |
|
|
real dq(ngrid,nlay) |
877 |
|
|
|
878 |
|
|
real qa(klon,klev),detr(klon,klev),wqd(klon,klev+1) |
879 |
|
|
|
880 |
|
|
integer ig,k |
881 |
|
|
|
882 |
|
|
c calcul du detrainement |
883 |
|
|
|
884 |
|
|
do k=1,nlay |
885 |
|
|
do ig=1,ngrid |
886 |
|
|
detr(ig,k)=fm(ig,k)-fm(ig,k+1)+entr(ig,k) |
887 |
|
|
enddo |
888 |
|
|
enddo |
889 |
|
|
|
890 |
|
|
c calcul de la valeur dans les ascendances |
891 |
|
|
do ig=1,ngrid |
892 |
|
|
qa(ig,1)=q(ig,1) |
893 |
|
|
enddo |
894 |
|
|
|
895 |
|
|
do k=2,nlay |
896 |
|
|
do ig=1,ngrid |
897 |
|
|
if ((fm(ig,k+1)+detr(ig,k))*ptimestep.gt. |
898 |
|
|
s 1.e-5*masse(ig,k)) then |
899 |
|
|
qa(ig,k)=(fm(ig,k)*qa(ig,k-1)+entr(ig,k)*q(ig,k)) |
900 |
|
|
s /(fm(ig,k+1)+detr(ig,k)) |
901 |
|
|
else |
902 |
|
|
qa(ig,k)=q(ig,k) |
903 |
|
|
endif |
904 |
|
|
enddo |
905 |
|
|
enddo |
906 |
|
|
|
907 |
|
|
do k=2,nlay |
908 |
|
|
do ig=1,ngrid |
909 |
|
|
c wqd(ig,k)=fm(ig,k)*0.5*(q(ig,k-1)+q(ig,k)) |
910 |
|
|
wqd(ig,k)=fm(ig,k)*q(ig,k) |
911 |
|
|
enddo |
912 |
|
|
enddo |
913 |
|
|
do ig=1,ngrid |
914 |
|
|
wqd(ig,1)=0. |
915 |
|
|
wqd(ig,nlay+1)=0. |
916 |
|
|
enddo |
917 |
|
|
|
918 |
|
|
do k=1,nlay |
919 |
|
|
do ig=1,ngrid |
920 |
|
|
dq(ig,k)=(detr(ig,k)*qa(ig,k)-entr(ig,k)*q(ig,k) |
921 |
|
|
s -wqd(ig,k)+wqd(ig,k+1)) |
922 |
|
|
s /masse(ig,k) |
923 |
|
|
enddo |
924 |
|
|
enddo |
925 |
|
|
|
926 |
|
|
return |
927 |
|
|
end |
928 |
|
|
|
929 |
|
|
subroutine dqthermcell2(ngrid,nlay,ptimestep,fm,entr,masse,frac |
930 |
|
|
. ,q,dq,qa) |
931 |
|
|
use dimens_m |
932 |
|
|
use dimphy |
933 |
|
|
implicit none |
934 |
|
|
|
935 |
|
|
c======================================================================= |
936 |
|
|
c |
937 |
|
|
c Calcul du transport verticale dans la couche limite en presence |
938 |
|
|
c de "thermiques" explicitement representes |
939 |
|
|
c calcul du dq/dt une fois qu'on connait les ascendances |
940 |
|
|
c |
941 |
|
|
c======================================================================= |
942 |
|
|
|
943 |
|
|
|
944 |
|
|
integer ngrid,nlay |
945 |
|
|
|
946 |
|
|
real ptimestep |
947 |
|
|
real masse(ngrid,nlay),fm(ngrid,nlay+1) |
948 |
|
|
real entr(ngrid,nlay),frac(ngrid,nlay) |
949 |
|
|
real q(ngrid,nlay) |
950 |
|
|
real dq(ngrid,nlay) |
951 |
|
|
|
952 |
|
|
real qa(klon,klev),detr(klon,klev),wqd(klon,klev+1) |
953 |
|
|
real qe(klon,klev),zf,zf2 |
954 |
|
|
|
955 |
|
|
integer ig,k |
956 |
|
|
|
957 |
|
|
c calcul du detrainement |
958 |
|
|
|
959 |
|
|
do k=1,nlay |
960 |
|
|
do ig=1,ngrid |
961 |
|
|
detr(ig,k)=fm(ig,k)-fm(ig,k+1)+entr(ig,k) |
962 |
|
|
enddo |
963 |
|
|
enddo |
964 |
|
|
|
965 |
|
|
c calcul de la valeur dans les ascendances |
966 |
|
|
do ig=1,ngrid |
967 |
|
|
qa(ig,1)=q(ig,1) |
968 |
|
|
qe(ig,1)=q(ig,1) |
969 |
|
|
enddo |
970 |
|
|
|
971 |
|
|
do k=2,nlay |
972 |
|
|
do ig=1,ngrid |
973 |
|
|
if ((fm(ig,k+1)+detr(ig,k))*ptimestep.gt. |
974 |
|
|
s 1.e-5*masse(ig,k)) then |
975 |
|
|
zf=0.5*(frac(ig,k)+frac(ig,k+1)) |
976 |
|
|
zf2=1./(1.-zf) |
977 |
|
|
qa(ig,k)=(fm(ig,k)*qa(ig,k-1)+zf2*entr(ig,k)*q(ig,k)) |
978 |
|
|
s /(fm(ig,k+1)+detr(ig,k)+entr(ig,k)*zf*zf2) |
979 |
|
|
qe(ig,k)=(q(ig,k)-zf*qa(ig,k))*zf2 |
980 |
|
|
else |
981 |
|
|
qa(ig,k)=q(ig,k) |
982 |
|
|
qe(ig,k)=q(ig,k) |
983 |
|
|
endif |
984 |
|
|
enddo |
985 |
|
|
enddo |
986 |
|
|
|
987 |
|
|
do k=2,nlay |
988 |
|
|
do ig=1,ngrid |
989 |
|
|
c wqd(ig,k)=fm(ig,k)*0.5*(q(ig,k-1)+q(ig,k)) |
990 |
|
|
wqd(ig,k)=fm(ig,k)*qe(ig,k) |
991 |
|
|
enddo |
992 |
|
|
enddo |
993 |
|
|
do ig=1,ngrid |
994 |
|
|
wqd(ig,1)=0. |
995 |
|
|
wqd(ig,nlay+1)=0. |
996 |
|
|
enddo |
997 |
|
|
|
998 |
|
|
do k=1,nlay |
999 |
|
|
do ig=1,ngrid |
1000 |
|
|
dq(ig,k)=(detr(ig,k)*qa(ig,k)-entr(ig,k)*qe(ig,k) |
1001 |
|
|
s -wqd(ig,k)+wqd(ig,k+1)) |
1002 |
|
|
s /masse(ig,k) |
1003 |
|
|
enddo |
1004 |
|
|
enddo |
1005 |
|
|
|
1006 |
|
|
return |
1007 |
|
|
end |
1008 |
|
|
subroutine dvthermcell2(ngrid,nlay,ptimestep,fm,entr,masse |
1009 |
|
|
. ,fraca,larga |
1010 |
|
|
. ,u,v,du,dv,ua,va) |
1011 |
|
|
use dimens_m |
1012 |
|
|
use dimphy |
1013 |
|
|
implicit none |
1014 |
|
|
|
1015 |
|
|
c======================================================================= |
1016 |
|
|
c |
1017 |
|
|
c Calcul du transport verticale dans la couche limite en presence |
1018 |
|
|
c de "thermiques" explicitement representes |
1019 |
|
|
c calcul du dq/dt une fois qu'on connait les ascendances |
1020 |
|
|
c |
1021 |
|
|
c======================================================================= |
1022 |
|
|
|
1023 |
|
|
|
1024 |
|
|
integer ngrid,nlay |
1025 |
|
|
|
1026 |
|
|
real ptimestep |
1027 |
|
|
real masse(ngrid,nlay),fm(ngrid,nlay+1) |
1028 |
|
|
real fraca(ngrid,nlay+1) |
1029 |
|
|
real larga(ngrid) |
1030 |
|
|
real entr(ngrid,nlay) |
1031 |
|
|
real u(ngrid,nlay) |
1032 |
|
|
real ua(ngrid,nlay) |
1033 |
|
|
real du(ngrid,nlay) |
1034 |
|
|
real v(ngrid,nlay) |
1035 |
|
|
real va(ngrid,nlay) |
1036 |
|
|
real dv(ngrid,nlay) |
1037 |
|
|
|
1038 |
|
|
real qa(klon,klev),detr(klon,klev),zf,zf2 |
1039 |
|
|
real wvd(klon,klev+1),wud(klon,klev+1) |
1040 |
|
|
real gamma0,gamma(klon,klev+1) |
1041 |
|
|
real ue(klon,klev),ve(klon,klev) |
1042 |
|
|
real dua,dva |
1043 |
|
|
integer iter |
1044 |
|
|
|
1045 |
|
|
integer ig,k |
1046 |
|
|
|
1047 |
|
|
c calcul du detrainement |
1048 |
|
|
|
1049 |
|
|
do k=1,nlay |
1050 |
|
|
do ig=1,ngrid |
1051 |
|
|
detr(ig,k)=fm(ig,k)-fm(ig,k+1)+entr(ig,k) |
1052 |
|
|
enddo |
1053 |
|
|
enddo |
1054 |
|
|
|
1055 |
|
|
c calcul de la valeur dans les ascendances |
1056 |
|
|
do ig=1,ngrid |
1057 |
|
|
ua(ig,1)=u(ig,1) |
1058 |
|
|
va(ig,1)=v(ig,1) |
1059 |
|
|
ue(ig,1)=u(ig,1) |
1060 |
|
|
ve(ig,1)=v(ig,1) |
1061 |
|
|
enddo |
1062 |
|
|
|
1063 |
|
|
do k=2,nlay |
1064 |
|
|
do ig=1,ngrid |
1065 |
|
|
if ((fm(ig,k+1)+detr(ig,k))*ptimestep.gt. |
1066 |
|
|
s 1.e-5*masse(ig,k)) then |
1067 |
|
|
c On itère sur la valeur du coeff de freinage. |
1068 |
|
|
c gamma0=rho(ig,k)*(zlev(ig,k+1)-zlev(ig,k)) |
1069 |
|
|
gamma0=masse(ig,k) |
1070 |
|
|
s *sqrt( 0.5*(fraca(ig,k+1)+fraca(ig,k)) ) |
1071 |
|
|
s *0.5/larga(ig) |
1072 |
|
|
s *1. |
1073 |
|
|
c s *0.5 |
1074 |
|
|
c gamma0=0. |
1075 |
|
|
zf=0.5*(fraca(ig,k)+fraca(ig,k+1)) |
1076 |
|
|
zf=0. |
1077 |
|
|
zf2=1./(1.-zf) |
1078 |
|
|
c la première fois on multiplie le coefficient de freinage |
1079 |
|
|
c par le module du vent dans la couche en dessous. |
1080 |
|
|
dua=ua(ig,k-1)-u(ig,k-1) |
1081 |
|
|
dva=va(ig,k-1)-v(ig,k-1) |
1082 |
|
|
do iter=1,5 |
1083 |
|
|
c On choisit une relaxation lineaire. |
1084 |
|
|
gamma(ig,k)=gamma0 |
1085 |
|
|
c On choisit une relaxation quadratique. |
1086 |
|
|
gamma(ig,k)=gamma0*sqrt(dua**2+dva**2) |
1087 |
|
|
ua(ig,k)=(fm(ig,k)*ua(ig,k-1) |
1088 |
|
|
s +(zf2*entr(ig,k)+gamma(ig,k))*u(ig,k)) |
1089 |
|
|
s /(fm(ig,k+1)+detr(ig,k)+entr(ig,k)*zf*zf2 |
1090 |
|
|
s +gamma(ig,k)) |
1091 |
|
|
va(ig,k)=(fm(ig,k)*va(ig,k-1) |
1092 |
|
|
s +(zf2*entr(ig,k)+gamma(ig,k))*v(ig,k)) |
1093 |
|
|
s /(fm(ig,k+1)+detr(ig,k)+entr(ig,k)*zf*zf2 |
1094 |
|
|
s +gamma(ig,k)) |
1095 |
|
|
c print*,k,ua(ig,k),va(ig,k),u(ig,k),v(ig,k),dua,dva |
1096 |
|
|
dua=ua(ig,k)-u(ig,k) |
1097 |
|
|
dva=va(ig,k)-v(ig,k) |
1098 |
|
|
ue(ig,k)=(u(ig,k)-zf*ua(ig,k))*zf2 |
1099 |
|
|
ve(ig,k)=(v(ig,k)-zf*va(ig,k))*zf2 |
1100 |
|
|
enddo |
1101 |
|
|
else |
1102 |
|
|
ua(ig,k)=u(ig,k) |
1103 |
|
|
va(ig,k)=v(ig,k) |
1104 |
|
|
ue(ig,k)=u(ig,k) |
1105 |
|
|
ve(ig,k)=v(ig,k) |
1106 |
|
|
gamma(ig,k)=0. |
1107 |
|
|
endif |
1108 |
|
|
enddo |
1109 |
|
|
enddo |
1110 |
|
|
|
1111 |
|
|
do k=2,nlay |
1112 |
|
|
do ig=1,ngrid |
1113 |
|
|
wud(ig,k)=fm(ig,k)*ue(ig,k) |
1114 |
|
|
wvd(ig,k)=fm(ig,k)*ve(ig,k) |
1115 |
|
|
enddo |
1116 |
|
|
enddo |
1117 |
|
|
do ig=1,ngrid |
1118 |
|
|
wud(ig,1)=0. |
1119 |
|
|
wud(ig,nlay+1)=0. |
1120 |
|
|
wvd(ig,1)=0. |
1121 |
|
|
wvd(ig,nlay+1)=0. |
1122 |
|
|
enddo |
1123 |
|
|
|
1124 |
|
|
do k=1,nlay |
1125 |
|
|
do ig=1,ngrid |
1126 |
|
|
du(ig,k)=((detr(ig,k)+gamma(ig,k))*ua(ig,k) |
1127 |
|
|
s -(entr(ig,k)+gamma(ig,k))*ue(ig,k) |
1128 |
|
|
s -wud(ig,k)+wud(ig,k+1)) |
1129 |
|
|
s /masse(ig,k) |
1130 |
|
|
dv(ig,k)=((detr(ig,k)+gamma(ig,k))*va(ig,k) |
1131 |
|
|
s -(entr(ig,k)+gamma(ig,k))*ve(ig,k) |
1132 |
|
|
s -wvd(ig,k)+wvd(ig,k+1)) |
1133 |
|
|
s /masse(ig,k) |
1134 |
|
|
enddo |
1135 |
|
|
enddo |
1136 |
|
|
|
1137 |
|
|
return |
1138 |
|
|
end |