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 std::vector<std::reference_wrapper<T>> m_rhs_vector_elements{};
23
24 void getReferenceToElements();
25
26 public:
28 std::shared_ptr<MatrixManager<T>> matrix_manager_ptr);
29 void solveMatrixSystem(std::string_view field_name) override;
30};
31
37template <typename T>
44
50template <typename T>
52{
53 std::pair<int, int> mat_size{this->m_matrix_manager->lhs_matrix->size()};
54 for (int i{0}; i < mat_size.first; i++)
55 {
56 if (i < mat_size.first - 1)
57 {
58 m_lower_sub_diag_matrix_elements.emplace_back(
59 (*(this->m_matrix_manager->lhs_matrix))(i + 1, i));
60 m_upper_sub_diag_matrix_elements.emplace_back(
61 (*(this->m_matrix_manager->lhs_matrix))(i, i + 1));
62 }
63 m_diag_matrix_elements.emplace_back((*(this->m_matrix_manager->lhs_matrix))(i, i));
64 m_rhs_vector_elements.emplace_back(this->m_matrix_manager->rhs_vector[i]);
65 }
66}
67
72template <typename T>
74{
75 std::string key{field_name};
76 std::valarray<T>& solution{this->sim->m_field_map[key]};
77 const int n = (this->m_matrix_manager->lhs_matrix->size()).first;
78 std::valarray<double> work_arr_1(n);
79 std::valarray<double> work_arr_2(n);
80 work_arr_1[0] = m_upper_sub_diag_matrix_elements[0] / m_diag_matrix_elements[0];
81 work_arr_2[0] = m_rhs_vector_elements[0] / m_diag_matrix_elements[0];
82 double denominator{0};
83 for (int i = 1; i < n - 1; i++)
84 {
86 m_diag_matrix_elements[i] - m_lower_sub_diag_matrix_elements[i - 1] * work_arr_1[i - 1];
87 work_arr_1[i] = m_upper_sub_diag_matrix_elements[i] / denominator;
88 work_arr_2[i] =
89 (m_rhs_vector_elements[i] - m_lower_sub_diag_matrix_elements[i - 1] * work_arr_2[i - 1])
91 /*if( std::isnan(work_arr_1[i]) || std::isnan(work_arr_2[i]))
92 {
93 std::cout << "NAN: " << i << " " << denominator << " " << work_arr_1[i] << " " <<
94 work_arr_2[i] << "\n";
95 }*/
96 }
98 m_diag_matrix_elements[n - 1] - m_lower_sub_diag_matrix_elements[n - 2] * work_arr_1[n - 2];
99 solution[n - 1] =
100 (m_rhs_vector_elements[n - 1] - m_lower_sub_diag_matrix_elements[n - 2] * work_arr_2[n - 2])
101 / denominator;
102 for (int i = n - 2; i > -1; i--)
103 {
104 solution[i] = work_arr_2[i] - work_arr_1[i] * solution[i + 1];
105 }
106}
107
108#endif
Error class to throw when a module chain has circular or missing dependencies. Inherits from std::exc...
Definition ChainManager.h:28
Definition GenericSolver.h:12
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:73
TridiagonalMatrixSolver(SimulationClassBase< T > *sim_ptr, std::shared_ptr< MatrixManager< T > > matrix_manager_ptr)
Constructor of the TDMA algorithm implementation.
Definition TridiagonalMatrixSolver.h:38