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

Annotation of /trunk/dyn3d/advn.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 57 - (hide annotations)
Mon Jan 30 12:54:02 2012 UTC (12 years, 3 months ago) by guez
Original Path: trunk/libf/dyn3d/advn.f
File size: 24302 byte(s)
Write used namelists to file "" instead of standard output.

Avoid aliasing in "inidissip" in calls to "divgrad2", "divgrad",
"gradiv2", "gradiv", "nxgraro2" and "nxgrarot". Add a degenerate
dimension to arrays so they have rank 3, like the dummy arguments in
"divgrad2", "divgrad", "gradiv2", "gradiv", "nxgraro2" and "nxgrarot".

Extract the initialization part from "bilan_dyn" and make a separate
procedure, "init_dynzon", from it.

Move variables from modules "iniprint" and "logic" to module
"conf_gcm_m".

Promote internal procedures of "fxy" to private procedures of module
"fxy_m".

Extracted documentation from "inigeom". Removed useless "save"
attributes. Removed useless intermediate variables. Extracted
processing of poles from loop on latitudes. Write coordinates to file
"longitude_latitude.txt" instead of standard output.

Do not use ozone tracer for radiative transfer.

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

  ViewVC Help
Powered by ViewVC 1.1.21