/[lmdze]/trunk/Sources/phylmd/yamada4.f
ViewVC logotype

Annotation of /trunk/Sources/phylmd/yamada4.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 12 - (hide annotations)
Mon Jul 21 16:05:07 2008 UTC (15 years, 10 months ago) by guez
Original Path: trunk/libf/phylmd/yamada4.f
File size: 15564 byte(s)
-- Minor modification of input/output:

Created procedure "read_logic". Variables of module "logic" are read
by "read_logic" instead of "conf_gcm". Variable "offline" of module
"conf_gcm" is read from namelist instead of "*.def".

Deleted arguments "dtime", "co2_ppm_etat0", "solaire_etat0",
"tabcntr0" and local variables "radpas", "tab_cntrl" of
"phyetat0". "phyetat0" does not read "controle" in "startphy.nc" any
longer. "phyetat0" now reads global attribute "itau_phy" from
"startphy.nc". "phyredem" does not create variable "controle" in
"startphy.nc" any longer. "phyredem" now writes global attribute
"itau_phy" of "startphy.nc". Deleted argument "tabcntr0" of
"printflag". Removed diagnostic messages written by "printflag" for
comparison of the variable "controle" of "startphy.nc" and the
variables read from "*.def" or namelist input.

-- Removing unwanted functionality:

Removed variable "lunout" from module "iniprint", replaced everywhere
by standard output.

Removed case "ocean == 'couple'" in "clmain", "interfsurf_hq" and
"physiq". Removed procedure "interfoce_cpl".

-- Should not change anything at run time:

Automated creation of graphs in documentation. More documentation on
input files.

Converted Fortran files to free format: "phyredem.f90", "printflag.f90".

Split module "clesphy" into "clesphys" and "clesphys2".

Removed variables "conser", "leapf", "forward", "apphys", "apdiss" and
"statcl" from module "logic". Added arguments "conser" to "advect",
"leapf" to "integrd". Added local variables "forward", "leapf",
"apphys", "conser", "apdiss" in "leapfrog".

Added intent attributes.

Deleted arguments "dtime" of "phyredem", "pdtime" of "flxdtdq", "sh"
of "phytrac", "dt" of "yamada".

Deleted local variables "dtime", "co2_ppm_etat0", "solaire_etat0",
"length", "tabcntr0" in "physiq". Replaced all references to "dtime"
by references to "pdtphys".

