/[lmdze]/trunk/libf/phylmd/yamada.f
ViewVC logotype

Contents of /trunk/libf/phylmd/yamada.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3 - (show annotations)
Wed Feb 27 13:16:39 2008 UTC (16 years, 2 months ago) by guez
File size: 5592 byte(s)
Initial import
1 !
2 ! $Header: /home/cvsroot/LMDZ4/libf/phylmd/yamada.F,v 1.1 2004/06/22 11:45:36 lmdzadmin Exp $
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 use dimens_m
8 use dimphy
9 IMPLICIT NONE
10 c.......................................................................
11 c.......................................................................
12 c
13 c dt : pas de temps
14 c g : g
15 c zlev : altitude a chaque niveau (interface inferieure de la couche
16 c de meme indice)
17 c zlay : altitude au centre de chaque couche
18 c u,v : vitesse au centre de chaque couche
19 c (en entree : la valeur au debut du pas de temps)
20 c teta : temperature potentielle au centre de chaque couche
21 c (en entree : la valeur au debut du pas de temps)
22 c cd : cdrag
23 c (en entree : la valeur au debut du pas de temps)
24 c q2 : $q^2$ au bas de chaque couche
25 c (en entree : la valeur au debut du pas de temps)
26 c (en sortie : la valeur a la fin du pas de temps)
27 c km : diffusivite turbulente de quantite de mouvement (au bas de chaque
28 c couche)
29 c (en sortie : la valeur a la fin du pas de temps)
30 c kn : diffusivite turbulente des scalaires (au bas de chaque couche)
31 c (en sortie : la valeur a la fin du pas de temps)
32 c
33 c.......................................................................
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
99 c Correction d'un bug sauvage a verifier.
100 c 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
125 c 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
154 c(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

  ViewVC Help
Powered by ViewVC 1.1.21