source: LMDZ4/trunk/libf/phylmd/yamada.F @ 594

Last change on this file since 594 was 541, checked in by lmdzadmin, 20 years ago

Convergence avec la version d'Olivia Coindreau incluant:

  • le offline
  • les thermiques
  • mellor & yamada dans la couche limite

LF

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 5.4 KB
Line 
1!
2! $Header$
3!
4      SUBROUTINE yamada(ngrid,dt,g,rconst,plev,temp
5     s   ,zlev,zlay,u,v,teta,cd,q2,km,kn,ustar
6     s   ,l_mix)
7      IMPLICIT NONE
8c.......................................................................
9#include "dimensions.h"
10#include "dimphy.h"
11c.......................................................................
12c
13c dt : pas de temps
14c g  : g
15c zlev : altitude a chaque niveau (interface inferieure de la couche
16c        de meme indice)
17c zlay : altitude au centre de chaque couche
18c u,v : vitesse au centre de chaque couche
19c       (en entree : la valeur au debut du pas de temps)
20c teta : temperature potentielle au centre de chaque couche
21c        (en entree : la valeur au debut du pas de temps)
22c cd : cdrag
23c      (en entree : la valeur au debut du pas de temps)
24c q2 : $q^2$ au bas de chaque couche
25c      (en entree : la valeur au debut du pas de temps)
26c      (en sortie : la valeur a la fin du pas de temps)
27c km : diffusivite turbulente de quantite de mouvement (au bas de chaque
28c      couche)
29c      (en sortie : la valeur a la fin du pas de temps)
30c kn : diffusivite turbulente des scalaires (au bas de chaque couche)
31c      (en sortie : la valeur a la fin du pas de temps)
32c
33c.......................................................................
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)
44      REAL km(klon,klev+1)
45      REAL kn(klon,klev+1)
46      integer l_mix,ngrid
47
48
49      integer nlay,nlev
50      PARAMETER (nlay=klev)
51      PARAMETER (nlev=klev+1)
52
53      logical first
54      save first
55      data first/.true./
56
57
58      integer ig,k
59
60      real ri,zrif,zalpha,zsm
61      real rif(klon,klev+1),sm(klon,klev+1),alpha(klon,klev)
62
63      real m2(klon,klev+1),dz(klon,klev+1),zq,n2(klon,klev+1)
64      real l(klon,klev+1),l0(klon)
65
66      real sq(klon),sqz(klon),zz(klon,klev+1)
67      integer iter
68
69      real ric,rifc,b1,kap
70      save ric,rifc,b1,kap
71      data ric,rifc,b1,kap/0.195,0.191,16.6,0.3/
72
73      real frif,falpha,fsm
74
75      frif(ri)=0.6588*(ri+0.1776-sqrt(ri*ri-0.3221*ri+0.03156))
76      falpha(ri)=1.318*(0.2231-ri)/(0.2341-ri)
77      fsm(ri)=1.96*(0.1912-ri)*(0.2341-ri)/((1.-ri)*(0.2231-ri))
78
79      if (0.eq.1.and.first) then
80      do ig=1,1000
81         ri=(ig-800.)/500.
82         if (ri.lt.ric) then
83            zrif=frif(ri)
84         else
85            zrif=rifc
86         endif
87         if(zrif.lt.0.16) then
88            zalpha=falpha(zrif)
89            zsm=fsm(zrif)
90         else
91            zalpha=1.12
92            zsm=0.085
93         endif
94         print*,ri,rif,zalpha,zsm
95      enddo
96      first=.false.
97      endif
98
99c  Correction d'un bug sauvage a verifier.
100c      do k=2,nlev
101      do k=2,nlay
102                                                          do ig=1,ngrid
103         dz(ig,k)=zlay(ig,k)-zlay(ig,k-1)
104         m2(ig,k)=((u(ig,k)-u(ig,k-1))**2+(v(ig,k)-v(ig,k-1))**2)
105     s             /(dz(ig,k)*dz(ig,k))
106         n2(ig,k)=g*2.*(teta(ig,k)-teta(ig,k-1))
107     s            /(teta(ig,k-1)+teta(ig,k))  /dz(ig,k)
108         ri=n2(ig,k)/max(m2(ig,k),1.e-10)
109         if (ri.lt.ric) then
110            rif(ig,k)=frif(ri)
111         else
112            rif(ig,k)=rifc
113         endif
114         if(rif(ig,k).lt.0.16) then
115            alpha(ig,k)=falpha(rif(ig,k))
116            sm(ig,k)=fsm(rif(ig,k))
117         else
118            alpha(ig,k)=1.12
119            sm(ig,k)=0.085
120         endif
121         zz(ig,k)=b1*m2(ig,k)*(1.-rif(ig,k))*sm(ig,k)
122                                                          enddo
123      enddo
124
125c iterration pour determiner la longueur de melange
126
127                                                          do ig=1,ngrid
128      l0(ig)=100.
129                                                          enddo
130      do k=2,klev-1
131                                                          do ig=1,ngrid
132        l(ig,k)=l0(ig)*kap*zlev(ig,k)/(kap*zlev(ig,k)+l0(ig))
133                                                          enddo
134      enddo
135
136      do iter=1,10
137                                                          do ig=1,ngrid
138         sq(ig)=1.e-10
139         sqz(ig)=1.e-10
140                                                          enddo
141         do k=2,klev-1
142                                                          do ig=1,ngrid
143           q2(ig,k)=l(ig,k)**2*zz(ig,k)
144           l(ig,k)=min(l0(ig)*kap*zlev(ig,k)/(kap*zlev(ig,k)+l0(ig))
145     s     ,0.5*sqrt(q2(ig,k))/sqrt(max(n2(ig,k),1.e-10)))
146           zq=sqrt(q2(ig,k))
147           sqz(ig)=sqz(ig)+zq*zlev(ig,k)*(zlay(ig,k)-zlay(ig,k-1))
148           sq(ig)=sq(ig)+zq*(zlay(ig,k)-zlay(ig,k-1))
149                                                          enddo
150         enddo
151                                                          do ig=1,ngrid
152         l0(ig)=0.2*sqz(ig)/sq(ig)
153                                                          enddo
154c(abd 3 5 2)         print*,'ITER=',iter,'  L0=',l0
155
156      enddo
157
158      do k=2,klev
159                                                          do ig=1,ngrid
160         l(ig,k)=min(l0(ig)*kap*zlev(ig,k)/(kap*zlev(ig,k)+l0(ig))
161     s     ,0.5*sqrt(q2(ig,k))/sqrt(max(n2(ig,k),1.e-10)))
162         q2(ig,k)=l(ig,k)**2*zz(ig,k)
163         km(ig,k)=l(ig,k)*sqrt(q2(ig,k))*sm(ig,k)
164         kn(ig,k)=km(ig,k)*alpha(ig,k)
165                                                          enddo
166      enddo
167
168      return
169      end
Note: See TracBrowser for help on using the repository browser.