[Users] Carpet: using baseextents?
Scott Hawley
scott.hawley at belmont.edu
Thu Sep 12 20:30:47 CDT 2013
Thanks Erik. Glad I asked.
Since I *do* have multiple patches, how do I get the "map" patch number?
(Just referencing "map" didn't work, and checking BEGIN_MAP_LOOP in
Carpet/src/modes.hh didn't enlighten me.)
-Scott
On 9/12/13 8:17 PM, "Erik Schnetter" <schnetter at cct.lsu.edu> wrote:
>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/.
>
More information about the Users
mailing list