diff options
Diffstat (limited to 'src/call_up_derivs.c')
-rw-r--r-- | src/call_up_derivs.c | 206 |
1 files changed, 206 insertions, 0 deletions
diff --git a/src/call_up_derivs.c b/src/call_up_derivs.c new file mode 100644 index 0000000..2189e3f --- /dev/null +++ b/src/call_up_derivs.c @@ -0,0 +1,206 @@ +#include "cctk.h" +#include "cctk_Parameters.h" +#include "cctk_Arguments.h" + +#include "util_ErrorCodes.h" +#include "util_Table.h" + +void DiffUpGv ( const CCTK_POINTER_TO_CONST cctkGH_, const CCTK_INT dir, + const CCTK_INT up, const CCTK_REAL *var, CCTK_REAL *dvar, + const CCTK_INT table_handle ) +{ + cGH const * restrict const cctkGH = cctkGH_; + DECLARE_CCTK_PARAMETERS + DECLARE_CCTK_ARGUMENTS + + CCTK_INT ni, nj, nk, gsize, ic, loc_order; + CCTK_REAL delta; + CCTK_INT ierr; + CCTK_INT lsh[3], bbox[6], bb[2], nghostzones[3]; + CCTK_INT symtable, pen_sym_handle; + CCTK_INT symbnd[6]; + + int nelements; + void CCTK_FCALL CCTK_FNAME(up_deriv_gf_2_1)(const CCTK_REAL *var, + const CCTK_INT *ni, + const CCTK_INT *nj, + const CCTK_INT *nk, + const CCTK_INT *dir, + const CCTK_INT *bb, + const CCTK_INT *gsize, + const CCTK_REAL *delta, + const CCTK_INT *up, + CCTK_REAL *dvar); + void CCTK_FCALL CCTK_FNAME(up_deriv_gf_4_2)(const CCTK_REAL *var, + const CCTK_INT *ni, + const CCTK_INT *nj, + const CCTK_INT *nk, + const CCTK_INT *dir, + const CCTK_INT *bb, + const CCTK_INT *gsize, + const CCTK_REAL *delta, + const CCTK_INT *up, + CCTK_REAL *dvar); + void CCTK_FCALL CCTK_FNAME(up_deriv_gf_6_3_opt)(const CCTK_REAL *var, + const CCTK_INT *ni, + const CCTK_INT *nj, + const CCTK_INT *nk, + const CCTK_INT *dir, + const CCTK_INT *bb, + const CCTK_INT *gsize, + const CCTK_REAL *delta, + const CCTK_INT *up, + CCTK_REAL *dvar); + void CCTK_FCALL CCTK_FNAME(up_deriv_gf_8_4_opt)(const CCTK_REAL *var, + const CCTK_INT *ni, + const CCTK_INT *nj, + const CCTK_INT *nk, + const CCTK_INT *dir, + const CCTK_INT *bb, + const CCTK_INT *gsize, + const CCTK_REAL *delta, + const CCTK_INT *up, + CCTK_REAL *dvar); + + + ni = cctk_lsh[0]; nj = cctk_lsh[1]; nk = cctk_lsh[2]; + + 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; + } + + symtable = SymmetryTableHandleForGrid (cctkGH); + if (symtable<0) { + CCTK_WARN(0,"symtable is out of bounds"); + } + + ierr = Util_TableGetIntArray (symtable, 6, symbnd, "symmetry_handle"); + if (ierr!=6) { + CCTK_WARN(0,"Util_TableGetIntArray returned error"); + } + + pen_sym_handle = SymmetryHandleOfName ( "multipatch" ); + + switch(dir) { + case 0: { + delta = CCTK_DELTA_SPACE(0); + if ( symbnd[0] == pen_sym_handle && cctk_bbox[0] == 1 ) { + bb[0] = 1; + } else { + bb[0] = 0; + } + if ( symbnd[1] == pen_sym_handle && cctk_bbox[1] == 1 ) { + bb[1] = 1; + } else { + bb[1] = 0; + } + gsize = cctk_nghostzones[0]; + break; + } + case 1: { + delta = CCTK_DELTA_SPACE(1); + if ( symbnd[2] == pen_sym_handle && cctk_bbox[2] == 1) { + bb[0] = 1; + } else { + bb[0] = 0; + } + if ( symbnd[3] == pen_sym_handle && cctk_bbox[3] == 1) { + bb[1] = 1; + } else { + bb[1] = 0; + } + gsize = cctk_nghostzones[1]; + break; + } + case 2: { + delta = CCTK_DELTA_SPACE(2); + if ( symbnd[4] == pen_sym_handle && cctk_bbox[4] == 1) { + bb[0] = 1; + } else { + bb[0] = 0; + } + if ( symbnd[4] == pen_sym_handle && cctk_bbox[5] == 1) { + bb[1] = 1; + } else { + bb[1] = 0; + } + gsize = cctk_nghostzones[2]; + break; + } + default: + CCTK_WARN (0, "Wrong direction specified"); + } + + if ( CCTK_Equals(norm_type,"Diagonal") ) { + if ( CCTK_Equals(operator_type,"Minimal Bandwidth") ) { + switch(loc_order) { + case 2: { + CCTK_FNAME(up_deriv_gf_2_1)(var,&ni,&nj,&nk,&dir,bb,&gsize,&delta,&up,dvar); + break; + } + case 4: { + CCTK_FNAME(up_deriv_gf_4_2)(var,&ni,&nj,&nk,&dir,bb,&gsize,&delta,&up,dvar); + break; + } + default: + CCTK_WARN (0, "Unknown stencil specified"); + } + } else { + switch(loc_order) { + case 2: { + CCTK_FNAME(up_deriv_gf_2_1)(var,&ni,&nj,&nk,&dir,bb,&gsize,&delta,&up,dvar); + break; + } + case 4: { + CCTK_FNAME(up_deriv_gf_4_2)(var,&ni,&nj,&nk,&dir,bb,&gsize,&delta,&up,dvar); + break; + } + case 6: { + CCTK_FNAME(up_deriv_gf_6_3_opt)(var,&ni,&nj,&nk,&dir,bb,&gsize,&delta,&up,dvar); + break; + } + case 8: { + CCTK_FNAME(up_deriv_gf_8_4_opt)(var,&ni,&nj,&nk,&dir,bb,&gsize,&delta,&up,dvar); + break; + } + default: + CCTK_WARN (0, "Unknown stencil specified"); + } + } + } else { + if ( CCTK_Equals(operator_type,"Minimal Bandwidth") ) { + switch(loc_order) { +/* case 4: { + CCTK_FNAME(deriv_gf_4_3)(var,&ni,&nj,&nk,&dir,bb,&gsize,&delta,dvar); + break; + } + case 6: { + CCTK_FNAME(deriv_gf_6_5)(var,&ni,&nj,&nk,&dir,bb,&gsize,&delta,dvar); + break; + } */ + default: + CCTK_WARN (0, "Unknown stencil specified"); + } + } else { + switch(loc_order) { +/* case 4: { + CCTK_FNAME(deriv_gf_4_3_opt)(var,&ni,&nj,&nk,&dir,bb,&gsize,&delta,dvar); + break; + } + case 6: { + CCTK_FNAME(deriv_gf_6_5_opt)(var,&ni,&nj,&nk,&dir,bb,&gsize,&delta,dvar); + break; + } */ + default: + CCTK_WARN (0, "Unknown stencil specified"); + } + } + } +} |