35 #include "Math/complex.h" 48 SU3::SU3(
double value) noexcept{
53 SU3::SU3(
SU3 const& source) noexcept : mat(source.mat){
56 SU3::SU3(
SU3&& source) noexcept : mat(source.mat){
60 SU3 operator~(
const SU3& a){
62 for(
int i = 0; i < 3; i++){
63 for(
int j = 0; j < 3; j++){
64 c.mat[2 * (3*i + j)] = a.mat[2 * (3*j + i)];
65 c.mat[2 * (3*i + j) + 1] = -a.mat[2 * (3*j + i) + 1];
73 for(
int i = 0; i < 3; i++){
74 for(
int j = 0; j < 3; j++){
75 c.mat[2 * (3*i + j)] = a.mat[2 * (3*j + i)];
76 c.mat[2 * (3*i + j) + 1] = -a.mat[2 * (3*j + i) + 1];
84 for(
int i = 0; i < 3; i++){
85 for(
int j = 0; j < 3; j++){
86 printf(
"( %2.5g, %2.5g )\t", mat[idx], mat[idx+1]);
94 void SU3::setSU3Identity(){
95 for(
int i = 0; i < 18; i++)
102 void SU3::setSU3Zero(){
103 for(
int i = 0; i < 18; i++)
107 double SU3::realTrace(){
108 return mat[0] + mat[8] + mat[16];
111 double SU3::imagTrace(){
112 return mat[1] + mat[9] + mat[17];
119 return a.mat[0] * b.mat[0] - a.mat[1]*b.mat[1] + a.mat[2] * b.mat[6] - a.mat[3]*b.mat[7] + a.mat[4] * b.mat[12] - a.mat[5]*b.mat[13]
120 + a.mat[6] * b.mat[2] - a.mat[7]*b.mat[3] + a.mat[8] * b.mat[8] - a.mat[9]*b.mat[9] + a.mat[10] * b.mat[14] - a.mat[11]*b.mat[15]
121 + a.mat[12] * b.mat[4] - a.mat[13]*b.mat[5] + a.mat[14] * b.mat[10] - a.mat[15]*b.mat[11] + a.mat[16] * b.mat[16] - a.mat[17]*b.mat[17];
126 return a.mat[0] * b.mat[0] - a.mat[1]*b.mat[1] + a.mat[2] * b.mat[6] - a.mat[3]*b.mat[7] + a.mat[4] * b.mat[12] - a.mat[5]*b.mat[13]
127 + a.mat[6] * b.mat[2] - a.mat[7]*b.mat[3] + a.mat[8] * b.mat[8] - a.mat[9]*b.mat[9] + a.mat[10] * b.mat[14] - a.mat[11]*b.mat[15]
128 + a.mat[12] * b.mat[4] - a.mat[13]*b.mat[5] + a.mat[14] * b.mat[10] - a.mat[15]*b.mat[11] + a.mat[16] * b.mat[16] - a.mat[17]*b.mat[17];
140 double c0 = Q3.realTrace() / 3.0;
141 double c1 = Q2.realTrace() / 2.0;
143 bool c0negative =
false;
149 double c1sqrt = sqrt(c1);
150 double oneoversqrt3 = 1.0/sqrt(3);
151 double c0max = c1*c1sqrt*oneoversqrt3*2.0 / 3.0;
152 double theta = acos(c0/c0max);
153 double w = c1sqrt*sin(theta/3.0);
154 double u = c1sqrt*oneoversqrt3*cos(theta/3.0);
160 xi = 1.0 - w2/6.0 * (1 - w2/20.0 * (1 - w2/42.0));
166 double cmu = cos(-u);
167 double smu = sin(-u);
168 double c2u = cmu*cmu-smu*smu;
169 double s2u = -2.0*cmu*smu;
171 double cwcmu = cw*cmu;
172 double cwsmu = cw*smu;
173 double xicmu = xi*cmu;
174 double xismu = xi*smu;
176 double h0r, h0i, h1r, h1i, h2r, h2i;
177 h0r = (u2-w2)*c2u + 8.0*u2*cwcmu - 2.0*u*(3.0*u2+w2)*xismu;
178 h0i = (u2-w2)*s2u + 8.0*u2*cwsmu + 2.0*u*(3.0*u2+w2)*xicmu;
180 h1r = 2*u*c2u - 2*u*cwcmu - (3.0*u2-w2)*xismu;
181 h1i = 2*u*s2u - 2*u*cwsmu + (3.0*u2-w2)*xicmu;
183 h2r = c2u - cwcmu + 3*u*xismu;
184 h2i = s2u - cwsmu - 3*u*xicmu;
191 double norm = 1.0/(9.0*u2-w2);
202 for(
int i = 0; i < 18; i+=2){
205 result.mat[i] = h1r*Q.mat[i]-h1i*Q.mat[i+1];
207 result.mat[i] += h2r*Q2.mat[i]-h2i*Q2.mat[i+1];
211 result.mat[i] += h0r;
214 result.mat[i+1] = h1r*Q.mat[i+1]+h1i*Q.mat[i];
216 result.mat[i+1] += h2r*Q2.mat[i+1]+h2i*Q2.mat[i];
219 result.mat[i+1] += h0i;
229 double c0 = Q3.realTrace() / 3.0;
230 double c1 = Q2.realTrace() / 2.0;
232 bool c0negative =
false;
238 double c1sqrt = sqrt(c1);
239 double oneoversqrt3 = 1.0/sqrt(3);
240 double c0max = c1*c1sqrt*oneoversqrt3*2.0 / 3.0;
241 double theta = acos(c0/c0max);
242 double w = c1sqrt*sin(theta/3.0);
243 double u = c1sqrt*oneoversqrt3*cos(theta/3.0);
249 xi = 1.0 - w2/6.0 * (1 - w2/20.0 * (1 - w2/42.0));
255 double cmu = cos(-u);
256 double smu = sin(-u);
257 double c2u = cmu*cmu-smu*smu;
258 double s2u = -2.0*cmu*smu;
260 double cwcmu = cw*cmu;
261 double cwsmu = cw*smu;
262 double xicmu = xi*cmu;
263 double xismu = xi*smu;
265 double h0r, h0i, h1r, h1i, h2r, h2i;
266 h0r = (u2-w2)*c2u + 8.0*u2*cwcmu - 2.0*u*(3.0*u2+w2)*xismu;
267 h0i = (u2-w2)*s2u + 8.0*u2*cwsmu + 2.0*u*(3.0*u2+w2)*xicmu;
269 h1r = 2*u*c2u - 2*u*cwcmu - (3.0*u2-w2)*xismu;
270 h1i = 2*u*s2u - 2*u*cwsmu + (3.0*u2-w2)*xicmu;
272 h2r = c2u - cwcmu + 3*u*xismu;
273 h2i = s2u - cwsmu - 3*u*xicmu;
280 double norm = 1.0/(9.0*u2-w2);
291 for(
int i = 0; i < 18; i+=2){
294 result.mat[i] = h1r*Q.mat[i]-h1i*Q.mat[i+1];
296 result.mat[i] += h2r*Q2.mat[i]-h2i*Q2.mat[i+1];
300 result.mat[i] += h0r;
303 result.mat[i+1] = h1r*Q.mat[i+1]+h1i*Q.mat[i];
305 result.mat[i+1] += h2r*Q2.mat[i+1]+h2i*Q2.mat[i];
308 result.mat[i+1] += h0i;
Implementation of a class to perform arithmetics between links.
double getMultSumTrace(SU3 &a, SU3 &b)
returns the real trace of the product of two SU3 matrices a and b
Basic library to implement SU3 matrix arithmetics and functions.