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

Annotation of /trunk/dyn3d/vlspltqs.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 32 - (hide annotations)
Tue Apr 6 17:52:58 2010 UTC (14 years, 1 month ago) by guez
Original Path: trunk/libf/dyn3d/vlspltqs.f
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 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     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