c c Boundary conditions for ghost-fluid methods. c c Copyright (C) 2003-2007 California Institute of Technology c Ralf Deiterding, ralf@cacr.caltech.edu c c ----------------------------------------------------- c Internal reflecting physical boundary conditions c for Euler equations c ----------------------------------------------------- c c Transformation of vector of conserved quantities c into primitives (rho1,rho2,u,v,p) c c ===================================================== subroutine it2euzndrfl(mx,my,meqn,q,qt) c ===================================================== implicit none c common /param/ gamma,gamma1,q0 double precision gamma,gamma1,q0 integer i, j, mx, my, meqn double precision q(meqn,mx,my), qt(meqn,mx,my) c do 10 j = 1, my do 10 i = 1, mx qt(1,i,j) = q(1,i,j) qt(2,i,j) = q(2,i,j) qt(3,i,j) = q(3,i,j)/(q(1,i,j)+q(2,i,j)) qt(4,i,j) = q(4,i,j)/(q(1,i,j)+q(2,i,j)) qt(5,i,j) = gamma1*(q(5,i,j) - q(2,i,j)*q0 - & 0.5d0*(q(3,i,j)**2 + q(4,i,j)**2)/(q(1,i,j)+q(2,i,j))) 10 continue c return end c c ----------------------------------------------------- c c Construction of reflective boundary conditions from c mirrored primitive values and application in c conservative form in local patch c c ===================================================== subroutine ip2euzndrfl(q,mx,my,lb,ub,meqn,nc,idx, & qex,xc,phi,vn,maux,auex,dx,time) c ===================================================== implicit none common /param/ gamma,gamma1,q0 double precision gamma,gamma1,q0 integer mx, my, meqn, maux, nc, idx(2,nc), lb(2), & ub(2) double precision q(meqn, mx, my), qex(meqn,nc), xc(2,nc), & phi(nc), vn(2,nc), auex(maux,nc), dx(2), time c c Local variables c integer i, j, n, stride, getindx double precision rho1, rho2, u, v, p, vl c stride = (ub(1) - lb(1))/(mx-1) c do 100 n = 1, nc i = getindx(idx(1,n), lb(1), stride) j = getindx(idx(2,n), lb(2), stride) c rho1 = qex(1,n) rho2 = qex(2,n) u = -qex(3,n) v = -qex(4,n) p = qex(5,n) c c # Add boundary velocities if available if (maux.ge.2) then u = u + auex(1,n) v = v + auex(2,n) endif c c # Construct normal velocity vector c # Tangential velocity remains unchanged vl = 2.d0*(u*vn(1,n)+v*vn(2,n)) u = qex(3,n) + vl*vn(1,n) v = qex(4,n) + vl*vn(2,n) c q(1,i,j) = rho1 q(2,i,j) = rho2 q(3,i,j) = u*(rho1+rho2) q(4,i,j) = v*(rho1+rho2) q(5,i,j) = p/gamma1+0.5d0*(rho1+rho2)*(u**2+v**2)+rho2*q0 c 100 continue c return end c c c ----------------------------------------------------- c c Injection of conservative extrapolated values in local patch c c ===================================================== subroutine ip2euzndex(q,mx,my,lb,ub,meqn,nc,idx, & qex,xc,phi,vn,maux,auex,dx,time) c ===================================================== c implicit none c common /param/ gamma,gamma1,q0 double precision gamma,gamma1,q0 integer mx, my, meqn, maux, nc, idx(2,nc), lb(2), & ub(2) double precision q(meqn, mx, my), qex(meqn,nc), xc(2,nc), & phi(nc), vn(2,nc), auex(maux,nc), dx(2), time c c Local variables c integer i, j, n, stride, getindx double precision rho1, rho2, u, v, p, vl c stride = (ub(1) - lb(1))/(mx-1) c do 100 n = 1, nc i = getindx(idx(1,n), lb(1), stride) j = getindx(idx(2,n), lb(2), stride) c rho1 = qex(1,n) rho2 = qex(2,n) u = qex(3,n) v = qex(4,n) p = qex(5,n) c c # Prescribe normal velocity vector vl = u*vn(1,n)+v*vn(2,n) u = vl*vn(1,n) v = vl*vn(2,n) c q(1,i,j) = rho1 q(2,i,j) = rho2 q(3,i,j) = u*(rho1+rho2) q(4,i,j) = v*(rho1+rho2) q(5,i,j) = p/gamma1+0.5d0*(rho1+rho2)*(u**2+v**2)+rho2*q0 c 100 continue c return end c