 removed comment
The reduction weight of the internal points neighboring the outer boundaries is currently set in a "trapezoidalrule" manner (1/2 on the box faces, 1/4 on the edges, 1/8 on the vertices, in 3D), regardless of the nature of the boundaries. In the case of periodic boundaries with a Coordbase::boundary_shiftout_* parameter of zero, this leads to the assignment of a nonzero weight to some of the boundary points. This only yields the correct result if boundary conditions have been applied, which sometimes isn't possible/necessary.
The attached patch introduces some logic in CarpetReduce to take care of this case. This may not be the best way to attack the problem though. One could tackle the way weight is assigned to zeroshiftout boundaries. Perhaps this issue is related to #1221.
Keyword:
Comments (12)


reporter  removed comment
What do you mean by shifting the domain? The patch shouldn't do anything to the domain coordinates, it merely changes the weight assignment so that, like you mention, only interior points are (fully) counted. If a finer level overlaps the boundaries, then the coarse level underneath should have zero weight in the area, and the finer level would have a weight of one in the interior points and zero otherwise (as if it were the coarsest level itself). If a finer level does not overlap the periodic boundaries, it shouldn't see any modification at all.

 removed comment
With "domain" I refer to the region that has a nonzero weight. If you count only the interior points, then this domain will have different coordinates on different levels, i.e. it will be shifted by 1/2 grid spacing on each level. One way to view this is to draw a cell around each grid point, with radius dx/2 (i.e. cell size dx), so that the cells don't overlap. The region defined by all cells will then be different on each level.

reporter  removed comment
If I understand your argument correctly, I do not agree. Let's say we have a periodic domain where we identify x=+1 with x=1; we cover this with two grids, one with spacing dx=0.2 and one with dx/2, and with a lower shiftout of 1 and an upper shiftout of 0. With three boundary points, this will look like this:
1 +1       B B B I I I I I I I I I I B B B b b b i i i i i i i i i i i i i i i i i i i i b b b
The coordinate of the last internal point will indeed be different on the two levels (0.8 on the coarse and 0.9 on the fine), but things like the volume of the two levels (assigning weight of 1 to the interior points and 0 otherwise) is the same:
C: #Idx=100.2=2 F: #idx/2=200.1=2
Notice that the volume of the two levels is the same with the current weight assignment too  the patched code produces identical results as the current one, when the boundaries have been correctly set. It only makes a difference when the boundaries are junk, in which case it prevents this junk from polluting the reduction operations.

 removed comment
I now think that adding a special case for periodic boundaries makes sense, along the lines you suggest.

 changed milestone to ET_2013_05
 removed comment

 removed comment
I have applied the patch (slightly modified).
Eloisa, could you create a test case for this?

reporter  removed comment
Yes, I will. Thanks for fixing.

reporter  removed comment
Here's a test case. Review?

 changed status to open
 removed milestone
 removed comment
Bumping, because the test case isn't going to make it, but (un)luckily the change at least did.

 changed status to resolved
 removed comment
Applied.

 edited description
 changed status to closed
 Log in to comment
When vertex centering is used, then each of the boundary points contributes with weight 1/2 to the reduction, as explained above. If I interpret the patch correctly, then it essentially shifts the domain by 1/2 grid point in the periodic directions, so that one boundary point contributes with weight 1 and the other with weight 0. Given that one boundary point has a shiftout of 0 and the other has a shiftout of 1, this will then use exactly the interior points and ignore all points set by the periodic boundary condition.
I wonder what this domainshifting does when several refinement levels are used, since each level would be shifted by a different amount, depending on the grid spacing. With many refinement levels, there can be many finest grid points in the region where the coarsest grid has been shifted.
Another way of obtaining the same effect would be to use cellcentred refinement. In this case, there are no grid cells with weight 1/2; all cells have either weight 0 or weight 1.