14 #ifndef ESYS_LSMEIGENVALUECALCULATOR_H
15 #define ESYS_LSMEIGENVALUECALCULATOR_H
37 inline double cbrt(
double a)
45 double b = -(a(0, 0) + a(1, 1) + a(2, 2));
47 double a00a11 = a(0, 0) * a(1, 1);
48 double a11a22 = a(1, 1) * a(2, 2);
49 double a00a22 = a(0, 0) * a(2, 2);
50 double a10a01 = a(1, 0) * a(0, 1);
51 double a12a21 = a(1, 2) * a(2, 1);
52 double a20a02 = a(2, 0) * a(0, 2);
53 double c = a00a11 + a11a22 + a00a22 - a10a01 - a12a21 - a20a02;
55 double a10a01a22 = a10a01 * a(2, 2);
56 double a12a21a00 = a12a21 * a(0, 0);
57 double a20a02a11 = a20a02 * a(1, 1);
58 double a00a11a22 = a00a11 * a(2, 2);
59 double a01a12a20 = a(0, 1) * a( 1, 2) * a( 2, 0);
60 double a02a10a21 = a(0, 2) * a( 1, 0) * a( 2, 1);
61 double d = a10a01a22 + a12a21a00 + a20a02a11
62 - a00a11a22 - a01a12a20 - a02a10a21;
65 double Q = (3.0 * c - bb) / 9.0;
66 double R = (9.0 * b * c - 27.0 * d - 2.0 * bb * b) / 54.0;
68 return (Q * Q * Q > -(R * R));
78 (c1.real() < c2.real())
81 (c1.real() == c2.real())
83 (c1.imag() < c2.imag())
96 (fabs(c1.real()) < fabs(c2.real()))
99 (fabs(c1.real()) == fabs(c2.real()))
101 (fabs(c1.imag()) < fabs(c2.imag()))
112 return (std::norm(c1) < std::norm(c2));
119 double b = -(a(0, 0) + a(1, 1) + a(2, 2));
121 double a00a11 = a(0, 0) * a(1, 1);
122 double a11a22 = a(1, 1) * a(2, 2);
123 double a00a22 = a(0, 0) * a(2, 2);
124 double a10a01 = a(1, 0) * a(0, 1);
125 double a12a21 = a(1, 2) * a(2, 1);
126 double a20a02 = a(2, 0) * a(0, 2);
127 double c = a00a11 + a11a22 + a00a22 - a10a01 - a12a21 - a20a02;
129 double a10a01a22 = a10a01 * a(2, 2);
130 double a12a21a00 = a12a21 * a(0, 0);
131 double a20a02a11 = a20a02 * a(1, 1);
132 double a00a11a22 = a00a11 * a(2, 2);
133 double a01a12a20 = a(0, 1) * a(1, 2) * a(2, 0);
134 double a02a10a21 = a(0, 2) * a(1, 0) * a(2, 1);
135 double d = a10a01a22 + a12a21a00 + a20a02a11
136 - a00a11a22 - a01a12a20 - a02a10a21;
139 double Q = (3.0 * c - bb) / 9.0;
140 double R = (9.0 * b * c - 27.0 * d - 2.0 * bb * b) / 54.0;
141 double D = Q * Q * Q + R * R;
147 double sqrtD = sqrt(D);
148 double S =
cbrt(R + sqrtD);
149 double T =
cbrt(R - sqrtD);
153 double x = nOTb - 0.5 * SpT;
160 double sqrtD = sqrt(-D);
162 e[0] = nOTb + 2.0 * S.real();
164 double x = nOTb - S.real();
172 e[0] = nOTb + 2.0 * S;
182 std::cout <<
"a: " << a(0, 0) <<
" " << a(0, 1) <<
" " << a(0, 2) << std::endl
183 <<
" " << a(1, 0) <<
" " << a(1, 1) <<
" " << a(1, 2) << std::endl
184 <<
" " << a(2, 0) <<
" " << a(2, 1) <<
" " << a(2, 2) << std::endl;
187 std::cout <<
"Complex eigenvalues" << std::endl;
189 std::cout <<
"Real eigenvalues" << std::endl;
192 std::cout <<
"e0: " << e[0] << std::endl;
193 std::cout <<
"e1: " << e[1] << std::endl;
194 std::cout <<
"e2: " << e[2] << std::endl;
195 std::cout << std::endl;
203 esys::lsm::EigenvalueCalculator::ComplexVector::const_iterator it = vec.begin();
204 if (it != vec.end()) {
208 for (; it != vec.end(); it++)
210 oStream <<
" " << (*it);