aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortradke <tradke@10716dce-81a3-4424-a2c8-48026a0d3035>2000-11-29 00:44:49 +0000
committertradke <tradke@10716dce-81a3-4424-a2c8-48026a0d3035>2000-11-29 00:44:49 +0000
commite847b302bfa4329eb6e5630d05eae0942cd701bb (patch)
tree843114e506a70bfbe914aad69480de0a9dc08f9a
parentee593ec7c9aba228c0c3f102088dc05683ed8a37 (diff)
Added all possible datatype conversion functions for
CCTK_INT_XXX -> CCTK_INT_YYY CCTK_REAL_XXX -> CCTK_REAL_YYY CCTK_COMPLEX_XXX -> CCTK_COMPLEX_YYY Added grdoc. git-svn-id: http://svn.cactuscode.org/arrangements/CactusPUGH/PUGHSlab/trunk@44 10716dce-81a3-4424-a2c8-48026a0d3035
-rw-r--r--src/DatatypeConversion.c218
1 files changed, 190 insertions, 28 deletions
diff --git a/src/DatatypeConversion.c b/src/DatatypeConversion.c
index fc0ce67..d53d676 100644
--- a/src/DatatypeConversion.c
+++ b/src/DatatypeConversion.c
@@ -8,46 +8,182 @@
@version $Id$
@@*/
-#include <string.h>
-
#include "cctk.h"
#include "NewPUGHSlab.h"
/* the rcs ID and its dummy function to use it */
-static char *rcsid="$ID: $";
+static char *rcsid="$Id$";
CCTK_FILEVERSION(CactusPUGH_PUGHSlab_DatatypeConversion_c)
-/* local function prototypes */
-static void PUGHSlab_REAL_to_REAL4 (void *_hdata,
- void *_vdata,
- unsigned int nelems);
+/* macro to generate a predefined conversion function
+ along with its prototype */
+#define CONVERSION_FUNCTION(src_type, dst_type, dst_scalartype, conversion) \
+ static void Convert_##src_type##_to_##dst_type (void *_dst, \
+ void *_src, \
+ unsigned int nelems); \
+ \
+ static void Convert_##src_type##_to_##dst_type (void *_dst, \
+ void *_src, \
+ unsigned int nelems) \
+ { \
+ ##dst_type *dst = (##dst_type *) _dst; \
+ ##src_type *src = (##src_type *) _src; \
+ \
+ \
+ while (nelems--) \
+ { \
+ conversion (*src, *dst, dst_scalartype); \
+ src++; dst++; \
+ } \
+ }
+
+/* the conversion of scalar datatypes (integers and reals) */
+#ifdef CONVERT
+#undef CONVERT
+#endif
+#define CONVERT(src, dst, dst_type) (dst) = (dst_type) (src)
+
+/* predefined conversion functions for integers */
+#if defined(CCTK_INT2) && defined(CCTK_INT4)
+CONVERSION_FUNCTION (CCTK_INT4, CCTK_INT2, CCTK_INT2, CONVERT);
+#endif
+#if defined(CCTK_INT2) && defined(CCTK_INT8)
+CONVERSION_FUNCTION (CCTK_INT8, CCTK_INT2, CCTK_INT2, CONVERT);
+#endif
+#if defined(CCTK_INT4) && defined(CCTK_INT8)
+CONVERSION_FUNCTION (CCTK_INT8, CCTK_INT4, CCTK_INT4, CONVERT);
+#endif
+
+/* predefined conversion functions for reals */
+#if defined(CCTK_REAL4) && defined(CCTK_REAL8)
+CONVERSION_FUNCTION (CCTK_REAL8, CCTK_REAL4, CCTK_REAL4, CONVERT);
+#endif
+#if defined(CCTK_REAL4) && defined(CCTK_REAL16)
+CONVERSION_FUNCTION (CCTK_REAL16, CCTK_REAL4, CCTK_REAL4, CONVERT);
+#endif
+#if defined(CCTK_REAL8) && defined(CCTK_REAL16)
+CONVERSION_FUNCTION (CCTK_REAL16, CCTK_REAL8, CCTK_REAL8, CONVERT);
+#endif
+
+/* the conversion of complex datatypes */
+#undef CONVERT
+#define CONVERT(src, dst, dst_type) (dst).Re = (dst_type) (src).Re; \
+ (dst).Im = (dst_type) (src).Im
+
+/* predefined conversion functions for complex */
+#if defined(CCTK_REAL4) && defined(CCTK_REAL8)
+CONVERSION_FUNCTION (CCTK_COMPLEX16, CCTK_COMPLEX8, CCTK_REAL4, CONVERT);
+#endif
+#if defined(CCTK_REAL4) && defined(CCTK_REAL16)
+CONVERSION_FUNCTION (CCTK_COMPLEX32, CCTK_COMPLEX16, CCTK_REAL8, CONVERT);
+#endif
+#if defined(CCTK_REAL8) && defined(CCTK_REAL16)
+CONVERSION_FUNCTION (CCTK_COMPLEX32, CCTK_COMPLEX8, CCTK_REAL4, CONVERT);
+#endif
+
+
+/* prototypes of routines defined in this source file */
+PUGHSlab_conversion_fn PUGHSlab_GetDatatypeConversionFn (int src, int dst);
+static int PUGHSlab_PrecisionVarType (int type);
/*@@
- @routine PUGH_Startup
- @date Wed Feb 3 23:14:38 1999
- @author Tom Goodale
+ @routine PUGHSlab_GetDatatypeConversionFn
+ @date Fri 23 Nov 2000
+ @author Thomas Radke
@desc
- The startup registration routine for PUGH.
+ Finds a predefined datatype conversion function.
@enddesc
- @calls
- @calledby
- @history
-
- @endhistory
+
+ @calls PUGHSlab_REAL8_to_REAL4
+ @var src
+ @vdesc CCTK datatype of the source
+ @vtype int
+ @vio in
+ @endvar
+ @var dst
+ @vdesc CCTK datatype of the destination (hyperslab datatype)
+ @vtype int
+ @vio in
+ @endvar
+
+ @returntype PUGHSlab_conversion_fn
+ @returndesc
+ the appropriate function pointer
+ or NULL if no predefined conversion function was found
+ @endreturndesc
@@*/
-PUGHSlab_conversion_fn PUGHSlab_GetDatatypeConversionFn (int vtype, int htype)
+PUGHSlab_conversion_fn PUGHSlab_GetDatatypeConversionFn (int src, int dst)
{
PUGHSlab_conversion_fn retval;
- if (vtype == CCTK_VARIABLE_REAL && htype == CCTK_VARIABLE_REAL4)
+ /* get the precision datatype for generic CCTK_TYPE variable types */
+ src = PUGHSlab_PrecisionVarType (src);
+ dst = PUGHSlab_PrecisionVarType (dst);
+
+ /* get the appropriate conversion routine */
+ if (0)
{
- retval = PUGHSlab_REAL_to_REAL4;
+ /* this is just because of the following #ifdef'ed else branches */
}
+#if defined(CCTK_INT2) && defined(CCTK_INT4)
+ else if (src == CCTK_VARIABLE_INT4 && dst == CCTK_VARIABLE_INT2)
+ {
+ retval = Convert_CCTK_INT4_to_CCTK_INT2;
+ }
+#endif
+#if defined(CCTK_INT2) && defined(CCTK_INT8)
+ else if (src == CCTK_VARIABLE_INT8 && dst == CCTK_VARIABLE_INT2)
+ {
+ retval = Convert_CCTK_INT8_to_CCTK_INT2;
+ }
+#endif
+#if defined(CCTK_INT4) && defined(CCTK_INT8)
+ else if (src == CCTK_VARIABLE_INT8 && dst == CCTK_VARIABLE_INT4)
+ {
+ retval = Convert_CCTK_INT8_to_CCTK_INT4;
+ }
+#endif
+#if defined(CCTK_REAL4) && defined(CCTK_REAL8)
+ else if (src == CCTK_VARIABLE_REAL8 && dst == CCTK_VARIABLE_REAL4)
+ {
+ retval = Convert_CCTK_REAL8_to_CCTK_REAL4;
+ }
+#endif
+#if defined(CCTK_REAL4) && defined(CCTK_REAL16)
+ else if (src == CCTK_VARIABLE_REAL16 && dst == CCTK_VARIABLE_REAL4)
+ {
+ retval = Convert_CCTK_REAL16_to_CCTK_REAL4;
+ }
+#endif
+#if defined(CCTK_REAL8) && defined(CCTK_REAL16)
+ else if (src == CCTK_VARIABLE_REAL16 && dst == CCTK_VARIABLE_REAL8)
+ {
+ retval = Convert_CCTK_REAL16_to_CCTK_REAL8;
+ }
+#endif
+#if defined(CCTK_REAL4) && defined(CCTK_REAL8)
+ else if (src == CCTK_VARIABLE_COMPLEX16 && dst == CCTK_VARIABLE_COMPLEX8)
+ {
+ retval = Convert_CCTK_COMPLEX16_to_CCTK_COMPLEX8;
+ }
+#endif
+#if defined(CCTK_REAL8) && defined(CCTK_REAL16)
+ else if (src == CCTK_VARIABLE_COMPLEX32 && dst == CCTK_VARIABLE_COMPLEX8)
+ {
+ retval = Convert_CCTK_COMPLEX32_to_CCTK_COMPLEX8;
+ }
+#endif
+#if defined(CCTK_REAL8) && defined(CCTK_REAL16)
+ else if (src == CCTK_VARIABLE_COMPLEX32 && dst == CCTK_VARIABLE_COMPLEX16)
+ {
+ retval = Convert_CCTK_COMPLEX32_to_CCTK_COMPLEX16;
+ }
+#endif
else
{
retval = NULL;
@@ -57,16 +193,42 @@ PUGHSlab_conversion_fn PUGHSlab_GetDatatypeConversionFn (int vtype, int htype)
}
-static void PUGHSlab_REAL_to_REAL4 (void *_hdata,
- void *_vdata,
- unsigned int nelems)
+/**************************************************************************/
+/* local functions */
+/**************************************************************************/
+/* get the precision datatype for generic CCTK_TYPE variable types */
+static int PUGHSlab_PrecisionVarType (int type)
{
- CCTK_REAL *vdata = (CCTK_REAL *) _vdata;
- CCTK_REAL4 *hdata = (CCTK_REAL4 *) _hdata;
-
-
- while (nelems--)
+ if (type == CCTK_VARIABLE_INT)
{
- *hdata++ = (CCTK_REAL4) *vdata++;
+#ifdef CCTK_INTEGER_PRECISION_8
+ type = CCTK_VARIABLE_INT8;
+#elif CCTK_INTEGER_PRECISION_4
+ type = CCTK_VARIABLE_INT4;
+#elif CCTK_INTEGER_PRECISION_2
+ type = CCTK_VARIABLE_INT2;
+#endif
}
+ else if (type == CCTK_VARIABLE_REAL)
+ {
+#ifdef CCTK_REAL_PRECISION_16
+ type = CCTK_VARIABLE_REAL16;
+#elif CCTK_REAL_PRECISION_8
+ type = CCTK_VARIABLE_REAL8;
+#elif CCTK_REAL_PRECISION_4
+ type = CCTK_VARIABLE_REAL4;
+#endif
+ }
+ else if (type == CCTK_VARIABLE_COMPLEX)
+ {
+#ifdef CCTK_REAL_PRECISION_16
+ type = CCTK_VARIABLE_COMPLEX32;
+#elif CCTK_REAL_PRECISION_8
+ type = CCTK_VARIABLE_COMPLEX16;
+#elif CCTK_REAL_PRECISION_4
+ type = CCTK_VARIABLE_COMPLEX8;
+#endif
+ }
+
+ return (type);
}