GLAC  1.0
su3.h
Go to the documentation of this file.
1 
13 #ifndef SU3_H
14 #define SU3_H
15 
16 #include "math/complex.h"
17 
18 class SU3
19 {
20 public:
21  // Static matrix allocation
22  double mat[18];
23 
24  // Default constructor
25  SU3() {}
26 
27  // Old copy assignement operator
28  SU3 &operator =(const SU3& other)
29  {
30  for (int i = 0; i < 18; i++)
31  {
32  mat[i] = other.mat[i];
33  }
34  return *this;
35  }
36 
37  // Destructor
38  ~SU3() {}
39 
40  // Element retrieval overloading
41  inline double &operator[](int i) { return mat[i]; }
42 
43  // Overloading the setting operator
44  SU3 &operator =(const double& other);
45 
46  // SU3 matrix operations overloading
47  SU3 &operator+=(SU3 B);
48  SU3 &operator-=(SU3 B);
49  SU3 &operator*=(SU3 B);
50  // Complex matrix operations overloading
54  // Double matrix operations overloading
55  SU3 &operator+=(double a);
56  SU3 &operator-=(double a);
57  SU3 &operator/=(double a);
58  SU3 &operator*=(double a);
59 
60  // Printing functions
61  void print();
62 
63  // Complex element getter
64  complex get(int i, int j) { return complex(mat[6*i + 2*j],mat[6*i + 2*j+1]); }
65 
66  // Complex trace, implement a real trace as well?
67  complex trace();
68 
69  // Functions for making matrix hermitian/anti-hermitian
72 
73  // Returns the inverse of the matrix(the conjugate transpose)
74  SU3 inv();
75 
76  // Sets the matrix to zero
77  void zeros();
78 
79  // Sets the matrix to identity
80  void identity();
81 
82  // Transposes the matrix
83  SU3 transpose();
84 
85  // Complex conjugates the matrix
86  SU3 conjugate();
87 
88  // Sets position i (contigious allocation) as a complex number.
89  void setComplex(complex w, int i);
90 
91  // Complex number operations
92  double norm(int i);
93  double normSquared(int i);
94 };
95 
99 // SU3 operator overloading
100 inline SU3 operator+(SU3 A, SU3 B)
101 {
102  A += B;
103  return A;
104 }
105 
106 inline SU3 operator-(SU3 A, SU3 B)
107 {
108  A -= B;
109  return A;
110 }
111 
112 inline SU3 operator*(SU3 A, SU3 B)
113 {
114  A *= B;
115  return A;
116 }
117 
118 // Double operator overloading
119 inline SU3 operator+(SU3 A, double a)
120 {
121  A += a;
122  return A;
123 }
124 
125 inline SU3 operator-(SU3 A, double a)
126 {
127  A -= a;
128  return A;
129 }
130 
131 inline SU3 operator/(SU3 A, double a)
132 {
133  A /= a;
134  return A;
135 }
136 
137 inline SU3 operator*(SU3 A, double a)
138 {
139  A *= a;
140  return A;
141 }
142 
143 // Complex operator overloading
144 inline SU3 operator+(SU3 A, complex z)
145 {
146  A += z;
147  return A;
148 }
149 
150 inline SU3 operator-(SU3 A, complex z)
151 {
152  A -= z;
153  return A;
154 }
155 
156 inline SU3 operator*(SU3 A, complex z)
157 {
158  A *= z;
159  return A;
160 }
161 
165 
167 {
168  for (int i = 0; i < 18; i++)
169  {
170  mat[i] += B.mat[i];
171  }
172  return *this;
173 }
174 
176 {
177  for (int i = 0; i < 18; i++)
178  {
179  mat[i] -= B.mat[i];
180  }
181  return *this;
182 }
183 
185 {
186  /*
187  * ab = (a + bi)(c + id) = ac + iad + ibc - bd = ac - bd + i(ad + bc);
188  * 0 1 2 11 12 13 00 01 02
189  * 3 4 5 = 21 22 23 = 10 11 12
190  * 6 7 8 31 32 33 20 21 22
191  */
192  double temp[18];
193 
194  temp[0] = mat[0]*B.mat[0] - mat[1]*B.mat[1] + mat[2]*B.mat[6] - mat[3]*B.mat[7] + mat[4]*B.mat[12] - mat[5]*B.mat[13];
195  temp[1] = mat[0]*B.mat[1] + mat[1]*B.mat[0] + mat[2]*B.mat[7] + mat[3]*B.mat[6] + mat[4]*B.mat[13] + mat[5]*B.mat[12];
196  temp[2] = mat[0]*B.mat[2] - mat[1]*B.mat[3] + mat[2]*B.mat[8] - mat[3]*B.mat[9] + mat[4]*B.mat[14] - mat[5]*B.mat[15];
197  temp[3] = mat[0]*B.mat[3] + mat[1]*B.mat[2] + mat[2]*B.mat[9] + mat[3]*B.mat[8] + mat[4]*B.mat[15] + mat[5]*B.mat[14];
198  temp[4] = mat[0]*B.mat[4] - mat[1]*B.mat[5] + mat[2]*B.mat[10] - mat[3]*B.mat[11] + mat[4]*B.mat[16] - mat[5]*B.mat[17];
199  temp[5] = mat[0]*B.mat[5] + mat[1]*B.mat[4] + mat[2]*B.mat[11] + mat[3]*B.mat[10] + mat[4]*B.mat[17] + mat[5]*B.mat[16];
200  temp[6] = mat[6]*B.mat[0] - mat[7]*B.mat[1] + mat[8]*B.mat[6] - mat[9]*B.mat[7] + mat[10]*B.mat[12] - mat[11]*B.mat[13];
201  temp[7] = mat[6]*B.mat[1] + mat[7]*B.mat[0] + mat[8]*B.mat[7] + mat[9]*B.mat[6] + mat[10]*B.mat[13] + mat[11]*B.mat[12];
202  temp[8] = mat[6]*B.mat[2] - mat[7]*B.mat[3] + mat[8]*B.mat[8] - mat[9]*B.mat[9] + mat[10]*B.mat[14] - mat[11]*B.mat[15];
203  temp[9] = mat[6]*B.mat[3] + mat[7]*B.mat[2] + mat[8]*B.mat[9] + mat[9]*B.mat[8] + mat[10]*B.mat[15] + mat[11]*B.mat[14];
204  temp[10] = mat[6]*B.mat[4] - mat[7]*B.mat[5] + mat[8]*B.mat[10] - mat[9]*B.mat[11] + mat[10]*B.mat[16] - mat[11]*B.mat[17];
205  temp[11] = mat[6]*B.mat[5] + mat[7]*B.mat[4] + mat[8]*B.mat[11] + mat[9]*B.mat[10] + mat[10]*B.mat[17] + mat[11]*B.mat[16];
206  temp[12] = mat[12]*B.mat[0] - mat[13]*B.mat[1] + mat[14]*B.mat[6] - mat[15]*B.mat[7] + mat[16]*B.mat[12] - mat[17]*B.mat[13];
207  temp[13] = mat[12]*B.mat[1] + mat[13]*B.mat[0] + mat[14]*B.mat[7] + mat[15]*B.mat[6] + mat[16]*B.mat[13] + mat[17]*B.mat[12];
208  temp[14] = mat[12]*B.mat[2] - mat[13]*B.mat[3] + mat[14]*B.mat[8] - mat[15]*B.mat[9] + mat[16]*B.mat[14] - mat[17]*B.mat[15];
209  temp[15] = mat[12]*B.mat[3] + mat[13]*B.mat[2] + mat[14]*B.mat[9] + mat[15]*B.mat[8] + mat[16]*B.mat[15] + mat[17]*B.mat[14];
210  temp[16] = mat[12]*B.mat[4] - mat[13]*B.mat[5] + mat[14]*B.mat[10] - mat[15]*B.mat[11] + mat[16]*B.mat[16] - mat[17]*B.mat[17];
211  temp[17] = mat[12]*B.mat[5] + mat[13]*B.mat[4] + mat[14]*B.mat[11] + mat[15]*B.mat[10] + mat[16]*B.mat[17] + mat[17]*B.mat[16];
212 
213  // Swaps the memory content.
214 // std::swap(mat, temp);
215 // mat = std::move(temp);
216 // std::memmove(mat, temp, 144); // sizeof(double)*144
217  std::memcpy(mat, temp, 144); // sizeof(double)*144
218 
219  return *this;
220 }
221 
222 inline SU3 &SU3::operator+=(double a)
223 {
224  for (int i = 0; i < 18; i++)
225  {
226  mat[i] += a;
227  }
228  return *this;
229 }
230 
231 inline SU3 &SU3::operator-=(double a)
232 {
233  for (int i = 0; i < 18; i++)
234  {
235  mat[i] -= a;
236  }
237  return *this;
238 }
239 
240 inline SU3 &SU3::operator/=(double a)
241 {
242  for (int i = 0; i < 18; i++)
243  {
244  mat[i] /= a;
245  }
246  return *this;
247 }
248 
249 inline SU3 &SU3::operator*=(double a)
250 {
251  for (int i = 0; i < 18; i++)
252  {
253  mat[i] *= a;
254  }
255  return *this;
256 }
257 
259 {
260  for (int i = 0; i < 18; i+=2)
261  {
262  mat[i] += z.z[0];
263  mat[i+1] += z.z[1];
264  }
265  return *this;
266 }
267 
269 {
270  for (int i = 0; i < 18; i+=2)
271  {
272  mat[i] -= z.z[0];
273  mat[i+1] -= z.z[1];
274  }
275  return *this;
276 }
277 
279 {
280  double temp;
281  for (int i = 0; i < 18; i+=2)
282  {
283  temp = mat[i];
284  mat[i] = mat[i]*z.z[0] - mat[i+1]*z.z[1];
285  mat[i+1] = temp*z.z[1] + mat[i+1]*z.z[0];
286  }
287  return *this;
288 }
289 
290 inline SU3 &SU3::operator =(const double& other)
291 {
292  for (int i = 0; i < 18; i++) {
293  mat[i] = other;
294  }
295  return *this;
296 }
297 
298 
302 
306 inline SU3 SU3::inv()
307 {
308  /*
309  * Takes the inverse of the matrix(which is transpose and conjugate).
310  * Index map:
311  * H =
312  * 0 1 2 0 1 2 3 4 5
313  * 3 4 5 = 6 7 8 9 10 11
314  * 6 7 8 12 13 14 15 16 17
315  */
316  SU3 R;
317  R.mat[0] = mat[0];
318  R.mat[1] = -mat[1];
319  R.mat[2] = mat[6];
320  R.mat[3] = -mat[7];
321  R.mat[4] = mat[12];
322  R.mat[5] = -mat[13];
323  R.mat[6] = mat[2];
324  R.mat[7] = -mat[3];
325  R.mat[8] = mat[8];
326  R.mat[9] = -mat[9];
327  R.mat[10] = mat[14];
328  R.mat[11] = -mat[15];
329  R.mat[12] = mat[4];
330  R.mat[13] = -mat[5];
331  R.mat[14] = mat[10];
332  R.mat[15] = -mat[11];
333  R.mat[16] = mat[16];
334  R.mat[17] = -mat[17];
335  return R;
336 }
337 
339 {
340  /*
341  * Multiplies by (i). Ensure this is correct in unit tests!
342  */
343  double temp;
344  for (int i = 0; i < 9; i++) {
345  temp = mat[2*i];
346  mat[2*i] = -mat[2*i+1];
347  mat[2*i+1] = temp;
348  }
349  return *this;
350 }
351 
353 {
354  /*
355  * An anti-hermitian matrix is made hermitian by multiplying by (-i)
356  */
357  double temp;
358  for (int i = 0; i < 9; i++) {
359  temp = mat[2*i];
360  mat[2*i] = mat[2*i+1];
361  mat[2*i+1] = -temp;
362  }
363  return *this;
364 }
365 
366 #endif // SU3_H
SU3()
Definition: su3.h:25
A complex number class, consisting of t.
Definition: complex.h:16
double normSquared(int i)
Definition: su3.cpp:61
SU3 & operator+=(SU3 B)
Definition: su3.h:166
void setComplex(complex w, int i)
Definition: su3.cpp:74
SU3 conjugate()
Definition: su3.cpp:45
SU3 & operator=(const SU3 &other)
Definition: su3.h:28
complex trace()
Definition: su3.cpp:69
SU3 operator-(SU3 A, SU3 B)
Definition: su3.h:106
double mat[18]
Definition: su3.h:22
void zeros()
Definition: su3.cpp:8
SU3 operator+(SU3 A, SU3 B)
Definition: su3.h:100
class for holding matrices.
Definition: su3.h:18
SU3 operator *(SU3 A, SU3 B)
Definition: su3.h:112
SU3 & operator *=(SU3 B)
Definition: su3.h:184
SU3 inv()
SU3::inv performs a matrix inversion.
Definition: su3.h:306
double norm(int i)
Definition: su3.cpp:53
~SU3()
Definition: su3.h:38
SU3 & operator-=(SU3 B)
Definition: su3.h:175
double & operator[](int i)
Definition: su3.h:41
void print()
Definition: su3.cpp:80
SU3 operator/(SU3 A, double a)
Definition: su3.h:131
complex get(int i, int j)
Definition: su3.h:64
double z[2]
Definition: complex.h:25
SU3 & operator/=(double a)
Definition: su3.h:240
void identity()
Definition: su3.cpp:15
SU3 transpose()
Definition: su3.cpp:26
SU3 makeAntiHermitian()
Definition: su3.h:338
SU3 makeHermitian()
Definition: su3.h:352