4 SUBROUTINE advn(q,masse,w,pbaru,pbarv,pdt,mode)
19 #include "dimensions.h"
40 integer ijlqmin,iqmin,jqmin,lqmin
51 real temps0,temps1,temps2,temps3
52 real ztemps1,ztemps2,ztemps3,ssum
55 save temps1,temps2,temps3
65 data temps1,temps2,temps3/0.,0.,0./
72 mu(ij,l)=pbaru(ij,l) * zzpbar
75 mv(ij,l)=pbarv(ij,l) * zzpbar
78 mw(ij,l)=w(ij,l) * zzw
90 qpn=qpn+q(ij,l)*masse(ij,l)
93 qpn=qpn/ssum(
iim,masse(1,l),1)
113 call advnx(zq,zqg,zqd,zm,mu,mode)
115 call advny(zq,zqs,zqn,zm,mv)
117 call advnz(zq,zqh,zqb,zm,mw)
120 call advny(zq,zqs,zqn,zm,mv)
122 call advnx(zq,zqg,zqd,zm,mu,mode)
128 temps1=temps1+ztemps1-ztemps2
129 print*,
'VLSPLT X:',temps1,
' Y:',temps2,
' Z:',temps3
144 SUBROUTINE advnqx(q,qg,qd)
151 #include "dimensions.h"
153 #include "iniprint.h"
185 dxqu(ij)=q(ij+1,l)-q(ij,l)
186 zqu(ij)=0.5*(q(ij+1,l)+q(ij,l))
188 do ij=iip1+iip1,
ip1jm,iip1
189 dxqu(ij)=dxqu(ij-
iim)
193 zqu(ij)=zqu(ij)-dxqu(ij+1)/12.
195 do ij=iip1+iip1,
ip1jm,iip1
199 zqu(ij)=zqu(ij)+dxqu(ij-1)/12.
201 do ij=iip1+iip1,
ip1jm,iip1
208 zqmax(ij)=max(q(ij+1,l),q(ij,l))
209 zqmin(ij)=min(q(ij+1,l),q(ij,l))
211 do ij=iip1+iip1,
ip1jm,iip1
212 zqmax(ij)=zqmax(ij-
iim)
213 zqmin(ij)=zqmin(ij-
iim)
216 extremum(ij)=dxqu(ij)*dxqu(ij-1).le.0.
218 do ij=iip1+iip1,
ip1jm,iip1
219 extremum(ij-
iim)=extremum(ij)
222 zqu(ij)=min(max(zqmin(ij),zqu(ij)),zqmax(ij))
225 if(extremum(ij))
then
233 do ij=iip1+iip1,
ip1jm,iip1
234 qd(ij-
iim,l)=qd(ij,l)
235 qg(ij-
iim,l)=qg(ij,l)
241 if(extremum(ij).and..not.extremum(ij-1))
245 do ij=iip1+iip1,
ip1jm,iip1
246 qd(ij-
iim,l)=qd(ij,l)
249 if (extremum(ij).and..not.extremum(ij+1))
253 do ij=iip1+iip1,
ip1jm,iip1
254 qg(ij,l)=qg(ij-
iim,l)
261 SUBROUTINE advnqy(q,qs,qn)
268 #include "dimensions.h"
270 #include "iniprint.h"
303 dyqv(ij)=q(ij,l)-q(ij+iip1,l)
307 zqv(ij,l)=0.5*(q(ij+iip1,l)+q(ij,l))
308 zqv(ij,l)=zqv(ij,l)+(dyqv(ij+iip1)-dyqv(ij-iip1))/12.
312 extremum(ij)=dyqv(ij)*dyqv(ij-iip1).le.0.
325 zqmax(ij)=max(q(ij+iip1,l),q(ij,l))
326 zqmin(ij)=min(q(ij+iip1,l),q(ij,l))
330 zqv(ij,l)=min(max(zqmin(ij),zqv(ij,l)),zqmax(ij))
334 if(extremum(ij))
then
341 qn(ij,l)=zqv(ij-iip1,l)
357 SUBROUTINE advnqz(q,qh,qb)
364 #include "dimensions.h"
366 #include "iniprint.h"
400 dzqw(ij,l)=q(ij,l-1)-q(ij,l)
401 zqw(ij,l)=0.5*(q(ij,l-1)+q(ij,l))
410 zqw(ij,l)=zqw(ij,l)+(dzqw(ij,l+1)-dzqw(ij,l-1))/12.
415 extremum(ij,l)=dzqw(ij,l)*dzqw(ij,l+1).le.0.
423 extremum(ij,1)=.
true.
430 zqmax(ij,l)=max(q(ij,l-1),q(ij,l))
431 zqmin(ij,l)=min(q(ij,l-1),q(ij,l))
437 zqw(ij,l)=min(max(zqmin(ij,l),zqw(ij,l)),zqmax(ij,l))
443 if(extremum(ij,l))
then
473 SUBROUTINE advnx(q,qg,qd,masse,u_m,mode)
486 #include "dimensions.h"
490 #include "comconst.h"
491 #include "iniprint.h"
504 INTEGER i,j,ij,l,indu(
ip1jmp1),niju,iju,ijq
507 real new_m,zu_m,zdq,zz
511 real zm,zq,zsigm,zsigp,zqm,zqp,zu
526 zdq=qd(ij,l)-qg(ij,l)
533 if(abs(zdq).gt.prec)
then
534 zsigd(ij,l)=(q(ij,l)-qg(ij,l))/zdq
535 zsigg(ij,l)=1.-zsigd(ij,l)
556 if (u_m(ij,l).ge.0.)
then
572 ladvplus(ij,l)=zu.gt.zm
574 if(zsig.eq.0.) zsigp=0.1
576 if (zsig.le.zsigp)
then
577 u_mq(ij,l)=u_m(ij,l)*zqp
578 else if (mode.eq.1)
then
580 s sign(zm,u_m(ij,l))*(zsigp*zqp+(zsig-zsigp)*zqm)
583 if (zsig.le.zsigp)
then
584 u_mq(ij,l)=u_m(ij,l)*(zqp-0.5*zsig/zsigp*(zqp-zq))
586 zz=0.5*(zsig-zsigp)/zsigm
587 u_mq(ij,l)=sign(zm,u_m(ij,l))*( 0.5*(zq+zqp)*zsigp
588 s +(zsig-zsigp)*(zq+zz*(zqm-zq)) )
599 do ij=iip1+iip1,
ip1jm,iip1
600 u_mq(ij,l)=u_mq(ij-
iim,l)
601 ladvplus(ij,l)=ladvplus(ij-
iim,l)
613 if(ladvplus(ij,l))
then
623 &
'Nombre de points pour lesquels on advect plus que le'
624 & ,
'contenu de la maille : ',n0
631 if(ladvplus(ij,l).and.mod(ij,iip1).ne.0)
then
649 do while(zu_m.gt.masse(ijq,l))
650 u_mq(ij,l)=u_mq(ij,l)+q(ijq,l)*masse(ijq,l)
651 zu_m=zu_m-masse(ijq,l)
657 zsig=zu_m/masse(ijq,l)
658 if(zsig.le.zsigd(ijq,l))
then
659 u_mq(ij,l)=u_mq(ij,l)+zu_m*(qd(ijq,l)
660 s -0.5*zsig/zsigd(ijq,l)*(qd(ijq,l)-q(ijq,l)))
664 zz=0.5*(zsig-zsigd(ijq,l))/zsigg(ijq,l)
665 if(.not.(zz.gt.0..and.zz.le.0.5))
then
666 WRITE(
lunout,*)
'probleme2 au point ij=',ij,
671 u_mq(ij,l)=u_mq(ij,l)+masse(ijq,l)*(
672 s 0.5*(q(ijq,l)+qd(ijq,l))*zsigd(ijq,l)
673 s +(zsig-zsigd(ijq,l))*(q(ijq,l)+zz*(qg(ijq,l)-q(ijq,l))) )
679 do while(-zu_m.gt.masse(ijq,l))
680 u_mq(ij,l)=u_mq(ij,l)-q(ijq,l)*masse(ijq,l)
681 zu_m=zu_m+masse(ijq,l)
687 zsig=-zu_m/masse(ij+1,l)
688 if(zsig.le.zsigg(ijq,l))
then
689 u_mq(ij,l)=u_mq(ij,l)+zu_m*(qg(ijq,l)
690 s -0.5*zsig/zsigg(ijq,l)*(qg(ijq,l)-q(ijq,l)))
694 zz=0.5*(zsig-zsigg(ijq,l))/zsigd(ijq,l)
695 if(.not.(zz.gt.0..and.zz.le.0.5))
then
696 WRITE(
lunout,*)
'probleme22 au point ij=',ij
701 u_mq(ij,l)=u_mq(ij,l)-masse(ijq,l)*(
702 s 0.5*(q(ijq,l)+qg(ijq,l))*zsigg(ijq,l)
703 s +(zsig-zsigg(ijq,l))*
704 s (q(ijq,l)+zz*(qd(ijq,l)-q(ijq,l))) )
715 do ij=iip1+iip1,
ip1jm,iip1
716 u_mq(ij,l)=u_mq(ij-
iim,l)
726 new_m=masse(ij,l)+u_m(ij-1,l)-u_m(ij,l)
727 q(ij,l)=(q(ij,l)*masse(ij,l)+
728 & u_mq(ij-1,l)-u_mq(ij,l))
733 do ij=iip1+iip1,
ip1jm,iip1
735 masse(ij-
iim,l)=masse(ij,l)
741 SUBROUTINE advny(q,qs,qn,masse,v_m)
754 #include "dimensions.h"
757 #include "iniprint.h"
774 real convpn,convps,convmpn,convmps,massen,masses
775 real zm,zq,zsigm,zsigp,zqm,zqp
787 zdq=qn(ij,l)-qs(ij,l)
794 if(abs(zdq).gt.prec)
then
795 zsign(ij)=(q(ij,l)-qs(ij,l))/zdq
796 zsigs(ij)=1.-zsign(ij)
812 if (v_m(ij,l).ge.0.)
then
827 zsig=abs(v_m(ij,l))/zm
828 if(zsig.eq.0.) zsigp=0.1
829 if (zsig.le.zsigp)
then
830 v_mq(ij,l)=v_m(ij,l)*(zqp-0.5*zsig/zsigp*(zqp-zq))
832 zz=0.5*(zsig-zsigp)/zsigm
833 v_mq(ij,l)=sign(zm,v_m(ij,l))*( 0.5*(zq+zqp)*zsigp
834 s +(zsig-zsigp)*(zq+zz*(zqm-zq)) )
842 & +v_m(ij,l)-v_m(ij-iip1,l)
843 q(ij,l)=(q(ij,l)*masse(ij,l)+v_mq(ij,l)-v_mq(ij-iip1,l))
848 convpn=ssum(
iim,v_mq(1,l),1)
849 convmpn=ssum(
iim,v_m(1,l),1)
850 massen=ssum(
iim,masse(1,l),1)
852 q(1,l)=(q(1,l)*massen+convpn)/new_m
862 q(
ip1jm+1,l)=(q(
ip1jm+1,l)*masses+convps)/new_m
871 SUBROUTINE advnz(q,qh,qb,masse,w_m)
885 #include "dimensions.h"
888 #include "iniprint.h"
906 real zm,zq,zsigm,zsigp,zqm,zqp
918 zdq=qb(ij,l)-qh(ij,l)
926 if(abs(zdq).gt.prec)
then
927 zsigb(ij,l)=(q(ij,l)-qh(ij,l))/zdq
928 zsigh(ij,l)=1.-zsigb(ij,l)
929 zsigb(ij,l)=min(max(zsigb(ij,l),0.),1.)
941 if (w_m(ij,l).ge.0.)
then
956 zsig=abs(w_m(ij,l))/zm
957 if(zsig.eq.0.) zsigp=0.1
958 if (zsig.le.zsigp)
then
959 w_mq(ij,l)=w_m(ij,l)*(zqp-0.5*zsig/zsigp*(zqp-zq))
961 zz=0.5*(zsig-zsigp)/zsigm
962 w_mq(ij,l)=sign(zm,w_m(ij,l))*( 0.5*(zq+zqp)*zsigp
963 s +(zsig-zsigp)*(zq+zz*(zqm-zq)) )
975 new_m=masse(ij,l)+w_m(ij,l+1)-w_m(ij,l)
976 q(ij,l)=(q(ij,l)*masse(ij,l)+w_mq(ij,l+1)-w_mq(ij,l))
subroutine advny(q, qs, qn, masse, v_m)
subroutine advnqz(q, qh, qb)
!$Header llmm1 INTEGER ip1jmp1
!$Header!CDK comgeom COMMON comgeom apols
!$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
subroutine advn(q, masse, w, pbaru, pbarv, pdt, mode)
!$Header!CDK comgeom COMMON comgeom aire
!$Header llmm1 INTEGER ip1jm
!$Header!CDK comgeom COMMON comgeom apoln
!$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
!$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
subroutine advnx(q, qg, qd, masse, u_m, mode)
subroutine advnqy(q, qs, qn)
c c zjulian c cym CALL iim cym klev iim
subroutine advnz(q, qh, qb, masse, w_m)
subroutine advnqx(q, qg, qd)
!$Header!gestion des impressions de sorties et de débogage la sortie standard prt_level COMMON comprint lunout