Page MenuHomec4science

sparse_bicgstab.hpp
No OneTemporary

File Metadata

Created
Wed, Nov 6, 12:14

sparse_bicgstab.hpp

#ifndef SPECMICP_SPARSESOLVERS_SPARSEBICGSTAB_HPP
#define SPECMICP_SPARSESOLVERS_SPARSEBICGSTAB_HPP
#include "sparse_solver_structs.hpp"
#include "sparse_solver_base.hpp"
#include <Eigen/IterativeLinearSolvers>
namespace specmicp {
namespace sparse_solvers {
template <class MatrixT, class DerivedR, class DerivedS>
class SparseSolverBiCGSTAB: public SparseSolverBase<MatrixT, DerivedR, DerivedS>
{
using SolverT = Eigen::BiCGSTAB<MatrixT, Eigen::IncompleteLUT<typename MatrixT::Scalar>>;
public:
//! \brief Decompose the jacboian
SparseSolverReturnCode decompose(MatrixT& jacobian)
{
m_solver.compute(jacobian);
if (m_solver.info() != Eigen::Success)
{
return SparseSolverReturnCode::FailedDecomposition;
}
return SparseSolverReturnCode::Success;
}
//! \brief Solve the problem
SparseSolverReturnCode solve(
const DerivedR& residuals,
DerivedS& solution
)
{
solution = m_solver.solve(-residuals);
if (m_solver.info() != Eigen::Success)
{
return SparseSolverReturnCode::FailedSystemSolving;
}
return SparseSolverReturnCode::Success;
}
SparseSolverReturnCode solve_scaling(
const DerivedR& residuals,
const DerivedR& scaling,
DerivedS& solution
)
{
solution = m_solver.solve(scaling.asDiagonal()*(-residuals));
if (m_solver.info() != Eigen::Success)
{
return SparseSolverReturnCode::FailedSystemSolving;
}
return SparseSolverReturnCode::Success;
}
private:
SolverT m_solver;
};
} // end namespace sparse_solvers
} // end namespace specmicp
#endif //SPECMICP_SPARSESOLVERS_SPARSEBICGSTAB_HPP

Event Timeline