Reference documentation for deal.II version 9.3.3
\(\newcommand{\dealvcentcolon}{\mathrel{\mathop{:}}}\) \(\newcommand{\dealcoloneq}{\dealvcentcolon\mathrel{\mkern-1.2mu}=}\) \(\newcommand{\jump}[1]{\left[\!\left[ #1 \right]\!\right]}\) \(\newcommand{\average}[1]{\left\{\!\left\{ #1 \right\}\!\right\}}\)
precondition_selector.h
Go to the documentation of this file.
1// ---------------------------------------------------------------------
2//
3// Copyright (C) 1999 - 2020 by the deal.II authors
4//
5// This file is part of the deal.II library.
6//
7// The deal.II library is free software; you can use it, redistribute
8// it, and/or modify it under the terms of the GNU Lesser General
9// Public License as published by the Free Software Foundation; either
10// version 2.1 of the License, or (at your option) any later version.
11// The full text of the license can be found in the file LICENSE.md at
12// the top level directory of deal.II.
13//
14// ---------------------------------------------------------------------
15
16#ifndef dealii_precondition_selector_h
17#define dealii_precondition_selector_h
18
19
20#include <deal.II/base/config.h>
21
24
25#include <string>
26
28
29// Forward declarations
30#ifndef DOXYGEN
31template <class number>
32class Vector;
33template <class number>
34class SparseMatrix;
35#endif
36
37
98template <typename MatrixType = SparseMatrix<double>,
99 typename VectorType = ::Vector<double>>
101{
102public:
107
112 PreconditionSelector(const std::string & preconditioning,
113 const typename VectorType::value_type &omega = 1.);
114
118 virtual ~PreconditionSelector() override;
119
124 void
125 use_matrix(const MatrixType &M);
126
132 m() const;
133
139 n() const;
140
145 virtual void
146 vmult(VectorType &dst, const VectorType &src) const;
147
152 virtual void
153 Tvmult(VectorType &dst, const VectorType &src) const;
154
165 static std::string
167
178
180protected:
184 std::string preconditioning;
185
186private:
193
197 const typename VectorType::value_type omega;
198};
199
201/* --------------------- Inline and template functions ------------------- */
202
203
204template <typename MatrixType, typename VectorType>
206 const std::string & preconditioning,
207 const typename VectorType::value_type &omega)
208 : preconditioning(preconditioning)
209 , omega(omega)
210{}
211
212
213template <typename MatrixType, typename VectorType>
215{
216 // release the matrix A
217 A = nullptr;
218}
219
220
221template <typename MatrixType, typename VectorType>
222void
224{
225 A = &M;
226}
227
228
229template <typename MatrixType, typename VectorType>
232{
233 Assert(A != nullptr, ExcNoMatrixGivenToUse());
234 return A->m();
235}
236
237
238template <typename MatrixType, typename VectorType>
241{
242 Assert(A != nullptr, ExcNoMatrixGivenToUse());
243 return A->n();
244}
245
246
247
248template <typename MatrixType, typename VectorType>
249void
251 const VectorType &src) const
252{
253 if (preconditioning == "none")
254 {
255 dst = src;
256 }
257 else
258 {
259 Assert(A != nullptr, ExcNoMatrixGivenToUse());
260
261 if (preconditioning == "jacobi")
262 {
263 A->precondition_Jacobi(dst, src, omega);
264 }
265 else if (preconditioning == "sor")
266 {
267 A->precondition_SOR(dst, src, omega);
268 }
269 else if (preconditioning == "ssor")
270 {
271 A->precondition_SSOR(dst, src, omega);
272 }
273 else
274 Assert(false, ExcNotImplemented());
275 }
276}
277
278
279template <typename MatrixType, typename VectorType>
280void
282 VectorType & dst,
283 const VectorType &src) const
284{
285 if (preconditioning == "none")
286 {
287 dst = src;
288 }
289 else
290 {
291 Assert(A != nullptr, ExcNoMatrixGivenToUse());
292
293 if (preconditioning == "jacobi")
294 {
295 A->precondition_Jacobi(dst, src, omega); // Symmetric operation
296 }
297 else if (preconditioning == "sor")
298 {
299 A->precondition_TSOR(dst, src, omega);
300 }
301 else if (preconditioning == "ssor")
302 {
303 A->precondition_SSOR(dst, src, omega); // Symmetric operation
304 }
305 else
306 Assert(false, ExcNotImplemented());
307 }
308}
309
310
311template <typename MatrixType, typename VectorType>
312std::string
314{
315 return "none|jacobi|sor|ssor";
316}
317
318
320
321#endif
Definition: vector.h:110
#define DEAL_II_NAMESPACE_OPEN
Definition: config.h:402
#define DEAL_II_NAMESPACE_CLOSE
Definition: config.h:403
static ::ExceptionBase & ExcNoMatrixGivenToUse()
#define DeclException0(Exception0)
Definition: exceptions.h:470
static ::ExceptionBase & ExcNotImplemented()
const VectorType::value_type omega
#define Assert(cond, exc)
Definition: exceptions.h:1465
SmartPointer< const MatrixType, PreconditionSelector< MatrixType, VectorType > > A
virtual void vmult(VectorType &dst, const VectorType &src) const
virtual void Tvmult(VectorType &dst, const VectorType &src) const
typename MatrixType::size_type size_type
static std::string get_precondition_names()
void use_matrix(const MatrixType &M)
virtual ~PreconditionSelector() override
PreconditionSelector(const std::string &preconditioning, const typename VectorType::value_type &omega=1.)
static const char A
types::global_dof_index size_type
Definition: cuda_kernels.h:45