/[lmdze]/trunk/dyn3d/Vlsplt/vlsplt.f
ViewVC logotype

Contents of /trunk/dyn3d/Vlsplt/vlsplt.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 28 - (show annotations)
Fri Mar 26 18:33:04 2010 UTC (14 years, 2 months ago) by guez
Original Path: trunk/libf/dyn3d/vlsplt.f
File size: 23040 byte(s)
Removed unused "diagedyn.f" and "undefSTD.f".

In "etat0", the variable "dt" of module "temps" was defined from
"landicered.nc", which was meaningless and useless. Replaced "dt" by a
local trash variable.

Removed variable "dt" from module "temps" and created instead a local
variable of "leapfrog" and an argument of "integrd".

1 !
2 ! $Header: /home/cvsroot/LMDZ4/libf/dyn3d/vlsplt.F,v 1.2 2005/02/24 12:16:57 fairhead Exp $
3 !
4 c
5 c
6
7 SUBROUTINE vlsplt(q,pente_max,masse,w,pbaru,pbarv,pdt)
8 c
9 c Auteurs: P.Le Van, F.Hourdin, F.Forget
10 c
11 c ********************************************************************
12 c Shema d'advection " pseudo amont " .
13 c ********************************************************************
14 c q,pbaru,pbarv,w sont des arguments d'entree pour le s-pg ....
15 c
16 c pente_max facteur de limitation des pentes: 2 en general
17 c 0 pour un schema amont
18 c pbaru,pbarv,w flux de masse en u ,v ,w
19 c pdt pas de temps
20 c
21 c --------------------------------------------------------------------
22 use dimens_m
23 use paramet_m
24 use comconst
25 use comvert
26 use logic
27 IMPLICIT NONE
28 c
29
30 c
31 c Arguments:
32 c ----------
33 REAL masse(ip1jmp1,llm),pente_max
34 c REAL masse(iip1,jjp1,llm),pente_max
35 REAL pbaru( ip1jmp1,llm ),pbarv( ip1jm,llm)
36 REAL q(ip1jmp1,llm)
37 c REAL q(iip1,jjp1,llm)
38 REAL w(ip1jmp1,llm)
39 real, intent(in):: pdt
40 c
41 c Local
42 c ---------
43 c
44 INTEGER i,ij,l,j,ii
45 INTEGER ijlqmin,iqmin,jqmin,lqmin
46 c
47 REAL zm(ip1jmp1,llm),newmasse
48 REAL mu(ip1jmp1,llm)
49 REAL mv(ip1jm,llm)
50 REAL mw(ip1jmp1,llm+1)
51 REAL zq(ip1jmp1,llm),zz
52 REAL dqx(ip1jmp1,llm),dqy(ip1jmp1,llm),dqz(ip1jmp1,llm)
53 REAL second,temps0,temps1,temps2,temps3
54 REAL ztemps1,ztemps2,ztemps3
55 REAL zzpbar, zzw
56 LOGICAL testcpu
57 SAVE testcpu
58 SAVE temps1,temps2,temps3
59 INTEGER iminn,imaxx
60
61 REAL qmin,qmax
62 DATA qmin,qmax/0.,1.e33/
63 DATA testcpu/.false./
64 DATA temps1,temps2,temps3/0.,0.,0./
65
66
67 zzpbar = 0.5 * pdt
68 zzw = pdt
69 DO l=1,llm
70 DO ij = iip2,ip1jm
71 mu(ij,l)=pbaru(ij,l) * zzpbar
72 ENDDO
73 DO ij=1,ip1jm
74 mv(ij,l)=pbarv(ij,l) * zzpbar
75 ENDDO
76 DO ij=1,ip1jmp1
77 mw(ij,l)=w(ij,l) * zzw
78 ENDDO
79 ENDDO
80
81 DO ij=1,ip1jmp1
82 mw(ij,llm+1)=0.
83 ENDDO
84
85 CALL SCOPY(ijp1llm,q,1,zq,1)
86 CALL SCOPY(ijp1llm,masse,1,zm,1)
87
88 cprint*,'Entree vlx1'
89 c call minmaxq(zq,qmin,qmax,'avant vlx ')
90 call vlx(zq,pente_max,zm,mu)
91 cprint*,'Sortie vlx1'
92 c call minmaxq(zq,qmin,qmax,'apres vlx1 ')
93
94 c print*,'Entree vly1'
95 call vly(zq,pente_max,zm,mv)
96 c call minmaxq(zq,qmin,qmax,'apres vly1 ')
97 cprint*,'Sortie vly1'
98 call vlz(zq,pente_max,zm,mw)
99 c call minmaxq(zq,qmin,qmax,'apres vlz ')
100
101
102 call vly(zq,pente_max,zm,mv)
103 c call minmaxq(zq,qmin,qmax,'apres vly ')
104
105
106 call vlx(zq,pente_max,zm,mu)
107 c call minmaxq(zq,qmin,qmax,'apres vlx2 ')
108
109
110 DO l=1,llm
111 DO ij=1,ip1jmp1
112 q(ij,l)=zq(ij,l)
113 ENDDO
114 DO ij=1,ip1jm+1,iip1
115 q(ij+iim,l)=q(ij,l)
116 ENDDO
117 ENDDO
118
119 RETURN
120 END
121 SUBROUTINE vlx(q,pente_max,masse,u_m)
122
123 c Auteurs: P.Le Van, F.Hourdin, F.Forget
124 c
125 c ********************************************************************
126 c Shema d'advection " pseudo amont " .
127 c ********************************************************************
128 c nq,iq,q,pbaru,pbarv,w sont des arguments d'entree pour le s-pg ....
129 c
130 c
131 c --------------------------------------------------------------------
132 use dimens_m
133 use paramet_m
134 use comconst
135 use comvert
136 use logic
137 IMPLICIT NONE
138 c
139 c
140 c
141 c Arguments:
142 c ----------
143 REAL masse(ip1jmp1,llm),pente_max
144 REAL u_m( ip1jmp1,llm ),pbarv( iip1,jjm,llm)
145 REAL q(ip1jmp1,llm)
146 REAL w(ip1jmp1,llm)
147 c
148 c Local
149 c ---------
150 c
151 INTEGER ij,l,j,i,iju,ijq,indu(ip1jmp1),niju
152 INTEGER n0,iadvplus(ip1jmp1,llm),nl(llm)
153 c
154 REAL new_m,zu_m,zdum(ip1jmp1,llm)
155 REAL sigu(ip1jmp1),dxq(ip1jmp1,llm),dxqu(ip1jmp1)
156 REAL zz(ip1jmp1)
157 REAL adxqu(ip1jmp1),dxqmax(ip1jmp1,llm)
158 REAL u_mq(ip1jmp1,llm)
159
160 Logical extremum,first,testcpu
161 SAVE first,testcpu
162
163 REAL SSUM
164 REAL temps0,temps1,temps2,temps3,temps4,temps5,second
165 SAVE temps0,temps1,temps2,temps3,temps4,temps5
166
167 REAL z1,z2,z3
168
169 DATA first,testcpu/.true.,.false./
170
171 IF(first) THEN
172 temps1=0.
173 temps2=0.
174 temps3=0.
175 temps4=0.
176 temps5=0.
177 first=.false.
178 ENDIF
179
180 c calcul de la pente a droite et a gauche de la maille
181
182
183 IF (pente_max.gt.-1.e-5) THEN
184 c IF (pente_max.gt.10) THEN
185
186 c calcul des pentes avec limitation, Van Leer scheme I:
187 c -----------------------------------------------------
188
189 c calcul de la pente aux points u
190 DO l = 1, llm
191 DO ij=iip2,ip1jm-1
192 dxqu(ij)=q(ij+1,l)-q(ij,l)
193 c IF(u_m(ij,l).lt.0.) stop'limx n admet pas les U<0'
194 c sigu(ij)=u_m(ij,l)/masse(ij,l)
195 ENDDO
196 DO ij=iip1+iip1,ip1jm,iip1
197 dxqu(ij)=dxqu(ij-iim)
198 c sigu(ij)=sigu(ij-iim)
199 ENDDO
200
201 DO ij=iip2,ip1jm
202 adxqu(ij)=abs(dxqu(ij))
203 ENDDO
204
205 c calcul de la pente maximum dans la maille en valeur absolue
206
207 DO ij=iip2+1,ip1jm
208 dxqmax(ij,l)=pente_max*
209 , min(adxqu(ij-1),adxqu(ij))
210 c limitation subtile
211 c , min(adxqu(ij-1)/sigu(ij-1),adxqu(ij)/(1.-sigu(ij)))
212
213
214 ENDDO
215
216 DO ij=iip1+iip1,ip1jm,iip1
217 dxqmax(ij-iim,l)=dxqmax(ij,l)
218 ENDDO
219
220 DO ij=iip2+1,ip1jm
221 IF(dxqu(ij-1)*dxqu(ij).gt.0) THEN
222 dxq(ij,l)=dxqu(ij-1)+dxqu(ij)
223 ELSE
224 c extremum local
225 dxq(ij,l)=0.
226 ENDIF
227 dxq(ij,l)=0.5*dxq(ij,l)
228 dxq(ij,l)=
229 , sign(min(abs(dxq(ij,l)),dxqmax(ij,l)),dxq(ij,l))
230 ENDDO
231
232 ENDDO ! l=1,llm
233 cprint*,'Ok calcul des pentes'
234
235 ELSE ! (pente_max.lt.-1.e-5)
236
237 c Pentes produits:
238 c ----------------
239
240 DO l = 1, llm
241 DO ij=iip2,ip1jm-1
242 dxqu(ij)=q(ij+1,l)-q(ij,l)
243 ENDDO
244 DO ij=iip1+iip1,ip1jm,iip1
245 dxqu(ij)=dxqu(ij-iim)
246 ENDDO
247
248 DO ij=iip2+1,ip1jm
249 zz(ij)=dxqu(ij-1)*dxqu(ij)
250 zz(ij)=zz(ij)+zz(ij)
251 IF(zz(ij).gt.0) THEN
252 dxq(ij,l)=zz(ij)/(dxqu(ij-1)+dxqu(ij))
253 ELSE
254 c extremum local
255 dxq(ij,l)=0.
256 ENDIF
257 ENDDO
258
259 ENDDO
260
261 ENDIF ! (pente_max.lt.-1.e-5)
262
263 c bouclage de la pente en iip1:
264 c -----------------------------
265
266 DO l=1,llm
267 DO ij=iip1+iip1,ip1jm,iip1
268 dxq(ij-iim,l)=dxq(ij,l)
269 ENDDO
270 DO ij=1,ip1jmp1
271 iadvplus(ij,l)=0
272 ENDDO
273
274 ENDDO
275
276 c print*,'Bouclage en iip1'
277
278 c calcul des flux a gauche et a droite
279
280 c on cumule le flux correspondant a toutes les mailles dont la masse
281 c au travers de la paroi pENDant le pas de temps.
282 cprint*,'Cumule ....'
283
284 DO l=1,llm
285 DO ij=iip2,ip1jm-1
286 c print*,'masse(',ij,')=',masse(ij,l)
287 IF (u_m(ij,l).gt.0.) THEN
288 zdum(ij,l)=1.-u_m(ij,l)/masse(ij,l)
289 u_mq(ij,l)=u_m(ij,l)*(q(ij,l)+0.5*zdum(ij,l)*dxq(ij,l))
290 ELSE
291 zdum(ij,l)=1.+u_m(ij,l)/masse(ij+1,l)
292 u_mq(ij,l)=u_m(ij,l)*(q(ij+1,l)-0.5*zdum(ij,l)*dxq(ij+1,l))
293 ENDIF
294 ENDDO
295 ENDDO
296 c stop
297
298 c go to 9999
299 c detection des points ou on advecte plus que la masse de la
300 c maille
301 DO l=1,llm
302 DO ij=iip2,ip1jm-1
303 IF(zdum(ij,l).lt.0) THEN
304 iadvplus(ij,l)=1
305 u_mq(ij,l)=0.
306 ENDIF
307 ENDDO
308 ENDDO
309 cprint*,'Ok test 1'
310 DO l=1,llm
311 DO ij=iip1+iip1,ip1jm,iip1
312 iadvplus(ij,l)=iadvplus(ij-iim,l)
313 ENDDO
314 ENDDO
315 c print*,'Ok test 2'
316
317
318 c traitement special pour le cas ou on advecte en longitude plus que le
319 c contenu de la maille.
320 c cette partie est mal vectorisee.
321
322 c calcul du nombre de maille sur lequel on advecte plus que la maille.
323
324 n0=0
325 DO l=1,llm
326 nl(l)=0
327 DO ij=iip2,ip1jm
328 nl(l)=nl(l)+iadvplus(ij,l)
329 ENDDO
330 n0=n0+nl(l)
331 ENDDO
332
333 IF(n0.gt.0) THEN
334 CC PRINT*,'Nombre de points pour lesquels on advect plus que le'
335 CC & ,'contenu de la maille : ',n0
336
337 DO l=1,llm
338 IF(nl(l).gt.0) THEN
339 iju=0
340 c indicage des mailles concernees par le traitement special
341 DO ij=iip2,ip1jm
342 IF(iadvplus(ij,l).eq.1.and.mod(ij,iip1).ne.0) THEN
343 iju=iju+1
344 indu(iju)=ij
345 ENDIF
346 ENDDO
347 niju=iju
348 c PRINT*,'niju,nl',niju,nl(l)
349
350 c traitement des mailles
351 DO iju=1,niju
352 ij=indu(iju)
353 j=(ij-1)/iip1+1
354 zu_m=u_m(ij,l)
355 u_mq(ij,l)=0.
356 IF(zu_m.gt.0.) THEN
357 ijq=ij
358 i=ijq-(j-1)*iip1
359 c accumulation pour les mailles completements advectees
360 do while(zu_m.gt.masse(ijq,l))
361 u_mq(ij,l)=u_mq(ij,l)+q(ijq,l)*masse(ijq,l)
362 zu_m=zu_m-masse(ijq,l)
363 i=mod(i-2+iim,iim)+1
364 ijq=(j-1)*iip1+i
365 ENDDO
366 c ajout de la maille non completement advectee
367 u_mq(ij,l)=u_mq(ij,l)+zu_m*
368 & (q(ijq,l)+0.5*(1.-zu_m/masse(ijq,l))*dxq(ijq,l))
369 ELSE
370 ijq=ij+1
371 i=ijq-(j-1)*iip1
372 c accumulation pour les mailles completements advectees
373 do while(-zu_m.gt.masse(ijq,l))
374 u_mq(ij,l)=u_mq(ij,l)-q(ijq,l)*masse(ijq,l)
375 zu_m=zu_m+masse(ijq,l)
376 i=mod(i,iim)+1
377 ijq=(j-1)*iip1+i
378 ENDDO
379 c ajout de la maille non completement advectee
380 u_mq(ij,l)=u_mq(ij,l)+zu_m*(q(ijq,l)-
381 & 0.5*(1.+zu_m/masse(ijq,l))*dxq(ijq,l))
382 ENDIF
383 ENDDO
384 ENDIF
385 ENDDO
386 ENDIF ! n0.gt.0
387 9999 continue
388
389
390 c bouclage en latitude
391 cprint*,'cvant bouclage en latitude'
392 DO l=1,llm
393 DO ij=iip1+iip1,ip1jm,iip1
394 u_mq(ij,l)=u_mq(ij-iim,l)
395 ENDDO
396 ENDDO
397
398
399 c calcul des tENDances
400
401 DO l=1,llm
402 DO ij=iip2+1,ip1jm
403 new_m=masse(ij,l)+u_m(ij-1,l)-u_m(ij,l)
404 q(ij,l)=(q(ij,l)*masse(ij,l)+
405 & u_mq(ij-1,l)-u_mq(ij,l))
406 & /new_m
407 masse(ij,l)=new_m
408 ENDDO
409 c ModIF Fred 22 03 96 correction d'un bug (les scopy ci-dessous)
410 DO ij=iip1+iip1,ip1jm,iip1
411 q(ij-iim,l)=q(ij,l)
412 masse(ij-iim,l)=masse(ij,l)
413 ENDDO
414 ENDDO
415 c CALL SCOPY((jjm-1)*llm,q(iip1+iip1,1),iip1,q(iip2,1),iip1)
416 c CALL SCOPY((jjm-1)*llm,masse(iip1+iip1,1),iip1,masse(iip2,1),iip1)
417
418
419 RETURN
420 END
421 SUBROUTINE vly(q,pente_max,masse,masse_adv_v)
422 c
423 c Auteurs: P.Le Van, F.Hourdin, F.Forget
424 c
425 c ********************************************************************
426 c Shema d'advection " pseudo amont " .
427 c ********************************************************************
428 c q,masse_adv_v,w sont des arguments d'entree pour le s-pg ....
429 c dq sont des arguments de sortie pour le s-pg ....
430 c
431 c
432 c --------------------------------------------------------------------
433 use dimens_m
434 use paramet_m
435 use comconst
436 use comvert
437 use logic
438 use comgeom
439 IMPLICIT NONE
440 c
441 c
442 c
443 c Arguments:
444 c ----------
445 REAL masse(ip1jmp1,llm),pente_max
446 REAL masse_adv_v( ip1jm,llm)
447 REAL q(ip1jmp1,llm), dq( ip1jmp1,llm)
448 c
449 c Local
450 c ---------
451 c
452 INTEGER i,ij,l
453 c
454 REAL airej2,airejjm,airescb(iim),airesch(iim)
455 REAL dyq(ip1jmp1,llm),dyqv(ip1jm),zdvm(ip1jmp1,llm)
456 REAL adyqv(ip1jm),dyqmax(ip1jmp1)
457 REAL qbyv(ip1jm,llm)
458
459 REAL qpns,qpsn,apn,aps,dyn1,dys1,dyn2,dys2,newmasse,fn,fs
460 c REAL newq,oldmasse
461 Logical extremum,first,testcpu
462 REAL temps0,temps1,temps2,temps3,temps4,temps5,second
463 SAVE temps0,temps1,temps2,temps3,temps4,temps5
464 SAVE first,testcpu
465
466 REAL convpn,convps,convmpn,convmps
467 real massepn,masseps,qpn,qps
468 REAL sinlon(iip1),sinlondlon(iip1)
469 REAL coslon(iip1),coslondlon(iip1)
470 SAVE sinlon,coslon,sinlondlon,coslondlon
471 SAVE airej2,airejjm
472 c
473 c
474 REAL SSUM
475
476 DATA first,testcpu/.true.,.false./
477 DATA temps0,temps1,temps2,temps3,temps4,temps5/0.,0.,0.,0.,0.,0./
478
479 IF(first) THEN
480 PRINT*,'Shema Amont nouveau appele dans Vanleer '
481 first=.false.
482 do i=2,iip1
483 coslon(i)=cos(rlonv(i))
484 sinlon(i)=sin(rlonv(i))
485 coslondlon(i)=coslon(i)*(rlonu(i)-rlonu(i-1))/pi
486 sinlondlon(i)=sinlon(i)*(rlonu(i)-rlonu(i-1))/pi
487 ENDDO
488 coslon(1)=coslon(iip1)
489 coslondlon(1)=coslondlon(iip1)
490 sinlon(1)=sinlon(iip1)
491 sinlondlon(1)=sinlondlon(iip1)
492 airej2 = SSUM( iim, aire(iip2), 1 )
493 airejjm= SSUM( iim, aire(ip1jm -iim), 1 )
494 ENDIF
495
496 c
497 cPRINT*,'CALCUL EN LATITUDE'
498
499 DO l = 1, llm
500 c
501 c --------------------------------
502 c CALCUL EN LATITUDE
503 c --------------------------------
504
505 c On commence par calculer la valeur du traceur moyenne sur le premier cercle
506 c de latitude autour du pole (qpns pour le pole nord et qpsn pour
507 c le pole nord) qui sera utilisee pour evaluer les pentes au pole.
508
509 DO i = 1, iim
510 airescb(i) = aire(i+ iip1) * q(i+ iip1,l)
511 airesch(i) = aire(i+ ip1jm- iip1) * q(i+ ip1jm- iip1,l)
512 ENDDO
513 qpns = SSUM( iim, airescb ,1 ) / airej2
514 qpsn = SSUM( iim, airesch ,1 ) / airejjm
515
516 c calcul des pentes aux points v
517
518 DO ij=1,ip1jm
519 dyqv(ij)=q(ij,l)-q(ij+iip1,l)
520 adyqv(ij)=abs(dyqv(ij))
521 ENDDO
522
523 c calcul des pentes aux points scalaires
524
525 DO ij=iip2,ip1jm
526 dyq(ij,l)=.5*(dyqv(ij-iip1)+dyqv(ij))
527 dyqmax(ij)=min(adyqv(ij-iip1),adyqv(ij))
528 dyqmax(ij)=pente_max*dyqmax(ij)
529 ENDDO
530
531 c calcul des pentes aux poles
532
533 DO ij=1,iip1
534 dyq(ij,l)=qpns-q(ij+iip1,l)
535 dyq(ip1jm+ij,l)=q(ip1jm+ij-iip1,l)-qpsn
536 ENDDO
537
538 c filtrage de la derivee
539 dyn1=0.
540 dys1=0.
541 dyn2=0.
542 dys2=0.
543 DO ij=1,iim
544 dyn1=dyn1+sinlondlon(ij)*dyq(ij,l)
545 dys1=dys1+sinlondlon(ij)*dyq(ip1jm+ij,l)
546 dyn2=dyn2+coslondlon(ij)*dyq(ij,l)
547 dys2=dys2+coslondlon(ij)*dyq(ip1jm+ij,l)
548 ENDDO
549 DO ij=1,iip1
550 dyq(ij,l)=dyn1*sinlon(ij)+dyn2*coslon(ij)
551 dyq(ip1jm+ij,l)=dys1*sinlon(ij)+dys2*coslon(ij)
552 ENDDO
553
554 c calcul des pentes limites aux poles
555
556 goto 8888
557 fn=1.
558 fs=1.
559 DO ij=1,iim
560 IF(pente_max*adyqv(ij).lt.abs(dyq(ij,l))) THEN
561 fn=min(pente_max*adyqv(ij)/abs(dyq(ij,l)),fn)
562 ENDIF
563 IF(pente_max*adyqv(ij+ip1jm-iip1).lt.abs(dyq(ij+ip1jm,l))) THEN
564 fs=min(pente_max*adyqv(ij+ip1jm-iip1)/abs(dyq(ij+ip1jm,l)),fs)
565 ENDIF
566 ENDDO
567 DO ij=1,iip1
568 dyq(ij,l)=fn*dyq(ij,l)
569 dyq(ip1jm+ij,l)=fs*dyq(ip1jm+ij,l)
570 ENDDO
571 8888 continue
572 DO ij=1,iip1
573 dyq(ij,l)=0.
574 dyq(ip1jm+ij,l)=0.
575 ENDDO
576
577 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
578 C En memoire de dIFferents tests sur la
579 C limitation des pentes aux poles.
580 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
581 C PRINT*,dyq(1)
582 C PRINT*,dyqv(iip1+1)
583 C apn=abs(dyq(1)/dyqv(iip1+1))
584 C PRINT*,dyq(ip1jm+1)
585 C PRINT*,dyqv(ip1jm-iip1+1)
586 C aps=abs(dyq(ip1jm+1)/dyqv(ip1jm-iip1+1))
587 C DO ij=2,iim
588 C apn=amax1(abs(dyq(ij)/dyqv(ij)),apn)
589 C aps=amax1(abs(dyq(ip1jm+ij)/dyqv(ip1jm-iip1+ij)),aps)
590 C ENDDO
591 C apn=min(pente_max/apn,1.)
592 C aps=min(pente_max/aps,1.)
593 C
594 C
595 C cas ou on a un extremum au pole
596 C
597 C IF(dyqv(ismin(iim,dyqv,1))*dyqv(ismax(iim,dyqv,1)).le.0.)
598 C & apn=0.
599 C IF(dyqv(ismax(iim,dyqv(ip1jm-iip1+1),1)+ip1jm-iip1+1)*
600 C & dyqv(ismin(iim,dyqv(ip1jm-iip1+1),1)+ip1jm-iip1+1).le.0.)
601 C & aps=0.
602 C
603 C limitation des pentes aux poles
604 C DO ij=1,iip1
605 C dyq(ij)=apn*dyq(ij)
606 C dyq(ip1jm+ij)=aps*dyq(ip1jm+ij)
607 C ENDDO
608 C
609 C test
610 C DO ij=1,iip1
611 C dyq(iip1+ij)=0.
612 C dyq(ip1jm+ij-iip1)=0.
613 C ENDDO
614 C DO ij=1,ip1jmp1
615 C dyq(ij)=dyq(ij)*cos(rlatu((ij-1)/iip1+1))
616 C ENDDO
617 C
618 C changement 10 07 96
619 C IF(dyqv(ismin(iim,dyqv,1))*dyqv(ismax(iim,dyqv,1)).le.0.)
620 C & THEN
621 C DO ij=1,iip1
622 C dyqmax(ij)=0.
623 C ENDDO
624 C ELSE
625 C DO ij=1,iip1
626 C dyqmax(ij)=pente_max*abs(dyqv(ij))
627 C ENDDO
628 C ENDIF
629 C
630 C IF(dyqv(ismax(iim,dyqv(ip1jm-iip1+1),1)+ip1jm-iip1+1)*
631 C & dyqv(ismin(iim,dyqv(ip1jm-iip1+1),1)+ip1jm-iip1+1).le.0.)
632 C &THEN
633 C DO ij=ip1jm+1,ip1jmp1
634 C dyqmax(ij)=0.
635 C ENDDO
636 C ELSE
637 C DO ij=ip1jm+1,ip1jmp1
638 C dyqmax(ij)=pente_max*abs(dyqv(ij-iip1))
639 C ENDDO
640 C ENDIF
641 C fin changement 10 07 96
642 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
643
644 c calcul des pentes limitees
645
646 DO ij=iip2,ip1jm
647 IF(dyqv(ij)*dyqv(ij-iip1).gt.0.) THEN
648 dyq(ij,l)=sign(min(abs(dyq(ij,l)),dyqmax(ij)),dyq(ij,l))
649 ELSE
650 dyq(ij,l)=0.
651 ENDIF
652 ENDDO
653
654 ENDDO
655
656 DO l=1,llm
657 DO ij=1,ip1jm
658 IF(masse_adv_v(ij,l).gt.0) THEN
659 qbyv(ij,l)=q(ij+iip1,l)+dyq(ij+iip1,l)*
660 , 0.5*(1.-masse_adv_v(ij,l)/masse(ij+iip1,l))
661 ELSE
662 qbyv(ij,l)=q(ij,l)-dyq(ij,l)*
663 , 0.5*(1.+masse_adv_v(ij,l)/masse(ij,l))
664 ENDIF
665 qbyv(ij,l)=masse_adv_v(ij,l)*qbyv(ij,l)
666 ENDDO
667 ENDDO
668
669
670 DO l=1,llm
671 DO ij=iip2,ip1jm
672 newmasse=masse(ij,l)
673 & +masse_adv_v(ij,l)-masse_adv_v(ij-iip1,l)
674 q(ij,l)=(q(ij,l)*masse(ij,l)+qbyv(ij,l)-qbyv(ij-iip1,l))
675 & /newmasse
676 masse(ij,l)=newmasse
677 ENDDO
678 c.-. ancienne version
679 c convpn=SSUM(iim,qbyv(1,l),1)/apoln
680 c convmpn=ssum(iim,masse_adv_v(1,l),1)/apoln
681
682 convpn=SSUM(iim,qbyv(1,l),1)
683 convmpn=ssum(iim,masse_adv_v(1,l),1)
684 massepn=ssum(iim,masse(1,l),1)
685 qpn=0.
686 do ij=1,iim
687 qpn=qpn+masse(ij,l)*q(ij,l)
688 enddo
689 qpn=(qpn+convpn)/(massepn+convmpn)
690 do ij=1,iip1
691 q(ij,l)=qpn
692 enddo
693
694 c convps=-SSUM(iim,qbyv(ip1jm-iim,l),1)/apols
695 c convmps=-ssum(iim,masse_adv_v(ip1jm-iim,l),1)/apols
696
697 convps=-SSUM(iim,qbyv(ip1jm-iim,l),1)
698 convmps=-ssum(iim,masse_adv_v(ip1jm-iim,l),1)
699 masseps=ssum(iim, masse(ip1jm+1,l),1)
700 qps=0.
701 do ij = ip1jm+1,ip1jmp1-1
702 qps=qps+masse(ij,l)*q(ij,l)
703 enddo
704 qps=(qps+convps)/(masseps+convmps)
705 do ij=ip1jm+1,ip1jmp1
706 q(ij,l)=qps
707 enddo
708
709 c.-. fin ancienne version
710
711 c._. nouvelle version
712 c convpn=SSUM(iim,qbyv(1,l),1)
713 c convmpn=ssum(iim,masse_adv_v(1,l),1)
714 c oldmasse=ssum(iim,masse(1,l),1)
715 c newmasse=oldmasse+convmpn
716 c newq=(q(1,l)*oldmasse+convpn)/newmasse
717 c newmasse=newmasse/apoln
718 c DO ij = 1,iip1
719 c q(ij,l)=newq
720 c masse(ij,l)=newmasse*aire(ij)
721 c ENDDO
722 c convps=-SSUM(iim,qbyv(ip1jm-iim,l),1)
723 c convmps=-ssum(iim,masse_adv_v(ip1jm-iim,l),1)
724 c oldmasse=ssum(iim,masse(ip1jm-iim,l),1)
725 c newmasse=oldmasse+convmps
726 c newq=(q(ip1jmp1,l)*oldmasse+convps)/newmasse
727 c newmasse=newmasse/apols
728 c DO ij = ip1jm+1,ip1jmp1
729 c q(ij,l)=newq
730 c masse(ij,l)=newmasse*aire(ij)
731 c ENDDO
732 c._. fin nouvelle version
733 ENDDO
734
735 RETURN
736 END
737 SUBROUTINE vlz(q,pente_max,masse,w)
738 c
739 c Auteurs: P.Le Van, F.Hourdin, F.Forget
740 c
741 c ********************************************************************
742 c Shema d'advection " pseudo amont " .
743 c ********************************************************************
744 c q,pbaru,pbarv,w sont des arguments d'entree pour le s-pg ....
745 c dq sont des arguments de sortie pour le s-pg ....
746 c
747 c
748 c --------------------------------------------------------------------
749 use dimens_m
750 use paramet_m
751 use comconst
752 use comvert
753 use logic
754 IMPLICIT NONE
755 c
756 c
757 c
758 c Arguments:
759 c ----------
760 REAL masse(ip1jmp1,llm),pente_max
761 REAL q(ip1jmp1,llm)
762 REAL w(ip1jmp1,llm+1)
763 c
764 c Local
765 c ---------
766 c
767 INTEGER i,ij,l,j,ii
768 c
769 REAL wq(ip1jmp1,llm+1),newmasse
770
771 REAL dzq(ip1jmp1,llm),dzqw(ip1jmp1,llm),adzqw(ip1jmp1,llm),dzqmax
772 REAL sigw
773
774 LOGICAL testcpu
775 SAVE testcpu
776
777 REAL temps0,temps1,temps2,temps3,temps4,temps5,second
778 SAVE temps0,temps1,temps2,temps3,temps4,temps5
779 REAL SSUM
780
781 DATA testcpu/.false./
782 DATA temps0,temps1,temps2,temps3,temps4,temps5/0.,0.,0.,0.,0.,0./
783
784 c On oriente tout dans le sens de la pression c'est a dire dans le
785 c sens de W
786
787 DO l=2,llm
788 DO ij=1,ip1jmp1
789 dzqw(ij,l)=q(ij,l-1)-q(ij,l)
790 adzqw(ij,l)=abs(dzqw(ij,l))
791 ENDDO
792 ENDDO
793
794 DO l=2,llm-1
795 DO ij=1,ip1jmp1
796 IF(dzqw(ij,l)*dzqw(ij,l+1).gt.0.) THEN
797 dzq(ij,l)=0.5*(dzqw(ij,l)+dzqw(ij,l+1))
798 ELSE
799 dzq(ij,l)=0.
800 ENDIF
801 dzqmax=pente_max*min(adzqw(ij,l),adzqw(ij,l+1))
802 dzq(ij,l)=sign(min(abs(dzq(ij,l)),dzqmax),dzq(ij,l))
803 ENDDO
804 ENDDO
805
806 DO ij=1,ip1jmp1
807 dzq(ij,1)=0.
808 dzq(ij,llm)=0.
809 ENDDO
810
811 c ---------------------------------------------------------------
812 c .... calcul des termes d'advection verticale .......
813 c ---------------------------------------------------------------
814
815 c calcul de - d( q * w )/ d(sigma) qu'on ajoute a dq pour calculer dq
816
817 DO l = 1,llm-1
818 do ij = 1,ip1jmp1
819 IF(w(ij,l+1).gt.0.) THEN
820 sigw=w(ij,l+1)/masse(ij,l+1)
821 wq(ij,l+1)=w(ij,l+1)*(q(ij,l+1)+0.5*(1.-sigw)*dzq(ij,l+1))
822 ELSE
823 sigw=w(ij,l+1)/masse(ij,l)
824 wq(ij,l+1)=w(ij,l+1)*(q(ij,l)-0.5*(1.+sigw)*dzq(ij,l))
825 ENDIF
826 ENDDO
827 ENDDO
828
829 DO ij=1,ip1jmp1
830 wq(ij,llm+1)=0.
831 wq(ij,1)=0.
832 ENDDO
833
834 DO l=1,llm
835 DO ij=1,ip1jmp1
836 newmasse=masse(ij,l)+w(ij,l+1)-w(ij,l)
837 q(ij,l)=(q(ij,l)*masse(ij,l)+wq(ij,l+1)-wq(ij,l))
838 & /newmasse
839 masse(ij,l)=newmasse
840 ENDDO
841 ENDDO
842
843 END

  ViewVC Help
Powered by ViewVC 1.1.21