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

Annotation of /trunk/dyn3d/vlspltqs.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3 - (hide annotations)
Wed Feb 27 13:16:39 2008 UTC (16 years, 3 months ago) by guez
Original Path: trunk/libf/dyn3d/vlspltqs.f
File size: 20954 byte(s)
Initial import
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     REAL pbaru( ip1jmp1,llm ),pbarv( ip1jm,llm)
37     REAL q(ip1jmp1,llm)
38     REAL w(ip1jmp1,llm),pdt
39     REAL p(ip1jmp1,llmp1),teta(ip1jmp1,llm),pk(ip1jmp1,llm)
40     c
41     c Local
42     c ---------
43     c
44     INTEGER i,ij,l,j,ii
45     c
46     REAL qsat(ip1jmp1,llm)
47     REAL zm(ip1jmp1,llm)
48     REAL mu(ip1jmp1,llm)
49     REAL mv(ip1jm,llm)
50     REAL mw(ip1jmp1,llm+1)
51     REAL zq(ip1jmp1,llm)
52     REAL temps1,temps2,temps3
53     REAL zzpbar, zzw
54     LOGICAL testcpu
55     SAVE testcpu
56     SAVE temps1,temps2,temps3
57    
58     REAL qmin,qmax
59     DATA qmin,qmax/0.,1.e33/
60     DATA testcpu/.false./
61     DATA temps1,temps2,temps3/0.,0.,0./
62    
63     c--pour rapport de melange saturant--
64    
65     REAL rtt,retv,r2es,r3les,r3ies,r4les,r4ies,play
66     REAL ptarg,pdelarg,foeew,zdelta
67     REAL tempe(ip1jmp1)
68    
69     c fonction psat(T)
70    
71     FOEEW ( PTARG,PDELARG ) = EXP (
72     * (R3LES*(1.-PDELARG)+R3IES*PDELARG) * (PTARG-RTT)
73     * / (PTARG-(R4LES*(1.-PDELARG)+R4IES*PDELARG)) )
74    
75     r2es = 380.11733
76     r3les = 17.269
77     r3ies = 21.875
78     r4les = 35.86
79     r4ies = 7.66
80     retv = 0.6077667
81     rtt = 273.16
82    
83     c-- Calcul de Qsat en chaque point
84     c-- approximation: au milieu des couches play(l)=(p(l)+p(l+1))/2
85     c pour eviter une exponentielle.
86     DO l = 1, llm
87     DO ij = 1, ip1jmp1
88     tempe(ij) = teta(ij,l) * pk(ij,l) /cpp
89     ENDDO
90     DO ij = 1, ip1jmp1
91     zdelta = MAX( 0., SIGN(1., rtt - tempe(ij)) )
92     play = 0.5*(p(ij,l)+p(ij,l+1))
93     qsat(ij,l) = MIN(0.5, r2es* FOEEW(tempe(ij),zdelta) / play )
94     qsat(ij,l) = qsat(ij,l) / ( 1. - retv * qsat(ij,l) )
95     ENDDO
96     ENDDO
97    
98     c PRINT*,'Debut vlsplt version debug sans vlyqs'
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     ccc PRINT*,'Nombre de points pour lesquels on advect plus que le'
371     ccc & ,'contenu de la maille : ',n0
372    
373     DO l=1,llm
374     IF(nl(l).gt.0) THEN
375     iju=0
376     c indicage des mailles concernees par le traitement special
377     DO ij=iip2,ip1jm
378     IF(iadvplus(ij,l).eq.1.and.mod(ij,iip1).ne.0) THEN
379     iju=iju+1
380     indu(iju)=ij
381     ENDIF
382     ENDDO
383     niju=iju
384     c PRINT*,'niju,nl',niju,nl(l)
385    
386     c traitement des mailles
387     DO iju=1,niju
388     ij=indu(iju)
389     j=(ij-1)/iip1+1
390     zu_m=u_m(ij,l)
391     u_mq(ij,l)=0.
392     IF(zu_m.gt.0.) THEN
393     ijq=ij
394     i=ijq-(j-1)*iip1
395     c accumulation pour les mailles completements advectees
396     do while(zu_m.gt.masse(ijq,l))
397     u_mq(ij,l)=u_mq(ij,l)+q(ijq,l)*masse(ijq,l)
398     zu_m=zu_m-masse(ijq,l)
399     i=mod(i-2+iim,iim)+1
400     ijq=(j-1)*iip1+i
401     ENDDO
402     c ajout de la maille non completement advectee
403     u_mq(ij,l)=u_mq(ij,l)+zu_m*
404     & (q(ijq,l)+0.5*(1.-zu_m/masse(ijq,l))*dxq(ijq,l))
405     ELSE
406     ijq=ij+1
407     i=ijq-(j-1)*iip1
408     c accumulation pour les mailles completements advectees
409     do while(-zu_m.gt.masse(ijq,l))
410     u_mq(ij,l)=u_mq(ij,l)-q(ijq,l)*masse(ijq,l)
411     zu_m=zu_m+masse(ijq,l)
412     i=mod(i,iim)+1
413     ijq=(j-1)*iip1+i
414     ENDDO
415     c ajout de la maille non completement advectee
416     u_mq(ij,l)=u_mq(ij,l)+zu_m*(q(ijq,l)-
417     & 0.5*(1.+zu_m/masse(ijq,l))*dxq(ijq,l))
418     ENDIF
419     ENDDO
420     ENDIF
421     ENDDO
422     ENDIF ! n0.gt.0
423    
424    
425    
426     c bouclage en latitude
427    
428     DO l=1,llm
429     DO ij=iip1+iip1,ip1jm,iip1
430     u_mq(ij,l)=u_mq(ij-iim,l)
431     ENDDO
432     ENDDO
433    
434    
435     c calcul des tendances
436    
437     DO l=1,llm
438     DO ij=iip2+1,ip1jm
439     new_m=masse(ij,l)+u_m(ij-1,l)-u_m(ij,l)
440     q(ij,l)=(q(ij,l)*masse(ij,l)+
441     & u_mq(ij-1,l)-u_mq(ij,l))
442     & /new_m
443     masse(ij,l)=new_m
444     ENDDO
445     c Modif Fred 22 03 96 correction d'un bug (les scopy ci-dessous)
446     DO ij=iip1+iip1,ip1jm,iip1
447     q(ij-iim,l)=q(ij,l)
448     masse(ij-iim,l)=masse(ij,l)
449     ENDDO
450     ENDDO
451    
452     c CALL SCOPY((jjm-1)*llm,q(iip1+iip1,1),iip1,q(iip2,1),iip1)
453     c CALL SCOPY((jjm-1)*llm,masse(iip1+iip1,1),iip1,masse(iip2,1),iip1)
454    
455    
456     RETURN
457     END
458     SUBROUTINE vlyqs(q,pente_max,masse,masse_adv_v,qsat)
459     c
460     c Auteurs: P.Le Van, F.Hourdin, F.Forget
461     c
462     c ********************************************************************
463     c Shema d'advection " pseudo amont " .
464     c ********************************************************************
465     c q,masse_adv_v,w sont des arguments d'entree pour le s-pg ....
466     c qsat est un argument de sortie pour le s-pg ....
467     c
468     c
469     c --------------------------------------------------------------------
470     c
471     use dimens_m
472     use paramet_m
473     use comconst
474     use comvert
475     use logic
476     use comgeom
477     IMPLICIT NONE
478     c
479     c
480     c Arguments:
481     c ----------
482     REAL masse(ip1jmp1,llm),pente_max
483     REAL masse_adv_v( ip1jm,llm)
484     REAL q(ip1jmp1,llm)
485     REAL qsat(ip1jmp1,llm)
486     c
487     c Local
488     c ---------
489     c
490     INTEGER i,ij,l
491     c
492     REAL airej2,airejjm,airescb(iim),airesch(iim)
493     REAL dyq(ip1jmp1,llm),dyqv(ip1jm)
494     REAL adyqv(ip1jm),dyqmax(ip1jmp1)
495     REAL qbyv(ip1jm,llm)
496    
497     REAL qpns,qpsn,dyn1,dys1,dyn2,dys2,newmasse,fn,fs
498     c REAL newq,oldmasse
499     Logical first,testcpu
500     REAL temps0,temps1,temps2,temps3,temps4,temps5
501     SAVE temps0,temps1,temps2,temps3,temps4,temps5
502     SAVE first,testcpu
503    
504     REAL convpn,convps,convmpn,convmps
505     REAL sinlon(iip1),sinlondlon(iip1)
506     REAL coslon(iip1),coslondlon(iip1)
507     SAVE sinlon,coslon,sinlondlon,coslondlon
508     SAVE airej2,airejjm
509     c
510     c
511     REAL SSUM
512    
513     DATA first,testcpu/.true.,.false./
514     DATA temps0,temps1,temps2,temps3,temps4,temps5/0.,0.,0.,0.,0.,0./
515    
516     IF(first) THEN
517     PRINT*,'Shema Amont nouveau appele dans Vanleer '
518     first=.false.
519     do i=2,iip1
520     coslon(i)=cos(rlonv(i))
521     sinlon(i)=sin(rlonv(i))
522     coslondlon(i)=coslon(i)*(rlonu(i)-rlonu(i-1))/pi
523     sinlondlon(i)=sinlon(i)*(rlonu(i)-rlonu(i-1))/pi
524     ENDDO
525     coslon(1)=coslon(iip1)
526     coslondlon(1)=coslondlon(iip1)
527     sinlon(1)=sinlon(iip1)
528     sinlondlon(1)=sinlondlon(iip1)
529     airej2 = SSUM( iim, aire(iip2), 1 )
530     airejjm= SSUM( iim, aire(ip1jm -iim), 1 )
531     ENDIF
532    
533     c
534    
535    
536     DO l = 1, llm
537     c
538     c --------------------------------
539     c CALCUL EN LATITUDE
540     c --------------------------------
541    
542     c On commence par calculer la valeur du traceur moyenne sur le premier cercle
543     c de latitude autour du pole (qpns pour le pole nord et qpsn pour
544     c le pole nord) qui sera utilisee pour evaluer les pentes au pole.
545    
546     DO i = 1, iim
547     airescb(i) = aire(i+ iip1) * q(i+ iip1,l)
548     airesch(i) = aire(i+ ip1jm- iip1) * q(i+ ip1jm- iip1,l)
549     ENDDO
550     qpns = SSUM( iim, airescb ,1 ) / airej2
551     qpsn = SSUM( iim, airesch ,1 ) / airejjm
552    
553     c calcul des pentes aux points v
554    
555     DO ij=1,ip1jm
556     dyqv(ij)=q(ij,l)-q(ij+iip1,l)
557     adyqv(ij)=abs(dyqv(ij))
558     ENDDO
559    
560     c calcul des pentes aux points scalaires
561    
562     DO ij=iip2,ip1jm
563     dyq(ij,l)=.5*(dyqv(ij-iip1)+dyqv(ij))
564     dyqmax(ij)=min(adyqv(ij-iip1),adyqv(ij))
565     dyqmax(ij)=pente_max*dyqmax(ij)
566     ENDDO
567    
568     c calcul des pentes aux poles
569    
570     DO ij=1,iip1
571     dyq(ij,l)=qpns-q(ij+iip1,l)
572     dyq(ip1jm+ij,l)=q(ip1jm+ij-iip1,l)-qpsn
573     ENDDO
574    
575     c filtrage de la derivee
576     dyn1=0.
577     dys1=0.
578     dyn2=0.
579     dys2=0.
580     DO ij=1,iim
581     dyn1=dyn1+sinlondlon(ij)*dyq(ij,l)
582     dys1=dys1+sinlondlon(ij)*dyq(ip1jm+ij,l)
583     dyn2=dyn2+coslondlon(ij)*dyq(ij,l)
584     dys2=dys2+coslondlon(ij)*dyq(ip1jm+ij,l)
585     ENDDO
586     DO ij=1,iip1
587     dyq(ij,l)=dyn1*sinlon(ij)+dyn2*coslon(ij)
588     dyq(ip1jm+ij,l)=dys1*sinlon(ij)+dys2*coslon(ij)
589     ENDDO
590    
591     c calcul des pentes limites aux poles
592    
593     fn=1.
594     fs=1.
595     DO ij=1,iim
596     IF(pente_max*adyqv(ij).lt.abs(dyq(ij,l))) THEN
597     fn=min(pente_max*adyqv(ij)/abs(dyq(ij,l)),fn)
598     ENDIF
599     IF(pente_max*adyqv(ij+ip1jm-iip1).lt.abs(dyq(ij+ip1jm,l))) THEN
600     fs=min(pente_max*adyqv(ij+ip1jm-iip1)/abs(dyq(ij+ip1jm,l)),fs)
601     ENDIF
602     ENDDO
603     DO ij=1,iip1
604     dyq(ij,l)=fn*dyq(ij,l)
605     dyq(ip1jm+ij,l)=fs*dyq(ip1jm+ij,l)
606     ENDDO
607    
608     CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
609     C En memoire de dIFferents tests sur la
610     C limitation des pentes aux poles.
611     CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
612     C PRINT*,dyq(1)
613     C PRINT*,dyqv(iip1+1)
614     C apn=abs(dyq(1)/dyqv(iip1+1))
615     C PRINT*,dyq(ip1jm+1)
616     C PRINT*,dyqv(ip1jm-iip1+1)
617     C aps=abs(dyq(ip1jm+1)/dyqv(ip1jm-iip1+1))
618     C DO ij=2,iim
619     C apn=amax1(abs(dyq(ij)/dyqv(ij)),apn)
620     C aps=amax1(abs(dyq(ip1jm+ij)/dyqv(ip1jm-iip1+ij)),aps)
621     C ENDDO
622     C apn=min(pente_max/apn,1.)
623     C aps=min(pente_max/aps,1.)
624     C
625     C
626     C cas ou on a un extremum au pole
627     C
628     C IF(dyqv(ismin(iim,dyqv,1))*dyqv(ismax(iim,dyqv,1)).le.0.)
629     C & apn=0.
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 & aps=0.
633     C
634     C limitation des pentes aux poles
635     C DO ij=1,iip1
636     C dyq(ij)=apn*dyq(ij)
637     C dyq(ip1jm+ij)=aps*dyq(ip1jm+ij)
638     C ENDDO
639     C
640     C test
641     C DO ij=1,iip1
642     C dyq(iip1+ij)=0.
643     C dyq(ip1jm+ij-iip1)=0.
644     C ENDDO
645     C DO ij=1,ip1jmp1
646     C dyq(ij)=dyq(ij)*cos(rlatu((ij-1)/iip1+1))
647     C ENDDO
648     C
649     C changement 10 07 96
650     C IF(dyqv(ismin(iim,dyqv,1))*dyqv(ismax(iim,dyqv,1)).le.0.)
651     C & THEN
652     C DO ij=1,iip1
653     C dyqmax(ij)=0.
654     C ENDDO
655     C ELSE
656     C DO ij=1,iip1
657     C dyqmax(ij)=pente_max*abs(dyqv(ij))
658     C ENDDO
659     C ENDIF
660     C
661     C IF(dyqv(ismax(iim,dyqv(ip1jm-iip1+1),1)+ip1jm-iip1+1)*
662     C & dyqv(ismin(iim,dyqv(ip1jm-iip1+1),1)+ip1jm-iip1+1).le.0.)
663     C &THEN
664     C DO ij=ip1jm+1,ip1jmp1
665     C dyqmax(ij)=0.
666     C ENDDO
667     C ELSE
668     C DO ij=ip1jm+1,ip1jmp1
669     C dyqmax(ij)=pente_max*abs(dyqv(ij-iip1))
670     C ENDDO
671     C ENDIF
672     C fin changement 10 07 96
673     CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
674    
675     c calcul des pentes limitees
676    
677     DO ij=iip2,ip1jm
678     IF(dyqv(ij)*dyqv(ij-iip1).gt.0.) THEN
679     dyq(ij,l)=sign(min(abs(dyq(ij,l)),dyqmax(ij)),dyq(ij,l))
680     ELSE
681     dyq(ij,l)=0.
682     ENDIF
683     ENDDO
684    
685     ENDDO
686    
687     DO l=1,llm
688     DO ij=1,ip1jm
689     IF( masse_adv_v(ij,l).GT.0. ) THEN
690     qbyv(ij,l)= MIN( qsat(ij+iip1,l), q(ij+iip1,l ) +
691     , dyq(ij+iip1,l)*0.5*(1.-masse_adv_v(ij,l)/masse(ij+iip1,l)))
692     ELSE
693     qbyv(ij,l)= MIN( qsat(ij,l), q(ij,l) - dyq(ij,l) *
694     , 0.5*(1.+masse_adv_v(ij,l)/masse(ij,l)) )
695     ENDIF
696     qbyv(ij,l) = masse_adv_v(ij,l)*qbyv(ij,l)
697     ENDDO
698     ENDDO
699    
700    
701     DO l=1,llm
702     DO ij=iip2,ip1jm
703     newmasse=masse(ij,l)
704     & +masse_adv_v(ij,l)-masse_adv_v(ij-iip1,l)
705     q(ij,l)=(q(ij,l)*masse(ij,l)+qbyv(ij,l)-qbyv(ij-iip1,l))
706     & /newmasse
707     masse(ij,l)=newmasse
708     ENDDO
709     c.-. ancienne version
710     convpn=SSUM(iim,qbyv(1,l),1)/apoln
711     convmpn=ssum(iim,masse_adv_v(1,l),1)/apoln
712     DO ij = 1,iip1
713     newmasse=masse(ij,l)+convmpn*aire(ij)
714     q(ij,l)=(q(ij,l)*masse(ij,l)+convpn*aire(ij))/
715     & newmasse
716     masse(ij,l)=newmasse
717     ENDDO
718     convps = -SSUM(iim,qbyv(ip1jm-iim,l),1)/apols
719     convmps = -SSUM(iim,masse_adv_v(ip1jm-iim,l),1)/apols
720     DO ij = ip1jm+1,ip1jmp1
721     newmasse=masse(ij,l)+convmps*aire(ij)
722     q(ij,l)=(q(ij,l)*masse(ij,l)+convps*aire(ij))/
723     & newmasse
724     masse(ij,l)=newmasse
725     ENDDO
726     c.-. fin ancienne version
727    
728     c._. nouvelle version
729     c convpn=SSUM(iim,qbyv(1,l),1)
730     c convmpn=ssum(iim,masse_adv_v(1,l),1)
731     c oldmasse=ssum(iim,masse(1,l),1)
732     c newmasse=oldmasse+convmpn
733     c newq=(q(1,l)*oldmasse+convpn)/newmasse
734     c newmasse=newmasse/apoln
735     c DO ij = 1,iip1
736     c q(ij,l)=newq
737     c masse(ij,l)=newmasse*aire(ij)
738     c ENDDO
739     c convps=-SSUM(iim,qbyv(ip1jm-iim,l),1)
740     c convmps=-ssum(iim,masse_adv_v(ip1jm-iim,l),1)
741     c oldmasse=ssum(iim,masse(ip1jm-iim,l),1)
742     c newmasse=oldmasse+convmps
743     c newq=(q(ip1jmp1,l)*oldmasse+convps)/newmasse
744     c newmasse=newmasse/apols
745     c DO ij = ip1jm+1,ip1jmp1
746     c q(ij,l)=newq
747     c masse(ij,l)=newmasse*aire(ij)
748     c ENDDO
749     c._. fin nouvelle version
750     ENDDO
751    
752     RETURN
753     END

  ViewVC Help
Powered by ViewVC 1.1.21