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

Annotation of /trunk/phylmd/vdif_kcay.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 76 - (hide annotations)
Fri Nov 15 18:45:49 2013 UTC (10 years, 5 months ago) by guez
Original Path: trunk/phylmd/vdif_kcay.f90
File size: 18963 byte(s)
Moved everything out of libf.
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 62 SUBROUTINE vdif_kcay(ngrid, dt, g, rconst, plev, temp, zlev, zlay, &
8     u, v, teta, cd, q2, 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 3
14 guez 62 ! dt : pas de temps
15     ! g : g
16     ! zlev : altitude a chaque niveau (interface inferieure de la couche
17     ! de meme indice)
18     ! zlay : altitude au centre de chaque couche
19     ! u, v : vitesse au centre de chaque couche
20     ! (en entree : la valeur au debut du pas de temps)
21     ! teta : temperature potentielle au centre de chaque couche
22     ! (en entree : la valeur au debut du pas de temps)
23     ! q2 : $q^2$ au bas de chaque couche
24     ! (en entree : la valeur au debut du pas de temps)
25     ! (en sortie : la valeur a la fin du pas de temps)
26     ! km : diffusivite turbulente de quantite de mouvement (au bas de chaque
27     ! couche)
28     ! (en sortie : la valeur a la fin du pas de temps)
29     ! kn : diffusivite turbulente des scalaires (au bas de chaque couche)
30     ! (en sortie : la valeur a la fin du pas de temps)
31 guez 3
32 guez 62 REAL, intent(in):: dt
33     real, intent(in):: g
34     real 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, intent(in):: cd (:) ! (ngrid) cdrag, valeur au debut du pas de temps
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 guez 3
49 guez 62 integer l_mix, iii
50 guez 3
51 guez 62 ! nlay : nombre de couches
52     ! nlev : nombre de niveaux
53     ! ngrid : nombre de points de grille
54     ! unsdz : 1 sur l'epaisseur de couche
55     ! unsdzdec : 1 sur la distance entre le centre de la couche et le
56     ! centre de la couche inferieure
57     ! q : echelle de vitesse au bas de chaque couche
58     ! (valeur a la fin du pas de temps)
59 guez 3
60 guez 62 INTEGER nlay, nlev, ngrid
61     REAL unsdz(klon, klev)
62     REAL unsdzdec(klon, klev+1)
63     REAL q(klon, klev+1)
64 guez 3
65 guez 62 ! kmpre : km au debut du pas de temps
66     ! qcstat : q : solution stationnaire du probleme couple
67     ! (valeur a la fin du pas de temps)
68     ! q2cstat : q2 : solution stationnaire du probleme couple
69     ! (valeur a la fin du pas de temps)
70 guez 3
71 guez 62 REAL kmpre(klon, klev+1)
72     REAL qcstat
73     REAL q2cstat
74     real sss, sssq
75 guez 3
76 guez 62 ! long : longueur de melange calculee selon Blackadar
77 guez 3
78 guez 62 REAL long(klon, klev+1)
79 guez 3
80 guez 62 ! kmq3 : terme en q^3 dans le developpement de km
81     ! (valeur au debut du pas de temps)
82     ! kmcstat : valeur de km solution stationnaire du systeme {q2 ; du/dz}
83     ! (valeur a la fin du pas de temps)
84     ! knq3 : terme en q^3 dans le developpement de kn
85     ! mcstat : valeur de m solution stationnaire du systeme {q2 ; du/dz}
86     ! (valeur a la fin du pas de temps)
87     ! m2cstat : valeur de m2 solution stationnaire du systeme {q2 ; du/dz}
88     ! (valeur a la fin du pas de temps)
89     ! m : valeur a la fin du pas de temps
90     ! mpre : valeur au debut du pas de temps
91     ! m2 : valeur a la fin du pas de temps
92     ! n2 : valeur a la fin du pas de temps
93 guez 3
94 guez 62 REAL kmq3
95     REAL kmcstat
96     REAL knq3
97     REAL mcstat
98     REAL m2cstat
99     REAL m(klon, klev+1)
100     REAL mpre(klon, klev+1)
101     REAL m2(klon, klev+1)
102     REAL n2(klon, klev+1)
103 guez 3
104 guez 62 ! gn : intermediaire pour les coefficients de stabilite
105     ! gnmin : borne inferieure de gn (-0.23 ou -0.28)
106     ! gnmax : borne superieure de gn (0.0233)
107     ! gninf : vrai si gn est en dessous de sa borne inferieure
108     ! gnsup : vrai si gn est en dessus de sa borne superieure
109     ! gm : drole d'objet bien utile
110     ! ri : nombre de Richardson
111     ! sn : coefficient de stabilite pour n
112     ! snq2 : premier terme du developement limite de sn en q2
113     ! sm : coefficient de stabilite pour m
114     ! smq2 : premier terme du developement limite de sm en q2
115 guez 3
116 guez 62 REAL gn
117     REAL gnmin
118     REAL gnmax
119     LOGICAL gninf
120     LOGICAL gnsup
121     REAL gm
122     ! REAL ri(klon, klev+1)
123     REAL sn(klon, klev+1)
124     REAL snq2(klon, klev+1)
125     REAL sm(klon, klev+1)
126     REAL smq2(klon, klev+1)
127 guez 3
128 guez 62 ! kappa : consatnte de Von Karman (0.4)
129     ! long00 : longueur de reference pour le calcul de long (160)
130     ! a1, a2, b1, b2, c1 : constantes d'origine pour les coefficients
131     ! de stabilite (0.92/0.74/16.6/10.1/0.08)
132     ! cn1, cn2 : constantes pour sn
133     ! cm1, cm2, cm3, cm4 : constantes pour sm
134 guez 3
135 guez 62 REAL kappa
136     REAL long00
137     REAL a1, a2, b1, b2, c1
138     REAL cn1, cn2
139     REAL cm1, cm2, cm3, cm4
140 guez 3
141 guez 62 ! termq : termes en $q$ dans l'equation de q2
142     ! termq3 : termes en $q^3$ dans l'equation de q2
143     ! termqm2 : termes en $q*m^2$ dans l'equation de q2
144     ! termq3m2 : termes en $q^3*m^2$ dans l'equation de q2
145 guez 3
146 guez 62 REAL termq
147     REAL termq3
148     REAL termqm2
149     REAL termq3m2
150 guez 3
151 guez 62 ! q2min : borne inferieure de q2
152     ! q2max : borne superieure de q2
153    
154     REAL q2min
155     REAL q2max
156    
157     ! knmin : borne inferieure de kn
158     ! kmmin : borne inferieure de km
159    
160     REAL knmin
161     REAL kmmin
162    
163     INTEGER ilay, ilev, igrid
164     REAL tmp1, tmp2
165    
166     PARAMETER (kappa=0.4E+0)
167     PARAMETER (long00=160.E+0)
168     ! PARAMETER (gnmin=-10.E+0)
169     PARAMETER (gnmin=-0.28)
170     PARAMETER (gnmax=0.0233E+0)
171     PARAMETER (a1=0.92E+0)
172     PARAMETER (a2=0.74E+0)
173     PARAMETER (b1=16.6E+0)
174     PARAMETER (b2=10.1E+0)
175     PARAMETER (c1=0.08E+0)
176     PARAMETER (knmin=1.E-5)
177     PARAMETER (kmmin=1.E-5)
178     PARAMETER (q2min=1.e-5)
179     PARAMETER (q2max=1.E+2)
180     PARAMETER (nlay=klev)
181     PARAMETER (nlev=klev+1)
182    
183     PARAMETER (cn1=a2*(1.E+0 -6.E+0 *a1/b1))
184     PARAMETER (cn2=-3.E+0 *a2*(6.E+0 *a1+b2))
185     PARAMETER (cm1=a1*(1.E+0 -3.E+0 *c1-6.E+0 *a1/b1))
186     PARAMETER (cm2=a1*(-3.E+0 *a2*((b2-3.E+0 *a2)*(1.E+0 -6.E+0 *a1/b1) &
187     -3.E+0 *c1*(b2+6.E+0 *a1))))
188     PARAMETER (cm3=-3.E+0 *a2*(6.E+0 *a1+b2))
189     PARAMETER (cm4=-9.E+0 *a1*a2)
190    
191     logical:: first = .true.
192    
193     !------------------------------------------------------------
194    
195     ! traitment des valeur de q2 en entree
196    
197     ! Initialisation de q2
198    
199     call yamada(ngrid, g, rconst, plev, temp, zlev, zlay, u, v, teta, &
200     q2diag, km, kn, ustar, l_mix)
201     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