MoCSI API Reference
Loading...
Searching...
No Matches
TridiagonalMatrixSolver.h
Go to the documentation of this file.
1#ifndef TRIDIAGONAL_MATRIX_SOLVER_H
2#define TRIDIAGONAL_MATRIX_SOLVER_H
3
4#include <functional>
5#include <memory>
6#include <valarray>
7#include <vector>
8
9#include "GenericSolver.h"
10#include "SimulationClassBase.h"
11
15template <typename T>
17{
18 private:
19 std::vector<std::reference_wrapper<T>> m_lower_sub_diag_matrix_elements{};
20 std::vector<std::reference_wrapper<T>> m_diag_matrix_elements{};
21 std::vector<std::reference_wrapper<T>> m_upper_sub_diag_matrix_elements{};
22 // sub-diagonals are 1 elem smaller than diagonal, but all arrays are expected to be of same
23 // size. The reference for this extra filler element is set to this unused element.
24 T m_unused_element{0};
25
26 void getReferenceToElements();
27
28 public:
30 std::shared_ptr<MatrixManager<T>> matrix_manager_ptr);
31 void solveMatrixSystem(std::string_view field_name) override;
32};
33
41template <typename T>
48
54template <typename T>
56{
57 std::pair<int, int> mat_size{this->m_matrix_manager->lhs_matrix->size()};
58 for (int i{0}; i < mat_size.first; i++)
59 {
60 if (i < mat_size.first - 1)
61 {
62 try
63 {
64 m_lower_sub_diag_matrix_elements.emplace_back(
65 (*(this->m_matrix_manager->lhs_matrix))(i + 1, i));
66 }
68 {
69 m_lower_sub_diag_matrix_elements.emplace_back(m_unused_element);
70 }
71
72 try
73 {
74 m_upper_sub_diag_matrix_elements.emplace_back(
75 (*(this->m_matrix_manager->lhs_matrix))(i, i + 1));
76 }
78 {
79 m_upper_sub_diag_matrix_elements.emplace_back(m_unused_element);
80 }
81 }
82 m_diag_matrix_elements.emplace_back((*(this->m_matrix_manager->lhs_matrix))(i, i));
83 }
84}
85
94template <typename T>
96{
97 // This is needed for CSR matrices
98 if (m_lower_sub_diag_matrix_elements.empty())
99 {
100 getReferenceToElements();
101 }
102 std::string key{field_name};
103 std::valarray<T>& solution{this->sim->m_field_map[key]};
104 const int dim = (this->m_matrix_manager->lhs_matrix->size()).first;
105 std::valarray<double> work_arr_1(dim);
106 std::valarray<double> work_arr_2(dim);
107 work_arr_1[0] = m_upper_sub_diag_matrix_elements[0] / m_diag_matrix_elements[0];
108 work_arr_2[0] = this->m_matrix_manager->rhs_vector[0] / m_diag_matrix_elements[0];
109 double denominator{0};
110 for (int i = 1; i < dim - 1; i++)
111 {
113 m_diag_matrix_elements[i] - m_lower_sub_diag_matrix_elements[i - 1] * work_arr_1[i - 1];
114 work_arr_1[i] = m_upper_sub_diag_matrix_elements[i] / denominator;
115 work_arr_2[i] = (this->m_matrix_manager->rhs_vector[i]
116 - m_lower_sub_diag_matrix_elements[i - 1] * work_arr_2[i - 1])
117 / denominator;
118 }
119 denominator = m_diag_matrix_elements[dim - 1]
120 - m_lower_sub_diag_matrix_elements[dim - 2] * work_arr_1[dim - 2];
121 solution[dim - 1] = (this->m_matrix_manager->rhs_vector[dim - 1]
122 - m_lower_sub_diag_matrix_elements[dim - 2] * work_arr_2[dim - 2])
123 / denominator;
124 for (int i = dim - 2; i > -1; i--)
125 {
126 solution[i] = work_arr_2[i] - work_arr_1[i] * solution[i + 1];
127 }
128}
129
130#endif
Concrete implementation of a matrix class representing a Compressed Sparse Rows (CSR) matrix....
Definition CsrMatrix.h:37
CsrSparseMatrix()
Constructor for an empty CsrSparseMatrix object. Leaves all storage arrays empty but sets the flag to...
Definition CsrMatrix.h:94
std::pair< int, int > size() const
Function that returns the size of the matrix as a pair in (rows, columns) format.
Definition GenericMatrix.h:120
Definition GenericSolver.h:12
Error class to be thrown when a zero element is tried to be accessed as a reference.
Definition CsrMatrix.h:17
Implementation of the Tridiagonal Matrix Algorithm (TDMA) to solve 1D cases.
Definition TridiagonalMatrixSolver.h:17
void solveMatrixSystem(std::string_view field_name) override
Standard serialized implementation of the TDMA. Solves a tridiagonal linear system of equations in O(...
Definition TridiagonalMatrixSolver.h:95
TridiagonalMatrixSolver(SimulationClassBase< T > *sim_ptr, std::shared_ptr< MatrixManager< T > > matrix_manager_ptr)
Constructor of the TDMA algorithm implementation.
Definition TridiagonalMatrixSolver.h:42