//velocity stencil
void InflowOutflowHelmholtzDomainBC::getFluxStencil(      VoFStencil&      a_stencil,
                                                    const VolIndex&        a_vof,
                                                    const int&             a_comp,
                                                    const RealVect&        a_dx,
                                                    const int&             a_idir,
                                                    const Side::LoHiSide&  a_side,
                                                    const EBISBox&         a_ebisBox)
{
  bool isInsideTube = false;
  if ((m_doJet2) && (a_side==Side::Hi) && (a_idir == m_flowDir))
    {
      RealVect probLo = RealVect::Zero;
      RealVect loc = EBArith::getVofLocation(a_vof,a_dx,probLo);
      loc[a_idir] += 0.5*a_dx[a_idir]; // loc at face center
      const RealVect tubeCenter = m_jet2PoiseInflowFunc->getTubeCenter();
      Real tubeRadius = m_jet2PoiseInflowFunc->getTubeRadius();
      Real radius = m_jet2PoiseInflowFunc->getRadius(loc);
      CH_assert(loc[m_flowDir] == tubeCenter[m_flowDir]);

// start hardwire
      Real wallThickness = 0.075;
      Real bcFactor = 0.5; // % of outflow face to be set to inflow condition
      ParmParse pp;
      pp.get("wall_thickness",wallThickness);
      tubeRadius += wallThickness * bcFactor /2.0;
// end hardwire

      if (radius <= tubeRadius)
        {
          isInsideTube = true;
        }
    }
  bool isOutflow = (a_side==Side::Hi) && (a_idir==m_flowDir) && (!(isInsideTube)); 

//  bool isOutflow = (a_side==Side::Hi) && (a_idir==m_flowDir);
  bool isSlipWall= ((a_idir!=m_flowDir) && (a_idir != a_comp) && ((m_doSlipWallsHi[a_idir]==1 && a_side == Side::Hi)||(m_doSlipWallsLo[a_idir]==1 && a_side == Side::Lo)));
  if (isOutflow || isSlipWall)
    {
      NeumannPoissonDomainBC neumannBC;
      neumannBC.getFluxStencil(a_stencil, a_vof, a_comp, a_dx, a_idir, a_side, a_ebisBox);
    }
  else
    {
      DirichletPoissonDomainBC diriBC;
      diriBC.setEBOrder(2);
      diriBC.getFluxStencil(a_stencil, a_vof, a_comp, a_dx, a_idir, a_side, a_ebisBox);
    }
}
//pressure stencil
void InflowOutflowPoissonDomainBC::getFluxStencil(      VoFStencil&      a_stencil,
                                                  const VolIndex&        a_vof,
                                                  const int&             a_comp,
                                                  const RealVect&        a_dx,
                                                  const int&             a_idir,
                                                  const Side::LoHiSide&  a_side,
                                                  const EBISBox&         a_ebisBox)
{
  bool isOutflow= (a_side==Side::Hi) && (a_idir==m_flowDir);
  if (!isOutflow)
    {
      NeumannPoissonDomainBC neumannBC;
      neumannBC.setValue(0.0);
      neumannBC.getFluxStencil(a_stencil, a_vof, a_comp, a_dx, a_idir, a_side, a_ebisBox);
    }
  else
    {
      DirichletPoissonDomainBC diriBC;
      diriBC.setValue(0.0);
      diriBC.setEBOrder(1);
      diriBC.getFluxStencil(a_stencil, a_vof, a_comp, a_dx, a_idir, a_side, a_ebisBox);
    }
}
//velocity stencil
void InflowOutflowHelmholtzDomainBC::getFluxStencil(      VoFStencil&      a_stencil,
                                                    const VolIndex&        a_vof,
                                                    const int&             a_comp,
                                                    const RealVect&        a_dx,
                                                    const int&             a_idir,
                                                    const Side::LoHiSide&  a_side,
                                                    const EBISBox&         a_ebisBox)
{
  bool isOutflow = (a_side==Side::Hi) && (a_idir==m_flowDir);
  bool isSlipWall= ((a_idir!=m_flowDir) && (a_idir != a_comp) && ((m_doSlipWallsHi[a_idir]==1 && a_side == Side::Hi)||(m_doSlipWallsLo[a_idir]==1 && a_side == Side::Lo)));
  if (isOutflow || isSlipWall)
    {
      NeumannPoissonDomainBC neumannBC;
      neumannBC.setValue(0.0);
      neumannBC.getFluxStencil(a_stencil, a_vof, a_comp, a_dx, a_idir, a_side, a_ebisBox);
    }
  else
    {
      DirichletPoissonDomainBC diriBC;
      diriBC.setValue(0.0);
      diriBC.setEBOrder(2);
      diriBC.getFluxStencil(a_stencil, a_vof, a_comp, a_dx, a_idir, a_side, a_ebisBox);
    }
}