65 subroutine ppm3d(IGD,Q,PS1,PS2,U,V,W,NDT,IORD,JORD,KORD,NC,IMR,
66 & jnp,j1,nlay,ap,
bp,
pt,ae,fill,dum,umax)
272 integer,
parameter :: Jmax = 361, kmax = 150
279 real Q(imr,jnp,nlay,nc),PS1(imr,jnp),PS2(imr,jnp),
280 &
u(imr,jnp,nlay),v(imr,jnp,nlay),ap(nlay+1),
281 &
bp(nlay+1),w(imr,jnp,nlay),ndt,val(nlay),umax
282 integer IGD,IORD,JORD,KORD,NC,IMR,JNP,j1,NLAY,AE
285 logical cross, fill, dum
289 real CRX(imr,jnp),CRY(imr,jnp),xmass(imr,jnp),ymass(imr,jnp),
290 & fx1(imr+1),dpi(imr,jnp,nlay),delp1(imr,jnp,nlay),
291 & wk1(imr,jnp,nlay),pu(imr,jnp),pv(imr,jnp),dc2(imr,jnp),
292 & delp2(imr,jnp,nlay),
dq(imr,jnp,nlay,nc),va(imr,jnp),
293 & ua(imr,jnp),qtmp(-imr:2*imr)
297 real DTDX(jmax), DTDX5(jmax), acosp(jmax),
298 & cosp(jmax), cose(jmax), dap(kmax),dbk(kmax)
299 data ndt0, nstep /0, 0/
301 REAL DTDY, DTDY5, RCAP
302 INTEGER JS0, JN0, IML, JMR, IMJM
303 SAVE dtdy, dtdy5, rcap, js0, jn0, iml,
304 & dtdx, dtdx5, acosp, cosp, cose, dap,dbk
306 INTEGER NDT0, NSTEP, j2, k,j,i,ic,l,JS,JN,IMH
307 INTEGER IU,IIU,JT,iad,jad,krd
308 REAL r23,r3,PI,DL,DP,DT,CR1,MAXDT,ZTC,D5
319 write(6,*)
'------------------------------------ '
320 write(6,*)
'NASA/GSFC Transport Core Version 4.5'
321 write(6,*)
'------------------------------------ '
323 WRITE(6,*)
'IMR=',imr,
' JNP=',jnp,
' NLAY=',nlay,
' j1=',j1
324 WRITE(6,*)
'NC=',nc,iord,jord,kord,ndt
328 write(6,*)
'NLAY must be >= 6'
331 if (jnp.LT.nlay)
then
332 write(6,*)
'JNP must be >= NLAY'
336 if (j1.eq.2.and.imrd2.NE.0)
then
337 write(6,*)
'if j1=2 IMR must be an even integer'
342 if(jmax.lt.jnp .or. kmax.lt.nlay)
then
343 write(6,*)
'Jmax or Kmax is too small'
348 dap(k) = (ap(k+1) - ap(k))*pt
349 dbk(k) =
bp(k+1) -
bp(k)
353 dl = 2.*pi /
REAL(imr)
358 call cosa(cosp,cose,jnp,pi,dp)
361 call cosc(cosp,cose,jnp,pi,dp)
365 15 acosp(j) = 1. / cosp(j)
369 rcap = dp / (imr*(1.-cos((j1-1.5)*dp)))
374 if(ndt0 .ne. ndt)
then
378 if(umax .lt. 180.)
then
379 write(6,*)
'Umax may be too small!'
381 cr1 = abs(umax*dt)/(dl*ae)
382 maxdt = dp*ae / abs(umax) + 0.5
383 write(6,*)
'Largest time step for max(V)=',umax,
' is ',maxdt
384 if(maxdt .lt. abs(ndt))
then
385 write(6,*)
'Warning!!! NDT maybe too large!'
394 ztc = acos(cr1) * (180./pi)
396 js0 =
REAL(jmr)*(90.-ztc)/180. + 2
398 iml = min(6*js0/(j1-1)+2, 4*imr/5)
404 dtdx(j) = dt / ( dl*ae*cosp(j) )
407 dtdx5(j) = 0.5*dtdx(j)
424 delp1(i,j,k)=dap(k)+dbk(k)*ps1(i,j)
425 delp2(i,j,k)=dap(k)+dbk(k)*ps2(i,j)
435 q(i, 2,l,ic) = q(i, 1,l,ic)
436 40 q(i,jmr,l,ic) = q(i,jnp,l,ic)
444 44
dq(i,j,k,ic) = q(i,j,k,ic)*delp1(i,j,k)
451 call a2c(
u(1,1,k),v(1,1,k),imr,jmr,j1,j2,crx,cry,dtdx5,dtdy5)
456 45 crx(i,j) = dtdx(j)*
u(i-1,j,k)
460 50 crx(1,j) = dtdx(j)*
u(imr,j,k)
463 55 cry(i,2) = dtdy*v(i,1,k)
472 if(abs(crx(i,j)).GT.1.)
then
482 if(abs(crx(i,j)).GT.1.)
then
503 ymass(i,j) = cry(i,j)*d5*(delp2(i,j,k) + delp2(i,j-1,k))
509 95 dpi(i,j,k) = (ymass(i,j) - ymass(i,j+1)) * acosp(j)
512 sum1 = ymass(imr,j1 )
513 sum2 = ymass(imr,j2+1)
515 sum1 = sum1 + ymass(i,j1 )
516 sum2 = sum2 + ymass(i,j2+1)
530 pu(i,j) = 0.5 * (delp2(i,j,k) + delp2(i-1,j,k))
535 pu(1,j) = 0.5 * (delp2(1,j,k) + delp2(imr,j,k))
540 110 xmass(i,j) = pu(i,j)*crx(i,j)
544 120 dpi(i,j,k) = dpi(i,j,k) + xmass(i,j) - xmass(i+1,j)
547 130 dpi(imr,j,k) = dpi(imr,j,k) + xmass(imr,j) - xmass(1,j)
551 ua(i,j) = 0.5 * (crx(i,j)+crx(i+1,j))
556 ua(imr,j) = 0.5 * (crx(imr,j)+crx(1,j))
568 va(i,2) = 0.5*(cry(i,2)+cry(i,3))
574 va(i, 1) = 0.5*(cry(i,2)-cry(i+imh,2))
575 va(i+imh, 1) = -va(i,1)
576 va(i, jnp) = 0.5*(cry(i,jnp)-cry(i+imh,jmr))
577 va(i+imh,jnp) = -va(i,jnp)
580 va(imr,jnp)=va(1,jnp)
593 if(j.GT.js .and. j.LT.jn)
GO TO 250
596 qtmp(i) = q(i,j,k,ic)
600 qtmp(i) = q(imr+i,j,k,ic)
601 qtmp(imr+1-i) = q(1-i,j,k,ic)
608 if(ua(i,j).GE.0.)
then
609 wk1(i,j,1) = qtmp(iiu)+ru*(qtmp(iiu-1)-qtmp(iiu))
611 wk1(i,j,1) = qtmp(iiu)+ru*(qtmp(iiu)-qtmp(iiu+1))
613 wk1(i,j,1) = wk1(i,j,1) - qtmp(i)
621 qtmp(i) = q(i,j,k,ic)
624 qtmp(0) = q(imr,j,k,ic)
625 qtmp(imr+1) = q( 1,j,k,ic)
629 wk1(i,j,1) = ua(i,j)*(qtmp(iu) - qtmp(iu+1))
636 jt =
REAL(J1) - VA(i,j1)
637 wk1(i,j1,2) = va(i,j1) * (q(i,jt,k,ic) - q(i,jt+1,k,ic))
641 wk1(i,1,1) = q(i,1,k,ic) + 0.5*wk1(i,1,1)
642 wk1(i,1,2) = q(i,1,k,ic) + 0.5*wk1(i,1,2)
658 call xadv(imr,jnp,j1,j2,wk1(1,1,2),ua,js,jn,iml,dc2,iad)
659 call yadv(imr,jnp,j1,j2,wk1(1,1,1),va,pv,w,jad)
662 q(i,j,k,ic) = q(i,j,k,ic) + dc2(i,j) + pv(i,j)
667 call xtp(imr,jnp,iml,j1,j2,jn,js,pu,
dq(1,1,k,ic),wk1(1,1,2)
668 & ,crx,fx1,xmass,iord)
670 call ytp(imr,jnp,j1,j2,acosp,rcap,
dq(1,1,k,ic),wk1(1,1,1),cry,
671 & dc2,ymass,wk1(1,1,3),wk1(1,1,4),wk1(1,1,5),wk1(1,1,6),jord)
682 320 cry(i,j) = dpi(i,j,1)
687 cry(i,j) = cry(i,j) + dpi(i,j,k)
696 ps2(i,j) = ps1(i,j) + cry(i,j)
700 w(i,j,1) = dpi(i,j,1) - dbk(1)*cry(i,j)
707 w(i,j,k) = w(i,j,k-1) + dpi(i,j,k) - dbk(k)*cry(i,j)
713 delp2(i,j,k) = dap(k) + dbk(k)*ps2(i,j)
721 call fzppm(imr,jnp,nlay,j1,
dq(1,1,1,ic),w,q(1,1,1,ic),wk1,dpi,
722 & dc2,crx,cry,pu,pv,xmass,ymass,delp1,krd)
725 if(fill)
call qckxyz(
dq(1,1,1,ic),dc2,imr,jnp,nlay,j1,j2,
726 & cosp,acosp,.
false.,ic,nstep)
734 q(i,j,k,ic) =
dq(i,j,k,ic) / delp2(i,j,k)
744 q(i, 2,k,ic) = q(i, 1,k,ic)
745 q(i,jmr,k,ic) = q(i,jnp,k,ic)
753 w(i, 2,k) = w(i, 1,k)
754 w(i,jmr,k) = w(i,jnp,k)
762 subroutine fzppm(IMR,JNP,NLAY,j1,DQ,WZ,P,DC,DQDT,AR,AL,A6,
763 & flux,wk1,wk2,wz2,delp,kord)
765 integer,
parameter :: kmax = 150
766 real,
parameter :: R23 = 2./3., r3 = 1./3.
767 integer IMR,JNP,NLAY,J1,KORD
768 real WZ(imr,jnp,nlay),P(imr,jnp,nlay),DC(imr,jnp,nlay),
769 & wk1(imr,*),delp(imr,jnp,nlay),
dq(imr,jnp,nlay),
772 real AR(imr,*),AL(imr,*),A6(imr,*),flux(imr,*),wk2(imr,*),
774 integer JMR,IMJM,NLAYM1,LMT,K,I,J
775 real c0,c1,c2,tmp,qmax,qmin,a,b,fct,a1,a2,cm,cp
789 dqdt(i,1,k) = p(i,1,k+1) - p(i,1,k)
794 c0 = delp(i,1,k) / (delp(i,1,k-1)+delp(i,1,k)+delp(i,1,k+1))
795 c1 = (delp(i,1,k-1)+0.5*delp(i,1,k))/(delp(i,1,k+1)+delp(i,1,k))
796 c2 = (delp(i,1,k+1)+0.5*delp(i,1,k))/(delp(i,1,k-1)+delp(i,1,k))
797 tmp = c0*(c1*dqdt(i,1,k) + c2*dqdt(i,1,k-1))
798 qmax = max(p(i,1,k-1),p(i,1,k),p(i,1,k+1)) - p(i,1,k)
799 qmin = p(i,1,k) - min(p(i,1,k-1),p(i,1,k),p(i,1,k+1))
800 dc(i,1,k) = sign(min(abs(tmp),qmax,qmin), tmp)
809 if((j.eq.2 .or. j.eq.jmr) .and. j1.ne.2)
goto 2000
815 wk2(i,k) = delp(i,j,k)
816 flux(i,k) = dc(i,j,k)
833 a = 3.*( dqdt(i,j,2) - dqdt(i,j,1)*(wk2(i,2)+wk2(i,3))/
834 & (wk2(i,1)+wk2(i,2)) ) /
835 & ( (wk2(i,2)+wk2(i,3))*(wk2(i,1)+wk2(i,2)+wk2(i,3)) )
836 b = 2.*dqdt(i,j,1)/(wk2(i,1)+wk2(i,2)) -
837 & r23*a*(2.*wk2(i,1)+wk2(i,2))
838 al(i,1) = wk1(i,1) - wk2(i,1)*(r3*a*wk2(i,1) + 0.5*b)
839 al(i,2) = wk2(i,1)*(a*wk2(i,1) + b) + al(i,1)
842 if(wk1(i,1)*al(i,1).le.0.)
then
846 flux(i,1) = wk1(i,1) - al(i,1)
854 fct = dqdt(i,j,nlaym1)*wk2(i,nlay)**2 /
855 & ( (wk2(i,nlay)+wk2(i,nlaym1))*(2.*wk2(i,nlay)+wk2(i,nlaym1)))
856 ar(i,nlay) = wk1(i,nlay) + fct
857 al(i,nlay) = wk1(i,nlay) - (fct+fct)
858 if(wk1(i,nlay)*ar(i,nlay).le.0.) ar(i,nlay) = 0.
859 flux(i,nlay) = ar(i,nlay) - wk1(i,nlay)
869 c1 = dqdt(i,j,k-1)*wk2(i,k-1) / (wk2(i,k-1)+wk2(i,k))
870 c2 = 2. / (wk2(i,k-2)+wk2(i,k-1)+wk2(i,k)+wk2(i,k+1))
871 a1 = (wk2(i,k-2)+wk2(i,k-1)) / (2.*wk2(i,k-1)+wk2(i,k))
872 a2 = (wk2(i,k )+wk2(i,k+1)) / (2.*wk2(i,k)+wk2(i,k-1))
873 al(i,k) = wk1(i,k-1) + c1 + c2 *
874 & ( wk2(i,k )*(c1*(a1 - a2)+a2*flux(i,k-1)) -
875 & wk2(i,k-1)*a1*flux(i,k) )
886 a6(i,1) = 3.*(wk1(i,1)+wk1(i,1) - (al(i,1)+ar(i,1)))
892 call lmtppm(flux(1,1),a6(1,1),ar(1,1),al(1,1),wk1(1,1),imr,0)
893 call lmtppm(flux(1,nlay),a6(1,nlay),ar(1,nlay),al(1,nlay),
898 &
call lmtppm(flux(1,2),a6(1,2),ar(1,2),al(1,2),wk1(1,2),
903 DO 140 i=1,imr*nlaym1
904 IF(wz2(i,1).GT.0.)
then
905 cm = wz2(i,1) / wk2(i,1)
906 flux(i,2) = ar(i,1)+0.5*cm*(al(i,1)-ar(i,1)+a6(i,1)*(1.-r23*cm))
909 cp= wz2(i,1) / wk2(i,2)
911 flux(i,2) = al(i,2)+0.5*cp*(al(i,2)-ar(i,2)-a6(i,2)*(1.+r23*cp))
916 DO 250 i=1,imr*nlaym1
917 flux(i,2) = wz2(i,1) * flux(i,2)
921 dq(i,j, 1) =
dq(i,j, 1) - flux(i, 2)
922 dq(i,j,nlay) =
dq(i,j,nlay) + flux(i,nlay)
927 360
dq(i,j,k) =
dq(i,j,k) + flux(i,k) - flux(i,k+1)
932 subroutine xtp(IMR,JNP,IML,j1,j2,JN,JS,PU,DQ,Q,UC,
935 integer IMR,JNP,IML,j1,j2,JN,JS,IORD
936 real PU,DQ,Q,UC,fx1,xmass
939 dimension uc(imr,*),dc(-iml:imr+iml+1),xmass(imr,jnp)
940 & ,fx1(imr+1),dq(imr,jnp),qtmp(-iml:imr+1+iml)
941 dimension pu(imr,jnp),q(imr,jnp)
942 integer jvan,j1vl,j2vl,j,i,iu,itmp,ist,imp
958 if(j.ge.jn .or. j.le.js)
goto 2222
962 qtmp(-1) = q(imr-1,j)
966 IF(iord.eq.1 .or. j.eq.j1. or. j.eq.j2)
THEN
968 iu =
REAL(i) - uc(i,j)
969 1406 fx1(i) = qtmp(iu)
971 call xmist(imr,iml,qtmp,dc)
974 if(iord.eq.2 .or. j.le.j1vl .or. j.ge.j2vl)
then
976 iu =
REAL(i) - uc(i,j)
977 1408 fx1(i) = qtmp(iu) + dc(iu)*(sign(1.,uc(i,j))-uc(i,j))
979 call fxppm(imr,iml,uc(1,j),qtmp,dc,fx1,iord)
985 1506 fx1(i) = fx1(i)*xmass(i,j)
995 qtmp(imp-i) = q(1-i,j)
998 IF(iord.eq.1 .or. j.eq.j1. or. j.eq.j2)
THEN
1003 1306 fx1(i) = (uc(i,j) - itmp)*qtmp(iu)
1005 call xmist(imr,iml,qtmp,dc)
1014 rut = uc(i,j) - itmp
1017 1307 fx1(i) = rut*(qtmp(iu) + dc(iu)*(sign(1.,rut) - rut))
1021 IF(uc(i,j).GT.1.)
then
1023 do ist = isave(i),i-1
1024 fx1(i) = fx1(i) + qtmp(ist)
1026 elseIF(uc(i,j).LT.-1.)
then
1027 do ist = i,isave(i)-1
1028 fx1(i) = fx1(i) - qtmp(ist)
1034 fx1(i) = pu(i,j)*fx1(i)
1039 1309 fx1(imp) = fx1(1)
1041 1215 dq(i,j) = dq(i,j) + fx1(i)-fx1(i+1)
1049 subroutine fxppm(IMR,IML,UT,P,DC,flux,IORD)
1051 integer IMR,IML,IORD
1053 real,
parameter :: R3 = 1./3., r23 = 2./3.
1054 dimension ut(*),flux(*),p(-iml:imr+iml+1),dc(-iml:imr+iml+1)
1055 REAL :: AR(0:imr),AL(0:imr),A6(0:imr)
1056 integer LMT,IMP,JLVL,i
1082 10 al(i) = 0.5*(p(i-1)+p(i)) + (dc(i-1) - dc(i))*r3
1089 30 a6(i) = 3.*(p(i)+p(i) - (al(i)+ar(i)))
1091 if(lmt.LE.2)
call lmtppm(dc(1),a6(1),ar(1),al(1),p(1),imr,lmt)
1098 IF(ut(i).GT.0.)
then
1099 flux(i) = ar(i-1) + 0.5*ut(i)*(al(i-1) - ar(i-1) +
1100 & a6(i-1)*(1.-r23*ut(i)) )
1102 flux(i) = al(i) - 0.5*ut(i)*(ar(i) - al(i) +
1103 & a6(i)*(1.+r23*ut(i)))
1109 subroutine xmist(IMR,IML,P,DC)
1112 real,
parameter :: R24 = 1./24.
1113 real :: P(-iml:imr+1+iml),DC(-iml:imr+1+iml)
1115 real :: tmp,pmax,pmin
1118 tmp = r24*(8.*(p(i+1) - p(i-1)) + p(i-2) - p(i+2))
1119 pmax = max(p(i-1), p(i), p(i+1)) - p(i)
1120 pmin = p(i) - min(p(i-1), p(i), p(i+1))
1121 10 dc(i) = sign(min(abs(tmp),pmax,pmin), tmp)
1125 subroutine ytp(IMR,JNP,j1,j2,acosp,RCAP,DQ,P,VC,DC2
1126 & ,ymass,
fx,a6,ar,al,jord)
1128 integer :: IMR,JNP,j1,j2,JORD
1129 real :: acosp,RCAP,DQ,P,VC,DC2,ymass,fx,A6,AR,AL
1130 dimension p(imr,jnp),vc(imr,jnp),ymass(imr,jnp)
1131 & ,dc2(imr,jnp),dq(imr,jnp),acosp(jnp)
1133 dimension fx(imr,jnp),ar(imr,jnp),al(imr,jnp),a6(imr,jnp)
1134 integer :: JMR,len,i,jt,j
1142 jt =
REAL(J1) - VC(i,j1)
1143 1000 fx(i,j1) = p(i,jt)
1146 call ymist(imr,jnp,j1,p,dc2,4)
1148 if(jord.LE.0 .or. jord.GE.3)
then
1150 call fyppm(vc,p,dc2,fx,imr,jnp,j1,j2,a6,ar,al,jord)
1154 jt =
REAL(J1) - VC(i,j1)
1155 1200 fx(i,j1) = p(i,jt) + (sign(1.,vc(i,j1))-vc(i,j1))*dc2(i,jt)
1160 1300 fx(i,j1) = fx(i,j1)*ymass(i,j1)
1164 1400 dq(i,j) = dq(i,j) + (fx(i,j) - fx(i,j+1)) * acosp(j)
1170 sum1 = sum1 + fx(i,j1 )
1171 sum2 = sum2 + fx(i,j2+1)
1174 sum1 = dq(1, 1) - sum1 * rcap
1175 sum2 = dq(1,jnp) + sum2 * rcap
1191 subroutine ymist(IMR,JNP,j1,P,DC,ID)
1193 integer :: IMR,JNP,j1,ID
1194 real,
parameter :: R24 = 1./24.
1195 real :: P(imr,jnp),DC(imr,jnp)
1196 integer :: iimh,jmr,ijm3,imh,i
1197 real :: pmax,pmin,tmp
1204 do 10 i=1,imr*(jmr-1)
1205 tmp = 0.25*(p(i,3) - p(i,1))
1206 pmax = max(p(i,1),p(i,2),p(i,3)) - p(i,2)
1207 pmin = p(i,2) - min(p(i,1),p(i,2),p(i,3))
1208 dc(i,2) = sign(min(abs(tmp),pmin,pmax),tmp)
1213 tmp = (8.*(p(i,3) - p(i,1)) + p(i+imh,2) - p(i,4))*r24
1214 pmax = max(p(i,1),p(i,2),p(i,3)) - p(i,2)
1215 pmin = p(i,2) - min(p(i,1),p(i,2),p(i,3))
1216 dc(i,2) = sign(min(abs(tmp),pmin,pmax),tmp)
1218 tmp=(8.*(p(i,jnp)-p(i,jmr-1))+p(i,jmr-2)-p(i+imh,jmr))*r24
1219 pmax = max(p(i,jmr-1),p(i,jmr),p(i,jnp)) - p(i,jmr)
1220 pmin = p(i,jmr) - min(p(i,jmr-1),p(i,jmr),p(i,jnp))
1221 dc(i,jmr) = sign(min(abs(tmp),pmin,pmax),tmp)
1225 tmp = (8.*(p(i,3) - p(i,1)) + p(i-imh,2) - p(i,4))*r24
1226 pmax = max(p(i,1),p(i,2),p(i,3)) - p(i,2)
1227 pmin = p(i,2) - min(p(i,1),p(i,2),p(i,3))
1228 dc(i,2) = sign(min(abs(tmp),pmin,pmax),tmp)
1230 tmp=(8.*(p(i,jnp)-p(i,jmr-1))+p(i,jmr-2)-p(i-imh,jmr))*r24
1231 pmax = max(p(i,jmr-1),p(i,jmr),p(i,jnp)) - p(i,jmr)
1232 pmin = p(i,jmr) - min(p(i,jmr-1),p(i,jmr),p(i,jnp))
1233 dc(i,jmr) = sign(min(abs(tmp),pmin,pmax),tmp)
1237 tmp = (8.*(p(i,4) - p(i,2)) + p(i,1) - p(i,5))*r24
1238 pmax = max(p(i,2),p(i,3),p(i,4)) - p(i,3)
1239 pmin = p(i,3) - min(p(i,2),p(i,3),p(i,4))
1240 dc(i,3) = sign(min(abs(tmp),pmin,pmax),tmp)
1254 tmp = 0.25*(p(i,2) - p(i+imh,2))
1255 pmax = max(p(i,2),p(i,1), p(i+imh,2)) - p(i,1)
1256 pmin = p(i,1) - min(p(i,2),p(i,1), p(i+imh,2))
1257 dc(i,1)=sign(min(abs(tmp),pmax,pmin),tmp)
1259 tmp = 0.25*(p(i+imh,jmr) - p(i,jmr))
1260 pmax = max(p(i+imh,jmr),p(i,jnp), p(i,jmr)) - p(i,jnp)
1261 pmin = p(i,jnp) - min(p(i+imh,jmr),p(i,jnp), p(i,jmr))
1262 dc(i,jnp) = sign(min(abs(tmp),pmax,pmin),tmp)
1266 dc(i, 1) = - dc(i-imh, 1)
1267 dc(i,jnp) = - dc(i-imh,jnp)
1273 subroutine fyppm(VC,P,DC,flux,IMR,JNP,j1,j2,A6,AR,AL,JORD)
1275 integer IMR,JNP,j1,j2,JORD
1276 real,
parameter :: R3 = 1./3., r23 = 2./3.
1277 real VC(imr,*),flux(imr,*),P(imr,*),DC(imr,*)
1279 real AR(imr,jnp),AL(imr,jnp),A6(imr,jnp)
1281 integer IMH,JMR,j11,IMJM1,len
1289 imjm1 = imr*(j2-j1+2)
1311 al(i,2) = 0.5*(p(i,1)+p(i,2)) + (dc(i,1) - dc(i,2))*r3
1318 al(i,1) = al(i+imh,2)
1319 al(i+imh,1) = al(i,2)
1321 ar(i,jnp) = ar(i+imh,jmr)
1322 ar(i+imh,jnp) = ar(i,jmr)
1329 ar(imr,jnp)=al(1,jnp)
1334 30 a6(i,j11) = 3.*(p(i,j11)+p(i,j11) - (al(i,j11)+ar(i,j11)))
1336 if(lmt.le.2)
call lmtppm(dc(1,j11),a6(1,j11),ar(1,j11)
1337 & ,al(1,j11),p(1,j11),len,lmt)
1341 IF(vc(i,j1).GT.0.)
then
1342 flux(i,j1) = ar(i,j11) + 0.5*vc(i,j1)*(al(i,j11) - ar(i,j11) +
1343 & a6(i,j11)*(1.-r23*vc(i,j1)) )
1345 flux(i,j1) = al(i,j1) - 0.5*vc(i,j1)*(ar(i,j1) - al(i,j1) +
1346 & a6(i,j1)*(1.+r23*vc(i,j1)))
1352 subroutine yadv(IMR,JNP,j1,j2,p,VA,ady,wk,IAD)
1354 integer IMR,JNP,j1,j2,IAD
1355 REAL p(imr,jnp),ady(imr,jnp),VA(imr,jnp)
1356 REAL WK(imr,-1:jnp+2)
1357 INTEGER JMR,IMH,i,j,jp
1358 REAL rv,a1,b1,sum1,sum2
1369 wk(i, -1) = p(i+imh,3)
1370 wk(i+imh,-1) = p(i,3)
1371 wk(i, 0) = p(i+imh,2)
1372 wk(i+imh,0) = p(i,2)
1373 wk(i,jnp+1) = p(i+imh,jmr)
1374 wk(i+imh,jnp+1) = p(i,jmr)
1375 wk(i,jnp+2) = p(i+imh,jnp-2)
1376 wk(i+imh,jnp+2) = p(i,jnp-2)
1389 a1 = 0.5*(wk(i,jp+1)+wk(i,jp-1)) - wk(i,jp)
1390 b1 = 0.5*(wk(i,jp+1)-wk(i,jp-1))
1392 ady(i,j) = wk(i,jp) + rv*(a1*rv + b1) - wk(i,j)
1397 ELSEIF(iad.eq.1)
then
1400 jp =
REAL(j)-VA(i,j)
1401 ady(i,j) = va(i,j)*(wk(i,jp)-wk(i,jp+1))
1410 sum1 = sum1 + ady(i,2)
1411 sum2 = sum2 + ady(i,jmr)
1427 sum1 = sum1 + ady(i,1)
1428 sum2 = sum2 + ady(i,jnp)
1442 subroutine xadv(IMR,JNP,j1,j2,p,UA,JS,JN,IML,adx,IAD)
1444 INTEGER IMR,JNP,j1,j2,JS,JN,IML,IAD
1445 REAL p(imr,jnp),adx(imr,jnp),qtmp(-imr:imr+imr),UA(imr,jnp)
1446 INTEGER JMR,j,i,ip,iu,iiu
1451 if(j.GT.js .and. j.LT.jn)
GO TO 1309
1458 qtmp(i) = p(imr+i,j)
1459 qtmp(imr+1-i) = p(1-i,j)
1467 a1 = 0.5*(qtmp(ip+1)+qtmp(ip-1)) - qtmp(ip)
1468 b1 = 0.5*(qtmp(ip+1)-qtmp(ip-1))
1469 adx(i,j) = qtmp(ip) + ru*(a1*ru + b1)
1471 ELSEIF(iad.eq.1)
then
1476 if(ua(i,j).GE.0.)
then
1477 adx(i,j) = qtmp(iiu)+ru*(qtmp(iiu-1)-qtmp(iiu))
1479 adx(i,j) = qtmp(iiu)+ru*(qtmp(iiu)-qtmp(iiu+1))
1485 adx(i,j) = adx(i,j) - p(i,j)
1498 qtmp(imr+1) = p(1,j)
1501 qtmp(-1) = p(imr-1,j)
1502 qtmp(imr+2) = p(2,j)
1507 a1 = 0.5*(qtmp(ip+1)+qtmp(ip-1)) - qtmp(ip)
1508 b1 = 0.5*(qtmp(ip+1)-qtmp(ip-1))
1509 adx(i,j) = qtmp(ip)- p(i,j) + ru*(a1*ru + b1)
1511 ELSEIF(iad.eq.1)
then
1515 adx(i,j) = ua(i,j)*(qtmp(ip)-qtmp(ip+1))
1534 subroutine lmtppm(DC,A6,AR,AL,P,IM,LMT)
1550 real,
parameter :: R12 = 1./12.
1554 REAL da1,da2,a6da,fmin
1559 if(dc(i).eq.0.)
then
1567 if(a6da .lt. -da2)
then
1568 a6(i) = 3.*(al(i)-p(i))
1569 ar(i) = al(i) - a6(i)
1570 elseif(a6da .gt. da2)
then
1571 a6(i) = 3.*(ar(i)-p(i))
1572 al(i) = ar(i) - a6(i)
1576 elseif(lmt.eq.1)
then
1579 if(abs(ar(i)-al(i)) .GE. -a6(i))
go to 150
1580 if(p(i).lt.ar(i) .and. p(i).lt.al(i))
then
1584 elseif(ar(i) .gt. al(i))
then
1585 a6(i) = 3.*(al(i)-p(i))
1586 ar(i) = al(i) - a6(i)
1588 a6(i) = 3.*(ar(i)-p(i))
1589 al(i) = ar(i) - a6(i)
1592 elseif(lmt.eq.2)
then
1594 if(abs(ar(i)-al(i)) .GE. -a6(i))
go to 250
1595 fmin = p(i) + 0.25*(ar(i)-al(i))**2/a6(i) + a6(i)*r12
1596 if(fmin.ge.0.)
go to 250
1597 if(p(i).lt.ar(i) .and. p(i).lt.al(i))
then
1601 elseif(ar(i) .gt. al(i))
then
1602 a6(i) = 3.*(al(i)-p(i))
1603 ar(i) = al(i) - a6(i)
1605 a6(i) = 3.*(ar(i)-p(i))
1606 al(i) = ar(i) - a6(i)
1613 subroutine a2c(U,V,IMR,JMR,j1,j2,CRX,CRY,dtdx5,DTDY5)
1615 integer IMR,JMR,j1,j2
1616 real :: U(imr,*),V(imr,*),CRX(imr,*),CRY(imr,*),DTDX5(*),DTDY5
1621 35 crx(i,j) = dtdx5(j)*(u(i,j)+u(i-1,j))
1624 45 crx(1,j) = dtdx5(j)*(u(1,j)+u(imr,j))
1627 55 cry(i,2) = dtdy5*(v(i,2)+v(i,1))
1631 subroutine cosa(cosp,cose,JNP,PI,DP)
1634 real :: cosp(*),cose(*),PI,DP
1639 ph5 = -0.5*pi + (
REAL(j-1)-0.5)*dp
1640 55 cose(j) = cos(ph5)
1643 if(jmr .eq. 2*(jmr/2) )
then
1645 cose(j) = cose(jnp+2-j)
1651 cose(j) = cose(jnp+2-j)
1656 66 cosp(j) = 0.5*(cose(j)+cose(j+1))
1662 subroutine cosc(cosp,cose,JNP,PI,DP)
1665 real :: cosp(*),cose(*),PI,DP
1672 55 cosp(j) = cos(phi)
1677 cose(j) = 0.5*(cosp(j)+cosp(j-1))
1681 cosp(j) = 0.5*(cose(j)+cose(j+1))
1686 SUBROUTINE qckxyz (Q,qtmp,IMR,JNP,NLAY,j1,j2,cosp,acosp,
1689 real,
parameter :: tiny = 1.e-60
1690 INTEGER :: IMR,JNP,NLAY,j1,j2,IC,NSTEP
1691 REAL :: Q(imr,jnp,nlay),qtmp(imr,jnp),cosp(*),acosp(*)
1693 INTEGER :: NLAYM1,len,ip,L,icr,ipy,ipx,i
1694 real :: qup,qly,dup,sum
1703 call filns(q(1,1,l),imr,jnp,j1,j2,cosp,acosp,ipy,tiny)
1704 if(ipy.eq.0)
goto 50
1705 call filew(q(1,1,l),qtmp,imr,jnp,j1,j2,ipx,tiny)
1706 if(ipx.eq.0)
goto 50
1709 call filcr(q(1,1,l),imr,jnp,j1,j2,cosp,acosp,icr,tiny)
1711 if(icr.eq.0)
goto 50
1715 IF( q(i,j1,1).LT.0.)
THEN
1717 q(i,j1,2) = q(i,j1,2) + q(i,j1,1)
1726 call filns(q(1,1,l),imr,jnp,j1,j2,cosp,acosp,ipy,tiny)
1727 if(ipy.eq.0)
goto 225
1728 call filew(q(1,1,l),qtmp,imr,jnp,j1,j2,ipx,tiny)
1729 if(ipx.eq.0)
go to 225
1731 call filcr(q(1,1,l),imr,jnp,j1,j2,cosp,acosp,icr,tiny)
1733 if(icr.eq.0)
goto 225
1736 IF( q(i,j1,l).LT.0.)
THEN
1743 q(i,j1,l-1) = qup - dup
1744 q(i,j1,l ) = dup-qly
1746 q(i,j1,l+1) = q(i,j1,l+1) + q(i,j1,l)
1756 call filns(q(1,1,l),imr,jnp,j1,j2,cosp,acosp,ipy,tiny)
1757 if(ipy.eq.0)
goto 911
1758 call filew(q(1,1,l),qtmp,imr,jnp,j1,j2,ipx,tiny)
1759 if(ipx.eq.0)
goto 911
1761 call filcr(q(1,1,l),imr,jnp,j1,j2,cosp,acosp,icr,tiny)
1762 if(icr.eq.0)
goto 911
1765 IF( q(i,j1,l).LT.0.)
THEN
1770 qup = q(i,j1,nlaym1)
1773 q(i,j1,nlaym1) = qup - dup
1783 write(6,*)
'IC=',ic,
' STEP=',nstep,
1784 &
' Vertical filling pts=',ip
1787 if(sum.gt.1.e-25)
then
1788 write(6,*) ic,nstep,
' Mass source from the ground=',sum
1793 subroutine filcr(q,IMR,JNP,j1,j2,cosp,acosp,icr,tiny)
1795 integer :: IMR,JNP,j1,j2,icr
1796 real :: q(imr,*),cosp(*),acosp(*),tiny
1798 real :: dq,dn,d0,d1,ds,d2
1802 IF(q(i,j).LT.0.)
THEN
1804 dq = - q(i,j)*cosp(j)
1806 dn = q(i+1,j+1)*cosp(j+1)
1809 q(i+1,j+1) = (dn - d1)*acosp(j+1)
1812 ds = q(i+1,j-1)*cosp(j-1)
1815 q(i+1,j-1) = (ds - d2)*acosp(j-1)
1816 q(i,j) = (d2 - dq)*acosp(j) + tiny
1819 if(icr.eq.0 .and. q(imr,j).ge.0.)
goto 65
1821 IF(q(i,j).LT.0.)
THEN
1823 dq = - q(i,j)*cosp(j)
1825 dn = q(i-1,j+1)*cosp(j+1)
1828 q(i-1,j+1) = (dn - d1)*acosp(j+1)
1831 ds = q(i-1,j-1)*cosp(j-1)
1834 q(i-1,j-1) = (ds - d2)*acosp(j-1)
1835 q(i,j) = (d2 - dq)*acosp(j) + tiny
1841 IF(q(i,j).LT.0.)
THEN
1843 dq = - q(i,j)*cosp(j)
1845 dn = q(imr,j+1)*cosp(j+1)
1848 q(imr,j+1) = (dn - d1)*acosp(j+1)
1851 ds = q(imr,j-1)*cosp(j-1)
1854 q(imr,j-1) = (ds - d2)*acosp(j-1)
1855 q(i,j) = (d2 - dq)*acosp(j) + tiny
1860 IF(q(i,j).LT.0.)
THEN
1862 dq = - q(i,j)*cosp(j)
1864 dn = q(1,j+1)*cosp(j+1)
1867 q(1,j+1) = (dn - d1)*acosp(j+1)
1870 ds = q(1,j-1)*cosp(j-1)
1873 q(1,j-1) = (ds - d2)*acosp(j-1)
1874 q(i,j) = (d2 - dq)*acosp(j) + tiny
1880 if(q(i,j1).lt.0. .or. q(i,j2).lt.0.)
then
1888 if(q(1,1).lt.0. .or. q(1,jnp).lt.0.)
then
1895 subroutine filns(q,IMR,JNP,j1,j2,cosp,acosp,ipy,tiny)
1897 integer :: IMR,JNP,j1,j2,ipy
1898 real :: q(imr,*),cosp(*),acosp(*),tiny
1899 real :: DP,CAP1,dq,dn,d0,d1,ds,d2
1906 dp = 4.*atan(1.)/
REAL(jnp-1)
1907 cap1 = imr*(1.-cos((j1-1.5)*dp))/dp
1914 IF(q(i,j).LT.0.)
THEN
1916 dq = - q(i,j)*cosp(j)
1918 dn = q(i,j+1)*cosp(j+1)
1921 q(i,j+1) = (dn - d1)*acosp(j+1)
1924 ds = q(i,j-1)*cosp(j-1)
1927 q(i,j-1) = (ds - d2)*acosp(j-1)
1928 q(i,j) = (d2 - dq)*acosp(j) + tiny
1933 IF(q(i,j1).LT.0.)
THEN
1935 dq = - q(i,j1)*cosp(j1)
1937 dn = q(i,j1+1)*cosp(j1+1)
1940 q(i,j1+1) = (dn - d1)*acosp(j1+1)
1941 q(i,j1) = (d1 - dq)*acosp(j1) + tiny
1947 IF(q(i,j).LT.0.)
THEN
1949 dq = - q(i,j)*cosp(j)
1951 ds = q(i,j-1)*cosp(j-1)
1954 q(i,j-1) = (ds - d2)*acosp(j-1)
1955 q(i,j) = (d2 - dq)*acosp(j) + tiny
1960 if(q(1,1).lt.0.)
then
1961 dq = q(1,1)*cap1/
REAL(imr)*acosp(j1)
1964 q(i,j1) = q(i,j1) + dq
1965 if(q(i,j1).lt.0.) ipy = 1
1969 if(q(1,jnp).lt.0.)
then
1970 dq = q(1,jnp)*cap1/
REAL(imr)*acosp(j2)
1973 q(i,j2) = q(i,j2) + dq
1974 if(q(i,j2).lt.0.) ipy = 1
1981 subroutine filew(q,qtmp,IMR,JNP,j1,j2,ipx,tiny)
1983 integer :: IMR,JNP,j1,j2,ipx
1984 real :: q(imr,*),qtmp(jnp,imr),tiny
1992 25 qtmp(j,i) = q(i,j)
1996 if(qtmp(j,i).lt.0.)
then
1999 d0 = max(0.,qtmp(j,i-1))
2000 d1 = min(-qtmp(j,i),d0)
2001 qtmp(j,i-1) = qtmp(j,i-1) - d1
2002 qtmp(j,i) = qtmp(j,i) + d1
2004 d0 = max(0.,qtmp(j,i+1))
2005 d2 = min(-qtmp(j,i),d0)
2006 qtmp(j,i+1) = qtmp(j,i+1) - d2
2007 qtmp(j,i) = qtmp(j,i) + d2 + tiny
2013 if(qtmp(j,i).lt.0.)
then
2016 d0 = max(0.,qtmp(j,imr))
2017 d1 = min(-qtmp(j,i),d0)
2018 qtmp(j,imr) = qtmp(j,imr) - d1
2019 qtmp(j,i) = qtmp(j,i) + d1
2021 d0 = max(0.,qtmp(j,i+1))
2022 d2 = min(-qtmp(j,i),d0)
2023 qtmp(j,i+1) = qtmp(j,i+1) - d2
2025 qtmp(j,i) = qtmp(j,i) + d2 + tiny
2030 if(qtmp(j,i).lt.0.)
then
2033 d0 = max(0.,qtmp(j,i-1))
2034 d1 = min(-qtmp(j,i),d0)
2035 qtmp(j,i-1) = qtmp(j,i-1) - d1
2036 qtmp(j,i) = qtmp(j,i) + d1
2038 d0 = max(0.,qtmp(j,1))
2039 d2 = min(-qtmp(j,i),d0)
2040 qtmp(j,1) = qtmp(j,1) - d2
2042 qtmp(j,i) = qtmp(j,i) + d2 + tiny
2049 85 q(i,j) = qtmp(j,i)
2053 if(q(1,1).lt.0. or. q(1,jnp).lt.0.) ipx = 1
2058 subroutine zflip(q,im,km,nc)
2071 qtmp(i,k) = q(i,km+1-k,ic)
2075 2000 q(i,1,ic) = qtmp(i,1)
subroutine ytp(IMR, JNP, j1, j2, acosp, RCAP, DQ, P, VC, DC2, ymass, fx, A6, AR, AL, JORD)
do llm!au dessus on relaxe vers profil init!on fait l hypothese que dans ce il n y a plus d eau liq au dessus!donc la relaxation en thetal et qt devient relaxation en tempe et qv l dq1 relax dq(l, 1)
subroutine yadv(IMR, JNP, j1, j2, p, VA, ady, wk, IAD)
subroutine xmist(IMR, IML, P, DC)
subroutine fyppm(VC, P, DC, flux, IMR, JNP, j1, j2, A6, AR, AL, JORD)
subroutine xtp(IMR, JNP, IML, j1, j2, JN, JS, PU, DQ, Q, UC, fx1, xmass, IORD)
subroutine xadv(IMR, JNP, j1, j2, p, UA, JS, JN, IML, adx, IAD)
subroutine filcr(q, IMR, JNP, j1, j2, cosp, acosp, icr, tiny)
!$Header!c REAL ripx REAL fx
!$Id mode_top_bound COMMON comconstr omeg dissip_zref ihf INTEGER im
subroutine qckxyz(Q, qtmp, IMR, JNP, NLAY, j1, j2, cosp, acosp, cross, IC, NSTEP)
subroutine cosa(cosp, cose, JNP, PI, DP)
subroutine filns(q, IMR, JNP, j1, j2, cosp, acosp, ipy, tiny)
subroutine a2c(U, V, IMR, JMR, j1, j2, CRX, CRY, dtdx5, DTDY5)
subroutine fxppm(IMR, IML, UT, P, DC, flux, IORD)
!$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
subroutine lmtppm(DC, A6, AR, AL, P, IM, LMT)
subroutine ymist(IMR, JNP, j1, P, DC, ID)
subroutine zflip(q, im, km, nc)
subroutine ppm3d(IGD, Q, PS1, PS2, U, V, W, NDT, IORD, JORD, KORD, NC, IMR, JNP, j1, NLAY, AP, BP, PT, AE, fill, dum, Umax)
!$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 u(l)
!$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 fzppm(IMR, JNP, NLAY, j1, DQ, WZ, P, DC, DQDT, AR, AL, A6, flux, wk1, wk2, wz2, delp, KORD)
INTERFACE SUBROUTINE RRTM_ECRT_140GP pt
subroutine cosc(cosp, cose, JNP, PI, DP)
subroutine filew(q, qtmp, IMR, JNP, j1, j2, ipx, tiny)