[ET Trac] [Einstein Toolkit] #350: Autogenerating cctk_Loop.h

Einstein Toolkit trac-noreply at einsteintoolkit.org
Tue May 8 09:38:42 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):

 Replying to [comment:13 eschnett]:

 > 3. If we use CCTK_NORMAL for the normal, then we should also use
 CCTK_INDEX for the loop index...

 Yes.  Why not?  Is the reason only due to brevity? Or is there another
 reason?

 > Joke aside, we can store the distance from the outer boundary in the
 normal. (The "number of points less than the boundary size which are
 available" would be less useful -- it would be large at the boundary, and
 small in the interior, thus it wouldn't indicate what stencil you can
 use.)

 By "distance from the outer boundary", I assume you mean the distance from
 the outermost point in the boundary.  But which one? Lower or upper?  I
 thought about both options, and the most symmetric seemed to be the one I
 proposed.  This would be of the form [-2, -1, 0, 0, ..., 0, 1, 2],
 assuming a boundary size of 2.  You are correct that this array does not
 contain exactly the information about the stencil that you can use, but if
 you assume that the interior corresponds to a stencil of the same size as
 the boundary, then this is the missing information.  Maybe this is too
 complicated.  For your suggestion, I believe we would need two variables,
 one for the lower boundary and one for the upper boundary.  This would
 then look like this: nx_lo = [0, 1, 2, ...]; nx_hi = [,,,. 2, 1, 0], then
 we could do
 {{{
 if (nx_lo[0] >= 2 && nx_hi[0] >= 2) {
   dfdx = D4(f);
 } else if (nx_lo[0] == 1 || nx_hi[0] == 1) {
   dfdx = D2(f);
 } else if (nx_lo[0] == 0) {
   dfdx = D2Plus(f);
 } else if (nx_hi[0] == 0) {
   dfdx = D2Minus(f);
 } else assert(0);
 }}}

 > 4. The issue isn't looping over physics vs. looping over symmetry zones.
 The issue is that there are three boundary specifiers (physical, symmetry,
 ghost), and in three dimension, and boundary can have up to three
 specifies attach to it (corners!). Yes, a boundary can be all of a
 physical, a symmetry, and a ghost boundary. The issue is in handling
 these. BOUNDARIES loops over all boundaries that are physical boundaries
 (irrespective of whether they are also a symmetry or a ghost boundary),
 INTBOUNDARIES loops over all boundaries that are only physical boundaries.
 The former does not require applying symmetry conditions and
 synchronisation afterwards, the latter allows taking tangential
 derivatives.

 So BOUNDARIES would be useful if you were only taking derivatives normal
 to the boundary, as it would allow you to skip expensive interprocessor
 synchronisation and symmetry boundary conditions, and INTBOUNDARIES would
 be useful if you also needed to take tangential derivatives?  This seems
 OK, but I wonder if we can come up with clearer names?

-- 
Ticket URL: <https://trac.einsteintoolkit.org/ticket/350#comment:14>
Einstein Toolkit <http://einsteintoolkit.org>
The Einstein Toolkit


More information about the Trac mailing list