/[lmdze]/trunk/dyn3d/advn.f
ViewVC logotype

Annotation of /trunk/dyn3d/advn.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 32 - (hide annotations)
Tue Apr 6 17:52:58 2010 UTC (14 years, 1 month ago) by guez
Original Path: trunk/libf/dyn3d/advn.f
File size: 24320 byte(s)
Split "stringop.f90" into single-procedure files. Gathered files in directory
"IOIPSL/Stringop".

Split "flincom.f90" into "flincom.f90" and "flinget.f90". Removed
unused procedures from module "flincom". Removed unused argument
"filename" of procedure "flinopen_nozoom".

Removed unused files.

Split "grid_change.f90" into "grid_change.f90" and
"gr_phy_write_3d.f90".

Removed unused procedures from modules "calendar", "ioipslmpp",
"grid_atob", "gath_cpl" and "getincom". Removed unused procedures in
files "ppm3d.f" and "thermcell.f".

Split "mathelp.f90" into "mathelp.f90" and "mathop.f90".

Removed unused variable "dpres" of module "comvert".

Use argument "itau" instead of local variables "iadvtr" and "first" to
control algorithm in procedure "fluxstokenc".

Removed unused arguments of procedure "integrd".

Removed useless computations at the end of procedure "leapfrog".

Merged common block "matrfil" into module "parafilt".

