aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlanfer <lanfer@c78560ca-4b45-4335-b268-5f3340f3cb52>2000-04-07 18:13:32 +0000
committerlanfer <lanfer@c78560ca-4b45-4335-b268-5f3340f3cb52>2000-04-07 18:13:32 +0000
commit017afaf0b60b5e3be6f5da6d5ce55c1acb790773 (patch)
tree94989e7ce7256fdc8965b169a95bee714d91905f
parent767cc468eced62ca904b7119d26aec0e06ce9840 (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.c389
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);
+}
+
+
+
+
+
+
+
+
+
+