| // Small bench routine for Eigen available in Eigen | 
 | // (C) Desire NUENTSA WAKAM, INRIA | 
 |  | 
 | #include <iostream> | 
 | #include <fstream> | 
 | #include <iomanip> | 
 | #include <unsupported/Eigen/SparseExtra> | 
 | #include <Eigen/SparseLU> | 
 | #include <bench/BenchTimer.h> | 
 | #ifdef EIGEN_METIS_SUPPORT | 
 | #include <Eigen/MetisSupport> | 
 | #endif | 
 |  | 
 | using namespace std; | 
 | using namespace Eigen; | 
 |  | 
 | int main(int argc, char **args) | 
 | { | 
 | //   typedef complex<double> scalar;  | 
 |   typedef double scalar;  | 
 |   SparseMatrix<scalar, ColMajor> A;  | 
 |   typedef SparseMatrix<scalar, ColMajor>::Index Index; | 
 |   typedef Matrix<scalar, Dynamic, Dynamic> DenseMatrix; | 
 |   typedef Matrix<scalar, Dynamic, 1> DenseRhs; | 
 |   Matrix<scalar, Dynamic, 1> b, x, tmp; | 
 | //   SparseLU<SparseMatrix<scalar, ColMajor>, AMDOrdering<int> >   solver; | 
 | // #ifdef EIGEN_METIS_SUPPORT | 
 | //   SparseLU<SparseMatrix<scalar, ColMajor>, MetisOrdering<int> > solver;  | 
 | //   std::cout<< "ORDERING : METIS\n";  | 
 | // #else | 
 |   SparseLU<SparseMatrix<scalar, ColMajor>, COLAMDOrdering<int> >  solver; | 
 |   std::cout<< "ORDERING : COLAMD\n";  | 
 | // #endif | 
 |    | 
 |   ifstream matrix_file;  | 
 |   string line; | 
 |   int  n; | 
 |   BenchTimer timer;  | 
 |    | 
 |   // Set parameters | 
 |   /* Fill the matrix with sparse matrix stored in Matrix-Market coordinate column-oriented format */ | 
 |   if (argc < 2) assert(false && "please, give the matrix market file "); | 
 |   loadMarket(A, args[1]); | 
 |   cout << "End charging matrix " << endl; | 
 |   bool iscomplex=false, isvector=false; | 
 |   int sym; | 
 |   getMarketHeader(args[1], sym, iscomplex, isvector); | 
 | //   if (iscomplex) { cout<< " Not for complex matrices \n"; return -1; } | 
 |   if (isvector) { cout << "The provided file is not a matrix file\n"; return -1;} | 
 |   if (sym != 0) { // symmetric matrices, only the lower part is stored | 
 |     SparseMatrix<scalar, ColMajor> temp;  | 
 |     temp = A; | 
 |     A = temp.selfadjointView<Lower>(); | 
 |   } | 
 |   n = A.cols(); | 
 |   /* Fill the right hand side */ | 
 |  | 
 |   if (argc > 2) | 
 |     loadMarketVector(b, args[2]); | 
 |   else  | 
 |   { | 
 |     b.resize(n); | 
 |     tmp.resize(n); | 
 | //       tmp.setRandom(); | 
 |     for (int i = 0; i < n; i++) tmp(i) = i;  | 
 |     b = A * tmp ; | 
 |   } | 
 |  | 
 |   /* Compute the factorization */ | 
 | //   solver.isSymmetric(true); | 
 |   timer.start();  | 
 | //   solver.compute(A); | 
 |   solver.analyzePattern(A);  | 
 |   timer.stop();  | 
 |   cout << "Time to analyze " << timer.value() << std::endl; | 
 |   timer.reset();  | 
 |   timer.start();  | 
 |   solver.factorize(A);  | 
 |   timer.stop();  | 
 |   cout << "Factorize Time " << timer.value() << std::endl; | 
 |   timer.reset();  | 
 |   timer.start();  | 
 |   x = solver.solve(b); | 
 |   timer.stop(); | 
 |   cout << "solve time " << timer.value() << std::endl;  | 
 |   /* Check the accuracy */ | 
 |   Matrix<scalar, Dynamic, 1> tmp2 = b - A*x; | 
 |   scalar tempNorm = tmp2.norm()/b.norm(); | 
 |   cout << "Relative norm of the computed solution : " << tempNorm <<"\n"; | 
 |   cout << "Number of nonzeros in the factor : " << solver.nnzL() + solver.nnzU() << std::endl;  | 
 |    | 
 |   return 0; | 
 | } |