5 #include <Eigen/IterativeLinearSolvers> 6 #include <Eigen/MetisSupport> 7 #include <Eigen/SparseLU> 8 #include <Eigen/SuperLUSupport> 9 #include <Eigen/UmfPackSupport> 10 #include <unsupported/Eigen/IterativeSolvers> 12 #include <amdis/CreatorMap.hpp> 13 #include <amdis/Initfile.hpp> 14 #include <amdis/Output.hpp> 16 #include <amdis/linearalgebra/LinearSolver.hpp> 17 #include <amdis/linearalgebra/eigen/DirectRunner.hpp> 18 #include <amdis/linearalgebra/eigen/IterativeRunner.hpp> 19 #include <amdis/linearalgebra/eigen/Traits.hpp> 23 template <
class Mat,
class Vec,
template <
class>
class IterativeSolver>
27 template <
class Precon>
32 using M =
typename Mat::BaseMatrix;
33 using Scalar =
typename M::Scalar;
38 std::string precon =
"no";
41 if (precon ==
"diag" ||
44 auto creator = SolverCreator<Eigen::DiagonalPreconditioner<Scalar>>{};
45 return creator.createWithString(prefix);
47 else if (precon ==
"ilu")
49 auto creator = SolverCreator<Eigen::IncompleteLUT<Scalar>>{};
50 return creator.createWithString(prefix);
52 else if (precon ==
"ic")
54 return createIncompleteCholesky(prefix);
57 auto creator = SolverCreator<Eigen::IdentityPreconditioner>{};
58 return creator.createWithString(prefix);
63 template <
class Ordering>
64 using IncompleteCholesky =
65 SolverCreator<Eigen::IncompleteCholesky<Scalar, Eigen::Lower|Eigen::Upper, Ordering>>;
67 std::unique_ptr<SolverBase> createIncompleteCholesky(std::string prefix)
const 69 std::string ordering =
"amd";
72 if (ordering ==
"amd") {
73 using AMD = Eigen::AMDOrdering<typename M::StorageIndex>;
74 return IncompleteCholesky<AMD>{}.createWithString(prefix);
77 using NATURAL = Eigen::NaturalOrdering<typename M::StorageIndex>;
78 return IncompleteCholesky<NATURAL>{}.createWithString(prefix);
94 template <
class Mat,
class Vec>
98 using M =
typename Mat::BaseMatrix;
100 template <
template <
class>
class IterativeSolver>
104 template <
template <
class>
class DirectSolver>
107 template <
class M,
class V>
111 template <
template <
class>
class DirectSolver>
112 using DirectSolverCreator
116 template <
class Precon>
117 using CG = Eigen::ConjugateGradient<M, Eigen::Lower|Eigen::Upper, Precon>;
119 template <
class Precon>
120 using BCGS = Eigen::BiCGSTAB<M, Precon>;
122 template <
class Precon>
123 using MINRES = Eigen::MINRES<M, Eigen::Lower|Eigen::Upper, Precon>;
125 template <
class Precon>
126 using GMRES = Eigen::GMRES<M, Precon>;
128 template <
class Precon>
129 using DGMRES = Eigen::DGMRES<M, Precon>;
139 Map::addCreator(
"cg", cg);
143 Map::addCreator(
"bicgstab", bicgstab);
144 Map::addCreator(
"bcgs", bicgstab);
148 Map::addCreator(
"minres", minres);
152 Map::addCreator(
"gmres", gmres);
156 Map::addCreator(
"dgmres", dgmres);
159 Map::addCreator(
"default", gmres);
161 init_direct(std::is_same<
typename Dune::FieldTraits<typename M::Scalar>::real_type,
double>{});
164 static void init_direct(std::false_type) {}
165 static void init_direct(std::true_type)
167 #if HAVE_SUITESPARSE_UMFPACK 169 auto umfpack =
new DirectSolverCreator<Eigen::UmfPackLU>;
170 Map::addCreator(
"umfpack", umfpack);
175 auto superlu =
new DirectSolverCreator<Eigen::SuperLU>;
176 Map::addCreator(
"superlu", superlu);
180 #if HAVE_SUITESPARSE_UMFPACK 181 Map::addCreator(
"direct", umfpack);
183 Map::addCreator(
"direct", superlu);
Interface for creators with name.
Definition: CreatorInterface.hpp:42
A CreatorMap is used to construct objects, which types depends on key words determined at run time...
Definition: CreatorMap.hpp:29
Contains all classes needed for solving linear and non linear equation systems.
Definition: AdaptBase.hpp:6
Definition: DirectRunner.hpp:18
static std::optional< T > get(std::string const &key)
Get parameter-values from parameter-tree.
Definition: Initfile.hpp:25
Abstract base class for linear solvers.
Definition: LinearSolverInterface.hpp:27
Wrapper class for various solvers. These solvers are parametrized by MatrixType and VectorType...
Definition: LinearSolver.hpp:25
Definition: CreatorMap.hpp:16
std::unique_ptr< SolverBase > createWithString(std::string prefix) override
Must be implemented by sub classes of CreatorInterfaceName. Creates a new instance of the sub class o...
Definition: SolverCreator.hpp:35
Default solver creator for iterative solvers.
Definition: SolverCreator.hpp:24
void init(int &argc, char **&argv, std::string const &initFileName="")
Initialized the Environment for MPI.
Definition: AMDiS.hpp:29