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

Contents of /trunk/libf/dyn3d/vlspltqs.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
File size: 18981 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/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 IMPLICIT NONE
474 c
475 c
476 c Arguments:
477 c ----------
478 REAL masse(ip1jmp1,llm),pente_max
479 REAL masse_adv_v( ip1jm,llm)
480 REAL q(ip1jmp1,llm)
481 REAL qsat(ip1jmp1,llm)
482 c
483 c Local
484 c ---------
485 c
486 INTEGER i,ij,l
487 c
488 REAL airej2,airejjm,airescb(iim),airesch(iim)
489 REAL dyq(ip1jmp1,llm),dyqv(ip1jm)
490 REAL adyqv(ip1jm),dyqmax(ip1jmp1)
491 REAL qbyv(ip1jm,llm)
492
493 REAL qpns,qpsn,dyn1,dys1,dyn2,dys2,newmasse,fn,fs
494 c REAL newq,oldmasse
495 Logical first,testcpu
496 REAL temps0,temps1,temps2,temps3,temps4,temps5
497 SAVE temps0,temps1,temps2,temps3,temps4,temps5
498 SAVE first,testcpu
499
500 REAL convpn,convps,convmpn,convmps
501 REAL sinlon(iip1),sinlondlon(iip1)
502 REAL coslon(iip1),coslondlon(iip1)
503 SAVE sinlon,coslon,sinlondlon,coslondlon
504 SAVE airej2,airejjm
505 c
506 c
507 REAL SSUM
508
509 DATA first,testcpu/.true.,.false./
510 DATA temps0,temps1,temps2,temps3,temps4,temps5/0.,0.,0.,0.,0.,0./
511
512 IF(first) THEN
513 PRINT*,'Shema Amont nouveau appele dans Vanleer '
514 first=.false.
515 do i=2,iip1
516 coslon(i)=cos(rlonv(i))
517 sinlon(i)=sin(rlonv(i))
518 coslondlon(i)=coslon(i)*(rlonu(i)-rlonu(i-1))/pi
519 sinlondlon(i)=sinlon(i)*(rlonu(i)-rlonu(i-1))/pi
520 ENDDO
521 coslon(1)=coslon(iip1)
522 coslondlon(1)=coslondlon(iip1)
523 sinlon(1)=sinlon(iip1)
524 sinlondlon(1)=sinlondlon(iip1)
525 airej2 = SSUM( iim, aire(iip2), 1 )
526 airejjm= SSUM( iim, aire(ip1jm -iim), 1 )
527 ENDIF
528
529 c
530
531
532 DO l = 1, llm
533 c
534 c --------------------------------
535 c CALCUL EN LATITUDE
536 c --------------------------------
537
538 c On commence par calculer la valeur du traceur moyenne sur le premier cercle
539 c de latitude autour du pole (qpns pour le pole nord et qpsn pour
540 c le pole nord) qui sera utilisee pour evaluer les pentes au pole.
541
542 DO i = 1, iim
543 airescb(i) = aire(i+ iip1) * q(i+ iip1,l)
544 airesch(i) = aire(i+ ip1jm- iip1) * q(i+ ip1jm- iip1,l)
545 ENDDO
546 qpns = SSUM( iim, airescb ,1 ) / airej2
547 qpsn = SSUM( iim, airesch ,1 ) / airejjm
548
549 c calcul des pentes aux points v
550
551 DO ij=1,ip1jm
552 dyqv(ij)=q(ij,l)-q(ij+iip1,l)
553 adyqv(ij)=abs(dyqv(ij))
554 ENDDO
555
556 c calcul des pentes aux points scalaires
557
558 DO ij=iip2,ip1jm
559 dyq(ij,l)=.5*(dyqv(ij-iip1)+dyqv(ij))
560 dyqmax(ij)=min(adyqv(ij-iip1),adyqv(ij))
561 dyqmax(ij)=pente_max*dyqmax(ij)
562 ENDDO
563
564 c calcul des pentes aux poles
565
566 DO ij=1,iip1
567 dyq(ij,l)=qpns-q(ij+iip1,l)
568 dyq(ip1jm+ij,l)=q(ip1jm+ij-iip1,l)-qpsn
569 ENDDO
570
571 c filtrage de la derivee
572 dyn1=0.
573 dys1=0.
574 dyn2=0.
575 dys2=0.
576 DO ij=1,iim
577 dyn1=dyn1+sinlondlon(ij)*dyq(ij,l)
578 dys1=dys1+sinlondlon(ij)*dyq(ip1jm+ij,l)
579 dyn2=dyn2+coslondlon(ij)*dyq(ij,l)
580 dys2=dys2+coslondlon(ij)*dyq(ip1jm+ij,l)
581 ENDDO
582 DO ij=1,iip1
583 dyq(ij,l)=dyn1*sinlon(ij)+dyn2*coslon(ij)
584 dyq(ip1jm+ij,l)=dys1*sinlon(ij)+dys2*coslon(ij)
585 ENDDO
586
587 c calcul des pentes limites aux poles
588
589 fn=1.
590 fs=1.
591 DO ij=1,iim
592 IF(pente_max*adyqv(ij).lt.abs(dyq(ij,l))) THEN
593 fn=min(pente_max*adyqv(ij)/abs(dyq(ij,l)),fn)
594 ENDIF
595 IF(pente_max*adyqv(ij+ip1jm-iip1).lt.abs(dyq(ij+ip1jm,l))) THEN
596 fs=min(pente_max*adyqv(ij+ip1jm-iip1)/abs(dyq(ij+ip1jm,l)),fs)
597 ENDIF
598 ENDDO
599 DO ij=1,iip1
600 dyq(ij,l)=fn*dyq(ij,l)
601 dyq(ip1jm+ij,l)=fs*dyq(ip1jm+ij,l)
602 ENDDO
603
604 c calcul des pentes limitees
605
606 DO ij=iip2,ip1jm
607 IF(dyqv(ij)*dyqv(ij-iip1).gt.0.) THEN
608 dyq(ij,l)=sign(min(abs(dyq(ij,l)),dyqmax(ij)),dyq(ij,l))
609 ELSE
610 dyq(ij,l)=0.
611 ENDIF
612 ENDDO
613
614 ENDDO
615
616 DO l=1,llm
617 DO ij=1,ip1jm
618 IF( masse_adv_v(ij,l).GT.0. ) THEN
619 qbyv(ij,l)= MIN( qsat(ij+iip1,l), q(ij+iip1,l ) +
620 , dyq(ij+iip1,l)*0.5*(1.-masse_adv_v(ij,l)/masse(ij+iip1,l)))
621 ELSE
622 qbyv(ij,l)= MIN( qsat(ij,l), q(ij,l) - dyq(ij,l) *
623 , 0.5*(1.+masse_adv_v(ij,l)/masse(ij,l)) )
624 ENDIF
625 qbyv(ij,l) = masse_adv_v(ij,l)*qbyv(ij,l)
626 ENDDO
627 ENDDO
628
629
630 DO l=1,llm
631 DO ij=iip2,ip1jm
632 newmasse=masse(ij,l)
633 & +masse_adv_v(ij,l)-masse_adv_v(ij-iip1,l)
634 q(ij,l)=(q(ij,l)*masse(ij,l)+qbyv(ij,l)-qbyv(ij-iip1,l))
635 & /newmasse
636 masse(ij,l)=newmasse
637 ENDDO
638 c.-. ancienne version
639 convpn=SSUM(iim,qbyv(1,l),1)/apoln
640 convmpn=ssum(iim,masse_adv_v(1,l),1)/apoln
641 DO ij = 1,iip1
642 newmasse=masse(ij,l)+convmpn*aire(ij)
643 q(ij,l)=(q(ij,l)*masse(ij,l)+convpn*aire(ij))/
644 & newmasse
645 masse(ij,l)=newmasse
646 ENDDO
647 convps = -SSUM(iim,qbyv(ip1jm-iim,l),1)/apols
648 convmps = -SSUM(iim,masse_adv_v(ip1jm-iim,l),1)/apols
649 DO ij = ip1jm+1,ip1jmp1
650 newmasse=masse(ij,l)+convmps*aire(ij)
651 q(ij,l)=(q(ij,l)*masse(ij,l)+convps*aire(ij))/
652 & newmasse
653 masse(ij,l)=newmasse
654 ENDDO
655 c.-. fin ancienne version
656
657 c._. nouvelle version
658 c convpn=SSUM(iim,qbyv(1,l),1)
659 c convmpn=ssum(iim,masse_adv_v(1,l),1)
660 c oldmasse=ssum(iim,masse(1,l),1)
661 c newmasse=oldmasse+convmpn
662 c newq=(q(1,l)*oldmasse+convpn)/newmasse
663 c newmasse=newmasse/apoln
664 c DO ij = 1,iip1
665 c q(ij,l)=newq
666 c masse(ij,l)=newmasse*aire(ij)
667 c ENDDO
668 c convps=-SSUM(iim,qbyv(ip1jm-iim,l),1)
669 c convmps=-ssum(iim,masse_adv_v(ip1jm-iim,l),1)
670 c oldmasse=ssum(iim,masse(ip1jm-iim,l),1)
671 c newmasse=oldmasse+convmps
672 c newq=(q(ip1jmp1,l)*oldmasse+convps)/newmasse
673 c newmasse=newmasse/apols
674 c DO ij = ip1jm+1,ip1jmp1
675 c q(ij,l)=newq
676 c masse(ij,l)=newmasse*aire(ij)
677 c ENDDO
678 c._. fin nouvelle version
679 ENDDO
680
681 RETURN
682 END

  ViewVC Help
Powered by ViewVC 1.1.21