From 223ab02512f9b179051da44adcdd48315a2b3161 Mon Sep 17 00:00:00 2001 From: tradke Date: Mon, 1 Sep 2003 10:51:00 +0000 Subject: Fixed predefined routines for datatype conversions. Now they take the source and destination datatype as additional arguments, and the stride parameter was split into a source and a destination stride. This should be most general now. git-svn-id: http://svn.cactuscode.org/arrangements/CactusPUGH/PUGHSlab/trunk@107 10716dce-81a3-4424-a2c8-48026a0d3035 --- src/DatatypeConversion.c | 102 +++++++++++++++++++++++++---------------------- src/GetHyperslab.c | 86 ++++++++++++--------------------------- src/PUGHSlab.h | 12 +++--- 3 files changed, 87 insertions(+), 113 deletions(-) diff --git a/src/DatatypeConversion.c b/src/DatatypeConversion.c index 478da9b..4619744 100644 --- a/src/DatatypeConversion.c +++ b/src/DatatypeConversion.c @@ -2,12 +2,14 @@ @file DatatypeConversion.c @date Thursday Nov 23 2000 @author Thomas Radke - @desc + @desc Predefined datatype conversion routines for hyperslab extraction. - @enddesc + @enddesc @version $Id$ @@*/ +#include + #include "cctk.h" #include "PUGHSlab.h" #include "PUGHSlabi.h" @@ -20,72 +22,80 @@ CCTK_FILEVERSION(CactusPUGH_PUGHSlab_DatatypeConversion_c) /* 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 (const void *src, \ - void *dst, \ - CCTK_INT nelems, \ - CCTK_INT src_stride, \ - CCTK_INT dst_stride); \ +#define CONVERSION_FUNCTION(source_type, dest_type, dest_elemtype, conversion)\ +static CCTK_INT Convert##source_type##to##dest_type (CCTK_INT nelems, \ + CCTK_INT src_stride, \ + CCTK_INT dst_stride, \ + CCTK_INT src_type, \ + CCTK_INT dst_type, \ + CCTK_POINTER_TO_CONST src,\ + CCTK_POINTER dst); \ + \ +static CCTK_INT Convert##source_type##to##dest_type (CCTK_INT nelems, \ + CCTK_INT src_stride, \ + CCTK_INT dst_stride, \ + CCTK_INT src_type, \ + CCTK_INT dst_type, \ + CCTK_POINTER_TO_CONST src,\ + CCTK_POINTER dst) \ +{ \ + CCTK_INT _i; \ + CCTK_##dest_type *_dst = dst; \ + const CCTK_##source_type *_src = src; \ \ - static void Convert_##src_type##_to_##dst_type (const void *src, \ - void *dst, \ - CCTK_INT nelems, \ - CCTK_INT src_stride, \ - CCTK_INT dst_stride) \ - { \ - dst_type *_dst = (dst_type *) dst; \ - const src_type *_src = (const src_type *) src; \ \ + assert (src_type == CCTK_VARIABLE_##source_type); \ + assert (dst_type == CCTK_VARIABLE_##dest_type); \ + for (_i = 0; _i < nelems; _i++, _src += src_stride, _dst += dst_stride) \ + { \ + conversion (*_src, *_dst, dest_elemtype); \ + } \ \ - while (nelems--) \ - { \ - conversion (*_src, *_dst, dst_scalartype); \ - _src += src_stride; _dst += dst_stride; \ - } \ - } + return (nelems); \ +} /* the conversion of scalar datatypes (integers and reals) */ #ifdef CONVERT #undef CONVERT #endif -#define CONVERT(src, dst, dst_type) (dst) = (dst_type) (src) +#define CONVERT(src, dst, dst_type) (dst) = (CCTK_##dst_type) (src) /* predefined conversion functions for integers */ #if defined(CCTK_INT2) && defined(CCTK_INT4) -CONVERSION_FUNCTION (CCTK_INT4, CCTK_INT2, CCTK_INT2, CONVERT) +CONVERSION_FUNCTION (INT4, INT2, INT2, CONVERT) #endif #if defined(CCTK_INT2) && defined(CCTK_INT8) -CONVERSION_FUNCTION (CCTK_INT8, CCTK_INT2, CCTK_INT2, CONVERT) +CONVERSION_FUNCTION (INT8, INT2, INT2, CONVERT) #endif #if defined(CCTK_INT4) && defined(CCTK_INT8) -CONVERSION_FUNCTION (CCTK_INT8, CCTK_INT4, CCTK_INT4, CONVERT) +CONVERSION_FUNCTION (INT8, INT4, INT4, CONVERT) #endif /* predefined conversion functions for reals */ #if defined(CCTK_REAL4) && defined(CCTK_REAL8) -CONVERSION_FUNCTION (CCTK_REAL8, CCTK_REAL4, CCTK_REAL4, CONVERT) +CONVERSION_FUNCTION (REAL8, REAL4, REAL4, CONVERT) #endif #if defined(CCTK_REAL4) && defined(CCTK_REAL16) -CONVERSION_FUNCTION (CCTK_REAL16, CCTK_REAL4, CCTK_REAL4, CONVERT) +CONVERSION_FUNCTION (REAL16, REAL4, REAL4, CONVERT) #endif #if defined(CCTK_REAL8) && defined(CCTK_REAL16) -CONVERSION_FUNCTION (CCTK_REAL16, CCTK_REAL8, CCTK_REAL8, CONVERT) +CONVERSION_FUNCTION (REAL16, REAL8, 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 +#define CONVERT(src, dst, dst_type) (dst).Re = (CCTK_##dst_type) (src).Re; \ + (dst).Im = (CCTK_##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) +CONVERSION_FUNCTION (COMPLEX16, COMPLEX8, REAL4, CONVERT) #endif #if defined(CCTK_REAL4) && defined(CCTK_REAL16) -CONVERSION_FUNCTION (CCTK_COMPLEX32, CCTK_COMPLEX16, CCTK_REAL8, CONVERT) +CONVERSION_FUNCTION (COMPLEX32, COMPLEX16, REAL8, CONVERT) #endif #if defined(CCTK_REAL8) && defined(CCTK_REAL16) -CONVERSION_FUNCTION (CCTK_COMPLEX32, CCTK_COMPLEX8, CCTK_REAL4, CONVERT) +CONVERSION_FUNCTION (COMPLEX32, COMPLEX8, REAL4, CONVERT) #endif @@ -97,12 +107,10 @@ static int PUGHSlabi_PrecisionVarType (int type); @routine PUGHSlabi_GetDatatypeConversionFn @date Fri 23 Nov 2000 @author Thomas Radke - @desc + @desc Finds a predefined datatype conversion function. - @enddesc + @enddesc - @calls PUGHSlab_REAL8_to_REAL4 - @var src_type @vdesc CCTK datatype of the source @vtype int @@ -138,55 +146,55 @@ t_hslabConversionFn PUGHSlabi_GetDatatypeConversionFn (int src_type, #if defined(CCTK_INT2) && defined(CCTK_INT4) else if (src_type == CCTK_VARIABLE_INT4 && dst_type == CCTK_VARIABLE_INT2) { - retval = Convert_CCTK_INT4_to_CCTK_INT2; + retval = ConvertINT4toINT2; } #endif #if defined(CCTK_INT2) && defined(CCTK_INT8) else if (src_type == CCTK_VARIABLE_INT8 && dst_type == CCTK_VARIABLE_INT2) { - retval = Convert_CCTK_INT8_to_CCTK_INT2; + retval = ConvertINT8toINT2; } #endif #if defined(CCTK_INT4) && defined(CCTK_INT8) else if (src_type == CCTK_VARIABLE_INT8 && dst_type == CCTK_VARIABLE_INT4) { - retval = Convert_CCTK_INT8_to_CCTK_INT4; + retval = ConvertINT8toINT4; } #endif #if defined(CCTK_REAL4) && defined(CCTK_REAL8) else if (src_type == CCTK_VARIABLE_REAL8 && dst_type == CCTK_VARIABLE_REAL4) { - retval = Convert_CCTK_REAL8_to_CCTK_REAL4; + retval = ConvertREAL8toREAL4; } #endif #if defined(CCTK_REAL4) && defined(CCTK_REAL16) else if (src_type == CCTK_VARIABLE_REAL16 && dst_type == CCTK_VARIABLE_REAL4) { - retval = Convert_CCTK_REAL16_to_CCTK_REAL4; + retval = ConvertREAL16toREAL4; } #endif #if defined(CCTK_REAL8) && defined(CCTK_REAL16) else if (src_type == CCTK_VARIABLE_REAL16 && dst_type == CCTK_VARIABLE_REAL8) { - retval = Convert_CCTK_REAL16_to_CCTK_REAL8; + retval = ConvertREAL16toREAL8; } #endif #if defined(CCTK_REAL4) && defined(CCTK_REAL8) else if (src_type == CCTK_VARIABLE_COMPLEX16 && dst_type == CCTK_VARIABLE_COMPLEX8) { - retval = Convert_CCTK_COMPLEX16_to_CCTK_COMPLEX8; + retval = ConvertCOMPLEX16toCOMPLEX8; } #endif #if defined(CCTK_REAL8) && defined(CCTK_REAL16) else if (src_type == CCTK_VARIABLE_COMPLEX32 && dst_type == CCTK_VARIABLE_COMPLEX8) { - retval = Convert_CCTK_COMPLEX32_to_CCTK_COMPLEX8; + retval = ConvertCOMPLEX32toCOMPLEX8; } #endif #if defined(CCTK_REAL8) && defined(CCTK_REAL16) else if (src_type == CCTK_VARIABLE_COMPLEX32 && dst_type == CCTK_VARIABLE_COMPLEX16) { - retval = Convert_CCTK_COMPLEX32_to_CCTK_COMPLEX16; + retval = ConvertCOMPLEX32toCOMPLEX16; } #endif else diff --git a/src/GetHyperslab.c b/src/GetHyperslab.c index adfd7d3..f0ec33c 100644 --- a/src/GetHyperslab.c +++ b/src/GetHyperslab.c @@ -245,13 +245,18 @@ CCTK_INT PUGHSlab_GetList (const cGH *GH, to be collected into a global hyperslab by PUGHlab_GetHyperslab(). IO methods can call this routine as well to collect the local hyperslab data and output it in parallel. - @enddesc + @enddesc @calls PUGHSlab_GetDatatypeConversionFn @var GH @vdesc Pointer to CCTK grid hierarchy - @vtype cGH * + @vtype const cGH * + @vio in + @endvar + @var mapping + @vdesc pointer to the mapping structure for this hyperslab request + @vtype const hslab_mapping_t * @vio in @endvar @var vindex @@ -264,68 +269,14 @@ CCTK_INT PUGHSlab_GetList (const cGH *GH, @vtype int @vio in @endvar - @var hdim - @vdesc dimensionality of the requested hyperslab - @vtype int - @vio in - @endvar @var hdatatype @vdesc CCTK datatype of the requested hyperslab @vtype int @vio in @endvar - @var conversion_fn - @vdesc pointer to a user-supplied data conversion function - @vtype t_hslabConversionFn - @vio in - @endvar - @var global_startpoint - @vdesc global coordinates of the hyperslab origin - @vtype const int[dimensions of vindex] - @vio in - @endvar - @var directions - @vdesc directions which span the hyperslab - @vtype const int[hdim times dimensions of vindex] - @vio in - @endvar - @var extents - @vdesc number of grid points to follow in each hyperslab direction - starting from origin - Negative values are taken as extents up to the grid boundaries. - @vtype const int[hdim] - @vio in - @endvar - @var downsample - @vdesc downsampling values for each hyperslab dimension - @vtype const int[hdim] - @vio in - @endvar @var hdata - @vdesc pointer to store the address of the hyperslab data buffer - @vtype void ** - @vio out - @endvar - @var free_data - @vdesc address of flag which decides whether the returned data needs - to be freed or not - @vtype int * - @vio out - @endvar - @var hsize - @vdesc sizes of the (local) hyperslab data buffer in each dimension - @vtype int[hdim] - @vio out - @endvar - @var hsize_global - @vdesc sizes of the global hyperslab data buffer in each dimension - @vtype int[hdim] - @vio out - @endvar - @var hoffset_global - @vdesc if not NULL, array to save the offsets of the local hyperslab - into the global one for each dimension - @vtype int[hdim] + @vdesc reference to the user-supplied hyperslab data buffer + @vtype void * @vio out @endvar @@*/ @@ -538,7 +489,11 @@ static int GetLocalHyperslab (const cGH *GH, { if (conversion_fn) { - conversion_fn (typed_vdata, typed_hdata, dim0_points, 1, 1); + if (conversion_fn (dim0_points, 1, 1, vinfo.vartype, hdatatype, + typed_vdata, typed_hdata) != dim0_points) + { + CCTK_WARN (1, "datatype conversion routine failed"); + } } else { @@ -549,7 +504,12 @@ static int GetLocalHyperslab (const cGH *GH, { if (conversion_fn) { - conversion_fn (typed_vdata, typed_hdata, dim0_points, mapping->downsample[0], 1); + if (conversion_fn (dim0_points, mapping->downsample[0], 1, + vinfo.vartype, hdatatype, typed_vdata, + typed_hdata) != dim0_points) + { + CCTK_WARN (1, "datatype conversion routine failed"); + } typed_vdata += downsample[0] * dim0_points; } else @@ -622,7 +582,11 @@ static int GetDiagonalFromFrom3D (const cGH *GH, linear_idx = i + j*extras->hyper_volume[1] + k*extras->hyper_volume[2]; if (conversion_fn) { - conversion_fn (vdata + linear_idx*vdata_size, hdata, 1, 1, 1); + if (conversion_fn (1, 1, 1, vdatatype, hdatatype, + vdata + linear_idx*vdata_size, hdata) != 1) + { + CCTK_WARN (1, "datatype conversion routine failed"); + } } else { diff --git a/src/PUGHSlab.h b/src/PUGHSlab.h index 7e8acec..8383280 100644 --- a/src/PUGHSlab.h +++ b/src/PUGHSlab.h @@ -18,11 +18,13 @@ extern "C" #endif /* prototype of a datatype conversion routine */ -typedef void (*t_hslabConversionFn) (const void *src, - void *dst, - CCTK_INT nelems, - CCTK_INT src_stride, - CCTK_INT dst_stride); +typedef CCTK_INT (*t_hslabConversionFn) (CCTK_INT nelems, + CCTK_INT src_stride, + CCTK_INT dst_stride, + CCTK_INT src_type, + CCTK_INT dst_type, + CCTK_POINTER_TO_CONST src, + CCTK_POINTER dst); /* function prototypes */ CCTK_INT PUGHSlab_Get (const cGH *GH, -- cgit v1.2.3