/[lmdze]/trunk/Sources/phylmd/vdif_kcay.f
ViewVC logotype

Annotation of /trunk/Sources/phylmd/vdif_kcay.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 145 - (hide annotations)
Tue Jun 16 15:23:29 2015 UTC (8 years, 11 months ago) by guez
File size: 18870 byte(s)
Renamed bibio to misc.

In procedure fxhyp, use the fact that xf is an odd function of xtild.

In procedure invert_zoom_x, replace linear search in xf by
bisection. Also, use result from previous loop iteration as initial
guess. Variable "it" cannot be equal to 2 * nmax after search.

Unused arguments: hm of cv3_feed; ph, qnk, tv,tvp of cv3_mixing; ppsol
of lw; rconst, temp of vdif_kcay; rconst, plev, temp, ustar, l_mix of
yamada.

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

  ViewVC Help
Powered by ViewVC 1.1.21