sandbox/bugs/foreach_bnd.c

This simple code shows a problem with the usage of foreach_boundary when periodic boundary condition is applied in only one direction.

#define BGHOSTS 1
#include "grid/quadtree.h"

int main()
{

  L0 = 8;
  periodic(top);
  init_grid(1 << 2);

  printf("%s \n","----------boundary iterator for left boundary-------------");
  foreach_boundary(left)
  {
  	printf("x:%g\ty:%g \n",x,y);
  }
  printf("%s\n","-----------actual left boundary------------" );
  foreach_face(x)
  {
  	if(0 == x)
  		printf("x:%g\ty:%g \n",x,y);
  }
}

Running the above piece of code gives

----------boundary iterator for left boundary-------------
x:0    y:-1
x:0    y:1
x:0    y:3
x:0    y:5
-----------actual left boundary------------
x:0    y:1
x:0    y:3
x:0    y:5
x:0    y:7

If the foreach_boundary() iterator works correctly, the position information between splitlines should be identical. However, the foreach_boundary() iterator trys to access the ghost cell instead of the actual cell in the domain. Clearly an offset exists in the foreach_boundary() iterator and its value is related to a macro named BGHOSTS.