From c16172350debe509e188cac020a31cdd3d3cd90f Mon Sep 17 00:00:00 2001 From: goodale Date: Sat, 29 Jan 2005 01:45:03 +0000 Subject: 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 --- src/Symmetry.c | 227 +++++++++++++++++++++++++++++++++------------------------ 1 file 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); } + -- cgit v1.2.3