#pragma once #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace AMDiS { template class IterativeSolver> struct IterativeSolverCreator : public CreatorInterfaceName> { template using SolverCreator = typename LinearSolver>>::Creator; using SolverBase = LinearSolverInterface; using M = typename Mat::BaseMatrix; using Scalar = typename M::Scalar; std::unique_ptr createWithString(std::string prefix) override { // get creator string for preconditioner std::string precon = "no"; Parameters::get(prefix + "->precon->name", precon); if (precon == "diag" || precon == "jacobi") { auto creator = SolverCreator>{}; return creator.createWithString(prefix); } else if (precon == "ilu") { auto creator = SolverCreator>{}; return creator.createWithString(prefix); } else if (precon == "ic") { return createIncompleteCholesky(prefix); } else { auto creator = SolverCreator{}; return creator.createWithString(prefix); } } template using IncompleteCholesky = SolverCreator>; std::unique_ptr createIncompleteCholesky(std::string prefix) const { std::string ordering = "amd"; Parameters::get(prefix + "->precon->ordering", ordering); if (ordering == "amd") { using AMD = Eigen::AMDOrdering; return IncompleteCholesky{}.createWithString(prefix); } else { using NATURAL = Eigen::NaturalOrdering; return IncompleteCholesky{}.createWithString(prefix); } } }; /// Adds default creators for linear solvers based on `Eigen::SparseMatrix`. /** * Adds creators for full-matrix aware solvers. * - *cg*: conjugate gradient method, \see Eigen::ConjugateGradient * - *bcgs*: stabilized bi-conjugate gradient method, \see Eigen::BiCGSTAB * - *minres*: Minimal Residual Algorithm (for symmetric matrices), \see Eigen::MINRES * - *gmres*: Generalized Minimal Residual Algorithm, \see Eigen::GMRES * - *dgmres*: stabilized bi-conjugate gradient method, \see Eigen::DGMRES * - *umfpack*: external UMFPACK solver, \see Eigen::UmfPackLU * - *superlu*: external SparseLU solver, \see Eigen::SparseLU **/ template class DefaultCreators< LinearSolverInterface > { using SolverBase = LinearSolverInterface; using M = typename Mat::BaseMatrix; template