c
c Boundary conditions for ghost-fluid methods.
c
c Copyright (C) 2009 Oak Ridge National Laboratory
c Ralf Deiterding, ralf@cacr.caltech.edu
c
c -----------------------------------------------------
c
c Construction of reflective boundary conditions from
c mirrored values and application in local patch
c
c =====================================================
subroutine ip2acrfl(q,mx,my,lb,ub,meqn,nc,idx,
& qex,xc,phi,vn,maux,auex,dx,time)
c =====================================================
implicit none
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 p, u, v, 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
p = qex(1,n)
u = -qex(2,n)
v = -qex(3,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(2,n) + vl*vn(1,n)
v = qex(3,n) + vl*vn(2,n)
c
q(1,i,j) = p
q(2,i,j) = u
q(3,i,j) = v
c
100 continue
c
return
end
c
c -----------------------------------------------------
c
c Injection of extrapolated values in local patch
c
c =====================================================
subroutine ip2euex(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
double precision gamma,gamma1
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 p, u, v, 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
p = qex(1,n)
u = qex(2,n)
v = qex(3,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) = p
q(2,i,j) = u
q(3,i,j) = v
c
100 continue
c
return
end
c