source: LMDZ4/branches/LMDZ4_par_0/libf/phylmd/vdif_kcay.F @ 1566

Last change on this file since 1566 was 634, checked in by Laurent Fairhead, 20 years ago

Modifications faites à la physique pour la rendre parallele YM
Une branche de travail LMDZ4_par_0 a été créée provisoirement afin de tester
les modifs pleinement avant leurs inclusions dans le tronc principal
LF

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