aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortradke <tradke@10716dce-81a3-4424-a2c8-48026a0d3035>2003-09-01 10:51:00 +0000
committertradke <tradke@10716dce-81a3-4424-a2c8-48026a0d3035>2003-09-01 10:51:00 +0000
commit223ab02512f9b179051da44adcdd48315a2b3161 (patch)
treee3c0a87098e8fc85b9f96b8e4f7465d9c663cf68
parente937842cbe0aa6bd8b3268a96a1718d8a6c1dbc0 (diff)
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
-rw-r--r--src/DatatypeConversion.c102
-rw-r--r--src/GetHyperslab.c86
-rw-r--r--src/PUGHSlab.h12
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 <assert.h>
+
#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,