void setToExactDivF(EBCellFAB& a_exactDivF, const EBISBox& a_ebisBox, const Box& a_region, const Real& a_dx) { a_exactDivF.setVal(0.); IntVectSet ivsregion(a_region); for (VoFIterator vofit(ivsregion, a_ebisBox.getEBGraph()); vofit.ok(); ++vofit) { const VolIndex& vof = vofit(); RealVect xval; IntVect iv = vof.gridIndex(); for (int idir = 0; idir < SpaceDim; idir++) { xval[idir] = (Real(iv[idir]) + 0.5)*a_dx; } Real solnrv = exactDivergence(xval); Real kappa = a_ebisBox.volFrac(vof); a_exactDivF(vof,0) = kappa*solnrv; } }
int checkEBISBox(const Box& a_gridCoar, const EBISBox& a_ebisBoxCoar, const EBISBox& a_ebisBoxFine) { IntVectSet ivs = a_ebisBoxCoar.getIrregIVS(a_gridCoar); Real dxCoar = 2; Real dxFine = 1; #if CH_SPACEDIM==2 Real areaFineCell = dxFine; Real areaCoarCell = dxCoar; Real voluFineCell = dxFine*dxFine; Real voluCoarCell = dxCoar*dxCoar; #elif CH_SPACEDIM==3 Real areaFineCell = dxFine*dxFine; Real areaCoarCell = dxCoar*dxCoar; Real voluFineCell = dxFine*dxFine*dxFine; Real voluCoarCell = dxCoar*dxCoar*dxCoar; #else MayDay::Error(); #endif int retval = 0; for (VoFIterator vofit(ivs, a_ebisBoxCoar.getEBGraph()); vofit.ok(); ++vofit) { const VolIndex& vofCoar = vofit(); Vector<VolIndex> vofsFine = a_ebisBoxCoar.refine(vofCoar); //check the easy bits Real volumCoar = a_ebisBoxCoar.volFrac( vofCoar); RealVect areaCritCoar = a_ebisBoxCoar.bndryArea(vofCoar)* a_ebisBoxCoar.normal(vofCoar); Real volumFine = 0; RealVect areaCritFine = RealVect::Zero; for (int ivof = 0; ivof < vofsFine.size(); ivof++) { volumFine += a_ebisBoxFine.volFrac( vofsFine[ivof]); areaCritFine += a_ebisBoxFine.bndryArea(vofsFine[ivof])* a_ebisBoxFine.normal(vofsFine[ivof]); } volumFine *= voluFineCell; areaCritFine *= areaFineCell; volumCoar *= voluCoarCell; areaCritCoar *= areaCoarCell; Real tolerance = 1.0e-10; if (Abs(volumFine -volumCoar) > tolerance*volumCoar) { pout() << "volume problem in coar cell " << vofCoar.gridIndex() << endl; retval = -1; } // Real maxCc = 0.0; // Real maxDev = 0.0; for (int idir=0; idir<SpaceDim; idir++) { if (Abs(areaCritFine[idir]-areaCritCoar[idir]) > tolerance*Abs(areaCritCoar[idir])) { pout() << "bndry area problem in coar cell " << vofCoar.gridIndex() << endl; retval = -2; } } //centroids are a bit uglier to test // RealVect bndryCentroidCoar = a_ebisBoxCoar.bndryCentroid( vofCoar); // RealVect bndryCentroidFine = RealVect::Zero; //the areas are somewhat more painful to test // for (int idir = 0; idir < SpaceDim; idir++) // { // // } } return retval; }