/*@@ @file Startup.c @date Sun Jul 04 1999 @author Thomas Radke @desc Startup routines for PUGHInterp @enddesc @version $Id$ @@*/ #include #include "cctk.h" #include "util_Table.h" #include "cctk_Interp.h" #include "pughInterpGH.h" /* the rcs ID and its dummy function to use it */ static const char *rcsid = "$Header$"; CCTK_FILEVERSION(CactusPUGH_PUGHInterp_Startup_c) /******************************************************************** ******************** External Routines ************************ ********************************************************************/ void PUGHInterp_Startup (void); /******************************************************************** ******************** Internal Routines ************************ ********************************************************************/ #ifdef CCTK_MPI static void *SetupGH (tFleshConfig *config, int convergence_level, cGH *GH); #endif static int InterpGV_1stOrder (cGH *GH, const char *coord_system, int num_points, int num_in_array_indices, int num_out_arrays, const void *const interp_coord_arrays[], const int interp_coord_array_types[], const int in_array_indices[], void *const out_arrays[], const int out_array_types[]); static int InterpGV_2ndOrder (cGH *GH, const char *coord_system, int num_points, int num_in_array_indices, int num_out_arrays, const void *const interp_coord_arrays[], const int interp_coord_array_types[], const int in_array_indices[], void *const out_arrays[], const int out_array_types[]); static int InterpGV_3rdOrder (cGH *GH, const char *coord_system, int num_points, int num_in_array_indices, int num_out_arrays, const void *const interp_coord_arrays[], const int interp_coord_array_types[], const int in_array_indices[], void *const out_arrays[], const int out_array_types[]); static int PUGHInterp_InterpGV (cGH *GH, int order, const char *local_interpolator, const char *coord_system_name, int N_points, int N_input_arrays, int N_output_arrays, const void *const interp_coord_arrays[], const int interp_coord_array_types[], const int input_array_indices[], void *const output_arrays[], const int output_array_types[]); /*@@ @routine PUGHInterp_Startup @date Sun Jul 04 1999 @author Thomas Radke @desc The startup registration routine for PUGHInterp. Registers the PUGHInterp GH extensions setup routine and the interpolation operators with the flesh. @enddesc @calls CCTK_OverloadInterpGridArrays CCTK_RegisterGHExtensionSetupGH CCTK_InterpRegisterOperatorGV @@*/ void PUGHInterp_Startup (void) { CCTK_OverloadInterpGridArrays (PUGHInterp_InterpGridArrays); #ifdef CCTK_MPI CCTK_RegisterGHExtensionSetupGH (CCTK_RegisterGHExtension ("PUGHInterp"), SetupGH); #endif CCTK_InterpRegisterOperatorGV (InterpGV_1stOrder, "first-order uniform cartesian"); CCTK_InterpRegisterOperatorGV (InterpGV_2ndOrder, "second-order uniform cartesian"); CCTK_InterpRegisterOperatorGV (InterpGV_3rdOrder, "third-order uniform cartesian"); } /******************************************************************** ******************** Internal Routines ************************ ********************************************************************/ #ifdef CCTK_MPI /*@@ @routine SetupGH @date Sun Jul 04 1999 @author Thomas Radke @desc Allocates the GH extension structure and - for the MPI case - the count/displacement buffers used in MPI_Alltoall() and MPI_Alltoallv() @enddesc @calls CCTK_nProcs @returntype void * @returndesc pointer to the allocated GH extension structure @endreturndesc @@*/ static void *SetupGH (tFleshConfig *config, int convergence_level, cGH *GH) { int nprocs; pughInterpGH *myGH; /* suppress compiler warnings about unused variables */ (void) (config + 0); (void) (convergence_level + 0); myGH = malloc (sizeof (pughInterpGH)); /* allocate once for all fields of same type */ nprocs = CCTK_nProcs (GH); myGH->sendcnt = malloc (4 * nprocs * sizeof (int)); myGH->senddispl = myGH->sendcnt + nprocs; myGH->recvcnt = myGH->senddispl + nprocs; myGH->recvdispl = myGH->recvcnt + nprocs; myGH->N_points_from = malloc (2 * nprocs * sizeof (CCTK_INT)); myGH->N_points_to = myGH->N_points_from + nprocs; return (myGH); } #endif /* CCTK_MPI */ /*@@ @routine InterpGV_NthOrder @date Wed 14 Feb 2001 @author Thomas Radke @desc Wrappers for the different interpolation operators registered for first/second/third order interpolation. These wrappers just call the common interpolation routine passing all arguments plus the interpolation order. @enddesc @returntype int @returndesc the return code of the common interpolation routine @endreturndesc @@*/ static int InterpGV_1stOrder (cGH *GH, const char *coord_system, int num_points, int num_in_array_indices, int num_out_arrays, const void *const interp_coord_arrays[], const int interp_coord_array_types[], const int in_array_indices[], void *const out_arrays[], const int out_array_types[]) { return (PUGHInterp_InterpGV (GH, 1, "first-order uniform cartesian", coord_system, num_points, num_in_array_indices, num_out_arrays, interp_coord_arrays, interp_coord_array_types, in_array_indices, out_arrays, out_array_types)); } static int InterpGV_2ndOrder (cGH *GH, const char *coord_system, int num_points, int num_in_array_indices, int num_out_arrays, const void *const interp_coord_arrays[], const int interp_coord_array_types[], const int in_array_indices[], void *const out_arrays[], const int out_array_types[]) { return (PUGHInterp_InterpGV (GH, 2, "second-order uniform cartesian", coord_system, num_points, num_in_array_indices, num_out_arrays, interp_coord_arrays, interp_coord_array_types, in_array_indices, out_arrays, out_array_types)); } static int InterpGV_3rdOrder (cGH *GH, const char *coord_system, int num_points, int num_in_array_indices, int num_out_arrays, const void *const interp_coord_arrays[], const int interp_coord_array_types[], const int in_array_indices[], void *const out_arrays[], const int out_array_types[]) { return (PUGHInterp_InterpGV (GH, 3, "third-order uniform cartesian", coord_system, num_points, num_in_array_indices, num_out_arrays, interp_coord_arrays, interp_coord_array_types, in_array_indices, out_arrays, out_array_types)); } static int PUGHInterp_InterpGV (cGH *GH, int order, const char *local_interpolator, const char *coord_system_name, int N_points, int N_input_arrays, int N_output_arrays, const void *const interp_coord_arrays[], const int interp_coord_array_types[], const int input_array_indices[], void *const output_arrays[], const int output_array_types[]) { int i, N_dims, retval; int local_interp_handle, param_table_handle, coord_system_handle; char table_string[64]; CCTK_INT *_input_array_indices, *_output_array_types; union { const cGH *const_GH; cGH *non_const_GH; } _GH; _GH.non_const_GH = GH; /* get dimensionality of the coordinate system */ N_dims = CCTK_CoordSystemDim (coord_system_name); if (N_dims <= 0) { CCTK_VWarn (1, __LINE__, __FILE__, CCTK_THORNSTRING, "Cannot get dimensions of coordinate system '%s'", coord_system_name); return (-1); } coord_system_handle = CCTK_CoordSystemHandle (coord_system_name); local_interp_handle = CCTK_InterpHandle (local_interpolator); /* turn native datatype arrays into CCTK_ datatypes */ _input_array_indices = malloc (2 * N_dims * sizeof (CCTK_INT)); _output_array_types = _input_array_indices + N_dims; for (i = 0; i < N_dims; i++) { _input_array_indices[i] = input_array_indices[i]; _output_array_types[i] = output_array_types[i]; } /* set up the parameter table (only supported option is "order") */ sprintf (table_string, "order = %d", order); param_table_handle = Util_TableCreateFromString (table_string); retval = PUGHInterp_InterpGridArrays (_GH.const_GH, N_dims, local_interp_handle, param_table_handle, coord_system_handle, N_points, interp_coord_array_types[0], interp_coord_arrays, N_input_arrays, _input_array_indices, N_output_arrays, _output_array_types, output_arrays); /* release resources */ Util_TableDestroy (param_table_handle); free (_input_array_indices); return (retval); }