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();
SpectralTransformType
Definition: feelalg/enums.hpp:207
std::string M_prefix
Definition: solvereigen.hpp:404
SolverPackage
Definition: feelalg/enums.hpp:217
size_type numberOfEigenvaluesConverged() const
Definition: solvereigen.hpp:204
virtual void clear()
Definition: solvereigen.hpp:316
Definition: solverlinear.hpp:33
SpectralTransformType spectralTransform() const
Definition: solvereigen.hpp:188
PositionOfSpectrum
Definition: feelalg/enums.hpp:194
void setNumberOfEigenValuesConverged(size_type ncv)
Definition: solvereigen.hpp:293
void setNumberOfEigenValues(size_type nev)
Definition: solvereigen.hpp:285
EigenSolverType
Definition: feelalg/enums.hpp:157
void setPositionOfSpectrum(PositionOfSpectrum pos)
Definition: solvereigen.hpp:251
void setMaxIterations(size_type maxiter)
Definition: solvereigen.hpp:277
base class for eigen solvers
Definition: solvereigen.hpp:50
EigenProblemType
Definition: feelalg/enums.hpp:179
bool initialized() const
Definition: solvereigen.hpp:308
size_type maxIterations() const
Definition: solvereigen.hpp:220
Optimization problem specifications.
Definition: problem.hpp:283
value_type tolerance() const
Definition: solvereigen.hpp:212
void setEigenProblemType(EigenProblemType ept)
Definition: solvereigen.hpp:243
EigenSolverType eigenSolverType() const
Definition: solvereigen.hpp:164
EigenProblemType eigenProblemType() const
Definition: solvereigen.hpp:172
virtual ~SolverEigen()
Definition: solvereigen.cpp:105
solve_return_type solve(boost::shared_ptr< MatrixSparse< value_type > > &matrix_A, int nev, int ncv, const double tol, const unsigned int m_its)
Definition: solvereigen.hpp:358
virtual solve_return_type solve(MatrixSparse< value_type > &matrix_A, int nev, int ncv, const double tol, const unsigned int m_its)=0
SolverEigen()
Definition: solvereigen.cpp:65
static boost::shared_ptr< SolverEigen< value_type > > build(const SolverPackage solver_package=SOLVERS_SLEPC)
Definition: solvereigen.cpp:111
void setEigenSolverType(const EigenSolverType est)
Definition: solvereigen.hpp:235
size_type M_ncv
number of eigenvalues
Definition: solvereigen.hpp:435
size_type M_maxit
max number of iterations
Definition: solvereigen.hpp:438
size_type numberOfEigenvalues() const
Definition: solvereigen.hpp:196
PositionOfSpectrum M_position_of_spectrum
Definition: solvereigen.hpp:419
solve_return_type solve(boost::shared_ptr< MatrixSparse< value_type > > &matrix_A, boost::shared_ptr< MatrixSparse< value_type > > &matrix_B, int nev, int ncv, const double tol, const unsigned int m_its)
Definition: solvereigen.hpp:385
size_t size_type
Indices (starting from 0)
Definition: feelcore/feel.hpp:319
value_type M_tolerance
tolerance
Definition: solvereigen.hpp:441
SpectralTransformType M_spectral_transform
Definition: solvereigen.hpp:424
void setSpectralTransform(SpectralTransformType st)
Definition: solvereigen.hpp:259
Definition: matrixsparse.hpp:76
void setTolerance(value_type tol)
Definition: solvereigen.hpp:268
virtual eigenpair_type eigenPair(unsigned int i)=0
size_type M_nev
number of eigenvalues
Definition: solvereigen.hpp:432
bool M_is_initialized
Definition: solvereigen.hpp:429
std::string const & prefix() const
Definition: solvereigen.hpp:156
EigenSolverType M_eigen_solver_type
Definition: solvereigen.hpp:409
EigenProblemType M_eigen_problem_type
Definition: solvereigen.hpp:414
BackendType
Definition: feelalg/enums.hpp:77
PositionOfSpectrum postitionOfSpectrum() const
Definition: solvereigen.hpp:180