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

Annotation of /trunk/dyn3d/advn.f

Parent Directory Parent Directory | Revision Log Revision Log


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

  ViewVC Help
Powered by ViewVC 1.1.21