//called by macEnforceGradientBC, useAreaFrac = false
void InflowOutflowPoissonDomainBC::getFaceGradPhi(Real&                 a_faceFlux,
                                                  const FaceIndex&      a_face,
                                                  const int&            a_comp,
                                                  const EBCellFAB&      a_phi,
                                                  const RealVect&       a_probLo,
                                                  const RealVect&       a_dx,
                                                  const int&            a_idir,
                                                  const Side::LoHiSide& a_side,
                                                  const DataIndex&      a_dit,
                                                  const Real&           a_time,
                                                  const bool&           a_useAreaFrac,
                                                  const RealVect&       a_centroid,
                                                  const bool&           a_useHomogeneous)
{
  bool isOutflow= (a_side==Side::Hi) && (a_idir==m_flowDir);

  if (!isOutflow)
    {
      NeumannPoissonDomainBC neumannBC;
      neumannBC.setValue(0.0);
      neumannBC.getFaceGradPhi(a_faceFlux, a_face, a_comp,a_phi, a_probLo,
                               a_dx, a_idir, a_side, a_dit,a_time,a_useAreaFrac,a_centroid,a_useHomogeneous);
    }
  else
    {
      DirichletPoissonDomainBC diriBC;
      diriBC.setValue(0.0);
      diriBC.getFaceGradPhi(a_faceFlux, a_face, a_comp, a_phi, a_probLo,
                            a_dx, a_idir, a_side, a_dit,a_time,a_useAreaFrac,a_centroid,a_useHomogeneous);
    }
}
//called by macEnforceGradientBC, useAreaFrac = false
void InflowOutflowPoissonDomainBC::getFaceGradPhi(Real&                 a_faceFlux,
                                                  const FaceIndex&      a_face,
                                                  const int&            a_comp,
                                                  const EBCellFAB&      a_phi,
                                                  const RealVect&       a_probLo,
                                                  const RealVect&       a_dx,
                                                  const int&            a_idir,
                                                  const Side::LoHiSide& a_side,
                                                  const DataIndex&      a_dit,
                                                  const Real&           a_time,
                                                  const bool&           a_useAreaFrac,
                                                  const RealVect&       a_centroid,
                                                  const bool&           a_useHomogeneous)
{
  bool isInsideTube = false;
  if ((m_doJet2) && (a_side==Side::Hi) && (a_idir == m_flowDir))
    {
      RealVect probLo = RealVect::Zero;
      RealVect loc = EBArith::getFaceLocation(a_face,a_dx,probLo);
      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);

  if (!isOutflow)
    {
      NeumannPoissonDomainBC neumannBC;
      neumannBC.setValue(0.0);
      neumannBC.getFaceGradPhi(a_faceFlux, a_face, a_comp,a_phi, a_probLo,
                               a_dx, a_idir, a_side, a_dit,a_time,a_useAreaFrac,a_centroid,a_useHomogeneous);
    }
  else
    {
      DirichletPoissonDomainBC diriBC;
      diriBC.setValue(0.0);
      diriBC.getFaceGradPhi(a_faceFlux, a_face, a_comp, a_phi, a_probLo,
                            a_dx, a_idir, a_side, a_dit,a_time,a_useAreaFrac,a_centroid,a_useHomogeneous);
    }
}