aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorschnetter <schnetter@6a38eb6e-646e-4a02-a296-d141613ad6c4>2004-06-23 13:34:43 +0000
committerschnetter <schnetter@6a38eb6e-646e-4a02-a296-d141613ad6c4>2004-06-23 13:34:43 +0000
commit528bdb48052734dc99e56aa3ef0c57222218c070 (patch)
tree83a23a9adada14ddceee8c15528ea9e896a389fc
parent652d1143da40ef5dd245e88ac0b7cf806f81a3e9 (diff)
Allow 2 boundary points for Robin boundaries.
(Change from Marcus Rumpfkeil.) git-svn-id: http://svn.cactuscode.org/arrangements/CactusBase/Boundary/trunk@276 6a38eb6e-646e-4a02-a296-d141613ad6c4
-rw-r--r--src/RobinBoundary.c228
1 files changed, 147 insertions, 81 deletions
diff --git a/src/RobinBoundary.c b/src/RobinBoundary.c
index aee7b01..9e3bb7b 100644
--- a/src/RobinBoundary.c
+++ b/src/RobinBoundary.c
@@ -650,85 +650,151 @@ void CCTK_FCALL CCTK_FNAME (BndRobinVN)
@vio in
@endvar
@@*/
-#define ROBIN_BOUNDARY(cctk_type) \
-{ \
- int i, j, k; \
- int dx, dy, dz; \
- int src, dst; \
- double distance; \
- \
- \
- /* check the dimensionality */ \
- if (gdim != 3) \
- { \
- CCTK_VWarn (1, __LINE__, __FILE__, CCTK_THORNSTRING, \
- "ApplyBndRobin: variable dimension of %d not supported", \
- gdim); \
- return (-5); \
- } \
- \
- /* outermost loop over all z points */ \
- for (k = 0; k < GH->cctk_lsh[2]; k++) \
- { \
- dz = 0; \
- if (k == 0 && doBC[4]) \
- { \
- dz = +1; \
- } \
- else if (k == GH->cctk_lsh[2]-1 && doBC[5]) \
- { \
- dz = -1; \
- } \
- \
- /* middle loop over all y points */ \
- for (j = 0; j < GH->cctk_lsh[1]; j++) \
- { \
- dy = 0; \
- if (j == 0 && doBC[2]) \
- { \
- dy = +1; \
- } \
- else if (j == GH->cctk_lsh[1]-1 && doBC[3]) \
- { \
- dy = -1; \
- } \
- \
- /* lower x */ \
- dx = 0; \
- if (doBC[0]) \
- { \
- dx = +1; \
- } \
- if (dx || dy || dz) \
- { \
- SET_LINEAR_INDICES (0); \
- ROBIN_BOUNDARY_TYPED_3D (cctk_type); \
- } \
- \
- /* lower/upper y and/or z */ \
- if (dy || dz) \
- { \
- dx = 0; \
- SET_LINEAR_INDICES (1); \
- for (i = 1; i < GH->cctk_lsh[0]-1; i++, src++, dst++) \
- { \
- ROBIN_BOUNDARY_TYPED_3D (cctk_type); \
- } \
- } \
- \
- /* upper x */ \
- dx = 0; \
- if (doBC[1]) \
- { \
- dx = -1; \
- } \
- if (dx || dy || dz) \
- { \
- SET_LINEAR_INDICES (GH->cctk_lsh[0]-1); \
- ROBIN_BOUNDARY_TYPED_3D (cctk_type); \
- } \
- } \
- } \
+#define ROBIN_BOUNDARY(cctk_type) \
+{ \
+ int i, j, k; \
+ int dx, dy, dz; \
+ int src, dst; \
+ double distance; \
+ \
+ \
+ /* check the dimensionality */ \
+ if (gdim != 3) \
+ { \
+ CCTK_VWarn (1, __LINE__, __FILE__, CCTK_THORNSTRING, \
+ "ApplyBndRobin: variable dimension of %d not supported", \
+ gdim); \
+ return (-5); \
+ } \
+ \
+ if (in_widths[0]==2 || in_widths[1]==2 || in_widths[2]==2) \
+ { \
+ /* outermost loop over almost all z points */ \
+ for (k = 1; k < GH->cctk_lsh[2]-1; k++) \
+ { \
+ dz = 0; \
+ if (k == 1 && doBC[4]) \
+ { \
+ dz = +1; \
+ } \
+ else if (k == GH->cctk_lsh[2]-2 && doBC[5]) \
+ { \
+ dz = -1; \
+ } \
+ \
+ /* middle loop over all y points */ \
+ for (j = 1; j < GH->cctk_lsh[1]-1; j++) \
+ { \
+ dy = 0; \
+ if (j == 1 && doBC[2]) \
+ { \
+ dy = +1; \
+ } \
+ else if (j == GH->cctk_lsh[1]-2 && doBC[3]) \
+ { \
+ dy = -1; \
+ } \
+ \
+ /* lower x */ \
+ dx = 0; \
+ if (doBC[0]) \
+ { \
+ dx = +1; \
+ } \
+ if (dx || dy || dz) \
+ { \
+ SET_LINEAR_INDICES (1); \
+ ROBIN_BOUNDARY_TYPED_3D (cctk_type); \
+ } \
+ \
+ /* lower/upper y and/or z */ \
+ if (dy || dz) \
+ { \
+ dx = 0; \
+ SET_LINEAR_INDICES (2); \
+ for (i = 2; i < GH->cctk_lsh[0]-2; i++, src++, dst++) \
+ { \
+ ROBIN_BOUNDARY_TYPED_3D (cctk_type); \
+ } \
+ } \
+ \
+ /* upper x */ \
+ dx = 0; \
+ if (doBC[1]) \
+ { \
+ dx = -1; \
+ } \
+ if (dx || dy || dz) \
+ { \
+ SET_LINEAR_INDICES (GH->cctk_lsh[0]-2); \
+ ROBIN_BOUNDARY_TYPED_3D (cctk_type); \
+ } \
+ } \
+ } \
+ } \
+ \
+ /* outermost loop over all z points */ \
+ for (k = 0; k < GH->cctk_lsh[2]; k++) \
+ { \
+ dz = 0; \
+ if (k == 0 && doBC[4]) \
+ { \
+ dz = +1; \
+ } \
+ else if (k == GH->cctk_lsh[2]-1 && doBC[5]) \
+ { \
+ dz = -1; \
+ } \
+ \
+ /* middle loop over all y points */ \
+ for (j = 0; j < GH->cctk_lsh[1]; j++) \
+ { \
+ dy = 0; \
+ if (j == 0 && doBC[2]) \
+ { \
+ dy = +1; \
+ } \
+ else if (j == GH->cctk_lsh[1]-1 && doBC[3]) \
+ { \
+ dy = -1; \
+ } \
+ \
+ /* lower x */ \
+ dx = 0; \
+ if (doBC[0]) \
+ { \
+ dx = +1; \
+ } \
+ if (dx || dy || dz) \
+ { \
+ SET_LINEAR_INDICES (0); \
+ ROBIN_BOUNDARY_TYPED_3D (cctk_type); \
+ } \
+ \
+ /* lower/upper y and/or z */ \
+ if (dy || dz) \
+ { \
+ dx = 0; \
+ SET_LINEAR_INDICES (1); \
+ for (i = 1; i < GH->cctk_lsh[0]-1; i++, src++, dst++) \
+ { \
+ ROBIN_BOUNDARY_TYPED_3D (cctk_type); \
+ } \
+ } \
+ \
+ /* upper x */ \
+ dx = 0; \
+ if (doBC[1]) \
+ { \
+ dx = -1; \
+ } \
+ if (dx || dy || dz) \
+ { \
+ SET_LINEAR_INDICES (GH->cctk_lsh[0]-1); \
+ ROBIN_BOUNDARY_TYPED_3D (cctk_type); \
+ } \
+ } \
+ } \
}
@@ -839,9 +905,9 @@ static int ApplyBndRobin (const cGH *GH,
for (dim = 0; dim < 2*gdim; dim++)
{
- if (in_widths[dim] != 1)
+ if (in_widths[dim] != 1 && in_widths[dim] != 2)
{
- CCTK_WARN (1, "ApplyBndRobin: Stencil width must be 1 "
+ CCTK_WARN (1, "ApplyBndRobin: Stencil width must be 1 or 2 "
"for Robin boundary conditions");
return (-3);
}