diff options
-rw-r--r-- | interface.ccl | 6 | ||||
-rw-r--r-- | src/get_boundary_width.c | 104 | ||||
-rw-r--r-- | src/make.code.defn | 3 |
3 files changed, 112 insertions, 1 deletions
diff --git a/interface.ccl b/interface.ccl index 15fc072..58593b0 100644 --- a/interface.ccl +++ b/interface.ccl @@ -77,6 +77,12 @@ SUBROUTINE GetLshIndexRanges ( \ CCTK_INT OUT ARRAY imax ) PROVIDES FUNCTION GetLshIndexRanges WITH get_lsh_iranges LANGUAGE C +SUBROUTINE GetBoundWidth (\ + CCTK_POINTER_TO_CONST IN cctkGH, \ + CCTK_INT OUT ARRAY bsize, \ + CCTK_INT IN table_handle ) +PROVIDES FUNCTION GetBoundWidth WITH Get_Bound_Width LANGUAGE C + CCTK_INT FUNCTION GetDomainSpecification \ (CCTK_INT IN size, \ CCTK_REAL OUT ARRAY physical_min, \ diff --git a/src/get_boundary_width.c b/src/get_boundary_width.c new file mode 100644 index 0000000..3c2686f --- /dev/null +++ b/src/get_boundary_width.c @@ -0,0 +1,104 @@ +#include <assert.h> +#include <stdio.h> + +#include "cctk.h" +#include "cctk_Parameters.h" +#include "cctk_Arguments.h" + +#include "util_ErrorCodes.h" +#include "util_Table.h" + +#include "stencil.h" + + +void Get_Bound_Width ( const CCTK_POINTER_TO_CONST cctkGH_, CCTK_INT *bsize, + const CCTK_INT table_handle ) +{ + cGH const * restrict const cctkGH = cctkGH_; + DECLARE_CCTK_PARAMETERS + DECLARE_CCTK_ARGUMENTS + + int onesided[6]; + CCTK_INT loc_order; + CCTK_INT gsize[6]; + int nelements; + + SBP_determine_onesided_stencil (cctkGH, onesided); + + if ( table_handle >=0 ) { + nelements = Util_TableGetInt ( table_handle, &loc_order, "order" ); + if ( nelements == UTIL_ERROR_TABLE_NO_SUCH_KEY ) { + loc_order = order; + } else if ( nelements != 1) { + CCTK_WARN (0, "The options table has an entry \"order\", but it does not have the right properties"); + } + } else { + loc_order = order; + } + + gsize[0] = cctk_nghostzones[0]; + gsize[1] = cctk_nghostzones[0]; + gsize[2] = cctk_nghostzones[1]; + gsize[3] = cctk_nghostzones[1]; + gsize[4] = cctk_nghostzones[2]; + gsize[5] = cctk_nghostzones[2]; + + if ( CCTK_Equals(norm_type,"Diagonal") ) { + if ( sbp_1st_deriv ) { + switch(loc_order) { + case 2: { + for (int d = 0; d<6; d++) bsize[d] = (onesided[d])?1:gsize[d]; + break; + } + case 4: { + for (int d = 0; d<6; d++) bsize[d] = (onesided[d])?4:gsize[d]; + break; + } + case 6: { + for (int d = 0; d<6; d++) bsize[d] = (onesided[d])?6:gsize[d]; + break; + } + case 8: { + for (int d = 0; d<6; d++) bsize[d] = (onesided[d])?8:gsize[d]; + break; + } + default: + CCTK_WARN (0, "Unknown stencil specified"); + } + } else { + switch(loc_order) { + case 2: { + for (int d = 0; d<6; d++) bsize[d] = (onesided[d])?1:gsize[d]; + break; + } + case 4: { + for (int d = 0; d<6; d++) bsize[d] = (onesided[d])?2:gsize[d]; + break; + } + case 6: { + for (int d = 0; d<6; d++) bsize[d] = (onesided[d])?3:gsize[d]; + break; + } + case 8: { + for (int d = 0; d<6; d++) bsize[d] = (onesided[d])?4:gsize[d]; + break; + } + default: + CCTK_WARN (0, "Unknown 1st derivative stencil specified"); + } + } + } else { + switch(loc_order) { + case 4: { + for (int d = 0; d<6; d++) bsize[d] = (onesided[d])?5:gsize[d]; + break; + } + case 6: { + for (int d = 0; d<6; d++) bsize[d] = (onesided[d])?7:gsize[d]; + break; + } + default: + CCTK_WARN (0, "Unknown stencil specified"); + } + } +} diff --git a/src/make.code.defn b/src/make.code.defn index 7fa5829..9536e0f 100644 --- a/src/make.code.defn +++ b/src/make.code.defn @@ -70,7 +70,8 @@ SRCS = call_derivs.c \ Coefficients_6_5_min_err_coeff.F90 \ Poisoning.F90 \ get_offset.c \ - stencil.c + stencil.c \ + get_boundary_width.c # Subdirectories containing source files SUBDIRS = |