diff --git a/contrib/fortran-to-opencl/translate.py b/contrib/fortran-to-opencl/translate.py index 00397bc153de52c4cf3e772516417ca809a2a83f..4c3486f4d52c135aacd2a915c90089fd71e8acb2 100644 --- a/contrib/fortran-to-opencl/translate.py +++ b/contrib/fortran-to-opencl/translate.py @@ -43,6 +43,15 @@ class TranslationError(RuntimeError): pass +def complex_type_name(dtype): + if dtype == np.complex64: + return "cfloat" + if dtype == np.complex128: + return "cdouble" + else: + raise RuntimeError + + # {{{ AST components def dtype_to_ctype(dtype): @@ -329,14 +338,6 @@ class ComplexCCodeMapper(CCodeMapperBase): CCodeMapperBase.__init__(self) self.infer_type = infer_type - def complex_type_name(self, dtype): - if dtype == np.complex64: - return "cfloat" - if dtype == np.complex128: - return "cdouble" - else: - raise RuntimeError - def map_sum(self, expr, enclosing_prec): tgt_dtype = self.infer_type(expr) is_complex = tgt_dtype.kind == 'c' @@ -344,7 +345,7 @@ class ComplexCCodeMapper(CCodeMapperBase): if not is_complex: return CCodeMapperBase.map_sum(self, expr, enclosing_prec) else: - tgt_name = self.complex_type_name(tgt_dtype) + tgt_name = complex_type_name(tgt_dtype) reals = [child for child in expr.children if 'c' != self.infer_type(child).kind] @@ -380,7 +381,7 @@ class ComplexCCodeMapper(CCodeMapperBase): if not is_complex: return CCodeMapperBase.map_product(self, expr, enclosing_prec) else: - tgt_name = self.complex_type_name(tgt_dtype) + tgt_name = complex_type_name(tgt_dtype) reals = [child for child in expr.children if 'c' != self.infer_type(child).kind] @@ -419,17 +420,17 @@ class ComplexCCodeMapper(CCodeMapperBase): return CCodeMapperBase.map_quotient(self, expr, enclosing_prec) elif n_complex and not d_complex: return "%s_divider(%s, %s)" % ( - self.complex_type_name(tgt_dtype), + complex_type_name(tgt_dtype), self.rec(expr.numerator, PREC_NONE), self.rec(expr.denominator, PREC_NONE)) elif not n_complex and d_complex: return "%s_rdivide(%s, %s)" % ( - self.complex_type_name(tgt_dtype), + complex_type_name(tgt_dtype), self.rec(expr.numerator, PREC_NONE), self.rec(expr.denominator, PREC_NONE)) else: return "%s_divide(%s, %s)" % ( - self.complex_type_name(tgt_dtype), + complex_type_name(tgt_dtype), self.rec(expr.numerator, PREC_NONE), self.rec(expr.denominator, PREC_NONE)) @@ -456,12 +457,12 @@ class ComplexCCodeMapper(CCodeMapperBase): if b_complex and not e_complex: return "%s_powr(%s, %s)" % ( - self.complex_type_name(tgt_dtype), + complex_type_name(tgt_dtype), self.rec(expr.base, PREC_NONE), self.rec(expr.exponent, PREC_NONE)) else: return "%s_pow(%s, %s)" % ( - self.complex_type_name(tgt_dtype), + complex_type_name(tgt_dtype), self.rec(expr.base, PREC_NONE), self.rec(expr.exponent, PREC_NONE)) @@ -518,7 +519,7 @@ class CCodeMapper(ComplexCCodeMapper): name = "real" name = "%s_%s" % ( - self.complex_type_name(tgt_dtype), + complex_type_name(tgt_dtype), name) elif name in ["aimag", "real", "imag"] and tgt_dtype.kind == "f": @@ -528,14 +529,14 @@ class CCodeMapper(ComplexCCodeMapper): name = "imag" name = "%s_%s" % ( - self.complex_type_name(arg_dtype), + complex_type_name(arg_dtype), name) elif 'c' == tgt_dtype.kind and name == "abs": arg_dtype, = arg_dtypes name = "%s_abs" % ( - self.complex_type_name(arg_dtype)) + complex_type_name(arg_dtype)) return self.format("%s(%s)", name, @@ -563,7 +564,10 @@ class CCodeMapper(ComplexCCodeMapper): from pymbolic.mapper.stringifier import PREC_NONE if expr.dtype.kind == "c": r, i = expr.value - return "{ %s, %s }" % (self.rec(r, PREC_NONE), self.rec(i, PREC_NONE)) + return "%s_new(%s, %s)" % ( + complex_type_name(expr.dtype), + self.rec(r, PREC_NONE), + self.rec(i, PREC_NONE)) else: return expr.value diff --git a/pyopencl/cl/pyopencl-bessel-j-complex.cl b/pyopencl/cl/pyopencl-bessel-j-complex.cl index 0a5492aa6fc774d43c93ccf79f5597d6d79ddb7a..99592828adf23f5bcf12a6a18b2c2d14941f3c82 100644 --- a/pyopencl/cl/pyopencl-bessel-j-complex.cl +++ b/pyopencl/cl/pyopencl-bessel-j-complex.cl @@ -72,12 +72,12 @@ void bessel_j_complex(int v, cdouble_t z, cdouble_t *j_v, cdouble_t *j_vp1) { if (v == 0) { - *j_v = (cdouble_t)(1,0); - *j_vp1 = 0; + *j_v = cdouble_new(1, 0); + *j_vp1 = cdouble_new(0, 0); } else { - *j_v = 0; - *j_vp1 = 0; + *j_v = cdouble_new(0, 0); + *j_vp1 = cdouble_new(0, 0); } return; } diff --git a/pyopencl/cl/pyopencl-hankel-complex.cl b/pyopencl/cl/pyopencl-hankel-complex.cl index 0c5917a61cf9ce4bca4bdb2795e3e0d38d92ee5a..3115b8de42ae1ccaf608d89f4685365657123a98 100644 --- a/pyopencl/cl/pyopencl-hankel-complex.cl +++ b/pyopencl/cl/pyopencl-hankel-complex.cl @@ -76,7 +76,7 @@ void hankel_01_complex(cdouble_t z, cdouble_t *h0, cdouble_t *h1, int ifexpon) cdouble_t h1u; double half_; int ier; - cdouble_t ima = {0.0e0, 1.0e0}; + cdouble_t ima = cdouble_new(0.0e0, 1.0e0); double pi = 0.31415926535897932e+01; cdouble_t ser2; cdouble_t ser3; @@ -161,7 +161,7 @@ void hank103u(cdouble_t z, int *ier, cdouble_t *h0, cdouble_t *h1, int ifexpon) double com; double d; double done; - cdouble_t ima = {0.0e0, 1.0e0}; + cdouble_t ima = cdouble_new(0.0e0, 1.0e0); int m; double thresh1; double thresh2; @@ -252,10 +252,10 @@ void hank103a(cdouble_t z, cdouble_t *h0, cdouble_t *h1, int ifexpon) { cdouble_t cccexp; cdouble_t cdd; - cdouble_t cdumb = {0.70710678118654757e+00, (- 1) * 0.70710678118654746e+00}; + cdouble_t cdumb = cdouble_new(0.70710678118654757e+00, (- 1) * 0.70710678118654746e+00); double done = 1.0e0; int i; - cdouble_t ima = {0.0e0, 1.0e0}; + cdouble_t ima = cdouble_new(0.0e0, 1.0e0); int m; @@ -313,7 +313,7 @@ void hank103l(cdouble_t z, cdouble_t *h0, cdouble_t *h1, int ifexpon) cdouble_t fj1; double gamma = 0.5772156649015328606e+00; int i; - cdouble_t ima = {0.0e0, 1.0e0}; + cdouble_t ima = cdouble_new(0.0e0, 1.0e0); int m; double pi = 0.31415926535897932e+01; @@ -373,7 +373,7 @@ void hank103r(cdouble_t z, int *ier, cdouble_t *h0, cdouble_t *h1, int ifexpon) cdouble_t cdd; double d; double done; - cdouble_t ima = {0.0e0, 1.0e0}; + cdouble_t ima = cdouble_new(0.0e0, 1.0e0); int m; double thresh1; double thresh2;