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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3 - (hide annotations)
Wed Feb 27 13:16:39 2008 UTC (16 years, 3 months ago) by guez
File size: 23015 byte(s)
Initial import
1 guez 3 !
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