15 #ifndef MAT_SU_N_INCLUDED
16 #define MAT_SU_N_INCLUDED
27 std::valarray<double>
va;
69 int size()
const {
return va.size(); }
70 double r(
int c)
const {
return va[2 * c]; }
71 double i(
int c)
const {
return va[2 * c + 1]; }
73 double r(
int c1,
int c2)
const {
return r(
m_Nc * c1 + c2); }
74 double i(
int c1,
int c2)
const {
return i(
m_Nc * c1 + c2); }
76 void setr(
int c,
const double& re) {
va[2 * c] = re; }
77 void seti(
int c,
const double& im) {
va[2 * c + 1] = im; }
79 void setr(
int c1,
int c2,
const double& re)
84 void seti(
int c1,
int c2,
const double& im)
89 void set(
int c,
double re,
const double& im)
95 void set(
int c1,
int c2,
const double& re,
const double& im)
97 set(
m_Nc * c1 + c2, re, im);
100 void add(
int c,
const double& re,
const double& im)
106 void add(
int c1,
int c2,
const double& re,
const double& im)
121 for (
int a = 0; a <
m_Nc; ++a) {
122 for (
int b = 0; b <
m_Nc; ++b) {
123 va[2 * (b + m_Nc * a)] = 0.0;
124 va[2 * (b + m_Nc * a) + 1] = 0.0;
125 for (
int c = 0; c <
m_Nc; ++c) {
126 va[2 * (b + m_Nc * a)] += u1.
va[2 * (c + m_Nc * a)] * u2.
va[2 * (b + m_Nc * c)]
127 - u1.
va[2 * (c + m_Nc * a) + 1] * u2.
va[2 * (b + m_Nc * c) + 1];
128 va[2 * (b + m_Nc * a) + 1] += u1.
va[2 * (c + m_Nc * a) + 1] * u2.
va[2 * (b + m_Nc * c)]
129 + u1.
va[2 * (c + m_Nc * a)] * u2.
va[2 * (b + m_Nc * c) + 1];
137 for (
int a = 0; a <
m_Nc; ++a) {
138 for (
int b = 0; b <
m_Nc; ++b) {
139 for (
int c = 0; c <
m_Nc; ++c) {
140 va[2 * (b + m_Nc * a)] += u1.
va[2 * (c + m_Nc * a)] * u2.
va[2 * (b + m_Nc * c)]
141 - u1.
va[2 * (c + m_Nc * a) + 1] * u2.
va[2 * (b + m_Nc * c) + 1];
142 va[2 * (b + m_Nc * a) + 1] += u1.
va[2 * (c + m_Nc * a) + 1] * u2.
va[2 * (b + m_Nc * c)]
143 + u1.
va[2 * (c + m_Nc * a)] * u2.
va[2 * (b + m_Nc * c) + 1];
151 for (
int a = 0; a <
m_Nc; ++a) {
152 for (
int b = 0; b <
m_Nc; ++b) {
153 va[2 * (b + m_Nc * a)] = 0.0;
154 va[2 * (b + m_Nc * a) + 1] = 0.0;
155 for (
int c = 0; c <
m_Nc; ++c) {
156 va[2 * (b + m_Nc * a)] += u1.
va[2 * (c + m_Nc * a)] * u2.
va[2 * (c + m_Nc * b)]
157 + u1.
va[2 * (c + m_Nc * a) + 1] * u2.
va[2 * (c + m_Nc * b) + 1];
158 va[2 * (b + m_Nc * a) + 1] += u1.
va[2 * (c + m_Nc * a) + 1] * u2.
va[2 * (c + m_Nc * b)]
159 - u1.
va[2 * (c + m_Nc * a)] * u2.
va[2 * (c + m_Nc * b) + 1];
167 for (
int a = 0; a <
m_Nc; ++a) {
168 for (
int b = 0; b <
m_Nc; ++b) {
169 for (
int c = 0; c <
m_Nc; ++c) {
170 va[2 * (b + m_Nc * a)] += u1.
va[2 * (c + m_Nc * a)] * u2.
va[2 * (c + m_Nc * b)]
171 + u1.
va[2 * (c + m_Nc * a) + 1] * u2.
va[2 * (c + m_Nc * b) + 1];
172 va[2 * (b + m_Nc * a) + 1] += u1.
va[2 * (c + m_Nc * a) + 1] * u2.
va[2 * (c + m_Nc * b)]
173 - u1.
va[2 * (c + m_Nc * a)] * u2.
va[2 * (c + m_Nc * b) + 1];
181 for (
int a = 0; a <
m_Nc; ++a) {
182 for (
int b = 0; b <
m_Nc; ++b) {
183 va[2 * (b + m_Nc * a)] = 0.0;
184 va[2 * (b + m_Nc * a) + 1] = 0.0;
185 for (
int c = 0; c <
m_Nc; ++c) {
186 va[2 * (b + m_Nc * a)] += u1.
va[2 * (a + m_Nc * c)] * u2.
va[2 * (b + m_Nc * c)]
187 + u1.
va[2 * (a + m_Nc * c) + 1] * u2.
va[2 * (b + m_Nc * c) + 1];
188 va[2 * (b + m_Nc * a) + 1] -= u1.
va[2 * (a + m_Nc * c) + 1] * u2.
va[2 * (b + m_Nc * c)]
189 - u1.
va[2 * (a + m_Nc * c)] * u2.
va[2 * (b + m_Nc * c) + 1];
197 for (
int a = 0; a <
m_Nc; ++a) {
198 for (
int b = 0; b <
m_Nc; ++b) {
199 for (
int c = 0; c <
m_Nc; ++c) {
200 va[2 * (b + m_Nc * a)] += u1.
va[2 * (a + m_Nc * c)] * u2.
va[2 * (b + m_Nc * c)]
201 + u1.
va[2 * (a + m_Nc * c) + 1] * u2.
va[2 * (b + m_Nc * c) + 1];
202 va[2 * (b + m_Nc * a) + 1] -= u1.
va[2 * (a + m_Nc * c) + 1] * u2.
va[2 * (b + m_Nc * c)]
203 - u1.
va[2 * (a + m_Nc * c)] * u2.
va[2 * (b + m_Nc * c) + 1];
211 for (
int cc = 0; cc <
m_Nc *
m_Nc; ++cc) {
212 va[2 * cc] = re * v.
va[2 * cc] - im * v.
va[2 * cc + 1];
213 va[2 * cc + 1] = re * v.
va[2 * cc + 1] + im * v.
va[2 * cc];
219 for (
int cc = 0; cc <
m_Nc *
m_Nc; ++cc) {
220 va[2 * cc] += re * v.
va[2 * cc] - im * v.
va[2 * cc + 1];
221 va[2 * cc + 1] += re * v.
va[2 * cc + 1] + im * v.
va[2 * cc];
228 for (
int a = 0; a <
m_Nc; ++a) {
229 for (
int b = a; b <
m_Nc; ++b) {
230 double re =
va[2 * (m_Nc * a + b)];
231 double im =
va[2 * (m_Nc * a + b) + 1];
233 va[2 * (m_Nc * a + b)] =
va[2 * (m_Nc * b + a)];
234 va[2 * (m_Nc * a + b) + 1] = -va[2 * (m_Nc * b + a) + 1];
236 va[2 * (m_Nc * b + a)] = re;
237 va[2 * (m_Nc * b + a) + 1] = -im;
246 for (
int a = 0; a <
m_Nc; ++a) {
247 for (
int b = a + 1; b <
m_Nc; ++b) {
248 double re =
va[2 * (m_Nc * a + b)] +
va[2 * (m_Nc * b + a)];
249 double im =
va[2 * (m_Nc * a + b) + 1] -
va[2 * (m_Nc * b + a) + 1];
251 va[2 * (m_Nc * a + b)] = 0.5 * re;
252 va[2 * (m_Nc * a + b) + 1] = 0.5 * im;
254 va[2 * (m_Nc * b + a)] = 0.5 * re;
255 va[2 * (m_Nc * b + a) + 1] = -0.5 * im;
259 for (
int cc = 0; cc <
m_Nc; ++cc) {
260 tr +=
va[2 * (m_Nc * cc + cc)];
263 for (
int cc = 0; cc <
m_Nc; ++cc) {
264 va[2 * (m_Nc * cc + cc)] -= tr;
265 va[2 * (m_Nc * cc + cc) + 1] = 0.0;
274 for (
int a = 0; a <
m_Nc; ++a) {
275 for (
int b = a + 1; b <
m_Nc; ++b) {
276 double re =
va[2 * (m_Nc * a + b)] -
va[2 * (m_Nc * b + a)];
277 double im =
va[2 * (m_Nc * a + b) + 1] +
va[2 * (m_Nc * b + a) + 1];
279 va[2 * (m_Nc * a + b)] = 0.5 * re;
280 va[2 * (m_Nc * a + b) + 1] = 0.5 * im;
282 va[2 * (m_Nc * b + a)] = -0.5 * re;
283 va[2 * (m_Nc * b + a) + 1] = 0.5 * im;
287 for (
int cc = 0; cc <
m_Nc; ++cc) {
288 tr +=
va[2 * (m_Nc * cc + cc) + 1];
291 for (
int cc = 0; cc <
m_Nc; ++cc) {
292 va[2 * (m_Nc * cc + cc)] = 0.0;
293 va[2 * (m_Nc * cc + cc) + 1] -= tr;
302 for (
int a = 0; a <
m_Nc; ++a) {
303 for (
int b = a; b <
m_Nc; ++b) {
304 double re =
va[2 * (m_Nc * a + b)] -
va[2 * (m_Nc * b + a)];
305 double im =
va[2 * (m_Nc * a + b) + 1] +
va[2 * (m_Nc * b + a) + 1];
306 va[2 * (m_Nc * a + b)] = 0.5 * re;
307 va[2 * (m_Nc * a + b) + 1] = 0.5 * im;
308 va[2 * (m_Nc * b + a)] = -0.5 * re;
309 va[2 * (m_Nc * b + a) + 1] = 0.5 * im;
319 for (
int c = 0; c <
m_Nc; ++c) {
320 va[2 * (m_Nc + 1) * c] = 1.0;
335 for (
int c = 0; c <
va.size() / 2; ++c) {
336 double tmp =
va[2 * c];
337 va[2 * c] = -
va[2 * c + 1];
388 std::valarray<double> tmp(2 *
m_Nc *
m_Nc);
390 for (
int a = 0; a <
m_Nc; ++a) {
391 for (
int b = 0; b <
m_Nc; ++b) {
392 tmp[2 * (m_Nc * a + b)] = 0.0;
393 tmp[2 * (m_Nc * a + b) + 1] = 0.0;
394 for (
int c = 0; c <
m_Nc; ++c) {
395 tmp[2 * (m_Nc * a + b)] +=
va[2 * (m_Nc * a + c)] * rhs.
va[2 * (m_Nc * c + b)]
396 -
va[2 * (m_Nc * a + c) + 1] * rhs.
va[2 * (m_Nc * c + b) + 1];
397 tmp[2 * (m_Nc * a + b) + 1] +=
va[2 * (m_Nc * a + c) + 1] * rhs.
va[2 * (m_Nc * c + b)]
398 +
va[2 * (m_Nc * a + c)] * rhs.
va[2 * (m_Nc * c + b) + 1];
436 for (
int c = 0; c < Nc; ++c) {
448 for (
int c = 0; c < Nc; ++c) {
460 for (
int a = 0; a < Nc; a++) {
461 for (
int b = 0; b < Nc; b++) {
462 tmp.
set(a, b, u.
r(b, a), -u.
i(b, a));
474 for (
int c = 0; c < u.
size() / 2; ++c) {
475 tmp.
set(c, -u.
i(c), u.
r(c));