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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 10 - (show annotations)
Fri Apr 18 14:45:53 2008 UTC (16 years ago) by guez
File size: 35964 byte(s)
Added NetCDF directory "/home/guez/include" in "g95.mk" and
"nag_tools.mk".

Added some "intent" attributes in "PVtheta", "advtrac", "caladvtrac",
"calfis", "diagedyn", "dissip", "vlspltqs", "aeropt", "ajsec",
"calltherm", "clmain", "cltrac", "cltracrn", "concvl", "conema3",
"conflx", "fisrtilp", "newmicro", "nuage", "diagcld1", "diagcld2",
"drag_noro", "lift_noro", "SUGWD", "physiq", "phytrac", "radlwsw", "thermcell".

Removed the case "ierr == 0" in "abort_gcm"; moved call to "histclo"
and messages for end of run from "abort_gcm" to "gcm"; replaced call
to "abort_gcm" in "leapfrog" by exit from outer loop.

In "calfis": removed argument "pp" and variable "unskap"; changed
"pksurcp" from scalar to rank 2; use "pressure_var"; rewrote
computation of "zplev", "zplay", "ztfi", "pcvgt" using "dyn_phy";
added computation of "pls".

Removed unused variable in "dynredem0".

In "exner_hyb": changed "dellta" from scalar to rank 1; replaced call
to "ssum" by call to "sum"; removed variables "xpn" and "xps";
replaced some loops by array expressions.

In "leapfrog": use "pressure_var"; deleted variables "p", "longcles".

Converted common blocks "YOECUMF", "YOEGWD" to modules.

Removed argument "pplay" in "cvltr", "diagetpq", "nflxtr".

Created module "raddimlw" from include file "raddimlw.h".

Corrected call to "new_unit" in "test_disvert".

