MyraMath
stationary.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_STATIONARY_H
7 #define MYRAMATH_ITERATIVE_STATIONARY_H
8 
14 #include <myramath/MYRAMATH_EXPORT.h>
16 
17 #include <vector>
18 
19 namespace myra {
20 
21 // Forward declarations.
22 template<class Number> class CSparseMatrixRange;
23 template<class Number> class CVectorRange;
24 template<class Number> class VectorRange;
25 
27 template<class Precision> class MYRAMATH_EXPORT stationary_output
28  {
29  public:
30 
31  // Did the relative residual converge to requested tolerance?
32  bool converged;
33 
34  // History of relative residual, |A*x-b|/|b|
35  std::vector<Precision> history;
36 
37  // Constructs from components.
38  stationary_output(bool in_converged, const std::vector<Precision>& in_history)
39  {
40  converged = in_converged;
41  history = in_history;
42  }
43 
44  };
45 
47 MYRAMATH_EXPORT stationary_output<NumberS> jacobi(const CSparseMatrixRange<NumberS>& A, const CVectorRange<NumberS>& b, const VectorRange<NumberS>& x, NumberS tolerance = 1.0e-6f, int iterations = 100);
48 MYRAMATH_EXPORT stationary_output<NumberD> jacobi(const CSparseMatrixRange<NumberD>& A, const CVectorRange<NumberD>& b, const VectorRange<NumberD>& x, NumberD tolerance = 1.0e-6 , int iterations = 100);
49 MYRAMATH_EXPORT stationary_output<NumberS> jacobi(const CSparseMatrixRange<NumberC>& A, const CVectorRange<NumberC>& b, const VectorRange<NumberC>& x, NumberS tolerance = 1.0e-6f, int iterations = 100);
50 MYRAMATH_EXPORT stationary_output<NumberD> jacobi(const CSparseMatrixRange<NumberZ>& A, const CVectorRange<NumberZ>& b, const VectorRange<NumberZ>& x, NumberD tolerance = 1.0e-6 , int iterations = 100);
51 
53 // Note that seidel() requires the transpose At, because of how it updates unknowns in a particular order.
54 MYRAMATH_EXPORT stationary_output<NumberS> seidel(const CSparseMatrixRange<NumberS>& At, const CVectorRange<NumberS>& b, const VectorRange<NumberS>& x, NumberS tolerance = 1.0e-6f, int iterations = 100);
55 MYRAMATH_EXPORT stationary_output<NumberD> seidel(const CSparseMatrixRange<NumberD>& At, const CVectorRange<NumberD>& b, const VectorRange<NumberD>& x, NumberD tolerance = 1.0e-6 , int iterations = 100);
56 MYRAMATH_EXPORT stationary_output<NumberS> seidel(const CSparseMatrixRange<NumberC>& At, const CVectorRange<NumberC>& b, const VectorRange<NumberC>& x, NumberS tolerance = 1.0e-6f, int iterations = 100);
57 MYRAMATH_EXPORT stationary_output<NumberD> seidel(const CSparseMatrixRange<NumberZ>& At, const CVectorRange<NumberZ>& b, const VectorRange<NumberZ>& x, NumberD tolerance = 1.0e-6 , int iterations = 100);
58 
59 // Solves A*x=b using symmetric Seidel iteration. Vector x contains an initial guess on input, overwritten with the solution on output.
60 // Note that seidel() requires the transpose At, because of how it updates unknowns in a particular order.
61 MYRAMATH_EXPORT stationary_output<NumberS> sseidel(const CSparseMatrixRange<NumberS>& At, const CVectorRange<NumberS>& b, const VectorRange<NumberS>& x, NumberS tolerance = 1.0e-6f, int iterations = 100);
62 MYRAMATH_EXPORT stationary_output<NumberD> sseidel(const CSparseMatrixRange<NumberD>& At, const CVectorRange<NumberD>& b, const VectorRange<NumberD>& x, NumberD tolerance = 1.0e-6 , int iterations = 100);
63 MYRAMATH_EXPORT stationary_output<NumberS> sseidel(const CSparseMatrixRange<NumberC>& At, const CVectorRange<NumberC>& b, const VectorRange<NumberC>& x, NumberS tolerance = 1.0e-6f, int iterations = 100);
64 MYRAMATH_EXPORT stationary_output<NumberD> sseidel(const CSparseMatrixRange<NumberZ>& At, const CVectorRange<NumberZ>& b, const VectorRange<NumberZ>& x, NumberD tolerance = 1.0e-6 , int iterations = 100);
65 
67 // Note that sor() requires the transpose At, because of how it updates unknowns in a particular order.
68 // For best results, the relaxation parameter omega should probably be between 1 and 2. Note that 1 corresponds to seidel().
69 MYRAMATH_EXPORT stationary_output<NumberS> sor(const CSparseMatrixRange<NumberS>& At, const CVectorRange<NumberS>& b, const VectorRange<NumberS>& x, NumberS omega = 1.5f, NumberS tolerance = 1.0e-6f, int iterations = 100);
70 MYRAMATH_EXPORT stationary_output<NumberD> sor(const CSparseMatrixRange<NumberD>& At, const CVectorRange<NumberD>& b, const VectorRange<NumberD>& x, NumberD omega = 1.5 , NumberD tolerance = 1.0e-6 , int iterations = 100);
71 MYRAMATH_EXPORT stationary_output<NumberS> sor(const CSparseMatrixRange<NumberC>& At, const CVectorRange<NumberC>& b, const VectorRange<NumberC>& x, NumberS omega = 1.5 , NumberS tolerance = 1.0e-6f, int iterations = 100);
72 MYRAMATH_EXPORT stationary_output<NumberD> sor(const CSparseMatrixRange<NumberZ>& At, const CVectorRange<NumberZ>& b, const VectorRange<NumberZ>& x, NumberD omega = 1.5f, NumberD tolerance = 1.0e-6 , int iterations = 100);
73 
75 // Note that ssor() requires the transpose At, because of how it updates unknowns in a particular order.
76 // For best results, the relaxation parameter omega should probably be between 1 and 2. Note that 1 corresponsds to sseidel().
77 MYRAMATH_EXPORT stationary_output<NumberS> ssor(const CSparseMatrixRange<NumberS>& At, const CVectorRange<NumberS>& b, const VectorRange<NumberS>& x, NumberS omega = 1.5f, NumberS tolerance = 1.0e-6f, int iterations = 100);
78 MYRAMATH_EXPORT stationary_output<NumberD> ssor(const CSparseMatrixRange<NumberD>& At, const CVectorRange<NumberD>& b, const VectorRange<NumberD>& x, NumberD omega = 1.5 , NumberD tolerance = 1.0e-6 , int iterations = 100);
79 MYRAMATH_EXPORT stationary_output<NumberS> ssor(const CSparseMatrixRange<NumberC>& At, const CVectorRange<NumberC>& b, const VectorRange<NumberC>& x, NumberS omega = 1.5 , NumberS tolerance = 1.0e-6f, int iterations = 100);
80 MYRAMATH_EXPORT stationary_output<NumberD> ssor(const CSparseMatrixRange<NumberZ>& At, const CVectorRange<NumberZ>& b, const VectorRange<NumberZ>& x, NumberD omega = 1.5f, NumberD tolerance = 1.0e-6 , int iterations = 100);
81 
82 } // namespace
83 
84 #endif
Common return type for all these methods.
Definition: stationary.h:27
Represents a mutable VectorRange.
Definition: axpy.h:21
Definition: syntax.dox:1
Various utility functions/classes related to scalar Number types.
Represents a const SparseMatrixRange.
Definition: bothcat.h:24
Represents a const VectorRange.
Definition: axpy.h:20
float NumberS
Useful typedefs.
Definition: Number.h:21