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

Contents of /trunk/dyn3d/advn.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 57 - (show annotations)
Mon Jan 30 12:54:02 2012 UTC (12 years, 4 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 !
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 conf_gcm_m
22 use comgeom
23 IMPLICIT NONE
24 c
25
26 c
27 c Arguments:
28 c ----------
29 integer mode
30 real masse(ip1jmp1,llm)
31 REAL, intent(in):: pbaru( ip1jmp1,llm ),pbarv( ip1jm,llm)
32 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 use conf_gcm_m
140 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 use conf_gcm_m
257 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 use conf_gcm_m
353 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 use conf_gcm_m
477 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 IF (prt_level > 9) print *,
589 & '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 print *,'probleme2 au point ij=',ij,
632 s ' l=',l
633 print *,'zz=',zz
634 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 print *,'probleme22 au point ij=',ij
662 s ,' l=',l
663 print *,'zz=',zz
664 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 use conf_gcm_m
721 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 use conf_gcm_m
836 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
919 END

  ViewVC Help
Powered by ViewVC 1.1.21