5 SUBROUTINE vlsplt(q,pente_max,masse,w,pbaru,pbarv,pdt,iq)
23 #include "dimensions.h"
44 INTEGER ijlqmin,iqmin,jqmin,lqmin
52 REAL second,temps0,temps1,temps2,temps3
53 REAL ztemps1,ztemps2,ztemps3
57 SAVE temps1,temps2,temps3
62 DATA qmin,qmax/0.,1.e33/
64 DATA temps1,temps2,temps3/0.,0.,0./
71 mu(ij,l)=pbaru(ij,l) * zzpbar
74 mv(ij,l)=pbarv(ij,l) * zzpbar
77 mw(ij,l)=w(ij,l) * zzw
85 CALL scopy(ijp1llm,q(1,1,iq),1,zq(1,1,iq),1)
86 CALL scopy(ijp1llm,masse,1,zm(1,1,iq),1)
91 CALL scopy(ijp1llm,q(1,1,iq2),1,zq(1,1,iq2),1)
97 call vlx(zq,pente_max,zm,mu,iq)
103 call vly(zq,pente_max,zm,mv,iq)
106 call vlz(zq,pente_max,zm,mw,iq)
110 call vly(zq,pente_max,zm,mv,iq)
114 call vlx(zq,pente_max,zm,mu,iq)
120 q(ij,l,iq)=zq(ij,l,iq)
123 q(ij+
iim,l,iq)=q(ij,l,iq)
132 q(ij,l,iq2)=zq(ij,l,iq2)
135 q(ij+
iim,l,iq2)=q(ij,l,iq2)
143 RECURSIVE SUBROUTINE vlx(q,pente_max,masse,u_m,iq)
157 include
"dimensions.h"
176 INTEGER ij,l,j,i,iju,ijq,indu(
ip1jmp1),niju
189 Logical extremum,first,testcpu
193 REAL temps0,temps1,temps2,temps3,temps4,temps5,second
194 SAVE temps0,temps1,temps2,temps3,temps4,temps5
212 IF (pente_max.gt.-1.e-5)
THEN
221 dxqu(ij)=q(ij+1,l,iq)-q(ij,l,iq)
225 DO ij=iip1+iip1,
ip1jm,iip1
226 dxqu(ij)=dxqu(ij-
iim)
231 adxqu(ij)=abs(dxqu(ij))
237 dxqmax(ij,l)=pente_max*
238 , min(adxqu(ij-1),adxqu(ij))
245 DO ij=iip1+iip1,
ip1jm,iip1
246 dxqmax(ij-
iim,l)=dxqmax(ij,l)
252 , cvmgp(dxqu(ij-1)+dxqu(ij),0.,dxqu(ij-1)*dxqu(ij))
254 IF(dxqu(ij-1)*dxqu(ij).gt.0)
THEN
255 dxq(ij,l)=dxqu(ij-1)+dxqu(ij)
261 dxq(ij,l)=0.5*dxq(ij,l)
263 , sign(min(abs(dxq(ij,l)),dxqmax(ij,l)),dxq(ij,l))
276 dxqu(ij)=q(ij+1,l,iq)-q(ij,l,iq)
278 DO ij=iip1+iip1,
ip1jm,iip1
279 dxqu(ij)=dxqu(ij-
iim)
283 zz(ij)=dxqu(ij-1)*dxqu(ij)
286 dxq(ij,l)=zz(ij)/(dxqu(ij-1)+dxqu(ij))
301 DO ij=iip1+iip1,
ip1jm,iip1
302 dxq(ij-
iim,l)=dxq(ij,l)
318 zdum(ij,l)=cvmgp(1.-u_m(ij,l)/masse(ij,l,iq),
319 , 1.+u_m(ij,l)/masse(ij+1,l,iq),
321 zdum(ij,l)=0.5*zdum(ij,l)
323 , q(ij,l,iq)+zdum(ij,l)*dxq(ij,l),
324 , q(ij+1,l,iq)-zdum(ij,l)*dxq(ij+1,l),
326 u_mq(ij,l)=u_m(ij,l)*u_mq(ij,l)
337 IF (u_m(ij,l).gt.0.)
THEN
338 zdum(ij,l)=1.-u_m(ij,l)/masse(ij,l,iq)
339 u_mq(ij,l)=u_m(ij,l)*(q(ij,l,iq)+0.5*zdum(ij,l)*dxq(ij,l))
341 zdum(ij,l)=1.+u_m(ij,l)/masse(ij+1,l,iq)
342 u_mq(ij,l)=u_m(ij,l)*(q(ij+1,l,iq)
343 & -0.5*zdum(ij,l)*dxq(ij+1,l))
355 IF(zdum(ij,l).lt.0)
THEN
363 DO ij=iip1+iip1,
ip1jm,iip1
364 iadvplus(ij,l)=iadvplus(ij-
iim,l)
380 nl(l)=nl(l)+iadvplus(ij,l)
387 $
'Nombre de points pour lesquels on advect plus que le'
388 & ,
'contenu de la maille : ',n0
395 IF(iadvplus(ij,l).eq.1.and.mod(ij,iip1).ne.0)
THEN
413 do while(zu_m.gt.masse(ijq,l,iq))
414 u_mq(ij,l)=u_mq(ij,l)+q(ijq,l,iq)
416 zu_m=zu_m-masse(ijq,l,iq)
421 u_mq(ij,l)=u_mq(ij,l)+zu_m*
422 & (q(ijq,l,iq)+0.5*(1.-zu_m/masse(ijq,l,iq))
428 do while(-zu_m.gt.masse(ijq,l,iq))
429 u_mq(ij,l)=u_mq(ij,l)-q(ijq,l,iq)
431 zu_m=zu_m+masse(ijq,l,iq)
436 u_mq(ij,l)=u_mq(ij,l)+zu_m*(q(ijq,l,iq)-
437 & 0.5*(1.+zu_m/masse(ijq,l,iq))*dxq(ijq,l))
449 DO ij=iip1+iip1,
ip1jm,iip1
450 u_mq(ij,l)=u_mq(ij-
iim,l)
464 masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq)
465 ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq)
471 call vlx(ratio,pente_max,masseq,u_mq,iq2)
481 new_m=masse(ij,l,iq)+u_m(ij-1,l)-u_m(ij,l)
482 q(ij,l,iq)=(q(ij,l,iq)*masse(ij,l,iq)+
483 & u_mq(ij-1,l)-u_mq(ij,l))
488 DO ij=iip1+iip1,
ip1jm,iip1
489 q(ij-
iim,l,iq)=q(ij,l,iq)
490 masse(ij-
iim,l,iq)=masse(ij,l,iq)
502 q(ij,l,iq2)=q(ij,l,iq)*ratio(ij,l,iq2)
504 DO ij=iip1+iip1,
ip1jm,iip1
505 q(ij-
iim,l,iq2)=q(ij,l,iq2)
517 RECURSIVE SUBROUTINE vly(q,pente_max,masse,masse_adv_v,iq)
532 #include "dimensions.h"
536 #include "comconst.h"
552 REAL airej2,airejjm,airescb(
iim),airesch(
iim)
557 REAL qpns,qpsn,appn,apps,dyn1,dys1,dyn2,dys2,newmasse,fn,fs
559 Logical extremum,first,testcpu
560 REAL temps0,temps1,temps2,temps3,temps4,temps5,second
561 SAVE temps0,temps1,temps2,temps3,temps4,temps5
564 REAL convpn,convps,convmpn,convmps
565 real massepn,masseps,qpn,qps
566 REAL sinlon(iip1),sinlondlon(iip1)
567 REAL coslon(iip1),coslondlon(iip1)
568 SAVE sinlon,coslon,sinlondlon,coslondlon
579 DATA temps0,temps1,temps2,temps3,temps4,temps5/0.,0.,0.,0.,0.,0./
584 print*,
'Shema Amont nouveau appele dans Vanleer '
587 coslon(i)=cos(
rlonv(i))
588 sinlon(i)=sin(
rlonv(i))
592 coslon(1)=coslon(iip1)
593 coslondlon(1)=coslondlon(iip1)
594 sinlon(1)=sinlon(iip1)
595 sinlondlon(1)=sinlondlon(iip1)
614 airescb(i) =
aire(i+ iip1) * q(i+ iip1,l,iq)
617 qpns = ssum(
iim, airescb ,1 ) / airej2
618 qpsn = ssum(
iim, airesch ,1 ) / airejjm
623 dyqv(ij)=q(ij,l,iq)-q(ij+iip1,l,iq)
624 adyqv(ij)=abs(dyqv(ij))
630 dyq(ij,l)=.5*(dyqv(ij-iip1)+dyqv(ij))
631 dyqmax(ij)=min(adyqv(ij-iip1),adyqv(ij))
632 dyqmax(ij)=pente_max*dyqmax(ij)
638 dyq(ij,l)=qpns-q(ij+iip1,l,iq)
648 dyn1=dyn1+sinlondlon(ij)*dyq(ij,l)
649 dys1=dys1+sinlondlon(ij)*dyq(
ip1jm+ij,l)
650 dyn2=dyn2+coslondlon(ij)*dyq(ij,l)
651 dys2=dys2+coslondlon(ij)*dyq(
ip1jm+ij,l)
654 dyq(ij,l)=dyn1*sinlon(ij)+dyn2*coslon(ij)
655 dyq(
ip1jm+ij,l)=dys1*sinlon(ij)+dys2*coslon(ij)
664 IF(pente_max*adyqv(ij).lt.abs(dyq(ij,l)))
THEN
665 fn=min(pente_max*adyqv(ij)/abs(dyq(ij,l)),fn)
667 IF(pente_max*adyqv(ij+
ip1jm-iip1).lt.abs(dyq(ij+
ip1jm,l)))
THEN
668 fs=min(pente_max*adyqv(ij+
ip1jm-iip1)/abs(dyq(ij+
ip1jm,l)),fs)
672 dyq(ij,l)=fn*dyq(ij,l)
751 IF(dyqv(ij)*dyqv(ij-iip1).gt.0.)
THEN
752 dyq(ij,l)=sign(min(abs(dyq(ij,l)),dyqmax(ij)),dyq(ij,l))
763 IF(masse_adv_v(ij,l).gt.0)
THEN
764 qbyv(ij,l)=q(ij+iip1,l,iq)+dyq(ij+iip1,l)*
765 , 0.5*(1.-masse_adv_v(ij,l)
766 , /masse(ij+iip1,l,iq))
768 qbyv(ij,l)=q(ij,l,iq)-dyq(ij,l)*
769 , 0.5*(1.+masse_adv_v(ij,l)
772 qbyv(ij,l)=masse_adv_v(ij,l)*qbyv(ij,l)
787 masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq)
788 ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq)
795 call vly(ratio,pente_max,masseq,qbyv,iq2)
801 newmasse=masse(ij,l,iq)
802 & +masse_adv_v(ij,l)-masse_adv_v(ij-iip1,l)
803 q(ij,l,iq)=(q(ij,l,iq)*masse(ij,l,iq)+qbyv(ij,l)
804 & -qbyv(ij-iip1,l))/newmasse
805 masse(ij,l,iq)=newmasse
811 convpn=ssum(
iim,qbyv(1,l),1)
812 convmpn=ssum(
iim,masse_adv_v(1,l),1)
813 massepn=ssum(
iim,masse(1,l,iq),1)
816 qpn=qpn+masse(ij,l,iq)*q(ij,l,iq)
818 qpn=(qpn+convpn)/(massepn+convmpn)
828 masseps=ssum(
iim, masse(
ip1jm+1,l,iq),1)
831 qps=qps+masse(ij,l,iq)*q(ij,l,iq)
833 qps=(qps+convps)/(masseps+convmps)
870 q(ij,l,iq2)=q(ij,l,iq)*ratio(ij,l,iq2)
880 RECURSIVE SUBROUTINE vlz(q,pente_max,masse,w,iq)
895 #include "dimensions.h"
899 #include "comconst.h"
925 REAL temps0,temps1,temps2,temps3,temps4,temps5,second
926 SAVE temps0,temps1,temps2,temps3,temps4,temps5
929 DATA testcpu/.
false./
930 DATA temps0,temps1,temps2,temps3,temps4,temps5/0.,0.,0.,0.,0.,0./
944 dzqw(ij,l)=q(ij,l-1,iq)-q(ij,l,iq)
945 adzqw(ij,l)=abs(dzqw(ij,l))
953 , cvmgp(dzqw(ij,l)+dzqw(ij,l+1),0.,dzqw(ij,l)*dzqw(ij,l+1))
955 IF(dzqw(ij,l)*dzqw(ij,l+1).gt.0.)
THEN
956 dzq(ij,l)=0.5*(dzqw(ij,l)+dzqw(ij,l+1))
961 dzqmax=pente_max*min(adzqw(ij,l),adzqw(ij,l+1))
962 dzq(ij,l)=sign(min(abs(dzq(ij,l)),dzqmax),dzq(ij,l))
974 temps1=temps1+second(0.)-temps0
986 IF(w(ij,l+1).gt.0.)
THEN
987 sigw=w(ij,l+1)/masse(ij,l+1,iq)
988 wq(ij,l+1)=w(ij,l+1)*(q(ij,l+1,iq)
989 & +0.5*(1.-sigw)*dzq(ij,l+1))
991 sigw=w(ij,l+1)/masse(ij,l,iq)
992 wq(ij,l+1)=w(ij,l+1)*(q(ij,l,iq)-0.5*(1.+sigw)*dzq(ij,l))
1005 if (
nqfils(iq).gt.0)
then
1010 masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq)
1011 ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq)
1018 call vlz(ratio,pente_max,masseq,wq,iq2)
1025 newmasse=masse(ij,l,iq)+w(ij,l+1)-w(ij,l)
1026 q(ij,l,iq)=(q(ij,l,iq)*masse(ij,l,iq)+wq(ij,l+1)-wq(ij,l))
1028 masse(ij,l,iq)=newmasse
1033 if (
nqfils(iq).gt.0)
then
1038 q(ij,l,iq2)=q(ij,l,iq)*ratio(ij,l,iq2)
1077 subroutine minmaxq(zq,qmin,qmax,comment)
1079 #include "dimensions.h"
1080 #include "paramet.h"
1082 character*20 comment
1087 integer imin,jmin,lmin,ijlmin
1088 integer imax,jmax,lmax,ijlmax
1095 ijlmin=ismin(ijp1llm,zq,1)
1097 ijlmin=ijlmin-(lmin-1.)*
ip1jmp1
1098 jmin=(ijlmin-1)/iip1+1
1099 imin=ijlmin-(jmin-1.)*iip1
1100 zqmin=zq(ijlmin,lmin)
1102 ijlmax=ismax(ijp1llm,zq,1)
1104 ijlmax=ijlmax-(lmax-1.)*
ip1jmp1
1105 jmax=(ijlmax-1)/iip1+1
1106 imax=ijlmax-(jmax-1.)*iip1
1107 zqmax=zq(ijlmax,lmax)
1111 s
write(*,*) comment,
1112 s imin,jmin,lmin,zqmin,zzq(imin,jmin,lmin)
1115 s
write(*,*) comment,
1116 s imax,jmax,lmax,zqmax,zzq(imax,jmax,lmax)
1120 9999
format(a20,
' q(',i3,
',',i2,
',',i2,
')=',e12.5,e12.5)
!$Header llmm1 INTEGER ip1jmp1
integer, dimension(:), allocatable, save nqdesc
recursive subroutine vly(q, pente_max, masse, masse_adv_v, iq)
recursive subroutine vlx(q, pente_max, masse, u_m, iq)
!$Id Turb_fcg_gcssold get_uvd hqturb_gcssold endif!large scale llm day day1 day day1 *dt_toga endif!time annee_ref dt_toga u_toga vq_toga w_prof vq_prof llm day day1 day day1 *dt_dice endif!time annee_ref dt_dice swup_dice vg_dice omega_dice tg_prof vg_profd w_profd omega_profd!do llm!print llm l llm
!$Id mode_top_bound COMMON comconstr && pi
!$Header!CDK comgeom COMMON comgeom aire
subroutine scopy(n, sx, incx, sy, incy)
integer, dimension(:,:), allocatable, save iqfils
!$Header llmm1 INTEGER ip1jm
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL false
!FH On elimine toutes les clefs physiques dans la dynamique prt_level
!$Header!CDK comgeom COMMON comgeom rlonu
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL ulevSTD CALL &zphi philevSTD CALL &zx_rh rhlevSTD!DO klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon du jour ou toutes les read_climoz CALL true
integer, dimension(:), allocatable, save nqfils
c c zjulian c cym CALL iim cym klev iim
recursive subroutine vlz(q, pente_max, masse, w, iq)
subroutine vlsplt(q, pente_max, masse, w, pbaru, pbarv, pdt, iq)
subroutine minmaxq(zq, qmin, qmax, comment)
!$Header!CDK comgeom COMMON comgeom rlonv