5 SUBROUTINE vlsplt(q,pente_max,masse,w,pbaru,pbarv,pdt)
22 #include "dimensions.h"
31 REAL masse(
ip1jmp1,llm),pente_max
42 INTEGER ijlqmin,iqmin,jqmin,lqmin
50 REAL second,temps0,temps1,temps2,temps3
51 REAL ztemps1,ztemps2,ztemps3
55 SAVE temps1,temps2,temps3
59 DATA qmin,qmax/0.,1.e33/
61 DATA temps1,temps2,temps3/0.,0.,0./
71 mv(
ij,
l)=pbarv(
ij,
l) * zzpbar
82 CALL
scopy(ijp1llm,
q,1,zq,1)
83 CALL
scopy(ijp1llm,masse,1,zm,1)
87 call
vlx(zq,pente_max,zm,
mu)
92 call
vly(zq,pente_max,zm,mv)
95 call
vlz(zq,pente_max,zm,mw)
99 call
vly(zq,pente_max,zm,mv)
103 call
vlx(zq,pente_max,zm,
mu)
118 SUBROUTINE vlx(q,pente_max,masse,u_m)
131 include
"dimensions.h"
141 REAL masse(
ip1jmp1,llm),pente_max
142 REAL u_m(
ip1jmp1,llm ),pbarv( iip1,jjm,llm)
152 REAL new_m,zu_m,zdum(
ip1jmp1,llm)
158 Logical extremum,first,testcpu
162 REAL temps0,temps1,temps2,temps3,temps4,temps5,second
163 SAVE temps0,temps1,temps2,temps3,temps4,temps5
167 DATA first,testcpu/.true.,.
false./
181 IF (pente_max.gt.-1.e-5)
THEN
200 adxqu(
ij)=abs(dxqu(
ij))
206 dxqmax(
ij,
l)=pente_max*
207 , min(adxqu(
ij-1),adxqu(
ij))
221 , cvmgp(dxqu(
ij-1)+dxqu(
ij),0.,dxqu(
ij-1)*dxqu(
ij))
223 IF(dxqu(
ij-1)*dxqu(
ij).gt.0)
THEN
232 , sign(min(abs(dxq(
ij,
l)),dxqmax(
ij,
l)),dxq(
ij,
l))
252 zz(
ij)=dxqu(
ij-1)*dxqu(
ij)
287 zdum(
ij,
l)=cvmgp(1.-u_m(
ij,
l)/masse(
ij,
l),
288 , 1.+u_m(
ij,
l)/masse(
ij+1,
l),
306 IF (u_m(
ij,
l).gt.0.)
THEN
323 IF(zdum(
ij,
l).lt.0)
THEN
355 $
'Nombre de points pour lesquels on advect plus que le'
356 & ,
'contenu de la maille : ',n0
363 IF(iadvplus(
ij,
l).eq.1.and.mod(
ij,iip1).ne.0)
THEN
381 do while(zu_m.gt.masse(ijq,
l))
382 u_mq(
ij,
l)=u_mq(
ij,
l)+
q(ijq,
l)*masse(ijq,
l)
383 zu_m=zu_m-masse(ijq,
l)
388 u_mq(
ij,
l)=u_mq(
ij,
l)+zu_m*
389 & (
q(ijq,
l)+0.5*(1.-zu_m/masse(ijq,
l))*dxq(ijq,
l))
394 do while(-zu_m.gt.masse(ijq,
l))
395 u_mq(
ij,
l)=u_mq(
ij,
l)-
q(ijq,
l)*masse(ijq,
l)
396 zu_m=zu_m+masse(ijq,
l)
401 u_mq(
ij,
l)=u_mq(
ij,
l)+zu_m*(
q(ijq,
l)-
402 & 0.5*(1.+zu_m/masse(ijq,
l))*dxq(ijq,
l))
426 & u_mq(
ij-1,
l)-u_mq(
ij,
l))
442 SUBROUTINE vly(q,pente_max,masse,masse_adv_v)
456 #include "dimensions.h"
460 #include "comconst.h"
466 REAL masse(
ip1jmp1,llm),pente_max
467 REAL masse_adv_v(
ip1jm,llm)
475 REAL airej2,airejjm,airescb(
iim),airesch(
iim)
480 REAL qpns,qpsn,appn,apps,dyn1,dys1,dyn2,dys2,newmasse,fn,fs
482 Logical extremum,first,testcpu
483 REAL temps0,temps1,temps2,temps3,temps4,temps5,second
484 SAVE temps0,temps1,temps2,temps3,temps4,temps5
487 REAL convpn,convps,convmpn,convmps
488 real massepn,masseps,qpn,qps
489 REAL sinlon(iip1),sinlondlon(iip1)
490 REAL coslon(iip1),coslondlon(iip1)
491 SAVE sinlon,coslon,sinlondlon,coslondlon
497 DATA first,testcpu/.true.,.
false./
498 DATA temps0,temps1,temps2,temps3,temps4,temps5/0.,0.,0.,0.,0.,0./
501 print*,
'Shema Amont nouveau appele dans Vanleer '
509 coslon(1)=coslon(iip1)
510 coslondlon(1)=coslondlon(iip1)
511 sinlon(1)=sinlon(iip1)
512 sinlondlon(1)=sinlondlon(iip1)
531 airescb(
i) =
aire(
i+ iip1) *
q(
i+ iip1,
l)
534 qpns =
ssum(
iim, airescb ,1 ) / airej2
535 qpsn =
ssum(
iim, airesch ,1 ) / airejjm
541 adyqv(
ij)=abs(dyqv(
ij))
547 dyq(
ij,
l)=.5*(dyqv(
ij-iip1)+dyqv(
ij))
548 dyqmax(
ij)=min(adyqv(
ij-iip1),adyqv(
ij))
549 dyqmax(
ij)=pente_max*dyqmax(
ij)
565 dyn1=dyn1+sinlondlon(
ij)*dyq(
ij,
l)
567 dyn2=dyn2+coslondlon(
ij)*dyq(
ij,
l)
571 dyq(
ij,
l)=dyn1*sinlon(
ij)+dyn2*coslon(
ij)
581 IF(pente_max*adyqv(
ij).lt.abs(dyq(
ij,
l)))
THEN
582 fn=min(pente_max*adyqv(
ij)/abs(dyq(
ij,
l)),fn)
668 IF(dyqv(
ij)*dyqv(
ij-iip1).gt.0.)
THEN
669 dyq(
ij,
l)=sign(min(abs(dyq(
ij,
l)),dyqmax(
ij)),dyq(
ij,
l))
679 IF(masse_adv_v(
ij,
l).gt.0)
THEN
681 , 0.5*(1.-masse_adv_v(
ij,
l)/masse(
ij+iip1,
l))
684 , 0.5*(1.+masse_adv_v(
ij,
l)/masse(
ij,
l))
694 & +masse_adv_v(
ij,
l)-masse_adv_v(
ij-iip1,
l)
704 convmpn=
ssum(
iim,masse_adv_v(1,
l),1)
710 qpn=(qpn+convpn)/(massepn+convmpn)
725 qps=(qps+convps)/(masseps+convmps)
758 SUBROUTINE vlz(q,pente_max,masse,w)
772 #include "dimensions.h"
776 #include "comconst.h"
781 REAL masse(
ip1jmp1,llm),pente_max
798 REAL temps0,temps1,temps2,temps3,temps4,temps5,second
799 SAVE temps0,temps1,temps2,temps3,temps4,temps5
802 DATA testcpu/.
false./
803 DATA temps0,temps1,temps2,temps3,temps4,temps5/0.,0.,0.,0.,0.,0./
816 adzqw(
ij,
l)=abs(dzqw(
ij,
l))
824 , cvmgp(dzqw(
ij,
l)+dzqw(
ij,
l+1),0.,dzqw(
ij,
l)*dzqw(
ij,
l+1))
826 IF(dzqw(
ij,
l)*dzqw(
ij,
l+1).gt.0.)
THEN
832 dzqmax=pente_max*min(adzqw(
ij,
l),adzqw(
ij,
l+1))
833 dzq(
ij,
l)=sign(min(abs(dzq(
ij,
l)),dzqmax),dzq(
ij,
l))
844 temps1=temps1+second(0.)-temps0
855 IF(w(
ij,
l+1).gt.0.)
THEN
856 sigw=w(
ij,
l+1)/masse(
ij,
l+1)
859 sigw=w(
ij,
l+1)/masse(
ij,
l)
914 #include "dimensions.h"
920 real zzq(iip1,
jjp1,llm)
922 integer imin,jmin,lmin,ijlmin
923 integer imax,jmax,lmax,ijlmax
930 ijlmin=
ismin(ijp1llm,zq,1)
932 ijlmin=ijlmin-(lmin-1.)*
ip1jmp1
933 jmin=(ijlmin-1)/iip1+1
934 imin=ijlmin-(jmin-1.)*iip1
935 zqmin=zq(ijlmin,lmin)
937 ijlmax=
ismax(ijp1llm,zq,1)
939 ijlmax=ijlmax-(lmax-1.)*
ip1jmp1
940 jmax=(ijlmax-1)/iip1+1
941 imax=ijlmax-(jmax-1.)*iip1
942 zqmax=zq(ijlmax,lmax)
946 s
write(*,*) comment,
947 s imin,jmin,lmin,zqmin,zzq(imin,jmin,lmin)
950 s
write(*,*) comment,
951 s imax,jmax,lmax,zqmax,zzq(imax,jmax,lmax)
955 9999
format(a20,
' q(',i3,
',',i2,
',',i2,
')=',e12.5,e12.5)