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

Annotation of /trunk/dyn3d/vlspltqs.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 31 - (hide annotations)
Thu Apr 1 14:59:19 2010 UTC (14 years, 1 month ago) by guez
Original Path: trunk/libf/dyn3d/vlspltqs.f
File size: 21018 byte(s)
Split "vlsplt.f" in single-procedure files. Gathered the files in
directory "dyn3d/Vlsplt".

Defined "pbarum(:, 1, :)" and "pbarum(:, jjm + 1, :)" in procedure
"groupe".

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     c PRINT*,'Debut vlsplt version debug sans vlyqs'
101    
102     zzpbar = 0.5 * pdt
103     zzw = pdt
104     DO l=1,llm
105     DO ij = iip2,ip1jm
106     mu(ij,l)=pbaru(ij,l) * zzpbar
107     ENDDO
108     DO ij=1,ip1jm
109     mv(ij,l)=pbarv(ij,l) * zzpbar
110     ENDDO
111     DO ij=1,ip1jmp1
112     mw(ij,l)=w(ij,l) * zzw
113     ENDDO
114     ENDDO
115    
116     DO ij=1,ip1jmp1
117     mw(ij,llm+1)=0.
118     ENDDO
119    
120     CALL SCOPY(ijp1llm,q,1,zq,1)
121     CALL SCOPY(ijp1llm,masse,1,zm,1)
122    
123     c call minmaxq(zq,qmin,qmax,'avant vlxqs ')
124     call vlxqs(zq,pente_max,zm,mu,qsat)
125    
126    
127     c call minmaxq(zq,qmin,qmax,'avant vlyqs ')
128    
129     call vlyqs(zq,pente_max,zm,mv,qsat)
130    
131    
132     c call minmaxq(zq,qmin,qmax,'avant vlz ')
133    
134     call vlz(zq,pente_max,zm,mw)
135    
136    
137     c call minmaxq(zq,qmin,qmax,'avant vlyqs ')
138     c call minmaxq(zm,qmin,qmax,'M avant vlyqs ')
139    
140     call vlyqs(zq,pente_max,zm,mv,qsat)
141    
142    
143     c call minmaxq(zq,qmin,qmax,'avant vlxqs ')
144     c call minmaxq(zm,qmin,qmax,'M avant vlxqs ')
145    
146     call vlxqs(zq,pente_max,zm,mu,qsat)
147    
148     c call minmaxq(zq,qmin,qmax,'apres vlxqs ')
149     c call minmaxq(zm,qmin,qmax,'M apres vlxqs ')
150    
151    
152     DO l=1,llm
153     DO ij=1,ip1jmp1
154     q(ij,l)=zq(ij,l)
155     ENDDO
156     DO ij=1,ip1jm+1,iip1
157     q(ij+iim,l)=q(ij,l)
158     ENDDO
159     ENDDO
160    
161     RETURN
162     END
163     SUBROUTINE vlxqs(q,pente_max,masse,u_m,qsat)
164     c
165     c Auteurs: P.Le Van, F.Hourdin, F.Forget
166     c
167     c ********************************************************************
168     c Shema d'advection " pseudo amont " .
169     c ********************************************************************
170     c
171     c --------------------------------------------------------------------
172     use dimens_m
173     use paramet_m
174     use comconst
175     use comvert
176     use logic
177     IMPLICIT NONE
178     c
179     c
180     c
181     c Arguments:
182     c ----------
183     REAL masse(ip1jmp1,llm),pente_max
184     REAL u_m( ip1jmp1,llm )
185     REAL q(ip1jmp1,llm)
186     REAL qsat(ip1jmp1,llm)
187     c
188     c Local
189     c ---------
190     c
191     INTEGER ij,l,j,i,iju,ijq,indu(ip1jmp1),niju
192     INTEGER n0,iadvplus(ip1jmp1,llm),nl(llm)
193     c
194     REAL new_m,zu_m,zdum(ip1jmp1,llm)
195     REAL dxq(ip1jmp1,llm),dxqu(ip1jmp1)
196     REAL zz(ip1jmp1)
197     REAL adxqu(ip1jmp1),dxqmax(ip1jmp1,llm)
198     REAL u_mq(ip1jmp1,llm)
199    
200     Logical first,testcpu
201     SAVE first,testcpu
202    
203     REAL SSUM
204     REAL temps0,temps1,temps2,temps3,temps4,temps5
205     SAVE temps0,temps1,temps2,temps3,temps4,temps5
206    
207    
208     DATA first,testcpu/.true.,.false./
209    
210     IF(first) THEN
211     temps1=0.
212     temps2=0.
213     temps3=0.
214     temps4=0.
215     temps5=0.
216     first=.false.
217     ENDIF
218    
219     c calcul de la pente a droite et a gauche de la maille
220    
221    
222     IF (pente_max.gt.-1.e-5) THEN
223     c IF (pente_max.gt.10) THEN
224    
225     c calcul des pentes avec limitation, Van Leer scheme I:
226     c -----------------------------------------------------
227    
228     c calcul de la pente aux points u
229     DO l = 1, llm
230     DO ij=iip2,ip1jm-1
231     dxqu(ij)=q(ij+1,l)-q(ij,l)
232     c IF(u_m(ij,l).lt.0.) stop'limx n admet pas les U<0'
233     c sigu(ij)=u_m(ij,l)/masse(ij,l)
234     ENDDO
235     DO ij=iip1+iip1,ip1jm,iip1
236     dxqu(ij)=dxqu(ij-iim)
237     c sigu(ij)=sigu(ij-iim)
238     ENDDO
239    
240     DO ij=iip2,ip1jm
241     adxqu(ij)=abs(dxqu(ij))
242     ENDDO
243    
244     c calcul de la pente maximum dans la maille en valeur absolue
245    
246     DO ij=iip2+1,ip1jm
247     dxqmax(ij,l)=pente_max*
248     , min(adxqu(ij-1),adxqu(ij))
249     c limitation subtile
250     c , min(adxqu(ij-1)/sigu(ij-1),adxqu(ij)/(1.-sigu(ij)))
251    
252    
253     ENDDO
254    
255     DO ij=iip1+iip1,ip1jm,iip1
256     dxqmax(ij-iim,l)=dxqmax(ij,l)
257     ENDDO
258    
259     DO ij=iip2+1,ip1jm
260     IF(dxqu(ij-1)*dxqu(ij).gt.0) THEN
261     dxq(ij,l)=dxqu(ij-1)+dxqu(ij)
262     ELSE
263     c extremum local
264     dxq(ij,l)=0.
265     ENDIF
266     dxq(ij,l)=0.5*dxq(ij,l)
267     dxq(ij,l)=
268     , sign(min(abs(dxq(ij,l)),dxqmax(ij,l)),dxq(ij,l))
269     ENDDO
270    
271     ENDDO ! l=1,llm
272    
273     ELSE ! (pente_max.lt.-1.e-5)
274    
275     c Pentes produits:
276     c ----------------
277    
278     DO l = 1, llm
279     DO ij=iip2,ip1jm-1
280     dxqu(ij)=q(ij+1,l)-q(ij,l)
281     ENDDO
282     DO ij=iip1+iip1,ip1jm,iip1
283     dxqu(ij)=dxqu(ij-iim)
284     ENDDO
285    
286     DO ij=iip2+1,ip1jm
287     zz(ij)=dxqu(ij-1)*dxqu(ij)
288     zz(ij)=zz(ij)+zz(ij)
289     IF(zz(ij).gt.0) THEN
290     dxq(ij,l)=zz(ij)/(dxqu(ij-1)+dxqu(ij))
291     ELSE
292     c extremum local
293     dxq(ij,l)=0.
294     ENDIF
295     ENDDO
296    
297     ENDDO
298    
299     ENDIF ! (pente_max.lt.-1.e-5)
300    
301     c bouclage de la pente en iip1:
302     c -----------------------------
303    
304     DO l=1,llm
305     DO ij=iip1+iip1,ip1jm,iip1
306     dxq(ij-iim,l)=dxq(ij,l)
307     ENDDO
308    
309     DO ij=1,ip1jmp1
310     iadvplus(ij,l)=0
311     ENDDO
312    
313     ENDDO
314    
315    
316     c calcul des flux a gauche et a droite
317    
318     c on cumule le flux correspondant a toutes les mailles dont la masse
319     c au travers de la paroi pENDant le pas de temps.
320     c le rapport de melange de l'air advecte est min(q_vanleer, Qsat_downwind)
321     DO l=1,llm
322     DO ij=iip2,ip1jm-1
323     IF (u_m(ij,l).gt.0.) THEN
324     zdum(ij,l)=1.-u_m(ij,l)/masse(ij,l)
325     u_mq(ij,l)=u_m(ij,l)*
326     $ min(q(ij,l)+0.5*zdum(ij,l)*dxq(ij,l),qsat(ij+1,l))
327     ELSE
328     zdum(ij,l)=1.+u_m(ij,l)/masse(ij+1,l)
329     u_mq(ij,l)=u_m(ij,l)*
330     $ min(q(ij+1,l)-0.5*zdum(ij,l)*dxq(ij+1,l),qsat(ij,l))
331     ENDIF
332     ENDDO
333     ENDDO
334    
335    
336     c detection des points ou on advecte plus que la masse de la
337     c maille
338     DO l=1,llm
339     DO ij=iip2,ip1jm-1
340     IF(zdum(ij,l).lt.0) THEN
341     iadvplus(ij,l)=1
342     u_mq(ij,l)=0.
343     ENDIF
344     ENDDO
345     ENDDO
346     DO l=1,llm
347     DO ij=iip1+iip1,ip1jm,iip1
348     iadvplus(ij,l)=iadvplus(ij-iim,l)
349     ENDDO
350     ENDDO
351    
352    
353    
354     c traitement special pour le cas ou on advecte en longitude plus que le
355     c contenu de la maille.
356     c cette partie est mal vectorisee.
357    
358     c pas d'influence de la pression saturante (pour l'instant)
359    
360     c calcul du nombre de maille sur lequel on advecte plus que la maille.
361    
362     n0=0
363     DO l=1,llm
364     nl(l)=0
365     DO ij=iip2,ip1jm
366     nl(l)=nl(l)+iadvplus(ij,l)
367     ENDDO
368     n0=n0+nl(l)
369     ENDDO
370    
371     IF(n0.gt.0) THEN
372     ccc PRINT*,'Nombre de points pour lesquels on advect plus que le'
373     ccc & ,'contenu de la maille : ',n0
374    
375     DO l=1,llm
376     IF(nl(l).gt.0) THEN
377     iju=0
378     c indicage des mailles concernees par le traitement special
379     DO ij=iip2,ip1jm
380     IF(iadvplus(ij,l).eq.1.and.mod(ij,iip1).ne.0) THEN
381     iju=iju+1
382     indu(iju)=ij
383     ENDIF
384     ENDDO
385     niju=iju
386     c PRINT*,'niju,nl',niju,nl(l)
387    
388     c traitement des mailles
389     DO iju=1,niju
390     ij=indu(iju)
391     j=(ij-1)/iip1+1
392     zu_m=u_m(ij,l)
393     u_mq(ij,l)=0.
394     IF(zu_m.gt.0.) THEN
395     ijq=ij
396     i=ijq-(j-1)*iip1
397     c accumulation pour les mailles completements advectees
398     do while(zu_m.gt.masse(ijq,l))
399     u_mq(ij,l)=u_mq(ij,l)+q(ijq,l)*masse(ijq,l)
400     zu_m=zu_m-masse(ijq,l)
401     i=mod(i-2+iim,iim)+1
402     ijq=(j-1)*iip1+i
403     ENDDO
404     c ajout de la maille non completement advectee
405     u_mq(ij,l)=u_mq(ij,l)+zu_m*
406     & (q(ijq,l)+0.5*(1.-zu_m/masse(ijq,l))*dxq(ijq,l))
407     ELSE
408     ijq=ij+1
409     i=ijq-(j-1)*iip1
410     c accumulation pour les mailles completements advectees
411     do while(-zu_m.gt.masse(ijq,l))
412     u_mq(ij,l)=u_mq(ij,l)-q(ijq,l)*masse(ijq,l)
413     zu_m=zu_m+masse(ijq,l)
414     i=mod(i,iim)+1
415     ijq=(j-1)*iip1+i
416     ENDDO
417     c ajout de la maille non completement advectee
418     u_mq(ij,l)=u_mq(ij,l)+zu_m*(q(ijq,l)-
419     & 0.5*(1.+zu_m/masse(ijq,l))*dxq(ijq,l))
420     ENDIF
421     ENDDO
422     ENDIF
423     ENDDO
424     ENDIF ! n0.gt.0
425    
426    
427    
428     c bouclage en latitude
429    
430     DO l=1,llm
431     DO ij=iip1+iip1,ip1jm,iip1
432     u_mq(ij,l)=u_mq(ij-iim,l)
433     ENDDO
434     ENDDO
435    
436    
437     c calcul des tendances
438    
439     DO l=1,llm
440     DO ij=iip2+1,ip1jm
441     new_m=masse(ij,l)+u_m(ij-1,l)-u_m(ij,l)
442     q(ij,l)=(q(ij,l)*masse(ij,l)+
443     & u_mq(ij-1,l)-u_mq(ij,l))
444     & /new_m
445     masse(ij,l)=new_m
446     ENDDO
447     c Modif Fred 22 03 96 correction d'un bug (les scopy ci-dessous)
448     DO ij=iip1+iip1,ip1jm,iip1
449     q(ij-iim,l)=q(ij,l)
450     masse(ij-iim,l)=masse(ij,l)
451     ENDDO
452     ENDDO
453    
454     c CALL SCOPY((jjm-1)*llm,q(iip1+iip1,1),iip1,q(iip2,1),iip1)
455     c CALL SCOPY((jjm-1)*llm,masse(iip1+iip1,1),iip1,masse(iip2,1),iip1)
456    
457    
458     RETURN
459     END
460     SUBROUTINE vlyqs(q,pente_max,masse,masse_adv_v,qsat)
461     c
462     c Auteurs: P.Le Van, F.Hourdin, F.Forget
463     c
464     c ********************************************************************
465     c Shema d'advection " pseudo amont " .
466     c ********************************************************************
467     c q,masse_adv_v,w sont des arguments d'entree pour le s-pg ....
468     c qsat est un argument de sortie pour le s-pg ....
469     c
470     c
471     c --------------------------------------------------------------------
472     c
473     use dimens_m
474     use paramet_m
475     use comconst
476     use comvert
477     use logic
478     use comgeom
479     IMPLICIT NONE
480     c
481     c
482     c Arguments:
483     c ----------
484     REAL masse(ip1jmp1,llm),pente_max
485     REAL masse_adv_v( ip1jm,llm)
486     REAL q(ip1jmp1,llm)
487     REAL qsat(ip1jmp1,llm)
488     c
489     c Local
490     c ---------
491     c
492     INTEGER i,ij,l
493     c
494     REAL airej2,airejjm,airescb(iim),airesch(iim)
495     REAL dyq(ip1jmp1,llm),dyqv(ip1jm)
496     REAL adyqv(ip1jm),dyqmax(ip1jmp1)
497     REAL qbyv(ip1jm,llm)
498    
499     REAL qpns,qpsn,dyn1,dys1,dyn2,dys2,newmasse,fn,fs
500     c REAL newq,oldmasse
501     Logical first,testcpu
502     REAL temps0,temps1,temps2,temps3,temps4,temps5
503     SAVE temps0,temps1,temps2,temps3,temps4,temps5
504     SAVE first,testcpu
505    
506     REAL convpn,convps,convmpn,convmps
507     REAL sinlon(iip1),sinlondlon(iip1)
508     REAL coslon(iip1),coslondlon(iip1)
509     SAVE sinlon,coslon,sinlondlon,coslondlon
510     SAVE airej2,airejjm
511     c
512     c
513     REAL SSUM
514    
515     DATA first,testcpu/.true.,.false./
516     DATA temps0,temps1,temps2,temps3,temps4,temps5/0.,0.,0.,0.,0.,0./
517    
518     IF(first) THEN
519     PRINT*,'Shema Amont nouveau appele dans Vanleer '
520     first=.false.
521     do i=2,iip1
522     coslon(i)=cos(rlonv(i))
523     sinlon(i)=sin(rlonv(i))
524     coslondlon(i)=coslon(i)*(rlonu(i)-rlonu(i-1))/pi
525     sinlondlon(i)=sinlon(i)*(rlonu(i)-rlonu(i-1))/pi
526     ENDDO
527     coslon(1)=coslon(iip1)
528     coslondlon(1)=coslondlon(iip1)
529     sinlon(1)=sinlon(iip1)
530     sinlondlon(1)=sinlondlon(iip1)
531     airej2 = SSUM( iim, aire(iip2), 1 )
532     airejjm= SSUM( iim, aire(ip1jm -iim), 1 )
533     ENDIF
534    
535     c
536    
537    
538     DO l = 1, llm
539     c
540     c --------------------------------
541     c CALCUL EN LATITUDE
542     c --------------------------------
543    
544     c On commence par calculer la valeur du traceur moyenne sur le premier cercle
545     c de latitude autour du pole (qpns pour le pole nord et qpsn pour
546     c le pole nord) qui sera utilisee pour evaluer les pentes au pole.
547    
548     DO i = 1, iim
549     airescb(i) = aire(i+ iip1) * q(i+ iip1,l)
550     airesch(i) = aire(i+ ip1jm- iip1) * q(i+ ip1jm- iip1,l)
551     ENDDO
552     qpns = SSUM( iim, airescb ,1 ) / airej2
553     qpsn = SSUM( iim, airesch ,1 ) / airejjm
554    
555     c calcul des pentes aux points v
556    
557     DO ij=1,ip1jm
558     dyqv(ij)=q(ij,l)-q(ij+iip1,l)
559     adyqv(ij)=abs(dyqv(ij))
560     ENDDO
561    
562     c calcul des pentes aux points scalaires
563    
564     DO ij=iip2,ip1jm
565     dyq(ij,l)=.5*(dyqv(ij-iip1)+dyqv(ij))
566     dyqmax(ij)=min(adyqv(ij-iip1),adyqv(ij))
567     dyqmax(ij)=pente_max*dyqmax(ij)
568     ENDDO
569    
570     c calcul des pentes aux poles
571    
572     DO ij=1,iip1
573     dyq(ij,l)=qpns-q(ij+iip1,l)
574     dyq(ip1jm+ij,l)=q(ip1jm+ij-iip1,l)-qpsn
575     ENDDO
576    
577     c filtrage de la derivee
578     dyn1=0.
579     dys1=0.
580     dyn2=0.
581     dys2=0.
582     DO ij=1,iim
583     dyn1=dyn1+sinlondlon(ij)*dyq(ij,l)
584     dys1=dys1+sinlondlon(ij)*dyq(ip1jm+ij,l)
585     dyn2=dyn2+coslondlon(ij)*dyq(ij,l)
586     dys2=dys2+coslondlon(ij)*dyq(ip1jm+ij,l)
587     ENDDO
588     DO ij=1,iip1
589     dyq(ij,l)=dyn1*sinlon(ij)+dyn2*coslon(ij)
590     dyq(ip1jm+ij,l)=dys1*sinlon(ij)+dys2*coslon(ij)
591     ENDDO
592    
593     c calcul des pentes limites aux poles
594    
595     fn=1.
596     fs=1.
597     DO ij=1,iim
598     IF(pente_max*adyqv(ij).lt.abs(dyq(ij,l))) THEN
599     fn=min(pente_max*adyqv(ij)/abs(dyq(ij,l)),fn)
600     ENDIF
601     IF(pente_max*adyqv(ij+ip1jm-iip1).lt.abs(dyq(ij+ip1jm,l))) THEN
602     fs=min(pente_max*adyqv(ij+ip1jm-iip1)/abs(dyq(ij+ip1jm,l)),fs)
603     ENDIF
604     ENDDO
605     DO ij=1,iip1
606     dyq(ij,l)=fn*dyq(ij,l)
607     dyq(ip1jm+ij,l)=fs*dyq(ip1jm+ij,l)
608     ENDDO
609    
610     CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
611     C En memoire de dIFferents tests sur la
612     C limitation des pentes aux poles.
613     CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
614     C PRINT*,dyq(1)
615     C PRINT*,dyqv(iip1+1)
616     C apn=abs(dyq(1)/dyqv(iip1+1))
617     C PRINT*,dyq(ip1jm+1)
618     C PRINT*,dyqv(ip1jm-iip1+1)
619     C aps=abs(dyq(ip1jm+1)/dyqv(ip1jm-iip1+1))
620     C DO ij=2,iim
621     C apn=amax1(abs(dyq(ij)/dyqv(ij)),apn)
622     C aps=amax1(abs(dyq(ip1jm+ij)/dyqv(ip1jm-iip1+ij)),aps)
623     C ENDDO
624     C apn=min(pente_max/apn,1.)
625     C aps=min(pente_max/aps,1.)
626     C
627     C
628     C cas ou on a un extremum au pole
629     C
630     C IF(dyqv(ismin(iim,dyqv,1))*dyqv(ismax(iim,dyqv,1)).le.0.)
631     C & apn=0.
632     C IF(dyqv(ismax(iim,dyqv(ip1jm-iip1+1),1)+ip1jm-iip1+1)*
633     C & dyqv(ismin(iim,dyqv(ip1jm-iip1+1),1)+ip1jm-iip1+1).le.0.)
634     C & aps=0.
635     C
636     C limitation des pentes aux poles
637     C DO ij=1,iip1
638     C dyq(ij)=apn*dyq(ij)
639     C dyq(ip1jm+ij)=aps*dyq(ip1jm+ij)
640     C ENDDO
641     C
642     C test
643     C DO ij=1,iip1
644     C dyq(iip1+ij)=0.
645     C dyq(ip1jm+ij-iip1)=0.
646     C ENDDO
647     C DO ij=1,ip1jmp1
648     C dyq(ij)=dyq(ij)*cos(rlatu((ij-1)/iip1+1))
649     C ENDDO
650     C
651     C changement 10 07 96
652     C IF(dyqv(ismin(iim,dyqv,1))*dyqv(ismax(iim,dyqv,1)).le.0.)
653     C & THEN
654     C DO ij=1,iip1
655     C dyqmax(ij)=0.
656     C ENDDO
657     C ELSE
658     C DO ij=1,iip1
659     C dyqmax(ij)=pente_max*abs(dyqv(ij))
660     C ENDDO
661     C ENDIF
662     C
663     C IF(dyqv(ismax(iim,dyqv(ip1jm-iip1+1),1)+ip1jm-iip1+1)*
664     C & dyqv(ismin(iim,dyqv(ip1jm-iip1+1),1)+ip1jm-iip1+1).le.0.)
665     C &THEN
666     C DO ij=ip1jm+1,ip1jmp1
667     C dyqmax(ij)=0.
668     C ENDDO
669     C ELSE
670     C DO ij=ip1jm+1,ip1jmp1
671     C dyqmax(ij)=pente_max*abs(dyqv(ij-iip1))
672     C ENDDO
673     C ENDIF
674     C fin changement 10 07 96
675     CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
676    
677     c calcul des pentes limitees
678    
679     DO ij=iip2,ip1jm
680     IF(dyqv(ij)*dyqv(ij-iip1).gt.0.) THEN
681     dyq(ij,l)=sign(min(abs(dyq(ij,l)),dyqmax(ij)),dyq(ij,l))
682     ELSE
683     dyq(ij,l)=0.
684     ENDIF
685     ENDDO
686    
687     ENDDO
688    
689     DO l=1,llm
690     DO ij=1,ip1jm
691     IF( masse_adv_v(ij,l).GT.0. ) THEN
692     qbyv(ij,l)= MIN( qsat(ij+iip1,l), q(ij+iip1,l ) +
693     , dyq(ij+iip1,l)*0.5*(1.-masse_adv_v(ij,l)/masse(ij+iip1,l)))
694     ELSE
695     qbyv(ij,l)= MIN( qsat(ij,l), q(ij,l) - dyq(ij,l) *
696     , 0.5*(1.+masse_adv_v(ij,l)/masse(ij,l)) )
697     ENDIF
698     qbyv(ij,l) = masse_adv_v(ij,l)*qbyv(ij,l)
699     ENDDO
700     ENDDO
701    
702    
703     DO l=1,llm
704     DO ij=iip2,ip1jm
705     newmasse=masse(ij,l)
706     & +masse_adv_v(ij,l)-masse_adv_v(ij-iip1,l)
707     q(ij,l)=(q(ij,l)*masse(ij,l)+qbyv(ij,l)-qbyv(ij-iip1,l))
708     & /newmasse
709     masse(ij,l)=newmasse
710     ENDDO
711     c.-. ancienne version
712     convpn=SSUM(iim,qbyv(1,l),1)/apoln
713     convmpn=ssum(iim,masse_adv_v(1,l),1)/apoln
714     DO ij = 1,iip1
715     newmasse=masse(ij,l)+convmpn*aire(ij)
716     q(ij,l)=(q(ij,l)*masse(ij,l)+convpn*aire(ij))/
717     & newmasse
718     masse(ij,l)=newmasse
719     ENDDO
720     convps = -SSUM(iim,qbyv(ip1jm-iim,l),1)/apols
721     convmps = -SSUM(iim,masse_adv_v(ip1jm-iim,l),1)/apols
722     DO ij = ip1jm+1,ip1jmp1
723     newmasse=masse(ij,l)+convmps*aire(ij)
724     q(ij,l)=(q(ij,l)*masse(ij,l)+convps*aire(ij))/
725     & newmasse
726     masse(ij,l)=newmasse
727     ENDDO
728     c.-. fin ancienne version
729    
730     c._. nouvelle version
731     c convpn=SSUM(iim,qbyv(1,l),1)
732     c convmpn=ssum(iim,masse_adv_v(1,l),1)
733     c oldmasse=ssum(iim,masse(1,l),1)
734     c newmasse=oldmasse+convmpn
735     c newq=(q(1,l)*oldmasse+convpn)/newmasse
736     c newmasse=newmasse/apoln
737     c DO ij = 1,iip1
738     c q(ij,l)=newq
739     c masse(ij,l)=newmasse*aire(ij)
740     c ENDDO
741     c convps=-SSUM(iim,qbyv(ip1jm-iim,l),1)
742     c convmps=-ssum(iim,masse_adv_v(ip1jm-iim,l),1)
743     c oldmasse=ssum(iim,masse(ip1jm-iim,l),1)
744     c newmasse=oldmasse+convmps
745     c newq=(q(ip1jmp1,l)*oldmasse+convps)/newmasse
746     c newmasse=newmasse/apols
747     c DO ij = ip1jm+1,ip1jmp1
748     c q(ij,l)=newq
749     c masse(ij,l)=newmasse*aire(ij)
750     c ENDDO
751     c._. fin nouvelle version
752     ENDDO
753    
754     RETURN
755     END

  ViewVC Help
Powered by ViewVC 1.1.21