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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 12 - (show annotations)
Mon Jul 21 16:05:07 2008 UTC (15 years, 9 months ago) by guez
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 !
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 REAL, intent(in):: dt
42 real g,rconst
43 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