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

Annotation of /trunk/dyn3d/vlspltqs.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 39 - (hide 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 guez 3 !
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 guez 31 REAL, intent(in):: pbaru( ip1jmp1,llm ),pbarv( ip1jm,llm)
37 guez 3 REAL q(ip1jmp1,llm)
38 guez 28 REAL w(ip1jmp1,llm)
39     real, intent(in):: pdt
40 guez 10 REAL, intent(in):: p(ip1jmp1,llmp1)
41     real teta(ip1jmp1,llm),pk(ip1jmp1,llm)
42 guez 3 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 guez 39 USE nr_util, ONLY : pi
474 guez 3 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