DP3
MatrixComplex2x2.h
Go to the documentation of this file.
1 // Copyright (C) 2023 ASTRON (Netherlands Institute for Radio Astronomy)
2 // SPDX-License-Identifier: GPL-3.0-or-later
3 
4 #ifndef DP3_DDECAL_GAIN_SOLVERS_KERNELS_MATRIXCOMPLEX2X2_H_
5 #define DP3_DDECAL_GAIN_SOLVERS_KERNELS_MATRIXCOMPLEX2X2_H_
6 
7 #include <cuComplex.h>
8 
9 template <typename T>
10 struct cuM2x2 {
11  public:
12  __device__ cuM2x2() {
13  data[0] = {0};
14  data[1] = {0};
15  data[2] = {0};
16  data[3] = {0};
17  }
18  __device__ cuM2x2(T a, T b, T c, T d) {
19  data[0] = a;
20  data[1] = b;
21  data[2] = c;
22  data[3] = d;
23  }
24 
25  inline __device__ const T& operator[](int i) const { return data[i]; }
26  inline __device__ T& operator[](int i) { return data[i]; }
27 
28  private:
29  T data[4];
30 };
31 
32 template <typename T>
34  public:
35  __device__ cuM2x2Diagonal() {
36  data[0] = {0};
37  data[1] = {0};
38  }
39  __device__ cuM2x2Diagonal(T a, T b) {
40  data[0] = a;
41  data[1] = b;
42  }
43 
44  inline __device__ const T& operator[](int i) const { return data[i]; }
45  inline __device__ T& operator[](int i) { return data[i]; }
46 
47  private:
48  T data[2];
49 };
50 
53 
54 inline __device__ cuM2x2FloatComplex operator+(const cuM2x2FloatComplex& a,
55  const cuM2x2FloatComplex& b) {
56  return cuM2x2FloatComplex(cuCaddf(a[0], b[0]), cuCaddf(a[1], b[1]),
57  cuCaddf(a[2], b[2]), cuCaddf(a[3], b[3]));
58 }
59 
60 inline __device__ cuM2x2FloatComplex operator-(const cuM2x2FloatComplex& a,
61  const cuM2x2FloatComplex& b) {
62  return cuM2x2FloatComplex(cuCsubf(a[0], b[0]), cuCsubf(a[1], b[1]),
63  cuCsubf(a[2], b[2]), cuCsubf(a[3], b[3]));
64 }
65 
66 inline __device__ cuM2x2FloatComplex operator*(const cuM2x2FloatComplex& a,
67  const cuM2x2FloatComplex& b) {
68  return cuM2x2FloatComplex(cuCaddf(cuCmulf(a[0], b[0]), cuCmulf(a[1], b[2])),
69  cuCaddf(cuCmulf(a[0], b[1]), cuCmulf(a[1], b[3])),
70  cuCaddf(cuCmulf(a[2], b[0]), cuCmulf(a[3], b[2])),
71  cuCaddf(cuCmulf(a[2], b[1]), cuCmulf(a[3], b[3])));
72 }
73 
75  const cuM2x2DoubleComplex& b) {
76  return cuM2x2DoubleComplex(cuCadd(cuCmul(a[0], b[0]), cuCmul(a[1], b[2])),
77  cuCadd(cuCmul(a[0], b[1]), cuCmul(a[1], b[3])),
78  cuCadd(cuCmul(a[2], b[0]), cuCmul(a[3], b[2])),
79  cuCadd(cuCmul(a[2], b[1]), cuCmul(a[3], b[3])));
80 }
81 
82 inline __device__ cuM2x2FloatComplex cuConj(const cuM2x2FloatComplex& x) {
83  return cuM2x2FloatComplex(cuConjf(x[0]), cuConjf(x[2]), cuConjf(x[1]),
84  cuConjf(x[3]));
85 }
86 
87 inline __device__ cuM2x2DoubleComplex cuConj(const cuM2x2DoubleComplex x) {
88  return cuM2x2DoubleComplex(cuConj(x[0]), cuConj(x[2]), cuConj(x[1]),
89  cuConj(x[3]));
90 }
91 
92 inline __device__ cuM2x2DoubleComplex
94  return cuM2x2DoubleComplex(
95  make_cuDoubleComplex(x[0]), make_cuDoubleComplex(x[1]),
96  make_cuDoubleComplex(x[2]), make_cuDoubleComplex(x[3])
97 
98  );
99 }
100 
103 
104 inline __device__ cuM2x2FloatComplex
106  return cuM2x2FloatComplex(cuCmulf(a[0], b[0]), cuCmulf(a[0], b[1]),
107  cuCmulf(a[1], b[2]), cuCmulf(a[1], b[3]));
108 }
109 
110 inline __device__ cuM2x2DoubleComplex
112  return cuM2x2DoubleComplex(cuCmul(a[0], b[0]), cuCmul(a[0], b[1]),
113  cuCmul(a[1], b[2]), cuCmul(a[1], b[3]));
114 }
115 
116 #endif // DP3_DDECAL_GAIN_SOLVERS_KERNELS_MATRIXCOMPLEX2X2_H_
cuM2x2< cuDoubleComplex > cuM2x2DoubleComplex
Definition: MatrixComplex2x2.h:52
cuM2x2< cuFloatComplex > cuM2x2FloatComplex
Definition: MatrixComplex2x2.h:51
__device__ cuM2x2FloatComplex operator*(const cuM2x2FloatComplex &a, const cuM2x2FloatComplex &b)
Definition: MatrixComplex2x2.h:66
__device__ cuM2x2FloatComplex cuConj(const cuM2x2FloatComplex &x)
Definition: MatrixComplex2x2.h:82
__device__ cuM2x2FloatComplex operator-(const cuM2x2FloatComplex &a, const cuM2x2FloatComplex &b)
Definition: MatrixComplex2x2.h:60
__device__ cuM2x2FloatComplex operator+(const cuM2x2FloatComplex &a, const cuM2x2FloatComplex &b)
Definition: MatrixComplex2x2.h:54
__device__ cuM2x2DoubleComplex make_cuM2x2ComplexDouble(const cuM2x2FloatComplex &x)
Definition: MatrixComplex2x2.h:93
Definition: MatrixComplex2x2.h:33
__device__ cuM2x2Diagonal(T a, T b)
Definition: MatrixComplex2x2.h:39
__device__ const T & operator[](int i) const
Definition: MatrixComplex2x2.h:44
__device__ cuM2x2Diagonal()
Definition: MatrixComplex2x2.h:35
__device__ T & operator[](int i)
Definition: MatrixComplex2x2.h:45
Definition: MatrixComplex2x2.h:10
__device__ cuM2x2()
Definition: MatrixComplex2x2.h:12
__device__ T & operator[](int i)
Definition: MatrixComplex2x2.h:26
__device__ cuM2x2(T a, T b, T c, T d)
Definition: MatrixComplex2x2.h:18
__device__ const T & operator[](int i) const
Definition: MatrixComplex2x2.h:25