From 528bdb48052734dc99e56aa3ef0c57222218c070 Mon Sep 17 00:00:00 2001 From: schnetter Date: Wed, 23 Jun 2004 13:34:43 +0000 Subject: 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 --- src/RobinBoundary.c | 228 +++++++++++++++++++++++++++++++++------------------- 1 file 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); } -- cgit v1.2.3