MyraMath
pcg.h
Go to the documentation of this file.
1 // ========================================================================= //
2 // This file is part of MyraMath, copyright (c) 2014-2019 by Ryan A Chilton //
3 // and distributed by MyraCore, LLC. See LICENSE.txt for license terms. //
4 // ========================================================================= //
5 
6 #ifndef MYRAMATH_ITERATIVE_PCG_H
7 #define MYRAMATH_ITERATIVE_PCG_H
8 
23 #include <myramath/MYRAMATH_EXPORT.h>
25 
26 #include <vector>
27 
28 namespace myra {
29 
30 // Forward declarations.
31 template<class Number> class Action;
32 template<class Number> class CVectorRange;
33 template<class Number> class VectorRange;
34 template<class Number> class CMatrixRange;
35 template<class Number> class MatrixRange;
36 
38 template<class Precision> class MYRAMATH_EXPORT pcg_output
39  {
40  public:
41 
42  // Did pcg() converge?
43  bool converged;
44 
45  // History of relative residual, |A*x-b|/|b|
46  std::vector<Precision> history;
47 
48  // Constructs from components.
49  pcg_output(bool in_converged, const std::vector<Precision>& in_history)
50  {
51  converged = in_converged;
52  history = in_history;
53  }
54 
55  };
56 
58 MYRAMATH_EXPORT pcg_output<NumberS> pcg(const Action<NumberS>& M, const Action<NumberS>& A, const CVectorRange<NumberS>& b, const VectorRange<NumberS>& x, NumberS tolerance = 1.0e-4, int iterations = 50);
60 MYRAMATH_EXPORT pcg_output<NumberD> pcg(const Action<NumberD>& M, const Action<NumberD>& A, const CVectorRange<NumberD>& b, const VectorRange<NumberD>& x, NumberD tolerance = 1.0e-4, int iterations = 50);
61 MYRAMATH_EXPORT pcg_output<NumberS> pcg(const Action<NumberC>& M, const Action<NumberC>& A, const CVectorRange<NumberC>& b, const VectorRange<NumberC>& x, NumberS tolerance = 1.0e-4, int iterations = 50);
62 MYRAMATH_EXPORT pcg_output<NumberD> pcg(const Action<NumberZ>& M, const Action<NumberZ>& A, const CVectorRange<NumberZ>& b, const VectorRange<NumberZ>& x, NumberD tolerance = 1.0e-4, int iterations = 50);
64 
66 MYRAMATH_EXPORT pcg_output<NumberS> pcg(const Action<NumberS>& M, const Action<NumberS>& A, const CMatrixRange<NumberS>& B, const MatrixRange<NumberS>& X, NumberS tolerance = 1.0e-4, int iterations = 50);
68 MYRAMATH_EXPORT pcg_output<NumberD> pcg(const Action<NumberD>& M, const Action<NumberD>& A, const CMatrixRange<NumberD>& B, const MatrixRange<NumberD>& X, NumberD tolerance = 1.0e-4, int iterations = 50);
69 MYRAMATH_EXPORT pcg_output<NumberS> pcg(const Action<NumberC>& M, const Action<NumberC>& A, const CMatrixRange<NumberC>& B, const MatrixRange<NumberC>& X, NumberS tolerance = 1.0e-4, int iterations = 50);
70 MYRAMATH_EXPORT pcg_output<NumberD> pcg(const Action<NumberZ>& M, const Action<NumberZ>& A, const CMatrixRange<NumberZ>& B, const MatrixRange<NumberZ>& X, NumberD tolerance = 1.0e-4, int iterations = 50);
72 
74 // Note, uses dotu() and is suitable for complex-symmetric operands/preconditioners. Not as stable.
76 MYRAMATH_EXPORT pcg_output<NumberS> pcgu(const Action<NumberC>& M, const Action<NumberC>& A, const CVectorRange<NumberC>& b, const VectorRange<NumberC>& x, NumberS tolerance = 1.0e-4, int iterations = 50);
77 MYRAMATH_EXPORT pcg_output<NumberD> pcgu(const Action<NumberZ>& M, const Action<NumberZ>& A, const CVectorRange<NumberZ>& b, const VectorRange<NumberZ>& x, NumberD tolerance = 1.0e-4, int iterations = 50);
79 
80 } // namespace myra
81 
82 #endif
Represents a mutable VectorRange.
Definition: axpy.h:21
Return type of pcg()
Definition: pcg.h:38
Definition: syntax.dox:1
Represents a const MatrixRange.
Definition: bothcat.h:22
Various utility functions/classes related to scalar Number types.
Represents a mutable MatrixRange.
Definition: conjugate.h:26
Applies the "Action" of a linear operator, b := A*x.
Definition: Action.h:29
Represents a const VectorRange.
Definition: axpy.h:20
float NumberS
Useful typedefs.
Definition: Number.h:21