[Users] Carpet: using baseextents?
Erik Schnetter
schnetter at cct.lsu.edu
Thu Sep 12 20:17:11 CDT 2013
On 2013-09-12, at 20:57 , Scott Hawley <scott.hawley at 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 <schnetter at 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/.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 203 bytes
Desc: Message signed with OpenPGP using GPGMail
Url : http://lists.einsteintoolkit.org/pipermail/users/attachments/20130912/46016270/attachment.bin
More information about the Users
mailing list