diff options
author | lanfer <lanfer@c78560ca-4b45-4335-b268-5f3340f3cb52> | 2000-04-07 18:13:32 +0000 |
---|---|---|
committer | lanfer <lanfer@c78560ca-4b45-4335-b268-5f3340f3cb52> | 2000-04-07 18:13:32 +0000 |
commit | 017afaf0b60b5e3be6f5da6d5ce55c1acb790773 (patch) | |
tree | 94989e7ce7256fdc8965b169a95bee714d91905f | |
parent | 767cc468eced62ca904b7119d26aec0e06ce9840 (diff) |
symmetry conditions for quadrant/bitant and 1D/2D support
git-svn-id: http://svn.cactuscode.org/arrangements/CactusBase/CartGrid3D/trunk@99 c78560ca-4b45-4335-b268-5f3340f3cb52
-rw-r--r-- | src/SetSymmetry.c | 389 |
1 files changed, 389 insertions, 0 deletions
diff --git a/src/SetSymmetry.c b/src/SetSymmetry.c new file mode 100644 index 0000000..b87282d --- /dev/null +++ b/src/SetSymmetry.c @@ -0,0 +1,389 @@ +/*@@ + @file Symmetry.c + @date Mon Mar 15 15:09:00 1999 + @author Gerd Lanfermann + @desc + This file contains the routines for registering and applying symmetry + boundary conditions + @enddesc + @@*/ + +#include <assert.h> +#include <stdlib.h> +#include <stdio.h> + +#include "cctk.h" +#include "cctk_Parameters.h" +#include "Symmetry.h" +#include "cctk_FortranString.h" + + + /*@@ + @routine SetCartSymmetry + @date Mon Mar 15 15:10:58 1999 + @author Gerd Lanfermann + @desc + This routine sets the GH extension (EinsteinBoundGHex *bGHex), + which describes the symmetry boundary type of each GF. Takes + the name of the GF ("implementation::gfname") and the symmetry operators + sx,sy,sz and inserts them in the array bGHex. + These values will looked up by the application routines SymmetryWrappers + @enddesc + @calls + @calledby + @history + + @endhistory + +@@*/ + +int SetCartSymVI(cGH *GH, int *sym, int vi) { + + DECLARE_CCTK_PARAMETERS + + SymmetryGHex *sGHex; + + + /* Pointer to the SymmetryGHextension */ + sGHex = (SymmetryGHex *)GH->extensions[CCTK_GHExtensionHandle("Symmetry")]; + + /* Reference the hash table in the GHex and tell it what kind of + symmetry is being applied + (depending on sym and the grid layout) + If there is no symmetry necessary,set ESYM_NOSYM + When we apply a symmetry and find ESYM_UNSET, something went wrong! + */ + +#ifdef SYM_DEBUG + printf("SetSymmetry: %s [%d,%d,%d]\n",CCTK_VarName(vi), sym[0],sym[1],sym[2]); +#endif + + if (CCTK_Equals(domain,"full")) + { + sGHex->GFSym[vi][0] = GFSYM_NOSYM; + sGHex->GFSym[vi][2] = GFSYM_NOSYM; + sGHex->GFSym[vi][4] = GFSYM_NOSYM; + + } + else if (CCTK_Equals(domain,"octant")) + { + sGHex->GFSym[vi][0] = sym[0]; + sGHex->GFSym[vi][2] = sym[1]; + sGHex->GFSym[vi][4] = sym[2]; + + } + else if (CCTK_Equals(domain,"quadrant")) + { + sGHex->GFSym[vi][0] = sym[0]; + sGHex->GFSym[vi][2] = sym[1]; + sGHex->GFSym[vi][4] = GFSYM_NOSYM; + + } + else if (CCTK_Equals(domain,"bitant")) + { + sGHex->GFSym[vi][0] = GFSYM_NOSYM; + sGHex->GFSym[vi][2] = GFSYM_NOSYM; + sGHex->GFSym[vi][4] = GFSYM_NOSYM; + if (CCTK_Equals(bitant_plane,"xy")) sGHex->GFSym[vi][4]=sym[2]; + if (CCTK_Equals(bitant_plane,"xz")) sGHex->GFSym[vi][2]=sym[1]; + if (CCTK_Equals(bitant_plane,"yz")) sGHex->GFSym[vi][0]=sym[0]; + } + else + { + CCTK_WARN(1,"This kind of domain not supported for symmetries."); + return(-1); + } + +#ifdef SYM_DEBUG + printf("SetSymmetry: %s [%d,%d,%d]\n\n",imp_gf, + sGHex->GFSym[vi][0], + sGHex->GFSym[vi][2], + sGHex->GFSym[vi][4]); +#endif + return(0); +} + +void FMODIFIER FORTRAN_NAME(SetCartSymVI) + (int *ierr, cGH *GH, int *sym, int *vi) +{ + *ierr = SetCartSymVI(GH, sym, *vi); +} + +int SetCartSymVN(cGH *GH, int *sym, const char *vn) { + int vi; + char mess[128]; + vi = CCTK_VarIndex(vn); + + if (vi>-1) + return(SetCartSymVI(GH, sym, vi)); + else + { + sprintf(mess,"Cannot find variable %s in SetCartSymVN",vn); + CCTK_WARN(1,mess); + return(-1); + } +} + +void FMODIFIER FORTRAN_NAME(SetCartSymVN) + (int *ierr, cGH *GH, int *sym, ONE_FORTSTRING_ARG) +{ + ONE_FORTSTRING_CREATE(vn) + int vi; + char mess[128]; + + vi = CCTK_GroupIndex(vn); + + if (vi>-1) + *ierr = SetCartSymVI(GH, sym, vi); + else + { + sprintf(mess,"Cannot find variable %s in SetCartSymVN",vn); + CCTK_WARN(1,mess); + *ierr = -1; + } + free(vn); +} + + + +int SetCartSymGI(cGH *GH, int *sym, int gi) { + + DECLARE_CCTK_PARAMETERS + + SymmetryGHex *sGHex; + int first_vi,numvars,vi; + + + /* Pointer to the SymmetryGHextension */ + sGHex = (SymmetryGHex *)GH->extensions[CCTK_GHExtensionHandle("Symmetry")]; + + /* first index/number of variables in group */ + first_vi = CCTK_FirstVarIndexI(gi); + numvars = CCTK_NumVarsInGroupI(gi); + if (first_vi<0) + { + char mess[256]; + sprintf(mess,"Cannot find group %s (grp.index: %d) in SetCartSymGI", + CCTK_GroupName(gi),first_vi); + CCTK_WARN(1,mess); + return(-1); + } + + /* Reference the hash table in the GHex and tell it what kind of + symmetry is being applied + (depending on sym and the grid layout) + If there is no symmetry necessary,set ESYM_NOSYM + When we apply a symmetry and find ESYM_UNSET, something went wrong! + */ + for (vi=first_vi; vi<first_vi+numvars; vi++) + { + +#ifdef SYM_DEBUG + printf("SetSymmetry: %s [%d,%d,%d]\n",CCTK_VarName(vi), sym[0],sym[1],sym[2]); +#endif + + if (CCTK_Equals(domain,"full")) + { + sGHex->GFSym[vi][0] = GFSYM_NOSYM; + sGHex->GFSym[vi][2] = GFSYM_NOSYM; + sGHex->GFSym[vi][4] = GFSYM_NOSYM; + } + else if (CCTK_Equals(domain,"octant")) + { + sGHex->GFSym[vi][0] = sym[0]; + sGHex->GFSym[vi][2] = sym[1]; + sGHex->GFSym[vi][4] = sym[2]; + } + else if (CCTK_Equals(domain,"quadrant")) + { + sGHex->GFSym[vi][0] = sym[0]; + sGHex->GFSym[vi][2] = sym[1]; + sGHex->GFSym[vi][4] = GFSYM_NOSYM; + } + else if (CCTK_Equals(domain,"bitant")) + { + sGHex->GFSym[vi][0] = GFSYM_NOSYM; + sGHex->GFSym[vi][2] = GFSYM_NOSYM; + sGHex->GFSym[vi][4] = GFSYM_NOSYM; + if (CCTK_Equals(bitant_plane,"xy")) sGHex->GFSym[vi][4]=sym[2]; + if (CCTK_Equals(bitant_plane,"xz")) sGHex->GFSym[vi][2]=sym[1]; + if (CCTK_Equals(bitant_plane,"yz")) sGHex->GFSym[vi][0]=sym[0]; + } + else + { + CCTK_WARN(1,"This kind of domain not supported for symmetries."); + return(-1); + } + +#ifdef SYM_DEBUG + printf("SetSymmetry: %s [%d,%d,%d]\n\n",imp_gf, + sGHex->GFSym[vi][0], + sGHex->GFSym[vi][2], + sGHex->GFSym[vi][4]); +#endif + } + return(0); +} + +void FMODIFIER FORTRAN_NAME(SetCartSymGI) + (int *ierr, cGH *GH, int *sym, int *gi) +{ + *ierr = SetCartSymGI(GH, sym, *gi); +} + +int SetCartSymGN(cGH *GH, int *sym, const char *gn) { + int gi; + char mess[128]; + gi = CCTK_GroupIndex(gn); + + if (gi>-1) + return(SetCartSymGI(GH, sym, gi)); + else + { + sprintf(mess,"Cannot find group %s in SetCartSymGN",gn); + CCTK_WARN(1,mess); + return(-1); + } +} + +void FMODIFIER FORTRAN_NAME(SetCartSymGN) + (int *ierr, cGH *GH, int *sym, ONE_FORTSTRING_ARG) +{ + ONE_FORTSTRING_CREATE(gn) + int gi; + char mess[128]; + + gi = CCTK_GroupIndex(gn); + + if (gi>-1) + *ierr = SetCartSymGI(GH, sym, gi); + else + { + sprintf(mess,"Cannot find variable %s in SetCartSymGN",gn); + CCTK_WARN(1,mess); + *ierr = -1; + } + free(gn); +} + + + + + + + + + + + + +/* Function going to be deprecated */ +void SetCartSymmetry(cGH *GH, int *sym, const char *imp_gf) +{ + SetCartSymVN(GH, sym, imp_gf); +} + + +/* Function going to be deprecated */ +void FMODIFIER FORTRAN_NAME(SetCartSymmetry)(cGH *GH, int *sym, ONE_FORTSTRING_ARG) { + + ONE_FORTSTRING_CREATE(imp_gf) + SetCartSymVN(GH, sym, imp_gf); + free(imp_gf); +} + + +/* Function going to be deprecated */ +int CartSymBCGroupI(cGH *GH, int groupnum) +{ + return(CartSymGI(GH, groupnum)); +} + + +/* Function going to be deprecated */ +int CartSymBCVarI(cGH *GH, int varnum) +{ + return(CartSymGI(GH, varnum)); +} + + +/* Function is going to be deprecated */ +int CartSymBCVar(cGH *GH, char *name) +{ + + int index; + index = CCTK_VarIndex(name); + CartSymBCVarI(GH,index); + return 0; + +} + +/* Function is going to be deprecated */ +int CartSymBCGroup(cGH *GH, char *name) +{ + + int index; + int retval; + index = CCTK_GroupIndex(name); + /*retval = CartSymBCGroupI(GH,index);*/ + retval = CartSymGI(GH,index); + return retval; + +} + +/* Function is going to be deprecated */ +void FMODIFIER FORTRAN_NAME(CartSymBCVar) + (int *ierr, cGH *GH, ONE_FORTSTRING_ARG) +{ + + ONE_FORTSTRING_CREATE(name) + /* *ierr = CartSymBCVar(GH,name);*/ + *ierr = CartSymVN(GH,name); + free(name); +} + +/* Function is going to be deprecated */ +void FMODIFIER FORTRAN_NAME(CartSymBCGroup) + (int *ierr, cGH *GH, ONE_FORTSTRING_ARG) +{ + ONE_FORTSTRING_CREATE(name) + /* *ierr = CartSymBCGroup(GH,name); */ + *ierr = CartSymGN(GH,name); + free(name); +} + +/* Function is going to be deprecated */ +void FMODIFIER FORTRAN_NAME(ApplySymmetry)(cGH *GH, ONE_FORTSTRING_ARG) +{ + + ONE_FORTSTRING_CREATE(name) + /*$CartSymBCGroup(GH,name);$*/ + CartSymGN(GH,name); + free(name); +} + +/* Function is going to be deprecated */ +void FMODIFIER FORTRAN_NAME(CartSymBCVarI) + (int *ierr, cGH *GH, int *index) +{ + /* *ierr = CartSymBCVarI(GH,*index);*/ + *ierr = CartSymVI(GH,*index); +} + +/* Function is going to be deprecated */ +void FMODIFIER FORTRAN_NAME(CartSymBCGroupI) + (int *ierr, cGH *GH, int *index) +{ + /*$ *ierr = CartSymBCGroupI(GH,*index);$*/ + *ierr = CartSymGI(GH,*index); +} + + + + + + + + + + |