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

Contents of /trunk/dyn3d/advn.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 32 - (show 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 !
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 REAL, intent(in):: pbaru( ip1jmp1,llm ),pbarv( ip1jm,llm)
33 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 IF (prt_level > 9) print *,
591 & '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 print *,'probleme2 au point ij=',ij,
634 s ' l=',l
635 print *,'zz=',zz
636 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 print *,'probleme22 au point ij=',ij
664 s ,' l=',l
665 print *,'zz=',zz
666 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
921 END

  ViewVC Help
Powered by ViewVC 1.1.21