/[lmdze]/trunk/libf/dyn3d/vlsplt.f
ViewVC logotype

Contents of /trunk/libf/dyn3d/vlsplt.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3 - (show annotations)
Wed Feb 27 13:16:39 2008 UTC (16 years, 2 months ago) by guez
File size: 23015 byte(s)
Initial import
1 !
2 ! $Header: /home/cvsroot/LMDZ4/libf/dyn3d/vlsplt.F,v 1.2 2005/02/24 12:16:57 fairhead Exp $
3 !
4 c
5 c
6
7 SUBROUTINE vlsplt(q,pente_max,masse,w,pbaru,pbarv,pdt)
8 c
9 c Auteurs: P.Le Van, F.Hourdin, F.Forget
10 c
11 c ********************************************************************
12 c Shema d'advection " pseudo amont " .
13 c ********************************************************************
14 c q,pbaru,pbarv,w sont des arguments d'entree pour le s-pg ....
15 c
16 c pente_max facteur de limitation des pentes: 2 en general
17 c 0 pour un schema amont
18 c pbaru,pbarv,w flux de masse en u ,v ,w
19 c pdt pas de temps
20 c
21 c --------------------------------------------------------------------
22 use dimens_m
23 use paramet_m
24 use comconst
25 use comvert
26 use logic
27 IMPLICIT NONE
28 c
29
30 c
31 c Arguments:
32 c ----------
33 REAL masse(ip1jmp1,llm),pente_max
34 c REAL masse(iip1,jjp1,llm),pente_max
35 REAL pbaru( ip1jmp1,llm ),pbarv( ip1jm,llm)
36 REAL q(ip1jmp1,llm)
37 c REAL q(iip1,jjp1,llm)
38 REAL w(ip1jmp1,llm),pdt
39 c
40 c Local
41 c ---------
42 c
43 INTEGER i,ij,l,j,ii
44 INTEGER ijlqmin,iqmin,jqmin,lqmin
45 c
46 REAL zm(ip1jmp1,llm),newmasse
47 REAL mu(ip1jmp1,llm)
48 REAL mv(ip1jm,llm)
49 REAL mw(ip1jmp1,llm+1)
50 REAL zq(ip1jmp1,llm),zz
51 REAL dqx(ip1jmp1,llm),dqy(ip1jmp1,llm),dqz(ip1jmp1,llm)
52 REAL second,temps0,temps1,temps2,temps3
53 REAL ztemps1,ztemps2,ztemps3
54 REAL zzpbar, zzw
55 LOGICAL testcpu
56 SAVE testcpu
57 SAVE temps1,temps2,temps3
58 INTEGER iminn,imaxx
59
60 REAL qmin,qmax
61 DATA qmin,qmax/0.,1.e33/
62 DATA testcpu/.false./
63 DATA temps1,temps2,temps3/0.,0.,0./
64
65
66 zzpbar = 0.5 * pdt
67 zzw = pdt
68 DO l=1,llm
69 DO ij = iip2,ip1jm
70 mu(ij,l)=pbaru(ij,l) * zzpbar
71 ENDDO
72 DO ij=1,ip1jm
73 mv(ij,l)=pbarv(ij,l) * zzpbar
74 ENDDO
75 DO ij=1,ip1jmp1
76 mw(ij,l)=w(ij,l) * zzw
77 ENDDO
78 ENDDO
79
80 DO ij=1,ip1jmp1
81 mw(ij,llm+1)=0.
82 ENDDO
83
84 CALL SCOPY(ijp1llm,q,1,zq,1)
85 CALL SCOPY(ijp1llm,masse,1,zm,1)
86
87 cprint*,'Entree vlx1'
88 c call minmaxq(zq,qmin,qmax,'avant vlx ')
89 call vlx(zq,pente_max,zm,mu)
90 cprint*,'Sortie vlx1'
91 c call minmaxq(zq,qmin,qmax,'apres vlx1 ')
92
93 c print*,'Entree vly1'
94 call vly(zq,pente_max,zm,mv)
95 c call minmaxq(zq,qmin,qmax,'apres vly1 ')
96 cprint*,'Sortie vly1'
97 call vlz(zq,pente_max,zm,mw)
98 c call minmaxq(zq,qmin,qmax,'apres vlz ')
99
100
101 call vly(zq,pente_max,zm,mv)
102 c call minmaxq(zq,qmin,qmax,'apres vly ')
103
104
105 call vlx(zq,pente_max,zm,mu)
106 c call minmaxq(zq,qmin,qmax,'apres vlx2 ')
107
108
109 DO l=1,llm
110 DO ij=1,ip1jmp1
111 q(ij,l)=zq(ij,l)
112 ENDDO
113 DO ij=1,ip1jm+1,iip1
114 q(ij+iim,l)=q(ij,l)
115 ENDDO
116 ENDDO
117
118 RETURN
119 END
120 SUBROUTINE vlx(q,pente_max,masse,u_m)
121
122 c Auteurs: P.Le Van, F.Hourdin, F.Forget
123 c
124 c ********************************************************************
125 c Shema d'advection " pseudo amont " .
126 c ********************************************************************
127 c nq,iq,q,pbaru,pbarv,w sont des arguments d'entree pour le s-pg ....
128 c
129 c
130 c --------------------------------------------------------------------
131 use dimens_m
132 use paramet_m
133 use comconst
134 use comvert
135 use logic
136 IMPLICIT NONE
137 c
138 c
139 c
140 c Arguments:
141 c ----------
142 REAL masse(ip1jmp1,llm),pente_max
143 REAL u_m( ip1jmp1,llm ),pbarv( iip1,jjm,llm)
144 REAL q(ip1jmp1,llm)
145 REAL w(ip1jmp1,llm)
146 c
147 c Local
148 c ---------
149 c
150 INTEGER ij,l,j,i,iju,ijq,indu(ip1jmp1),niju
151 INTEGER n0,iadvplus(ip1jmp1,llm),nl(llm)
152 c
153 REAL new_m,zu_m,zdum(ip1jmp1,llm)
154 REAL sigu(ip1jmp1),dxq(ip1jmp1,llm),dxqu(ip1jmp1)
155 REAL zz(ip1jmp1)
156 REAL adxqu(ip1jmp1),dxqmax(ip1jmp1,llm)
157 REAL u_mq(ip1jmp1,llm)
158
159 Logical extremum,first,testcpu
160 SAVE first,testcpu
161
162 REAL SSUM
163 REAL temps0,temps1,temps2,temps3,temps4,temps5,second
164 SAVE temps0,temps1,temps2,temps3,temps4,temps5
165
166 REAL z1,z2,z3
167
168 DATA first,testcpu/.true.,.false./
169
170 IF(first) THEN
171 temps1=0.
172 temps2=0.
173 temps3=0.
174 temps4=0.
175 temps5=0.
176 first=.false.
177 ENDIF
178
179 c calcul de la pente a droite et a gauche de la maille
180
181
182 IF (pente_max.gt.-1.e-5) THEN
183 c IF (pente_max.gt.10) THEN
184
185 c calcul des pentes avec limitation, Van Leer scheme I:
186 c -----------------------------------------------------
187
188 c calcul de la pente aux points u
189 DO l = 1, llm
190 DO ij=iip2,ip1jm-1
191 dxqu(ij)=q(ij+1,l)-q(ij,l)
192 c IF(u_m(ij,l).lt.0.) stop'limx n admet pas les U<0'
193 c sigu(ij)=u_m(ij,l)/masse(ij,l)
194 ENDDO
195 DO ij=iip1+iip1,ip1jm,iip1
196 dxqu(ij)=dxqu(ij-iim)
197 c sigu(ij)=sigu(ij-iim)
198 ENDDO
199
200 DO ij=iip2,ip1jm
201 adxqu(ij)=abs(dxqu(ij))
202 ENDDO
203
204 c calcul de la pente maximum dans la maille en valeur absolue
205
206 DO ij=iip2+1,ip1jm
207 dxqmax(ij,l)=pente_max*
208 , min(adxqu(ij-1),adxqu(ij))
209 c limitation subtile
210 c , min(adxqu(ij-1)/sigu(ij-1),adxqu(ij)/(1.-sigu(ij)))
211
212
213 ENDDO
214
215 DO ij=iip1+iip1,ip1jm,iip1
216 dxqmax(ij-iim,l)=dxqmax(ij,l)
217 ENDDO
218
219 DO ij=iip2+1,ip1jm
220 IF(dxqu(ij-1)*dxqu(ij).gt.0) THEN
221 dxq(ij,l)=dxqu(ij-1)+dxqu(ij)
222 ELSE
223 c extremum local
224 dxq(ij,l)=0.
225 ENDIF
226 dxq(ij,l)=0.5*dxq(ij,l)
227 dxq(ij,l)=
228 , sign(min(abs(dxq(ij,l)),dxqmax(ij,l)),dxq(ij,l))
229 ENDDO
230
231 ENDDO ! l=1,llm
232 cprint*,'Ok calcul des pentes'
233
234 ELSE ! (pente_max.lt.-1.e-5)
235
236 c Pentes produits:
237 c ----------------
238
239 DO l = 1, llm
240 DO ij=iip2,ip1jm-1
241 dxqu(ij)=q(ij+1,l)-q(ij,l)
242 ENDDO
243 DO ij=iip1+iip1,ip1jm,iip1
244 dxqu(ij)=dxqu(ij-iim)
245 ENDDO
246
247 DO ij=iip2+1,ip1jm
248 zz(ij)=dxqu(ij-1)*dxqu(ij)
249 zz(ij)=zz(ij)+zz(ij)
250 IF(zz(ij).gt.0) THEN
251 dxq(ij,l)=zz(ij)/(dxqu(ij-1)+dxqu(ij))
252 ELSE
253 c extremum local
254 dxq(ij,l)=0.
255 ENDIF
256 ENDDO
257
258 ENDDO
259
260 ENDIF ! (pente_max.lt.-1.e-5)
261
262 c bouclage de la pente en iip1:
263 c -----------------------------
264
265 DO l=1,llm
266 DO ij=iip1+iip1,ip1jm,iip1
267 dxq(ij-iim,l)=dxq(ij,l)
268 ENDDO
269 DO ij=1,ip1jmp1
270 iadvplus(ij,l)=0
271 ENDDO
272
273 ENDDO
274
275 c print*,'Bouclage en iip1'
276
277 c calcul des flux a gauche et a droite
278
279 c on cumule le flux correspondant a toutes les mailles dont la masse
280 c au travers de la paroi pENDant le pas de temps.
281 cprint*,'Cumule ....'
282
283 DO l=1,llm
284 DO ij=iip2,ip1jm-1
285 c print*,'masse(',ij,')=',masse(ij,l)
286 IF (u_m(ij,l).gt.0.) THEN
287 zdum(ij,l)=1.-u_m(ij,l)/masse(ij,l)
288 u_mq(ij,l)=u_m(ij,l)*(q(ij,l)+0.5*zdum(ij,l)*dxq(ij,l))
289 ELSE
290 zdum(ij,l)=1.+u_m(ij,l)/masse(ij+1,l)
291 u_mq(ij,l)=u_m(ij,l)*(q(ij+1,l)-0.5*zdum(ij,l)*dxq(ij+1,l))
292 ENDIF
293 ENDDO
294 ENDDO
295 c stop
296
297 c go to 9999
298 c detection des points ou on advecte plus que la masse de la
299 c maille
300 DO l=1,llm
301 DO ij=iip2,ip1jm-1
302 IF(zdum(ij,l).lt.0) THEN
303 iadvplus(ij,l)=1
304 u_mq(ij,l)=0.
305 ENDIF
306 ENDDO
307 ENDDO
308 cprint*,'Ok test 1'
309 DO l=1,llm
310 DO ij=iip1+iip1,ip1jm,iip1
311 iadvplus(ij,l)=iadvplus(ij-iim,l)
312 ENDDO
313 ENDDO
314 c print*,'Ok test 2'
315
316
317 c traitement special pour le cas ou on advecte en longitude plus que le
318 c contenu de la maille.
319 c cette partie est mal vectorisee.
320
321 c calcul du nombre de maille sur lequel on advecte plus que la maille.
322
323 n0=0
324 DO l=1,llm
325 nl(l)=0
326 DO ij=iip2,ip1jm
327 nl(l)=nl(l)+iadvplus(ij,l)
328 ENDDO
329 n0=n0+nl(l)
330 ENDDO
331
332 IF(n0.gt.0) THEN
333 CC PRINT*,'Nombre de points pour lesquels on advect plus que le'
334 CC & ,'contenu de la maille : ',n0
335
336 DO l=1,llm
337 IF(nl(l).gt.0) THEN
338 iju=0
339 c indicage des mailles concernees par le traitement special
340 DO ij=iip2,ip1jm
341 IF(iadvplus(ij,l).eq.1.and.mod(ij,iip1).ne.0) THEN
342 iju=iju+1
343 indu(iju)=ij
344 ENDIF
345 ENDDO
346 niju=iju
347 c PRINT*,'niju,nl',niju,nl(l)
348
349 c traitement des mailles
350 DO iju=1,niju
351 ij=indu(iju)
352 j=(ij-1)/iip1+1
353 zu_m=u_m(ij,l)
354 u_mq(ij,l)=0.
355 IF(zu_m.gt.0.) THEN
356 ijq=ij
357 i=ijq-(j-1)*iip1
358 c accumulation pour les mailles completements advectees
359 do while(zu_m.gt.masse(ijq,l))
360 u_mq(ij,l)=u_mq(ij,l)+q(ijq,l)*masse(ijq,l)
361 zu_m=zu_m-masse(ijq,l)
362 i=mod(i-2+iim,iim)+1
363 ijq=(j-1)*iip1+i
364 ENDDO
365 c ajout de la maille non completement advectee
366 u_mq(ij,l)=u_mq(ij,l)+zu_m*
367 & (q(ijq,l)+0.5*(1.-zu_m/masse(ijq,l))*dxq(ijq,l))
368 ELSE
369 ijq=ij+1
370 i=ijq-(j-1)*iip1
371 c accumulation pour les mailles completements advectees
372 do while(-zu_m.gt.masse(ijq,l))
373 u_mq(ij,l)=u_mq(ij,l)-q(ijq,l)*masse(ijq,l)
374 zu_m=zu_m+masse(ijq,l)
375 i=mod(i,iim)+1
376 ijq=(j-1)*iip1+i
377 ENDDO
378 c ajout de la maille non completement advectee
379 u_mq(ij,l)=u_mq(ij,l)+zu_m*(q(ijq,l)-
380 & 0.5*(1.+zu_m/masse(ijq,l))*dxq(ijq,l))
381 ENDIF
382 ENDDO
383 ENDIF
384 ENDDO
385 ENDIF ! n0.gt.0
386 9999 continue
387
388
389 c bouclage en latitude
390 cprint*,'cvant bouclage en latitude'
391 DO l=1,llm
392 DO ij=iip1+iip1,ip1jm,iip1
393 u_mq(ij,l)=u_mq(ij-iim,l)
394 ENDDO
395 ENDDO
396
397
398 c calcul des tENDances
399
400 DO l=1,llm
401 DO ij=iip2+1,ip1jm
402 new_m=masse(ij,l)+u_m(ij-1,l)-u_m(ij,l)
403 q(ij,l)=(q(ij,l)*masse(ij,l)+
404 & u_mq(ij-1,l)-u_mq(ij,l))
405 & /new_m
406 masse(ij,l)=new_m
407 ENDDO
408 c ModIF Fred 22 03 96 correction d'un bug (les scopy ci-dessous)
409 DO ij=iip1+iip1,ip1jm,iip1
410 q(ij-iim,l)=q(ij,l)
411 masse(ij-iim,l)=masse(ij,l)
412 ENDDO
413 ENDDO
414 c CALL SCOPY((jjm-1)*llm,q(iip1+iip1,1),iip1,q(iip2,1),iip1)
415 c CALL SCOPY((jjm-1)*llm,masse(iip1+iip1,1),iip1,masse(iip2,1),iip1)
416
417
418 RETURN
419 END
420 SUBROUTINE vly(q,pente_max,masse,masse_adv_v)
421 c
422 c Auteurs: P.Le Van, F.Hourdin, F.Forget
423 c
424 c ********************************************************************
425 c Shema d'advection " pseudo amont " .
426 c ********************************************************************
427 c q,masse_adv_v,w sont des arguments d'entree pour le s-pg ....
428 c dq sont des arguments de sortie pour le s-pg ....
429 c
430 c
431 c --------------------------------------------------------------------
432 use dimens_m
433 use paramet_m
434 use comconst
435 use comvert
436 use logic
437 use comgeom
438 IMPLICIT NONE
439 c
440 c
441 c
442 c Arguments:
443 c ----------
444 REAL masse(ip1jmp1,llm),pente_max
445 REAL masse_adv_v( ip1jm,llm)
446 REAL q(ip1jmp1,llm), dq( ip1jmp1,llm)
447 c
448 c Local
449 c ---------
450 c
451 INTEGER i,ij,l
452 c
453 REAL airej2,airejjm,airescb(iim),airesch(iim)
454 REAL dyq(ip1jmp1,llm),dyqv(ip1jm),zdvm(ip1jmp1,llm)
455 REAL adyqv(ip1jm),dyqmax(ip1jmp1)
456 REAL qbyv(ip1jm,llm)
457
458 REAL qpns,qpsn,apn,aps,dyn1,dys1,dyn2,dys2,newmasse,fn,fs
459 c REAL newq,oldmasse
460 Logical extremum,first,testcpu
461 REAL temps0,temps1,temps2,temps3,temps4,temps5,second
462 SAVE temps0,temps1,temps2,temps3,temps4,temps5
463 SAVE first,testcpu
464
465 REAL convpn,convps,convmpn,convmps
466 real massepn,masseps,qpn,qps
467 REAL sinlon(iip1),sinlondlon(iip1)
468 REAL coslon(iip1),coslondlon(iip1)
469 SAVE sinlon,coslon,sinlondlon,coslondlon
470 SAVE airej2,airejjm
471 c
472 c
473 REAL SSUM
474
475 DATA first,testcpu/.true.,.false./
476 DATA temps0,temps1,temps2,temps3,temps4,temps5/0.,0.,0.,0.,0.,0./
477
478 IF(first) THEN
479 PRINT*,'Shema Amont nouveau appele dans Vanleer '
480 first=.false.
481 do i=2,iip1
482 coslon(i)=cos(rlonv(i))
483 sinlon(i)=sin(rlonv(i))
484 coslondlon(i)=coslon(i)*(rlonu(i)-rlonu(i-1))/pi
485 sinlondlon(i)=sinlon(i)*(rlonu(i)-rlonu(i-1))/pi
486 ENDDO
487 coslon(1)=coslon(iip1)
488 coslondlon(1)=coslondlon(iip1)
489 sinlon(1)=sinlon(iip1)
490 sinlondlon(1)=sinlondlon(iip1)
491 airej2 = SSUM( iim, aire(iip2), 1 )
492 airejjm= SSUM( iim, aire(ip1jm -iim), 1 )
493 ENDIF
494
495 c
496 cPRINT*,'CALCUL EN LATITUDE'
497
498 DO l = 1, llm
499 c
500 c --------------------------------
501 c CALCUL EN LATITUDE
502 c --------------------------------
503
504 c On commence par calculer la valeur du traceur moyenne sur le premier cercle
505 c de latitude autour du pole (qpns pour le pole nord et qpsn pour
506 c le pole nord) qui sera utilisee pour evaluer les pentes au pole.
507
508 DO i = 1, iim
509 airescb(i) = aire(i+ iip1) * q(i+ iip1,l)
510 airesch(i) = aire(i+ ip1jm- iip1) * q(i+ ip1jm- iip1,l)
511 ENDDO
512 qpns = SSUM( iim, airescb ,1 ) / airej2
513 qpsn = SSUM( iim, airesch ,1 ) / airejjm
514
515 c calcul des pentes aux points v
516
517 DO ij=1,ip1jm
518 dyqv(ij)=q(ij,l)-q(ij+iip1,l)
519 adyqv(ij)=abs(dyqv(ij))
520 ENDDO
521
522 c calcul des pentes aux points scalaires
523
524 DO ij=iip2,ip1jm
525 dyq(ij,l)=.5*(dyqv(ij-iip1)+dyqv(ij))
526 dyqmax(ij)=min(adyqv(ij-iip1),adyqv(ij))
527 dyqmax(ij)=pente_max*dyqmax(ij)
528 ENDDO
529
530 c calcul des pentes aux poles
531
532 DO ij=1,iip1
533 dyq(ij,l)=qpns-q(ij+iip1,l)
534 dyq(ip1jm+ij,l)=q(ip1jm+ij-iip1,l)-qpsn
535 ENDDO
536
537 c filtrage de la derivee
538 dyn1=0.
539 dys1=0.
540 dyn2=0.
541 dys2=0.
542 DO ij=1,iim
543 dyn1=dyn1+sinlondlon(ij)*dyq(ij,l)
544 dys1=dys1+sinlondlon(ij)*dyq(ip1jm+ij,l)
545 dyn2=dyn2+coslondlon(ij)*dyq(ij,l)
546 dys2=dys2+coslondlon(ij)*dyq(ip1jm+ij,l)
547 ENDDO
548 DO ij=1,iip1
549 dyq(ij,l)=dyn1*sinlon(ij)+dyn2*coslon(ij)
550 dyq(ip1jm+ij,l)=dys1*sinlon(ij)+dys2*coslon(ij)
551 ENDDO
552
553 c calcul des pentes limites aux poles
554
555 goto 8888
556 fn=1.
557 fs=1.
558 DO ij=1,iim
559 IF(pente_max*adyqv(ij).lt.abs(dyq(ij,l))) THEN
560 fn=min(pente_max*adyqv(ij)/abs(dyq(ij,l)),fn)
561 ENDIF
562 IF(pente_max*adyqv(ij+ip1jm-iip1).lt.abs(dyq(ij+ip1jm,l))) THEN
563 fs=min(pente_max*adyqv(ij+ip1jm-iip1)/abs(dyq(ij+ip1jm,l)),fs)
564 ENDIF
565 ENDDO
566 DO ij=1,iip1
567 dyq(ij,l)=fn*dyq(ij,l)
568 dyq(ip1jm+ij,l)=fs*dyq(ip1jm+ij,l)
569 ENDDO
570 8888 continue
571 DO ij=1,iip1
572 dyq(ij,l)=0.
573 dyq(ip1jm+ij,l)=0.
574 ENDDO
575
576 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
577 C En memoire de dIFferents tests sur la
578 C limitation des pentes aux poles.
579 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
580 C PRINT*,dyq(1)
581 C PRINT*,dyqv(iip1+1)
582 C apn=abs(dyq(1)/dyqv(iip1+1))
583 C PRINT*,dyq(ip1jm+1)
584 C PRINT*,dyqv(ip1jm-iip1+1)
585 C aps=abs(dyq(ip1jm+1)/dyqv(ip1jm-iip1+1))
586 C DO ij=2,iim
587 C apn=amax1(abs(dyq(ij)/dyqv(ij)),apn)
588 C aps=amax1(abs(dyq(ip1jm+ij)/dyqv(ip1jm-iip1+ij)),aps)
589 C ENDDO
590 C apn=min(pente_max/apn,1.)
591 C aps=min(pente_max/aps,1.)
592 C
593 C
594 C cas ou on a un extremum au pole
595 C
596 C IF(dyqv(ismin(iim,dyqv,1))*dyqv(ismax(iim,dyqv,1)).le.0.)
597 C & apn=0.
598 C IF(dyqv(ismax(iim,dyqv(ip1jm-iip1+1),1)+ip1jm-iip1+1)*
599 C & dyqv(ismin(iim,dyqv(ip1jm-iip1+1),1)+ip1jm-iip1+1).le.0.)
600 C & aps=0.
601 C
602 C limitation des pentes aux poles
603 C DO ij=1,iip1
604 C dyq(ij)=apn*dyq(ij)
605 C dyq(ip1jm+ij)=aps*dyq(ip1jm+ij)
606 C ENDDO
607 C
608 C test
609 C DO ij=1,iip1
610 C dyq(iip1+ij)=0.
611 C dyq(ip1jm+ij-iip1)=0.
612 C ENDDO
613 C DO ij=1,ip1jmp1
614 C dyq(ij)=dyq(ij)*cos(rlatu((ij-1)/iip1+1))
615 C ENDDO
616 C
617 C changement 10 07 96
618 C IF(dyqv(ismin(iim,dyqv,1))*dyqv(ismax(iim,dyqv,1)).le.0.)
619 C & THEN
620 C DO ij=1,iip1
621 C dyqmax(ij)=0.
622 C ENDDO
623 C ELSE
624 C DO ij=1,iip1
625 C dyqmax(ij)=pente_max*abs(dyqv(ij))
626 C ENDDO
627 C ENDIF
628 C
629 C IF(dyqv(ismax(iim,dyqv(ip1jm-iip1+1),1)+ip1jm-iip1+1)*
630 C & dyqv(ismin(iim,dyqv(ip1jm-iip1+1),1)+ip1jm-iip1+1).le.0.)
631 C &THEN
632 C DO ij=ip1jm+1,ip1jmp1
633 C dyqmax(ij)=0.
634 C ENDDO
635 C ELSE
636 C DO ij=ip1jm+1,ip1jmp1
637 C dyqmax(ij)=pente_max*abs(dyqv(ij-iip1))
638 C ENDDO
639 C ENDIF
640 C fin changement 10 07 96
641 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
642
643 c calcul des pentes limitees
644
645 DO ij=iip2,ip1jm
646 IF(dyqv(ij)*dyqv(ij-iip1).gt.0.) THEN
647 dyq(ij,l)=sign(min(abs(dyq(ij,l)),dyqmax(ij)),dyq(ij,l))
648 ELSE
649 dyq(ij,l)=0.
650 ENDIF
651 ENDDO
652
653 ENDDO
654
655 DO l=1,llm
656 DO ij=1,ip1jm
657 IF(masse_adv_v(ij,l).gt.0) THEN
658 qbyv(ij,l)=q(ij+iip1,l)+dyq(ij+iip1,l)*
659 , 0.5*(1.-masse_adv_v(ij,l)/masse(ij+iip1,l))
660 ELSE
661 qbyv(ij,l)=q(ij,l)-dyq(ij,l)*
662 , 0.5*(1.+masse_adv_v(ij,l)/masse(ij,l))
663 ENDIF
664 qbyv(ij,l)=masse_adv_v(ij,l)*qbyv(ij,l)
665 ENDDO
666 ENDDO
667
668
669 DO l=1,llm
670 DO ij=iip2,ip1jm
671 newmasse=masse(ij,l)
672 & +masse_adv_v(ij,l)-masse_adv_v(ij-iip1,l)
673 q(ij,l)=(q(ij,l)*masse(ij,l)+qbyv(ij,l)-qbyv(ij-iip1,l))
674 & /newmasse
675 masse(ij,l)=newmasse
676 ENDDO
677 c.-. ancienne version
678 c convpn=SSUM(iim,qbyv(1,l),1)/apoln
679 c convmpn=ssum(iim,masse_adv_v(1,l),1)/apoln
680
681 convpn=SSUM(iim,qbyv(1,l),1)
682 convmpn=ssum(iim,masse_adv_v(1,l),1)
683 massepn=ssum(iim,masse(1,l),1)
684 qpn=0.
685 do ij=1,iim
686 qpn=qpn+masse(ij,l)*q(ij,l)
687 enddo
688 qpn=(qpn+convpn)/(massepn+convmpn)
689 do ij=1,iip1
690 q(ij,l)=qpn
691 enddo
692
693 c convps=-SSUM(iim,qbyv(ip1jm-iim,l),1)/apols
694 c convmps=-ssum(iim,masse_adv_v(ip1jm-iim,l),1)/apols
695
696 convps=-SSUM(iim,qbyv(ip1jm-iim,l),1)
697 convmps=-ssum(iim,masse_adv_v(ip1jm-iim,l),1)
698 masseps=ssum(iim, masse(ip1jm+1,l),1)
699 qps=0.
700 do ij = ip1jm+1,ip1jmp1-1
701 qps=qps+masse(ij,l)*q(ij,l)
702 enddo
703 qps=(qps+convps)/(masseps+convmps)
704 do ij=ip1jm+1,ip1jmp1
705 q(ij,l)=qps
706 enddo
707
708 c.-. fin ancienne version
709
710 c._. nouvelle version
711 c convpn=SSUM(iim,qbyv(1,l),1)
712 c convmpn=ssum(iim,masse_adv_v(1,l),1)
713 c oldmasse=ssum(iim,masse(1,l),1)
714 c newmasse=oldmasse+convmpn
715 c newq=(q(1,l)*oldmasse+convpn)/newmasse
716 c newmasse=newmasse/apoln
717 c DO ij = 1,iip1
718 c q(ij,l)=newq
719 c masse(ij,l)=newmasse*aire(ij)
720 c ENDDO
721 c convps=-SSUM(iim,qbyv(ip1jm-iim,l),1)
722 c convmps=-ssum(iim,masse_adv_v(ip1jm-iim,l),1)
723 c oldmasse=ssum(iim,masse(ip1jm-iim,l),1)
724 c newmasse=oldmasse+convmps
725 c newq=(q(ip1jmp1,l)*oldmasse+convps)/newmasse
726 c newmasse=newmasse/apols
727 c DO ij = ip1jm+1,ip1jmp1
728 c q(ij,l)=newq
729 c masse(ij,l)=newmasse*aire(ij)
730 c ENDDO
731 c._. fin nouvelle version
732 ENDDO
733
734 RETURN
735 END
736 SUBROUTINE vlz(q,pente_max,masse,w)
737 c
738 c Auteurs: P.Le Van, F.Hourdin, F.Forget
739 c
740 c ********************************************************************
741 c Shema d'advection " pseudo amont " .
742 c ********************************************************************
743 c q,pbaru,pbarv,w sont des arguments d'entree pour le s-pg ....
744 c dq sont des arguments de sortie pour le s-pg ....
745 c
746 c
747 c --------------------------------------------------------------------
748 use dimens_m
749 use paramet_m
750 use comconst
751 use comvert
752 use logic
753 IMPLICIT NONE
754 c
755 c
756 c
757 c Arguments:
758 c ----------
759 REAL masse(ip1jmp1,llm),pente_max
760 REAL q(ip1jmp1,llm)
761 REAL w(ip1jmp1,llm+1)
762 c
763 c Local
764 c ---------
765 c
766 INTEGER i,ij,l,j,ii
767 c
768 REAL wq(ip1jmp1,llm+1),newmasse
769
770 REAL dzq(ip1jmp1,llm),dzqw(ip1jmp1,llm),adzqw(ip1jmp1,llm),dzqmax
771 REAL sigw
772
773 LOGICAL testcpu
774 SAVE testcpu
775
776 REAL temps0,temps1,temps2,temps3,temps4,temps5,second
777 SAVE temps0,temps1,temps2,temps3,temps4,temps5
778 REAL SSUM
779
780 DATA testcpu/.false./
781 DATA temps0,temps1,temps2,temps3,temps4,temps5/0.,0.,0.,0.,0.,0./
782
783 c On oriente tout dans le sens de la pression c'est a dire dans le
784 c sens de W
785
786 DO l=2,llm
787 DO ij=1,ip1jmp1
788 dzqw(ij,l)=q(ij,l-1)-q(ij,l)
789 adzqw(ij,l)=abs(dzqw(ij,l))
790 ENDDO
791 ENDDO
792
793 DO l=2,llm-1
794 DO ij=1,ip1jmp1
795 IF(dzqw(ij,l)*dzqw(ij,l+1).gt.0.) THEN
796 dzq(ij,l)=0.5*(dzqw(ij,l)+dzqw(ij,l+1))
797 ELSE
798 dzq(ij,l)=0.
799 ENDIF
800 dzqmax=pente_max*min(adzqw(ij,l),adzqw(ij,l+1))
801 dzq(ij,l)=sign(min(abs(dzq(ij,l)),dzqmax),dzq(ij,l))
802 ENDDO
803 ENDDO
804
805 DO ij=1,ip1jmp1
806 dzq(ij,1)=0.
807 dzq(ij,llm)=0.
808 ENDDO
809
810 c ---------------------------------------------------------------
811 c .... calcul des termes d'advection verticale .......
812 c ---------------------------------------------------------------
813
814 c calcul de - d( q * w )/ d(sigma) qu'on ajoute a dq pour calculer dq
815
816 DO l = 1,llm-1
817 do ij = 1,ip1jmp1
818 IF(w(ij,l+1).gt.0.) THEN
819 sigw=w(ij,l+1)/masse(ij,l+1)
820 wq(ij,l+1)=w(ij,l+1)*(q(ij,l+1)+0.5*(1.-sigw)*dzq(ij,l+1))
821 ELSE
822 sigw=w(ij,l+1)/masse(ij,l)
823 wq(ij,l+1)=w(ij,l+1)*(q(ij,l)-0.5*(1.+sigw)*dzq(ij,l))
824 ENDIF
825 ENDDO
826 ENDDO
827
828 DO ij=1,ip1jmp1
829 wq(ij,llm+1)=0.
830 wq(ij,1)=0.
831 ENDDO
832
833 DO l=1,llm
834 DO ij=1,ip1jmp1
835 newmasse=masse(ij,l)+w(ij,l+1)-w(ij,l)
836 q(ij,l)=(q(ij,l)*masse(ij,l)+wq(ij,l+1)-wq(ij,l))
837 & /newmasse
838 masse(ij,l)=newmasse
839 ENDDO
840 ENDDO
841
842 END

  ViewVC Help
Powered by ViewVC 1.1.21