From c2551314a7064880d4f675d69114e6c8a7b34d60 Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Sun, 17 Mar 2019 13:26:49 +0100 Subject: Fix filling reflection-ghostzone boundary points Reflection ghostzones are not filled on sync. --- src/maximal_slicing_axi_mg.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/maximal_slicing_axi_mg.c b/src/maximal_slicing_axi_mg.c index fed6ff5..3d082a3 100644 --- a/src/maximal_slicing_axi_mg.c +++ b/src/maximal_slicing_axi_mg.c @@ -17,6 +17,7 @@ #include "util_Table.h" #define SQR(x) ((x) * (x)) +#define ABS(x) ((x >= 0) ? (x) : -(x)) #define ARRAY_ELEMS(x) (sizeof(x) / sizeof(*x)) #define CPINDEX(cp, i, j, k) ((k * cp->grid_size[1] + j) * cp->grid_size[0] + i) @@ -692,14 +693,16 @@ void msa_mg_solve(CCTK_ARGUMENTS) } } /* if the condition above was false, then lapse_mg should be filled by - * prolongation from the coarser level */ + * prolongation from the coarser level + * note that the reflection-boundary ghost points are not filled + */ /* fill the solver boundary conditions */ for (int j = 0; j < cp->solver->fd_stencil; j++) { MG2DBoundary *bnd = cp->solver->boundaries[MG2D_BOUNDARY_1U]; double *dst = bnd->val + j * bnd->val_stride; for (ptrdiff_t i = -j; i < (ptrdiff_t)cp->solver->domain_size + j; i++) { - const ptrdiff_t idx = CCTK_GFINDEX3D(cctkGH, i + cp->offset_left[0], cp->y_idx, cp->offset_left[1] + cp->solver->domain_size - 1 + j); + const ptrdiff_t idx = CCTK_GFINDEX3D(cctkGH, ABS(i) + cp->offset_left[0], cp->y_idx, cp->offset_left[1] + cp->solver->domain_size - 1 + j); dst[i] = lapse_mg[idx] - 1.0; } } @@ -707,7 +710,7 @@ void msa_mg_solve(CCTK_ARGUMENTS) MG2DBoundary *bnd = cp->solver->boundaries[MG2D_BOUNDARY_0U]; double *dst = bnd->val + j * bnd->val_stride; for (ptrdiff_t i = -j; i < (ptrdiff_t)cp->solver->domain_size + j; i++) { - const ptrdiff_t idx = CCTK_GFINDEX3D(cctkGH, cp->offset_left[1] + cp->solver->domain_size - 1 + j, cp->y_idx, cp->offset_left[1] + i); + const ptrdiff_t idx = CCTK_GFINDEX3D(cctkGH, cp->offset_left[1] + cp->solver->domain_size - 1 + j, cp->y_idx, cp->offset_left[1] + ABS(i)); dst[i] = lapse_mg[idx] - 1.0; } } -- cgit v1.2.3