/[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 188 - (hide annotations)
Tue Mar 22 16:31:39 2016 UTC (8 years, 2 months ago) by guez
File size: 18625 byte(s)
Removed argument ncum of cv30_unsat, arguments nloc, ncum, nd, na of cv30_yield.

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     ! 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 sn(klon, klev+1)
122     REAL snq2(klon, klev+1)
123     REAL sm(klon, klev+1)
124     REAL smq2(klon, klev+1)
125 guez 3
126 guez 62 ! kappa : consatnte de Von Karman (0.4)
127     ! long00 : longueur de reference pour le calcul de long (160)
128     ! a1, a2, b1, b2, c1 : constantes d'origine pour les coefficients
129     ! de stabilite (0.92/0.74/16.6/10.1/0.08)
130     ! cn1, cn2 : constantes pour sn
131     ! cm1, cm2, cm3, cm4 : constantes pour sm
132 guez 3
133 guez 62 REAL kappa
134     REAL long00
135     REAL a1, a2, b1, b2, c1
136     REAL cn1, cn2
137     REAL cm1, cm2, cm3, cm4
138 guez 3
139 guez 62 ! termq : termes en $q$ dans l'equation de q2
140     ! termq3 : termes en $q^3$ dans l'equation de q2
141     ! termqm2 : termes en $q*m^2$ dans l'equation de q2
142     ! termq3m2 : termes en $q^3*m^2$ dans l'equation de q2
143 guez 3
144 guez 62 REAL termq
145     REAL termq3
146     REAL termqm2
147     REAL termq3m2
148 guez 3
149 guez 62 ! q2min : borne inferieure de q2
150     REAL q2min
151    
152     ! knmin : borne inferieure de kn
153     ! kmmin : borne inferieure de km
154    
155     REAL knmin
156     REAL kmmin
157    
158     INTEGER ilay, ilev, igrid
159     REAL tmp1, tmp2
160    
161     PARAMETER (kappa=0.4E+0)
162     PARAMETER (long00=160.E+0)
163     ! PARAMETER (gnmin=-10.E+0)
164     PARAMETER (gnmin=-0.28)
165     PARAMETER (gnmax=0.0233E+0)
166     PARAMETER (a1=0.92E+0)
167     PARAMETER (a2=0.74E+0)
168     PARAMETER (b1=16.6E+0)
169     PARAMETER (b2=10.1E+0)
170     PARAMETER (c1=0.08E+0)
171     PARAMETER (knmin=1.E-5)
172     PARAMETER (kmmin=1.E-5)
173     PARAMETER (q2min=1.e-5)
174     PARAMETER (nlay=klev)
175     PARAMETER (nlev=klev+1)
176    
177     PARAMETER (cn1=a2*(1.E+0 -6.E+0 *a1/b1))
178     PARAMETER (cn2=-3.E+0 *a2*(6.E+0 *a1+b2))
179     PARAMETER (cm1=a1*(1.E+0 -3.E+0 *c1-6.E+0 *a1/b1))
180     PARAMETER (cm2=a1*(-3.E+0 *a2*((b2-3.E+0 *a2)*(1.E+0 -6.E+0 *a1/b1) &
181     -3.E+0 *c1*(b2+6.E+0 *a1))))
182     PARAMETER (cm3=-3.E+0 *a2*(6.E+0 *a1+b2))
183     PARAMETER (cm4=-9.E+0 *a1*a2)
184    
185     logical:: first = .true.
186    
187     !------------------------------------------------------------
188    
189     ! traitment des valeur de q2 en entree
190    
191     ! Initialisation de q2
192    
193 guez 145 call yamada(ngrid, g, zlev, zlay, u, v, teta, q2diag, km, kn)
194 guez 62 if (first.and.1.eq.1) then
195     first=.false.
196     q2=q2diag
197     endif
198    
199     DO ilev=1, nlev
200     DO igrid=1, ngrid
201     q2(igrid, ilev)=amax1(q2(igrid, ilev), q2min)
202     q(igrid, ilev)=sqrt(q2(igrid, ilev))
203     ENDDO
204     ENDDO
205    
206     DO igrid=1, ngrid
207     tmp1=cd(igrid)*(u(igrid, 1)**2+v(igrid, 1)**2)
208     q2(igrid, 1)=b1**(2.E+0/3.E+0)*tmp1
209     q2(igrid, 1)=amax1(q2(igrid, 1), q2min)
210     q(igrid, 1)=sqrt(q2(igrid, 1))
211     ENDDO
212    
213     ! les increments verticaux
214    
215     ! allerte !c
216     ! zlev n'est pas declare a nlev !c
217     DO igrid=1, ngrid
218     zlev(igrid, nlev)=zlay(igrid, nlay) &
219     +( zlay(igrid, nlay) - zlev(igrid, nlev-1) )
220     ENDDO
221     ! allerte !c
222    
223     DO ilay=1, nlay
224     DO igrid=1, ngrid
225     unsdz(igrid, ilay)=1.E+0/(zlev(igrid, ilay+1)-zlev(igrid, ilay))
226     ENDDO
227     ENDDO
228     DO igrid=1, ngrid
229     unsdzdec(igrid, 1)=1.E+0/(zlay(igrid, 1)-zlev(igrid, 1))
230     ENDDO
231     DO ilay=2, nlay
232     DO igrid=1, ngrid
233     unsdzdec(igrid, ilay)=1.E+0/(zlay(igrid, ilay)-zlay(igrid, ilay-1))
234     ENDDO
235     ENDDO
236     DO igrid=1, ngrid
237     unsdzdec(igrid, nlay+1)=1.E+0/(zlev(igrid, nlay+1)-zlay(igrid, nlay))
238     ENDDO
239    
240     ! le cisaillement et le gradient de temperature
241    
242     DO igrid=1, ngrid
243     m2(igrid, 1)=(unsdzdec(igrid, 1) &
244     *u(igrid, 1))**2 &
245     +(unsdzdec(igrid, 1) &
246     *v(igrid, 1))**2
247     m(igrid, 1)=sqrt(m2(igrid, 1))
248     mpre(igrid, 1)=m(igrid, 1)
249     ENDDO
250    
251     DO ilev=2, nlev-1
252     DO igrid=1, ngrid
253    
254     n2(igrid, ilev)=g*unsdzdec(igrid, ilev) &
255     *(teta(igrid, ilev)-teta(igrid, ilev-1)) &
256     /(teta(igrid, ilev)+teta(igrid, ilev-1)) *2.E+0
257    
258     ! on ne sais traiter que les cas stratifies. et l'ajustement
259     ! convectif est cense faire en sorte que seul des
260     ! configurations stratifiees soient rencontrees en entree de
261     ! cette routine. mais, bon ... on sait jamais (meme on sait
262     ! que n2 prends quelques valeurs negatives ... parfois)
263     ! alors :
264    
265     IF (n2(igrid, ilev).lt.0.E+0) THEN
266     n2(igrid, ilev)=0.E+0
267     ENDIF
268    
269     m2(igrid, ilev)=(unsdzdec(igrid, ilev) &
270     *(u(igrid, ilev)-u(igrid, ilev-1)))**2 &
271     +(unsdzdec(igrid, ilev) &
272     *(v(igrid, ilev)-v(igrid, ilev-1)))**2
273     m(igrid, ilev)=sqrt(m2(igrid, ilev))
274     mpre(igrid, ilev)=m(igrid, ilev)
275    
276     ENDDO
277     ENDDO
278    
279     DO igrid=1, ngrid
280     m2(igrid, nlev)=m2(igrid, nlev-1)
281     m(igrid, nlev)=m(igrid, nlev-1)
282     mpre(igrid, nlev)=m(igrid, nlev)
283     ENDDO
284    
285     ! calcul des fonctions de stabilite
286    
287     if (l_mix.eq.4) then
288     DO igrid=1, ngrid
289     sqz(igrid)=1.e-10
290     sq(igrid)=1.e-10
291     ENDDO
292     do ilev=2, nlev-1
293     DO igrid=1, ngrid
294     zq=sqrt(q2(igrid, ilev))
295     sqz(igrid) &
296     =sqz(igrid)+zq*zlev(igrid, ilev) &
297     *(zlay(igrid, ilev)-zlay(igrid, ilev-1))
298     sq(igrid)=sq(igrid)+zq*(zlay(igrid, ilev)-zlay(igrid, ilev-1))
299     ENDDO
300     enddo
301     DO igrid=1, ngrid
302     long0(igrid)=0.2*sqz(igrid)/sq(igrid)
303     ENDDO
304     else if (l_mix.eq.3) then
305     long0(igrid)=long00
306     endif
307    
308     DO ilev=2, nlev-1
309     DO igrid=1, ngrid
310     tmp1=kappa*(zlev(igrid, ilev)-zlev(igrid, 1))
311     if (l_mix.ge.10) then
312     long(igrid, ilev)=l_mix
313     else
314     long(igrid, ilev)=tmp1/(1.E+0 + tmp1/long0(igrid))
315     endif
316     long(igrid, ilev)=max(min(long(igrid, ilev) &
317     , 0.5*sqrt(q2(igrid, ilev))/sqrt(max(n2(igrid, ilev), 1.e-10))) &
318     , 5.)
319    
320     gn=-long(igrid, ilev)**2 / q2(igrid, ilev) &
321     * n2(igrid, ilev)
322     gninf=.false.
323     gnsup=.false.
324     long(igrid, ilev)=long(igrid, ilev)
325     long(igrid, ilev)=long(igrid, ilev)
326    
327     IF (gn.lt.gnmin) THEN
328     gninf=.true.
329     gn=gnmin
330     ENDIF
331    
332     IF (gn.gt.gnmax) THEN
333     gnsup=.true.
334     gn=gnmax
335     ENDIF
336    
337     sn(igrid, ilev)=cn1/(1.E+0 +cn2*gn)
338     sm(igrid, ilev)= &
339     (cm1+cm2*gn) &
340     /( (1.E+0 +cm3*gn) &
341     *(1.E+0 +cm4*gn) )
342    
343     IF ((gninf).or.(gnsup)) THEN
344     snq2(igrid, ilev)=0.E+0
345     smq2(igrid, ilev)=0.E+0
346     ELSE
347     snq2(igrid, ilev)= &
348     -gn &
349     *(-cn1*cn2/(1.E+0 +cn2*gn)**2 )
350     smq2(igrid, ilev)= &
351     -gn &
352     *( cm2*(1.E+0 +cm3*gn) &
353     *(1.E+0 +cm4*gn) &
354     -( cm3*(1.E+0 +cm4*gn) &
355     +cm4*(1.E+0 +cm3*gn) ) &
356     *(cm1+cm2*gn) ) &
357     /( (1.E+0 +cm3*gn) &
358     *(1.E+0 +cm4*gn) )**2
359     ENDIF
360     ! la decomposition de Taylor en q2 n'a de sens que dans les
361     ! cas stratifies ou sn et sm sont quasi proportionnels a
362     ! q2. ailleurs on laisse le meme algorithme car l'ajustement
363     ! convectif fait le travail. mais c'est delirant quand sn
364     ! et snq2 n'ont pas le meme signe : dans ces cas, on ne fait
365     ! pas la decomposition.
366    
367     IF (snq2(igrid, ilev)*sn(igrid, ilev).le.0.E+0) &
368     snq2(igrid, ilev)=0.E+0
369     IF (smq2(igrid, ilev)*sm(igrid, ilev).le.0.E+0) &
370     smq2(igrid, ilev)=0.E+0
371    
372     ! Correction pour les couches stables.
373     ! Schema repris de JHoltzlag Boville, lui meme venant de...
374    
375     if (1.eq.1) then
376     snstable=1.-zlev(igrid, ilev) &
377     /(700.*max(ustar(igrid), 0.0001))
378     snstable=1.-zlev(igrid, ilev)/400.
379     snstable=max(snstable, 0.)
380     snstable=snstable*snstable
381    
382     if (sn(igrid, ilev).lt.snstable) then
383     sn(igrid, ilev)=snstable
384     snq2(igrid, ilev)=0.
385     endif
386    
387     if (sm(igrid, ilev).lt.snstable) then
388     sm(igrid, ilev)=snstable
389     smq2(igrid, ilev)=0.
390     endif
391     endif
392    
393     ! sn : coefficient de stabilite pour n
394     ! snq2 : premier terme du developement limite de sn en q2
395     ENDDO
396     ENDDO
397    
398     ! calcul de km et kn au debut du pas de temps
399    
400     DO igrid=1, ngrid
401     kn(igrid, 1)=knmin
402     km(igrid, 1)=kmmin
403     kmpre(igrid, 1)=km(igrid, 1)
404     ENDDO
405    
406     DO ilev=2, nlev-1
407     DO igrid=1, ngrid
408     kn(igrid, ilev)=long(igrid, ilev)*q(igrid, ilev) &
409     *sn(igrid, ilev)
410     km(igrid, ilev)=long(igrid, ilev)*q(igrid, ilev) &
411     *sm(igrid, ilev)
412     kmpre(igrid, ilev)=km(igrid, ilev)
413     ENDDO
414     ENDDO
415    
416     DO igrid=1, ngrid
417     kn(igrid, nlev)=kn(igrid, nlev-1)
418     km(igrid, nlev)=km(igrid, nlev-1)
419     kmpre(igrid, nlev)=km(igrid, nlev)
420     ENDDO
421    
422     ! boucle sur les niveaux 2 a nlev-1
423    
424     DO ilev=2, nlev-1
425     DO igrid=1, ngrid
426     ! calcul des termes sources et puits de l'equation de q2
427    
428     knq3=kn(igrid, ilev)*snq2(igrid, ilev) &
429     /sn(igrid, ilev)
430     kmq3=km(igrid, ilev)*smq2(igrid, ilev) &
431     /sm(igrid, ilev)
432    
433     termq=0.E+0
434     termq3=0.E+0
435     termqm2=0.E+0
436     termq3m2=0.E+0
437    
438     tmp1=dt*2.E+0 *km(igrid, ilev)*m2(igrid, ilev)
439     tmp2=dt*2.E+0 *kmq3*m2(igrid, ilev)
440     termqm2=termqm2 &
441     +dt*2.E+0 *km(igrid, ilev)*m2(igrid, ilev) &
442     -dt*2.E+0 *kmq3*m2(igrid, ilev)
443     termq3m2=termq3m2 &
444     +dt*2.E+0 *kmq3*m2(igrid, ilev)
445    
446     termq=termq &
447     -dt*2.E+0 *kn(igrid, ilev)*n2(igrid, ilev) &
448     +dt*2.E+0 *knq3*n2(igrid, ilev)
449     termq3=termq3 &
450     -dt*2.E+0 *knq3*n2(igrid, ilev)
451    
452     termq3=termq3 &
453     -dt*2.E+0 *q(igrid, ilev)**3 / (b1*long(igrid, ilev))
454    
455     ! resolution stationnaire couplee avec le gradient de vitesse local
456    
457     ! on cherche le cisaillement qui annule l'equation de q^2
458     ! supposee en q3
459    
460     tmp1=termq+termq3
461     tmp2=termqm2+termq3m2
462     m2cstat=m2(igrid, ilev) &
463     -(tmp1+tmp2)/(dt*2.E+0*km(igrid, ilev))
464     mcstat=sqrt(m2cstat)
465    
466     ! puis on ecrit la valeur de q qui annule l'equation de m
467     ! supposee en q3
468    
469     IF (ilev.eq.2) THEN
470     kmcstat=1.E+0 / mcstat &
471     *( unsdz(igrid, ilev)*kmpre(igrid, ilev+1) &
472     *mpre(igrid, ilev+1) &
473     +unsdz(igrid, ilev-1) &
474     *cd(igrid) &
475     *( sqrt(u(igrid, 3)**2+v(igrid, 3)**2) &
476     -mcstat/unsdzdec(igrid, ilev) &
477     -mpre(igrid, ilev+1)/unsdzdec(igrid, ilev+1) )**2) &
478     /( unsdz(igrid, ilev)+unsdz(igrid, ilev-1) )
479     ELSE
480     kmcstat=1.E+0 / mcstat &
481     *( unsdz(igrid, ilev)*kmpre(igrid, ilev+1) &
482     *mpre(igrid, ilev+1) &
483     +unsdz(igrid, ilev-1)*kmpre(igrid, ilev-1) &
484     *mpre(igrid, ilev-1) ) &
485     /( unsdz(igrid, ilev)+unsdz(igrid, ilev-1) )
486     ENDIF
487     tmp2=kmcstat &
488     /( sm(igrid, ilev)/q2(igrid, ilev) ) &
489     /long(igrid, ilev)
490     qcstat=tmp2**(1.E+0/3.E+0)
491     q2cstat=qcstat**2
492    
493     ! choix de la solution finale
494    
495     q(igrid, ilev)=qcstat
496     q2(igrid, ilev)=q2cstat
497     m(igrid, ilev)=mcstat
498     m2(igrid, ilev)=m2cstat
499    
500     ! pour des raisons simples q2 est minore
501    
502     IF (q2(igrid, ilev).lt.q2min) THEN
503     q2(igrid, ilev)=q2min
504     q(igrid, ilev)=sqrt(q2min)
505     ENDIF
506    
507     ! calcul final de kn et km
508    
509     gn=-long(igrid, ilev)**2 / q2(igrid, ilev) &
510     * n2(igrid, ilev)
511     IF (gn.lt.gnmin) gn=gnmin
512     IF (gn.gt.gnmax) gn=gnmax
513     sn(igrid, ilev)=cn1/(1.E+0 +cn2*gn)
514     sm(igrid, ilev)= &
515     (cm1+cm2*gn) &
516     /( (1.E+0 +cm3*gn)*(1.E+0 +cm4*gn) )
517     kn(igrid, ilev)=long(igrid, ilev)*q(igrid, ilev) &
518     *sn(igrid, ilev)
519     km(igrid, ilev)=long(igrid, ilev)*q(igrid, ilev) &
520     *sm(igrid, ilev)
521     end DO
522     end DO
523    
524     DO igrid=1, ngrid
525     kn(igrid, 1)=knmin
526     km(igrid, 1)=kmmin
527     q2(igrid, nlev)=q2(igrid, nlev-1)
528     q(igrid, nlev)=q(igrid, nlev-1)
529     kn(igrid, nlev)=kn(igrid, nlev-1)
530     km(igrid, nlev)=km(igrid, nlev-1)
531     ENDDO
532    
533     ! CALCUL DE LA DIFFUSION VERTICALE DE Q2
534     if (1.eq.1) then
535     do ilev=2, klev-1
536     sss=sss+plev(1, ilev-1)-plev(1, ilev+1)
537     sssq=sssq+(plev(1, ilev-1)-plev(1, ilev+1))*q2(1, ilev)
538     enddo
539     do ilev=2, klev-1
540     sss=sss+plev(1, ilev-1)-plev(1, ilev+1)
541     sssq=sssq+(plev(1, ilev-1)-plev(1, ilev+1))*q2(1, ilev)
542     enddo
543     print*, 'Q2moy apres', sssq/sss
544    
545     do ilev=1, nlev
546     do igrid=1, ngrid
547     q2(igrid, ilev)=max(q2(igrid, ilev), q2min)
548     q(igrid, ilev)=sqrt(q2(igrid, ilev))
549    
550     ! calcul final de kn et km
551    
552     gn=-long(igrid, ilev)**2 / q2(igrid, ilev) &
553     * n2(igrid, ilev)
554     IF (gn.lt.gnmin) gn=gnmin
555     IF (gn.gt.gnmax) gn=gnmax
556     sn(igrid, ilev)=cn1/(1.E+0 +cn2*gn)
557     sm(igrid, ilev)= &
558     (cm1+cm2*gn) &
559     /( (1.E+0 +cm3*gn)*(1.E+0 +cm4*gn) )
560     ! Correction pour les couches stables.
561     ! Schema repris de JHoltzlag Boville, lui meme venant de...
562    
563     if (1.eq.1) then
564     snstable=1.-zlev(igrid, ilev) &
565     /(700.*max(ustar(igrid), 0.0001))
566     snstable=1.-zlev(igrid, ilev)/400.
567     snstable=max(snstable, 0.)
568     snstable=snstable*snstable
569    
570     if (sn(igrid, ilev).lt.snstable) then
571     sn(igrid, ilev)=snstable
572     snq2(igrid, ilev)=0.
573     endif
574    
575     if (sm(igrid, ilev).lt.snstable) then
576     sm(igrid, ilev)=snstable
577     smq2(igrid, ilev)=0.
578     endif
579     endif
580    
581     ! sn : coefficient de stabilite pour n
582     kn(igrid, ilev)=long(igrid, ilev)*q(igrid, ilev) &
583     *sn(igrid, ilev)
584     km(igrid, ilev)=long(igrid, ilev)*q(igrid, ilev)
585     enddo
586     enddo
587     endif
588    
589     END SUBROUTINE vdif_kcay
590    
591     end module vdif_kcay_m

  ViewVC Help
Powered by ViewVC 1.1.21