/*@@ @file CopyBoundary.c @date Mon Mar 15 15:09:00 1999 @author Gerd Lanfermann, Gabrielle Allen @desc Static boundary conditions for a given GF group or single GF @enddesc @@*/ /*#define DEBUG_BOUND*/ #include #include #include #include #include #include #include "cctk.h" #include "cctk_parameters.h" #include "CactusBase/CartGrid3D/src/Symmetry.h" #include "cctk_FortranString.h" /* The actual boundary condition */ void ApplyStatic3Di(cGH *GH, int *doBC, int *lsh, int *stencil_size, CCTK_REAL *var, CCTK_REAL *varp) { if (doBC[0] == 1) { int j,k,sw; #ifdef DEBUG_BOUND printf("Applying copy boundary for lower x\n"); #endif for (k=0;kextensions[CCTK_GHExtensionHandle("Symmetry")]; doBC = (int *)malloc(2*(GH->cctk_dim)*sizeof(int)); if (CCTK_GroupTypeFromVarI(vi) == GROUP_GF|| CCTK_GroupTypeFromVarI(vpi) == GROUP_GF) { int idim,retval; /* Apply condition if: + boundary is not a symmetry boundary, + boundary is a physical boundary + have enough grid points */ for (idim=0;idimcctk_dim;idim++) { doBC[idim*2] = (((sGHex->GFSym[vi][idim*2]==GFSYM_NOSYM)|| (sGHex->GFSym[vi][idim*2]==GFSYM_UNSET)) && GH->cctk_lsh[idim]>1 && GH->cctk_bbox[idim*2]); doBC[idim*2+1] = (((sGHex->GFSym[vi][idim*2+1]==GFSYM_NOSYM)|| (sGHex->GFSym[vi][idim*2+1]==GFSYM_UNSET)) && GH->cctk_lsh[idim]>1 && GH->cctk_bbox[idim*2+1]); } if (GH->cctk_dim == 3) { ApplyCopy3Di(GH, doBC, GH->cctk_lsh, stencil_size, GH->data[vi][0], GH->data[vpi][0]); retval = 0; } else { CCTKi_NotYetImplemented("Copy boundaries in other than 3D"); retval = -1; } } else { CCTK_WARN(1,"Applying boundary condition to non grid function"); retval = -2; } if (doBC) free(doBC); return(retval); } int CopyBCVar(cGH *GH, int *stencil_size, const char *impvarname, const char *imppvarname) { int vi,vip; vi = CCTK_VarIndex(impvarname); vip = CCTK_VarIndex(imppvarname); return(CopyBCVarI(GH, stencil_size, vi, vip)); } void FMODIFIER FORTRAN_NAME(CopyBCVar)(int *retval, cGH *GH, int *stencil_size, TWO_FORTSTRINGS_ARGS) { TWO_FORTSTRINGS_CREATE(impvarname,imppvarname) *retval = CopyBCVar(GH, stencil_size, impvarname,imppvarname); free(impvarname); free(imppvarname); } void FMODIFIER FORTRAN_NAME(CopyBCVarI)(int *retval, cGH *GH, int *stencil_size, int *vi, int *vip) { *retval = CopyBCVarI(GH, stencil_size, *vi, *vip); } /* Boundary Conditions by Group */ int CopyBCGroup(cGH *GH, int *stencil_size, const char *impgrpname, const char *imppgrpname) { int gi,gip; gi = CCTK_GroupIndex(impgrpname); gip = CCTK_GroupIndex(imppgrpname); return(CopyBCGroupI(GH, stencil_size, gi, gip)); } int CopyBCGroupI(cGH *GH, int *stencil_size, int gi, int gip) { int firstVarI,firstVarIp,numvars,vi,i1,i2; int retval=0, rettmp=0; firstVarI = CCTK_FirstVarIndexI(gi); firstVarIp = CCTK_FirstVarIndexI(gip); numvars = CCTK_NumVarsInGroupI(gi); for (vi=0; vi