AMDiS 2.11-git
The Adaptive Multi-Dimensional Simulation Toolbox
 
Loading...
Searching...
No Matches
SolverConfig.hpp
1#pragma once
2
3#include <string>
4
5#if HAVE_SUITESPARSE_UMFPACK
6#include <Eigen/UmfPackSupport>
7#endif
8
9#include <unsupported/Eigen/IterativeSolvers>
10
11#include <amdis/Initfile.hpp>
12
13namespace AMDiS
14{
15 template <class Solver>
17 {
18 template <class D>
19 static void init(std::string const& prefix, Eigen::IterativeSolverBase<D>& solver)
20 {
21 using RealScalar = typename Eigen::IterativeSolverBase<D>::RealScalar;
22 auto rtol = Parameters::get<RealScalar>(prefix + "->relative tolerance");
23 if (rtol)
24 solver.setTolerance(rtol.value());
25
26 int maxIter = 500;
27 Parameters::get(prefix + "->max iteration", maxIter);
28 solver.setMaxIterations(maxIter);
29 }
30
31 // fall-back default implementation
32 template <class D>
33 static void init(std::string const&, Eigen::SparseSolverBase<D>&) {}
34 };
35
36 template <class M, class P>
37 struct SolverConfig<Eigen::GMRES<M,P>>
38 {
39 using Base = Eigen::IterativeSolverBase<Eigen::GMRES<M,P>>;
40
41 static void init(std::string const& prefix, Eigen::GMRES<M,P>& solver)
42 {
43 SolverConfig<Base>::init(prefix, solver);
44
45 auto restart = Parameters::get<int>(prefix + "->restart");
46 if (restart)
47 solver.set_restart(restart.value());
48 }
49 };
50
51 template <class M, class P>
52 struct SolverConfig<Eigen::DGMRES<M,P>>
53 {
54 using Base = Eigen::IterativeSolverBase<Eigen::DGMRES<M,P>>;
55
56 static void init(std::string const& prefix, Eigen::DGMRES<M,P>& solver)
57 {
58 SolverConfig<Base>::init(prefix, solver);
59
60 auto restart = Parameters::get<int>(prefix + "->restart");
61 if (restart)
62 solver.set_restart(restart.value());
63
64 // number of eigenvalues to deflate at each restart
65 auto neigs = Parameters::get<int>(prefix + "->num eigenvalues");
66 if (neigs)
67 solver.setEigenv(neigs.value());
68
69 // maximum size of the deflation subspace
70 auto maxNeig = Parameters::get<int>(prefix + "->max num eigenvalues");
71 if (maxNeig)
72 solver.setMaxEigenv(maxNeig.value());
73 }
74 };
75
76#if HAVE_SUITESPARSE_UMFPACK
77 template <class M>
78 struct SolverConfig<Eigen::UmfPackLU<M>>
79 {
80 static void init(std::string const& prefix, Eigen::UmfPackLU<M>& solver)
81 {
82 [[maybe_unused]] auto& control = solver.umfpackControl();
83 // TODO: initialized umfpack parameters
84 }
85 };
86#endif
87
88} // end namespace AMDiS
static std::optional< T > get(std::string const &key)
Get parameter-values from parameter-tree.
Definition Initfile.hpp:31
Definition SolverConfig.hpp:17