DUNE-ACFEM (2.5.1)

solverselector.hh
1 #ifndef __DUNE_ACFEM_SOLVER_SELECTOR_HH__
2 #define __DUNE_ACFEM_SOLVER_SELECTOR_HH__
3 
4 // include linear operators
5 #include <dune/fem/operator/linear/istloperator.hh>
6 #include <dune/fem/solver/istlsolver.hh>
7 #include <dune/fem/operator/linear/petscoperator.hh>
8 #include <dune/fem/solver/petscsolver.hh>
9 #include <dune/fem/operator/linear/spoperator.hh>
10 #include <dune/fem/solver/cginverseoperator.hh>
11 
12 #include "../models/modelinterface.hh"
13 
14 #ifndef HAVE_PETSC
15 # define HAVE_PETSC false
16 #endif
17 #ifndef WANT_PETSC
18 # define WANT_PETSC false
19 #endif
20 #ifndef HAVE_DUNE_ISTL
21 # define HAVE_DUNE_ISTL false
22 #endif
23 #ifndef WANT_ISTL
24 # define WANT_ISTL false
25 #endif
26 
27 namespace Dune {
28 
29  namespace ACFem {
30 
38  struct SolverFamily
39  {
40  enum Family {
41  PETSC,
42  ISTL,
43  FEM
44  };
45  enum SolverType {
46  CG,
47  MINRES,
48  BICGSTAB,
49  GMRES
50  };
51  static const Family family =
52  ((HAVE_DUNE_ISTL && WANT_ISTL)
53  ? ISTL
54  : ((HAVE_PETSC && WANT_PETSC)
55  ? PETSC
56  : FEM));
57  };
58 
88  template<class DiscreteFunctionType, class OperatorParts, SolverFamily::Family family = SolverFamily::family>
90  {
92 
93  static_assert(family != SolverFamily::FEM ||
95  "No non-linear or indefinite problems with bare Dune::Fem CG solver");
96 
97  template<SolverFamily::Family fam, bool dummy = false>
98  struct OperatorSelector;
99 
100 #if HAVE_DUNE_ISTL && WANT_ISTL
101  template<bool dummy>
102  struct OperatorSelector<SolverFamily::ISTL, dummy>
103  {
104  typedef
105  Fem::ISTLLinearOperator<DiscreteFunctionType, DiscreteFunctionType>
106  LinearOperatorType;
107 
108  // Choose PCG if symmetric and semi-definite, otherwise MINRES
109  // if symmetric, otherwise BICGSTAB (should we use GMRES?)
110  typedef
111  typename std::conditional<
113  typename std::conditional<
115  Fem::ISTLCGOp<DiscreteFunctionType, LinearOperatorType>,
116  Fem::ISTLMINResOp<DiscreteFunctionType, LinearOperatorType> >::type,
117  Fem::ISTLGMResOp<DiscreteFunctionType, LinearOperatorType>
118  /*Fem::ISTLBICGSTABOp<DiscreteFunctionType, LinearOperatorType>*/ >::type
119  LinearInverseOperatorType;
120  };
121 #endif
122 
123 #if HAVE_PETSC && WANT_PETSC
124  template<bool dummy>
125  struct OperatorSelector<SolverFamily::PETSC, dummy>
126  {
127  typedef
128  Fem::PetscLinearOperator<DiscreteFunctionType, DiscreteFunctionType>
129  LinearOperatorType;
130 
131  // The PETSC inverse operator is configured at run-time.
132  typedef
133  Fem::PetscInverseOperator<DiscreteFunctionType, LinearOperatorType>
134  LinearInverseOperatorType;
135  };
136 #endif
137 
138  template<bool dummy>
139  struct OperatorSelector<SolverFamily::FEM, dummy>
140  {
141  typedef
142  Fem::SparseRowLinearOperator<DiscreteFunctionType, DiscreteFunctionType>
143  LinearOperatorType;
144  typedef
145  Fem::CGInverseOperator<DiscreteFunctionType>
146  LinearInverseOperatorType;
147  };
148 
149  typedef typename OperatorSelector<family>::LinearOperatorType LinearOperatorType;
150  typedef typename OperatorSelector<family>::LinearInverseOperatorType LinearInverseOperatorType;
151  };
152 
154 
155  } // ACFEM::
156 
157 } // Dune::
158 
159 
160 #endif // __DUNE_ACFEM_SOLVER_SELECTOR_HH__
Interface class for second order elliptic models.
Definition: operatorparts.hh:92
@ isSymmetric
Define to true for the symmetric case.
Definition: operatorparts.hh:120
@ isSemiDefinite
Define to true for the non-indefinite case (non trivial kernel is allowed).
Definition: operatorparts.hh:121
Define some symbolic constants for SolverSelector and "parse" some preprocessort defines.
Definition: solverselector.hh:39
Select one appropriate (linear) solver depending on whether the model is symmetric and/or semidefinit...
Definition: solverselector.hh:90
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.80.0 (May 15, 22:30, 2024)