On 2013-09-12, at 20:57 , Scott Hawley <scott.haw...@belmont.edu> wrote:
> 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.) The parenthesized remark doesn't sound quite right. See below, coarse_ilo. > 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? You are using "m" for two things. One of these should rather be called "ml", a "multigrid-level" that is currently unused, and is thus always 0. The other is the "map", i.e. the patch number; this is 0 unless you have multiple patches. > assert (mglevels == 1); > int const rl = reflevel; > > ivect const ilo = vhh.at(m)->baseextents.at(m).at(rl).lower(); The second .at(m) should be .at(ml) instead. > ivect const istr = vhh.at(m)->baseextents.at(m).at(rl).stride(); Same here. > int ref_ratio = 2; // <-- Do we support refinement ratios > > 2? Nothing uses this at the moment; it is untested and thus likely not working. > ivect coarse_str = istr * ref_ratio; Better: vhh.at(ml)->baseextents.at(m).at(rl-1).stride(); Also: coarse_ilo = vhh.at(m)->baseextents.at(ml).at(rl-1).lower(); > 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])) { This doesn't seem quite right. ilo[0] is not in the same "units" as i; instead, it is in the same "units" as str. Alternatively: Check whether the equation ilo[0] + i * str[0] == coarse_ilo[0] + coarse_i * coarse_str[0] can be solved for coarse_i, i.e. check whether (ilo[0] + i * str[0] - coarse_ilo[0]) % coarse_str[0] == 0 and similarly for the other two directions. > 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 much, To test this, you can output the coordinate of the current grid point, and then check (manually) whether this coordinate exists on the next coarser grid. -erik -- Erik Schnetter <schnet...@cct.lsu.edu> http://www.perimeterinstitute.ca/personal/eschnetter/ My email is as private as my paper mail. I therefore support encrypting and signing email messages. Get my PGP key from http://pgp.mit.edu/.
signature.asc
Description: Message signed with OpenPGP using GPGMail
_______________________________________________ Users mailing list Users@einsteintoolkit.org http://lists.einsteintoolkit.org/mailman/listinfo/users