From e847b302bfa4329eb6e5630d05eae0942cd701bb Mon Sep 17 00:00:00 2001 From: tradke Date: Wed, 29 Nov 2000 00:44:49 +0000 Subject: 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 --- src/DatatypeConversion.c | 218 +++++++++++++++++++++++++++++++++++++++++------ 1 file 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 - #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); } -- cgit v1.2.3