diff options
Diffstat (limited to 'src/call_derivs.c')
-rw-r--r-- | src/call_derivs.c | 85 |
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: |