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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 28 - (hide annotations)
Fri Mar 26 18:33:04 2010 UTC (14 years, 2 months ago) by guez
Original Path: trunk/libf/dyn3d/vlsplt.f
File size: 23040 byte(s)
Removed unused "diagedyn.f" and "undefSTD.f".

In "etat0", the variable "dt" of module "temps" was defined from
"landicered.nc", which was meaningless and useless. Replaced "dt" by a
local trash variable.

Removed variable "dt" from module "temps" and created instead a local
variable of "leapfrog" and an argument of "integrd".

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

  ViewVC Help
Powered by ViewVC 1.1.21