1 |
! |
2 |
! $Header: /home/cvsroot/LMDZ4/libf/phylmd/vdif_kcay.F,v 1.1 2004/06/22 11:45:36 lmdzadmin Exp $ |
3 |
! |
4 |
SUBROUTINE vdif_kcay(ngrid,dt,g,rconst,plev,temp |
5 |
s ,zlev,zlay,u,v,teta,cd,q2,q2diag,km,kn,ustar |
6 |
s ,l_mix) |
7 |
use dimens_m |
8 |
use dimphy |
9 |
IMPLICIT NONE |
10 |
c....................................................................... |
11 |
c....................................................................... |
12 |
c |
13 |
c dt : pas de temps |
14 |
c g : g |
15 |
c zlev : altitude a chaque niveau (interface inferieure de la couche |
16 |
c de meme indice) |
17 |
c zlay : altitude au centre de chaque couche |
18 |
c u,v : vitesse au centre de chaque couche |
19 |
c (en entree : la valeur au debut du pas de temps) |
20 |
c teta : temperature potentielle au centre de chaque couche |
21 |
c (en entree : la valeur au debut du pas de temps) |
22 |
c cd : cdrag |
23 |
c (en entree : la valeur au debut du pas de temps) |
24 |
c q2 : $q^2$ au bas de chaque couche |
25 |
c (en entree : la valeur au debut du pas de temps) |
26 |
c (en sortie : la valeur a la fin du pas de temps) |
27 |
c km : diffusivite turbulente de quantite de mouvement (au bas de chaque |
28 |
c couche) |
29 |
c (en sortie : la valeur a la fin du pas de temps) |
30 |
c kn : diffusivite turbulente des scalaires (au bas de chaque couche) |
31 |
c (en sortie : la valeur a la fin du pas de temps) |
32 |
c |
33 |
c....................................................................... |
34 |
REAL dt,g,rconst |
35 |
real plev(klon,klev+1),temp(klon,klev) |
36 |
real ustar(klon),snstable |
37 |
REAL zlev(klon,klev+1) |
38 |
REAL zlay(klon,klev) |
39 |
REAL u(klon,klev) |
40 |
REAL v(klon,klev) |
41 |
REAL teta(klon,klev) |
42 |
REAL cd(klon) |
43 |
REAL q2(klon,klev+1),q2s(klon,klev+1) |
44 |
REAL q2diag(klon,klev+1) |
45 |
REAL km(klon,klev+1) |
46 |
REAL kn(klon,klev+1) |
47 |
real sq(klon),sqz(klon),zz(klon,klev+1),zq,long0(klon) |
48 |
|
49 |
integer l_mix,iii |
50 |
c....................................................................... |
51 |
c |
52 |
c nlay : nombre de couches |
53 |
c nlev : nombre de niveaux |
54 |
c ngrid : nombre de points de grille |
55 |
c unsdz : 1 sur l'epaisseur de couche |
56 |
c unsdzdec : 1 sur la distance entre le centre de la couche et le |
57 |
c centre de la couche inferieure |
58 |
c q : echelle de vitesse au bas de chaque couche |
59 |
c (valeur a la fin du pas de temps) |
60 |
c |
61 |
c....................................................................... |
62 |
INTEGER nlay,nlev,ngrid |
63 |
REAL unsdz(klon,klev) |
64 |
REAL unsdzdec(klon,klev+1) |
65 |
REAL q(klon,klev+1) |
66 |
|
67 |
c....................................................................... |
68 |
c |
69 |
c kmpre : km au debut du pas de temps |
70 |
c qcstat : q : solution stationnaire du probleme couple |
71 |
c (valeur a la fin du pas de temps) |
72 |
c q2cstat : q2 : solution stationnaire du probleme couple |
73 |
c (valeur a la fin du pas de temps) |
74 |
c |
75 |
c....................................................................... |
76 |
REAL kmpre(klon,klev+1) |
77 |
REAL qcstat |
78 |
REAL q2cstat |
79 |
real sss,sssq |
80 |
c....................................................................... |
81 |
c |
82 |
c long : longueur de melange calculee selon Blackadar |
83 |
c |
84 |
c....................................................................... |
85 |
REAL long(klon,klev+1) |
86 |
c....................................................................... |
87 |
c |
88 |
c kmq3 : terme en q^3 dans le developpement de km |
89 |
c (valeur au debut du pas de temps) |
90 |
c kmcstat : valeur de km solution stationnaire du systeme {q2 ; du/dz} |
91 |
c (valeur a la fin du pas de temps) |
92 |
c knq3 : terme en q^3 dans le developpement de kn |
93 |
c mcstat : valeur de m solution stationnaire du systeme {q2 ; du/dz} |
94 |
c (valeur a la fin du pas de temps) |
95 |
c m2cstat : valeur de m2 solution stationnaire du systeme {q2 ; du/dz} |
96 |
c (valeur a la fin du pas de temps) |
97 |
c m : valeur a la fin du pas de temps |
98 |
c mpre : valeur au debut du pas de temps |
99 |
c m2 : valeur a la fin du pas de temps |
100 |
c n2 : valeur a la fin du pas de temps |
101 |
c |
102 |
c....................................................................... |
103 |
REAL kmq3 |
104 |
REAL kmcstat |
105 |
REAL knq3 |
106 |
REAL mcstat |
107 |
REAL m2cstat |
108 |
REAL m(klon,klev+1) |
109 |
REAL mpre(klon,klev+1) |
110 |
REAL m2(klon,klev+1) |
111 |
REAL n2(klon,klev+1) |
112 |
c....................................................................... |
113 |
c |
114 |
c gn : intermediaire pour les coefficients de stabilite |
115 |
c gnmin : borne inferieure de gn (-0.23 ou -0.28) |
116 |
c gnmax : borne superieure de gn (0.0233) |
117 |
c gninf : vrai si gn est en dessous de sa borne inferieure |
118 |
c gnsup : vrai si gn est en dessus de sa borne superieure |
119 |
c gm : drole d'objet bien utile |
120 |
c ri : nombre de Richardson |
121 |
c sn : coefficient de stabilite pour n |
122 |
c snq2 : premier terme du developement limite de sn en q2 |
123 |
c sm : coefficient de stabilite pour m |
124 |
c smq2 : premier terme du developement limite de sm en q2 |
125 |
c |
126 |
c....................................................................... |
127 |
REAL gn |
128 |
REAL gnmin |
129 |
REAL gnmax |
130 |
LOGICAL gninf |
131 |
LOGICAL gnsup |
132 |
REAL gm |
133 |
c REAL ri(klon,klev+1) |
134 |
REAL sn(klon,klev+1) |
135 |
REAL snq2(klon,klev+1) |
136 |
REAL sm(klon,klev+1) |
137 |
REAL smq2(klon,klev+1) |
138 |
c....................................................................... |
139 |
c |
140 |
c kappa : consatnte de Von Karman (0.4) |
141 |
c long00 : longueur de reference pour le calcul de long (160) |
142 |
c a1,a2,b1,b2,c1 : constantes d'origine pour les coefficients |
143 |
c de stabilite (0.92/0.74/16.6/10.1/0.08) |
144 |
c cn1,cn2 : constantes pour sn |
145 |
c cm1,cm2,cm3,cm4 : constantes pour sm |
146 |
c |
147 |
c....................................................................... |
148 |
REAL kappa |
149 |
REAL long00 |
150 |
REAL a1,a2,b1,b2,c1 |
151 |
REAL cn1,cn2 |
152 |
REAL cm1,cm2,cm3,cm4 |
153 |
c....................................................................... |
154 |
c |
155 |
c termq : termes en $q$ dans l'equation de q2 |
156 |
c termq3 : termes en $q^3$ dans l'equation de q2 |
157 |
c termqm2 : termes en $q*m^2$ dans l'equation de q2 |
158 |
c termq3m2 : termes en $q^3*m^2$ dans l'equation de q2 |
159 |
c |
160 |
c....................................................................... |
161 |
REAL termq |
162 |
REAL termq3 |
163 |
REAL termqm2 |
164 |
REAL termq3m2 |
165 |
c....................................................................... |
166 |
c |
167 |
c q2min : borne inferieure de q2 |
168 |
c q2max : borne superieure de q2 |
169 |
c |
170 |
c....................................................................... |
171 |
REAL q2min |
172 |
REAL q2max |
173 |
c....................................................................... |
174 |
c knmin : borne inferieure de kn |
175 |
c kmmin : borne inferieure de km |
176 |
c....................................................................... |
177 |
REAL knmin |
178 |
REAL kmmin |
179 |
c....................................................................... |
180 |
INTEGER ilay,ilev,igrid |
181 |
REAL tmp1,tmp2 |
182 |
c....................................................................... |
183 |
PARAMETER (kappa=0.4E+0) |
184 |
PARAMETER (long00=160.E+0) |
185 |
c PARAMETER (gnmin=-10.E+0) |
186 |
PARAMETER (gnmin=-0.28) |
187 |
PARAMETER (gnmax=0.0233E+0) |
188 |
PARAMETER (a1=0.92E+0) |
189 |
PARAMETER (a2=0.74E+0) |
190 |
PARAMETER (b1=16.6E+0) |
191 |
PARAMETER (b2=10.1E+0) |
192 |
PARAMETER (c1=0.08E+0) |
193 |
PARAMETER (knmin=1.E-5) |
194 |
PARAMETER (kmmin=1.E-5) |
195 |
PARAMETER (q2min=1.e-5) |
196 |
PARAMETER (q2max=1.E+2) |
197 |
PARAMETER (nlay=klev) |
198 |
PARAMETER (nlev=klev+1) |
199 |
c |
200 |
PARAMETER ( |
201 |
& cn1=a2*(1.E+0 -6.E+0 *a1/b1) |
202 |
& ) |
203 |
PARAMETER ( |
204 |
& cn2=-3.E+0 *a2*(6.E+0 *a1+b2) |
205 |
& ) |
206 |
PARAMETER ( |
207 |
& cm1=a1*(1.E+0 -3.E+0 *c1-6.E+0 *a1/b1) |
208 |
& ) |
209 |
PARAMETER ( |
210 |
& cm2=a1*(-3.E+0 *a2*((b2-3.E+0 *a2)*(1.E+0 -6.E+0 *a1/b1) |
211 |
& -3.E+0 *c1*(b2+6.E+0 *a1))) |
212 |
& ) |
213 |
PARAMETER ( |
214 |
& cm3=-3.E+0 *a2*(6.E+0 *a1+b2) |
215 |
& ) |
216 |
PARAMETER ( |
217 |
& cm4=-9.E+0 *a1*a2 |
218 |
& ) |
219 |
|
220 |
logical first |
221 |
save first |
222 |
data first/.true./ |
223 |
c....................................................................... |
224 |
c traitment des valeur de q2 en entree |
225 |
c....................................................................... |
226 |
c |
227 |
c Initialisation de q2 |
228 |
|
229 |
call yamada(ngrid,dt,g,rconst,plev,temp |
230 |
s ,zlev,zlay,u,v,teta,cd,q2diag,km,kn,ustar |
231 |
s ,l_mix) |
232 |
if (first.and.1.eq.1) then |
233 |
first=.false. |
234 |
q2=q2diag |
235 |
endif |
236 |
|
237 |
DO ilev=1,nlev |
238 |
DO igrid=1,ngrid |
239 |
q2(igrid,ilev)=amax1(q2(igrid,ilev),q2min) |
240 |
q(igrid,ilev)=sqrt(q2(igrid,ilev)) |
241 |
ENDDO |
242 |
ENDDO |
243 |
c |
244 |
DO igrid=1,ngrid |
245 |
tmp1=cd(igrid)*(u(igrid,1)**2+v(igrid,1)**2) |
246 |
q2(igrid,1)=b1**(2.E+0/3.E+0)*tmp1 |
247 |
q2(igrid,1)=amax1(q2(igrid,1),q2min) |
248 |
q(igrid,1)=sqrt(q2(igrid,1)) |
249 |
ENDDO |
250 |
c |
251 |
c....................................................................... |
252 |
c les increments verticaux |
253 |
c....................................................................... |
254 |
c |
255 |
c!!!!! allerte !!!!!c |
256 |
c!!!!! zlev n'est pas declare a nlev !!!!!c |
257 |
c!!!!! ----> |
258 |
DO igrid=1,ngrid |
259 |
zlev(igrid,nlev)=zlay(igrid,nlay) |
260 |
& +( zlay(igrid,nlay) - zlev(igrid,nlev-1) ) |
261 |
ENDDO |
262 |
c!!!!! <---- |
263 |
c!!!!! allerte !!!!!c |
264 |
c |
265 |
DO ilay=1,nlay |
266 |
DO igrid=1,ngrid |
267 |
unsdz(igrid,ilay)=1.E+0/(zlev(igrid,ilay+1)-zlev(igrid,ilay)) |
268 |
ENDDO |
269 |
ENDDO |
270 |
DO igrid=1,ngrid |
271 |
unsdzdec(igrid,1)=1.E+0/(zlay(igrid,1)-zlev(igrid,1)) |
272 |
ENDDO |
273 |
DO ilay=2,nlay |
274 |
DO igrid=1,ngrid |
275 |
unsdzdec(igrid,ilay)=1.E+0/(zlay(igrid,ilay)-zlay(igrid,ilay-1)) |
276 |
ENDDO |
277 |
ENDDO |
278 |
DO igrid=1,ngrid |
279 |
unsdzdec(igrid,nlay+1)=1.E+0/(zlev(igrid,nlay+1)-zlay(igrid,nlay)) |
280 |
ENDDO |
281 |
c |
282 |
c....................................................................... |
283 |
c le cisaillement et le gradient de temperature |
284 |
c....................................................................... |
285 |
c |
286 |
DO igrid=1,ngrid |
287 |
m2(igrid,1)=(unsdzdec(igrid,1) |
288 |
& *u(igrid,1))**2 |
289 |
& +(unsdzdec(igrid,1) |
290 |
& *v(igrid,1))**2 |
291 |
m(igrid,1)=sqrt(m2(igrid,1)) |
292 |
mpre(igrid,1)=m(igrid,1) |
293 |
ENDDO |
294 |
c |
295 |
c----------------------------------------------------------------------- |
296 |
DO ilev=2,nlev-1 |
297 |
DO igrid=1,ngrid |
298 |
c----------------------------------------------------------------------- |
299 |
c |
300 |
n2(igrid,ilev)=g*unsdzdec(igrid,ilev) |
301 |
& *(teta(igrid,ilev)-teta(igrid,ilev-1)) |
302 |
& /(teta(igrid,ilev)+teta(igrid,ilev-1)) *2.E+0 |
303 |
c n2(igrid,ilev)=0. |
304 |
c |
305 |
c ---> |
306 |
c on ne sais traiter que les cas stratifies. et l'ajustement |
307 |
c convectif est cense faire en sorte que seul des configurations |
308 |
c stratifiees soient rencontrees en entree de cette routine. |
309 |
c mais, bon ... on sait jamais (meme on sait que n2 prends |
310 |
c quelques valeurs negatives ... parfois) alors : |
311 |
c<--- |
312 |
c |
313 |
IF (n2(igrid,ilev).lt.0.E+0) THEN |
314 |
n2(igrid,ilev)=0.E+0 |
315 |
ENDIF |
316 |
c |
317 |
m2(igrid,ilev)=(unsdzdec(igrid,ilev) |
318 |
& *(u(igrid,ilev)-u(igrid,ilev-1)))**2 |
319 |
& +(unsdzdec(igrid,ilev) |
320 |
& *(v(igrid,ilev)-v(igrid,ilev-1)))**2 |
321 |
m(igrid,ilev)=sqrt(m2(igrid,ilev)) |
322 |
mpre(igrid,ilev)=m(igrid,ilev) |
323 |
c |
324 |
c----------------------------------------------------------------------- |
325 |
ENDDO |
326 |
ENDDO |
327 |
c----------------------------------------------------------------------- |
328 |
c |
329 |
DO igrid=1,ngrid |
330 |
m2(igrid,nlev)=m2(igrid,nlev-1) |
331 |
m(igrid,nlev)=m(igrid,nlev-1) |
332 |
mpre(igrid,nlev)=m(igrid,nlev) |
333 |
ENDDO |
334 |
c |
335 |
c....................................................................... |
336 |
c calcul des fonctions de stabilite |
337 |
c....................................................................... |
338 |
c |
339 |
if (l_mix.eq.4) then |
340 |
DO igrid=1,ngrid |
341 |
sqz(igrid)=1.e-10 |
342 |
sq(igrid)=1.e-10 |
343 |
ENDDO |
344 |
do ilev=2,nlev-1 |
345 |
DO igrid=1,ngrid |
346 |
zq=sqrt(q2(igrid,ilev)) |
347 |
sqz(igrid) |
348 |
. =sqz(igrid)+zq*zlev(igrid,ilev) |
349 |
. *(zlay(igrid,ilev)-zlay(igrid,ilev-1)) |
350 |
sq(igrid)=sq(igrid)+zq*(zlay(igrid,ilev)-zlay(igrid,ilev-1)) |
351 |
ENDDO |
352 |
enddo |
353 |
DO igrid=1,ngrid |
354 |
long0(igrid)=0.2*sqz(igrid)/sq(igrid) |
355 |
ENDDO |
356 |
else if (l_mix.eq.3) then |
357 |
long0(igrid)=long00 |
358 |
endif |
359 |
|
360 |
c (abd 5 2) print*,'LONG0=',long0 |
361 |
|
362 |
c----------------------------------------------------------------------- |
363 |
DO ilev=2,nlev-1 |
364 |
DO igrid=1,ngrid |
365 |
c----------------------------------------------------------------------- |
366 |
c |
367 |
tmp1=kappa*(zlev(igrid,ilev)-zlev(igrid,1)) |
368 |
if (l_mix.ge.10) then |
369 |
long(igrid,ilev)=l_mix |
370 |
else |
371 |
long(igrid,ilev)=tmp1/(1.E+0 + tmp1/long0(igrid)) |
372 |
endif |
373 |
long(igrid,ilev)=max(min(long(igrid,ilev) |
374 |
s ,0.5*sqrt(q2(igrid,ilev))/sqrt(max(n2(igrid,ilev),1.e-10))) |
375 |
s ,5.) |
376 |
|
377 |
gn=-long(igrid,ilev)**2 / q2(igrid,ilev) |
378 |
& * n2(igrid,ilev) |
379 |
gm=long(igrid,ilev)**2 / q2(igrid,ilev) |
380 |
& * m2(igrid,ilev) |
381 |
c |
382 |
gninf=.false. |
383 |
gnsup=.false. |
384 |
long(igrid,ilev)=long(igrid,ilev) |
385 |
long(igrid,ilev)=long(igrid,ilev) |
386 |
c |
387 |
IF (gn.lt.gnmin) THEN |
388 |
gninf=.true. |
389 |
gn=gnmin |
390 |
ENDIF |
391 |
c |
392 |
IF (gn.gt.gnmax) THEN |
393 |
gnsup=.true. |
394 |
gn=gnmax |
395 |
ENDIF |
396 |
c |
397 |
sn(igrid,ilev)=cn1/(1.E+0 +cn2*gn) |
398 |
sm(igrid,ilev)= |
399 |
& (cm1+cm2*gn) |
400 |
& /( (1.E+0 +cm3*gn) |
401 |
& *(1.E+0 +cm4*gn) ) |
402 |
c |
403 |
IF ((gninf).or.(gnsup)) THEN |
404 |
snq2(igrid,ilev)=0.E+0 |
405 |
smq2(igrid,ilev)=0.E+0 |
406 |
ELSE |
407 |
snq2(igrid,ilev)= |
408 |
& -gn |
409 |
& *(-cn1*cn2/(1.E+0 +cn2*gn)**2 ) |
410 |
smq2(igrid,ilev)= |
411 |
& -gn |
412 |
& *( cm2*(1.E+0 +cm3*gn) |
413 |
& *(1.E+0 +cm4*gn) |
414 |
& -( cm3*(1.E+0 +cm4*gn) |
415 |
& +cm4*(1.E+0 +cm3*gn) ) |
416 |
& *(cm1+cm2*gn) ) |
417 |
& /( (1.E+0 +cm3*gn) |
418 |
& *(1.E+0 +cm4*gn) )**2 |
419 |
ENDIF |
420 |
c |
421 |
c abd |
422 |
c if(ilev.le.57.and.ilev.ge.37) then |
423 |
c print*,'L=',ilev,' GN=',gn,' SM=',sm(igrid,ilev) |
424 |
c endif |
425 |
c ---> |
426 |
c la decomposition de Taylor en q2 n'a de sens que |
427 |
c dans les cas stratifies ou sn et sm sont quasi |
428 |
c proportionnels a q2. ailleurs on laisse le meme |
429 |
c algorithme car l'ajustement convectif fait le travail. |
430 |
c mais c'est delirant quand sn et snq2 n'ont pas le meme |
431 |
c signe : dans ces cas, on ne fait pas la decomposition. |
432 |
c<--- |
433 |
c |
434 |
IF (snq2(igrid,ilev)*sn(igrid,ilev).le.0.E+0) |
435 |
& snq2(igrid,ilev)=0.E+0 |
436 |
IF (smq2(igrid,ilev)*sm(igrid,ilev).le.0.E+0) |
437 |
& smq2(igrid,ilev)=0.E+0 |
438 |
c |
439 |
C Correction pour les couches stables. |
440 |
C Schema repris de JHoltzlag Boville, lui meme venant de... |
441 |
|
442 |
if (1.eq.1) then |
443 |
snstable=1.-zlev(igrid,ilev) |
444 |
s /(700.*max(ustar(igrid),0.0001)) |
445 |
snstable=1.-zlev(igrid,ilev)/400. |
446 |
snstable=max(snstable,0.) |
447 |
snstable=snstable*snstable |
448 |
|
449 |
c abde print*,'SN ',ilev,sn(1,ilev),snstable |
450 |
if (sn(igrid,ilev).lt.snstable) then |
451 |
sn(igrid,ilev)=snstable |
452 |
snq2(igrid,ilev)=0. |
453 |
endif |
454 |
|
455 |
if (sm(igrid,ilev).lt.snstable) then |
456 |
sm(igrid,ilev)=snstable |
457 |
smq2(igrid,ilev)=0. |
458 |
endif |
459 |
|
460 |
endif |
461 |
|
462 |
c sn : coefficient de stabilite pour n |
463 |
c snq2 : premier terme du developement limite de sn en q2 |
464 |
c----------------------------------------------------------------------- |
465 |
ENDDO |
466 |
ENDDO |
467 |
c----------------------------------------------------------------------- |
468 |
c |
469 |
c....................................................................... |
470 |
c calcul de km et kn au debut du pas de temps |
471 |
c....................................................................... |
472 |
c |
473 |
DO igrid=1,ngrid |
474 |
kn(igrid,1)=knmin |
475 |
km(igrid,1)=kmmin |
476 |
kmpre(igrid,1)=km(igrid,1) |
477 |
ENDDO |
478 |
c |
479 |
c----------------------------------------------------------------------- |
480 |
DO ilev=2,nlev-1 |
481 |
DO igrid=1,ngrid |
482 |
c----------------------------------------------------------------------- |
483 |
c |
484 |
kn(igrid,ilev)=long(igrid,ilev)*q(igrid,ilev) |
485 |
& *sn(igrid,ilev) |
486 |
km(igrid,ilev)=long(igrid,ilev)*q(igrid,ilev) |
487 |
& *sm(igrid,ilev) |
488 |
kmpre(igrid,ilev)=km(igrid,ilev) |
489 |
c |
490 |
c----------------------------------------------------------------------- |
491 |
ENDDO |
492 |
ENDDO |
493 |
c----------------------------------------------------------------------- |
494 |
c |
495 |
DO igrid=1,ngrid |
496 |
kn(igrid,nlev)=kn(igrid,nlev-1) |
497 |
km(igrid,nlev)=km(igrid,nlev-1) |
498 |
kmpre(igrid,nlev)=km(igrid,nlev) |
499 |
ENDDO |
500 |
c |
501 |
c....................................................................... |
502 |
c boucle sur les niveaux 2 a nlev-1 |
503 |
c....................................................................... |
504 |
c |
505 |
c----> |
506 |
DO 10001 ilev=2,nlev-1 |
507 |
c----> |
508 |
DO 10002 igrid=1,ngrid |
509 |
c |
510 |
c....................................................................... |
511 |
c |
512 |
c calcul des termes sources et puits de l'equation de q2 |
513 |
c ------------------------------------------------------ |
514 |
c |
515 |
knq3=kn(igrid,ilev)*snq2(igrid,ilev) |
516 |
& /sn(igrid,ilev) |
517 |
kmq3=km(igrid,ilev)*smq2(igrid,ilev) |
518 |
& /sm(igrid,ilev) |
519 |
c |
520 |
termq=0.E+0 |
521 |
termq3=0.E+0 |
522 |
termqm2=0.E+0 |
523 |
termq3m2=0.E+0 |
524 |
c |
525 |
tmp1=dt*2.E+0 *km(igrid,ilev)*m2(igrid,ilev) |
526 |
tmp2=dt*2.E+0 *kmq3*m2(igrid,ilev) |
527 |
termqm2=termqm2 |
528 |
& +dt*2.E+0 *km(igrid,ilev)*m2(igrid,ilev) |
529 |
& -dt*2.E+0 *kmq3*m2(igrid,ilev) |
530 |
termq3m2=termq3m2 |
531 |
& +dt*2.E+0 *kmq3*m2(igrid,ilev) |
532 |
c |
533 |
termq=termq |
534 |
& -dt*2.E+0 *kn(igrid,ilev)*n2(igrid,ilev) |
535 |
& +dt*2.E+0 *knq3*n2(igrid,ilev) |
536 |
termq3=termq3 |
537 |
& -dt*2.E+0 *knq3*n2(igrid,ilev) |
538 |
c |
539 |
termq3=termq3 |
540 |
& -dt*2.E+0 *q(igrid,ilev)**3 / (b1*long(igrid,ilev)) |
541 |
c |
542 |
c....................................................................... |
543 |
c |
544 |
c resolution stationnaire couplee avec le gradient de vitesse local |
545 |
c ----------------------------------------------------------------- |
546 |
c |
547 |
c -----{on cherche le cisaillement qui annule l'equation de q^2 |
548 |
c supposee en q3} |
549 |
c |
550 |
tmp1=termq+termq3 |
551 |
tmp2=termqm2+termq3m2 |
552 |
m2cstat=m2(igrid,ilev) |
553 |
& -(tmp1+tmp2)/(dt*2.E+0*km(igrid,ilev)) |
554 |
mcstat=sqrt(m2cstat) |
555 |
|
556 |
c abde print*,'M2 L=',ilev,mpre(igrid,ilev),mcstat |
557 |
c |
558 |
c -----{puis on ecrit la valeur de q qui annule l'equation de m |
559 |
c supposee en q3} |
560 |
c |
561 |
IF (ilev.eq.2) THEN |
562 |
kmcstat=1.E+0 / mcstat |
563 |
& *( unsdz(igrid,ilev)*kmpre(igrid,ilev+1) |
564 |
& *mpre(igrid,ilev+1) |
565 |
& +unsdz(igrid,ilev-1) |
566 |
& *cd(igrid) |
567 |
& *( sqrt(u(igrid,3)**2+v(igrid,3)**2) |
568 |
& -mcstat/unsdzdec(igrid,ilev) |
569 |
& -mpre(igrid,ilev+1)/unsdzdec(igrid,ilev+1) )**2) |
570 |
& /( unsdz(igrid,ilev)+unsdz(igrid,ilev-1) ) |
571 |
ELSE |
572 |
kmcstat=1.E+0 / mcstat |
573 |
& *( unsdz(igrid,ilev)*kmpre(igrid,ilev+1) |
574 |
& *mpre(igrid,ilev+1) |
575 |
& +unsdz(igrid,ilev-1)*kmpre(igrid,ilev-1) |
576 |
& *mpre(igrid,ilev-1) ) |
577 |
& /( unsdz(igrid,ilev)+unsdz(igrid,ilev-1) ) |
578 |
ENDIF |
579 |
tmp2=kmcstat |
580 |
& /( sm(igrid,ilev)/q2(igrid,ilev) ) |
581 |
& /long(igrid,ilev) |
582 |
qcstat=tmp2**(1.E+0/3.E+0) |
583 |
q2cstat=qcstat**2 |
584 |
c |
585 |
c....................................................................... |
586 |
c |
587 |
c choix de la solution finale |
588 |
c --------------------------- |
589 |
c |
590 |
q(igrid,ilev)=qcstat |
591 |
q2(igrid,ilev)=q2cstat |
592 |
m(igrid,ilev)=mcstat |
593 |
c abd if(ilev.le.57.and.ilev.ge.37) then |
594 |
c print*,'L=',ilev,' M2=',m2(igrid,ilev),m2cstat, |
595 |
c s 'N2=',n2(igrid,ilev) |
596 |
c abd endif |
597 |
m2(igrid,ilev)=m2cstat |
598 |
c |
599 |
c ---> |
600 |
c pour des raisons simples q2 est minore |
601 |
c<--- |
602 |
c |
603 |
IF (q2(igrid,ilev).lt.q2min) THEN |
604 |
q2(igrid,ilev)=q2min |
605 |
q(igrid,ilev)=sqrt(q2min) |
606 |
ENDIF |
607 |
c |
608 |
c....................................................................... |
609 |
c |
610 |
c calcul final de kn et km |
611 |
c ------------------------ |
612 |
c |
613 |
gn=-long(igrid,ilev)**2 / q2(igrid,ilev) |
614 |
& * n2(igrid,ilev) |
615 |
IF (gn.lt.gnmin) gn=gnmin |
616 |
IF (gn.gt.gnmax) gn=gnmax |
617 |
sn(igrid,ilev)=cn1/(1.E+0 +cn2*gn) |
618 |
sm(igrid,ilev)= |
619 |
& (cm1+cm2*gn) |
620 |
& /( (1.E+0 +cm3*gn)*(1.E+0 +cm4*gn) ) |
621 |
kn(igrid,ilev)=long(igrid,ilev)*q(igrid,ilev) |
622 |
& *sn(igrid,ilev) |
623 |
km(igrid,ilev)=long(igrid,ilev)*q(igrid,ilev) |
624 |
& *sm(igrid,ilev) |
625 |
c abd |
626 |
c if(ilev.le.57.and.ilev.ge.37) then |
627 |
c print*,'L=',ilev,' GN=',gn,' SM=',sm(igrid,ilev) |
628 |
c endif |
629 |
c |
630 |
c....................................................................... |
631 |
c |
632 |
10002 CONTINUE |
633 |
c |
634 |
10001 CONTINUE |
635 |
c |
636 |
c....................................................................... |
637 |
c |
638 |
c |
639 |
DO igrid=1,ngrid |
640 |
kn(igrid,1)=knmin |
641 |
km(igrid,1)=kmmin |
642 |
c kn(igrid,1)=cd(igrid) |
643 |
c km(igrid,1)=cd(igrid) |
644 |
q2(igrid,nlev)=q2(igrid,nlev-1) |
645 |
q(igrid,nlev)=q(igrid,nlev-1) |
646 |
kn(igrid,nlev)=kn(igrid,nlev-1) |
647 |
km(igrid,nlev)=km(igrid,nlev-1) |
648 |
ENDDO |
649 |
c |
650 |
c CALCUL DE LA DIFFUSION VERTICALE DE Q2 |
651 |
if (1.eq.1) then |
652 |
|
653 |
do ilev=2,klev-1 |
654 |
sss=sss+plev(1,ilev-1)-plev(1,ilev+1) |
655 |
sssq=sssq+(plev(1,ilev-1)-plev(1,ilev+1))*q2(1,ilev) |
656 |
enddo |
657 |
c print*,'Q2moy avant',sssq/sss |
658 |
c print*,'Q2q20 ',(q2(1,ilev),ilev=1,10) |
659 |
c print*,'Q2km0 ',(km(1,ilev),ilev=1,10) |
660 |
c ! C'est quoi ca qu'etait dans l'original??? |
661 |
c do igrid=1,ngrid |
662 |
c q2(igrid,1)=10. |
663 |
c enddo |
664 |
c q2s=q2 |
665 |
c do iii=1,10 |
666 |
c call vdif_q2(dt,g,rconst,plev,temp,km,q2) |
667 |
c do ilev=1,klev+1 |
668 |
c write(iii+49,*) q2(1,ilev),zlev(1,ilev) |
669 |
c enddo |
670 |
c enddo |
671 |
c stop |
672 |
c do ilev=1,klev |
673 |
c print*,zlev(1,ilev),q2s(1,ilev),q2(1,ilev) |
674 |
c enddo |
675 |
c q2s=q2-q2s |
676 |
c do ilev=1,klev |
677 |
c print*,q2s(1,ilev),zlev(1,ilev) |
678 |
c enddo |
679 |
do ilev=2,klev-1 |
680 |
sss=sss+plev(1,ilev-1)-plev(1,ilev+1) |
681 |
sssq=sssq+(plev(1,ilev-1)-plev(1,ilev+1))*q2(1,ilev) |
682 |
enddo |
683 |
print*,'Q2moy apres',sssq/sss |
684 |
c |
685 |
c |
686 |
do ilev=1,nlev |
687 |
do igrid=1,ngrid |
688 |
q2(igrid,ilev)=max(q2(igrid,ilev),q2min) |
689 |
q(igrid,ilev)=sqrt(q2(igrid,ilev)) |
690 |
|
691 |
c....................................................................... |
692 |
c |
693 |
c calcul final de kn et km |
694 |
c ------------------------ |
695 |
c |
696 |
gn=-long(igrid,ilev)**2 / q2(igrid,ilev) |
697 |
& * n2(igrid,ilev) |
698 |
IF (gn.lt.gnmin) gn=gnmin |
699 |
IF (gn.gt.gnmax) gn=gnmax |
700 |
sn(igrid,ilev)=cn1/(1.E+0 +cn2*gn) |
701 |
sm(igrid,ilev)= |
702 |
& (cm1+cm2*gn) |
703 |
& /( (1.E+0 +cm3*gn)*(1.E+0 +cm4*gn) ) |
704 |
C Correction pour les couches stables. |
705 |
C Schema repris de JHoltzlag Boville, lui meme venant de... |
706 |
|
707 |
if (1.eq.1) then |
708 |
snstable=1.-zlev(igrid,ilev) |
709 |
s /(700.*max(ustar(igrid),0.0001)) |
710 |
snstable=1.-zlev(igrid,ilev)/400. |
711 |
snstable=max(snstable,0.) |
712 |
snstable=snstable*snstable |
713 |
|
714 |
c abde print*,'SN ',ilev,sn(1,ilev),snstable |
715 |
if (sn(igrid,ilev).lt.snstable) then |
716 |
sn(igrid,ilev)=snstable |
717 |
snq2(igrid,ilev)=0. |
718 |
endif |
719 |
|
720 |
if (sm(igrid,ilev).lt.snstable) then |
721 |
sm(igrid,ilev)=snstable |
722 |
smq2(igrid,ilev)=0. |
723 |
endif |
724 |
|
725 |
endif |
726 |
|
727 |
c sn : coefficient de stabilite pour n |
728 |
kn(igrid,ilev)=long(igrid,ilev)*q(igrid,ilev) |
729 |
& *sn(igrid,ilev) |
730 |
km(igrid,ilev)=long(igrid,ilev)*q(igrid,ilev) |
731 |
c |
732 |
enddo |
733 |
enddo |
734 |
c print*,'Q2km1 ',(km(1,ilev),ilev=1,10) |
735 |
|
736 |
endif |
737 |
|
738 |
RETURN |
739 |
END |