diff options
Diffstat (limited to 'src/Startup.c')
-rw-r--r-- | src/Startup.c | 198 |
1 files changed, 198 insertions, 0 deletions
diff --git a/src/Startup.c b/src/Startup.c new file mode 100644 index 0000000..b09c7e3 --- /dev/null +++ b/src/Startup.c @@ -0,0 +1,198 @@ +/*@@ + @file $RCSfile$ + @author $Author$ + @date $Date$ + @desc + Thorn startup + @version $Header$ + @enddesc +@@*/ + +#include <stdlib.h> + +#include "cctk.h" + +#include "util_Table.h" + +#include "SymBase.h" + + + +/* the rcs ID and its dummy function to use it */ +static const char *const rcsid = "$Header$"; +CCTK_FILEVERSION (CactusBase_SymBase_Startup_c); + + + +/*@@ + @routine SymBase_Startup + @author Erik Schnetter + @date 2004-03-06 + @desc + Register a GH extension and initialise the global variables + @enddesc + @returntype int + @returndesc + status code + 0 for success + @endreturndesc +@@*/ + +int +SymBase_Startup (void) +{ + int handle; + int ierr; + + handle = CCTK_RegisterGHExtension ("SymBase"); + if (handle < 0) + { + CCTK_WARN (0, "internal error"); + } + + ierr = CCTK_RegisterGHExtensionSetupGH (handle, SymBase_Setup); + if (ierr != 1) + { /* strange error code convention */ + CCTK_WARN (0, "internal error"); + } + + SymBase_num_symmetries = 0; + SymBase_symmetry_names = NULL; + + return 0; /* no error */ +} + + + +/*@@ + @routine SymBase_Setup + @author Erik Schnetter + @date 2004-03-06 + @desc + Initialise the GH extension + @enddesc + @var config + @vtype tFleshConfig * + @vdesc Internal flesh information, unused + @vio in + @endvar + @var convlev + @vtype int + @vdesc Convergence level, unused + @vio in + @endvar + @var cctkGH + @vtype cGH * + @vdesc Grid hierarchy + @vio in + @endvar +@@*/ + +void * +SymBase_Setup (tFleshConfig * const config, + int const convlev, cGH * const cctkGH) +{ + struct SymBase *symdata; + CCTK_INT symmetry_handle[100]; + CCTK_INT symmetry_zone_width[100]; + int group; + int face; + int ierr; + + /* Create GH extension */ + symdata = malloc (sizeof *symdata); + if (!symdata) + { + CCTK_WARN (0, "internal error"); + } + + /* Initialise handle and zone width arrays */ + for (face = 0; face < 100; ++face) + { + symmetry_handle[face] = -1; + symmetry_zone_width[face] = 0; + } + + /* Create grid symmetry table */ + symdata->sym_table = Util_TableCreate (UTIL_TABLE_FLAGS_CASE_INSENSITIVE); + if (symdata->sym_table < 0) + { + CCTK_WARN (0, "internal error"); + } + + if (2 * cctkGH->cctk_dim > 100) + { + CCTK_WARN (0, "internal error"); + } + ierr = Util_TableSetIntArray + (symdata->sym_table, + 2 * cctkGH->cctk_dim, symmetry_handle, "symmetry_handle"); + if (ierr) + { + CCTK_WARN (0, "internal error"); + } + ierr = Util_TableSetIntArray + (symdata->sym_table, + 2 * cctkGH->cctk_dim, symmetry_zone_width, "symmetry_zone_width"); + if (ierr) + { + CCTK_WARN (0, "internal error"); + } + + /* Create grid array symmetry tables */ + symdata->array_sym_tables + = malloc (CCTK_NumGroups () * sizeof *symdata->array_sym_tables); + if (!symdata->array_sym_tables) + { + CCTK_WARN (0, "internal error"); + } + + for (group = 0; group < CCTK_NumGroups (); ++group) + { + switch (CCTK_GroupTypeI (group)) + { + case CCTK_GF: + + /* No table */ + symdata->array_sym_tables[group] = -1; + break; + + case CCTK_SCALAR: + case CCTK_ARRAY: + + /* Create array symmetry table */ + symdata->array_sym_tables[group] + = Util_TableCreate (UTIL_TABLE_FLAGS_CASE_INSENSITIVE); + if (symdata->array_sym_tables[group] < 0) + { + CCTK_WARN (0, "internal error"); + } + + if (2 * CCTK_GroupDimI (group) > 100) + { + CCTK_WARN (0, "internal error"); + } + ierr = Util_TableSetIntArray + (symdata->array_sym_tables[group], + 2 * CCTK_GroupDimI (group), symmetry_handle, "symmetry_handle"); + if (ierr) + { + CCTK_WARN (0, "internal error"); + } + ierr = Util_TableSetIntArray + (symdata->array_sym_tables[group], + 2 * CCTK_GroupDimI (group), symmetry_zone_width, + "symmetry_zone_width"); + if (ierr) + { + CCTK_WARN (0, "internal error"); + } + break; + + default: + CCTK_WARN (0, "internal error"); + } + } + + return symdata; +} |