c some minor revision in 18 March 2025
c but mostly from ~1996
c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
subroutine abcoef(p,q) 1
common/adams/ab(3,3)
ab(3,1)=0.
ab(2,1)=0.
ab(1,1)=1.
ab(3,2)=0.
ab(2,2)=-0.5/p
ab(1,2)=1-ab(2,2)
ab(3,3)=(2+3*p)/(6*q*(q-p))
ab(2,3)=-(1+2*q*ab(3,3))/(2*p)
ab(1,3)=1.-ab(2,3)-ab(3,3)
return
end
subroutine march(ko,na,nb,nc,dudt,dvdt,dwdt) 1
include 'box.size'
include 'box.common'
dimension dudt(in,jn,kn,3),
& dvdt(in,jn,kn,3),dwdt(in,jn,kn,3)
do k=slip,kn
do j=1,jn
do i=2,in-1
u(i,j,k)=u(i,j,k)+dt*(ab(1,ko)*dudt(i,j,k,na)
# +ab(2,ko)*dudt(i,j,k,nb)
# +ab(3,ko)*dudt(i,j,k,nc))
enddo
u(1,j,k)=0.
u(in,j,k)=0.
enddo
enddo
do k=slip,kn
do i=1,in
do j=2,jn-1
v(i,j,k)=v(i,j,k)+dt*(ab(1,ko)*dvdt(i,j,k,na)
# +ab(2,ko)*dvdt(i,j,k,nb)
# +ab(3,ko)*dvdt(i,j,k,nc))
enddo
v(i,1,k)=0.
v(i,jn,k)=0.
enddo
enddo
do k=2,kn-1
do j=1,jn
do i=1,in
w(i,j,k)=w(i,j,k)+dt*(ab(1,ko)*dwdt(i,j,k,na)
# +ab(2,ko)*dwdt(i,j,k,nb)
# +ab(3,ko)*dwdt(i,j,k,nc))
w(i,j,1)=0.
w(i,j,kn)=0.
enddo
enddo
enddo
return
end
subroutine pstuff(q,qq) 1
c* compute average p on u-grid; compute density (actually, 1/density) at
c* u-grid nodes
include 'box.size'
include 'box.common'
dimension q(im,jm,km),qq(in,jn,kn)
do k=1,kn
do j=1,jn
do i=1,in
qq(i,j,k)=0.125*(q(ilu(i),jbu(j),kuu(k))+q(ilu(i),jtu(j),kuu(k))
& +q(iru(i),jtu(j),kuu(k))+q(iru(i),jbu(j),kuu(k))
& +q(ilu(i),jbu(j),kdu(k))+q(ilu(i),jtu(j),kdu(k))
& +q(iru(i),jtu(j),kdu(k))+q(iru(i),jbu(j),kdu(k)))
enddo
enddo
enddo
return
end
subroutine maketrns(dtdif) 1,1
include 'box.size'
include 'box.common'
common/spare/dummy(in,jn,kn)
c---- transformation relations on u-grid----
do k=1,kn
do j=1,jn
do i=1,in
c---- compute jacobian for u-grid ----
x1=0.25*(x(ir(i),j,k)-x(i,j,k))*tr(i)
& +0.25*(x(i,j,k)-x(il(i),j,k))*tl(i)
y1=0.25*(y(ir(i),j,k)-y(il(i),j,k))
z1=0.25*(z(ir(i),j,k)-z(il(i),j,k))
x2=0.25*(x(i,jt(j),k)-x(i,jb(j),k))
y2=0.25*(y(i,jt(j),k)-y(i,j,k))*tt(j)
& +0.25*(y(i,j,k)-y(i,jb(j),k))*tb(j)
z2=0.25*(z(i,jt(j),k)-z(i,jb(j),k))
x3=0.25*(x(i,j,ku(k))-x(i,j,kd(k)))
y3=0.25*(y(i,j,ku(k))-y(i,j,kd(k)))
z3=0.25*(z(i,j,ku(k))-z(i,j,k))*tu(k)
& +0.25*(z(i,j,k)-z(i,j,kd(k)))*td(k)
g=x1*(y2*z3-y3*z2)+y1*(x3*z2-x2*z3)+
& z1*(x2*y3-x3*y2)
dummy(i,j,k)=g**.666/vnu(k)
rg=1./g
c---- contravariant base vectors ----
a11(i,j,k)=rg*(y2*z3-y3*z2)
a12(i,j,k)=rg*(x3*z2-x2*z3)
a13(i,j,k)=rg*(x2*y3-x3*y2)
a21(i,j,k)=rg*(y3*z1-y1*z3)
a22(i,j,k)=rg*(x1*z3-x3*z1)
a23(i,j,k)=rg*(x3*y1-x1*y3)
a31(i,j,k)=rg*(y1*z2-y2*z1)
a32(i,j,k)=rg*(z1*x2-z2*x1)
a33(i,j,k)=rg*(x1*y2-x2*y1)
enddo
enddo
enddo
c---- basis vectors on p-grid----
do k=1,km
do j=1,jm
do i=1,im
x1=0.125*(
& (x(irc(i),jtc(j),kuc(k))-x(ilc(i),jtc(j),kuc(k)))
& +(x(irc(i),jbc(j),kuc(k))-x(ilc(i),jbc(j),kuc(k)))
& +(x(irc(i),jtc(j),kdc(k))-x(ilc(i),jtc(j),kdc(k)))
& +(x(irc(i),jbc(j),kdc(k))-x(ilc(i),jbc(j),kdc(k))))
y1=0.125*(
& (y(irc(i),jtc(j),kuc(k))-y(ilc(i),jtc(j),kuc(k)))
& +(y(irc(i),jbc(j),kuc(k))-y(ilc(i),jbc(j),kuc(k)))
& +(y(irc(i),jtc(j),kdc(k))-y(ilc(i),jtc(j),kdc(k)))
& +(y(irc(i),jbc(j),kdc(k))-y(ilc(i),jbc(j),kdc(k))))
z1=0.125*(
& (z(irc(i),jtc(j),kuc(k))-z(ilc(i),jtc(j),kuc(k)))
& +(z(irc(i),jbc(j),kuc(k))-z(ilc(i),jbc(j),kuc(k)))
& +(z(irc(i),jtc(j),kdc(k))-z(ilc(i),jtc(j),kdc(k)))
& +(z(irc(i),jbc(j),kdc(k))-z(ilc(i),jbc(j),kdc(k))))
x2=0.125*(
& (x(irc(i),jtc(j),kuc(k))-x(irc(i),jbc(j),kuc(k)))
& +(x(ilc(i),jtc(j),kuc(k))-x(ilc(i),jbc(j),kuc(k)))
& +(x(irc(i),jtc(j),kdc(k))-x(irc(i),jbc(j),kdc(k)))
& +(x(ilc(i),jtc(j),kdc(k))-x(ilc(i),jbc(j),kdc(k))))
y2=0.125*(
& (y(irc(i),jtc(j),kuc(k))-y(irc(i),jbc(j),kuc(k)))
& +(y(ilc(i),jtc(j),kuc(k))-y(ilc(i),jbc(j),kuc(k)))
& +(y(irc(i),jtc(j),kdc(k))-y(irc(i),jbc(j),kdc(k)))
& +(y(ilc(i),jtc(j),kdc(k))-y(ilc(i),jbc(j),kdc(k))))
z2=0.125*(
& (z(irc(i),jtc(j),kuc(k))-z(irc(i),jbc(j),kuc(k)))
& +(z(ilc(i),jtc(j),kuc(k))-z(ilc(i),jbc(j),kuc(k)))
& +(z(irc(i),jtc(j),kdc(k))-z(irc(i),jbc(j),kdc(k)))
& +(z(ilc(i),jtc(j),kdc(k))-z(ilc(i),jbc(j),kdc(k))))
x3=0.125*(
& (x(irc(i),jtc(j),kuc(k))-x(irc(i),jtc(j),kdc(k)))
& +(x(ilc(i),jtc(j),kuc(k))-x(ilc(i),jtc(j),kdc(k)))
& +(x(irc(i),jbc(j),kuc(k))-x(irc(i),jbc(j),kdc(k)))
& +(x(ilc(i),jbc(j),kuc(k))-x(ilc(i),jbc(j),kdc(k))))
y3=0.125*(
& (y(irc(i),jtc(j),kuc(k))-y(irc(i),jtc(j),kdc(k)))
& +(y(ilc(i),jtc(j),kuc(k))-y(ilc(i),jtc(j),kdc(k)))
& +(y(irc(i),jbc(j),kuc(k))-y(irc(i),jbc(j),kdc(k)))
& +(y(ilc(i),jbc(j),kuc(k))-y(ilc(i),jbc(j),kdc(k))))
z3=0.125*(
& (z(irc(i),jtc(j),kuc(k))-z(irc(i),jtc(j),kdc(k)))
& +(z(ilc(i),jtc(j),kuc(k))-z(ilc(i),jtc(j),kdc(k)))
& +(z(irc(i),jbc(j),kuc(k))-z(irc(i),jbc(j),kdc(k)))
& +(z(ilc(i),jbc(j),kuc(k))-z(ilc(i),jbc(j),kdc(k))))
g=x1*(y2*z3-y3*z2)+y1*(x3*z2-x2*z3)+
& z1*(x2*y3-x3*y2)
rg=1./g
c---- contravariant base vectors on p-grid----
c11(i,j,k)=rg*(y2*z3-y3*z2)
c12(i,j,k)=rg*(x3*z2-x2*z3)
c13(i,j,k)=rg*(x2*y3-x3*y2)
c21(i,j,k)=rg*(y3*z1-y1*z3)
c22(i,j,k)=rg*(x1*z3-x3*z1)
c23(i,j,k)=rg*(x3*y1-x1*y3)
c31(i,j,k)=rg*(y1*z2-y2*z1)
c32(i,j,k)=rg*(z1*x2-z2*x1)
c33(i,j,k)=rg*(x1*y2-x2*y1)
c---alpha used in incmp ---
alpha(i,j,k)=rlx/(
& c11(i,j,k)*c11(i,j,k)+c12(i,j,k)*c12(i,j,k)
& +c13(i,j,k)*c13(i,j,k)+
& c21(i,j,k)*c21(i,j,k)+c22(i,j,k)*c22(i,j,k)
& +c23(i,j,k)*c23(i,j,k)+
& c31(i,j,k)*c31(i,j,k)+c32(i,j,k)*c32(i,j,k)
& +c33(i,j,k)*c33(i,j,k))
enddo
enddo
enddo
c---for diffusion terms
do i=1,in
do j=1,jn
do k=1,kn
g11(i,j,k)=a11(i,j,k)*a11(i,j,k)+a12(i,j,k)*a12(i,j,k)
& +a13(i,j,k)*a13(i,j,k)
g12(i,j,k)=a21(i,j,k)*a11(i,j,k)+a22(i,j,k)*a12(i,j,k)
& +a23(i,j,k)*a13(i,j,k)
g13(i,j,k)=a31(i,j,k)*a11(i,j,k)+a32(i,j,k)*a12(i,j,k)
& +a33(i,j,k)*a13(i,j,k)
g22(i,j,k)=a21(i,j,k)*a21(i,j,k)+a22(i,j,k)*a22(i,j,k)
& +a23(i,j,k)*a23(i,j,k)
g23(i,j,k)=a31(i,j,k)*a21(i,j,k)+a32(i,j,k)*a22(i,j,k)
& +a33(i,j,k)*a23(i,j,k)
g33(i,j,k)=a31(i,j,k)*a31(i,j,k)+a32(i,j,k)*a32(i,j,k)
& +a33(i,j,k)*a33(i,j,k)
end do
end do
end do
do i=1,in
do j=1,jn
do k=1,kn
c---- laplacian of logical coordinate, for diffusion term transformation ----
x11=0.25*(x(ild(i),j,k)-2.*x(icd(i),j,k)+x(ird(i),j,k))
y11=0.25*(y(ild(i),j,k)-2.*y(icd(i),j,k)+y(ird(i),j,k))
z11=0.25*(z(ild(i),j,k)-2.*z(icd(i),j,k)+z(ird(i),j,k))
x22=0.25*(x(i,jbd(j),k)-2.*x(i,jcd(j),k)+x(i,jtd(j),k))
y22=0.25*(y(i,jbd(j),k)-2.*y(i,jcd(j),k)+y(i,jtd(j),k))
z22=0.25*(z(i,jbd(j),k)-2.*z(i,jcd(j),k)+z(i,jtd(j),k))
x33=0.25*(x(i,j,kdd(k))-2.*x(i,j,kcd(k))+x(i,j,kud(k)))
y33=0.25*(y(i,j,kdd(k))-2.*y(i,j,kcd(k))+y(i,j,kud(k)))
z33=0.25*(z(i,j,kdd(k))-2.*z(i,j,kcd(k))+z(i,j,kud(k)))
c---- cross derivatives ----
x12=0.0625*(
& +(x(ir(i),jt(j),k)-x(ir(i),jb(j),k))
& -(x(il(i),jt(j),k)-x(il(i),jb(j),k)))
y12=0.0625*(
& +(y(ir(i),jt(j),k)-y(ir(i),jb(j),k))
& -(y(il(i),jt(j),k)-y(il(i),jb(j),k)))
z12=0.0625*(
& +(z(ir(i),jt(j),k)-z(ir(i),jb(j),k))
& -(z(il(i),jt(j),k)-z(il(i),jb(j),k)))
x13=0.0625*(
& +(x(ir(i),j,ku(k))-x(ir(i),j,kd(k)))
& -(x(il(i),j,ku(k))-x(il(i),j,kd(k))))
y13=0.0625*(
& +(y(ir(i),j,ku(k))-y(ir(i),j,kd(k)))
& -(y(il(i),j,ku(k))-y(il(i),j,kd(k))))
z13=0.0625*(
& +(z(ir(i),j,ku(k))-z(ir(i),j,kd(k)))
& -(z(il(i),j,ku(k))-z(il(i),j,kd(k))))
x23=0.0625*(
& +(x(i,jt(j),ku(k))-x(i,jb(j),ku(k)))
& -(x(i,jt(j),kd(k))-x(i,jb(j),kd(k))))
y23=0.0625*(
& +(y(i,jt(j),ku(k))-y(i,jb(j),ku(k)))
& -(y(i,jt(j),kd(k))-y(i,jb(j),kd(k))))
z23=0.0625*(
& +(z(i,jt(j),ku(k))-z(i,jb(j),ku(k)))
& -(z(i,jt(j),kd(k))-z(i,jb(j),kd(k))))
d2z1(i,j,k)=-a11(i,j,k)*
& (g11(i,j,k)*x11+2*g12(i,j,k)*x12+g22(i,j,k)*x22
& +2*g13(i,j,k)*x13+2*g23(i,j,k)*x23+g33(i,j,k)*x33)
& -a12(i,j,k)*
& (g11(i,j,k)*y11+2*g12(i,j,k)*y12+g22(i,j,k)*y22
& +2*g13(i,j,k)*y13+2*g23(i,j,k)*y23+g33(i,j,k)*y33)
& -a13(i,j,k)*
& (g11(i,j,k)*z11+2*g12(i,j,k)*z12+g22(i,j,k)*z22
& +2*g13(i,j,k)*z13+2*g23(i,j,k)*z23+g33(i,j,k)*z33)
d2z2(i,j,k)=-a21(i,j,k)*
& (g11(i,j,k)*x11+2*g12(i,j,k)*x12+g22(i,j,k)*x22
& +2*g13(i,j,k)*x13+2*g23(i,j,k)*x23+g33(i,j,k)*x33)
& -a22(i,j,k)*
& (g11(i,j,k)*y11+2*g12(i,j,k)*y12+g22(i,j,k)*y22
& +2*g13(i,j,k)*y13+2*g23(i,j,k)*y23+g33(i,j,k)*y33)
& -a23(i,j,k)*
& (g11(i,j,k)*z11+2*g12(i,j,k)*z12+g22(i,j,k)*z22
& +2*g13(i,j,k)*z13+2*g23(i,j,k)*z23+g33(i,j,k)*z33)
d2z3(i,j,k)=-a31(i,j,k)*
& (g11(i,j,k)*x11+2*g12(i,j,k)*x12+g22(i,j,k)*x22
& +2*g13(i,j,k)*x13+2*g23(i,j,k)*x23+g33(i,j,k)*x33)
& -a32(i,j,k)*
& (g11(i,j,k)*y11+2*g12(i,j,k)*y12+g22(i,j,k)*y22
& +2*g13(i,j,k)*y13+2*g23(i,j,k)*y23+g33(i,j,k)*y33)
& -a33(i,j,k)*
& (g11(i,j,k)*z11+2*g12(i,j,k)*z12+g22(i,j,k)*z22
& +2*g13(i,j,k)*z13+2*g23(i,j,k)*z23+g33(i,j,k)*z33)
end do
end do
end do
c do n=1,in
c write (*,*) n,dummy(n,n,1)
c end do
dtdif=rmin
(dummy)
return
end
subroutine diffus(dudt,dvdt,dwdt) 1
c*
c** updated 11 August to account for variable viscosity
c
*
include 'box.size'
include 'box.common'
dimension dudt(in,jn,kn),dvdt(in,jn,kn),
& dwdt(in,jn,kn)
do 10 k=slip,kn
do 10 j=1,jn
do i=1,in
c---- calculate diffusion term
dnud3=a33(i,j,k)*0.25*(vnu(ku(k))-vnu(kd(k)))
c* u
dud1=0.25*(qr(i)*u(ir(i),j,k)
& -ql(i)*u(il(i),j,k))
dud2=0.25*(u(i,jt(j),k)
& -u(i,jb(j),k))
dud3=0.25*(u(i,j,ku(k))
& -u(i,j,kd(k)))
diffu=
& g11(i,j,k)*0.25*(qr(i)*u(ir(i),j,k)
& -2.*u(i,j,k)
& +ql(i)*u(il(i),j,k))
& +g22(i,j,k)*0.25*(u(i,jt(j),k)
& -2.*u(i,j,k)
& +u(i,jb(j),k))
& +g33(i,j,k)*0.25*(u(i,j,ku(k))
& -2.*u(i,j,k)
& +u(i,j,kd(k)))
& +2.*g12(i,j,k)*0.0625*(
& +(qr(i)*u(ir(i),jt(j),k)
& -ql(i)*u(il(i),jt(j),k))
& -(qr(i)*u(ir(i),jb(j),k)
& -ql(i)*u(il(i),jb(j),k)))
& +2.*g13(i,j,k)*0.0625*(
& +(qr(i)*u(ir(i),j,ku(k))
& -ql(i)*u(il(i),j,ku(k)))
& -(qr(i)*u(ir(i),j,kd(k))
& -ql(i)*u(il(i),j,kd(k))))
& +2.*g23(i,j,k)*0.0625*(
& +(u(i,jt(j),ku(k))
& -u(i,jb(j),ku(k)))
& -(u(i,jt(j),kd(k))
& -u(i,jb(j),kd(k))))
& +d2z1(i,j,k)*dud1
& +d2z2(i,j,k)*dud2
& +d2z3(i,j,k)*dud3
c* v
dvd1=0.25*(v(ir(i),j,k)
& -v(il(i),j,k))
dvd2=0.25*(qt(j)*v(i,jt(j),k)
& -qb(j)*v(i,jb(j),k))
dvd3=0.25*(v(i,j,ku(k))
& -v(i,j,kd(k)))
diffv=
& g11(i,j,k)*0.25*(v(ir(i),j,k)
& -2.*v(i,j,k)
& +v(il(i),j,k))
& +g22(i,j,k)*0.25*(qt(j)*v(i,jt(j),k)
& -2.*v(i,j,k)
& +qb(j)*v(i,jb(j),k))
& +g33(i,j,k)*0.25*(v(i,j,ku(k))
& -2.*v(i,j,k)
& +v(i,j,kd(k)))
& +2.*g12(i,j,k)*0.0625*(
& +(qt(j)*v(ir(i),jt(j),k)
& -qt(j)*v(il(i),jt(j),k))
& -(qb(j)*v(ir(i),jb(j),k)
& -qb(j)*v(il(i),jb(j),k)))
& +2.*g13(i,j,k)*0.0625*(
& +(v(ir(i),j,ku(k))
& -v(il(i),j,ku(k)))
& -(v(ir(i),j,kd(k))
& -v(il(i),j,kd(k))))
& +2.*g23(i,j,k)*0.0625*(
& +(qt(j)*v(i,jt(j),ku(k))
& -qb(j)*v(i,jb(j),ku(k)))
& -(qt(j)*v(i,jt(j),kd(k))
& -qb(j)*v(i,jb(j),kd(k))))
& +d2z1(i,j,k)*dvd1
& +d2z2(i,j,k)*dvd2
& +d2z3(i,j,k)*dvd3
c* w
dwd1=0.25*(w(ir(i),j,k)
& -w(il(i),j,k))
dwd2=0.25*(w(i,jt(j),k)
& -w(i,jb(j),k))
dwd3=0.25*(qu(k)*w(i,j,ku(k))
& -qd(k)*w(i,j,kd(k)))
diffw=
& g11(i,j,k)*0.25*(w(ir(i),j,k)
& -2.*w(i,j,k)
& +w(il(i),j,k))
& +g22(i,j,k)*0.25*(w(i,jt(j),k)
& -2.*w(i,j,k)
& +w(i,jb(j),k))
& +g33(i,j,k)*0.25*(qu(k)*w(i,j,ku(k))
& -2.*w(i,j,k)
& +qd(k)*w(i,j,kd(k)))
& +2.*g12(i,j,k)*0.0625*(
& +(w(ir(i),jt(j),k)
& -w(ir(i),jb(j),k))
& -(w(il(i),jt(j),k)
& -w(il(i),jb(j),k)))
& +2.*g13(i,j,k)*0.0625*(
& +(qu(k)*w(ir(i),j,ku(k))
& -qu(k)*w(il(i),j,ku(k)))
& -(qd(k)*w(ir(i),j,kd(k))
& -qd(k)*w(il(i),j,kd(k))))
& +2.*g23(i,j,k)*0.0625*(
& +(qu(k)*w(i,jt(j),ku(k))
& -qu(k)*w(i,jb(j),ku(k)))
& -(qd(k)*w(i,jt(j),kd(k))
& -qd(k)*w(i,jb(j),kd(k))))
& +d2z1(i,j,k)*dwd1
& +d2z2(i,j,k)*dwd2
& +d2z3(i,j,k)*dwd3
c---- terms due to variable viscosity:
unuterm=(a13(i,j,k)*dud1+a23(i,j,k)*dud2+a33(i,j,k)*dud3
& +a11(i,j,k)*dwd1+a21(i,j,k)*dwd2+a31(i,j,k)*dwd3)*dnud3
vnuterm=(a13(i,j,k)*dvd1+a23(i,j,k)*dvd2+a33(i,j,k)*dvd3
& +a12(i,j,k)*dwd1+a22(i,j,k)*dwd2+a32(i,j,k)*dwd3)*dnud3
wnuterm=(a13(i,j,k)*dwd1+a23(i,j,k)*dwd2+a33(i,j,k)*dwd3)
& *dnud3*2.
c---- add diffusion to other terms ----
dudt(i,j,k)=dudt(i,j,k)+vnu(k)*diffu+unuterm
dvdt(i,j,k)=dvdt(i,j,k)+vnu(k)*diffv+vnuterm
dwdt(i,j,k)=dwdt(i,j,k)+vnu(k)*diffw+wnuterm
enddo
10 continue
return
end
subroutine advect(dudt,dvdt,dwdt,vcmax) 1
c*
c** compute advection and buoyancy terms
c*
include 'box.size'
include 'box.common'
dimension dudt(in,jn,kn),dvdt(in,jn,kn),
& dwdt(in,jn,kn)
common/spare/uc(in,jn,kn),vc(in,jn,kn),wc(in,jn,kn),
# dwd1(in),dwd2(in),dwd3(in),
# dud1(in),dud2(in),dud3(in),dvd1(in),dvd2(in),dvd3(in)
denom=1./120.
factor=1.-exp(-2.*time)
dx=1.e20
do k=1,kn
do j=1,jn
do i=1,in
c---- compute contravariant velocity components
d1=u(i,j,k)
d2=v(i,j,k)
d3=w(i,j,k)
uc(i,j,k)=a11(i,j,k)*d1+a12(i,j,k)*d2+a13(i,j,k)*d3
vc(i,j,k)=a21(i,j,k)*d1+a22(i,j,k)*d2+a23(i,j,k)*d3
wc(i,j,k)=a31(i,j,k)*d1+a32(i,j,k)*d2+a33(i,j,k)*d3
c---- compute horizontal advection terms
c**** 5th order upwind (horizontal and vertical) ****
if(uc(i,j,k).gt.0.) then
dwd1(i)=(-3.*w(ir2(i),j,k)+30.*w(ir(i),j,k)+20.*w(i,j,k)
& -60.*w(il(i),j,k)+15.*w(il2(i),j,k)
& -2.*w(il3(i),j,k))*denom
dvd1(i)=(-3.*v(ir2(i),j,k)+30.*v(ir(i),j,k)+20.*v(i,j,k)
& -60.*v(il(i),j,k)+15.*v(il2(i),j,k)
& -2.*v(il3(i),j,k))*denom
dud1(i)=(-3.*qr2(i)*u(ir2(i),j,k)+30.*qr(i)*u(ir(i),j,k)
& +20.*u(i,j,k)
& -60.*ql(i)*u(il(i),j,k)+15.*ql2(i)*u(il2(i),j,k)
& -2.*ql3(i)*u(il3(i),j,k))*denom
else
dwd1(i)=(2.*w(ir3(i),j,k)-15.*w(ir2(i),j,k)+60.*w(ir(i),j,k)
& -20.*w(i,j,k)-30.*w(il(i),j,k)+3.*w(il2(i),j,k))*denom
dvd1(i)=(2.*v(ir3(i),j,k)-15.*v(ir2(i),j,k)+60.*v(ir(i),j,k)
& -20.*v(i,j,k)-30.*v(il(i),j,k)+3.*v(il2(i),j,k))*denom
dud1(i)=(2.*qr3(i)*u(ir3(i),j,k)-15.*qr2(i)*u(ir2(i),j,k)
& +60.*qr(i)*u(ir(i),j,k)-20.*u(i,j,k)
& -30.*ql(i)*u(il(i),j,k)+3.*ql2(i)*u(il2(i),j,k))*denom
endif
if(vc(i,j,k).gt.0.) then
dwd2(i)=(-3.*w(i,jt2(j),k)+30.*w(i,jt(j),k)+20.*w(i,j,k)
& -60.*w(i,jb(j),k)+15.*w(i,jb2(j),k)
& -2.*w(i,jb3(j),k))*denom
dvd2(i)=(-3.*qt2(j)*v(i,jt2(j),k)+30.*qt(j)*v(i,jt(j),k)
& +20.*v(i,j,k)
& -60.*qb(j)*v(i,jb(j),k)+15.*qb2(j)*v(i,jb2(j),k)
& -2.*qb3(j)*v(i,jb3(j),k))*denom
dud2(i)=(-3.*u(i,jt2(j),k)+30.*u(i,jt(j),k)+20.*u(i,j,k)
& -60.*u(i,jb(j),k)+15.*u(i,jb2(j),k)
& -2.*u(i,jb3(j),k))*denom
else
dwd2(i)=(2.*w(i,jt3(j),k)-15.*w(i,jt2(j),k)+60.*w(i,jt(j),k)
& -20.*w(i,j,k)-30.*w(i,jb(j),k)+3.*w(i,jb2(j),k))*denom
dvd2(i)=(2.*qt3(j)*v(i,jt3(j),k)-15.*qt2(j)*v(i,jt2(j),k)
& +60.*qt(j)*v(i,jt(j),k)-20.*v(i,j,k)
& -30.*qb(j)*v(i,jb(j),k)+3.*qb2(j)*v(i,jb2(j),k))*denom
dud2(i)=(2.*u(i,jt3(j),k)-15.*u(i,jt2(j),k)+60.*u(i,jt(j),k)
& -20.*u(i,j,k)-30.*u(i,jb(j),k)+3.*u(i,jb2(j),k))*denom
endif
c---- combine terms ----
dudt(i,j,k)=-uc(i,j,k)*dud1(i)-vc(i,j,k)*dud2(i)
& +swirl*v(i,j,k)
dvdt(i,j,k)=-uc(i,j,k)*dvd1(i)-vc(i,j,k)*dvd2(i)
& -swirl*u(i,j,k)
dwdt(i,j,k)=-uc(i,j,k)*dwd1(i)-vc(i,j,k)*dwd2(i)
& +b(i,j,k)*factor
enddo
enddo
enddo
c---- FOR VERTICAL LEVELS ABOVE K=3:
do k=4,kn
do j=1,jn
do i=1,in
if(wc(i,j,k).gt.0.) then
dwd3(i)=(-3.*qu2(k)*w(i,j,ku2(k))+30.*qu(k)*w(i,j,ku(k))
& +20.*w(i,j,k)-60.*qd(k)*w(i,j,kd(k))
& +15.*qd2(k)*w(i,j,kd2(k))
& -2.*qd3(k)*w(i,j,kd3(k)))*denom
dvd3(i)=(-3.*v(i,j,ku2(k))+30.*v(i,j,ku(k))+20.*v(i,j,k)
& -60.*v(i,j,kd(k))+15.*v(i,j,kd2(k))
& -2.*v(i,j,kd3(k)))*denom
dud3(i)=(-3.*u(i,j,ku2(k))+30.*u(i,j,ku(k))+20.*u(i,j,k)
& -60.*u(i,j,kd(k))+15.*u(i,j,kd2(k))
& -2.*u(i,j,kd3(k)))*denom
else
dwd3(i)=(2.*qu3(k)*w(i,j,ku3(k))-15.*qu2(k)*w(i,j,ku2(k))
& +60.*qu(k)*w(i,j,ku(k))-20.*w(i,j,k)
& -30.*qd(k)*w(i,j,kd(k))+3.*qd2(k)*w(i,j,kd2(k)))*denom
dvd3(i)=(2.*v(i,j,ku3(k))-15.*v(i,j,ku2(k))+60.*v(i,j,ku(k))
& -20.*v(i,j,k)-30.*v(i,j,kd(k))+3.*v(i,j,kd2(k)))*denom
dud3(i)=(2.*u(i,j,ku3(k))-15.*u(i,j,ku2(k))+60.*u(i,j,ku(k))
& -20.*u(i,j,k)-30.*u(i,j,kd(k))+3.*u(i,j,kd2(k)))*denom
endif
dudt(i,j,k)=dudt(i,j,k)-wc(i,j,k)*dud3(i)
dvdt(i,j,k)=dvdt(i,j,k)-wc(i,j,k)*dvd3(i)
dwdt(i,j,k)=dwdt(i,j,k)-wc(i,j,k)*dwd3(i)
enddo
enddo
enddo
c---- FOR 2ND VERTICAL GRID LEVEL ABOVE SURFACE ----
k=3
do j=1,jn
do i=1,in
if(wc(i,j,k).gt.0.) then
dwd3(i)=(2.*qu(k)*w(i,j,ku(k))+3.*w(i,j,k)
& -6.*qd(k)*w(i,j,kd(k))+qd2(k)*w(i,j,kd2(k)))/12.
dvd3(i)=(2.*v(i,j,ku(k))+3.*v(i,j,k)-6.*v(i,j,kd(k))
& +v(i,j,kd2(k)))/12.
dud3(i)=(2.*u(i,j,ku(k))+3.*u(i,j,k)-6.*u(i,j,kd(k))
& +u(i,j,kd2(k)))/12.
else
dwd3(i)=(-qu2(k)*w(i,j,ku2(k))+6.*qu(k)*w(i,j,ku(k))
& -3.*w(i,j,k)-2.*qd(k)*w(i,j,kd(k)))/12.
dvd3(i)=(-v(i,j,ku2(k))+6.*v(i,j,ku(k))-3.*v(i,j,k)
& -2.*v(i,j,kd(k)))/12.
dud3(i)=(-u(i,j,ku2(k))+6.*u(i,j,ku(k))-3.*u(i,j,k)
& -2.*u(i,j,kd(k)))/12.
endif
dudt(i,j,k)=dudt(i,j,k)-wc(i,j,k)*dud3(i)
dvdt(i,j,k)=dvdt(i,j,k)-wc(i,j,k)*dvd3(i)
dwdt(i,j,k)=dwdt(i,j,k)-wc(i,j,k)*dwd3(i)
enddo
enddo
c---- FOR 1ST VERTICAL GRID LEVEL ABOVE SURFACE:
k=2
do j=1,jn
do i=1,in
if(wc(i,j,k).gt.0.) then
dwd3(i)=(w(i,j,k)-qd(k)*w(i,j,kd(k)))*0.5
dvd3(i)=(v(i,j,k)-v(i,j,kd(k)))*0.5
dud3(i)=(u(i,j,k)-u(i,j,kd(k)))*0.5
else
dwd3(i)=(qu(k)*w(i,j,ku(k))-w(i,j,k))*0.5
dvd3(i)=(v(i,j,ku(k))-v(i,j,k))*0.5
dud3(i)=(u(i,j,ku(k))-u(i,j,k))*0.5
endif
dudt(i,j,k)=dudt(i,j,k)-wc(i,j,k)*dud3(i)
dvdt(i,j,k)=dvdt(i,j,k)-wc(i,j,k)*dvd3(i)
dwdt(i,j,k)=dwdt(i,j,k)-wc(i,j,k)*dwd3(i)
enddo
enddo
vcmax=amax1(rm(uc),rm(vc),rm(wc))
return
end
subroutine advect3(dudt,dvdt,dwdt,vcmax) 1
c*
c** compute advection and buoyancy terms
c*
include 'box.size'
include 'box.common'
dimension dudt(in,jn,kn),dvdt(in,jn,kn),
& dwdt(in,jn,kn)
common/spare/uc(in,jn,kn),vc(in,jn,kn),wc(in,jn,kn),
# dwd1(in),dwd2(in),dwd3(in),
# dud1(in),dud2(in),dud3(in),dvd1(in),dvd2(in),dvd3(in)
denom=1./120.
twl=1./12.
factor=1.-exp(-2.*time)
dx=1.e20
do k=1,kn
do j=1,jn
do i=1,in
c---- compute contravariant velocity components
d1=u(i,j,k)
d2=v(i,j,k)
d3=w(i,j,k)
uc(i,j,k)=a11(i,j,k)*d1+a12(i,j,k)*d2+a13(i,j,k)*d3
vc(i,j,k)=a21(i,j,k)*d1+a22(i,j,k)*d2+a23(i,j,k)*d3
wc(i,j,k)=a31(i,j,k)*d1+a32(i,j,k)*d2+a33(i,j,k)*d3
c---- compute horizontal advection terms
c**** 5th order upwind (horizontal and vertical) ****
if(uc(i,j,k).gt.0.) then
dwd1(i)=(2.*w(ir(i),j,k)+3.*w(i,j,k)
& -6.*w(il(i),j,k)+w(il2(i),j,k))*twl
dvd1(i)=(2.*v(ir(i),j,k)+3.*v(i,j,k)
& -6.*v(il(i),j,k)+v(il2(i),j,k))*twl
dud1(i)=(2.*qr(i)*u(ir(i),j,k)
& +3.*u(i,j,k)
& -6.*ql(i)*u(il(i),j,k)+ql2(i)*u(il2(i),j,k)
& )*twl
else
dwd1(i)=(-w(ir2(i),j,k)+6.*w(ir(i),j,k)
& -3.*w(i,j,k)-2.*w(il(i),j,k))*twl
dvd1(i)=(-v(ir2(i),j,k)+6.*v(ir(i),j,k)
& -3.*v(i,j,k)-2.*v(il(i),j,k))*twl
dud1(i)=(-qr2(i)*u(ir2(i),j,k)
& +6.*qr(i)*u(ir(i),j,k)-3.*u(i,j,k)
& -2.*ql(i)*u(il(i),j,k))*twl
endif
if(vc(i,j,k).gt.0.) then
dwd2(i)=(2.*w(i,jt(j),k)+3.*w(i,j,k)
& -6.*w(i,jb(j),k)+1.*w(i,jb2(j),k)
& )*twl
dvd2(i)=(2.*qt(j)*v(i,jt(j),k)
& +3.*v(i,j,k)
& -6.*qb(j)*v(i,jb(j),k)+1.*qb2(j)*v(i,jb2(j),k)
& )*twl
dud2(i)=(2.*u(i,jt(j),k)+3.*u(i,j,k)
& -6.*u(i,jb(j),k)+1.*u(i,jb2(j),k)
& )*twl
else
dwd2(i)=(-w(i,jt2(j),k)+6.*w(i,jt(j),k)
& -3.*w(i,j,k)-2.*w(i,jb(j),k))*twl
dvd2(i)=(-1.*qt2(j)*v(i,jt2(j),k)
& +6.*qt(j)*v(i,jt(j),k)-3.*v(i,j,k)
& -2.*qb(j)*v(i,jb(j),k))*twl
dud2(i)=(-u(i,jt2(j),k)+6.*u(i,jt(j),k)
& -3.*u(i,j,k)-2.*u(i,jb(j),k))*twl
endif
c---- combine terms ----
dudt(i,j,k)=-uc(i,j,k)*dud1(i)-vc(i,j,k)*dud2(i)
& +swirl*v(i,j,k)
dvdt(i,j,k)=-uc(i,j,k)*dvd1(i)-vc(i,j,k)*dvd2(i)
& -swirl*u(i,j,k)
dwdt(i,j,k)=-uc(i,j,k)*dwd1(i)-vc(i,j,k)*dwd2(i)
& +b(i,j,k)*factor
enddo
enddo
enddo
c---- FOR VERTICAL LEVELS ABOVE K=2:
do k=3,kn
do j=1,jn
do i=1,in
if(wc(i,j,k).gt.0.) then
dwd3(i)=(2.*qu(k)*w(i,j,ku(k))+3.*w(i,j,k)
& -6.*qd(k)*w(i,j,kd(k))+qd2(k)*w(i,j,kd2(k)))/12.
dvd3(i)=(2.*v(i,j,ku(k))+3.*v(i,j,k)-6.*v(i,j,kd(k))
& +v(i,j,kd2(k)))/12.
dud3(i)=(2.*u(i,j,ku(k))+3.*u(i,j,k)-6.*u(i,j,kd(k))
& +u(i,j,kd2(k)))/12.
else
dwd3(i)=(-qu2(k)*w(i,j,ku2(k))+6.*qu(k)*w(i,j,ku(k))
& -3.*w(i,j,k)-2.*qd(k)*w(i,j,kd(k)))/12.
dvd3(i)=(-v(i,j,ku2(k))+6.*v(i,j,ku(k))-3.*v(i,j,k)
& -2.*v(i,j,kd(k)))/12.
dud3(i)=(-u(i,j,ku2(k))+6.*u(i,j,ku(k))-3.*u(i,j,k)
& -2.*u(i,j,kd(k)))/12.
endif
dudt(i,j,k)=dudt(i,j,k)-wc(i,j,k)*dud3(i)
dvdt(i,j,k)=dvdt(i,j,k)-wc(i,j,k)*dvd3(i)
dwdt(i,j,k)=dwdt(i,j,k)-wc(i,j,k)*dwd3(i)
enddo
enddo
enddo
c---- FOR 1ST VERTICAL GRID LEVEL ABOVE SURFACE:
k=2
do j=1,jn
do i=1,in
if(wc(i,j,k).gt.0.) then
dwd3(i)=(w(i,j,k)-qd(k)*w(i,j,kd(k)))*0.5
dvd3(i)=(v(i,j,k)-v(i,j,kd(k)))*0.5
dud3(i)=(u(i,j,k)-u(i,j,kd(k)))*0.5
else
dwd3(i)=(qu(k)*w(i,j,ku(k))-w(i,j,k))*0.5
dvd3(i)=(v(i,j,ku(k))-v(i,j,k))*0.5
dud3(i)=(u(i,j,ku(k))-u(i,j,k))*0.5
endif
dudt(i,j,k)=dudt(i,j,k)-wc(i,j,k)*dud3(i)
dvdt(i,j,k)=dvdt(i,j,k)-wc(i,j,k)*dvd3(i)
dwdt(i,j,k)=dwdt(i,j,k)-wc(i,j,k)*dwd3(i)
enddo
enddo
vcmax=amax1(rm(uc),rm(vc),rm(wc))
return
end
subroutine incmp(dudt,dvdt,dwdt) 1,2
c*
c** solve for pressure of incompressible flow -- invert laplcian using jacobi
c** iteration
c*
include 'box.size'
include 'box.common'
dimension dudt(in,jn,kn),dvdt(in,jn,kn),dwdt(in,jn,kn)
common/spare/dqdt(in,jn,kn),drdt(in,jn,kn),dsdt(in,jn,kn)
# ,dum(im,jm,km)
c rdt=0.5/dt
rdt=gamma/dt
c---- continuity equation ----
do k=1,km
do j=1,jm
do i=1,im
divu1=0.125*(
& u(irc(i),jtc(j),kuc(k))-u(ilc(i),jtc(j),kuc(k))
& +u(irc(i),jbc(j),kuc(k))-u(ilc(i),jbc(j),kuc(k))
& +u(irc(i),jtc(j),kdc(k))-u(ilc(i),jtc(j),kdc(k))
& +u(irc(i),jbc(j),kdc(k))-u(ilc(i),jbc(j),kdc(k)))
divu2=0.125*(
& u(irc(i),jtc(j),kuc(k))-u(irc(i),jbc(j),kuc(k))
& +u(ilc(i),jtc(j),kuc(k))-u(ilc(i),jbc(j),kuc(k))
& +u(irc(i),jtc(j),kdc(k))-u(irc(i),jbc(j),kdc(k))
& +u(ilc(i),jtc(j),kdc(k))-u(ilc(i),jbc(j),kdc(k)))
divu3=0.125*(
& u(irc(i),jtc(j),kuc(k))-u(irc(i),jtc(j),kdc(k))
& +u(ilc(i),jtc(j),kuc(k))-u(ilc(i),jtc(j),kdc(k))
& +u(irc(i),jbc(j),kuc(k))-u(irc(i),jbc(j),kdc(k))
& +u(ilc(i),jbc(j),kuc(k))-u(ilc(i),jbc(j),kdc(k)))
c*
divv1=0.125*(
& v(irc(i),jtc(j),kuc(k))-v(ilc(i),jtc(j),kuc(k))
& +v(irc(i),jbc(j),kuc(k))-v(ilc(i),jbc(j),kuc(k))
& +v(irc(i),jtc(j),kdc(k))-v(ilc(i),jtc(j),kdc(k))
& +v(irc(i),jbc(j),kdc(k))-v(ilc(i),jbc(j),kdc(k)))
divv2=0.125*(
& v(irc(i),jtc(j),kuc(k))-v(irc(i),jbc(j),kuc(k))
& +v(ilc(i),jtc(j),kuc(k))-v(ilc(i),jbc(j),kuc(k))
& +v(irc(i),jtc(j),kdc(k))-v(irc(i),jbc(j),kdc(k))
& +v(ilc(i),jtc(j),kdc(k))-v(ilc(i),jbc(j),kdc(k)))
divv3=0.125*(
& v(irc(i),jtc(j),kuc(k))-v(irc(i),jtc(j),kdc(k))
& +v(ilc(i),jtc(j),kuc(k))-v(ilc(i),jtc(j),kdc(k))
& +v(irc(i),jbc(j),kuc(k))-v(irc(i),jbc(j),kdc(k))
& +v(ilc(i),jbc(j),kuc(k))-v(ilc(i),jbc(j),kdc(k)))
c*
divw1=0.125*(
& w(irc(i),jtc(j),kuc(k))-w(ilc(i),jtc(j),kuc(k))
& +w(irc(i),jbc(j),kuc(k))-w(ilc(i),jbc(j),kuc(k))
& +w(irc(i),jtc(j),kdc(k))-w(ilc(i),jtc(j),kdc(k))
& +w(irc(i),jbc(j),kdc(k))-w(ilc(i),jbc(j),kdc(k)))
divw2=0.125*(
& w(irc(i),jtc(j),kuc(k))-w(irc(i),jbc(j),kuc(k))
& +w(ilc(i),jtc(j),kuc(k))-w(ilc(i),jbc(j),kuc(k))
& +w(irc(i),jtc(j),kdc(k))-w(irc(i),jbc(j),kdc(k))
& +w(ilc(i),jtc(j),kdc(k))-w(ilc(i),jbc(j),kdc(k)))
divw3=0.125*(
& w(irc(i),jtc(j),kuc(k))-w(irc(i),jtc(j),kdc(k))
& +w(ilc(i),jtc(j),kuc(k))-w(ilc(i),jtc(j),kdc(k))
& +w(irc(i),jbc(j),kuc(k))-w(irc(i),jbc(j),kdc(k))
& +w(ilc(i),jbc(j),kuc(k))-w(ilc(i),jbc(j),kdc(k)))
dum(i,j,k)=rdt*
& (c11(i,j,k)*divu1+c21(i,j,k)*divu2+c31(i,j,k)*divu3
& +c12(i,j,k)*divv1+c22(i,j,k)*divv2+c32(i,j,k)*divv3
& +c13(i,j,k)*divw1+c23(i,j,k)*divw2+c33(i,j,k)*divw3)
enddo
enddo
enddo
do 100 sn=1.,pit
call pforce
(dqdt,dudt,drdt,dvdt,dsdt,dwdt)
do k=1,km
do j=1,jm
do i=1,im
divu1=0.125*(
& dqdt(irc(i),jtc(j),kuc(k))-dqdt(ilc(i),jtc(j),kuc(k))
& +dqdt(irc(i),jbc(j),kuc(k))-dqdt(ilc(i),jbc(j),kuc(k))
& +dqdt(irc(i),jtc(j),kdc(k))-dqdt(ilc(i),jtc(j),kdc(k))
& +dqdt(irc(i),jbc(j),kdc(k))-dqdt(ilc(i),jbc(j),kdc(k)))
divu2=0.125*(
& dqdt(irc(i),jtc(j),kuc(k))-dqdt(irc(i),jbc(j),kuc(k))
& +dqdt(ilc(i),jtc(j),kuc(k))-dqdt(ilc(i),jbc(j),kuc(k))
& +dqdt(irc(i),jtc(j),kdc(k))-dqdt(irc(i),jbc(j),kdc(k))
& +dqdt(ilc(i),jtc(j),kdc(k))-dqdt(ilc(i),jbc(j),kdc(k)))
divu3=0.125*(
& dqdt(irc(i),jtc(j),kuc(k))-dqdt(irc(i),jtc(j),kdc(k))
& +dqdt(ilc(i),jtc(j),kuc(k))-dqdt(ilc(i),jtc(j),kdc(k))
& +dqdt(irc(i),jbc(j),kuc(k))-dqdt(irc(i),jbc(j),kdc(k))
& +dqdt(ilc(i),jbc(j),kuc(k))-dqdt(ilc(i),jbc(j),kdc(k)))
c*
divv1=0.125*(
& drdt(irc(i),jtc(j),kuc(k))-drdt(ilc(i),jtc(j),kuc(k))
& +drdt(irc(i),jbc(j),kuc(k))-drdt(ilc(i),jbc(j),kuc(k))
& +drdt(irc(i),jtc(j),kdc(k))-drdt(ilc(i),jtc(j),kdc(k))
& +drdt(irc(i),jbc(j),kdc(k))-drdt(ilc(i),jbc(j),kdc(k)))
divv2=0.125*(
& drdt(irc(i),jtc(j),kuc(k))-drdt(irc(i),jbc(j),kuc(k))
& +drdt(ilc(i),jtc(j),kuc(k))-drdt(ilc(i),jbc(j),kuc(k))
& +drdt(irc(i),jtc(j),kdc(k))-drdt(irc(i),jbc(j),kdc(k))
& +drdt(ilc(i),jtc(j),kdc(k))-drdt(ilc(i),jbc(j),kdc(k)))
divv3=0.125*(
& drdt(irc(i),jtc(j),kuc(k))-drdt(irc(i),jtc(j),kdc(k))
& +drdt(ilc(i),jtc(j),kuc(k))-drdt(ilc(i),jtc(j),kdc(k))
& +drdt(irc(i),jbc(j),kuc(k))-drdt(irc(i),jbc(j),kdc(k))
& +drdt(ilc(i),jbc(j),kuc(k))-drdt(ilc(i),jbc(j),kdc(k)))
c*
divw1=0.125*(
& dsdt(irc(i),jtc(j),kuc(k))-dsdt(ilc(i),jtc(j),kuc(k))
& +dsdt(irc(i),jbc(j),kuc(k))-dsdt(ilc(i),jbc(j),kuc(k))
& +dsdt(irc(i),jtc(j),kdc(k))-dsdt(ilc(i),jtc(j),kdc(k))
& +dsdt(irc(i),jbc(j),kdc(k))-dsdt(ilc(i),jbc(j),kdc(k)))
divw2=0.125*(
& dsdt(irc(i),jtc(j),kuc(k))-dsdt(irc(i),jbc(j),kuc(k))
& +dsdt(ilc(i),jtc(j),kuc(k))-dsdt(ilc(i),jbc(j),kuc(k))
& +dsdt(irc(i),jtc(j),kdc(k))-dsdt(irc(i),jbc(j),kdc(k))
& +dsdt(ilc(i),jtc(j),kdc(k))-dsdt(ilc(i),jbc(j),kdc(k)))
divw3=0.125*(
& dsdt(irc(i),jtc(j),kuc(k))-dsdt(irc(i),jtc(j),kdc(k))
& +dsdt(ilc(i),jtc(j),kuc(k))-dsdt(ilc(i),jtc(j),kdc(k))
& +dsdt(irc(i),jbc(j),kuc(k))-dsdt(irc(i),jbc(j),kdc(k))
& +dsdt(ilc(i),jbc(j),kuc(k))-dsdt(ilc(i),jbc(j),kdc(k)))
p(i,j,k)=p(i,j,k)-alpha(i,j,k)*(dum(i,j,k)+
& (c11(i,j,k)*divu1+c21(i,j,k)*divu2+c31(i,j,k)*divu3
& +c12(i,j,k)*divv1+c22(i,j,k)*divv2+c32(i,j,k)*divv3
& +c13(i,j,k)*divw1+c23(i,j,k)*divw2+c33(i,j,k)*divw3))
enddo
enddo
enddo
100 continue
call pforce
(dudt,dudt,dvdt,dvdt,dwdt,dwdt)
return
end
subroutine pforce(dqdt,dudt,drdt,dvdt,dsdt,dwdt) 2
include 'box.size'
include 'box.common'
dimension dudt(in,jn,kn),dvdt(in,jn,kn),
& dwdt(in,jn,kn),dqdt(in,jn,kn),drdt(in,jn,kn),
& dsdt(in,jn,kn)
do k=slip,kn
do j=1,jn
do i=1,in
c---- compute pressure gradient terms ----
dpdxi1=0.125*(
& +(p(iru(i),jtu(j),kuu(k))-p(ilu(i),jtu(j),kuu(k)))
& +(p(iru(i),jbu(j),kuu(k))-p(ilu(i),jbu(j),kuu(k)))
& +(p(iru(i),jtu(j),kdu(k))-p(ilu(i),jtu(j),kdu(k)))
& +(p(iru(i),jbu(j),kdu(k))-p(ilu(i),jbu(j),kdu(k))))
dpdxi2=0.125*(
& +(p(iru(i),jtu(j),kuu(k))-p(iru(i),jbu(j),kuu(k)))
& +(p(ilu(i),jtu(j),kuu(k))-p(ilu(i),jbu(j),kuu(k)))
& +(p(iru(i),jtu(j),kdu(k))-p(iru(i),jbu(j),kdu(k)))
& +(p(ilu(i),jtu(j),kdu(k))-p(ilu(i),jbu(j),kdu(k))))
dpdxi3=0.125*(
& +(p(iru(i),jtu(j),kuu(k))-p(iru(i),jtu(j),kdu(k)))
& +(p(ilu(i),jtu(j),kuu(k))-p(ilu(i),jtu(j),kdu(k)))
& +(p(iru(i),jbu(j),kuu(k))-p(iru(i),jbu(j),kdu(k)))
& +(p(ilu(i),jbu(j),kuu(k))-p(ilu(i),jbu(j),kdu(k))))
c---- combine terms ----
dqdt(i,j,k)=dudt(i,j,k)
& -(a11(i,j,k)*dpdxi1+a21(i,j,k)*dpdxi2
& +a31(i,j,k)*dpdxi3)
drdt(i,j,k)=dvdt(i,j,k)
& -(a12(i,j,k)*dpdxi1+a22(i,j,k)*dpdxi2
& +a32(i,j,k)*dpdxi3)
dsdt(i,j,k)=dwdt(i,j,k)
& -(a13(i,j,k)*dpdxi1+a23(i,j,k)*dpdxi2
& +a33(i,j,k)*dpdxi3)
enddo
enddo
enddo
return
end
function rmin(t) 1
include 'box.size'
dimension t(in,jn,kn)
rmin=t(1,1,1)
do 10 k=1,kn
do 10 j=1,jn
do 10 i=1,in
10 rmin=amin1(rmin,t(i,j,k))
return
end
function rm(t)
c***vectorizable maximum finder
include 'box.size'
dimension t(in,jn,kn)
dimension ts(jn,kn),tt(kn)
do 10 k=1,kn
do 20 j=1,jn
20 ts(j,k)=abs(t(1,j,k))
do 40 i=2,in
do 40 j=1,jn
40 ts(j,k)=amax1(ts(j,k),abs(t(i,j,k)))
10 continue
do 50 k=1,kn
50 tt(k)=ts(1,k)
do 60 j=2,jn
do 60 k=1,kn
60 tt(k)=amax1(ts(j,k),tt(k))
rm=tt(1)
do 70 k=2,kn
70 rm=amax1(rm,tt(k))
return
end
function rmll(t,kk)
c---- diagnose maximum for "low levels"
include 'box.size'
dimension t(in,jn,kn)
rmll=-9999.9
do 10 k=1,kk
c do 10 j=1,jn
c do 10 i=1,in
c changed July 8, 2008
do 10 j=jn/4,3*jn/4
do 10 i=in/4,3*in/4
10 rmll=amax1(rmll,t(i,j,k))
return
end
function rmpll(t,kk)
c---- diagnose minimum pressure for "low levels"
include 'box.size'
dimension t(im,jm,km)
rmpll=+9999.9
do 10 k=1,kk
c do 10 j=1,jm
c do 10 i=1,im
c changed July 8, 2008
do 10 j=jm/4,3*jm/4
do 10 i=im/4,3*im/4
10 rmpll=amin1(rmpll,t(i,j,k))
return
end
function rmp(t)
include 'box.size'
dimension t(im,jm,km)
rmp=t(1,1,1)
do 10 k=1,km
do 10 j=1,jm
do 10 i=1,im
10 rmp=amax1(rmp,abs(t(i,j,k)))
return
end
subroutine makebnds 1
include 'box.size'
include 'box.common'
do i=1,in
ir(i)=i+1
il(i)=i-1
ir2(i)=i+2
il2(i)=i-2
ir3(i)=i+3
il3(i)=i-3
qr(i)=1.
ql(i)=1.
qr2(i)=1.
ql2(i)=1.
qr3(i)=1.
ql3(i)=1.
tr(i)=1.
tl(i)=1.
if(i.eq.1) then
il(i)=ir(i)
ql(i)=-1.
il2(i)=ir2(i)
ql2(i)=-1.
il3(i)=ir3(i)
ql3(i)=-1.
tr(i)=2.
tl(i)=0.
else if(i.eq.2) then
il2(i)=i
ql2(i)=-1.
il3(i)=i+1
ql3(i)=-1.
else if(i.eq.3) then
il3(i)=i-1
ql3(i)=-1.
else if(i.eq.in-2) then
ir3(i)=i+1
qr3(i)=-1
else if(i.eq.in-1) then
ir2(i)=i
qr2(i)=-1.
ir3(i)=i-1
qr3(i)=-1.
else if(i.eq.in) then
ir(i)=il(i)
qr(i)=-1.
ir2(i)=il2(i)
qr2(i)=-1.
ir3(i)=il3(i)
qr3(i)=-1.
tr(i)=0.
tl(i)=2.
endif
enddo
do j=1,jn
jt(j)=j+1
jb(j)=j-1
jt2(j)=j+2
jb2(j)=j-2
jt3(j)=j+3
jb3(j)=j-3
qt(j)=1.
qb(j)=1.
qt2(j)=1.
qb2(j)=1.
qt3(j)=1.
qb3(j)=1.
tt(j)=1.
tb(j)=1.
if(j.eq.1) then
jb(j)=jt(j)
qb(j)=-1.
jb2(j)=jt2(j)
qb2(j)=-1.
jb3(j)=jt3(j)
qb3(j)=-1.
tt(j)=2.
tb(j)=0.
else if(j.eq.2) then
jb2(j)=j
qb2(j)=-1.
jb3(j)=j+1
qb3(j)=-1.
else if(j.eq.3) then
jb3(j)=j-1
qb3(j)=-1.
else if(j.eq.jn-2) then
jt3(j)=j+1
qt3(j)=-1.
else if(j.eq.jn-1) then
jt2(j)=j
qt2(j)=-1.
jt3(j)=j-1
qt3(j)=-1.
else if(j.eq.jn) then
jt(j)=jb(j)
qt(j)=-1.
jt2(j)=jb2(j)
qt2(j)=-1.
jt3(j)=jb3(j)
qt3(j)=-1.
tt(j)=0.
tb(j)=2.
endif
enddo
do k=1,kn
ku(k)=k+1
kd(k)=k-1
ku2(k)=k+2
kd2(k)=k-2
ku3(k)=k+3
kd3(k)=k-3
qu(k)=1.
qd(k)=1.
qu2(k)=1.
qd2(k)=1.
qu3(k)=1.
qd3(k)=1.
tu(k)=1.
td(k)=1.
if(k.eq.1) then
kd(k)=ku(k)
qd(k)=-1.
kd2(k)=ku2(k)
qd2(k)=-1.
kd3(k)=ku3(k)
qd3(k)=-1.
tu(k)=2.
td(k)=0.
else if(k.eq.2) then
kd2(k)=k
qd2(k)=-1.
kd3(k)=k+1
qd3(k)=-1.
else if(k.eq.3) then
kd3(k)=k-1
qd3(k)=-1.
else if(k.eq.kn-2) then
ku3(k)=k+1
qu3(k)=-1.
else if(k.eq.kn-1) then
ku2(k)=k
qu2(k)=-1.
ku3(k)=k-1
qu3(k)=-1.
else if(k.eq.kn) then
ku(k)=kd(k)
qu(k)=-1.
ku2(k)=kd2(k)
qu2(k)=-1.
ku3(k)=kd3(k)
qu3(k)=-1.
tu(k)=0.
td(k)=2.
endif
enddo
do i=1,in
iru(i)=i
ilu(i)=i-1
if(i.eq.in) iru(i)=ilu(i)
if(i.eq.1) ilu(i)=iru(i)
enddo
do j=1,jn
jtu(j)=j
jbu(j)=j-1
if(j.eq.jn) jtu(j)=jbu(j)
if(j.eq.1) jbu(j)=jtu(j)
enddo
do k=1,kn
kuu(k)=k
kdu(k)=k-1
if(k.eq.kn) kuu(k)=kdu(k)
if(k.eq.1) kdu(k)=kuu(k)
enddo
do i=1,im
ilc(i)=i
irc(i)=i+1
enddo
do j=1,jm
jbc(j)=j
jtc(j)=j+1
enddo
do k=1,km
kdc(k)=k
kuc(k)=k+1
enddo
do i=1,in
ild(i)=i-1
icd(i)=i
ird(i)=i+1
if(i.eq.1) then
ild(i)=i
icd(i)=i+1
ird(i)=i+2
endif
if(i.eq.in) then
ild(i)=i
icd(i)=i-1
ird(i)=i-2
endif
enddo
do j=1,jn
jbd(j)=j-1
jcd(j)=j
jtd(j)=j+1
if(j.eq.1) then
jbd(j)=j
jcd(j)=j+1
jtd(j)=j+2
endif
if(j.eq.jn) then
jbd(j)=j
jcd(j)=j-1
jtd(j)=j-2
endif
enddo
do k=1,kn
kdd(k)=k-1
kcd(k)=k
kud(k)=k+1
if(k.eq.1) then
kdd(k)=k
kcd(k)=k+1
kud(k)=k+2
endif
if(k.eq.kn) then
kdd(k)=k
kcd(k)=k-1
kud(k)=k-2
endif
enddo
do i=1,im
irp(i)=i+1
ilp(i)=i-1
if(i.eq.1) then
ilp(i)=irp(i)
else if(i.eq.im) then
irp(i)=ilp(i)
endif
enddo
do j=1,jm
jtp(j)=j+1
jbp(j)=j-1
if(j.eq.1) then
jbp(j)=jtp(j)
else if(j.eq.jm) then
jtp(j)=jbp(j)
endif
enddo
do k=1,km
kup(k)=k+1
kdp(k)=k-1
if(k.eq.1) then
kdp(k)=kup(k)
else if(k.eq.km) then
kup(k)=kdp(k)
endif
enddo
return
end