diff options
Diffstat (limited to 'src/Faces.c')
-rw-r--r-- | src/Faces.c | 165 |
1 files changed, 165 insertions, 0 deletions
diff --git a/src/Faces.c b/src/Faces.c index c1a668f..844dfc2 100644 --- a/src/Faces.c +++ b/src/Faces.c @@ -360,3 +360,168 @@ SymBase_SymmetryRegisterGN (CCTK_POINTER const cctkGH_, return SymBase_SymmetryRegisterGI (cctkGH_, sym_handle, which_faces, new_symmetry_zone_width, group_index); } + + + +/*@@ + @routine SymBase_SymmetryRegisterInterpolatorFaces + @author Erik Schnetter + @date 2004-05-25 + @desc + Register a symmetry interpolator for certain faces + @enddesc + @var sym_table + @vtype CCTK_INT + @vdesc Table which describes the grid or grid array + @vio in + @endvar + @var group_dim + @vtype CCTK_INT + @vdesc Dimension of the grid or grid array + @vio in + @endvar + @var sym_handle + @vtype CCTK_INT + @vdesc Symmetry handle + @vio in + @endvar + @var symmetry_interpolate + @vtype CCTK_FPOINTER + @vdesc Routine that applies symmetries to the interpolation points + and then calls back + (may be NULL) + @vio in + @endvar + @returntype CCTK_INT + @returndesc + status code + 0 for success + -1 if sym_table has an illegal value + -9 if group_dim has an illegal value + -2 if sym_handle has an illegal value + -10 symmetry_interpolate is NULL + @endreturndesc +@@*/ + +CCTK_INT +SymBase_SymmetryRegisterInterpolatorFaces (CCTK_INT const sym_table, + CCTK_INT const group_dim, + CCTK_INT const sym_handle, + SymmetryInterpolateFPointer const new_symmetry_interpolate) +{ + CCTK_INT symmetry_handle[100]; + CCTK_FPOINTER symmetry_interpolate[100]; + int face; + int ierr; + + /* Check arguments */ + if (sym_table < 0) + { + return -1; /* illegal argument */ + } + if (group_dim < 0) + { + return -9; /* illegal argument */ + } + if (sym_handle < 0 || sym_handle >= SymBase_num_symmetries) + { + return -2; /* illegal argument */ + } + if (! new_symmetry_interpolate) + { + return -10; + } + + /* Get table entries */ + if (2 * group_dim > 100) + { + CCTK_WARN (0, "internal error"); + } + ierr = Util_TableGetIntArray + (sym_table, 2 * group_dim, symmetry_handle, "symmetry_handle"); + if (ierr != 2 * group_dim) + { + CCTK_WARN (0, "internal error"); + } + ierr = Util_TableGetFPointerArray + (sym_table, 2 * group_dim, symmetry_interpolate, "symmetry_interpolate"); if (ierr != 2 * group_dim) { + CCTK_WARN (0, "internal error"); + } + + /* Update table entries */ + for (face = 0; face < 2 * group_dim; ++face) + { + if (symmetry_handle[face] == sym_handle) + { + symmetry_interpolate[face] = (CCTK_FPOINTER)new_symmetry_interpolate; + } + } + + /* Set table entries */ + ierr = Util_TableSetFPointerArray + (sym_table, 2 * group_dim, symmetry_interpolate, "symmetry_interpolate"); + if (ierr != 1) + { + CCTK_WARN (0, "internal error"); + } + + return 0; +} + + + +/*@@ + @routine SymBase_SymmetryRegisterGridInterpolator + @author Erik Schnetter + @date 2004-05-25 + @desc + Register a symmetry interpolator + for certain faces of the grid hierarchy + @enddesc + @var cctkGH + @vtype cGH * + @vdesc The grid hierarchy + @vio in + @endvar + @var sym_handle + @vtype CCTK_INT + @vdesc Symmetry handle + @vio in + @endvar + @var symmetry_interpolate + @vtype CCTK_FPOINTER + @vdesc Routine that applies symmetries to the interpolation points + and then calls back + @vio in + @endvar + @returntype CCTK_INT + @returndesc + status code + 0 for success + Error codes of SymBase_SymmetryRegisterInterpolatorFaces + @endreturndesc +@@*/ + +CCTK_INT +SymBase_SymmetryRegisterGridInterpolator (CCTK_POINTER const cctkGH_, + CCTK_INT const sym_handle, + SymmetryInterpolateFPointer const new_symmetry_interpolate) +{ + cGH const *const cctkGH = cctkGH_; + struct SymBase const *symdata; + + if (!cctkGH) + { + CCTK_WARN (0, "internal error"); + } + + symdata = CCTK_GHExtension (cctkGH, "SymBase"); + if (!symdata) + { + CCTK_WARN (0, "internal error"); + } + + return SymBase_SymmetryRegisterInterpolatorFaces + (symdata->sym_table, cctkGH->cctk_dim, sym_handle, + new_symmetry_interpolate); +} |