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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 17 - (show annotations)
Tue Aug 5 13:31:32 2008 UTC (15 years, 9 months ago) by guez
File size: 5591 byte(s)
Created rule for "compare_sampl_*" files in
"Documentation/Manuel_LMDZE.texfol/Graphiques/GNUmakefile".

Extracted "qcheck", "radiornpb", "minmaxqfi" into separate files.

Read pressure coordinate of ozone coefficients once per run instead of
every day.

Added some "intent" attributes.

Added argument "nq" to "ini_histday". Replaced calls to "gr_fi_ecrit"
by calls to "gr_phy_write_2d". "Sigma_O3_Royer" is written to
"histday.nc" only if "nq >= 4". Moved "ini_histrac" to module
"ini_hist".

Compute "zmasse" in "physiq", pass it to "phytrac".

Removed computations of "pftsol*" and "ppsrf*" in "phytrac".

Do not use variable "rg" from module "YOMCST" in "TLIFT".

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,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 g : g
14 c zlev : altitude a chaque niveau (interface inferieure de la couche
15 c de meme indice)
16 c zlay : altitude au centre de chaque couche
17 c u,v : vitesse au centre de chaque couche
18 c (en entree : la valeur au debut du pas de temps)
19 c teta : temperature potentielle au centre de chaque couche
20 c (en entree : la valeur au debut du pas de temps)
21 c cd : cdrag
22 c (en entree : la valeur au debut du pas de temps)
23 c q2 : $q^2$ au bas de chaque couche
24 c (en entree : la valeur au debut du pas de temps)
25 c (en sortie : la valeur a la fin du pas de temps)
26 c km : diffusivite turbulente de quantite de mouvement (au bas de chaque
27 c couche)
28 c (en sortie : la valeur a la fin du pas de temps)
29 c kn : diffusivite turbulente des scalaires (au bas de chaque couche)
30 c (en sortie : la valeur a la fin du pas de temps)
31 c
32 c.......................................................................
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 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