Bridge++  Ver. 1.2.x
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
mat_SU_N.cpp
Go to the documentation of this file.
1 
14 #include "mat_SU_N.h"
15 using namespace SU_N;
16 
17 //==========================================================
19 {
20  // This implementation is applicable only to SU(3).
21  // H.Matsufuru [5 Feb 2012]
22 
23  assert(m_Nc == 3);
24 
25  Mat_SU_N rhs(m_Nc);
26  for (int i = 0; i < 2 * m_Nc * m_Nc; ++i) {
27  rhs.va[i] = va[i];
28  }
29 
30  double sn1 = 1.0 / (rhs.va[0] * rhs.va[0] + rhs.va[1] * rhs.va[1]
31  + rhs.va[2] * rhs.va[2] + rhs.va[3] * rhs.va[3]
32  + rhs.va[4] * rhs.va[4] + rhs.va[5] * rhs.va[5]);
33  sn1 = sqrt(sn1);
34 
35  va[0] = rhs.va[0] * sn1;
36  va[1] = rhs.va[1] * sn1;
37  va[2] = rhs.va[2] * sn1;
38  va[3] = rhs.va[3] * sn1;
39  va[4] = rhs.va[4] * sn1;
40  va[5] = rhs.va[5] * sn1;
41 
42  double sp1r = va[0] * rhs.va[6] + va[1] * rhs.va[7]
43  + va[2] * rhs.va[8] + va[3] * rhs.va[9]
44  + va[4] * rhs.va[10] + va[5] * rhs.va[11];
45  double sp1i = va[0] * rhs.va[7] - va[1] * rhs.va[6]
46  + va[2] * rhs.va[9] - va[3] * rhs.va[8]
47  + va[4] * rhs.va[11] - va[5] * rhs.va[10];
48 
49  va[6] = rhs.va[6] - sp1r * va[0] + sp1i * va[1];
50  va[7] = rhs.va[7] - sp1r * va[1] - sp1i * va[0];
51  va[8] = rhs.va[8] - sp1r * va[2] + sp1i * va[3];
52  va[9] = rhs.va[9] - sp1r * va[3] - sp1i * va[2];
53  va[10] = rhs.va[10] - sp1r * va[4] + sp1i * va[5];
54  va[11] = rhs.va[11] - sp1r * va[5] - sp1i * va[4];
55 
56  double sn2 = 1.0 / (va[6] * va[6] + va[7] * va[7]
57  + va[8] * va[8] + va[9] * va[9]
58  + va[10] * va[10] + va[11] * va[11]);
59  sn2 = sqrt(sn2);
60 
61  va[6] = va[6] * sn2;
62  va[7] = va[7] * sn2;
63  va[8] = va[8] * sn2;
64  va[9] = va[9] * sn2;
65  va[10] = va[10] * sn2;
66  va[11] = va[11] * sn2;
67 
68  va[12] = va[2] * va[10] - va[3] * va[11]
69  - va[4] * va[8] + va[5] * va[9];
70 
71  va[13] = -va[2] * va[11] - va[3] * va[10]
72  + va[4] * va[9] + va[5] * va[8];
73 
74  va[14] = va[4] * va[6] - va[5] * va[7]
75  - va[0] * va[10] + va[1] * va[11];
76 
77  va[15] = -va[4] * va[7] - va[5] * va[6]
78  + va[0] * va[11] + va[1] * va[10];
79 
80  va[16] = va[0] * va[8] - va[1] * va[9]
81  - va[2] * va[6] + va[3] * va[7];
82 
83  va[17] = -va[0] * va[9] - va[1] * va[8]
84  + va[2] * va[7] + va[3] * va[6];
85 
86  return *this;
87 }
88 
89 //==========================================================
91 {
92  // This implementation is applicable only to SU(2).
93  // H.Matsufuru [8 Mar 2012]
94 
95  assert(m_Nc == 2);
96 
97  double sn1 = 1.0 / (va[0] * va[0] + va[1] * va[1]
98  + va[2] * va[2] + va[3] * va[3]);
99  sn1 = sqrt(sn1);
100 
101  va[0] *= sn1;
102  va[1] *= sn1;
103  va[2] *= sn1;
104  va[3] *= sn1;
105 
106  va[4] = -va[2];
107  va[5] = va[3];
108  va[6] = va[0];
109  va[7] = -va[1];
110 
111  return *this;
112 }
113 
114 //==========================================================
116 {
117  // This implementation is applicable only to SU(3).
118  // H.Matsufuru [5 Feb 2012]
119 
120  assert(m_Nc > 3);
121 
123  qr.set_matrix(&va[0]);
124  qr.get_Qu(&va[0]);
125 
126  Eigen_QR_Cmplx eigen_qr(m_Nc);
127  std::valarray<double> v = eigen_qr.solve(&va[0]);
128  double det_arg = 0;
129  for (int i = 0; i < m_Nc; ++i) {
130  det_arg += std::atan2(v[2 * i + 1], v[2 * i]);
131  }
132  det_arg /= m_Nc;
133  double inv_re = std::cos(det_arg);
134  double inv_im = -std::sin(det_arg);
135 
136  for (int i = 0; i < m_Nc * m_Nc; ++i) {
137  double re = va[2 * i];
138  double im = va[2 * i + 1];
139 
140  va[2 * i] = re * inv_re - im * inv_im;
141  va[2 * i + 1] = re * inv_im + im * inv_re;
142  }
143 
144  return *this;
145 }
146 
147 //==========================================================
149 {
150  // temporary implementation: only applicable to SU(3).
151  // H.Matsufuru [5 Feb 2012]
152 
153  assert(m_Nc == 3);
154 
155  static const double PI = 4.0 * atan(1.0);
156  double PI2 = 2.0 * PI;
157 
158  for (int j = 0; j < m_Nc; ++j) {
159  int j2 = j * 2 * m_Nc;
160  double rn1 = rand->get();
161  double rn2 = rand->get();
162  double rn3 = rand->get();
163  double rn4 = rand->get();
164  double rn5 = rand->get();
165 
166  double c1 = 1.0 - 2.0 * rn1;
167  double s1 = sqrt(1.0 - c1 * c1);
168  double v1_2 = s1 * cos(PI2 * rn2);
169  double v1_3 = s1 * sin(PI2 * rn2);
170 
171  va[j2 + 0] = c1 * cos(PI2 * rn3);
172  va[j2 + 1] = c1 * sin(PI2 * rn3);
173  va[j2 + 2] = v1_2 * cos(PI2 * rn4);
174  va[j2 + 3] = v1_2 * sin(PI2 * rn4);
175  va[j2 + 4] = v1_3 * cos(PI2 * rn5);
176  va[j2 + 5] = v1_3 * sin(PI2 * rn5);
177  }
178 
179  reunit();
180 
181  return *this;
182 }
183 
184 //==========================================================
186 {
187  assert(m_Nc == 2);
188 
189  printf("set_random for SU(2) is not supported.\n");
190  abort();
191 }
192 
193 //==========================================================
195 {
196  // implemented by S.Ueda.
197 
198  assert(m_Nc > 3);
199 
200  for (int j = 0; j < m_Nc * m_Nc; ++j) {
201  rand->gauss(va[2 * j], va[2 * j + 1]);
202  }
203 
204  reunit();
205 
206  return *this;
207 }
208 
209 //==========================================================
210 //==================================================END=====
Mat_SU_N & reunit_SU2()
Definition: mat_SU_N.cpp:90
double i(int c) const
Definition: mat_SU_N.h:115
virtual double get()=0
Mat_SU_N & set_random_SU3(RandomNumbers *)
Definition: mat_SU_N.cpp:148
std::valarray< double > solve(const double *matrix)
Mat_SU_N & reunit()
Definition: mat_SU_N.h:71
Mat_SU_N & set_random_general(RandomNumbers *)
Definition: mat_SU_N.cpp:194
void set_matrix(const double *mat)
std::valarray< double > va
Definition: mat_SU_N.h:38
Base class of random number generators.
Definition: randomNumbers.h:40
Mat_SU_N & reunit_general()
Definition: mat_SU_N.cpp:115
void get_Qu(double *mat)
Mat_SU_N & reunit_SU3()
Definition: mat_SU_N.cpp:18
Mat_SU_N & set_random_SU2(RandomNumbers *)
Definition: mat_SU_N.cpp:185
void gauss(double &rn1, double &rn2)