29 #ifndef __SolverEigen_H
30 #define __SolverEigen_H 1
32 #include <boost/tuple/tuple.hpp>
33 #include <boost/parameter.hpp>
34 #include <feel/feelcore/parameter.hpp>
36 #include <feel/feelalg/enums.hpp>
37 #include <feel/feelcore/traits.hpp>
38 #include <feel/feelalg/vector.hpp>
60 typedef typename type_traits<T>::real_type real_type;
63 typedef boost::shared_ptr<solvereigen_type> solvereigen_ptrtype;
65 typedef boost::tuple<size_type, size_type, std::vector<double> > solve_return_type;
69 typedef boost::shared_ptr<vector_type> vector_ptrtype;
71 typedef boost::shared_ptr<sparse_matrix_type> sparse_matrix_ptrtype;
73 typedef boost::tuple<real_type, real_type, vector_ptrtype> eigenpair_type;
74 typedef std::map<real_type, eigenpair_type> eigenmodes_type;
118 static boost::shared_ptr<SolverEigen<value_type> >
build(
const SolverPackage solver_package = SOLVERS_SLEPC );
126 static boost::shared_ptr<SolverEigen<value_type> >
build( po::variables_map
const& vm,
127 std::string
const&
prefix = std::string() );
133 virtual eigenpair_type
eigenPair (
unsigned int i ) = 0;
138 virtual eigenmodes_type eigenModes () = 0;
321 virtual void init () = 0;
324 BOOST_PARAMETER_MEMBER_FUNCTION( ( solve_return_type ),
328 ( matrixA,( sparse_matrix_ptrtype ) )
329 ( matrixB,( sparse_matrix_ptrtype ) ) )
347 virtual solve_return_type
solve ( MatrixSparse<value_type> &matrix_A,
351 const unsigned int m_its ) = 0;
362 const unsigned int m_its )
364 return this->
solve( *matrix_A, nev, ncv, tol, m_its );
378 const unsigned int m_its ) = 0;
390 const unsigned int m_its )
392 return this->
solve( *matrix_A, *matrix_B, nev, ncv, tol, m_its );
462 BOOST_PARAMETER_MEMBER_FUNCTION( (
typename SolverEigen<double>::eigenmodes_type ),
466 ( matrixA,( d_sparse_matrix_ptrtype ) )
467 ( matrixB,( d_sparse_matrix_ptrtype ) ) )
477 ( tolerance,(
double ), 1e-11 )
478 ( verbose,(
bool ),
false )
482 typedef boost::shared_ptr<Vector<double> > vector_ptrtype;
485 eigen->setEigenSolverType( solver );
486 eigen->setEigenProblemType(
problem );
487 eigen->setPositionOfSpectrum( spectrum );
488 eigen->setNumberOfEigenValues( nev );
489 eigen->setNumberOfEigenValuesConverged( ncv );
490 eigen->setMaxIterations( maxit );
491 eigen->setSpectralTransform( transform );
492 eigen->setTolerance( tolerance );
494 LOG(INFO) <<
"number of eigen values = " << nev <<
"\n";
495 LOG(INFO) <<
"number of eigen values converged = " << ncv <<
"\n";
496 LOG(INFO) <<
"number of eigen value solver iterations = " << maxit <<
"\n";
497 LOG(INFO) <<
"eigenvalue tolerance = " << tolerance <<
"\n";
499 unsigned int nconv, nits;
500 std::vector<double> err( ncv );
501 boost::tie( nconv, nits, err ) = eigen->solve( _matrixA=matrixA,
504 _tolerance=tolerance );
508 std::for_each( err.begin(), err.end(), [](
double e )
510 std::cout <<
"||A x - lambda B x ||/||x|| = " << e <<
"\n";
514 return eigen->eigenModes();