GLAC  1.0
su2.h
Go to the documentation of this file.
1 
13 #ifndef SU2_H
14 #define SU2_H
15 
16 #include "math/complex.h"
17 
18 using std::cout;
19 using std::endl;
20 
21 class SU2
22 {
23 public:
24  SU2() {
25  for (int i = 0; i < 8; i++)
26  {
27  mat[i] = 0;
28  }
29  }
30 
31  ~SU2() {}
32 
33  double mat[8];
34 
35  void print();
36  void zeros();
37  void identity();
38  void setComplex(complex w, int i);
39  double normSquared(int i);
40 
41  SU2 transpose();
42  SU2 conjugate();
43  SU2 inv();
44 
45  // Getters, mostly using .mat[]
46  inline double get(int i, int j, int k) { return mat[(4*i + 2*j) + k]; } // k is complex number of a position.
47  inline double &operator[](int i) { return mat[i]; }
48 
49  // Operations
50  SU2 &operator=(const SU2 &B);
51  // Basic operations overloading with itself
52  SU2 &operator+=(SU2 B);
53  SU2 &operator-=(SU2 B);
54  SU2 &operator*=(SU2 B);
55 
56  SU2 &operator*=(double B);
57 };
58 
62 inline SU2 operator+(SU2 A, SU2 B)
63 {
64 A += B;
65 return A;
66 }
67 
68 inline SU2 operator-(SU2 A, SU2 B)
69 {
70 A -= B;
71 return A;
72 }
73 
74 inline SU2 operator*(SU2 A, SU2 B)
75 {
76 A *= B;
77 return A;
78 }
79 
80 inline SU2 operator*(SU2 A, double b)
81 {
82 A *= b;
83 return A;
84 }
85 
89 
90 inline SU2 &SU2::operator=(const SU2 &B)
91 {
92  /*
93  * Copy assignement operator.
94  */
95  for (int i = 0; i < 8; i++) {
96  mat[i] = B.mat[i];
97  }
98  return *this;
99 }
100 
102 {
103  for (int i = 0; i < 8; i++)
104  {
105  mat[i] += B.mat[i];
106  }
107  return *this;
108 }
109 
111 {
112  for (int i = 0; i < 8; i++)
113  {
114  mat[i] -= B.mat[i];
115  }
116  return *this;
117 }
118 
120 {
121  double temp[8];
122 
123  temp[0] = mat[0]*B.mat[0] - mat[1]*B.mat[1] + mat[2]*B.mat[4] - mat[3]*B.mat[5];
124  temp[1] = mat[0]*B.mat[1] + mat[1]*B.mat[0] + mat[2]*B.mat[5] + mat[3]*B.mat[4];
125  temp[2] = mat[0]*B.mat[2] - mat[1]*B.mat[3] + mat[2]*B.mat[6] - mat[3]*B.mat[7];
126  temp[3] = mat[0]*B.mat[3] + mat[1]*B.mat[2] + mat[2]*B.mat[7] + mat[3]*B.mat[6];
127  temp[4] = mat[4]*B.mat[0] - mat[5]*B.mat[1] + mat[6]*B.mat[4] - mat[7]*B.mat[5];
128  temp[5] = mat[4]*B.mat[1] + mat[5]*B.mat[0] + mat[6]*B.mat[5] + mat[7]*B.mat[4];
129  temp[6] = mat[4]*B.mat[2] - mat[5]*B.mat[3] + mat[6]*B.mat[6] - mat[7]*B.mat[7];
130  temp[7] = mat[4]*B.mat[3] + mat[5]*B.mat[2] + mat[6]*B.mat[7] + mat[7]*B.mat[6];
131 
132  std::memcpy(mat, temp, sizeof(double)*8);
133 
134  return *this;
135 }
136 
137 inline SU2 &SU2::operator*=(double b)
138 {
139  for (int i = 0; i < 8; i++)
140  {
141  mat[i] *= b;
142  }
143  return *this;
144 }
145 
149 
154 inline SU2 SU2::inv()
155 {
156  SU2 R;
157  R[0] = mat[0];
158  R[1] = -mat[1];
159 
160  R[2] = mat[4];
161  R[3] = -mat[5];
162 
163  R[4] = mat[2];
164  R[5] = -mat[3];
165 
166  R[6] = mat[6];
167  R[7] = -mat[7];
168 
169  return R;
170 }
171 
175 
176 inline void SU2::zeros()
177 {
178  for (int i = 0; i < 8; i++)
179  {
180  mat[i] = 0;
181  }
182 }
183 
184 inline void SU2::identity()
185 {
186  for (int i = 0; i < 8; i++)
187  {
188  mat[i] = 0;
189  }
190  mat[0] = 1;
191  mat[6] = 1;
192 }
193 
194 #endif // SU2_H
SU2 & operator *=(SU2 B)
Definition: su2.h:119
A complex number class, consisting of t.
Definition: complex.h:16
SU2 inv()
SU2::inv.
Definition: su2.h:154
SU2 & operator-=(SU2 B)
Definition: su2.h:110
SU2 & operator=(const SU2 &B)
Definition: su2.h:90
void zeros()
Definition: su2.h:176
void print()
Definition: su2.cpp:24
SU2 operator+(SU2 A, SU2 B)
Definition: su2.h:62
SU2()
Definition: su2.h:24
double get(int i, int j, int k)
Definition: su2.h:46
SU2 operator *(SU2 A, SU2 B)
Definition: su2.h:74
SU2 conjugate()
Definition: su2.cpp:64
~SU2()
Definition: su2.h:31
double & operator[](int i)
Definition: su2.h:47
void identity()
Definition: su2.h:184
double mat[8]
Definition: su2.h:33
void setComplex(complex w, int i)
SU2::setComplex.
Definition: su2.cpp:10
SU2 transpose()
Definition: su2.cpp:45
double normSquared(int i)
Definition: su2.cpp:16
SU2 & operator+=(SU2 B)
Definition: su2.h:101
Class for holding matrices.
Definition: su2.h:21
SU2 operator-(SU2 A, SU2 B)
Definition: su2.h:68