4 #ifndef DP3_DDECAL_GAIN_SOLVERS_KERNELS_COMPLEX_H_
5 #define DP3_DDECAL_GAIN_SOLVERS_KERNELS_COMPLEX_H_
9 __host__ __device__
static __inline__ cuDoubleComplex make_cuDoubleComplex(
10 const cuFloatComplex& a) {
11 return make_cuDoubleComplex(a.x, a.y);
18 __host__ __device__
static __inline__ cuDoubleComplex cuCadd(cuDoubleComplex x,
20 return make_cuDoubleComplex(cuCreal(x) + y, cuCimag(x));
22 __host__ __device__
static __inline__ cuDoubleComplex cuCdiv(cuDoubleComplex x,
24 return make_cuDoubleComplex(cuCreal(x) / y, cuCimag(x) / y);
26 __host__ __device__
static __inline__ cuDoubleComplex cuCmul(cuDoubleComplex x,
28 return make_cuDoubleComplex(cuCreal(x) * y, cuCimag(x) * y);
30 __host__ __device__
static __inline__ cuDoubleComplex cuCsub(cuDoubleComplex x,
32 return make_cuDoubleComplex(cuCreal(x) - y, cuCimag(x));
35 __host__ __device__
static __inline__ cuDoubleComplex cuCexp(
37 double factor = exp(x.x);
38 return make_cuDoubleComplex(factor * cos(x.y), factor * sin(x.y));
45 __device__
static __inline__
float cuCarg(
const cuDoubleComplex& z) {
46 return atan2(cuCimag(z), cuCreal(z));
53 __device__
static __inline__ cuDoubleComplex cuCpolar(
const double r,
55 return make_cuDoubleComplex(r * cos(z), r * sin(z));
59 __device__
static __inline__
double cuNorm(
const T& a) {
60 return a.x * a.x + a.y * a.y;