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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 17 - (hide 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 guez 3 !
2     ! $Header: /home/cvsroot/LMDZ4/libf/phylmd/yamada.F,v 1.1 2004/06/22 11:45:36 lmdzadmin Exp $
3     !
4 guez 12 SUBROUTINE yamada(ngrid,g,rconst,plev,temp
5 guez 3 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 guez 17 REAL, intent(in):: g
34     real rconst
35 guez 3 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