1 guez 3 !
2     ! $Header: /home/cvsroot/LMDZ4/libf/dyn3d/advn.F,v 1.1.1.1 2004/05/19 12:53:06 lmdzadmin Exp $
3     !
4     SUBROUTINE advn(q,masse,w,pbaru,pbarv,pdt,mode)
5     c
6     c Auteur : F. Hourdin
7     c
8     c ********************************************************************
9     c Shema d'advection " pseudo amont " .
10     c ********************************************************************
11     c q,pbaru,pbarv,w sont des arguments d'entree pour le s-pg ....
12     c
13     c pbaru,pbarv,w flux de masse en u ,v ,w
14     c pdt pas de temps
15     c
16     c --------------------------------------------------------------------
17     use dimens_m
18     use paramet_m
19     use comconst
20     use comvert
21     use logic
22     use comgeom
23     use iniprint
24     IMPLICIT NONE
25     c
26    
27     c
28     c Arguments:
29     c ----------
30     integer mode
31     real masse(ip1jmp1,llm)
32 guez 31 REAL, intent(in):: pbaru( ip1jmp1,llm ),pbarv( ip1jm,llm)
33 guez 3 REAL q(ip1jmp1,llm)
34     REAL w(ip1jmp1,llm),pdt
35     c
36     c Local
37     c ---------
38     c
39     INTEGER i,ij,l,j,ii
40     integer ijlqmin,iqmin,jqmin,lqmin
41     integer ismin
42     c
43     real zm(ip1jmp1,llm),newmasse
44     real mu(ip1jmp1,llm)
45     real mv(ip1jm,llm)
46     real mw(ip1jmp1,llm+1)
47     real zq(ip1jmp1,llm),zz,qpn,qps
48     real zqg(ip1jmp1,llm),zqd(ip1jmp1,llm)
49     real zqs(ip1jmp1,llm),zqn(ip1jmp1,llm)
50     real zqh(ip1jmp1,llm),zqb(ip1jmp1,llm)
51     real temps0,temps1,temps2,temps3
52     real ztemps1,ztemps2,ztemps3,ssum
53     logical testcpu
54     save testcpu
55     save temps1,temps2,temps3
56     real zzpbar,zzw
57    
58     real qmin,qmax
59     data qmin,qmax/0.,1./
60     data testcpu/.false./
61     data temps1,temps2,temps3/0.,0.,0./
62    
63     zzpbar = 0.5 * pdt
64     zzw = pdt
65    
66     DO l=1,llm
67     DO ij = iip2,ip1jm
68     mu(ij,l)=pbaru(ij,l) * zzpbar
69     ENDDO
70     DO ij=1,ip1jm
71     mv(ij,l)=pbarv(ij,l) * zzpbar
72     ENDDO
73     DO ij=1,ip1jmp1
74     mw(ij,l)=w(ij,l) * zzw
75     ENDDO
76     ENDDO
77    
78     DO ij=1,ip1jmp1
79     mw(ij,llm+1)=0.
80     ENDDO
81    
82     do l=1,llm
83     qpn=0.
84     qps=0.
85     do ij=1,iim
86     qpn=qpn+q(ij,l)*masse(ij,l)
87     qps=qps+q(ip1jm+ij,l)*masse(ip1jm+ij,l)
88     enddo
89     qpn=qpn/ssum(iim,masse(1,l),1)
90     qps=qps/ssum(iim,masse(ip1jm+1,l),1)
91     do ij=1,iip1
92     q(ij,l)=qpn
93     q(ip1jm+ij,l)=qps
94     enddo
95     enddo
96    
97     do ij=1,ip1jmp1
98     mw(ij,llm+1)=0.
99     enddo
100     do l=1,llm
101     do ij=1,ip1jmp1
102     zq(ij,l)=q(ij,l)
103     zm(ij,l)=masse(ij,l)
104     enddo
105     enddo
106    
107     c call minmaxq(zq,qmin,qmax,'avant vlx ')
108     call advnqx(zq,zqg,zqd)
109     call advnx(zq,zqg,zqd,zm,mu,mode)
110     call advnqy(zq,zqs,zqn)
111     call advny(zq,zqs,zqn,zm,mv)
112     call advnqz(zq,zqh,zqb)
113     call advnz(zq,zqh,zqb,zm,mw)
114     c call vlz(zq,0.,zm,mw)
115     call advnqy(zq,zqs,zqn)
116     call advny(zq,zqs,zqn,zm,mv)
117     call advnqx(zq,zqg,zqd)
118     call advnx(zq,zqg,zqd,zm,mu,mode)
119     c call minmaxq(zq,qmin,qmax,'apres vlx ')
120    
121     do l=1,llm
122     do ij=1,ip1jmp1
123     q(ij,l)=zq(ij,l)
124     enddo
125     do ij=1,ip1jm+1,iip1
126     q(ij+iim,l)=q(ij,l)
127     enddo
128     enddo
129    
130     RETURN
131     END
132    
133     SUBROUTINE advnqx(q,qg,qd)
134     c
135     c Auteurs: Calcul des valeurs de q aux point u.
136     c
137     c --------------------------------------------------------------------
138     use dimens_m
139     use paramet_m
140     use iniprint
141     IMPLICIT NONE
142     c
143     c
144     c
145     c Arguments:
146     c ----------
147     real q(ip1jmp1,llm),qg(ip1jmp1,llm),qd(ip1jmp1,llm)
148     c
149     c Local
150     c ---------
151     c
152     INTEGER ij,l
153     c
154     real dxqu(ip1jmp1),zqu(ip1jmp1)
155     real zqmax(ip1jmp1),zqmin(ip1jmp1)
156     logical extremum(ip1jmp1)
157    
158     integer mode
159     save mode
160     data mode/1/
161    
162     c calcul des pentes en u:
163     c -----------------------
164     if (mode.eq.0) then
165     do l=1,llm
166     do ij=1,ip1jm
167     qd(ij,l)=q(ij,l)
168     qg(ij,l)=q(ij,l)
169     enddo
170     enddo
171     else
172     do l = 1, llm
173     do ij=iip2,ip1jm-1
174     dxqu(ij)=q(ij+1,l)-q(ij,l)
175     zqu(ij)=0.5*(q(ij+1,l)+q(ij,l))
176     enddo
177     do ij=iip1+iip1,ip1jm,iip1
178     dxqu(ij)=dxqu(ij-iim)
179     zqu(ij)=zqu(ij-iim)
180     enddo
181     do ij=iip2,ip1jm-1
182     zqu(ij)=zqu(ij)-dxqu(ij+1)/12.
183     enddo
184     do ij=iip1+iip1,ip1jm,iip1
185     zqu(ij)=zqu(ij-iim)
186     enddo
187     do ij=iip2+1,ip1jm
188     zqu(ij)=zqu(ij)+dxqu(ij-1)/12.
189     enddo
190     do ij=iip1+iip1,ip1jm,iip1
191     zqu(ij-iim)=zqu(ij)
192     enddo
193    
194     c calcul des valeurs max et min acceptees aux interfaces
195    
196     do ij=iip2,ip1jm-1
197     zqmax(ij)=max(q(ij+1,l),q(ij,l))
198     zqmin(ij)=min(q(ij+1,l),q(ij,l))
199     enddo
200     do ij=iip1+iip1,ip1jm,iip1
201     zqmax(ij)=zqmax(ij-iim)
202     zqmin(ij)=zqmin(ij-iim)
203     enddo
204     do ij=iip2+1,ip1jm
205     extremum(ij)=dxqu(ij)*dxqu(ij-1).le.0.
206     enddo
207     do ij=iip1+iip1,ip1jm,iip1
208     extremum(ij-iim)=extremum(ij)
209     enddo
210     do ij=iip2,ip1jm
211     zqu(ij)=min(max(zqmin(ij),zqu(ij)),zqmax(ij))
212     enddo
213     do ij=iip2+1,ip1jm
214     if(extremum(ij)) then
215     qg(ij,l)=q(ij,l)
216     qd(ij,l)=q(ij,l)
217     else
218     qd(ij,l)=zqu(ij)
219     qg(ij,l)=zqu(ij-1)
220     endif
221     enddo
222     do ij=iip1+iip1,ip1jm,iip1
223     qd(ij-iim,l)=qd(ij,l)
224     qg(ij-iim,l)=qg(ij,l)
225     enddo
226    
227     goto 8888
228    
229     do ij=iip2+1,ip1jm
230     if(extremum(ij).and..not.extremum(ij-1))
231     s qd(ij-1,l)=q(ij,l)
232     enddo
233    
234     do ij=iip1+iip1,ip1jm,iip1
235     qd(ij-iim,l)=qd(ij,l)
236     enddo
237     do ij=iip2,ip1jm-1
238     if (extremum(ij).and..not.extremum(ij+1))
239     s qg(ij+1,l)=q(ij,l)
240     enddo
241    
242     do ij=iip1+iip1,ip1jm,iip1
243     qg(ij,l)=qg(ij-iim,l)
244     enddo
245     8888 continue
246     enddo
247     endif
248     RETURN
249     END
250     SUBROUTINE advnqy(q,qs,qn)
251     c
252     c Auteurs: Calcul des valeurs de q aux point v.
253     c
254     c --------------------------------------------------------------------
255     use dimens_m
256     use paramet_m
257     use iniprint
258     IMPLICIT NONE
259     c
260     c
261     c
262     c Arguments:
263     c ----------
264     real q(ip1jmp1,llm),qs(ip1jmp1,llm),qn(ip1jmp1,llm)
265     c
266     c Local
267     c ---------
268     c
269     INTEGER ij,l
270     c
271     real dyqv(ip1jm),zqv(ip1jm,llm)
272     real zqmax(ip1jm),zqmin(ip1jm)
273     logical extremum(ip1jmp1)
274    
275     integer mode
276     save mode
277     data mode/1/
278    
279     if (mode.eq.0) then
280     do l=1,llm
281     do ij=1,ip1jmp1
282     qn(ij,l)=q(ij,l)
283     qs(ij,l)=q(ij,l)
284     enddo
285     enddo
286     else
287    
288     c calcul des pentes en u:
289     c -----------------------
290     do l = 1, llm
291     do ij=1,ip1jm
292     dyqv(ij)=q(ij,l)-q(ij+iip1,l)
293     enddo
294    
295     do ij=iip2,ip1jm-iip1
296     zqv(ij,l)=0.5*(q(ij+iip1,l)+q(ij,l))
297     zqv(ij,l)=zqv(ij,l)+(dyqv(ij+iip1)-dyqv(ij-iip1))/12.
298     enddo
299    
300     do ij=iip2,ip1jm
301     extremum(ij)=dyqv(ij)*dyqv(ij-iip1).le.0.
302     enddo
303    
304     c Pas de pentes aux poles
305     do ij=1,iip1
306     zqv(ij,l)=q(ij,l)
307     zqv(ip1jm-iip1+ij,l)=q(ip1jm+ij,l)
308     extremum(ij)=.true.
309     extremum(ip1jmp1-iip1+ij)=.true.
310     enddo
311    
312     c calcul des valeurs max et min acceptees aux interfaces
313     do ij=1,ip1jm
314     zqmax(ij)=max(q(ij+iip1,l),q(ij,l))
315     zqmin(ij)=min(q(ij+iip1,l),q(ij,l))
316     enddo
317    
318     do ij=1,ip1jm
319     zqv(ij,l)=min(max(zqmin(ij),zqv(ij,l)),zqmax(ij))
320     enddo
321    
322     do ij=iip2,ip1jm
323     if(extremum(ij)) then
324     qs(ij,l)=q(ij,l)
325     qn(ij,l)=q(ij,l)
326     c if (.not.extremum(ij-iip1)) qs(ij-iip1,l)=q(ij,l)
327     c if (.not.extremum(ij+iip1)) qn(ij+iip1,l)=q(ij,l)
328     else
329     qs(ij,l)=zqv(ij,l)
330     qn(ij,l)=zqv(ij-iip1,l)
331     endif
332     enddo
333    
334     do ij=1,iip1
335     qs(ij,l)=q(ij,l)
336     qn(ij,l)=q(ij,l)
337     qs(ip1jm+ij,l)=q(ip1jm+ij,l)
338     qn(ip1jm+ij,l)=q(ip1jm+ij,l)
339     enddo
340    
341     enddo
342     endif
343     RETURN
344     END
345    
346     SUBROUTINE advnqz(q,qh,qb)
347     c
348     c Auteurs: Calcul des valeurs de q aux point v.
349     c
350     c --------------------------------------------------------------------
351     use dimens_m
352     use paramet_m
353     use iniprint
354     IMPLICIT NONE
355     c
356     c
357     c
358     c Arguments:
359     c ----------
360     real q(ip1jmp1,llm),qh(ip1jmp1,llm),qb(ip1jmp1,llm)
361     c
362     c Local
363     c ---------
364     c
365     INTEGER ij,l
366     c
367     real dzqw(ip1jmp1,llm+1),zqw(ip1jmp1,llm+1)
368     real zqmax(ip1jmp1,llm),zqmin(ip1jmp1,llm)
369     logical extremum(ip1jmp1,llm)
370    
371     integer mode
372     save mode
373    
374     data mode/1/
375    
376     c calcul des pentes en u:
377     c -----------------------
378    
379     if (mode.eq.0) then
380     do l=1,llm
381     do ij=1,ip1jmp1
382     qb(ij,l)=q(ij,l)
383     qh(ij,l)=q(ij,l)
384     enddo
385     enddo
386     else
387     do l = 2, llm
388     do ij=1,ip1jmp1
389     dzqw(ij,l)=q(ij,l-1)-q(ij,l)
390     zqw(ij,l)=0.5*(q(ij,l-1)+q(ij,l))
391     enddo
392     enddo
393     do ij=1,ip1jmp1
394     dzqw(ij,1)=0.
395     dzqw(ij,llm+1)=0.
396     enddo
397     do l=2,llm
398     do ij=1,ip1jmp1
399     zqw(ij,l)=zqw(ij,l)+(dzqw(ij,l+1)-dzqw(ij,l-1))/12.
400     enddo
401     enddo
402     do l=2,llm-1
403     do ij=1,ip1jmp1
404     extremum(ij,l)=dzqw(ij,l)*dzqw(ij,l+1).le.0.
405     enddo
406     enddo
407    
408     c Pas de pentes en bas et en haut
409     do ij=1,ip1jmp1
410     zqw(ij,2)=q(ij,1)
411     zqw(ij,llm)=q(ij,llm)
412     extremum(ij,1)=.true.
413     extremum(ij,llm)=.true.
414     enddo
415    
416     c calcul des valeurs max et min acceptees aux interfaces
417     do l=2,llm
418     do ij=1,ip1jmp1
419     zqmax(ij,l)=max(q(ij,l-1),q(ij,l))
420     zqmin(ij,l)=min(q(ij,l-1),q(ij,l))
421     enddo
422     enddo
423    
424     do l=2,llm
425     do ij=1,ip1jmp1
426     zqw(ij,l)=min(max(zqmin(ij,l),zqw(ij,l)),zqmax(ij,l))
427     enddo
428     enddo
429    
430     do l=2,llm-1
431     do ij=1,ip1jmp1
432     if(extremum(ij,l)) then
433     qh(ij,l)=q(ij,l)
434     qb(ij,l)=q(ij,l)
435     else
436     qh(ij,l)=zqw(ij,l+1)
437     qb(ij,l)=zqw(ij,l)
438     endif
439     enddo
440     enddo
441     c do l=2,llm-1
442     c do ij=1,ip1jmp1
443     c if(extremum(ij,l)) then
444     c if (.not.extremum(ij,l-1)) qh(ij,l-1)=q(ij,l)
445     c if (.not.extremum(ij,l+1)) qb(ij,l+1)=q(ij,l)
446     c endif
447     c enddo
448     c enddo
449    
450     do ij=1,ip1jmp1
451     qb(ij,1)=q(ij,1)
452     qh(ij,1)=q(ij,1)
453     qb(ij,llm)=q(ij,llm)
454     qh(ij,llm)=q(ij,llm)
455     enddo
456    
457     endif
458    
459     RETURN
460     END
461    
462     SUBROUTINE advnx(q,qg,qd,masse,u_m,mode)
463     c
464     c Auteur : F. Hourdin
465     c
466     c ********************************************************************
467     c Shema d'advection " pseudo amont " .
468     c ********************************************************************
469     c nq,iq,q,pbaru,pbarv,w sont des arguments d'entree pour le s-pg ....
470     c
471     c
472     c --------------------------------------------------------------------
473     use dimens_m
474     use paramet_m
475     use comconst
476     use comvert
477     use logic
478     use iniprint
479     IMPLICIT NONE
480     c
481     c
482     c
483     c Arguments:
484     c ----------
485     integer mode
486     real masse(ip1jmp1,llm)
487     real u_m( ip1jmp1,llm )
488     real q(ip1jmp1,llm),qd(ip1jmp1,llm),qg(ip1jmp1,llm)
489     c
490     c Local
491     c ---------
492     c
493     INTEGER i,j,ij,l,indu(ip1jmp1),niju,iju,ijq
494     integer n0,nl(llm)
495     c
496     real new_m,zu_m,zdq,zz
497     real zsigg(ip1jmp1,llm),zsigd(ip1jmp1,llm),zsig
498     real u_mq(ip1jmp1,llm)
499    
500     real zm,zq,zsigm,zsigp,zqm,zqp,zu
501    
502     logical ladvplus(ip1jmp1,llm)
503    
504     real prec
505     save prec
506    
507     data prec/1.e-15/
508    
509     do l=1,llm
510     do ij=iip2,ip1jm
511     zdq=qd(ij,l)-qg(ij,l)
512     if(abs(zdq).gt.prec) then
513     zsigd(ij,l)=(q(ij,l)-qg(ij,l))/zdq
514     zsigg(ij,l)=1.-zsigd(ij,l)
515     else
516     zsigd(ij,l)=0.5
517     zsigg(ij,l)=0.5
518     qd(ij,l)=q(ij,l)
519     qg(ij,l)=q(ij,l)
520     endif
521     enddo
522     enddo
523    
524     c calcul de la pente maximum dans la maille en valeur absolue
525    
526     do l=1,llm
527     do ij=iip2,ip1jm-1
528     if (u_m(ij,l).ge.0.) then
529     zsigp=zsigd(ij,l)
530     zsigm=zsigg(ij,l)
531     zqp=qd(ij,l)
532     zqm=qg(ij,l)
533     zm=masse(ij,l)
534     zq=q(ij,l)
535     else
536     zsigm=zsigd(ij+1,l)
537     zsigp=zsigg(ij+1,l)
538     zqm=qd(ij+1,l)
539     zqp=qg(ij+1,l)
540     zm=masse(ij+1,l)
541     zq=q(ij+1,l)
542     endif
543     zu=abs(u_m(ij,l))
544     ladvplus(ij,l)=zu.gt.zm
545     zsig=zu/zm
546     if(zsig.eq.0.) zsigp=0.1
547     if (mode.eq.1) then
548     if (zsig.le.zsigp) then
549     u_mq(ij,l)=u_m(ij,l)*zqp
550     else if (mode.eq.1) then
551     u_mq(ij,l)=
552     s sign(zm,u_m(ij,l))*(zsigp*zqp+(zsig-zsigp)*zqm)
553     endif
554     else
555     if (zsig.le.zsigp) then
556     u_mq(ij,l)=u_m(ij,l)*(zqp-0.5*zsig/zsigp*(zqp-zq))
557     else
558     zz=0.5*(zsig-zsigp)/zsigm
559     u_mq(ij,l)=sign(zm,u_m(ij,l))*( 0.5*(zq+zqp)*zsigp
560     s +(zsig-zsigp)*(zq+zz*(zqm-zq)) )
561     endif
562     endif
563     enddo
564     enddo
565    
566     do l=1,llm
567     do ij=iip1+iip1,ip1jm,iip1
568     u_mq(ij,l)=u_mq(ij-iim,l)
569     ladvplus(ij,l)=ladvplus(ij-iim,l)
570     enddo
571     enddo
572    
573     c=================================================================
574     C SCHEMA SEMI-LAGRAGIEN EN X DANS LES REGIONS POLAIRES
575     c=================================================================
576     c tris des regions a traiter
577     n0=0
578     do l=1,llm
579     nl(l)=0
580     do ij=iip2,ip1jm
581     if(ladvplus(ij,l)) then
582     nl(l)=nl(l)+1
583     u_mq(ij,l)=0.
584     endif
585     enddo
586     n0=n0+nl(l)
587     enddo
588    
589     if(n0.gt.1) then
590 guez 12 IF (prt_level > 9) print *,
591 guez 3 & 'Nombre de points pour lesquels on advect plus que le'
592     & ,'contenu de la maille : ',n0
593    
594     do l=1,llm
595     if(nl(l).gt.0) then
596     iju=0
597     c indicage des mailles concernees par le traitement special
598     do ij=iip2,ip1jm
599     if(ladvplus(ij,l).and.mod(ij,iip1).ne.0) then
600     iju=iju+1
601     indu(iju)=ij
602     endif
603     enddo
604     niju=iju
605    
606     c traitement des mailles
607     do iju=1,niju
608     ij=indu(iju)
609     j=(ij-1)/iip1+1
610     zu_m=u_m(ij,l)
611     u_mq(ij,l)=0.
612     if(zu_m.gt.0.) then
613     ijq=ij
614     i=ijq-(j-1)*iip1
615     c accumulation pour les mailles completements advectees
616     do while(zu_m.gt.masse(ijq,l))
617     u_mq(ij,l)=u_mq(ij,l)+q(ijq,l)*masse(ijq,l)
618     zu_m=zu_m-masse(ijq,l)
619     i=mod(i-2+iim,iim)+1
620     ijq=(j-1)*iip1+i
621     enddo
622     c MODIFS SPECIFIQUES DU SCHEMA
623     c ajout de la maille non completement advectee
624     zsig=zu_m/masse(ijq,l)
625     if(zsig.le.zsigd(ijq,l)) then
626     u_mq(ij,l)=u_mq(ij,l)+zu_m*(qd(ijq,l)
627     s -0.5*zsig/zsigd(ijq,l)*(qd(ijq,l)-q(ijq,l)))
628     else
629     c u_mq(ij,l)=u_mq(ij,l)+zu_m*q(ijq,l)
630     c goto 8888
631     zz=0.5*(zsig-zsigd(ijq,l))/zsigg(ijq,l)
632     if(.not.(zz.gt.0..and.zz.le.0.5)) then
633 guez 12 print *,'probleme2 au point ij=',ij,
634 guez 3 s ' l=',l
635 guez 12 print *,'zz=',zz
636 guez 3 stop
637     endif
638     u_mq(ij,l)=u_mq(ij,l)+masse(ijq,l)*(
639     s 0.5*(q(ijq,l)+qd(ijq,l))*zsigd(ijq,l)
640     s +(zsig-zsigd(ijq,l))*(q(ijq,l)+zz*(qg(ijq,l)-q(ijq,l))) )
641     endif
642     else
643     ijq=ij+1
644     i=ijq-(j-1)*iip1
645     c accumulation pour les mailles completements advectees
646     do while(-zu_m.gt.masse(ijq,l))
647     u_mq(ij,l)=u_mq(ij,l)-q(ijq,l)*masse(ijq,l)
648     zu_m=zu_m+masse(ijq,l)
649     i=mod(i,iim)+1
650     ijq=(j-1)*iip1+i
651     enddo
652     c ajout de la maille non completement advectee
653     c 2eme MODIF SPECIFIQUE
654     zsig=-zu_m/masse(ij+1,l)
655     if(zsig.le.zsigg(ijq,l)) then
656     u_mq(ij,l)=u_mq(ij,l)+zu_m*(qg(ijq,l)
657     s -0.5*zsig/zsigg(ijq,l)*(qg(ijq,l)-q(ijq,l)))
658     else
659     c u_mq(ij,l)=u_mq(ij,l)+zu_m*q(ijq,l)
660     c goto 9999
661     zz=0.5*(zsig-zsigg(ijq,l))/zsigd(ijq,l)
662     if(.not.(zz.gt.0..and.zz.le.0.5)) then
663 guez 12 print *,'probleme22 au point ij=',ij
664 guez 3 s ,' l=',l
665 guez 12 print *,'zz=',zz
666 guez 3 stop
667     endif
668     u_mq(ij,l)=u_mq(ij,l)-masse(ijq,l)*(
669     s 0.5*(q(ijq,l)+qg(ijq,l))*zsigg(ijq,l)
670     s +(zsig-zsigg(ijq,l))*
671     s (q(ijq,l)+zz*(qd(ijq,l)-q(ijq,l))) )
672     endif
673     c fin de la modif
674     endif
675     enddo
676     endif
677     enddo
678     endif ! n0.gt.0
679    
680     c bouclage en latitude
681     do l=1,llm
682     do ij=iip1+iip1,ip1jm,iip1
683     u_mq(ij,l)=u_mq(ij-iim,l)
684     enddo
685     enddo
686    
687     c=================================================================
688     c CALCUL DE LA CONVERGENCE DES FLUX
689     c=================================================================
690    
691     do l=1,llm
692     do ij=iip2+1,ip1jm
693     new_m=masse(ij,l)+u_m(ij-1,l)-u_m(ij,l)
694     q(ij,l)=(q(ij,l)*masse(ij,l)+
695     & u_mq(ij-1,l)-u_mq(ij,l))
696     & /new_m
697     masse(ij,l)=new_m
698     enddo
699     c Modif Fred 22 03 96 correction d'un bug (les scopy ci-dessous)
700     do ij=iip1+iip1,ip1jm,iip1
701     q(ij-iim,l)=q(ij,l)
702     masse(ij-iim,l)=masse(ij,l)
703     enddo
704     enddo
705    
706     RETURN
707     END
708     SUBROUTINE advny(q,qs,qn,masse,v_m)
709     c
710     c Auteur : F. Hourdin
711     c
712     c ********************************************************************
713     c Shema d'advection " pseudo amont " .
714     c ********************************************************************
715     c nq,iq,q,pbaru,pbarv,w sont des arguments d'entree pour le s-pg ....
716     c
717     c
718     c --------------------------------------------------------------------
719     use dimens_m
720     use paramet_m
721     use comgeom
722     use iniprint
723     IMPLICIT NONE
724     c
725     c
726     c
727     c Arguments:
728     c ----------
729     real masse(ip1jmp1,llm)
730     real v_m( ip1jm,llm )
731     real q(ip1jmp1,llm),qn(ip1jmp1,llm),qs(ip1jmp1,llm)
732     c
733     c Local
734     c ---------
735     c
736     INTEGER ij,l
737     c
738     real new_m,zdq,zz
739     real zsigs(ip1jmp1),zsign(ip1jmp1),zsig
740     real v_mq(ip1jm,llm)
741     real convpn,convps,convmpn,convmps,massen,masses
742     real zm,zq,zsigm,zsigp,zqm,zqp
743     real ssum
744     real prec
745     save prec
746    
747     data prec/1.e-15/
748     do l=1,llm
749     do ij=1,ip1jmp1
750     zdq=qn(ij,l)-qs(ij,l)
751     if(abs(zdq).gt.prec) then
752     zsign(ij)=(q(ij,l)-qs(ij,l))/zdq
753     zsigs(ij)=1.-zsign(ij)
754     else
755     zsign(ij)=0.5
756     zsigs(ij)=0.5
757     endif
758     enddo
759    
760     c calcul de la pente maximum dans la maille en valeur absolue
761    
762     do ij=1,ip1jm
763     if (v_m(ij,l).ge.0.) then
764     zsigp=zsign(ij+iip1)
765     zsigm=zsigs(ij+iip1)
766     zqp=qn(ij+iip1,l)
767     zqm=qs(ij+iip1,l)
768     zm=masse(ij+iip1,l)
769     zq=q(ij+iip1,l)
770     else
771     zsigm=zsign(ij)
772     zsigp=zsigs(ij)
773     zqm=qn(ij,l)
774     zqp=qs(ij,l)
775     zm=masse(ij,l)
776     zq=q(ij,l)
777     endif
778     zsig=abs(v_m(ij,l))/zm
779     if(zsig.eq.0.) zsigp=0.1
780     if (zsig.le.zsigp) then
781     v_mq(ij,l)=v_m(ij,l)*(zqp-0.5*zsig/zsigp*(zqp-zq))
782     else
783     zz=0.5*(zsig-zsigp)/zsigm
784     v_mq(ij,l)=sign(zm,v_m(ij,l))*( 0.5*(zq+zqp)*zsigp
785     s +(zsig-zsigp)*(zq+zz*(zqm-zq)) )
786     endif
787     enddo
788     enddo
789    
790     do l=1,llm
791     do ij=iip2,ip1jm
792     new_m=masse(ij,l)
793     & +v_m(ij,l)-v_m(ij-iip1,l)
794     q(ij,l)=(q(ij,l)*masse(ij,l)+v_mq(ij,l)-v_mq(ij-iip1,l))
795     & /new_m
796     masse(ij,l)=new_m
797     enddo
798     c.-. ancienne version
799     convpn=SSUM(iim,v_mq(1,l),1)
800     convmpn=ssum(iim,v_m(1,l),1)
801     massen=ssum(iim,masse(1,l),1)
802     new_m=massen+convmpn
803     q(1,l)=(q(1,l)*massen+convpn)/new_m
804     do ij = 1,iip1
805     q(ij,l)=q(1,l)
806     masse(ij,l)=new_m*aire(ij)/apoln
807     enddo
808    
809     convps=-SSUM(iim,v_mq(ip1jm-iim,l),1)
810     convmps=-ssum(iim,v_m(ip1jm-iim,l),1)
811     masses=ssum(iim,masse(ip1jm+1,l),1)
812     new_m=masses+convmps
813     q(ip1jm+1,l)=(q(ip1jm+1,l)*masses+convps)/new_m
814     do ij = ip1jm+1,ip1jmp1
815     q(ij,l)=q(ip1jm+1,l)
816     masse(ij,l)=new_m*aire(ij)/apols
817     enddo
818     enddo
819    
820     RETURN
821     END
822     SUBROUTINE advnz(q,qh,qb,masse,w_m)
823     c
824     c Auteurs: F.Hourdin
825     c
826     c ********************************************************************
827     c Shema d'advection " pseudo amont " .
828     c b designe le bas et h le haut
829     c il y a une correspondance entre le b en z et le d en x
830     c ********************************************************************
831     c
832     c
833     c --------------------------------------------------------------------
834     use dimens_m
835     use paramet_m
836     use comgeom
837     use iniprint
838     IMPLICIT NONE
839     c
840     c
841     c
842     c Arguments:
843     c ----------
844     real masse(ip1jmp1,llm)
845     real w_m( ip1jmp1,llm+1)
846     real q(ip1jmp1,llm),qb(ip1jmp1,llm),qh(ip1jmp1,llm)
847    
848     c
849     c Local
850     c ---------
851     c
852     INTEGER ij,l
853     c
854     real new_m,zdq,zz
855     real zsigh(ip1jmp1,llm),zsigb(ip1jmp1,llm),zsig
856     real w_mq(ip1jmp1,llm+1)
857     real zm,zq,zsigm,zsigp,zqm,zqp
858     real prec
859     save prec
860    
861     data prec/1.e-13/
862    
863     do l=1,llm
864     do ij=1,ip1jmp1
865     zdq=qb(ij,l)-qh(ij,l)
866     if(abs(zdq).gt.prec) then
867     zsigb(ij,l)=(q(ij,l)-qh(ij,l))/zdq
868     zsigh(ij,l)=1.-zsigb(ij,l)
869     zsigb(ij,l)=min(max(zsigb(ij,l),0.),1.)
870     else
871     zsigb(ij,l)=0.5
872     zsigh(ij,l)=0.5
873     endif
874     enddo
875     enddo
876    
877     c calcul de la pente maximum dans la maille en valeur absolue
878     do l=2,llm
879     do ij=1,ip1jmp1
880     if (w_m(ij,l).ge.0.) then
881     zsigp=zsigb(ij,l)
882     zsigm=zsigh(ij,l)
883     zqp=qb(ij,l)
884     zqm=qh(ij,l)
885     zm=masse(ij,l)
886     zq=q(ij,l)
887     else
888     zsigm=zsigb(ij,l-1)
889     zsigp=zsigh(ij,l-1)
890     zqm=qb(ij,l-1)
891     zqp=qh(ij,l-1)
892     zm=masse(ij,l-1)
893     zq=q(ij,l-1)
894     endif
895     zsig=abs(w_m(ij,l))/zm
896     if(zsig.eq.0.) zsigp=0.1
897     if (zsig.le.zsigp) then
898     w_mq(ij,l)=w_m(ij,l)*(zqp-0.5*zsig/zsigp*(zqp-zq))
899     else
900     zz=0.5*(zsig-zsigp)/zsigm
901     w_mq(ij,l)=sign(zm,w_m(ij,l))*( 0.5*(zq+zqp)*zsigp
902     s +(zsig-zsigp)*(zq+zz*(zqm-zq)) )
903     endif
904     enddo
905     enddo
906    
907     do ij=1,ip1jmp1
908     w_mq(ij,llm+1)=0.
909     w_mq(ij,1)=0.
910     enddo
911    
912     do l=1,llm
913     do ij=1,ip1jmp1
914     new_m=masse(ij,l)+w_m(ij,l+1)-w_m(ij,l)
915     q(ij,l)=(q(ij,l)*masse(ij,l)+w_mq(ij,l+1)-w_mq(ij,l))
916     & /new_m
917     masse(ij,l)=new_m
918     enddo
919     enddo
920 guez 32
921 guez 3 END

  ViewVC Help
Powered by ViewVC 1.1.21