aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgoodale <goodale@c78560ca-4b45-4335-b268-5f3340f3cb52>2005-01-29 01:45:03 +0000
committergoodale <goodale@c78560ca-4b45-4335-b268-5f3340f3cb52>2005-01-29 01:45:03 +0000
commitc16172350debe509e188cac020a31cdd3d3cd90f (patch)
treef7dc7051d3b3039828afef9af049fc943c93fef4
parentc7e8a0a9112c2c71a9fac3f94d910472c154df3c (diff)
First cut at reducing compilation time/load of this file. Have
halved the time. Needs a bit of tidying and could be made a bit more efficient. git-svn-id: http://svn.cactuscode.org/arrangements/CactusBase/CartGrid3D/trunk@214 c78560ca-4b45-4335-b268-5f3340f3cb52
-rw-r--r--src/Symmetry.c227
1 files changed, 132 insertions, 95 deletions
diff --git a/src/Symmetry.c b/src/Symmetry.c
index 386b578..3b54fe6 100644
--- a/src/Symmetry.c
+++ b/src/Symmetry.c
@@ -338,44 +338,36 @@ void CCTK_FCALL CCTK_FNAME (CartSymVN)
{ \
cctk_type *_var = GH->data[vindex][0]; \
\
- \
- /* apply symmetry to the x faces */ \
- if (doSym[0] == GFSYM_REFLECTION) \
+ switch (group_static_data.dim) \
{ \
- APPLY_LOWER (0, i, j, k, lssh[1], lssh[2], offset[0]-i, j, k); \
+ case 3: \
+ /* apply symmetry to the z faces */ \
+ if (doSym[4] == GFSYM_REFLECTION) \
+ { \
+ APPLY_LOWER (4, k, j, i, lssh[1], lssh[0], i, j, offset[4]-k); \
} \
- if (doSym[1] == GFSYM_REFLECTION) \
+ if (doSym[5] == GFSYM_REFLECTION) \
{ \
- APPLY_UPPER (1, i, j, k, lssh[1], lssh[2], offset[1]-i, j, k); \
+ APPLY_UPPER (5, k, j, i, lssh[1], lssh[0], i, j, offset[5]-k); \
} \
- if (group_static_data.dim > 1) \
+ if (doSym[4] == GFSYM_ROTATION_X) \
{ \
- if (doSym[0] == GFSYM_ROTATION_Z) \
- { \
- APPLY_LOWER (0, i, j, k, lssh[1], lssh[2], offset[0]-i, lssh[1]-j-1, k);\
- } \
- if (doSym[1] == GFSYM_ROTATION_Z) \
- { \
- APPLY_UPPER (1, i, j, k, lssh[1], lssh[2], offset[1]-i, lssh[1]-j-1, k);\
- } \
+ APPLY_LOWER (4, k, j, i, lssh[1], lssh[0], i, lssh[1]-j-1, offset[4]-k); \
} \
- if (group_static_data.dim > 2) \
+ if (doSym[5] == GFSYM_ROTATION_X) \
{ \
- if (doSym[0] == GFSYM_ROTATION_Y) \
- { \
- APPLY_LOWER (0, i, j, k, lssh[1], lssh[2], offset[0]-i, j, lssh[2]-k-1);\
- } \
- if (doSym[1] == GFSYM_ROTATION_Y) \
- { \
- APPLY_UPPER (1, i, j, k, lssh[1], lssh[2], offset[1]-i, j, lssh[2]-k-1);\
- } \
+ APPLY_UPPER (5, k, j, i, lssh[1], lssh[0], i, lssh[1]-j-1, offset[5]-k); \
} \
- \
- if (group_static_data.dim == 1) \
+ if (doSym[4] == GFSYM_ROTATION_Y) \
{ \
- break; \
+ APPLY_LOWER (4, k, j, i, lssh[1], lssh[0], lssh[0]-i-1, j, offset[4]-k); \
} \
- \
+ if (doSym[5] == GFSYM_ROTATION_Y) \
+ { \
+ APPLY_UPPER (5, k, j, i, lssh[1], lssh[0], lssh[0]-i-1, j, offset[5]-k); \
+ } \
+ /* FALL THROUGH */ \
+ case 2: \
/* apply symmetry to the y faces */ \
if (doSym[2] == GFSYM_REFLECTION) \
{ \
@@ -404,39 +396,109 @@ void CCTK_FCALL CCTK_FNAME (CartSymVN)
APPLY_UPPER (3, j, k, i, lssh[2], lssh[0], i, offset[3]-j, lssh[2]-k-1);\
} \
} \
- \
- if (group_static_data.dim == 2) \
- { \
- break; \
- } \
- \
- /* apply symmetry to the z faces */ \
- if (doSym[4] == GFSYM_REFLECTION) \
- { \
- APPLY_LOWER (4, k, j, i, lssh[1], lssh[0], i, j, offset[4]-k); \
- } \
- if (doSym[5] == GFSYM_REFLECTION) \
+ /* FALL THROUGH */ \
+ case 1: \
+ /* apply symmetry to the x faces */ \
+ if (doSym[0] == GFSYM_REFLECTION) \
{ \
- APPLY_UPPER (5, k, j, i, lssh[1], lssh[0], i, j, offset[5]-k); \
+ APPLY_LOWER (0, i, j, k, lssh[1], lssh[2], offset[0]-i, j, k); \
} \
- if (doSym[4] == GFSYM_ROTATION_X) \
+ if (doSym[1] == GFSYM_REFLECTION) \
{ \
- APPLY_LOWER (4, k, j, i, lssh[1], lssh[0], i, lssh[1]-j-1, offset[4]-k); \
+ APPLY_UPPER (1, i, j, k, lssh[1], lssh[2], offset[1]-i, j, k); \
} \
- if (doSym[5] == GFSYM_ROTATION_X) \
+ if (group_static_data.dim > 1) \
{ \
- APPLY_UPPER (5, k, j, i, lssh[1], lssh[0], i, lssh[1]-j-1, offset[5]-k); \
+ if (doSym[0] == GFSYM_ROTATION_Z) \
+ { \
+ APPLY_LOWER (0, i, j, k, lssh[1], lssh[2], offset[0]-i, lssh[1]-j-1, k);\
+ } \
+ if (doSym[1] == GFSYM_ROTATION_Z) \
+ { \
+ APPLY_UPPER (1, i, j, k, lssh[1], lssh[2], offset[1]-i, lssh[1]-j-1, k);\
+ } \
} \
- if (doSym[4] == GFSYM_ROTATION_Y) \
+ if (group_static_data.dim > 2) \
{ \
- APPLY_LOWER (4, k, j, i, lssh[1], lssh[0], lssh[0]-i-1, j, offset[4]-k); \
+ if (doSym[0] == GFSYM_ROTATION_Y) \
+ { \
+ APPLY_LOWER (0, i, j, k, lssh[1], lssh[2], offset[0]-i, j, lssh[2]-k-1);\
+ } \
+ if (doSym[1] == GFSYM_ROTATION_Y) \
+ { \
+ APPLY_UPPER (1, i, j, k, lssh[1], lssh[2], offset[1]-i, j, lssh[2]-k-1);\
+ } \
} \
- if (doSym[5] == GFSYM_ROTATION_Y) \
- { \
- APPLY_UPPER (5, k, j, i, lssh[1], lssh[0], lssh[0]-i-1, j, offset[5]-k); \
+ /* FALL THROUGH */ \
+ default: \
+ ; \
} \
}
+/* Function to apply above macros. */
+#define SYMMETRY_FUNCTION(cctk_type,SUFFIX) \
+ static void cctk_type ## _SymBC ## SUFFIX(const cGH *GH, const int vindex, const int *doSym, const int *offset, const int *lsh, const int *lssh, const cGroup group_static_data, const cGroupDynamicData gdata, int **GFSym) { int i,j,k; SYMMETRY_BOUNDARY(cctk_type); }
+
+/* Create functions to apply macros.
+ * This is much easier for the optiser to deal with.
+ * E.g. on some machines we can't compile this file if we use the macros
+ * directly in the switch statement in ApplySymmetry.
+ */
+
+#define NUMBER_PART .Re
+SYMMETRY_FUNCTION(CCTK_COMPLEX,R)
+#ifdef HAVE_CCTK_COMPLEX8
+SYMMETRY_FUNCTION(CCTK_COMPLEX8,R)
+#endif
+#ifdef HAVE_CCTK_COMPLEX16
+SYMMETRY_FUNCTION(CCTK_COMPLEX16,R)
+#endif
+#ifdef HAVE_CCTK_COMPLEX32
+SYMMETRY_FUNCTION(CCTK_COMPLEX32,R)
+#endif
+#undef NUMBER_PART
+
+#define NUMBER_PART .Im
+SYMMETRY_FUNCTION(CCTK_COMPLEX,I)
+#ifdef HAVE_CCTK_COMPLEX8
+SYMMETRY_FUNCTION(CCTK_COMPLEX8,I)
+#endif
+#ifdef HAVE_CCTK_COMPLEX16
+SYMMETRY_FUNCTION(CCTK_COMPLEX16,I)
+#endif
+#ifdef HAVE_CCTK_COMPLEX32
+SYMMETRY_FUNCTION(CCTK_COMPLEX32,I)
+#endif
+#undef NUMBER_PART
+
+#define NUMBER_PART
+SYMMETRY_FUNCTION(CCTK_CHAR,R)
+SYMMETRY_FUNCTION(CCTK_INT,R)
+#ifdef HAVE_CCTK_INT1
+SYMMETRY_FUNCTION(CCTK_INT1,R)
+#endif
+#ifdef HAVE_CCTK_INT2
+SYMMETRY_FUNCTION(CCTK_INT2,R)
+#endif
+#ifdef HAVE_CCTK_INT4
+SYMMETRY_FUNCTION(CCTK_INT4,R)
+#endif
+#ifdef HAVE_CCTK_INT8
+SYMMETRY_FUNCTION(CCTK_INT8,R)
+#endif
+SYMMETRY_FUNCTION(CCTK_REAL,R)
+#ifdef HAVE_CCTK_REAL4
+SYMMETRY_FUNCTION(CCTK_REAL4,R)
+#endif
+#ifdef HAVE_CCTK_REAL8
+SYMMETRY_FUNCTION(CCTK_REAL8,R)
+#endif
+#ifdef HAVE_CCTK_REAL16
+SYMMETRY_FUNCTION(CCTK_REAL16,R)
+#endif
+#undef NUMBER_PART
+
+#define CALL_SYMBC(cctk_type,SUFFIX) cctk_type ## _SymBC ## SUFFIX(GH, vindex, doSym, offset, lsh, lssh, group_static_data, gdata, GFSym)
/*@@
@routine ApplySymmetry
@@ -575,91 +637,66 @@ static int ApplySymmetry (const cGH *GH, int gindex, int first_vindex,
lssh[dim/2] > 1 && GH->cctk_bbox[dim]) ? domainsym[dim] : 0;
}
-#define NUMBER_PART
-
switch (group_static_data.vartype)
{
case CCTK_VARIABLE_CHAR:
- SYMMETRY_BOUNDARY (CCTK_CHAR); break;
+ CALL_SYMBC(CCTK_CHAR,R); break;
case CCTK_VARIABLE_INT:
- SYMMETRY_BOUNDARY (CCTK_INT); break;
+ CALL_SYMBC(CCTK_INT,R); break;
case CCTK_VARIABLE_REAL:
- SYMMETRY_BOUNDARY (CCTK_REAL); break;
+ CALL_SYMBC(CCTK_REAL,R); break;
case CCTK_VARIABLE_COMPLEX:
-#undef NUMBER_PART
-#define NUMBER_PART .Re
- SYMMETRY_BOUNDARY (CCTK_COMPLEX);
-#undef NUMBER_PART
-#define NUMBER_PART .Im
- SYMMETRY_BOUNDARY (CCTK_COMPLEX); break;
-#undef NUMBER_PART
-#define NUMBER_PART
-
+ CALL_SYMBC(CCTK_COMPLEX,R);
+ CALL_SYMBC(CCTK_COMPLEX,I); break;
+
#ifdef CCTK_INT1
case CCTK_VARIABLE_INT1:
- SYMMETRY_BOUNDARY (CCTK_INT1); break;
+ CALL_SYMBC(CCTK_INT1,R); break;
#endif
#ifdef CCTK_INT2
case CCTK_VARIABLE_INT2:
- SYMMETRY_BOUNDARY (CCTK_INT2); break;
+ CALL_SYMBC(CCTK_INT2,R); break;
#endif
#ifdef CCTK_INT4
case CCTK_VARIABLE_INT4:
- SYMMETRY_BOUNDARY (CCTK_INT4); break;
+ CALL_SYMBC(CCTK_INT4,R); break;
#endif
#ifdef CCTK_INT8
case CCTK_VARIABLE_INT8:
- SYMMETRY_BOUNDARY (CCTK_INT8); break;
+ CALL_SYMBC(CCTK_INT8,R); break;
#endif
#ifdef CCTK_REAL4
case CCTK_VARIABLE_REAL4:
- SYMMETRY_BOUNDARY (CCTK_REAL4); break;
+ CALL_SYMBC(CCTK_REAL4,R); break;
case CCTK_VARIABLE_COMPLEX8:
-#undef NUMBER_PART
-#define NUMBER_PART .Re
- SYMMETRY_BOUNDARY (CCTK_COMPLEX8);
-#undef NUMBER_PART
-#define NUMBER_PART .Im
- SYMMETRY_BOUNDARY (CCTK_COMPLEX8); break;
-#undef NUMBER_PART
-#define NUMBER_PART
+ CALL_SYMBC(CCTK_COMPLEX8,R);
+ CALL_SYMBC(CCTK_COMPLEX8,I); break;
#endif
#ifdef CCTK_REAL8
case CCTK_VARIABLE_REAL8:
- SYMMETRY_BOUNDARY (CCTK_REAL8); break;
+ CALL_SYMBC(CCTK_REAL8,R); break;
case CCTK_VARIABLE_COMPLEX16:
-#undef NUMBER_PART
-#define NUMBER_PART .Re
- SYMMETRY_BOUNDARY (CCTK_COMPLEX16);
-#undef NUMBER_PART
-#define NUMBER_PART .Im
- SYMMETRY_BOUNDARY (CCTK_COMPLEX16); break;
-#undef NUMBER_PART
-#define NUMBER_PART
+ CALL_SYMBC(CCTK_COMPLEX16,R);
+ CALL_SYMBC(CCTK_COMPLEX16,I); break;
#endif
#ifdef CCTK_REAL16
case CCTK_VARIABLE_REAL16:
- SYMMETRY_BOUNDARY (CCTK_REAL16); break;
+ CALL_SYMBC(CCTK_REAL16,R); break;
case CCTK_VARIABLE_COMPLEX32:
-#undef NUMBER_PART
-#define NUMBER_PART .Re
- SYMMETRY_BOUNDARY (CCTK_COMPLEX32);
-#undef NUMBER_PART
-#define NUMBER_PART .Im
- SYMMETRY_BOUNDARY (CCTK_COMPLEX32); break;
-#undef NUMBER_PART
+ CALL_SYMBC(CCTK_COMPLEX32,R);
+ CALL_SYMBC(CCTK_COMPLEX32,I); break;
#endif
default:
@@ -674,7 +711,6 @@ static int ApplySymmetry (const cGH *GH, int gindex, int first_vindex,
}
-
/*@@
@routine CartGrid3D_ApplyBC
@date Sat Feb 07
@@ -741,3 +777,4 @@ void CartGrid3D_ApplyBC (CCTK_ARGUMENTS)
free (widths);
free (tables);
}
+