From 2a2204af7b85195002e67e3ac5218da8926e2ff8 Mon Sep 17 00:00:00 2001 From: tradke Date: Tue, 8 Jul 2003 10:15:40 +0000 Subject: Changes to support both the new and the old interpolation API. A local interpolator named "uniform cartesian" is now provided under the new API. git-svn-id: http://svn.cactuscode.org/arrangements/CactusBase/LocalInterp/trunk@164 df1f8a13-aa1d-4dd4-9681-27ded5b42416 --- src/Startup.c | 377 ++++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 246 insertions(+), 131 deletions(-) (limited to 'src/Startup.c') diff --git a/src/Startup.c b/src/Startup.c index c51b34a..c8277f6 100644 --- a/src/Startup.c +++ b/src/Startup.c @@ -19,6 +19,8 @@ #include "cctk.h" #include "cctk_Interp.h" +#include "util_ErrorCodes.h" +#include "util_Table.h" #include "Interpolate.h" /* the rcs ID and its dummy function to use it */ @@ -26,160 +28,273 @@ static const char *rcsid = "$Header$"; CCTK_FILEVERSION(CactusBase_LocalInterp_Startup_c) -/* prototypes of externally-visible routines defined in this source file */ +/******************************************************************** + *************** External Routine Prototypes ******************* + ********************************************************************/ void LocalInterp_Startup(void); -/* prototypes of static routines defined in this source file */ -static int LocalInterp_InterpLocal_1stOrder(cGH *GH, - int num_points, - int num_dims, - int num_in_arrays, - int num_out_arrays, - const int coord_dims[], - const void *const coord_arrays[], - const int coord_array_types[], - const void *const interp_coord_arrays[], - const int interp_coord_array_types[], - const void *const in_arrays[], - const int in_array_types[], - void *const out_arrays[], - const int out_array_types[]); -static int LocalInterp_InterpLocal_2ndOrder(cGH *GH, - int num_points, - int num_dims, - int num_in_arrays, - int num_out_arrays, - const int coord_dims[], - const void *const coord_arrays[], - const int coord_array_types[], - const void *const interp_coord_arrays[], - const int interp_coord_array_types[], - const void *const in_arrays[], - const int in_array_types[], - void *const out_arrays[], - const int out_array_types[]); -static int LocalInterp_InterpLocal_3rdOrder(cGH *GH, - int num_points, - int num_dims, - int num_in_arrays, - int num_out_arrays, - const int coord_dims[], - const void *const coord_arrays[], - const int coord_array_types[], - const void *const interp_coord_arrays[], - const int interp_coord_array_types[], - const void *const in_arrays[], - const int in_array_types[], - void *const out_arrays[], - const int out_array_types[]); - -/******************************************************************************/ +/******************************************************************** + *************** Internal Routine Prototypes ******************* + ********************************************************************/ +static int InterpLocal_1stOrder (cGH *GH, + int num_points, + int num_dims, + int num_in_arrays, + int num_out_arrays, + const int coord_dims[], + const void *const coord_arrays[], + const int coord_array_types[], + const void *const interp_coord_arrays[], + const int interp_coord_array_types[], + const void *const in_arrays[], + const int in_array_types[], + void *const out_arrays[], + const int out_array_types[]); +static int InterpLocal_2ndOrder (cGH *GH, + int num_points, + int num_dims, + int num_in_arrays, + int num_out_arrays, + const int coord_dims[], + const void *const coord_arrays[], + const int coord_array_types[], + const void *const interp_coord_arrays[], + const int interp_coord_array_types[], + const void *const in_arrays[], + const int in_array_types[], + void *const out_arrays[], + const int out_array_types[]); +static int InterpLocal_3rdOrder (cGH *GH, + int num_points, + int num_dims, + int num_in_arrays, + int num_out_arrays, + const int coord_dims[], + const void *const coord_arrays[], + const int coord_array_types[], + const void *const interp_coord_arrays[], + const int interp_coord_array_types[], + const void *const in_arrays[], + const int in_array_types[], + void *const out_arrays[], + const int out_array_types[]); +static int InterpLocal_NthOrder (cGH *GH, + int order, + int num_points, + int num_dims, + int num_in_arrays, + int num_out_arrays, + const int coord_dims[], + const void *const coord_arrays[], + const int coord_array_types[], + const void *const interp_coord_arrays[], + const int interp_coord_array_types[], + const void *const in_arrays[], + const int in_array_types[], + void *const out_arrays[], + const int out_array_types[]); + +/******************************************************************** + ******************** External Routines ************************ + ********************************************************************/ + +/*@@ + @routine LocalInterp_Startup + @date Sun Jul 04 1999 + @author Thomas Radke + @desc + The startup registration routine for LocalInterp. + Registers the interpolation operators with the flesh. + @enddesc + @calls CCTK_InterpRegisterOperatorLocal + @@*/ +void LocalInterp_Startup (void) +{ + CCTK_InterpRegisterOpLocalUniform (LocalInterp_InterpLocalUniform, + "uniform cartesian", CCTK_THORNSTRING); + + CCTK_InterpRegisterOperatorLocal (InterpLocal_1stOrder, + "first-order uniform cartesian"); + CCTK_InterpRegisterOperatorLocal (InterpLocal_2ndOrder, + "second-order uniform cartesian"); + CCTK_InterpRegisterOperatorLocal (InterpLocal_3rdOrder, + "third-order uniform cartesian"); +} + + +/******************************************************************** + ******************** Internal Routines ************************ + ********************************************************************/ /*@@ - @routine LocalInterp_InterpLocal_NthOrder + @routine InterpLocal_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. + LocalInterp's first/second/third order interpolation operators + which are registered with the flesh's old interpolation API. + These routines are just wrappers which translate their arguments + to call LocalInterp's interpolation operator for the new API. @enddesc @returntype int @returndesc - the return code of the common interpolation routine + the return code of LocalInterp's interpolation operator @endreturndesc - @@*/ -static int LocalInterp_InterpLocal_1stOrder(cGH *GH, - int num_points, - int num_dims, - int num_in_arrays, - int num_out_arrays, - const int coord_dims[], - const void *const coord_arrays[], - const int coord_array_types[], - const void *const interp_coord_arrays[], - const int interp_coord_array_types[], - const void *const in_arrays[], - const int in_array_types[], - void *const out_arrays[], - const int out_array_types[]) + @@*/ +static int InterpLocal_1stOrder (cGH *GH, + int num_points, + int num_dims, + int num_in_arrays, + int num_out_arrays, + const int coord_dims[], + const void *const coord_arrays[], + const int coord_array_types[], + const void *const interp_coord_arrays[], + const int interp_coord_array_types[], + const void *const in_arrays[], + const int in_array_types[], + void *const out_arrays[], + const int out_array_types[]) { - return (LocalInterp_InterpLocal (GH, 1, num_points, num_dims, - num_in_arrays, num_out_arrays, - coord_dims, coord_arrays, coord_array_types, - interp_coord_arrays, interp_coord_array_types, - in_arrays, in_array_types, - out_arrays, out_array_types)); + return (InterpLocal_NthOrder (GH, 1, num_points, num_dims, + num_in_arrays, num_out_arrays, + coord_dims, coord_arrays, coord_array_types, + interp_coord_arrays, interp_coord_array_types, + in_arrays, in_array_types, + out_arrays, out_array_types)); } -static int LocalInterp_InterpLocal_2ndOrder(cGH *GH, - int num_points, - int num_dims, - int num_in_arrays, - int num_out_arrays, - const int coord_dims[], - const void *const coord_arrays[], - const int coord_array_types[], - const void *const interp_coord_arrays[], - const int interp_coord_array_types[], - const void *const in_arrays[], - const int in_array_types[], - void *const out_arrays[], - const int out_array_types[]) +static int InterpLocal_2ndOrder (cGH *GH, + int num_points, + int num_dims, + int num_in_arrays, + int num_out_arrays, + const int coord_dims[], + const void *const coord_arrays[], + const int coord_array_types[], + const void *const interp_coord_arrays[], + const int interp_coord_array_types[], + const void *const in_arrays[], + const int in_array_types[], + void *const out_arrays[], + const int out_array_types[]) { - return (LocalInterp_InterpLocal (GH, 2, num_points, num_dims, - num_in_arrays, num_out_arrays, - coord_dims, coord_arrays, coord_array_types, - interp_coord_arrays, interp_coord_array_types, - in_arrays, in_array_types, - out_arrays, out_array_types)); + return (InterpLocal_NthOrder (GH, 2, num_points, num_dims, + num_in_arrays, num_out_arrays, + coord_dims, coord_arrays, coord_array_types, + interp_coord_arrays, interp_coord_array_types, + in_arrays, in_array_types, + out_arrays, out_array_types)); } -static int LocalInterp_InterpLocal_3rdOrder(cGH *GH, - int num_points, - int num_dims, - int num_in_arrays, - int num_out_arrays, - const int coord_dims[], - const void *const coord_arrays[], - const int coord_array_types[], - const void *const interp_coord_arrays[], - const int interp_coord_array_types[], - const void *const in_arrays[], - const int in_array_types[], - void *const out_arrays[], - const int out_array_types[]) +static int InterpLocal_3rdOrder (cGH *GH, + int num_points, + int num_dims, + int num_in_arrays, + int num_out_arrays, + const int coord_dims[], + const void *const coord_arrays[], + const int coord_array_types[], + const void *const interp_coord_arrays[], + const int interp_coord_array_types[], + const void *const in_arrays[], + const int in_array_types[], + void *const out_arrays[], + const int out_array_types[]) { - return (LocalInterp_InterpLocal (GH, 3, num_points, num_dims, - num_in_arrays, num_out_arrays, - coord_dims, coord_arrays, coord_array_types, - interp_coord_arrays, interp_coord_array_types, - in_arrays, in_array_types, - out_arrays, out_array_types)); + return (InterpLocal_NthOrder (GH, 3, num_points, num_dims, + num_in_arrays, num_out_arrays, + coord_dims, coord_arrays, coord_array_types, + interp_coord_arrays, interp_coord_array_types, + in_arrays, in_array_types, + out_arrays, out_array_types)); } -/******************************************************************************/ -/*@@ - @routine LocalInterp_Startup - @date Sun Jul 04 1999 - @author Thomas Radke - @desc - The startup registration routine for LocalInterp. - Registers the interpolation operators with the flesh. - @enddesc - @calls CCTK_InterpRegisterOperatorLocal - @@*/ -void LocalInterp_Startup(void) +static int InterpLocal_NthOrder (cGH *GH, + int order, + int num_points, + int num_dims, + int num_in_arrays, + int num_out_arrays, + const int coord_dims[], + const void *const coord_arrays[], + const int coord_array_types[], + const void *const interp_coord_arrays[], + const int interp_coord_array_types[], + const void *const in_arrays[], + const int in_array_types[], + void *const out_arrays[], + const int out_array_types[]) { - CCTK_InterpRegisterOperatorLocal (LocalInterp_InterpLocal_1stOrder, - "first-order uniform cartesian"); - CCTK_InterpRegisterOperatorLocal (LocalInterp_InterpLocal_2ndOrder, - "second-order uniform cartesian"); - CCTK_InterpRegisterOperatorLocal (LocalInterp_InterpLocal_3rdOrder, - "third-order uniform cartesian"); + int i, table, retval; + CCTK_INT *_coord_dims, *_in_array_types, *_out_array_types; + CCTK_REAL *origin, *delta; + char string[32]; + + + /* no information needed from the GH */ + (void *) (GH + 0); + + /* need to turn int's into CCTK_INT's */ + _coord_dims = malloc ((num_dims + num_in_arrays + num_out_arrays) * + sizeof (CCTK_INT)); + _in_array_types = _coord_dims + num_dims; + _out_array_types = _in_array_types + num_in_arrays; + for (i = 0; i < num_in_arrays; i++) + { + _in_array_types[i] = in_array_types[i]; + } + for (i = 0; i < num_out_arrays; i++) + { + _out_array_types[i] = out_array_types[i]; + } + + /* for now we can only deal with coordinates of type CCTK_REAL */ + for (i = 0; i < num_dims; i++) + { + if (coord_array_types[i] != CCTK_VARIABLE_REAL) + { + CCTK_WARN (1, "Coordinates must be of type CCTK_REAL"); + return (UTIL_ERROR_BAD_INPUT); + } + if (interp_coord_array_types[i] != CCTK_VARIABLE_REAL) + { + CCTK_WARN (1, "Interpolation coordinates must be of type CCTK_REAL"); + return (UTIL_ERROR_BAD_INPUT); + } + + _coord_dims[i] = coord_dims[i]; + } + + /* get the grid spacings - this assumes a uniform cartesian grid */ + origin = malloc (2 * num_dims * sizeof (CCTK_REAL)); + delta = origin + num_dims; + for (i = 0; i < num_dims; i++) + { + origin[i] = ((const CCTK_REAL *const *) coord_arrays)[i][0]; + delta[i] = origin[i+1] - origin[i]; + } + + /* create a table with the interpolation order information */ + sprintf (string, "order = %d", order); + table = Util_TableCreateFromString (string); + + /* call the interpolator function */ + retval = LocalInterp_InterpLocalUniform (num_dims, table, origin, delta, + num_points, CCTK_VARIABLE_REAL, + interp_coord_arrays, num_in_arrays, + _coord_dims, _in_array_types, + in_arrays, num_out_arrays, + _out_array_types, out_arrays); + + /* free allocated resources */ + Util_TableDestroy (table); + free (origin); + free (_coord_dims); + + return (retval); } -- cgit v1.2.3