2 #include <libmesh/dense_matrix.h>
3 #include <libmesh/dense_vector.h>
5 #ifdef LIBMESH_HAVE_PETSC
6 #include "libmesh/petsc_macro.h"
23 CPPUNIT_TEST(testOuterProduct);
24 CPPUNIT_TEST(testSVD);
25 CPPUNIT_TEST(testEVDreal);
26 CPPUNIT_TEST(testEVDcomplex);
27 CPPUNIT_TEST(testComplexSVD);
28 CPPUNIT_TEST(testSubMatrix);
30 CPPUNIT_TEST_SUITE_END();
50 a_times_b_correct(0, 0) = 3.0;
51 a_times_b_correct(0, 1) = 4.0;
52 a_times_b_correct(0, 2) = 5.0;
53 a_times_b_correct(1, 0) = 6.0;
54 a_times_b_correct(1, 1) = 8.0;
55 a_times_b_correct(1, 2) = 10.0;
57 for (
unsigned int i = 0; i < a.
size(); ++i)
58 for (
unsigned int j = 0; j < b.
size(); ++j)
69 A(0,0) = 1.0;
A(0,1) = 2.0;
70 A(1,0) = 3.0;
A(1,1) = 4.0;
71 A(2,0) = 5.0;
A(2,1) = 6.0;
78 true_U(0,0) = -2.298476964000715e-01; true_U(0,1) = 8.834610176985250e-01;
79 true_U(1,0) = -5.247448187602936e-01; true_U(1,1) = 2.407824921325463e-01;
80 true_U(2,0) = -8.196419411205157e-01; true_U(2,1) = -4.018960334334318e-01;
82 true_VT(0,0) = -6.196294838293402e-01; true_VT(0,1) = -7.848944532670524e-01;
83 true_VT(1,0) = -7.848944532670524e-01; true_VT(1,1) = 6.196294838293400e-01;
85 true_sigma(0) = 9.525518091565109e+00;
86 true_sigma(1) = 5.143005806586446e-01;
91 for (
unsigned i=0; i<U.
m(); ++i)
92 for (
unsigned j=0; j<U.
n(); ++j)
95 for (
unsigned i=0; i<VT.
m(); ++i)
96 for (
unsigned j=0; j<VT.
n(); ++j)
99 for (
unsigned i=0; i<sigma.
size(); ++i)
100 LIBMESH_ASSERT_FP_EQUAL(sigma(i), true_sigma(i), tol);
109 std::vector<Real> true_lambda_real,
110 std::vector<Real> true_lambda_imag,
116 #ifdef LIBMESH_USE_REAL_NUMBERS
127 const unsigned N =
A.m();
134 for (
unsigned eigenval=0; eigenval<N; ++eigenval)
137 if (
std::abs(lambda_imag(eigenval)) < tol*tol)
141 for (
unsigned i=0; i<N; ++i)
143 rhs(i) = lambda_real(eigenval) * VL(i, eigenval);
144 for (
unsigned j=0; j<N; ++j)
145 lhs(i) +=
A(j, i) * VL(j, eigenval);
151 LIBMESH_ASSERT_FP_EQUAL(0., lhs.l2_norm(),
std::sqrt(tol)*tol);
168 for (
unsigned i=0; i<N; ++i)
170 rhs(i) = lambda_real(eigenval) * VL(i, eigenval) + lambda_imag(eigenval) * VL(i, eigenval+1);
171 for (
unsigned j=0; j<N; ++j)
172 lhs(i) +=
A(j, i) * VL(j, eigenval);
176 LIBMESH_ASSERT_FP_EQUAL(0., lhs.l2_norm(),
std::sqrt(tol)*tol);
187 for (
unsigned i=0; i<N; ++i)
189 rhs(i) = -lambda_imag(eigenval) * VL(i, eigenval) + lambda_real(eigenval) * VL(i, eigenval+1);
190 for (
unsigned j=0; j<N; ++j)
191 lhs(i) +=
A(j, i) * VL(j, eigenval+1);
195 LIBMESH_ASSERT_FP_EQUAL(0., lhs.l2_norm(),
std::sqrt(tol)*tol);
215 for (
unsigned eigenval=0; eigenval<N; ++eigenval)
218 if (
std::abs(lambda_imag(eigenval)) < tol*tol)
222 for (
unsigned i=0; i<N; ++i)
224 rhs(i) = lambda_real(eigenval) * VR(i, eigenval);
225 for (
unsigned j=0; j<N; ++j)
226 lhs(i) +=
A(i, j) * VR(j, eigenval);
230 LIBMESH_ASSERT_FP_EQUAL(0., lhs.l2_norm(),
std::sqrt(tol)*tol);
247 for (
unsigned i=0; i<N; ++i)
249 rhs(i) = lambda_real(eigenval) * VR(i, eigenval) - lambda_imag(eigenval) * VR(i, eigenval+1);
250 for (
unsigned j=0; j<N; ++j)
251 lhs(i) +=
A(i, j) * VR(j, eigenval);
255 LIBMESH_ASSERT_FP_EQUAL(0., lhs.l2_norm(),
std::sqrt(tol)*tol);
260 for (
unsigned i=0; i<N; ++i)
262 rhs(i) = lambda_imag(eigenval) * VR(i, eigenval) + lambda_real(eigenval) * VR(i, eigenval+1);
263 for (
unsigned j=0; j<N; ++j)
264 lhs(i) +=
A(i, j) * VR(j, eigenval+1);
268 LIBMESH_ASSERT_FP_EQUAL(0., lhs.l2_norm(),
std::sqrt(tol)*tol);
282 std::sort(true_lambda_real.begin(), true_lambda_real.end());
283 std::sort(true_lambda_imag.begin(), true_lambda_imag.end());
286 for (
unsigned i=0; i<lambda_real.
size(); ++i)
293 LIBMESH_ASSERT_FP_EQUAL(true_lambda_real[i], lambda_real(i),
std::sqrt(tol)*tol);
294 LIBMESH_ASSERT_FP_EQUAL(true_lambda_imag[i], lambda_imag(i),
std::sqrt(tol)*tol);
304 A(0,0) = -149;
A(0,1) = -50;
A(0,2) = -154;
305 A(1,0) = 537;
A(1,1) = 180;
A(1,2) = 546;
306 A(2,0) = -27;
A(2,1) = -9;
A(2,2) = -25;
308 std::vector<Real> true_lambda_real(3);
309 true_lambda_real[0] = 1.;
310 true_lambda_real[1] = 2.;
311 true_lambda_real[2] = 3.;
312 std::vector<Real> true_lambda_imag(3);
315 testEVD_helper(
A, true_lambda_real, true_lambda_imag,
TOLERANCE);
323 A(0,0) = 0;
A(0,1) = -6;
A(0,2) = -1;
324 A(1,0) = 6;
A(1,1) = 2;
A(1,2) = -16;
325 A(2,0) = -5;
A(2,1) = 20;
A(2,2) = -10;
327 std::vector<Real> true_lambda_real(3);
328 true_lambda_real[0] = -3.070950351248293;
329 true_lambda_real[1] = -2.464524824375853;
330 true_lambda_real[2] = -2.464524824375853;
331 std::vector<Real> true_lambda_imag(3);
332 true_lambda_imag[0] = 0.;
333 true_lambda_imag[1] = 17.60083096447099;
334 true_lambda_imag[2] = -17.60083096447099;
341 testEVD_helper(
A, true_lambda_real, true_lambda_imag, tol);
346 #ifdef LIBMESH_USE_COMPLEX_NUMBERS
357 true_sigma(0) = 7.54942516052;
358 true_sigma(1) = 3.17479511368e-06;
359 true_sigma(2) = 6.64680908281e-07;
361 for (
unsigned i=0; i<sigma.
size(); ++i)
362 LIBMESH_ASSERT_FP_EQUAL(sigma(i), true_sigma(i), 1.e-10);
369 A(0,0) = 1.0;
A(0,1) = 2.0;
A(0,2) = 3.0;
370 A(1,0) = 4.0;
A(1,1) = 5.0;
A(1,2) = 6.0;
371 A(2,0) = 7.0;
A(2,1) = 8.0;
A(2,2) = 9.0;
372 A(3,0) =10.0;
A(3,1) =11.0;
A(3,2) =12.0;
375 B(0,0) = 7.0;
B(0,1) = 8.0;
376 B(1,0) =10.0;
B(1,1) =11.0;
379 CPPUNIT_ASSERT(
B == C);
384 #ifdef LIBMESH_HAVE_PETSC
385 #if !PETSC_VERSION_LESS_THAN(3,1,0)