void NeumannConductivityDomainBC:: 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) { const int iside = -sign(a_side); const EBISBox& ebisBox = a_phi.getEBISBox(); Real flux = -1.e99; if (a_useHomogeneous) { flux = 0.0; } else if (m_isFunction) { const RealVect normal = EBArith::getDomainNormal(a_idir,a_side); RealVect point = a_centroid; point *= a_dx; point[a_face.direction()] = 0.0;//make this not depend on whatever ebisbox is returning for centroid in the face direction. point += EBArith::getFaceLocation(a_face,a_dx,a_probLo); flux = m_flux->value(a_face,a_side,a_dit,point,normal,a_time,a_comp); } else { if (m_onlyHomogeneous) { MayDay::Error("NeumannPoissonDomainBC::getFaceFlux called with undefined inhomogeneous BC"); } flux = m_value; } a_faceFlux = iside*flux; if (a_useAreaFrac) { a_faceFlux *= ebisBox.areaFrac(a_face); } }
void NeumannConductivityDomainBC:: getFaceFlux(Real& a_faceFlux, const VolIndex& a_vof, 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_useHomogeneous) { const EBISBox& ebisBox = a_phi.getEBISBox(); Real totalMassFlux = 0.0; Vector<FaceIndex> faces = ebisBox.getFaces(a_vof,a_idir,a_side); for (int i = 0; i < faces.size(); i++) { const RealVect centroid = ebisBox.centroid(faces[i]); Real thisFaceFlux; getFaceGradPhi(thisFaceFlux,faces[i],a_comp,a_phi,a_probLo, a_dx,a_idir,a_side,a_dit,a_time,true,centroid,a_useHomogeneous); totalMassFlux += thisFaceFlux; } a_faceFlux = totalMassFlux; Real bcoave = 0; Real areaTot = 0.0; for (int iface = 0; iface < faces.size(); iface++) { Real areaFrac = ebisBox.areaFrac(faces[iface]); areaTot += areaFrac; Real bcoFace = (*m_bcoef)[a_dit][a_idir](faces[iface], 0); bcoave += areaFrac*bcoFace; } if (areaTot > 1.0e-8) { bcoave /= areaTot; } a_faceFlux *= bcoave; }