aboutsummaryrefslogtreecommitdiff
path: root/src/Startup.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/Startup.c')
-rw-r--r--src/Startup.c377
1 files changed, 246 insertions, 131 deletions
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);
}