aboutsummaryrefslogtreecommitdiff
path: root/src/call_derivs.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/call_derivs.c')
-rw-r--r--src/call_derivs.c85
1 files changed, 75 insertions, 10 deletions
diff --git a/src/call_derivs.c b/src/call_derivs.c
index 22d6527..992e028 100644
--- a/src/call_derivs.c
+++ b/src/call_derivs.c
@@ -17,12 +17,15 @@ void DiffGv ( const CCTK_POINTER_TO_CONST cctkGH_, const CCTK_INT dir,
DECLARE_CCTK_PARAMETERS
DECLARE_CCTK_ARGUMENTS
- CCTK_INT ni, nj, nk, gsize, loc_order;
+ CCTK_INT i, ni, nj, nk, gsize, loc_order;
CCTK_REAL delta;
- CCTK_INT bb[2];
+ CCTK_INT bb[2], loc_offset[2];
int onesided[6];
-
+ CCTK_INT enforce_centered[6];
+ CCTK_INT offset[6];
+ CCTK_INT dummy[6];
int nelements;
+
void CCTK_FCALL CCTK_FNAME(deriv_gf_2_1)(const CCTK_REAL *var,
const CCTK_INT *ni,
const CCTK_INT *nj,
@@ -111,6 +114,7 @@ void DiffGv ( const CCTK_POINTER_TO_CONST cctkGH_, const CCTK_INT dir,
const CCTK_INT *dir,
const CCTK_INT *bb,
const CCTK_INT *gsize,
+ const CCTK_INT *offset,
const CCTK_REAL *delta,
CCTK_REAL *dvar);
@@ -128,27 +132,88 @@ void DiffGv ( const CCTK_POINTER_TO_CONST cctkGH_, const CCTK_INT dir,
loc_order = order;
}
+ for (i=0; i<6; i++) {
+ enforce_centered[i] = 0;
+ }
+
+ if ( table_handle >=0 ) {
+ nelements = Util_TableGetIntArray ( table_handle, 6, dummy, "enforce_centered" );
+ if ( nelements == UTIL_ERROR_TABLE_NO_SUCH_KEY ) {
+ } else if ( nelements != 6) {
+ CCTK_WARN (0, "The options table has an entry \"enforce_centered\", but it does not have 6 elements");
+ } else {
+ for (i=0; i<6; i++) {
+ enforce_centered[i] = dummy[i];
+ }
+ }
+ }
+
+ for (i=0; i<6; i++) {
+ offset[i] = 0;
+ }
+ if ( table_handle >=0 ) {
+ nelements = Util_TableGetIntArray ( table_handle, 6, dummy, "offset" );
+ if ( nelements == UTIL_ERROR_TABLE_NO_SUCH_KEY ) {
+ } else if ( nelements != 6) {
+ CCTK_WARN (0, "The options table has an entry \"offset\", but it does not have 6 elements");
+ } else {
+ for (i=0; i<6; i++) {
+ offset[i] = dummy[i];
+ }
+ }
+ }
+
SBP_determine_onesided_stencil (cctkGH, onesided);
switch(dir) {
case 0: {
delta = CCTK_DELTA_SPACE(0);
- bb[0] = onesided[0];
- bb[1] = onesided[1];
+ if ( enforce_centered[0] ) {
+ bb[0] = 0;
+ } else {
+ bb[0] = onesided[0];
+ }
+ loc_offset[0] = offset[0];
+ if ( enforce_centered[1] ) {
+ bb[1] = 0;
+ } else {
+ bb[1] = onesided[1];
+ }
+ loc_offset[1] = offset[1];
gsize = cctk_nghostzones[0];
break;
}
case 1: {
delta = CCTK_DELTA_SPACE(1);
- bb[0] = onesided[2];
- bb[1] = onesided[3];
+ if ( enforce_centered[2] ) {
+ bb[0] = 0;
+ } else {
+ bb[0] = onesided[2];
+ }
+ loc_offset[0] = offset[2];
+ if ( enforce_centered[3] ) {
+ bb[0] = 0;
+ } else {
+ bb[1] = onesided[3];
+ }
+ loc_offset[1] = offset[3];
gsize = cctk_nghostzones[1];
break;
}
case 2: {
delta = CCTK_DELTA_SPACE(2);
- bb[0] = onesided[4];
- bb[1] = onesided[5];
+ if ( enforce_centered[4] ) {
+ bb[0] = 0;
+ } else {
+ bb[0] = onesided[4];
+ }
+ loc_offset[0] = offset[4];
+ if ( enforce_centered[5] ) {
+ bb[0] = 0;
+ } else {
+ bb[1] = onesided[5];
+ }
+ loc_offset[1] = offset[5];
gsize = cctk_nghostzones[2];
break;
}
@@ -193,7 +258,7 @@ void DiffGv ( const CCTK_POINTER_TO_CONST cctkGH_, const CCTK_INT dir,
break;
}
case 8: {
- CCTK_FNAME(deriv_gf_8_4_opt)(var,&ni,&nj,&nk,&dir,bb,&gsize,&delta,dvar);
+ CCTK_FNAME(deriv_gf_8_4_opt)(var,&ni,&nj,&nk,&dir,bb,&gsize,loc_offset,&delta,dvar);
break;
}
default: