diff --git a/MathLib/LinAlg/Eigen/EigenLinearSolver.cpp b/MathLib/LinAlg/Eigen/EigenLinearSolver.cpp index 1f0c394355fe60bba38875674a9e2e4f6b07b775..26d0b2c431c6355e2d2ceb01b486ab3978ef2c57 100644 --- a/MathLib/LinAlg/Eigen/EigenLinearSolver.cpp +++ b/MathLib/LinAlg/Eigen/EigenLinearSolver.cpp @@ -388,6 +388,9 @@ std::unique_ptr<EigenLinearSolverBase> createIterativeSolver( case EigenOption::PreconType::DIAGONAL: return createIterativeSolver< Solver, Eigen::DiagonalPreconditioner<double>>(); + case EigenOption::PreconType::LeastSquareDIAGONAL: + return createIterativeSolver< + Solver, Eigen::LeastSquareDiagonalPreconditioner<double>>(); case EigenOption::PreconType::ILUT: // TODO for this preconditioner further options can be passed. // see @@ -429,6 +432,11 @@ std::unique_ptr<EigenLinearSolverBase> createIterativeSolver( { return createIterativeSolver<EigenCGSolver>(precon_type); } + case EigenOption::SolverType::LeastSquareCG: + { + return createIterativeSolver<Eigen::LeastSquaresConjugateGradient>( + precon_type); + } case EigenOption::SolverType::GMRES: { #ifdef USE_EIGEN_UNSUPPORTED @@ -493,6 +501,7 @@ EigenLinearSolver::EigenLinearSolver(std::string const& /*solver_name*/, case EigenOption::SolverType::BiCGSTAB: case EigenOption::SolverType::BiCGSTABL: case EigenOption::SolverType::CG: + case EigenOption::SolverType::LeastSquareCG: case EigenOption::SolverType::GMRES: case EigenOption::SolverType::IDRS: case EigenOption::SolverType::IDRSTABL: diff --git a/MathLib/LinAlg/Eigen/EigenOption.cpp b/MathLib/LinAlg/Eigen/EigenOption.cpp index b9df0ff226ace71eb98ea7d1eb4a5b82b7092eaa..07b11082bffb88ec04189ebedbc4577f79d287c1 100644 --- a/MathLib/LinAlg/Eigen/EigenOption.cpp +++ b/MathLib/LinAlg/Eigen/EigenOption.cpp @@ -38,6 +38,10 @@ EigenOption::SolverType EigenOption::getSolverType( { return SolverType::CG; } + if (solver_name == "LeastSquareCG") + { + return SolverType::LeastSquareCG; + } if (solver_name == "BiCGSTAB") { return SolverType::BiCGSTAB; @@ -81,6 +85,10 @@ EigenOption::PreconType EigenOption::getPreconType( { return PreconType::DIAGONAL; } + if (precon_name == "LeastSquareDIAGONAL") + { + return PreconType::LeastSquareDIAGONAL; + } if (precon_name == "ILUT") { return PreconType::ILUT; @@ -95,6 +103,8 @@ std::string EigenOption::getSolverName(SolverType const solver_type) { case SolverType::CG: return "CG"; + case SolverType::LeastSquareCG: + return "LeastSquareCG"; case SolverType::BiCGSTAB: return "BiCGSTAB"; case SolverType::BiCGSTABL: @@ -121,6 +131,8 @@ std::string EigenOption::getPreconName(PreconType const precon_type) return "NONE"; case PreconType::DIAGONAL: return "DIAGONAL"; + case PreconType::LeastSquareDIAGONAL: + return "LeastSquareDIAGONAL"; case PreconType::ILUT: return "ILUT"; } diff --git a/MathLib/LinAlg/Eigen/EigenOption.h b/MathLib/LinAlg/Eigen/EigenOption.h index 54815c948b92818850031565d9b59dc20e1c1741..217d69eae31e94ca97a8514c7eb2efb17c2428cf 100644 --- a/MathLib/LinAlg/Eigen/EigenOption.h +++ b/MathLib/LinAlg/Eigen/EigenOption.h @@ -21,6 +21,7 @@ struct EigenOption final enum class SolverType : short { CG, + LeastSquareCG, BiCGSTAB, BiCGSTABL, IDRS, @@ -35,6 +36,7 @@ struct EigenOption final { NONE, DIAGONAL, + LeastSquareDIAGONAL, ILUT };