6 #ifndef GHOST_CU_COMPLEX_H
7 #define GHOST_CU_COMPLEX_H
12 __device__ __host__
inline void zero(T &val)
20 val = make_cuFloatComplex(0.,0.);
26 val = make_cuDoubleComplex(0.,0.);
30 __device__ __host__
inline void one(T &val)
38 val = make_cuFloatComplex(1.,0.);
44 val = make_cuDoubleComplex(1.,0.);
47 template<
typename T,
typename T_b>
48 __device__
inline void fromReal(T &val, T_b real)
56 val = make_cuDoubleComplex(real,0.);
62 val = make_cuFloatComplex(real,0.f);
65 template<
typename T,
typename T_b>
66 __device__
inline T_b
Real(T val)
83 template<
typename T,
typename T_b>
84 __device__
inline T_b
Imag(T val)
103 __device__
inline t
accu(t val, t val2)
111 return cuCaddf(val,val2);
117 return cuCadd(val,val2);
121 template<
typename T,
typename T2>
122 __device__
inline T
axpy(T val, T val2, T2 val3)
124 return val+val2*val3;
130 return cuCaddf(val,cuCmulf(val2,val3));
136 return cuCaddf(val,cuCmulf(val2,make_cuFloatComplex((
float)val3,0.f)));
142 return cuCaddf(val,cuCmulf(val2,make_cuFloatComplex(val3,0.f)));
148 return cuCaddf(val,cuCmulf(val2,make_cuFloatComplex((
float)(cuCreal(val3)),(
float)(cuCimag(val3)))));
154 return cuCadd(val,cuCmul(val2,make_cuDoubleComplex(val3,0.)));
160 return cuCadd(val,cuCmul(val2,make_cuDoubleComplex((
double)val3,0.)));
166 return cuCadd(val,cuCmul(val2,val3));
172 return cuCadd(val,cuCmul(val2,make_cuDoubleComplex((
double)(cuCrealf(val3)),(
double)(cuCimagf(val3)))));
178 return val+val2*(double)cuCrealf(val3);
184 return val+val2*cuCreal(val3);
190 return val+val2*cuCrealf(val3);
197 return val+val2*(float)cuCreal(val3);
202 __device__
inline T
axpby(T x, T y, T a, T b)
207 template<
typename T,
typename T_b>
216 return cuCrealf(x)*cuCrealf(x) + cuCimagf(x)*cuCimagf(x);
222 return cuCreal(x)*cuCreal(x) + cuCimag(x)*cuCimag(x);
252 return cuCmulf(cuConjf(x),y);
258 return cuCmul(cuConj(x),y);
262 __device__
inline cuFloatComplex
axpby<cuFloatComplex>(cuFloatComplex x, cuFloatComplex y, cuFloatComplex a, cuFloatComplex b)
264 return cuCaddf(cuCmulf(b,y),cuCmulf(a,x));
268 __device__
inline cuDoubleComplex
axpby<cuDoubleComplex>(cuDoubleComplex x, cuDoubleComplex y, cuDoubleComplex a, cuDoubleComplex b)
270 return cuCadd(cuCmul(b,y),cuCmul(a,x));
292 template<
typename T1,
typename T2>
307 return cuCmulf(make_cuFloatComplex(a,0.f),y);
313 return cuCmulf(make_cuFloatComplex((
float)a,0.f),y);
326 return cuCmul(make_cuDoubleComplex(a,0.),y);
332 return cuCmul(make_cuDoubleComplex(a,0.),y);
337 __device__
inline T
mult(T x, T y, T a)
345 return cuCmulf(a,cuCmulf(x,y));
351 return cuCmul(a,cuCmul(x,y));
__device__ double Real< cuDoubleComplex, double >(cuDoubleComplex val)
Definition: cu_complex.h:72
__device__ void fromReal(T &val, T_b real)
Definition: cu_complex.h:48
__device__ cuDoubleComplex axpy< cuDoubleComplex, cuDoubleComplex >(cuDoubleComplex val, cuDoubleComplex val2, cuDoubleComplex val3)
Definition: cu_complex.h:164
__device__ cuFloatComplex mult< cuFloatComplex >(cuFloatComplex x, cuFloatComplex y, cuFloatComplex a)
Definition: cu_complex.h:343
__device__ T conj(T x)
Definition: cu_complex.h:226
__device__ cuFloatComplex accu< cuFloatComplex >(cuFloatComplex val, cuFloatComplex val2)
Definition: cu_complex.h:109
__device__ cuFloatComplex axpby< cuFloatComplex >(cuFloatComplex x, cuFloatComplex y, cuFloatComplex a, cuFloatComplex b)
Definition: cu_complex.h:262
__device__ cuFloatComplex mulConj< cuFloatComplex >(cuFloatComplex x, cuFloatComplex y)
Definition: cu_complex.h:250
__device__ float axpy< float, cuDoubleComplex >(float val, float val2, cuDoubleComplex val3)
Definition: cu_complex.h:195
__device__ T_b mulConjSame(T x)
Definition: cu_complex.h:208
__device__ __host__ void one(T &val)
Definition: cu_complex.h:30
__device__ T axpby(T x, T y, T a, T b)
Definition: cu_complex.h:202
__device__ double axpy< double, cuDoubleComplex >(double val, double val2, cuDoubleComplex val3)
Definition: cu_complex.h:182
__device__ cuDoubleComplex axpy< cuDoubleComplex, double >(cuDoubleComplex val, cuDoubleComplex val2, double val3)
Definition: cu_complex.h:152
__device__ cuFloatComplex scale2< cuFloatComplex, double >(cuFloatComplex y, double a)
Definition: cu_complex.h:311
__device__ float mulConjSame< cuFloatComplex, float >(cuFloatComplex x)
Definition: cu_complex.h:214
__device__ cuDoubleComplex mulConj< cuDoubleComplex >(cuDoubleComplex x, cuDoubleComplex y)
Definition: cu_complex.h:256
__device__ T scale(T y, T a)
Definition: cu_complex.h:275
__device__ T1 scale2(T1 y, T2 a)
Definition: cu_complex.h:293
__device__ T mulConj(T x, T y)
Definition: cu_complex.h:244
__device__ float axpy< float, cuFloatComplex >(float val, float val2, cuFloatComplex val3)
Definition: cu_complex.h:188
__device__ cuDoubleComplex accu< cuDoubleComplex >(cuDoubleComplex val, cuDoubleComplex val2)
Definition: cu_complex.h:115
__device__ T_b Real(T val)
Definition: cu_complex.h:66
__device__ cuFloatComplex scale2< cuFloatComplex, cuFloatComplex >(cuFloatComplex y, cuFloatComplex a)
Definition: cu_complex.h:299
__device__ cuFloatComplex conj< cuFloatComplex >(cuFloatComplex x)
Definition: cu_complex.h:232
__device__ cuDoubleComplex axpy< cuDoubleComplex, float >(cuDoubleComplex val, cuDoubleComplex val2, float val3)
Definition: cu_complex.h:158
__device__ double Imag< cuDoubleComplex, double >(cuDoubleComplex val)
Definition: cu_complex.h:90
__device__ void fromReal< cuDoubleComplex, double >(cuDoubleComplex &val, double real)
Definition: cu_complex.h:54
__device__ __host__ void one< cuDoubleComplex >(cuDoubleComplex &val)
Definition: cu_complex.h:42
__device__ void fromReal< cuFloatComplex, float >(cuFloatComplex &val, float real)
Definition: cu_complex.h:60
__device__ T_b Imag(T val)
Definition: cu_complex.h:84
__device__ __host__ void one< cuFloatComplex >(cuFloatComplex &val)
Definition: cu_complex.h:36
__device__ float Imag< cuFloatComplex, float >(cuFloatComplex val)
Definition: cu_complex.h:96
__device__ double axpy< double, cuFloatComplex >(double val, double val2, cuFloatComplex val3)
Definition: cu_complex.h:176
__device__ __host__ void zero(T &val)
Definition: cu_complex.h:12
__device__ cuDoubleComplex scale2< cuDoubleComplex, float >(cuDoubleComplex y, float a)
Definition: cu_complex.h:324
__device__ double mulConjSame< cuDoubleComplex, double >(cuDoubleComplex x)
Definition: cu_complex.h:220
__device__ cuDoubleComplex mult< cuDoubleComplex >(cuDoubleComplex x, cuDoubleComplex y, cuDoubleComplex a)
Definition: cu_complex.h:349
__device__ t accu(t val, t val2)
Definition: cu_complex.h:103
__device__ cuFloatComplex scale2< cuFloatComplex, float >(cuFloatComplex y, float a)
Definition: cu_complex.h:305
__device__ __host__ void zero< cuDoubleComplex >(cuDoubleComplex &val)
Definition: cu_complex.h:24
__device__ cuDoubleComplex scale2< cuDoubleComplex, double >(cuDoubleComplex y, double a)
Definition: cu_complex.h:330
__device__ float Real< cuFloatComplex, float >(cuFloatComplex val)
Definition: cu_complex.h:78
__device__ cuFloatComplex axpy< cuFloatComplex, float >(cuFloatComplex val, cuFloatComplex val2, float val3)
Definition: cu_complex.h:140
__device__ T axpy(T val, T val2, T2 val3)
Definition: cu_complex.h:122
__device__ cuFloatComplex scale< cuFloatComplex >(cuFloatComplex y, cuFloatComplex a)
Definition: cu_complex.h:281
__device__ __host__ void zero< cuFloatComplex >(cuFloatComplex &val)
Definition: cu_complex.h:18
__device__ cuDoubleComplex scale2< cuDoubleComplex, cuDoubleComplex >(cuDoubleComplex y, cuDoubleComplex a)
Definition: cu_complex.h:317
__device__ T mult(T x, T y, T a)
Definition: cu_complex.h:337
__device__ cuFloatComplex axpy< cuFloatComplex, double >(cuFloatComplex val, cuFloatComplex val2, double val3)
Definition: cu_complex.h:134
__device__ cuFloatComplex axpy< cuFloatComplex, cuDoubleComplex >(cuFloatComplex val, cuFloatComplex val2, cuDoubleComplex val3)
Definition: cu_complex.h:146
__device__ cuFloatComplex axpy< cuFloatComplex, cuFloatComplex >(cuFloatComplex val, cuFloatComplex val2, cuFloatComplex val3)
Definition: cu_complex.h:128
__device__ cuDoubleComplex scale< cuDoubleComplex >(cuDoubleComplex y, cuDoubleComplex a)
Definition: cu_complex.h:287
__device__ cuDoubleComplex axpy< cuDoubleComplex, cuFloatComplex >(cuDoubleComplex val, cuDoubleComplex val2, cuFloatComplex val3)
Definition: cu_complex.h:170
__device__ cuDoubleComplex axpby< cuDoubleComplex >(cuDoubleComplex x, cuDoubleComplex y, cuDoubleComplex a, cuDoubleComplex b)
Definition: cu_complex.h:268
__device__ cuDoubleComplex conj< cuDoubleComplex >(cuDoubleComplex x)
Definition: cu_complex.h:238