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)