Goal: I'm trying to determine if a given (fine) grid vertex coincides with a coarser grid point.
Frank pointed me to baseextents, and I've come up with the following snippet of code... Just posting this for a sanity check: Am I on the right track? Is there a more robust way one should do this?
My code relies on "baseextents" being the "full" extent of a given refinement level, apart from any domain decomposition that occurs when running with multiple MPI processors. (Well, and it relies on the fact that fine grid boundaries must lie along coarse grid points.)
BEGIN_MAP_LOOP (cctkGH, CCTK_GF) { BEGIN_LOCAL_COMPONENT_LOOP (cctkGH, CCTK_GF) {
DECLARE_CCTK_ARGUMENTS;
assert (maps == 1); int const m = 0; // <--- Really? m is never > 0? assert (mglevels == 1); int const rl = reflevel;
ivect const ilo = vhh.at(m)->baseextents.at(m).at(rl).lower(); ivect const istr = vhh.at(m)->baseextents.at(m).at(rl).stride();
int ref_ratio = 2; // <-- Do we support refinement ratios > 2? ivect coarse_str = istr * ref_ratio;
for (CCTK_INT k = 0 ; k < cctk_lsh[2] ; k=k+1) { for (CCTK_INT j = 0 ; j < cctk_lsh[1] ; j=j+1) { for (CCTK_INT i = 0 ; i < cctk_lsh[0] ; i=i+1) {
// does this vertex coincide with a coarser grid vertex? if ( ( 0 == (i - ilo[0]) % coarse_str[0]) && ( 0 == (j - ilo[1]) % coarse_str[1]) && ( 0 == (k - ilo[2]) % coarse_str[2])) {
CCTK_VInfo(CCTK_THORNSTRING," We are over a CG vertex!"); }
} // end loop over i } // end loop over j } // end loop over k
} END_LOCAL_COMPONENT_LOOP; } END_MAP_LOOP;
Thank you very m uch, Scott