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