AMDiS  0.3
The Adaptive Multi-Dimensional Simulation Toolbox
DirectRunner.hpp
1 #pragma once
2 
3 #include <algorithm>
4 #include <string>
5 
6 #include <amdis/linearalgebra/RunnerInterface.hpp>
7 #include <amdis/linearalgebra/SolverInfo.hpp>
8 #include <amdis/linearalgebra/eigen/SolverConfig.hpp>
9 
10 namespace AMDiS
11 {
17  template <class Mat, class Vec, template <class> class Solver>
19  : public RunnerInterface<Mat,Vec>
20  {
21  using M = typename Mat::BaseMatrix;
22  using X = typename Vec::BaseVector;
23  using Y = typename Vec::BaseVector;
24 
25  protected:
26  using EigenSolver = Solver<M>;
27 
28  public:
30  DirectRunner(std::string const& prefix)
31  : solver_{}
32  {
33  SolverConfig<EigenSolver>::init(prefix, solver_);
34  Parameters::get(prefix + "->reuse pattern", reusePattern_);
35  }
36 
38  void init(M const& A) override
39  {
40  if (!reusePattern_ || !initialized_) {
41  solver_.analyzePattern(A);
42  initialized_ = true;
43  }
44  solver_.factorize(A);
45 
46  test_exit(solver_.info() == Eigen::Success,
47  "Error in solver.compute(matrix)");
48  }
49 
51  void exit() override
52  {
53  initialized_ = false;
54  }
55 
57  int solve(M const& A, X& x, Y const& b, SolverInfo& solverInfo)
58  {
59  x = solver_.solve(b);
60 
61  Y r = b;
62  if (x.norm() != 0)
63  r -= A * x;
64 
65  solverInfo.setAbsResidual(r.norm());
66  solverInfo.setError(solver_.info());
67 
68  return solver_.info() == Eigen::Success ? 0 : 1;
69  }
70 
71  private:
72  EigenSolver solver_;
73  bool reusePattern_ = false;
74  bool initialized_ = false;
75  };
76 }
DirectRunner(std::string const &prefix)
Constructor.
Definition: DirectRunner.hpp:30
void setAbsResidual(double r)
Sets absResidual_.
Definition: SolverInfo.hpp:80
Contains all classes needed for solving linear and non linear equation systems.
Definition: AdaptBase.hpp:6
Definition: DirectRunner.hpp:18
void init(M const &A) override
Implements RunnerInterface::init()
Definition: DirectRunner.hpp:38
static std::optional< T > get(std::string const &key)
Get parameter-values from parameter-tree.
Definition: Initfile.hpp:25
int solve(M const &A, X &x, Y const &b, SolverInfo &solverInfo)
Implements RunnerInterface::solve()
Definition: DirectRunner.hpp:57
void exit() override
Implements RunnerInterface::exit()
Definition: DirectRunner.hpp:51
void setError(int e)
Sets error_.
Definition: SolverInfo.hpp:98
Definition: SolverInfo.hpp:11
Definition: SolverConfig.hpp:13
void test_exit(bool condition, std::string const &str, Args &&... args)
test for condition and in case of failure print message and exit
Definition: Output.hpp:163
Interface for Runner / Worker types used in solver classes.
Definition: RunnerInterface.hpp:11