30#ifndef SPARSEMATSUPERLU_HPP
31#define SPARSEMATSUPERLU_HPP
33#include "../SparseMat.hpp"
34#include "../csc_form.hpp"
36#include <superlu-mt/superlu-mt.h>
39 SuperMatrix A{}, L{}, U{}, B{};
41#ifndef SUANPAN_SUPERLUMT
42 superlu_options_t options{};
46 const int ordering_num = 1;
52 std::vector<int> t_row, t_col, perm_r, perm_c;
54 bool allocated =
false;
61 template<sp_d ET>
void wrap_b(
const Mat<ET>&);
63 int solve_trs(Mat<T>&, Mat<T>&&);
82#ifndef SUANPAN_SUPERLUMT
83 set_default_options(&options);
84 options.IterRefine = std::is_same_v<T, float> ? superlu::IterRefine_t::SLU_SINGLE : superlu::IterRefine_t::SLU_DOUBLE;
85 options.Equil = superlu::yes_no_t::NO;
89 StatAlloc(
static_cast<int>(this->n_cols),
SUANPAN_NUM_THREADS, sp_ienv(1), sp_ienv(2), &stat);
93 this->factored =
false;
99 t_row = std::vector<int>(in.row_mem(), in.row_mem() + in.n_elem);
100 t_col = std::vector<int>(in.col_mem(), in.col_mem() + in.n_cols + 1);
101 t_val = std::vector<ET>(in.val_mem(), in.val_mem() + in.n_elem);
103 if constexpr(std::is_same_v<ET, double>) dCreate_CompCol_Matrix(&
A, in.n_rows, in.n_cols, in.n_elem, t_val.data(), t_row.data(), t_col.data(), Stype_t::SLU_NC, Dtype_t::SLU_D, Mtype_t::SLU_GE);
104 else sCreate_CompCol_Matrix(&
A, in.n_rows, in.n_cols, in.n_elem, t_val.data(), t_row.data(), t_col.data(), Stype_t::SLU_NC, Dtype_t::SLU_S, Mtype_t::SLU_GE);
106 perm_r.resize(this->n_rows + 1);
107 perm_c.resize(this->n_cols + 1);
113 if(!allocated)
return;
115 Destroy_SuperMatrix_Store(&
A);
116#ifdef SUANPAN_SUPERLUMT
117 Destroy_SuperNode_SCP(&L);
118 Destroy_CompCol_NCP(&
U);
120 Destroy_SuperNode_Matrix(&L);
121 Destroy_CompCol_Matrix(&
U);
128 if constexpr(std::is_same_v<ET, float>) sCreate_Dense_Matrix(&B, (
int)in_mat.n_rows, (int)in_mat.n_cols, (ET*)in_mat.memptr(), (int)in_mat.n_rows, Stype_t::SLU_DN, Dtype_t::SLU_S, Mtype_t::SLU_GE);
129 else dCreate_Dense_Matrix(&B, (
int)in_mat.n_rows, (
int)in_mat.n_cols, (ET*)in_mat.memptr(), (
int)in_mat.n_rows, Stype_t::SLU_DN, Dtype_t::SLU_D, Mtype_t::SLU_GE);
133 :
SparseMat<T>(in_row, in_col, in_elem) { init_config(); }
146 if(this->factored)
return solve_trs(out_mat, std::move(in_mat));
148 this->factored =
true;
156#ifdef SUANPAN_SUPERLUMT
157 get_perm_c(ordering_num, &
A, perm_c.data());
158 if(std::is_same_v<T, float>) psgssv(
SUANPAN_NUM_THREADS, &
A, perm_c.data(), perm_r.data(), &L, &
U, &B, &flag);
161 superlu::gssv<T>(&options, &
A, perm_c.data(), perm_r.data(), &L, &
U, &B, &stat, &flag);
164 Destroy_SuperMatrix_Store(&B);
166 out_mat = std::move(in_mat);
176#ifdef SUANPAN_SUPERLUMT
177 if(std::is_same_v<T, float>) sgstrs(NOTRANS, &L, &
U, perm_c.data(), perm_r.data(), &B, &stat, &flag);
178 else dgstrs(NOTRANS, &L, &
U, perm_c.data(), perm_r.data(), &B, &stat, &flag);
180 superlu::gstrs<T>(options.Trans, &L, &
U, perm_c.data(), perm_r.data(), &B, &stat, &flag);
183 Destroy_SuperMatrix_Store(&B);
185 out_mat = std::move(in_mat);
A SparseMat class that holds matrices.
Definition SparseMat.hpp:34
A SparseMatSuperLU class that holds matrices.
Definition SparseMatSuperLU.hpp:38
SparseMatSuperLU & operator=(const SparseMatSuperLU &)=delete
SparseMatSuperLU(SparseMatSuperLU &&)=delete
SparseMatSuperLU & operator=(SparseMatSuperLU &&)=delete
int direct_solve(Mat< T > &out_mat, const Mat< T > &in_mat) override
Definition SparseMatSuperLU.hpp:66
int SUANPAN_NUM_THREADS
Definition command.cpp:70