37 template<
typename T,
typename U> concept
ArmaContainer = std::is_floating_point_v<U> && (std::is_convertible_v<T, Mat<U>> || std::is_convertible_v<T, SpMat<U>>) ;
64 [[nodiscard]] virtual
bool is_empty() const = 0;
72 [[nodiscard]] virtual
T max() const = 0;
73 [[nodiscard]] virtual Col<
T>
diag() const = 0;
75 virtual const
T& operator()(uword, uword) const = 0;
76 virtual
T&
at(uword, uword) = 0;
78 [[nodiscard]] virtual const
T*
memptr() const = 0;
81 virtual
void operator+=(const shared_ptr<
MetaMat>&) = 0;
82 virtual
void operator-=(const shared_ptr<
MetaMat>&) = 0;
87 virtual Mat<
T> operator*(const Mat<
T>&) const = 0;
89 virtual
void operator*=(
T) = 0;
96 template<ArmaContainer<T> C> Mat<T>
solve(C&& B) {
101 template<ArmaContainer<T> C>
int solve(Mat<T>& X,
const C& B) {
106 template<ArmaContainer<T> C>
int solve(Mat<T>& X, C&& B) {
119 if(0 != this->
direct_solve(X, std::forward<C>(B))) X.reset();
130 void save(
const char*);
141 [[nodiscard]] Col<T>
evaluate(
const Col<T>&)
const;
145 : triplet_mat(in_rows, in_cols)
177 X.zeros(arma::size(B));
179 unique_ptr<Preconditioner<T>> preconditioner;
180 if(
PreconditionerType::JACOBI == this->setting.preconditioner_type) preconditioner = std::make_unique<Jacobi<T>>(this->diag());
181 #ifndef SUANPAN_SUPERLUMT
183 if(this->triplet_mat.is_empty()) preconditioner = std::make_unique<
ILU<T>>(to_triplet_form<T, int>(
this));
184 else preconditioner = std::make_unique<ILU<T>>(this->triplet_mat);
187 else if(
PreconditionerType::NONE == this->setting.preconditioner_type) preconditioner = std::make_unique<UnityPreconditioner<T>>();
191 this->setting.preconditioner = preconditioner.get();
193 std::atomic_int code = 0;
197 Col<T> sub_x(X.colptr(I), X.n_rows, false, true);
198 const Col<T> sub_b(B.colptr(I), B.n_rows);
199 auto col_setting = setting;
200 code += GMRES(this, sub_x, sub_b, col_setting);
204 Col<T> sub_x(X.colptr(I), X.n_rows, false, true);
205 const Col<T> sub_b(B.colptr(I), B.n_rows);
206 auto col_setting = setting;
207 code += BiCGSTAB(this, sub_x, sub_b, col_setting);
209 else throw invalid_argument(
"no proper iterative solver assigned but somehow iterative solving is called");
220 for(uword J = 0; J < in_mat.
n_cols; ++J)
for(uword I = 0; I < in_mat.
n_rows; ++I) out_mat(I, J) = in_mat(I, J);
227 Mat<data_t> out_mat(in_mat.
n_rows, in_mat.
n_cols, fill::zeros);
228 for(index_t I = 0; I < in_mat.
n_elem; ++I) out_mat(in_mat.
row(I), in_mat.
col(I)) += in_mat.
val(I);
233 Mat<data_t> out_mat(in_mat.
n_rows, in_mat.
n_cols, fill::zeros);
236 for(index_t I = 0; I < in_mat.
n_elem; ++I) {
237 if(I >= in_mat.
row_mem()[c_idx]) ++c_idx;
245 Mat<data_t> out_mat(in_mat.
n_rows, in_mat.
n_cols, fill::zeros);
248 for(index_t I = 0; I < in_mat.
n_elem; ++I) {
249 if(I >= in_mat.
col_mem()[c_idx]) ++c_idx;
259 const sp_i auto n_rows = index_t(in_mat->
n_rows);
260 const sp_i auto n_cols = index_t(in_mat->
n_cols);
261 const sp_i auto n_elem = index_t(in_mat->
n_elem);
264 for(index_t J = 0; J < n_cols; ++J)
for(index_t I = 0; I < n_rows; ++I) out_mat.
at(I, J) = in_mat->operator()(I, J);
A ILU class.
Definition: ILU.hpp:40
unique_ptr< MetaMat< T > > operator*(const T value, const unique_ptr< MetaMat< T >> &M)
Definition: operator_times.hpp:24
void suanpan_error(const char *M,...)
Definition: print.cpp:116
IterativeSolver iterative_solver
Definition: SolverSetting.hpp:46
constexpr auto SUANPAN_SUCCESS
Definition: suanPan.h:161
constexpr auto SUANPAN_FAIL
Definition: suanPan.h:162
concept sp_i
Definition: suanPan.h:228
void suanpan_for(const IT start, const IT end, F &&FN)
Definition: utility.h:24