4 SUBROUTINE vlspltqs ( q,pente_max,masse,w,pbaru,pbarv,pdt,
27 #include "dimensions.h"
55 REAL temps1,temps2,temps3
59 SAVE temps1,temps2,temps3
62 DATA qmin,qmax/0.,1.e33/
64 DATA temps1,temps2,temps3/0.,0.,0./
68 REAL rtt,retv,r2es,r3les,r3ies,r4les,r4ies,play
69 REAL ptarg,pdelarg,foeew,zdelta
74 foeew( ptarg,pdelarg ) = exp(
75 * (r3les*(1.-pdelarg)+r3ies*pdelarg) * (ptarg-rtt)
76 * / (ptarg-(r4les*(1.-pdelarg)+r4ies*pdelarg)) )
91 tempe(ij) = teta(ij,l) * pk(ij,l) /
cpp
94 zdelta = max( 0., sign(1., rtt - tempe(ij)) )
95 play = 0.5*(p(ij,l)+p(ij,l+1))
96 qsat(ij,l) = min(0.5, r2es* foeew(tempe(ij),zdelta) / play )
97 qsat(ij,l) = qsat(ij,l) / ( 1. - retv * qsat(ij,l) )
107 mu(ij,l)=pbaru(ij,l) * zzpbar
110 mv(ij,l)=pbarv(ij,l) * zzpbar
113 mw(ij,l)=w(ij,l) * zzw
121 CALL scopy(ijp1llm,q(1,1,iq),1,zq(1,1,iq),1)
122 CALL scopy(ijp1llm,masse,1,zm(1,1,iq),1)
126 CALL scopy(ijp1llm,q(1,1,iq2),1,zq(1,1,iq2),1)
131 call vlxqs(zq,pente_max,zm,mu,qsat,iq)
135 call vlyqs(zq,pente_max,zm,mv,qsat,iq)
139 call vlz(zq,pente_max,zm,mw,iq)
144 call vlyqs(zq,pente_max,zm,mv,qsat,iq)
149 call vlxqs(zq,pente_max,zm,mu,qsat,iq)
157 q(ij,l,iq)=zq(ij,l,iq)
160 q(ij+
iim,l,iq)=q(ij,l,iq)
169 q(ij,l,iq2)=zq(ij,l,iq2)
172 q(ij+
iim,l,iq2)=q(ij,l,iq2)
181 SUBROUTINE vlxqs(q,pente_max,masse,u_m,qsat,iq)
194 #include "dimensions.h"
198 #include "comconst.h"
212 INTEGER ij,l,j,i,iju,ijq,indu(
ip1jmp1),niju
225 Logical first,testcpu
229 REAL temps0,temps1,temps2,temps3,temps4,temps5
230 SAVE temps0,temps1,temps2,temps3,temps4,temps5
247 IF (pente_max.gt.-1.e-5)
THEN
256 dxqu(ij)=q(ij+1,l,iq)-q(ij,l,iq)
260 DO ij=iip1+iip1,
ip1jm,iip1
261 dxqu(ij)=dxqu(ij-
iim)
266 adxqu(ij)=abs(dxqu(ij))
272 dxqmax(ij,l)=pente_max*
273 , min(adxqu(ij-1),adxqu(ij))
280 DO ij=iip1+iip1,
ip1jm,iip1
281 dxqmax(ij-
iim,l)=dxqmax(ij,l)
287 , cvmgp(dxqu(ij-1)+dxqu(ij),0.,dxqu(ij-1)*dxqu(ij))
289 IF(dxqu(ij-1)*dxqu(ij).gt.0)
THEN
290 dxq(ij,l)=dxqu(ij-1)+dxqu(ij)
296 dxq(ij,l)=0.5*dxq(ij,l)
298 , sign(min(abs(dxq(ij,l)),dxqmax(ij,l)),dxq(ij,l))
310 dxqu(ij)=q(ij+1,l,iq)-q(ij,l,iq)
312 DO ij=iip1+iip1,
ip1jm,iip1
313 dxqu(ij)=dxqu(ij-
iim)
317 zz(ij)=dxqu(ij-1)*dxqu(ij)
320 dxq(ij,l)=zz(ij)/(dxqu(ij-1)+dxqu(ij))
335 DO ij=iip1+iip1,
ip1jm,iip1
336 dxq(ij-
iim,l)=dxq(ij,l)
352 zdum(ij,l)=cvmgp(1.-u_m(ij,l)/masse(ij,l,iq),
353 , 1.+u_m(ij,l)/masse(ij+1,l,iq),
355 zdum(ij,l)=0.5*zdum(ij,l)
357 , q(ij,l,iq)+zdum(ij,l)*dxq(ij,l),
358 , q(ij+1,l,iq)-zdum(ij,l)*dxq(ij+1,l),
360 u_mq(ij,l)=u_m(ij,l)*u_mq(ij,l)
369 IF (u_m(ij,l).gt.0.)
THEN
370 zdum(ij,l)=1.-u_m(ij,l)/masse(ij,l,iq)
371 u_mq(ij,l)=u_m(ij,l)*
372 $ min(q(ij,l,iq)+0.5*zdum(ij,l)*dxq(ij,l),qsat(ij+1,l))
374 zdum(ij,l)=1.+u_m(ij,l)/masse(ij+1,l,iq)
375 u_mq(ij,l)=u_m(ij,l)*
376 $ min(q(ij+1,l,iq)-0.5*zdum(ij,l)*dxq(ij+1,l),qsat(ij,l))
387 IF(zdum(ij,l).lt.0)
THEN
394 DO ij=iip1+iip1,
ip1jm,iip1
395 iadvplus(ij,l)=iadvplus(ij-
iim,l)
413 nl(l)=nl(l)+iadvplus(ij,l)
427 IF(iadvplus(ij,l).eq.1.and.mod(ij,iip1).ne.0)
THEN
445 do while(zu_m.gt.masse(ijq,l,iq))
446 u_mq(ij,l)=u_mq(ij,l)+q(ijq,l,iq)
448 zu_m=zu_m-masse(ijq,l,iq)
453 u_mq(ij,l)=u_mq(ij,l)+zu_m*
454 & (q(ijq,l,iq)+0.5*(1.-zu_m/masse(ijq,l,iq))
460 do while(-zu_m.gt.masse(ijq,l,iq))
461 u_mq(ij,l)=u_mq(ij,l)-q(ijq,l,iq)
463 zu_m=zu_m+masse(ijq,l,iq)
468 u_mq(ij,l)=u_mq(ij,l)+zu_m*(q(ijq,l,iq)-
469 & 0.5*(1.+zu_m/masse(ijq,l,iq))*dxq(ijq,l))
481 DO ij=iip1+iip1,
ip1jm,iip1
482 u_mq(ij,l)=u_mq(ij-
iim,l)
496 masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq)
497 ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq)
503 call vlx(ratio,pente_max,masseq,u_mq,iq2)
512 new_m=masse(ij,l,iq)+u_m(ij-1,l)-u_m(ij,l)
513 q(ij,l,iq)=(q(ij,l,iq)*masse(ij,l,iq)+
514 & u_mq(ij-1,l)-u_mq(ij,l))
519 DO ij=iip1+iip1,
ip1jm,iip1
520 q(ij-
iim,l,iq)=q(ij,l,iq)
521 masse(ij-
iim,l,iq)=masse(ij,l,iq)
533 q(ij,l,iq2)=q(ij,l,iq)*ratio(ij,l,iq2)
535 DO ij=iip1+iip1,
ip1jm,iip1
536 q(ij-
iim,l,iq2)=q(ij,l,iq2)
548 SUBROUTINE vlyqs(q,pente_max,masse,masse_adv_v,qsat,iq)
563 #include "dimensions.h"
567 #include "comconst.h"
584 REAL airej2,airejjm,airescb(
iim),airesch(
iim)
589 REAL qpns,qpsn,dyn1,dys1,dyn2,dys2,newmasse,fn,fs
591 Logical first,testcpu
592 REAL temps0,temps1,temps2,temps3,temps4,temps5
593 SAVE temps0,temps1,temps2,temps3,temps4,temps5
596 REAL convpn,convps,convmpn,convmps
597 REAL sinlon(iip1),sinlondlon(iip1)
598 REAL coslon(iip1),coslondlon(iip1)
599 SAVE sinlon,coslon,sinlondlon,coslondlon
609 DATA temps0,temps1,temps2,temps3,temps4,temps5/0.,0.,0.,0.,0.,0./
612 print*,
'Shema Amont nouveau appele dans Vanleer '
615 coslon(i)=cos(
rlonv(i))
616 sinlon(i)=sin(
rlonv(i))
620 coslon(1)=coslon(iip1)
621 coslondlon(1)=coslondlon(iip1)
622 sinlon(1)=sinlon(iip1)
623 sinlondlon(1)=sinlondlon(iip1)
642 airescb(i) =
aire(i+ iip1) * q(i+ iip1,l,iq)
645 qpns = ssum(
iim, airescb ,1 ) / airej2
646 qpsn = ssum(
iim, airesch ,1 ) / airejjm
651 dyqv(ij)=q(ij,l,iq)-q(ij+iip1,l,iq)
652 adyqv(ij)=abs(dyqv(ij))
658 dyq(ij,l)=.5*(dyqv(ij-iip1)+dyqv(ij))
659 dyqmax(ij)=min(adyqv(ij-iip1),adyqv(ij))
660 dyqmax(ij)=pente_max*dyqmax(ij)
666 dyq(ij,l)=qpns-q(ij+iip1,l,iq)
676 dyn1=dyn1+sinlondlon(ij)*dyq(ij,l)
677 dys1=dys1+sinlondlon(ij)*dyq(
ip1jm+ij,l)
678 dyn2=dyn2+coslondlon(ij)*dyq(ij,l)
679 dys2=dys2+coslondlon(ij)*dyq(
ip1jm+ij,l)
682 dyq(ij,l)=dyn1*sinlon(ij)+dyn2*coslon(ij)
683 dyq(
ip1jm+ij,l)=dys1*sinlon(ij)+dys2*coslon(ij)
691 IF(pente_max*adyqv(ij).lt.abs(dyq(ij,l)))
THEN
692 fn=min(pente_max*adyqv(ij)/abs(dyq(ij,l)),fn)
694 IF(pente_max*adyqv(ij+
ip1jm-iip1).lt.abs(dyq(ij+
ip1jm,l)))
THEN
695 fs=min(pente_max*adyqv(ij+
ip1jm-iip1)/abs(dyq(ij+
ip1jm,l)),fs)
699 dyq(ij,l)=fn*dyq(ij,l)
773 IF(dyqv(ij)*dyqv(ij-iip1).gt.0.)
THEN
774 dyq(ij,l)=sign(min(abs(dyq(ij,l)),dyqmax(ij)),dyq(ij,l))
784 IF( masse_adv_v(ij,l).GT.0. )
THEN
785 qbyv(ij,l)= min( qsat(ij+iip1,l), q(ij+iip1,l,iq ) +
786 , dyq(ij+iip1,l)*0.5*(1.-masse_adv_v(ij,l)
787 , /masse(ij+iip1,l,iq)))
789 qbyv(ij,l)= min( qsat(ij,l), q(ij,l,iq) - dyq(ij,l) *
790 , 0.5*(1.+masse_adv_v(ij,l)/masse(ij,l,iq)) )
792 qbyv(ij,l) = masse_adv_v(ij,l)*qbyv(ij,l)
806 masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq)
807 ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq)
815 call vly(ratio,pente_max,masseq,qbyv,iq2)
821 newmasse=masse(ij,l,iq)
822 & +masse_adv_v(ij,l)-masse_adv_v(ij-iip1,l)
823 q(ij,l,iq)=(q(ij,l,iq)*masse(ij,l,iq)+qbyv(ij,l)
824 & -qbyv(ij-iip1,l))/newmasse
825 masse(ij,l,iq)=newmasse
829 convmpn=ssum(
iim,masse_adv_v(1,l),1)/
apoln
831 newmasse=masse(ij,l,iq)+convmpn*
aire(ij)
832 q(ij,l,iq)=(q(ij,l,iq)*masse(ij,l,iq)+convpn*
aire(ij))/
834 masse(ij,l,iq)=newmasse
839 newmasse=masse(ij,l,iq)+convmps*
aire(ij)
840 q(ij,l,iq)=(q(ij,l,iq)*masse(ij,l,iq)+convps*
aire(ij))/
842 masse(ij,l,iq)=newmasse
878 q(ij,l,iq2)=q(ij,l,iq)*ratio(ij,l,iq2)
!$Header llmm1 INTEGER ip1jmp1
integer, dimension(:), allocatable, save nqdesc
!$Header!CDK comgeom COMMON comgeom apols
recursive subroutine vly(q, pente_max, masse, masse_adv_v, iq)
subroutine vlyqs(q, pente_max, masse, masse_adv_v, qsat, 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
!$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
!$Id mode_top_bound COMMON comconstr cpp
!$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
subroutine vlspltqs(q, pente_max, masse, w, pbaru, pbarv, pdt, p, pk, teta, iq)
integer, dimension(:), allocatable, save nqfils
subroutine vlxqs(q, pente_max, masse, u_m, qsat, iq)
c c zjulian c cym CALL iim cym klev iim
recursive subroutine vlz(q, pente_max, masse, w, iq)
!$Header!CDK comgeom COMMON comgeom rlonv