1 guez 3 !
2     ! $Header: /home/cvsroot/LMDZ4/libf/phylmd/yamada4.F,v 1.1 2004/06/22 11:45:36 lmdzadmin Exp $
3     !
4     SUBROUTINE yamada4(ngrid,dt,g,rconst,plev,temp
5     s ,zlev,zlay,u,v,teta,cd,q2,km,kn,kq,ustar
6     s ,iflag_pbl)
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 iflag_pbl doit valoir entre 6 et 9
34     c l=6, on prend systematiquement une longueur d'equilibre
35     c iflag_pbl=6 : MY 2.0
36     c iflag_pbl=7 : MY 2.0.Fournier
37     c iflag_pbl=8 : MY 2.5
38     c iflag_pbl=9 : un test ?
39    
40     c.......................................................................
41 guez 12 REAL, intent(in):: dt
42     real g,rconst
43 guez 3 real plev(klon,klev+1),temp(klon,klev)
44     real ustar(klon)
45     real kmin,qmin,pblhmin(klon),coriol(klon)
46     REAL zlev(klon,klev+1)
47     REAL zlay(klon,klev)
48     REAL u(klon,klev)
49     REAL v(klon,klev)
50     REAL teta(klon,klev)
51     REAL cd(klon)
52     REAL q2(klon,klev+1),qpre
53     REAL unsdz(klon,klev)
54     REAL unsdzdec(klon,klev+1)
55    
56     REAL km(klon,klev+1)
57     REAL kmpre(klon,klev+1),tmp2
58     REAL mpre(klon,klev+1)
59     REAL kn(klon,klev+1)
60     REAL kq(klon,klev+1)
61     real ff(klon,klev+1),delta(klon,klev+1)
62     real aa(klon,klev+1),aa0,aa1
63     integer iflag_pbl,ngrid
64    
65    
66     integer nlay,nlev
67     PARAMETER (nlay=klev)
68     PARAMETER (nlev=klev+1)
69    
70     logical first
71     integer ipas
72     save first,ipas
73     data first,ipas/.true.,0/
74    
75    
76     integer ig,k
77    
78    
79     real ri,zrif,zalpha,zsm,zsn
80     real rif(klon,klev+1),sm(klon,klev+1),alpha(klon,klev)
81    
82     real m2(klon,klev+1),dz(klon,klev+1),zq,n2(klon,klev+1)
83     real dtetadz(klon,klev+1)
84     real m2cstat,mcstat,kmcstat
85     real l(klon,klev+1),l0(klon)
86     save l0
87    
88     real sq(klon),sqz(klon),zz(klon,klev+1)
89     integer iter
90    
91     real ric,rifc,b1,kap
92     save ric,rifc,b1,kap
93     data ric,rifc,b1,kap/0.195,0.191,16.6,0.4/
94    
95     real frif,falpha,fsm
96     real fl,zzz,zl0,zq2,zn2
97    
98     real rino(klon,klev+1),smyam(klon,klev),styam(klon,klev)
99     s ,lyam(klon,klev),knyam(klon,klev)
100     s ,w2yam(klon,klev),t2yam(klon,klev)
101     common/pbldiag/rino,smyam,styam,lyam,knyam,w2yam,t2yam
102    
103     frif(ri)=0.6588*(ri+0.1776-sqrt(ri*ri-0.3221*ri+0.03156))
104     falpha(ri)=1.318*(0.2231-ri)/(0.2341-ri)
105     fsm(ri)=1.96*(0.1912-ri)*(0.2341-ri)/((1.-ri)*(0.2231-ri))
106     fl(zzz,zl0,zq2,zn2)=
107     s max(min(l0(ig)*kap*zlev(ig,k)/(kap*zlev(ig,k)+l0(ig))
108     s ,0.5*sqrt(q2(ig,k))/sqrt(max(n2(ig,k),1.e-10))) ,1.)
109    
110     if (.not.(iflag_pbl.ge.6.and.iflag_pbl.le.9)) then
111     stop'probleme de coherence dans appel a MY'
112     endif
113    
114     ipas=ipas+1
115     if (0.eq.1.and.first) then
116     do ig=1,1000
117     ri=(ig-800.)/500.
118     if (ri.lt.ric) then
119     zrif=frif(ri)
120     else
121     zrif=rifc
122     endif
123     if(zrif.lt.0.16) then
124     zalpha=falpha(zrif)
125     zsm=fsm(zrif)
126     else
127     zalpha=1.12
128     zsm=0.085
129     endif
130     c print*,ri,rif,zalpha,zsm
131     enddo
132     endif
133    
134     c.......................................................................
135     c les increments verticaux
136     c.......................................................................
137     c
138     c!!!!! allerte !!!!!c
139     c!!!!! zlev n'est pas declare a nlev !!!!!c
140     c!!!!! ---->
141     DO ig=1,ngrid
142     zlev(ig,nlev)=zlay(ig,nlay)
143     & +( zlay(ig,nlay) - zlev(ig,nlev-1) )
144     ENDDO
145     c!!!!! <----
146     c!!!!! allerte !!!!!c
147     c
148     DO k=1,nlay
149     DO ig=1,ngrid
150     unsdz(ig,k)=1.E+0/(zlev(ig,k+1)-zlev(ig,k))
151     ENDDO
152     ENDDO
153     DO ig=1,ngrid
154     unsdzdec(ig,1)=1.E+0/(zlay(ig,1)-zlev(ig,1))
155     ENDDO
156     DO k=2,nlay
157     DO ig=1,ngrid
158     unsdzdec(ig,k)=1.E+0/(zlay(ig,k)-zlay(ig,k-1))
159     ENDDO
160     ENDDO
161     DO ig=1,ngrid
162     unsdzdec(ig,nlay+1)=1.E+0/(zlev(ig,nlay+1)-zlay(ig,nlay))
163     ENDDO
164     c
165     c.......................................................................
166    
167     do k=2,klev
168     do ig=1,ngrid
169     dz(ig,k)=zlay(ig,k)-zlay(ig,k-1)
170     m2(ig,k)=((u(ig,k)-u(ig,k-1))**2+(v(ig,k)-v(ig,k-1))**2)
171     s /(dz(ig,k)*dz(ig,k))
172     dtetadz(ig,k)=(teta(ig,k)-teta(ig,k-1))/dz(ig,k)
173     n2(ig,k)=g*2.*dtetadz(ig,k)/(teta(ig,k-1)+teta(ig,k))
174     c n2(ig,k)=0.
175     ri=n2(ig,k)/max(m2(ig,k),1.e-10)
176     if (ri.lt.ric) then
177     rif(ig,k)=frif(ri)
178     else
179     rif(ig,k)=rifc
180     endif
181     if(rif(ig,k).lt.0.16) then
182     alpha(ig,k)=falpha(rif(ig,k))
183     sm(ig,k)=fsm(rif(ig,k))
184     else
185     alpha(ig,k)=1.12
186     sm(ig,k)=0.085
187     endif
188     zz(ig,k)=b1*m2(ig,k)*(1.-rif(ig,k))*sm(ig,k)
189     c print*,'RIF L=',k,rif(ig,k),ri*alpha(ig,k)
190    
191    
192     enddo
193     enddo
194    
195    
196     c====================================================================
197     c Au premier appel, on determine l et q2 de facon iterative.
198     c iterration pour determiner la longueur de melange
199    
200    
201     if (first.or.iflag_pbl.eq.6) then
202     do ig=1,ngrid
203     l0(ig)=10.
204     enddo
205     do k=2,klev-1
206     do ig=1,ngrid
207     l(ig,k)=l0(ig)*kap*zlev(ig,k)/(kap*zlev(ig,k)+l0(ig))
208     enddo
209     enddo
210    
211     do iter=1,10
212     do ig=1,ngrid
213     sq(ig)=1.e-10
214     sqz(ig)=1.e-10
215     enddo
216     do k=2,klev-1
217     do ig=1,ngrid
218     q2(ig,k)=l(ig,k)**2*zz(ig,k)
219     l(ig,k)=fl(zlev(ig,k),l0(ig),q2(ig,k),n2(ig,k))
220     zq=sqrt(q2(ig,k))
221     sqz(ig)=sqz(ig)+zq*zlev(ig,k)*(zlay(ig,k)-zlay(ig,k-1))
222     sq(ig)=sq(ig)+zq*(zlay(ig,k)-zlay(ig,k-1))
223     enddo
224     enddo
225     do ig=1,ngrid
226     l0(ig)=0.2*sqz(ig)/sq(ig)
227     c l0(ig)=30.
228     enddo
229     c print*,'ITER=',iter,' L0=',l0
230    
231     enddo
232    
233     c print*,'Fin de l initialisation de q2 et l0'
234    
235     endif ! first
236    
237     c====================================================================
238     c Calcul de la longueur de melange.
239     c====================================================================
240    
241     c Mise a jour de l0
242     do ig=1,ngrid
243     sq(ig)=1.e-10
244     sqz(ig)=1.e-10
245     enddo
246     do k=2,klev-1
247     do ig=1,ngrid
248     zq=sqrt(q2(ig,k))
249     sqz(ig)=sqz(ig)+zq*zlev(ig,k)*(zlay(ig,k)-zlay(ig,k-1))
250     sq(ig)=sq(ig)+zq*(zlay(ig,k)-zlay(ig,k-1))
251     enddo
252     enddo
253     do ig=1,ngrid
254     l0(ig)=0.2*sqz(ig)/sq(ig)
255     c l0(ig)=30.
256     enddo
257     c print*,'ITER=',iter,' L0=',l0
258     c calcul de l(z)
259     do k=2,klev
260     do ig=1,ngrid
261     l(ig,k)=fl(zlev(ig,k),l0(ig),q2(ig,k),n2(ig,k))
262     if(first) then
263     q2(ig,k)=l(ig,k)**2*zz(ig,k)
264     endif
265     enddo
266     enddo
267    
268     c====================================================================
269     c Yamada 2.0
270     c====================================================================
271     if (iflag_pbl.eq.6) then
272    
273     do k=2,klev
274     do ig=1,ngrid
275     q2(ig,k)=l(ig,k)**2*zz(ig,k)
276     enddo
277     enddo
278    
279    
280     else if (iflag_pbl.eq.7) then
281     c====================================================================
282     c Yamada 2.Fournier
283     c====================================================================
284    
285     c Calcul de l, km, au pas precedent
286     do k=2,klev
287     do ig=1,ngrid
288     c print*,'SMML=',sm(ig,k),l(ig,k)
289     delta(ig,k)=q2(ig,k)/(l(ig,k)**2*sm(ig,k))
290     kmpre(ig,k)=l(ig,k)*sqrt(q2(ig,k))*sm(ig,k)
291     mpre(ig,k)=sqrt(m2(ig,k))
292     c print*,'0L=',k,l(ig,k),delta(ig,k),km(ig,k)
293     enddo
294     enddo
295    
296     do k=2,klev-1
297     do ig=1,ngrid
298     m2cstat=max(alpha(ig,k)*n2(ig,k)+delta(ig,k)/b1,1.e-12)
299     mcstat=sqrt(m2cstat)
300    
301     c print*,'M2 L=',k,mpre(ig,k),mcstat
302     c
303     c -----{puis on ecrit la valeur de q qui annule l'equation de m
304     c supposee en q3}
305     c
306     IF (k.eq.2) THEN
307     kmcstat=1.E+0 / mcstat
308     & *( unsdz(ig,k)*kmpre(ig,k+1)
309     & *mpre(ig,k+1)
310     & +unsdz(ig,k-1)
311     & *cd(ig)
312     & *( sqrt(u(ig,3)**2+v(ig,3)**2)
313     & -mcstat/unsdzdec(ig,k)
314     & -mpre(ig,k+1)/unsdzdec(ig,k+1) )**2)
315     & /( unsdz(ig,k)+unsdz(ig,k-1) )
316     ELSE
317     kmcstat=1.E+0 / mcstat
318     & *( unsdz(ig,k)*kmpre(ig,k+1)
319     & *mpre(ig,k+1)
320     & +unsdz(ig,k-1)*kmpre(ig,k-1)
321     & *mpre(ig,k-1) )
322     & /( unsdz(ig,k)+unsdz(ig,k-1) )
323     ENDIF
324     c print*,'T2 L=',k,tmp2
325     tmp2=kmcstat
326     & /( sm(ig,k)/q2(ig,k) )
327     & /l(ig,k)
328     q2(ig,k)=max(tmp2,1.e-12)**(2./3.)
329     c print*,'Q2 L=',k,q2(ig,k)
330     c
331     enddo
332     enddo
333    
334     else if (iflag_pbl.ge.8) then
335     c====================================================================
336     c Yamada 2.5 a la Didi
337     c====================================================================
338    
339    
340     c Calcul de l, km, au pas precedent
341     do k=2,klev
342     do ig=1,ngrid
343     c print*,'SMML=',sm(ig,k),l(ig,k)
344     delta(ig,k)=q2(ig,k)/(l(ig,k)**2*sm(ig,k))
345     if (delta(ig,k).lt.1.e-20) then
346     c print*,'ATTENTION L=',k,' Delta=',delta(ig,k)
347     delta(ig,k)=1.e-20
348     endif
349     km(ig,k)=l(ig,k)*sqrt(q2(ig,k))*sm(ig,k)
350     aa0=
351     s (m2(ig,k)-alpha(ig,k)*n2(ig,k)-delta(ig,k)/b1)
352     aa1=
353     s (m2(ig,k)*(1.-rif(ig,k))-delta(ig,k)/b1)
354     c abder print*,'AA L=',k,aa0,aa1,aa1/max(m2(ig,k),1.e-20)
355     aa(ig,k)=aa1*dt/(delta(ig,k)*l(ig,k))
356     c print*,'0L=',k,l(ig,k),delta(ig,k),km(ig,k)
357     qpre=sqrt(q2(ig,k))
358     if (iflag_pbl.eq.8 ) then
359     if (aa(ig,k).gt.0.) then
360     q2(ig,k)=(qpre+aa(ig,k)*qpre*qpre)**2
361     else
362     q2(ig,k)=(qpre/(1.-aa(ig,k)*qpre))**2
363     endif
364     else ! iflag_pbl=9
365     if (aa(ig,k)*qpre.gt.0.9) then
366     q2(ig,k)=(qpre*10.)**2
367     else
368     q2(ig,k)=(qpre/(1.-aa(ig,k)*qpre))**2
369     endif
370     endif
371     q2(ig,k)=min(max(q2(ig,k),1.e-10),1.e4)
372     c print*,'Q2 L=',k,q2(ig,k),qpre*qpre
373     enddo
374     enddo
375    
376     endif ! Fin du cas 8
377    
378     c print*,'OK8'
379    
380     c====================================================================
381     c Calcul des coefficients de mélange
382     c====================================================================
383     do k=2,klev
384     c print*,'k=',k
385     do ig=1,ngrid
386     cabde print*,'KML=',l(ig,k),q2(ig,k),sm(ig,k)
387     zq=sqrt(q2(ig,k))
388     km(ig,k)=l(ig,k)*zq*sm(ig,k)
389     kn(ig,k)=km(ig,k)*alpha(ig,k)
390     kq(ig,k)=l(ig,k)*zq*0.2
391     c print*,'KML=',km(ig,k),kn(ig,k)
392     enddo
393     enddo
394    
395     c Traitement des cas noctrunes avec l'introduction d'une longueur
396     c minilale.
397    
398     c====================================================================
399     c Traitement particulier pour les cas tres stables.
400     c D'apres Holtslag Boville.
401    
402     print*,'YAMADA4 0'
403    
404     do ig=1,ngrid
405     coriol(ig)=1.e-4
406     pblhmin(ig)=0.07*ustar(ig)/max(abs(coriol(ig)),2.546e-5)
407     enddo
408    
409     print*,'pblhmin ',pblhmin
410     CTest a remettre 21 11 02
411     c test abd 13 05 02 if(0.eq.1) then
412     if(1.eq.1) then
413     do k=2,klev
414     do ig=1,klon
415     if (teta(ig,2).gt.teta(ig,1)) then
416     qmin=ustar(ig)*(max(1.-zlev(ig,k)/pblhmin(ig),0.))**2
417     kmin=kap*zlev(ig,k)*qmin
418     else
419     kmin=-1. ! kmin n'est utilise que pour les SL stables.
420     endif
421     if (kn(ig,k).lt.kmin.or.km(ig,k).lt.kmin) then
422     c print*,'Seuil min Km K=',k,kmin,km(ig,k),kn(ig,k)
423     c s ,sqrt(q2(ig,k)),pblhmin(ig),qmin/sm(ig,k)
424     kn(ig,k)=kmin
425     km(ig,k)=kmin
426     kq(ig,k)=kmin
427     c la longueur de melange est suposee etre l= kap z
428     c K=l q Sm d'ou q2=(K/l Sm)**2
429     q2(ig,k)=(qmin/sm(ig,k))**2
430     endif
431     enddo
432     enddo
433     endif
434    
435     print*,'YAMADA4 1'
436     c Diagnostique pour stokage
437    
438     rino=rif
439     smyam(:,1:klev)=sm(:,1:klev)
440     styam=sm(:,1:klev)*alpha(:,1:klev)
441     lyam(1:klon,1:klev)=l(:,1:klev)
442     knyam(1:klon,1:klev)=kn(:,1:klev)
443    
444     c Estimations de w'2 et T'2 d'apres Abdela et McFarlane
445    
446     if(1.eq.0)then
447     w2yam=q2(:,1:klev)*0.24
448     s +lyam(:,1:klev)*5.17*kn(:,1:klev)*n2(:,1:klev)
449     s /sqrt(q2(:,1:klev))
450    
451     t2yam=9.1*kn(:,1:klev)*dtetadz(:,1:klev)**2/sqrt(q2(:,1:klev))
452     s *lyam(:,1:klev)
453     endif
454    
455     c print*,'OKFIN'
456     first=.false.
457     return
458     end

  ViewVC Help
Powered by ViewVC 1.1.21