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

Contents of /trunk/dyn3d/vlspltqs.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 39 - (show annotations)
Tue Jan 25 15:11:05 2011 UTC (13 years, 4 months ago) by guez
Original Path: trunk/libf/dyn3d/vlspltqs.f
File size: 19010 byte(s)
"pi" comes from "nr_util". Removed subroutine "initialize" in module
"comconst".

Copied the content of "fxy_sin.h" into "fxysinus", instead of getting
it from an "include" line. Removed file "fxy_sin.h".

"ps" has rank 2 in "gcm" and "dynetat0".

Assumed-shape for argument "q" of "integrd".

1 !
2 ! $Header: /home/cvsroot/LMDZ4/libf/dyn3d/vlspltqs.F,v 1.2 2005/02/24 12:16:57 fairhead Exp $
3 !
4 SUBROUTINE vlspltqs ( q,pente_max,masse,w,pbaru,pbarv,pdt,
5 , p,pk,teta )
6 c
7 c Auteurs: P.Le Van, F.Hourdin, F.Forget, F.Codron
8 c
9 c ********************************************************************
10 c Shema d'advection " pseudo amont " .
11 c + test sur humidite specifique: Q advecte< Qsat aval
12 c (F. Codron, 10/99)
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 teta temperature potentielle, p pression aux interfaces,
22 c pk exner au milieu des couches necessaire pour calculer Qsat
23 c --------------------------------------------------------------------
24 use dimens_m
25 use paramet_m
26 use comconst
27 use comvert
28 use logic
29 IMPLICIT NONE
30 c
31
32 c
33 c Arguments:
34 c ----------
35 REAL masse(ip1jmp1,llm),pente_max
36 REAL, intent(in):: pbaru( ip1jmp1,llm ),pbarv( ip1jm,llm)
37 REAL q(ip1jmp1,llm)
38 REAL w(ip1jmp1,llm)
39 real, intent(in):: pdt
40 REAL, intent(in):: p(ip1jmp1,llmp1)
41 real teta(ip1jmp1,llm),pk(ip1jmp1,llm)
42 c
43 c Local
44 c ---------
45 c
46 INTEGER i,ij,l,j,ii
47 c
48 REAL qsat(ip1jmp1,llm)
49 REAL zm(ip1jmp1,llm)
50 REAL mu(ip1jmp1,llm)
51 REAL mv(ip1jm,llm)
52 REAL mw(ip1jmp1,llm+1)
53 REAL zq(ip1jmp1,llm)
54 REAL temps1,temps2,temps3
55 REAL zzpbar, zzw
56 LOGICAL testcpu
57 SAVE testcpu
58 SAVE temps1,temps2,temps3
59
60 REAL qmin,qmax
61 DATA qmin,qmax/0.,1.e33/
62 DATA testcpu/.false./
63 DATA temps1,temps2,temps3/0.,0.,0./
64
65 c--pour rapport de melange saturant--
66
67 REAL rtt,retv,r2es,r3les,r3ies,r4les,r4ies,play
68 REAL ptarg,pdelarg,foeew,zdelta
69 REAL tempe(ip1jmp1)
70
71 c fonction psat(T)
72
73 FOEEW ( PTARG,PDELARG ) = EXP (
74 * (R3LES*(1.-PDELARG)+R3IES*PDELARG) * (PTARG-RTT)
75 * / (PTARG-(R4LES*(1.-PDELARG)+R4IES*PDELARG)) )
76
77 r2es = 380.11733
78 r3les = 17.269
79 r3ies = 21.875
80 r4les = 35.86
81 r4ies = 7.66
82 retv = 0.6077667
83 rtt = 273.16
84
85 c-- Calcul de Qsat en chaque point
86 c-- approximation: au milieu des couches play(l)=(p(l)+p(l+1))/2
87 c pour eviter une exponentielle.
88 DO l = 1, llm
89 DO ij = 1, ip1jmp1
90 tempe(ij) = teta(ij,l) * pk(ij,l) /cpp
91 ENDDO
92 DO ij = 1, ip1jmp1
93 zdelta = MAX( 0., SIGN(1., rtt - tempe(ij)) )
94 play = 0.5*(p(ij,l)+p(ij,l+1))
95 qsat(ij,l) = MIN(0.5, r2es* FOEEW(tempe(ij),zdelta) / play )
96 qsat(ij,l) = qsat(ij,l) / ( 1. - retv * qsat(ij,l) )
97 ENDDO
98 ENDDO
99
100 zzpbar = 0.5 * pdt
101 zzw = pdt
102 DO l=1,llm
103 DO ij = iip2,ip1jm
104 mu(ij,l)=pbaru(ij,l) * zzpbar
105 ENDDO
106 DO ij=1,ip1jm
107 mv(ij,l)=pbarv(ij,l) * zzpbar
108 ENDDO
109 DO ij=1,ip1jmp1
110 mw(ij,l)=w(ij,l) * zzw
111 ENDDO
112 ENDDO
113
114 DO ij=1,ip1jmp1
115 mw(ij,llm+1)=0.
116 ENDDO
117
118 CALL SCOPY(ijp1llm,q,1,zq,1)
119 CALL SCOPY(ijp1llm,masse,1,zm,1)
120
121 c call minmaxq(zq,qmin,qmax,'avant vlxqs ')
122 call vlxqs(zq,pente_max,zm,mu,qsat)
123
124
125 c call minmaxq(zq,qmin,qmax,'avant vlyqs ')
126
127 call vlyqs(zq,pente_max,zm,mv,qsat)
128
129
130 c call minmaxq(zq,qmin,qmax,'avant vlz ')
131
132 call vlz(zq,pente_max,zm,mw)
133
134
135 c call minmaxq(zq,qmin,qmax,'avant vlyqs ')
136 c call minmaxq(zm,qmin,qmax,'M avant vlyqs ')
137
138 call vlyqs(zq,pente_max,zm,mv,qsat)
139
140
141 c call minmaxq(zq,qmin,qmax,'avant vlxqs ')
142 c call minmaxq(zm,qmin,qmax,'M avant vlxqs ')
143
144 call vlxqs(zq,pente_max,zm,mu,qsat)
145
146 c call minmaxq(zq,qmin,qmax,'apres vlxqs ')
147 c call minmaxq(zm,qmin,qmax,'M apres vlxqs ')
148
149
150 DO l=1,llm
151 DO ij=1,ip1jmp1
152 q(ij,l)=zq(ij,l)
153 ENDDO
154 DO ij=1,ip1jm+1,iip1
155 q(ij+iim,l)=q(ij,l)
156 ENDDO
157 ENDDO
158
159 RETURN
160 END
161 SUBROUTINE vlxqs(q,pente_max,masse,u_m,qsat)
162 c
163 c Auteurs: P.Le Van, F.Hourdin, F.Forget
164 c
165 c ********************************************************************
166 c Shema d'advection " pseudo amont " .
167 c ********************************************************************
168 c
169 c --------------------------------------------------------------------
170 use dimens_m
171 use paramet_m
172 use comconst
173 use comvert
174 use logic
175 IMPLICIT NONE
176 c
177 c
178 c
179 c Arguments:
180 c ----------
181 REAL masse(ip1jmp1,llm),pente_max
182 REAL u_m( ip1jmp1,llm )
183 REAL q(ip1jmp1,llm)
184 REAL qsat(ip1jmp1,llm)
185 c
186 c Local
187 c ---------
188 c
189 INTEGER ij,l,j,i,iju,ijq,indu(ip1jmp1),niju
190 INTEGER n0,iadvplus(ip1jmp1,llm),nl(llm)
191 c
192 REAL new_m,zu_m,zdum(ip1jmp1,llm)
193 REAL dxq(ip1jmp1,llm),dxqu(ip1jmp1)
194 REAL zz(ip1jmp1)
195 REAL adxqu(ip1jmp1),dxqmax(ip1jmp1,llm)
196 REAL u_mq(ip1jmp1,llm)
197
198 Logical first,testcpu
199 SAVE first,testcpu
200
201 REAL SSUM
202 REAL temps0,temps1,temps2,temps3,temps4,temps5
203 SAVE temps0,temps1,temps2,temps3,temps4,temps5
204
205
206 DATA first,testcpu/.true.,.false./
207
208 IF(first) THEN
209 temps1=0.
210 temps2=0.
211 temps3=0.
212 temps4=0.
213 temps5=0.
214 first=.false.
215 ENDIF
216
217 c calcul de la pente a droite et a gauche de la maille
218
219
220 IF (pente_max.gt.-1.e-5) THEN
221 c IF (pente_max.gt.10) THEN
222
223 c calcul des pentes avec limitation, Van Leer scheme I:
224 c -----------------------------------------------------
225
226 c calcul de la pente aux points u
227 DO l = 1, llm
228 DO ij=iip2,ip1jm-1
229 dxqu(ij)=q(ij+1,l)-q(ij,l)
230 c IF(u_m(ij,l).lt.0.) stop'limx n admet pas les U<0'
231 c sigu(ij)=u_m(ij,l)/masse(ij,l)
232 ENDDO
233 DO ij=iip1+iip1,ip1jm,iip1
234 dxqu(ij)=dxqu(ij-iim)
235 c sigu(ij)=sigu(ij-iim)
236 ENDDO
237
238 DO ij=iip2,ip1jm
239 adxqu(ij)=abs(dxqu(ij))
240 ENDDO
241
242 c calcul de la pente maximum dans la maille en valeur absolue
243
244 DO ij=iip2+1,ip1jm
245 dxqmax(ij,l)=pente_max*
246 , min(adxqu(ij-1),adxqu(ij))
247 c limitation subtile
248 c , min(adxqu(ij-1)/sigu(ij-1),adxqu(ij)/(1.-sigu(ij)))
249
250
251 ENDDO
252
253 DO ij=iip1+iip1,ip1jm,iip1
254 dxqmax(ij-iim,l)=dxqmax(ij,l)
255 ENDDO
256
257 DO ij=iip2+1,ip1jm
258 IF(dxqu(ij-1)*dxqu(ij).gt.0) THEN
259 dxq(ij,l)=dxqu(ij-1)+dxqu(ij)
260 ELSE
261 c extremum local
262 dxq(ij,l)=0.
263 ENDIF
264 dxq(ij,l)=0.5*dxq(ij,l)
265 dxq(ij,l)=
266 , sign(min(abs(dxq(ij,l)),dxqmax(ij,l)),dxq(ij,l))
267 ENDDO
268
269 ENDDO ! l=1,llm
270
271 ELSE ! (pente_max.lt.-1.e-5)
272
273 c Pentes produits:
274 c ----------------
275
276 DO l = 1, llm
277 DO ij=iip2,ip1jm-1
278 dxqu(ij)=q(ij+1,l)-q(ij,l)
279 ENDDO
280 DO ij=iip1+iip1,ip1jm,iip1
281 dxqu(ij)=dxqu(ij-iim)
282 ENDDO
283
284 DO ij=iip2+1,ip1jm
285 zz(ij)=dxqu(ij-1)*dxqu(ij)
286 zz(ij)=zz(ij)+zz(ij)
287 IF(zz(ij).gt.0) THEN
288 dxq(ij,l)=zz(ij)/(dxqu(ij-1)+dxqu(ij))
289 ELSE
290 c extremum local
291 dxq(ij,l)=0.
292 ENDIF
293 ENDDO
294
295 ENDDO
296
297 ENDIF ! (pente_max.lt.-1.e-5)
298
299 c bouclage de la pente en iip1:
300 c -----------------------------
301
302 DO l=1,llm
303 DO ij=iip1+iip1,ip1jm,iip1
304 dxq(ij-iim,l)=dxq(ij,l)
305 ENDDO
306
307 DO ij=1,ip1jmp1
308 iadvplus(ij,l)=0
309 ENDDO
310
311 ENDDO
312
313
314 c calcul des flux a gauche et a droite
315
316 c on cumule le flux correspondant a toutes les mailles dont la masse
317 c au travers de la paroi pENDant le pas de temps.
318 c le rapport de melange de l'air advecte est min(q_vanleer, Qsat_downwind)
319 DO l=1,llm
320 DO ij=iip2,ip1jm-1
321 IF (u_m(ij,l).gt.0.) THEN
322 zdum(ij,l)=1.-u_m(ij,l)/masse(ij,l)
323 u_mq(ij,l)=u_m(ij,l)*
324 $ min(q(ij,l)+0.5*zdum(ij,l)*dxq(ij,l),qsat(ij+1,l))
325 ELSE
326 zdum(ij,l)=1.+u_m(ij,l)/masse(ij+1,l)
327 u_mq(ij,l)=u_m(ij,l)*
328 $ min(q(ij+1,l)-0.5*zdum(ij,l)*dxq(ij+1,l),qsat(ij,l))
329 ENDIF
330 ENDDO
331 ENDDO
332
333
334 c detection des points ou on advecte plus que la masse de la
335 c maille
336 DO l=1,llm
337 DO ij=iip2,ip1jm-1
338 IF(zdum(ij,l).lt.0) THEN
339 iadvplus(ij,l)=1
340 u_mq(ij,l)=0.
341 ENDIF
342 ENDDO
343 ENDDO
344 DO l=1,llm
345 DO ij=iip1+iip1,ip1jm,iip1
346 iadvplus(ij,l)=iadvplus(ij-iim,l)
347 ENDDO
348 ENDDO
349
350
351
352 c traitement special pour le cas ou on advecte en longitude plus que le
353 c contenu de la maille.
354 c cette partie est mal vectorisee.
355
356 c pas d'influence de la pression saturante (pour l'instant)
357
358 c calcul du nombre de maille sur lequel on advecte plus que la maille.
359
360 n0=0
361 DO l=1,llm
362 nl(l)=0
363 DO ij=iip2,ip1jm
364 nl(l)=nl(l)+iadvplus(ij,l)
365 ENDDO
366 n0=n0+nl(l)
367 ENDDO
368
369 IF(n0.gt.0) THEN
370 DO l=1,llm
371 IF(nl(l).gt.0) THEN
372 iju=0
373 c indicage des mailles concernees par le traitement special
374 DO ij=iip2,ip1jm
375 IF(iadvplus(ij,l).eq.1.and.mod(ij,iip1).ne.0) THEN
376 iju=iju+1
377 indu(iju)=ij
378 ENDIF
379 ENDDO
380 niju=iju
381
382 c traitement des mailles
383 DO iju=1,niju
384 ij=indu(iju)
385 j=(ij-1)/iip1+1
386 zu_m=u_m(ij,l)
387 u_mq(ij,l)=0.
388 IF(zu_m.gt.0.) THEN
389 ijq=ij
390 i=ijq-(j-1)*iip1
391 c accumulation pour les mailles completements advectees
392 do while(zu_m.gt.masse(ijq,l))
393 u_mq(ij,l)=u_mq(ij,l)+q(ijq,l)*masse(ijq,l)
394 zu_m=zu_m-masse(ijq,l)
395 i=mod(i-2+iim,iim)+1
396 ijq=(j-1)*iip1+i
397 ENDDO
398 c ajout de la maille non completement advectee
399 u_mq(ij,l)=u_mq(ij,l)+zu_m*
400 & (q(ijq,l)+0.5*(1.-zu_m/masse(ijq,l))*dxq(ijq,l))
401 ELSE
402 ijq=ij+1
403 i=ijq-(j-1)*iip1
404 c accumulation pour les mailles completements advectees
405 do while(-zu_m.gt.masse(ijq,l))
406 u_mq(ij,l)=u_mq(ij,l)-q(ijq,l)*masse(ijq,l)
407 zu_m=zu_m+masse(ijq,l)
408 i=mod(i,iim)+1
409 ijq=(j-1)*iip1+i
410 ENDDO
411 c ajout de la maille non completement advectee
412 u_mq(ij,l)=u_mq(ij,l)+zu_m*(q(ijq,l)-
413 & 0.5*(1.+zu_m/masse(ijq,l))*dxq(ijq,l))
414 ENDIF
415 ENDDO
416 ENDIF
417 ENDDO
418 ENDIF ! n0.gt.0
419
420
421
422 c bouclage en latitude
423
424 DO l=1,llm
425 DO ij=iip1+iip1,ip1jm,iip1
426 u_mq(ij,l)=u_mq(ij-iim,l)
427 ENDDO
428 ENDDO
429
430
431 c calcul des tendances
432
433 DO l=1,llm
434 DO ij=iip2+1,ip1jm
435 new_m=masse(ij,l)+u_m(ij-1,l)-u_m(ij,l)
436 q(ij,l)=(q(ij,l)*masse(ij,l)+
437 & u_mq(ij-1,l)-u_mq(ij,l))
438 & /new_m
439 masse(ij,l)=new_m
440 ENDDO
441 c Modif Fred 22 03 96 correction d'un bug (les scopy ci-dessous)
442 DO ij=iip1+iip1,ip1jm,iip1
443 q(ij-iim,l)=q(ij,l)
444 masse(ij-iim,l)=masse(ij,l)
445 ENDDO
446 ENDDO
447
448 c CALL SCOPY((jjm-1)*llm,q(iip1+iip1,1),iip1,q(iip2,1),iip1)
449 c CALL SCOPY((jjm-1)*llm,masse(iip1+iip1,1),iip1,masse(iip2,1),iip1)
450
451
452 RETURN
453 END
454 SUBROUTINE vlyqs(q,pente_max,masse,masse_adv_v,qsat)
455 c
456 c Auteurs: P.Le Van, F.Hourdin, F.Forget
457 c
458 c ********************************************************************
459 c Shema d'advection " pseudo amont " .
460 c ********************************************************************
461 c q,masse_adv_v,w sont des arguments d'entree pour le s-pg ....
462 c qsat est un argument de sortie pour le s-pg ....
463 c
464 c
465 c --------------------------------------------------------------------
466 c
467 use dimens_m
468 use paramet_m
469 use comconst
470 use comvert
471 use logic
472 use comgeom
473 USE nr_util, ONLY : pi
474 IMPLICIT NONE
475 c
476 c
477 c Arguments:
478 c ----------
479 REAL masse(ip1jmp1,llm),pente_max
480 REAL masse_adv_v( ip1jm,llm)
481 REAL q(ip1jmp1,llm)
482 REAL qsat(ip1jmp1,llm)
483 c
484 c Local
485 c ---------
486 c
487 INTEGER i,ij,l
488 c
489 REAL airej2,airejjm,airescb(iim),airesch(iim)
490 REAL dyq(ip1jmp1,llm),dyqv(ip1jm)
491 REAL adyqv(ip1jm),dyqmax(ip1jmp1)
492 REAL qbyv(ip1jm,llm)
493
494 REAL qpns,qpsn,dyn1,dys1,dyn2,dys2,newmasse,fn,fs
495 c REAL newq,oldmasse
496 Logical first,testcpu
497 REAL temps0,temps1,temps2,temps3,temps4,temps5
498 SAVE temps0,temps1,temps2,temps3,temps4,temps5
499 SAVE first,testcpu
500
501 REAL convpn,convps,convmpn,convmps
502 REAL sinlon(iip1),sinlondlon(iip1)
503 REAL coslon(iip1),coslondlon(iip1)
504 SAVE sinlon,coslon,sinlondlon,coslondlon
505 SAVE airej2,airejjm
506 c
507 c
508 REAL SSUM
509
510 DATA first,testcpu/.true.,.false./
511 DATA temps0,temps1,temps2,temps3,temps4,temps5/0.,0.,0.,0.,0.,0./
512
513 IF(first) THEN
514 PRINT*,'Shema Amont nouveau appele dans Vanleer '
515 first=.false.
516 do i=2,iip1
517 coslon(i)=cos(rlonv(i))
518 sinlon(i)=sin(rlonv(i))
519 coslondlon(i)=coslon(i)*(rlonu(i)-rlonu(i-1))/pi
520 sinlondlon(i)=sinlon(i)*(rlonu(i)-rlonu(i-1))/pi
521 ENDDO
522 coslon(1)=coslon(iip1)
523 coslondlon(1)=coslondlon(iip1)
524 sinlon(1)=sinlon(iip1)
525 sinlondlon(1)=sinlondlon(iip1)
526 airej2 = SSUM( iim, aire(iip2), 1 )
527 airejjm= SSUM( iim, aire(ip1jm -iim), 1 )
528 ENDIF
529
530 c
531
532
533 DO l = 1, llm
534 c
535 c --------------------------------
536 c CALCUL EN LATITUDE
537 c --------------------------------
538
539 c On commence par calculer la valeur du traceur moyenne sur le premier cercle
540 c de latitude autour du pole (qpns pour le pole nord et qpsn pour
541 c le pole nord) qui sera utilisee pour evaluer les pentes au pole.
542
543 DO i = 1, iim
544 airescb(i) = aire(i+ iip1) * q(i+ iip1,l)
545 airesch(i) = aire(i+ ip1jm- iip1) * q(i+ ip1jm- iip1,l)
546 ENDDO
547 qpns = SSUM( iim, airescb ,1 ) / airej2
548 qpsn = SSUM( iim, airesch ,1 ) / airejjm
549
550 c calcul des pentes aux points v
551
552 DO ij=1,ip1jm
553 dyqv(ij)=q(ij,l)-q(ij+iip1,l)
554 adyqv(ij)=abs(dyqv(ij))
555 ENDDO
556
557 c calcul des pentes aux points scalaires
558
559 DO ij=iip2,ip1jm
560 dyq(ij,l)=.5*(dyqv(ij-iip1)+dyqv(ij))
561 dyqmax(ij)=min(adyqv(ij-iip1),adyqv(ij))
562 dyqmax(ij)=pente_max*dyqmax(ij)
563 ENDDO
564
565 c calcul des pentes aux poles
566
567 DO ij=1,iip1
568 dyq(ij,l)=qpns-q(ij+iip1,l)
569 dyq(ip1jm+ij,l)=q(ip1jm+ij-iip1,l)-qpsn
570 ENDDO
571
572 c filtrage de la derivee
573 dyn1=0.
574 dys1=0.
575 dyn2=0.
576 dys2=0.
577 DO ij=1,iim
578 dyn1=dyn1+sinlondlon(ij)*dyq(ij,l)
579 dys1=dys1+sinlondlon(ij)*dyq(ip1jm+ij,l)
580 dyn2=dyn2+coslondlon(ij)*dyq(ij,l)
581 dys2=dys2+coslondlon(ij)*dyq(ip1jm+ij,l)
582 ENDDO
583 DO ij=1,iip1
584 dyq(ij,l)=dyn1*sinlon(ij)+dyn2*coslon(ij)
585 dyq(ip1jm+ij,l)=dys1*sinlon(ij)+dys2*coslon(ij)
586 ENDDO
587
588 c calcul des pentes limites aux poles
589
590 fn=1.
591 fs=1.
592 DO ij=1,iim
593 IF(pente_max*adyqv(ij).lt.abs(dyq(ij,l))) THEN
594 fn=min(pente_max*adyqv(ij)/abs(dyq(ij,l)),fn)
595 ENDIF
596 IF(pente_max*adyqv(ij+ip1jm-iip1).lt.abs(dyq(ij+ip1jm,l))) THEN
597 fs=min(pente_max*adyqv(ij+ip1jm-iip1)/abs(dyq(ij+ip1jm,l)),fs)
598 ENDIF
599 ENDDO
600 DO ij=1,iip1
601 dyq(ij,l)=fn*dyq(ij,l)
602 dyq(ip1jm+ij,l)=fs*dyq(ip1jm+ij,l)
603 ENDDO
604
605 c calcul des pentes limitees
606
607 DO ij=iip2,ip1jm
608 IF(dyqv(ij)*dyqv(ij-iip1).gt.0.) THEN
609 dyq(ij,l)=sign(min(abs(dyq(ij,l)),dyqmax(ij)),dyq(ij,l))
610 ELSE
611 dyq(ij,l)=0.
612 ENDIF
613 ENDDO
614
615 ENDDO
616
617 DO l=1,llm
618 DO ij=1,ip1jm
619 IF( masse_adv_v(ij,l).GT.0. ) THEN
620 qbyv(ij,l)= MIN( qsat(ij+iip1,l), q(ij+iip1,l ) +
621 , dyq(ij+iip1,l)*0.5*(1.-masse_adv_v(ij,l)/masse(ij+iip1,l)))
622 ELSE
623 qbyv(ij,l)= MIN( qsat(ij,l), q(ij,l) - dyq(ij,l) *
624 , 0.5*(1.+masse_adv_v(ij,l)/masse(ij,l)) )
625 ENDIF
626 qbyv(ij,l) = masse_adv_v(ij,l)*qbyv(ij,l)
627 ENDDO
628 ENDDO
629
630
631 DO l=1,llm
632 DO ij=iip2,ip1jm
633 newmasse=masse(ij,l)
634 & +masse_adv_v(ij,l)-masse_adv_v(ij-iip1,l)
635 q(ij,l)=(q(ij,l)*masse(ij,l)+qbyv(ij,l)-qbyv(ij-iip1,l))
636 & /newmasse
637 masse(ij,l)=newmasse
638 ENDDO
639 c.-. ancienne version
640 convpn=SSUM(iim,qbyv(1,l),1)/apoln
641 convmpn=ssum(iim,masse_adv_v(1,l),1)/apoln
642 DO ij = 1,iip1
643 newmasse=masse(ij,l)+convmpn*aire(ij)
644 q(ij,l)=(q(ij,l)*masse(ij,l)+convpn*aire(ij))/
645 & newmasse
646 masse(ij,l)=newmasse
647 ENDDO
648 convps = -SSUM(iim,qbyv(ip1jm-iim,l),1)/apols
649 convmps = -SSUM(iim,masse_adv_v(ip1jm-iim,l),1)/apols
650 DO ij = ip1jm+1,ip1jmp1
651 newmasse=masse(ij,l)+convmps*aire(ij)
652 q(ij,l)=(q(ij,l)*masse(ij,l)+convps*aire(ij))/
653 & newmasse
654 masse(ij,l)=newmasse
655 ENDDO
656 c.-. fin ancienne version
657
658 c._. nouvelle version
659 c convpn=SSUM(iim,qbyv(1,l),1)
660 c convmpn=ssum(iim,masse_adv_v(1,l),1)
661 c oldmasse=ssum(iim,masse(1,l),1)
662 c newmasse=oldmasse+convmpn
663 c newq=(q(1,l)*oldmasse+convpn)/newmasse
664 c newmasse=newmasse/apoln
665 c DO ij = 1,iip1
666 c q(ij,l)=newq
667 c masse(ij,l)=newmasse*aire(ij)
668 c ENDDO
669 c convps=-SSUM(iim,qbyv(ip1jm-iim,l),1)
670 c convmps=-ssum(iim,masse_adv_v(ip1jm-iim,l),1)
671 c oldmasse=ssum(iim,masse(ip1jm-iim,l),1)
672 c newmasse=oldmasse+convmps
673 c newq=(q(ip1jmp1,l)*oldmasse+convps)/newmasse
674 c newmasse=newmasse/apols
675 c DO ij = ip1jm+1,ip1jmp1
676 c q(ij,l)=newq
677 c masse(ij,l)=newmasse*aire(ij)
678 c ENDDO
679 c._. fin nouvelle version
680 ENDDO
681
682 RETURN
683 END

  ViewVC Help
Powered by ViewVC 1.1.21