[ET Trac] [Einstein Toolkit] #350: Autogenerating cctk_Loop.h
Einstein Toolkit
trac-noreply at einsteintoolkit.org
Tue May 8 04:49:18 CDT 2012
#350: Autogenerating cctk_Loop.h
--------------------------+-------------------------------------------------
Reporter: eschnett | Owner:
Type: enhancement | Status: review
Priority: minor | Milestone:
Component: Cactus | Version:
Resolution: | Keywords:
--------------------------+-------------------------------------------------
Comment (by hinder):
Very nice! Getting this into the flesh means we can use it in lots of
places, which should tidy up a number of things. I have a few
comments/questions:
1. The lc_ prefix presumably comes from LoopControl; could this be CCTK_
instead? Since this is auto-generated code, such a change is probably
easy to make in the Perl script. Is there a rule that users should not
declare variables which start with CCTK_? Ideally we would use
namespaces, but C does not support these.
2. I don't understand how OpenMP works with these loops.
3. The boundary loops go over all 26 boundary zones (6 faces, 12 edges and
8 corners). Is it possible to also provide a variable for the boundary
condition code to find out which of these zones it is on? This is the
"normal" provided by GenericFD. It is essentially an N-component array of
face * dir. This could be called something like CCTK_NORMAL as a standard
name, and declared by the looping macro, rather than requiring the user to
provide such an array. This allows the boundary condition code to select
the appropriate finite differencing operator. Thinking ahead, it is also
useful to know how far away from the boundary you are in each direction.
You can then reduce the stencil size point by point as you approach the
boundary. The sign of the normal tells you whether you are on the lower
or upper face. We could also use the magnitude of the components of the
normal to represent the number of points less than the boundary size which
are available. There might be better representations. I would like to be
able to do something equivalent to this:
{{{
switch(CCTK_NORMAL[0]) {
case 0:
dfdx = D4(f);
break;
case 1:
case -1:
dfdx = D2(f);
break;
case 2:
dfdx = D2Minus(f);
break;
case -2:
dfdx = D2Plus(f);
break;
}
}}}
If we declare the normal inside the macro, rather than asking the user to
provide an array, then we can add this later.
4. As far as I can tell, there are LOOP, LOOP_INTERIOR, LOOP_BOUNDARIES,
LOOP_INTBOUNDARIES, LOOP_ALL, LOOP_INT, LOOP_BND, LOOP_INTBND, all defined
as well for stride and dimension.
1. LOOP is the most basic, and requires you to specify the min and max
coordinates of the grid. Could we (later) add some bounds checking code
to ensure that the user doesn't loop outside the grid?
2. LOOP_INTERIOR loops over the interior, requiring you to tell it the
boundary sizes.
3. LOOP_BOUNDARIES loops over all 26 boundary zones, requiring you to
tell it the boundary sizes.
4. LOOP_INTBOUNDARIES: what does this do? Is this related to not
looping over ghost zones?
5. LOOP_ALL loops over all points.
6. LOOP_INT is the same as LOOP_INTERIOR, but the boundary sizes are
determined from the aliased function.
7. LOOP_BND and LOOP_INTBND similarly.
The macro names seem a little arbitrary; it's not clear to the user that
the difference between LOOP_BND and LOOP_BOUNDARIES relates to specifying
additional information. Ideally we could just use LOOP_BOUNDARIES
overloaded on the number of arguments, but I think the C preprocessor does
not support this except via horrible tricks with variadic macros. Since
the LOOP_BND case will be the most common, we could rename this to
LOOP_BOUNDARIES (or LOOP_BOUNDARY? Should it be considered as a set of
points or a list of zones?) and rename LOOP_BOUNDARIES as
LOOP_BOUNDARIES_FROM_INDICES to indicate that you are going to provide the
indices yourself. Similarly for the other macros.
5. I think that the BND macro loops over all non-interprocessor boundary
zones; i.e. it loops over both physical and symmetry boundaries. In
GenericFD, we only allow loops over the physical boundaries, determined by
an additional array identifying whether the boundaries are symmetry
boundaries or not, determined by an aliased function from SymBase. What
do we want to do here? Do we want to allow the implementation of symmetry
boundary conditions using this interface? Or should we just exclude
symmetry boundaries from these loops? I think the latter - we are really
targetting application code, and they should be concerned with physical
boundaries only.
--
Ticket URL: <https://trac.einsteintoolkit.org/ticket/350#comment:9>
Einstein Toolkit <http://einsteintoolkit.org>
The Einstein Toolkit
More information about the Trac
mailing list