#include #include #include #include #include #include #include "cctk.h" #include "cctk_Parameters.h" #include "Symmetry.h" #include "cctk_FortranString.h" void CCTKi_NotYetImplemented(const char *message); void BndApplyRobin3Di(cGH *GH, int *sw, int *doBC, int *lsh, CCTK_REAL *var, CCTK_REAL *r, CCTK_REAL finf, CCTK_INT npow); int RobinBCVarI(cGH *GH, CCTK_REAL finf, CCTK_INT npow, int *sw, int vi) { SymmetryGHex *sGHex; int doBC[6]; /* lower/upper BCs applied (1) not applied (0) */ /* indexing as in bbox: 0 xlow, 1 xup, 2 ylow */ int retval=0; int ri; /* index of the radial coordinate field */ sGHex = (SymmetryGHex*)malloc(sizeof(SymmetryGHex)); sGHex = (SymmetryGHex*)GH->extensions[CCTK_GHExtensionHandle("Symmetry")]; /* Robin boundaries need radial coordinate */ ri = CCTK_CoordIndex("r"); /* We only apply BCs to GFs */ if (CCTK_GroupTypeFromVarI(vi) == GROUP_GF) { /* Apply boundary condition if - grid boundary are not symmetries - have a physical boundary - have enough gridpoints */ doBC[0]=(((sGHex->GFSym[vi][0]==GFSYM_NOSYM)|| (sGHex->GFSym[vi][0]==GFSYM_UNSET)) && GH->cctk_lsh[0]>1 && GH->cctk_bbox[0]); doBC[1]=(((sGHex->GFSym[vi][1]==GFSYM_NOSYM)|| (sGHex->GFSym[vi][1]==GFSYM_UNSET)) && GH->cctk_lsh[0]>1 && GH->cctk_bbox[1]); doBC[2]=(((sGHex->GFSym[vi][2]==GFSYM_NOSYM)|| (sGHex->GFSym[vi][2]==GFSYM_UNSET)) && GH->cctk_lsh[1]>1 && GH->cctk_bbox[2]); doBC[3]=(((sGHex->GFSym[vi][3]==GFSYM_NOSYM)|| (sGHex->GFSym[vi][3]==GFSYM_UNSET)) && GH->cctk_lsh[1]>1 && GH->cctk_bbox[3]); doBC[4]=(((sGHex->GFSym[vi][4]==GFSYM_NOSYM)|| (sGHex->GFSym[vi][4]==GFSYM_UNSET)) && GH->cctk_lsh[2]>1 && GH->cctk_bbox[4]); doBC[5]=(((sGHex->GFSym[vi][4]==GFSYM_NOSYM)|| (sGHex->GFSym[vi][4]==GFSYM_UNSET)) && GH->cctk_lsh[2]>1 && GH->cctk_bbox[5]); BndApplyRobin3Di(GH, sw, doBC, GH->cctk_lsh, GH->data[vi][0], GH->data[ri][0], finf, npow); } else { CCTK_WARN(1,"You are trying to apply BC to something other than a GF "); retval = -1; } return retval; } void FMODIFIER FORTRAN_NAME(RobinBCVarI)(int *ierr, cGH *GH, CCTK_REAL *finf, CCTK_INT *npow, int *sw, int *vi) { *ierr = RobinBCVarI(GH, *finf, *npow, sw, *vi); } int RobinBCVar(cGH *GH, CCTK_REAL finf, CCTK_INT npow, int *sw, const char *vn) { int vi; vi = CCTK_VarIndex(vn); return(RobinBCVarI(GH, finf, npow, sw, vi)); } void FMODIFIER FORTRAN_NAME(RobinBCVar)(int *ierr, cGH *GH, CCTK_REAL *finf, CCTK_INT *npow, int *sw, ONE_FORTSTRING_ARG) { ONE_FORTSTRING_CREATE(vn); *ierr = RobinBCVar(GH, *finf, *npow, sw, vn); free(vn); } int RobinBCGroupI(cGH *GH, CCTK_REAL finf, CCTK_INT npow, int *sw, int gi) { int firstVarI, numVar, vi; int retval = 0, rettmp = 0; firstVarI = CCTK_FirstVarIndexI(gi); numVar = CCTK_NumVarsInGroupI(gi); for (vi=0;vi