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();
49 for (
unsigned int i = 0; i < a.
size(); ++i)
50 for (
unsigned int j = 0; j < b.
size(); ++j)
51 LIBMESH_ASSERT_NUMBERS_EQUAL
70 -2.298476964000715e-01, 8.834610176985250e-01,
71 -5.247448187602936e-01, 2.407824921325463e-01,
72 -8.196419411205157e-01, -4.018960334334318e-01});
75 -6.196294838293402e-01, -7.848944532670524e-01,
76 -7.848944532670524e-01, 6.196294838293400e-01});
83 for (
unsigned i=0; i<U.
m(); ++i)
84 for (
unsigned j=0; j<U.
n(); ++j)
85 LIBMESH_ASSERT_NUMBERS_EQUAL( U(i,j), true_U(i,j), tol);
87 for (
unsigned i=0; i<VT.
m(); ++i)
88 for (
unsigned j=0; j<VT.
n(); ++j)
89 LIBMESH_ASSERT_NUMBERS_EQUAL( VT(i,j), true_VT(i,j), tol);
91 for (
unsigned i=0; i<sigma.
size(); ++i)
92 LIBMESH_ASSERT_FP_EQUAL(sigma(i), true_sigma(i), tol);
101 std::vector<Real> true_lambda_real,
102 std::vector<Real> true_lambda_imag,
108 #ifdef LIBMESH_USE_REAL_NUMBERS 119 const unsigned N = A.
m();
126 for (
unsigned eigenval=0; eigenval<N; ++eigenval)
129 if (std::abs(lambda_imag(eigenval)) < tol*tol)
133 for (
unsigned i=0; i<N; ++i)
135 rhs(i) = lambda_real(eigenval) * VL(i, eigenval);
136 for (
unsigned j=0; j<N; ++j)
137 lhs(i) += A(j, i) * VL(j, eigenval);
143 LIBMESH_ASSERT_FP_EQUAL(0., lhs.l2_norm(), std::sqrt(tol)*tol);
160 for (
unsigned i=0; i<N; ++i)
162 rhs(i) = lambda_real(eigenval) * VL(i, eigenval) + lambda_imag(eigenval) * VL(i, eigenval+1);
163 for (
unsigned j=0; j<N; ++j)
164 lhs(i) += A(j, i) * VL(j, eigenval);
168 LIBMESH_ASSERT_FP_EQUAL(0., lhs.l2_norm(), std::sqrt(tol)*tol);
179 for (
unsigned i=0; i<N; ++i)
181 rhs(i) = -lambda_imag(eigenval) * VL(i, eigenval) + lambda_real(eigenval) * VL(i, eigenval+1);
182 for (
unsigned j=0; j<N; ++j)
183 lhs(i) += A(j, i) * VL(j, eigenval+1);
187 LIBMESH_ASSERT_FP_EQUAL(0., lhs.l2_norm(), std::sqrt(tol)*tol);
207 for (
unsigned eigenval=0; eigenval<N; ++eigenval)
210 if (std::abs(lambda_imag(eigenval)) < tol*tol)
214 for (
unsigned i=0; i<N; ++i)
216 rhs(i) = lambda_real(eigenval) * VR(i, eigenval);
217 for (
unsigned j=0; j<N; ++j)
218 lhs(i) += A(i, j) * VR(j, eigenval);
222 LIBMESH_ASSERT_FP_EQUAL(0., lhs.l2_norm(), std::sqrt(tol)*tol);
239 for (
unsigned i=0; i<N; ++i)
241 rhs(i) = lambda_real(eigenval) * VR(i, eigenval) - lambda_imag(eigenval) * VR(i, eigenval+1);
242 for (
unsigned j=0; j<N; ++j)
243 lhs(i) += A(i, j) * VR(j, eigenval);
247 LIBMESH_ASSERT_FP_EQUAL(0., lhs.l2_norm(), std::sqrt(tol)*tol);
252 for (
unsigned i=0; i<N; ++i)
254 rhs(i) = lambda_imag(eigenval) * VR(i, eigenval) + lambda_real(eigenval) * VR(i, eigenval+1);
255 for (
unsigned j=0; j<N; ++j)
256 lhs(i) += A(i, j) * VR(j, eigenval+1);
260 LIBMESH_ASSERT_FP_EQUAL(0., lhs.l2_norm(), std::sqrt(tol)*tol);
274 std::sort(true_lambda_real.begin(), true_lambda_real.end());
275 std::sort(true_lambda_imag.begin(), true_lambda_imag.end());
278 for (
unsigned i=0; i<lambda_real.
size(); ++i)
285 LIBMESH_ASSERT_FP_EQUAL(true_lambda_real[i], lambda_real(i), std::sqrt(tol)*tol);
286 LIBMESH_ASSERT_FP_EQUAL(true_lambda_imag[i], lambda_imag(i), std::sqrt(tol)*tol);
298 A(0,0) = -149; A(0,1) = -50; A(0,2) = -154;
299 A(1,0) = 537; A(1,1) = 180; A(1,2) = 546;
300 A(2,0) = -27; A(2,1) = -9; A(2,2) = -25;
302 std::vector<Real> true_lambda_real(3);
303 true_lambda_real[0] = 1.;
304 true_lambda_real[1] = 2.;
305 true_lambda_real[2] = 3.;
306 std::vector<Real> true_lambda_imag(3);
309 testEVD_helper(A, true_lambda_real, true_lambda_imag,
TOLERANCE);
319 A(0,0) = 0; A(0,1) = -6; A(0,2) = -1;
320 A(1,0) = 6; A(1,1) = 2; A(1,2) = -16;
321 A(2,0) = -5; A(2,1) = 20; A(2,2) = -10;
323 std::vector<Real> true_lambda_real(3);
324 true_lambda_real[0] = -3.070950351248293;
325 true_lambda_real[1] = -2.464524824375853;
326 true_lambda_real[2] = -2.464524824375853;
327 std::vector<Real> true_lambda_imag(3);
328 true_lambda_imag[0] = 0.;
329 true_lambda_imag[1] = 17.60083096447099;
330 true_lambda_imag[2] = -17.60083096447099;
337 testEVD_helper(A, true_lambda_real, true_lambda_imag, tol);
342 #ifdef LIBMESH_USE_COMPLEX_NUMBERS 347 A(0,0) =
Complex(2.18904,4.44523e-18); A(0,1) =
Complex(-3.20491,-0.136699); A(0,2) =
Complex(0.716316,-0.964802);
348 A(1,0) =
Complex(-3.20491,0.136699); A(1,1) =
Complex(4.70076,-3.25261e-18); A(1,2) =
Complex(-0.98849,1.45727);
349 A(2,0) =
Complex(0.716316,0.964802); A(2,1) =
Complex(-0.98849,-1.45727); A(2,2) =
Complex(0.659629,-4.01155e-18);
355 true_sigma(0) = 7.54942516052;
356 true_sigma(1) = 3.17479511368e-06;
357 true_sigma(2) = 6.64680908281e-07;
359 for (
unsigned i=0; i<sigma.
size(); ++i)
360 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 virtual void zero() override final
Set every element in the vector to 0.
static constexpr Real TOLERANCE
std::vector< T > & get_values()
void evd_left_and_right(DenseVector< T > &lambda_real, DenseVector< T > &lambda_imag, DenseMatrix< T > &VL, DenseMatrix< T > &VR)
Compute the eigenvalues (both real and imaginary parts) as well as the left and right eigenvectors of...
The libMesh namespace provides an interface to certain functionality in the library.
void outer_product(const DenseVector< T > &a, const DenseVector< T > &b)
Computes the outer (dyadic) product of two vectors and stores in (*this).
void svd(DenseVector< Real > &sigma)
Compute the singular value decomposition of the matrix.
CPPUNIT_TEST_SUITE_REGISTRATION(DenseMatrixTest)
void testEVD_helper(DenseMatrix< Real > &A, std::vector< Real > true_lambda_real, std::vector< Real > true_lambda_imag, Real tol)
std::complex< Real > Complex
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
virtual unsigned int size() const override final
Defines a dense vector for use in Finite Element-type computations.
DenseMatrix sub_matrix(unsigned int row_id, unsigned int row_size, unsigned int col_id, unsigned int col_size) const
Get submatrix with the smallest row and column indices and the submatrix size.