1 SUBROUTINE thermcell(ngrid,nlay,ptimestep
2 s ,pplay,pplev,pphi
3 s ,pu,pv,pt,po
4 s ,pduadj,pdvadj,pdtadj,pdoadj
5 s ,fm0,entr0
6 c s ,pu_therm,pv_therm
7 s ,r_aspect,l_mix,w2di,tho)
8
9 use dimens_m
10 use dimphy
11 use YOMCST
12 IMPLICIT NONE
13
14 c=======================================================================
15 c
16 c Calcul du transport verticale dans la couche limite en presence
17 c de "thermiques" explicitement representes
18 c
19 c Réécriture à partir d'un listing papier à Habas, le 14/02/00
20 c
21 c le thermique est supposé homogène et dissipé par mélange avec
22 c son environnement. la longueur l_mix contrôle l'efficacité du
23 c mélange
24 c
25 c Le calcul du transport des différentes espèces se fait en prenant
26 c en compte:
27 c 1. un flux de masse montant
28 c 2. un flux de masse descendant
29 c 3. un entrainement
30 c 4. un detrainement
31 c
32 c=======================================================================
33
34 c-----------------------------------------------------------------------
35 c declarations:
36 c -------------
37
38
39 c arguments:
40 c ----------
41
42 INTEGER ngrid,nlay,w2di,tho
43 real ptimestep,l_mix,r_aspect
44 REAL pt(ngrid,nlay),pdtadj(ngrid,nlay)
45 REAL pu(ngrid,nlay),pduadj(ngrid,nlay)
46 REAL pv(ngrid,nlay),pdvadj(ngrid,nlay)
47 REAL po(ngrid,nlay),pdoadj(ngrid,nlay)
48 REAL, intent(in):: pplay(ngrid,nlay)
49 real, intent(in):: pplev(ngrid,nlay+1)
50 real pphi(ngrid,nlay)
51
52 integer idetr
53 save idetr
54 data idetr/3/
55
56 c local:
57 c ------
58
59 INTEGER ig,k,l,lmaxa(klon),lmix(klon)
60 real zsortie1d(klon)
61 c CR: on remplace lmax(klon,klev+1)
62 INTEGER lmax(klon),lmin(klon),lentr(klon)
63 real linter(klon)
64 real zmix(klon), fracazmix(klon)
65 c RC
66 real zmax(klon),zw,zz,zw2(klon,klev+1),ztva(klon,klev),zzz
67
68 real zlev(klon,klev+1),zlay(klon,klev)
69 REAL zh(klon,klev),zdhadj(klon,klev)
70 REAL ztv(klon,klev)
71 real zu(klon,klev),zv(klon,klev),zo(klon,klev)
72 REAL wh(klon,klev+1)
73 real wu(klon,klev+1),wv(klon,klev+1),wo(klon,klev+1)
74 real zla(klon,klev+1)
75 real zwa(klon,klev+1)
76 real zld(klon,klev+1)
77 real zwd(klon,klev+1)
78 real zsortie(klon,klev)
79 real zva(klon,klev)
80 real zua(klon,klev)
81 real zoa(klon,klev)
82
83 real zha(klon,klev)
84 real wa_moy(klon,klev+1)
85 real fraca(klon,klev+1)
86 real fracc(klon,klev+1)
87 real zf,zf2
88 real thetath2(klon,klev),wth2(klon,klev)
89 common/comtherm/thetath2,wth2
90
91 real count_time
92 integer isplit,nsplit,ialt
93 parameter (nsplit=10)
94 data isplit/0/
95 save isplit
96
97 logical sorties
98 real rho(klon,klev),rhobarz(klon,klev+1),masse(klon,klev)
99 real zpspsk(klon,klev)
100
101 c real wmax(klon,klev),wmaxa(klon)
102 real wmax(klon),wmaxa(klon)
103 real wa(klon,klev,klev+1)
104 real wd(klon,klev+1)
105 real larg_part(klon,klev,klev+1)
106 real fracd(klon,klev+1)
107 real xxx(klon,klev+1)
108 real larg_cons(klon,klev+1)
109 real larg_detr(klon,klev+1)
110 real fm0(klon,klev+1),entr0(klon,klev),detr(klon,klev)
111 real pu_therm(klon,klev),pv_therm(klon,klev)
112 real fm(klon,klev+1),entr(klon,klev)
113 real fmc(klon,klev+1)
114
115 cCR:nouvelles variables
116 real f_star(klon,klev+1),entr_star(klon,klev)
117 real entr_star_tot(klon),entr_star2(klon)
118 real f(klon), f0(klon)
119 real zlevinter(klon)
120 logical first
121 data first /.false./
122 save first
123 cRC
124
125 character*2 str2
126 character*10 str10
127
128 LOGICAL vtest(klon),down
129
130 EXTERNAL SCOPY
131
132 integer ncorrec,ll
133 save ncorrec
134 data ncorrec/0/
135
136 c
137 c-----------------------------------------------------------------------
138 c initialisation:
139 c ---------------
140 c
141 sorties=.true.
142 IF(ngrid.NE.klon) THEN
143 PRINT*
144 PRINT*,'STOP dans convadj'
145 PRINT*,'ngrid =',ngrid
146 PRINT*,'klon =',klon
147 ENDIF
148 c
149 c-----------------------------------------------------------------------
150 c incrementation eventuelle de tendances precedentes:
151 c ---------------------------------------------------
152
153 print*,'0 OK convect8'
154
155 DO 1010 l=1,nlay
156 DO 1015 ig=1,ngrid
157 zpspsk(ig,l)=(pplay(ig,l)/pplev(ig,1))**RKAPPA
158 zh(ig,l)=pt(ig,l)/zpspsk(ig,l)
159 zu(ig,l)=pu(ig,l)
160 zv(ig,l)=pv(ig,l)
161 zo(ig,l)=po(ig,l)
162 ztv(ig,l)=zh(ig,l)*(1.+0.61*zo(ig,l))
163 1015 CONTINUE
164 1010 CONTINUE
165
166 print*,'1 OK convect8'
167 c --------------------
168 c
169 c
170 c + + + + + + + + + + +
171 c
172 c
173 c wa, fraca, wd, fracd -------------------- zlev(2), rhobarz
174 c wh,wt,wo ...
175 c
176 c + + + + + + + + + + + zh,zu,zv,zo,rho
177 c
178 c
179 c -------------------- zlev(1)
180 c \\\\\\\\\\\\\\\\\\\\
181 c
182 c
183
184 c-----------------------------------------------------------------------
185 c Calcul des altitudes des couches
186 c-----------------------------------------------------------------------
187
188 do l=2,nlay
189 do ig=1,ngrid
190 zlev(ig,l)=0.5*(pphi(ig,l)+pphi(ig,l-1))/RG
191 enddo
192 enddo
193 do ig=1,ngrid
194 zlev(ig,1)=0.
195 zlev(ig,nlay+1)=(2.*pphi(ig,klev)-pphi(ig,klev-1))/RG
196 enddo
197 do l=1,nlay
198 do ig=1,ngrid
199 zlay(ig,l)=pphi(ig,l)/RG
200 enddo
201 enddo
202
203 c print*,'2 OK convect8'
204 c-----------------------------------------------------------------------
205 c Calcul des densites
206 c-----------------------------------------------------------------------
207
208 do l=1,nlay
209 do ig=1,ngrid
210 rho(ig,l)=pplay(ig,l)/(zpspsk(ig,l)*RD*zh(ig,l))
211 enddo
212 enddo
213
214 do l=2,nlay
215 do ig=1,ngrid
216 rhobarz(ig,l)=0.5*(rho(ig,l)+rho(ig,l-1))
217 enddo
218 enddo
219
220 do k=1,nlay
221 do l=1,nlay+1
222 do ig=1,ngrid
223 wa(ig,k,l)=0.
224 enddo
225 enddo
226 enddo
227
228 c print*,'3 OK convect8'
229 c------------------------------------------------------------------
230 c Calcul de w2, quarre de w a partir de la cape
231 c a partir de w2, on calcule wa, vitesse de l'ascendance
232 c
233 c ATTENTION: Dans cette version, pour cause d'economie de memoire,
234 c w2 est stoke dans wa
235 c
236 c ATTENTION: dans convect8, on n'utilise le calcule des wa
237 c independants par couches que pour calculer l'entrainement
238 c a la base et la hauteur max de l'ascendance.
239 c
240 c Indicages:
241 c l'ascendance provenant du niveau k traverse l'interface l avec
242 c une vitesse wa(k,l).
243 c
244 c --------------------
245 c
246 c + + + + + + + + + +
247 c
248 c wa(k,l) ---- -------------------- l
249 c /\
250 c /||\ + + + + + + + + + +
251 c ||
252 c || --------------------
253 c ||
254 c || + + + + + + + + + +
255 c ||
256 c || --------------------
257 c ||__
258 c |___ + + + + + + + + + + k
259 c
260 c --------------------
261 c
262 c
263 c
264 c------------------------------------------------------------------
265
266 cCR: ponderation entrainement des couches instables
267 cdef des entr_star tels que entr=f*entr_star
268 do l=1,klev
269 do ig=1,ngrid
270 entr_star(ig,l)=0.
271 enddo
272 enddo
273 c determination de la longueur de la couche d entrainement
274 do ig=1,ngrid
275 lentr(ig)=1
276 enddo
277
278 con ne considere que les premieres couches instables
279 do k=nlay-2,1,-1
280 do ig=1,ngrid
281 if (ztv(ig,k).gt.ztv(ig,k+1).and.
282 s ztv(ig,k+1).le.ztv(ig,k+2)) then
283 lentr(ig)=k
284 endif
285 enddo
286 enddo
287
288 c determination du lmin: couche d ou provient le thermique
289 do ig=1,ngrid
290 lmin(ig)=1
291 enddo
292 do ig=1,ngrid
293 do l=nlay,2,-1
294 if (ztv(ig,l-1).gt.ztv(ig,l)) then
295 lmin(ig)=l-1
296 endif
297 enddo
298 enddo
299 c
300 c definition de l'entrainement des couches
301 do l=1,klev-1
302 do ig=1,ngrid
303 if (ztv(ig,l).gt.ztv(ig,l+1).and.
304 s l.ge.lmin(ig).and.l.le.lentr(ig)) then
305 entr_star(ig,l)=(ztv(ig,l)-ztv(ig,l+1))*
306 s (zlev(ig,l+1)-zlev(ig,l))
307 endif
308 enddo
309 enddo
310 c pas de thermique si couches 1->5 stables
311 do ig=1,ngrid
312 if (lmin(ig).gt.5) then
313 do l=1,klev
314 entr_star(ig,l)=0.
315 enddo
316 endif
317 enddo
318 c calcul de l entrainement total
319 do ig=1,ngrid
320 entr_star_tot(ig)=0.
321 enddo
322 do ig=1,ngrid
323 do k=1,klev
324 entr_star_tot(ig)=entr_star_tot(ig)+entr_star(ig,k)
325 enddo
326 enddo
327 c
328 print*,'fin calcul entr_star'
329 do k=1,klev
330 do ig=1,ngrid
331 ztva(ig,k)=ztv(ig,k)
332 enddo
333 enddo
334 cRC
335 c print*,'7 OK convect8'
336 do k=1,klev+1
337 do ig=1,ngrid
338 zw2(ig,k)=0.
339 fmc(ig,k)=0.
340 cCR
341 f_star(ig,k)=0.
342 cRC
343 larg_cons(ig,k)=0.
344 larg_detr(ig,k)=0.
345 wa_moy(ig,k)=0.
346 enddo
347 enddo
348
349 c print*,'8 OK convect8'
350 do ig=1,ngrid
351 linter(ig)=1.
352 lmaxa(ig)=1
353 lmix(ig)=1
354 wmaxa(ig)=0.
355 enddo
356
357 cCR:
358 do l=1,nlay-2
359 do ig=1,ngrid
360 if (ztv(ig,l).gt.ztv(ig,l+1)
361 s .and.entr_star(ig,l).gt.1.e-10
362 s .and.zw2(ig,l).lt.1e-10) then
363 f_star(ig,l+1)=entr_star(ig,l)
364 ctest:calcul de dteta
365 zw2(ig,l+1)=2.*RG*(ztv(ig,l)-ztv(ig,l+1))/ztv(ig,l+1)
366 s *(zlev(ig,l+1)-zlev(ig,l))
367 s *0.4*pphi(ig,l)/(pphi(ig,l+1)-pphi(ig,l))
368 larg_detr(ig,l)=0.
369 else if ((zw2(ig,l).ge.1e-10).and.
370 s (f_star(ig,l)+entr_star(ig,l).gt.1.e-10)) then
371 f_star(ig,l+1)=f_star(ig,l)+entr_star(ig,l)
372 ztva(ig,l)=(f_star(ig,l)*ztva(ig,l-1)+entr_star(ig,l)
373 s *ztv(ig,l))/f_star(ig,l+1)
374 zw2(ig,l+1)=zw2(ig,l)*(f_star(ig,l)/f_star(ig,l+1))**2+
375 s 2.*RG*(ztva(ig,l)-ztv(ig,l))/ztv(ig,l)
376 s *(zlev(ig,l+1)-zlev(ig,l))
377 endif
378 c determination de zmax continu par interpolation lineaire
379 if (zw2(ig,l+1).lt.0.) then
380 ctest
381 if (abs(zw2(ig,l+1)-zw2(ig,l)).lt.1e-10) then
382 print*,'pb linter'
383 endif
384 linter(ig)=(l*(zw2(ig,l+1)-zw2(ig,l))
385 s -zw2(ig,l))/(zw2(ig,l+1)-zw2(ig,l))
386 zw2(ig,l+1)=0.
387 lmaxa(ig)=l
388 else
389 if (zw2(ig,l+1).lt.0.) then
390 print*,'pb1 zw2<0'
391 endif
392 wa_moy(ig,l+1)=sqrt(zw2(ig,l+1))
393 endif
394 if (wa_moy(ig,l+1).gt.wmaxa(ig)) then
395 c lmix est le niveau de la couche ou w (wa_moy) est maximum
396 lmix(ig)=l+1
397 wmaxa(ig)=wa_moy(ig,l+1)
398 endif
399 enddo
400 enddo
401 print*,'fin calcul zw2'
402 c
403 c Calcul de la couche correspondant a la hauteur du thermique
404 do ig=1,ngrid
405 lmax(ig)=lentr(ig)
406 enddo
407 do ig=1,ngrid
408 do l=nlay,lentr(ig)+1,-1
409 if (zw2(ig,l).le.1.e-10) then
410 lmax(ig)=l-1
411 endif
412 enddo
413 enddo
414 c pas de thermique si couches 1->5 stables
415 do ig=1,ngrid
416 if (lmin(ig).gt.5) then
417 lmax(ig)=1
418 lmin(ig)=1
419 endif
420 enddo
421 c
422 c Determination de zw2 max
423 do ig=1,ngrid
424 wmax(ig)=0.
425 enddo
426
427 do l=1,nlay
428 do ig=1,ngrid
429 if (l.le.lmax(ig)) then
430 if (zw2(ig,l).lt.0.)then
431 print*,'pb2 zw2<0'
432 endif
433 zw2(ig,l)=sqrt(zw2(ig,l))
434 wmax(ig)=max(wmax(ig),zw2(ig,l))
435 else
436 zw2(ig,l)=0.
437 endif
438 enddo
439 enddo
440
441 c Longueur caracteristique correspondant a la hauteur des thermiques.
442 do ig=1,ngrid
443 zmax(ig)=0.
444 zlevinter(ig)=zlev(ig,1)
445 enddo
446 do ig=1,ngrid
447 c calcul de zlevinter
448 zlevinter(ig)=(zlev(ig,lmax(ig)+1)-zlev(ig,lmax(ig)))*
449 s linter(ig)+zlev(ig,lmax(ig))-lmax(ig)*(zlev(ig,lmax(ig)+1)
450 s -zlev(ig,lmax(ig)))
451 zmax(ig)=max(zmax(ig),zlevinter(ig)-zlev(ig,lmin(ig)))
452 enddo
453
454 print*,'avant fermeture'
455 c Fermeture,determination de f
456 do ig=1,ngrid
457 entr_star2(ig)=0.
458 enddo
459 do ig=1,ngrid
460 if (entr_star_tot(ig).LT.1.e-10) then
461 f(ig)=0.
462 else
463 do k=lmin(ig),lentr(ig)
464 entr_star2(ig)=entr_star2(ig)+entr_star(ig,k)**2
465 s /(rho(ig,k)*(zlev(ig,k+1)-zlev(ig,k)))
466 enddo
467 c Nouvelle fermeture
468 f(ig)=wmax(ig)/(max(500.,zmax(ig))*r_aspect
469 s *entr_star2(ig))*entr_star_tot(ig)
470 ctest
471 c if (first) then
472 c f(ig)=f(ig)+(f0(ig)-f(ig))*exp(-ptimestep/zmax(ig)
473 c s *wmax(ig))
474 c endif
475 endif
476 c f0(ig)=f(ig)
477 c first=.true.
478 enddo
479 print*,'apres fermeture'
480
481 c Calcul de l'entrainement
482 do k=1,klev
483 do ig=1,ngrid
484 entr(ig,k)=f(ig)*entr_star(ig,k)
485 enddo
486 enddo
487 c Calcul des flux
488 do ig=1,ngrid
489 do l=1,lmax(ig)-1
490 fmc(ig,l+1)=fmc(ig,l)+entr(ig,l)
491 enddo
492 enddo
493
494 cRC
495
496
497 c print*,'9 OK convect8'
498 c print*,'WA1 ',wa_moy
499
500 c determination de l'indice du debut de la mixed layer ou w decroit
501
502 c calcul de la largeur de chaque ascendance dans le cas conservatif.
503 c dans ce cas simple, on suppose que la largeur de l'ascendance provenant
504 c d'une couche est égale à la hauteur de la couche alimentante.
505 c La vitesse maximale dans l'ascendance est aussi prise comme estimation
506 c de la vitesse d'entrainement horizontal dans la couche alimentante.
507
508 do l=2,nlay
509 do ig=1,ngrid
510 if (l.le.lmaxa(ig)) then
511 zw=max(wa_moy(ig,l),1.e-10)
512 larg_cons(ig,l)=zmax(ig)*r_aspect
513 s *fmc(ig,l)/(rhobarz(ig,l)*zw)
514 endif
515 enddo
516 enddo
517
518 do l=2,nlay
519 do ig=1,ngrid
520 if (l.le.lmaxa(ig)) then
521 c if (idetr.eq.0) then
522 c cette option est finalement en dur.
523 if ((l_mix*zlev(ig,l)).lt.0.)then
524 print*,'pb l_mix*zlev<0'
525 endif
526 larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l))
527 c else if (idetr.eq.1) then
528 c larg_detr(ig,l)=larg_cons(ig,l)
529 c s *sqrt(l_mix*zlev(ig,l))/larg_cons(ig,lmix(ig))
530 c else if (idetr.eq.2) then
531 c larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l))
532 c s *sqrt(wa_moy(ig,l))
533 c else if (idetr.eq.4) then
534 c larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l))
535 c s *wa_moy(ig,l)
536 c endif
537 endif
538 enddo
539 enddo
540
541 c print*,'10 OK convect8'
542 c print*,'WA2 ',wa_moy
543 c calcul de la fraction de la maille concernée par l'ascendance en tenant
544 c compte de l'epluchage du thermique.
545 c
546 cCR def de zmix continu (profil parabolique des vitesses)
547 do ig=1,ngrid
548 if (lmix(ig).gt.1.) then
549 c test
550 if (((zw2(ig,lmix(ig)-1)-zw2(ig,lmix(ig)))
551 s *((zlev(ig,lmix(ig)))-(zlev(ig,lmix(ig)+1)))
552 s -(zw2(ig,lmix(ig))-zw2(ig,lmix(ig)+1))
553 s *((zlev(ig,lmix(ig)-1))-(zlev(ig,lmix(ig))))).gt.1e-10)
554 s then
555 c
556 zmix(ig)=((zw2(ig,lmix(ig)-1)-zw2(ig,lmix(ig)))
557 s *((zlev(ig,lmix(ig)))**2-(zlev(ig,lmix(ig)+1))**2)
558 s -(zw2(ig,lmix(ig))-zw2(ig,lmix(ig)+1))
559 s *((zlev(ig,lmix(ig)-1))**2-(zlev(ig,lmix(ig)))**2))
560 s /(2.*((zw2(ig,lmix(ig)-1)-zw2(ig,lmix(ig)))
561 s *((zlev(ig,lmix(ig)))-(zlev(ig,lmix(ig)+1)))
562 s -(zw2(ig,lmix(ig))-zw2(ig,lmix(ig)+1))
563 s *((zlev(ig,lmix(ig)-1))-(zlev(ig,lmix(ig))))))
564 else
565 zmix(ig)=zlev(ig,lmix(ig))
566 print*,'pb zmix'
567 endif
568 else
569 zmix(ig)=0.
570 endif
571 ctest
572 if ((zmax(ig)-zmix(ig)).lt.0.) then
573 zmix(ig)=0.99*zmax(ig)
574 c print*,'pb zmix>zmax'
575 endif
576 enddo
577 c
578 c calcul du nouveau lmix correspondant
579 do ig=1,ngrid
580 do l=1,klev
581 if (zmix(ig).ge.zlev(ig,l).and.
582 s zmix(ig).lt.zlev(ig,l+1)) then
583 lmix(ig)=l
584 endif
585 enddo
586 enddo
587 c
588 do l=2,nlay
589 do ig=1,ngrid
590 if(larg_cons(ig,l).gt.1.) then
591 c print*,ig,l,lmix(ig),lmaxa(ig),larg_cons(ig,l),' KKK'
592 fraca(ig,l)=(larg_cons(ig,l)-larg_detr(ig,l))
593 s /(r_aspect*zmax(ig))
594 c test
595 fraca(ig,l)=max(fraca(ig,l),0.)
596 fraca(ig,l)=min(fraca(ig,l),0.5)
597 fracd(ig,l)=1.-fraca(ig,l)
598 fracc(ig,l)=larg_cons(ig,l)/(r_aspect*zmax(ig))
599 else
600 c wa_moy(ig,l)=0.
601 fraca(ig,l)=0.
602 fracc(ig,l)=0.
603 fracd(ig,l)=1.
604 endif
605 enddo
606 enddo
607 cCR: calcul de fracazmix
608 do ig=1,ngrid
609 fracazmix(ig)=(fraca(ig,lmix(ig)+1)-fraca(ig,lmix(ig)))/
610 s (zlev(ig,lmix(ig)+1)-zlev(ig,lmix(ig)))*zmix(ig)
611 s +fraca(ig,lmix(ig))-zlev(ig,lmix(ig))*(fraca(ig,lmix(ig)+1)
612 s -fraca(ig,lmix(ig)))/(zlev(ig,lmix(ig)+1)-zlev(ig,lmix(ig)))
613 enddo
614 c
615 do l=2,nlay
616 do ig=1,ngrid
617 if(larg_cons(ig,l).gt.1.) then
618 if (l.gt.lmix(ig)) then
619 ctest
620 if (zmax(ig)-zmix(ig).lt.1.e-10) then
621 c print*,'pb xxx'
622 xxx(ig,l)=(lmaxa(ig)+1.-l)/(lmaxa(ig)+1.-lmix(ig))
623 else
624 xxx(ig,l)=(zmax(ig)-zlev(ig,l))/(zmax(ig)-zmix(ig))
625 endif
626 if (idetr.eq.0) then
627 fraca(ig,l)=fracazmix(ig)
628 else if (idetr.eq.1) then
629 fraca(ig,l)=fracazmix(ig)*xxx(ig,l)
630 else if (idetr.eq.2) then
631 fraca(ig,l)=fracazmix(ig)*(1.-(1.-xxx(ig,l))**2)
632 else
633 fraca(ig,l)=fracazmix(ig)*xxx(ig,l)**2
634 endif
635 c print*,ig,l,lmix(ig),lmaxa(ig),xxx(ig,l),'LLLLLLL'
636 fraca(ig,l)=max(fraca(ig,l),0.)
637 fraca(ig,l)=min(fraca(ig,l),0.5)
638 fracd(ig,l)=1.-fraca(ig,l)
639 fracc(ig,l)=larg_cons(ig,l)/(r_aspect*zmax(ig))
640 endif
641 endif
642 enddo
643 enddo
644
645 print*,'fin calcul fraca'
646 c print*,'11 OK convect8'
647 c print*,'Ea3 ',wa_moy
648 c------------------------------------------------------------------
649 c Calcul de fracd, wd
650 c somme wa - wd = 0
651 c------------------------------------------------------------------
652
653
654 do ig=1,ngrid
655 fm(ig,1)=0.
656 fm(ig,nlay+1)=0.
657 enddo
658
659 do l=2,nlay
660 do ig=1,ngrid
661 fm(ig,l)=fraca(ig,l)*wa_moy(ig,l)*rhobarz(ig,l)
662 cCR:test
663 if (entr(ig,l-1).lt.1e-10.and.fm(ig,l).gt.fm(ig,l-1)
664 s .and.l.gt.lmix(ig)) then
665 fm(ig,l)=fm(ig,l-1)
666 c write(1,*)'ajustement fm, l',l
667 endif
668 c write(1,*)'ig,l,fm(ig,l)',ig,l,fm(ig,l)
669 cRC
670 enddo
671 do ig=1,ngrid
672 if(fracd(ig,l).lt.0.1) then
673 stop'fracd trop petit'
674 else
675 c vitesse descendante "diagnostique"
676 wd(ig,l)=fm(ig,l)/(fracd(ig,l)*rhobarz(ig,l))
677 endif
678 enddo
679 enddo
680
681 do l=1,nlay
682 do ig=1,ngrid
683 c masse(ig,l)=rho(ig,l)*(zlev(ig,l+1)-zlev(ig,l))
684 masse(ig,l)=(pplev(ig,l)-pplev(ig,l+1))/RG
685 enddo
686 enddo
687
688 print*,'12 OK convect8'
689 c print*,'WA4 ',wa_moy
690 cc------------------------------------------------------------------
691 c calcul du transport vertical
692 c------------------------------------------------------------------
693
694 go to 4444
695 c print*,'XXXXXXXXXXXXXXX ptimestep= ',ptimestep
696 do l=2,nlay-1
697 do ig=1,ngrid
698 if(fm(ig,l+1)*ptimestep.gt.masse(ig,l)
699 s .and.fm(ig,l+1)*ptimestep.gt.masse(ig,l+1)) then
700 c print*,'WARN!!! FM>M ig=',ig,' l=',l,' FM='
701 c s ,fm(ig,l+1)*ptimestep
702 c s ,' M=',masse(ig,l),masse(ig,l+1)
703 endif
704 enddo
705 enddo
706
707 do l=1,nlay
708 do ig=1,ngrid
709 if(entr(ig,l)*ptimestep.gt.masse(ig,l)) then
710 c print*,'WARN!!! E>M ig=',ig,' l=',l,' E=='
711 c s ,entr(ig,l)*ptimestep
712 c s ,' M=',masse(ig,l)
713 endif
714 enddo
715 enddo
716
717 do l=1,nlay
718 do ig=1,ngrid
719 if(.not.fm(ig,l).ge.0..or..not.fm(ig,l).le.10.) then
720 c print*,'WARN!!! fm exagere ig=',ig,' l=',l
721 c s ,' FM=',fm(ig,l)
722 endif
723 if(.not.masse(ig,l).ge.1.e-10
724 s .or..not.masse(ig,l).le.1.e4) then
725 endif
726 if(.not.entr(ig,l).ge.0..or..not.entr(ig,l).le.10.) then
727 c print*,'WARN!!! entr exagere ig=',ig,' l=',l
728 c s ,' E=',entr(ig,l)
729 endif
730 enddo
731 enddo
732
733 4444 continue
734
735 cCR:redefinition du entr
736 do l=1,nlay
737 do ig=1,ngrid
738 detr(ig,l)=fm(ig,l)+entr(ig,l)-fm(ig,l+1)
739 if (detr(ig,l).lt.0.) then
740 entr(ig,l)=entr(ig,l)-detr(ig,l)
741 detr(ig,l)=0.
742 c print*,'WARNING !!! detrainement negatif ',ig,l
743 endif
744 enddo
745 enddo
746 cRC
747 if (w2di.eq.1) then
748 fm0=fm0+ptimestep*(fm-fm0)/float(tho)
749 entr0=entr0+ptimestep*(entr-entr0)/float(tho)
750 else
751 fm0=fm
752 entr0=entr
753 endif
754
755 if (1.eq.1) then
756 call dqthermcell(ngrid,nlay,ptimestep,fm0,entr0,masse
757 . ,zh,zdhadj,zha)
758 call dqthermcell(ngrid,nlay,ptimestep,fm0,entr0,masse
759 . ,zo,pdoadj,zoa)
760 else
761 call dqthermcell2(ngrid,nlay,ptimestep,fm0,entr0,masse,fraca
762 . ,zh,zdhadj,zha)
763 call dqthermcell2(ngrid,nlay,ptimestep,fm0,entr0,masse,fraca
764 . ,zo,pdoadj,zoa)
765 endif
766
767 if (1.eq.0) then
768 call dvthermcell2(ngrid,nlay,ptimestep,fm0,entr0,masse
769 . ,fraca,zmax
770 . ,zu,zv,pduadj,pdvadj,zua,zva)
771 else
772 call dqthermcell(ngrid,nlay,ptimestep,fm0,entr0,masse
773 . ,zu,pduadj,zua)
774 call dqthermcell(ngrid,nlay,ptimestep,fm0,entr0,masse
775 . ,zv,pdvadj,zva)
776 endif
777
778 do l=1,nlay
779 do ig=1,ngrid
780 zf=0.5*(fracc(ig,l)+fracc(ig,l+1))
781 zf2=zf/(1.-zf)
782 thetath2(ig,l)=zf2*(zha(ig,l)-zh(ig,l))**2
783 wth2(ig,l)=zf2*(0.5*(wa_moy(ig,l)+wa_moy(ig,l+1)))**2
784 enddo
785 enddo
786
787
788
789 c print*,'13 OK convect8'
790 c print*,'WA5 ',wa_moy
791 do l=1,nlay
792 do ig=1,ngrid
793 pdtadj(ig,l)=zdhadj(ig,l)*zpspsk(ig,l)
794 enddo
795 enddo
796
797
798 c do l=1,nlay
799 c do ig=1,ngrid
800 c if(abs(pdtadj(ig,l))*86400..gt.500.) then
801 c print*,'WARN!!! ig=',ig,' l=',l
802 c s ,' pdtadj=',pdtadj(ig,l)
803 c endif
804 c if(abs(pdoadj(ig,l))*86400..gt.1.) then
805 c print*,'WARN!!! ig=',ig,' l=',l
806 c s ,' pdoadj=',pdoadj(ig,l)
807 c endif
808 c enddo
809 c enddo
810
811 print*,'14 OK convect8'
812 c------------------------------------------------------------------
813 c Calculs pour les sorties
814 c------------------------------------------------------------------
815
816 if(sorties) then
817 do l=1,nlay
818 do ig=1,ngrid
819 zla(ig,l)=(1.-fracd(ig,l))*zmax(ig)
820 zld(ig,l)=fracd(ig,l)*zmax(ig)
821 if(1.-fracd(ig,l).gt.1.e-10)
822 s zwa(ig,l)=wd(ig,l)*fracd(ig,l)/(1.-fracd(ig,l))
823 enddo
824 enddo
825
826 cdeja fait
827 c do l=1,nlay
828 c do ig=1,ngrid
829 c detr(ig,l)=fm(ig,l)+entr(ig,l)-fm(ig,l+1)
830 c if (detr(ig,l).lt.0.) then
831 c entr(ig,l)=entr(ig,l)-detr(ig,l)
832 c detr(ig,l)=0.
833 c print*,'WARNING !!! detrainement negatif ',ig,l
834 c endif
835 c enddo
836 c enddo
837
838 c print*,'15 OK convect8'
839
840 isplit=isplit+1
841
842
843 goto 123
844 123 continue
845
846 endif
847
848 c if(wa_moy(1,4).gt.1.e-10) stop
849
850 print*,'19 OK convect8'
851 return
852 end
853
854 subroutine dqthermcell(ngrid,nlay,ptimestep,fm,entr,masse
855 . ,q,dq,qa)
856 use dimens_m
857 use dimphy
858 implicit none
859
860 c=======================================================================
861 c
862 c Calcul du transport verticale dans la couche limite en presence
863 c de "thermiques" explicitement representes
864 c calcul du dq/dt une fois qu'on connait les ascendances
865 c
866 c=======================================================================
867
868
869 integer ngrid,nlay
870
871 real ptimestep
872 real, intent(in):: masse(ngrid,nlay)
873 real fm(ngrid,nlay+1)
874 real entr(ngrid,nlay)
875 real q(ngrid,nlay)
876 real dq(ngrid,nlay)
877
878 real qa(klon,klev),detr(klon,klev),wqd(klon,klev+1)
879
880 integer ig,k
881
882 c calcul du detrainement
883
884 do k=1,nlay
885 do ig=1,ngrid
886 detr(ig,k)=fm(ig,k)-fm(ig,k+1)+entr(ig,k)
887 enddo
888 enddo
889
890 c calcul de la valeur dans les ascendances
891 do ig=1,ngrid
892 qa(ig,1)=q(ig,1)
893 enddo
894
895 do k=2,nlay
896 do ig=1,ngrid
897 if ((fm(ig,k+1)+detr(ig,k))*ptimestep.gt.
898 s 1.e-5*masse(ig,k)) then
899 qa(ig,k)=(fm(ig,k)*qa(ig,k-1)+entr(ig,k)*q(ig,k))
900 s /(fm(ig,k+1)+detr(ig,k))
901 else
902 qa(ig,k)=q(ig,k)
903 endif
904 enddo
905 enddo
906
907 do k=2,nlay
908 do ig=1,ngrid
909 c wqd(ig,k)=fm(ig,k)*0.5*(q(ig,k-1)+q(ig,k))
910 wqd(ig,k)=fm(ig,k)*q(ig,k)
911 enddo
912 enddo
913 do ig=1,ngrid
914 wqd(ig,1)=0.
915 wqd(ig,nlay+1)=0.
916 enddo
917
918 do k=1,nlay
919 do ig=1,ngrid
920 dq(ig,k)=(detr(ig,k)*qa(ig,k)-entr(ig,k)*q(ig,k)
921 s -wqd(ig,k)+wqd(ig,k+1))
922 s /masse(ig,k)
923 enddo
924 enddo
925
926 return
927 end
928 subroutine dvthermcell(ngrid,nlay,ptimestep,fm,entr,masse
929 . ,fraca,larga
930 . ,u,v,du,dv,ua,va)
931 use dimens_m
932 use dimphy
933 implicit none
934
935 c=======================================================================
936 c
937 c Calcul du transport verticale dans la couche limite en presence
938 c de "thermiques" explicitement representes
939 c calcul du dq/dt une fois qu'on connait les ascendances
940 c
941 c=======================================================================
942
943
944 integer ngrid,nlay
945
946 real ptimestep
947 real masse(ngrid,nlay),fm(ngrid,nlay+1)
948 real fraca(ngrid,nlay+1)
949 real larga(ngrid)
950 real entr(ngrid,nlay)
951 real u(ngrid,nlay)
952 real ua(ngrid,nlay)
953 real du(ngrid,nlay)
954 real v(ngrid,nlay)
955 real va(ngrid,nlay)
956 real dv(ngrid,nlay)
957
958 real qa(klon,klev),detr(klon,klev)
959 real wvd(klon,klev+1),wud(klon,klev+1)
960 real gamma0,gamma(klon,klev+1)
961 real dua,dva
962 integer iter
963
964 integer ig,k
965
966 c calcul du detrainement
967
968 do k=1,nlay
969 do ig=1,ngrid
970 detr(ig,k)=fm(ig,k)-fm(ig,k+1)+entr(ig,k)
971 enddo
972 enddo
973
974 c calcul de la valeur dans les ascendances
975 do ig=1,ngrid
976 ua(ig,1)=u(ig,1)
977 va(ig,1)=v(ig,1)
978 enddo
979
980 do k=2,nlay
981 do ig=1,ngrid
982 if ((fm(ig,k+1)+detr(ig,k))*ptimestep.gt.
983 s 1.e-5*masse(ig,k)) then
984 c On itère sur la valeur du coeff de freinage.
985 c gamma0=rho(ig,k)*(zlev(ig,k+1)-zlev(ig,k))
986 gamma0=masse(ig,k)
987 s *sqrt( 0.5*(fraca(ig,k+1)+fraca(ig,k)) )
988 s *0.5/larga(ig)
989 c gamma0=0.
990 c la première fois on multiplie le coefficient de freinage
991 c par le module du vent dans la couche en dessous.
992 dua=ua(ig,k-1)-u(ig,k-1)
993 dva=va(ig,k-1)-v(ig,k-1)
994 do iter=1,5
995 gamma(ig,k)=gamma0*sqrt(dua**2+dva**2)
996 ua(ig,k)=(fm(ig,k)*ua(ig,k-1)
997 s +(entr(ig,k)+gamma(ig,k))*u(ig,k))
998 s /(fm(ig,k+1)+detr(ig,k)+gamma(ig,k))
999 va(ig,k)=(fm(ig,k)*va(ig,k-1)
1000 s +(entr(ig,k)+gamma(ig,k))*v(ig,k))
1001 s /(fm(ig,k+1)+detr(ig,k)+gamma(ig,k))
1002 c print*,k,ua(ig,k),va(ig,k),u(ig,k),v(ig,k),dua,dva
1003 dua=ua(ig,k)-u(ig,k)
1004 dva=va(ig,k)-v(ig,k)
1005 enddo
1006 else
1007 ua(ig,k)=u(ig,k)
1008 va(ig,k)=v(ig,k)
1009 gamma(ig,k)=0.
1010 endif
1011 enddo
1012 enddo
1013
1014 do k=2,nlay
1015 do ig=1,ngrid
1016 wud(ig,k)=fm(ig,k)*u(ig,k)
1017 wvd(ig,k)=fm(ig,k)*v(ig,k)
1018 enddo
1019 enddo
1020 do ig=1,ngrid
1021 wud(ig,1)=0.
1022 wud(ig,nlay+1)=0.
1023 wvd(ig,1)=0.
1024 wvd(ig,nlay+1)=0.
1025 enddo
1026
1027 do k=1,nlay
1028 do ig=1,ngrid
1029 du(ig,k)=((detr(ig,k)+gamma(ig,k))*ua(ig,k)
1030 s -(entr(ig,k)+gamma(ig,k))*u(ig,k)
1031 s -wud(ig,k)+wud(ig,k+1))
1032 s /masse(ig,k)
1033 dv(ig,k)=((detr(ig,k)+gamma(ig,k))*va(ig,k)
1034 s -(entr(ig,k)+gamma(ig,k))*v(ig,k)
1035 s -wvd(ig,k)+wvd(ig,k+1))
1036 s /masse(ig,k)
1037 enddo
1038 enddo
1039
1040 return
1041 end
1042 subroutine dqthermcell2(ngrid,nlay,ptimestep,fm,entr,masse,frac
1043 . ,q,dq,qa)
1044 use dimens_m
1045 use dimphy
1046 implicit none
1047
1048 c=======================================================================
1049 c
1050 c Calcul du transport verticale dans la couche limite en presence
1051 c de "thermiques" explicitement representes
1052 c calcul du dq/dt une fois qu'on connait les ascendances
1053 c
1054 c=======================================================================
1055
1056
1057 integer ngrid,nlay
1058
1059 real ptimestep
1060 real masse(ngrid,nlay),fm(ngrid,nlay+1)
1061 real entr(ngrid,nlay),frac(ngrid,nlay)
1062 real q(ngrid,nlay)
1063 real dq(ngrid,nlay)
1064
1065 real qa(klon,klev),detr(klon,klev),wqd(klon,klev+1)
1066 real qe(klon,klev),zf,zf2
1067
1068 integer ig,k
1069
1070 c calcul du detrainement
1071
1072 do k=1,nlay
1073 do ig=1,ngrid
1074 detr(ig,k)=fm(ig,k)-fm(ig,k+1)+entr(ig,k)
1075 enddo
1076 enddo
1077
1078 c calcul de la valeur dans les ascendances
1079 do ig=1,ngrid
1080 qa(ig,1)=q(ig,1)
1081 qe(ig,1)=q(ig,1)
1082 enddo
1083
1084 do k=2,nlay
1085 do ig=1,ngrid
1086 if ((fm(ig,k+1)+detr(ig,k))*ptimestep.gt.
1087 s 1.e-5*masse(ig,k)) then
1088 zf=0.5*(frac(ig,k)+frac(ig,k+1))
1089 zf2=1./(1.-zf)
1090 qa(ig,k)=(fm(ig,k)*qa(ig,k-1)+zf2*entr(ig,k)*q(ig,k))
1091 s /(fm(ig,k+1)+detr(ig,k)+entr(ig,k)*zf*zf2)
1092 qe(ig,k)=(q(ig,k)-zf*qa(ig,k))*zf2
1093 else
1094 qa(ig,k)=q(ig,k)
1095 qe(ig,k)=q(ig,k)
1096 endif
1097 enddo
1098 enddo
1099
1100 do k=2,nlay
1101 do ig=1,ngrid
1102 c wqd(ig,k)=fm(ig,k)*0.5*(q(ig,k-1)+q(ig,k))
1103 wqd(ig,k)=fm(ig,k)*qe(ig,k)
1104 enddo
1105 enddo
1106 do ig=1,ngrid
1107 wqd(ig,1)=0.
1108 wqd(ig,nlay+1)=0.
1109 enddo
1110
1111 do k=1,nlay
1112 do ig=1,ngrid
1113 dq(ig,k)=(detr(ig,k)*qa(ig,k)-entr(ig,k)*qe(ig,k)
1114 s -wqd(ig,k)+wqd(ig,k+1))
1115 s /masse(ig,k)
1116 enddo
1117 enddo
1118
1119 return
1120 end
1121 subroutine dvthermcell2(ngrid,nlay,ptimestep,fm,entr,masse
1122 . ,fraca,larga
1123 . ,u,v,du,dv,ua,va)
1124 use dimens_m
1125 use dimphy
1126 implicit none
1127
1128 c=======================================================================
1129 c
1130 c Calcul du transport verticale dans la couche limite en presence
1131 c de "thermiques" explicitement representes
1132 c calcul du dq/dt une fois qu'on connait les ascendances
1133 c
1134 c=======================================================================
1135
1136
1137 integer ngrid,nlay
1138
1139 real ptimestep
1140 real masse(ngrid,nlay),fm(ngrid,nlay+1)
1141 real fraca(ngrid,nlay+1)
1142 real larga(ngrid)
1143 real entr(ngrid,nlay)
1144 real u(ngrid,nlay)
1145 real ua(ngrid,nlay)
1146 real du(ngrid,nlay)
1147 real v(ngrid,nlay)
1148 real va(ngrid,nlay)
1149 real dv(ngrid,nlay)
1150
1151 real qa(klon,klev),detr(klon,klev),zf,zf2
1152 real wvd(klon,klev+1),wud(klon,klev+1)
1153 real gamma0,gamma(klon,klev+1)
1154 real ue(klon,klev),ve(klon,klev)
1155 real dua,dva
1156 integer iter
1157
1158 integer ig,k
1159
1160 c calcul du detrainement
1161
1162 do k=1,nlay
1163 do ig=1,ngrid
1164 detr(ig,k)=fm(ig,k)-fm(ig,k+1)+entr(ig,k)
1165 enddo
1166 enddo
1167
1168 c calcul de la valeur dans les ascendances
1169 do ig=1,ngrid
1170 ua(ig,1)=u(ig,1)
1171 va(ig,1)=v(ig,1)
1172 ue(ig,1)=u(ig,1)
1173 ve(ig,1)=v(ig,1)
1174 enddo
1175
1176 do k=2,nlay
1177 do ig=1,ngrid
1178 if ((fm(ig,k+1)+detr(ig,k))*ptimestep.gt.
1179 s 1.e-5*masse(ig,k)) then
1180 c On itère sur la valeur du coeff de freinage.
1181 c gamma0=rho(ig,k)*(zlev(ig,k+1)-zlev(ig,k))
1182 gamma0=masse(ig,k)
1183 s *sqrt( 0.5*(fraca(ig,k+1)+fraca(ig,k)) )
1184 s *0.5/larga(ig)
1185 s *1.
1186 c s *0.5
1187 c gamma0=0.
1188 zf=0.5*(fraca(ig,k)+fraca(ig,k+1))
1189 zf=0.
1190 zf2=1./(1.-zf)
1191 c la première fois on multiplie le coefficient de freinage
1192 c par le module du vent dans la couche en dessous.
1193 dua=ua(ig,k-1)-u(ig,k-1)
1194 dva=va(ig,k-1)-v(ig,k-1)
1195 do iter=1,5
1196 c On choisit une relaxation lineaire.
1197 gamma(ig,k)=gamma0
1198 c On choisit une relaxation quadratique.
1199 gamma(ig,k)=gamma0*sqrt(dua**2+dva**2)
1200 ua(ig,k)=(fm(ig,k)*ua(ig,k-1)
1201 s +(zf2*entr(ig,k)+gamma(ig,k))*u(ig,k))
1202 s /(fm(ig,k+1)+detr(ig,k)+entr(ig,k)*zf*zf2
1203 s +gamma(ig,k))
1204 va(ig,k)=(fm(ig,k)*va(ig,k-1)
1205 s +(zf2*entr(ig,k)+gamma(ig,k))*v(ig,k))
1206 s /(fm(ig,k+1)+detr(ig,k)+entr(ig,k)*zf*zf2
1207 s +gamma(ig,k))
1208 c print*,k,ua(ig,k),va(ig,k),u(ig,k),v(ig,k),dua,dva
1209 dua=ua(ig,k)-u(ig,k)
1210 dva=va(ig,k)-v(ig,k)
1211 ue(ig,k)=(u(ig,k)-zf*ua(ig,k))*zf2
1212 ve(ig,k)=(v(ig,k)-zf*va(ig,k))*zf2
1213 enddo
1214 else
1215 ua(ig,k)=u(ig,k)
1216 va(ig,k)=v(ig,k)
1217 ue(ig,k)=u(ig,k)
1218 ve(ig,k)=v(ig,k)
1219 gamma(ig,k)=0.
1220 endif
1221 enddo
1222 enddo
1223
1224 do k=2,nlay
1225 do ig=1,ngrid
1226 wud(ig,k)=fm(ig,k)*ue(ig,k)
1227 wvd(ig,k)=fm(ig,k)*ve(ig,k)
1228 enddo
1229 enddo
1230 do ig=1,ngrid
1231 wud(ig,1)=0.
1232 wud(ig,nlay+1)=0.
1233 wvd(ig,1)=0.
1234 wvd(ig,nlay+1)=0.
1235 enddo
1236
1237 do k=1,nlay
1238 do ig=1,ngrid
1239 du(ig,k)=((detr(ig,k)+gamma(ig,k))*ua(ig,k)
1240 s -(entr(ig,k)+gamma(ig,k))*ue(ig,k)
1241 s -wud(ig,k)+wud(ig,k+1))
1242 s /masse(ig,k)
1243 dv(ig,k)=((detr(ig,k)+gamma(ig,k))*va(ig,k)
1244 s -(entr(ig,k)+gamma(ig,k))*ve(ig,k)
1245 s -wvd(ig,k)+wvd(ig,k+1))
1246 s /masse(ig,k)
1247 enddo
1248 enddo
1249
1250 return
1251 end

Properties

Name Value
svn:executable

  ViewVC Help
Powered by ViewVC 1.1.21