FDMJacobiSolver3.hpp
Go to the documentation of this file.
1 // This code is based on Jet framework.
2 // Copyright (c) 2018 Doyub Kim
3 // CubbyFlow is voxel-based fluid simulation engine for computer games.
4 // Copyright (c) 2020 CubbyFlow Team
5 // Core Part: Chris Ohk, Junwoo Hwang, Jihong Sin, Seungwoo Yoo
6 // AI Part: Dongheon Cho, Minseo Kim
7 // We are making my contributions/submissions to this project solely in our
8 // personal capacity and are not conveying any rights to any intellectual
9 // property of any third parties.
10 
11 #ifndef CUBBYFLOW_FDM_JACOBI_SOLVER3_HPP
12 #define CUBBYFLOW_FDM_JACOBI_SOLVER3_HPP
13 
15 
16 namespace CubbyFlow
17 {
20 {
21  public:
23  FDMJacobiSolver3(unsigned int maxNumberOfIterations,
24  unsigned int residualCheckInterval, double tolerance);
25 
27  bool Solve(FDMLinearSystem3* system) override;
28 
30  bool SolveCompressed(FDMCompressedLinearSystem3* system) override;
31 
33  [[nodiscard]] unsigned int GetMaxNumberOfIterations() const;
34 
36  [[nodiscard]] unsigned int GetLastNumberOfIterations() const;
37 
39  [[nodiscard]] double GetTolerance() const;
40 
42  [[nodiscard]] double GetLastResidual() const;
43 
45  static void Relax(const FDMMatrix3& A, const FDMVector3& b, FDMVector3* x,
46  FDMVector3* xTemp);
47 
49  static void Relax(const MatrixCSRD& A, const VectorND& b, VectorND* x,
50  VectorND* xTemp);
51 
52  private:
53  void ClearUncompressedVectors();
54  void ClearCompressedVectors();
55 
56  // Uncompressed vectors
57  FDMVector3 m_xTemp;
58  FDMVector3 m_residual;
59 
60  // Compressed vectors
61  VectorND m_xTempComp;
62  VectorND m_residualComp;
63 
64  unsigned int m_maxNumberOfIterations;
65  unsigned int m_lastNumberOfIterations;
66  unsigned int m_residualCheckInterval;
67  double m_tolerance;
68  double m_lastResidual;
69 };
70 
72 using FDMJacobiSolver3Ptr = std::shared_ptr<FDMJacobiSolver3>;
73 } // namespace CubbyFlow
74 
75 #endif
Abstract base class for 3-D finite difference-type linear system solver.
Definition: FDMLinearSystemSolver3.hpp:19
double GetTolerance() const
Returns the max residual tolerance for the Jacobi method.
unsigned int GetLastNumberOfIterations() const
Returns the last number of Jacobi iterations the solver made.
static void Relax(const FDMMatrix3 &A, const FDMVector3 &b, FDMVector3 *x, FDMVector3 *xTemp)
Performs single Jacobi relaxation step.
FDMJacobiSolver3(unsigned int maxNumberOfIterations, unsigned int residualCheckInterval, double tolerance)
Constructs the solver with given parameters.
Definition: pybind11Utils.hpp:20
Definition: Array-Impl.hpp:19
bool SolveCompressed(FDMCompressedLinearSystem3 *system) override
Solves the given compressed linear system.
std::shared_ptr< FDMJacobiSolver3 > FDMJacobiSolver3Ptr
Shared pointer type for the FDMJacobiSolver3.
Definition: FDMJacobiSolver3.hpp:72
double GetLastResidual() const
Returns the last residual after the Jacobi iterations.
unsigned int GetMaxNumberOfIterations() const
Returns the max number of Jacobi iterations.
bool Solve(FDMLinearSystem3 *system) override
Solves the given linear system.
3-D finite difference-type linear system solver using Jacobi method.
Definition: FDMJacobiSolver3.hpp:19
Compressed linear system (Ax=b) for 3-D finite differencing.
Definition: FDMLinearSystem3.hpp:62
Linear system (Ax=b) for 3-D finite differencing.
Definition: FDMLinearSystem3.hpp:43