10#include <kernel/solver/adp_solver_base.hpp>
12#if defined(FEAT_HAVE_SUPERLU_DIST) || defined(DOXYGEN)
27 typedef double SLUDataType;
31#ifdef FEAT_TPL_SUPERLU_INT64
32 typedef std::int64_t SLUIndexType;
34 typedef int SLUIndexType;
62 void* create_core(
const void* comm, Index num_global_dofs, Index dof_offset, Index num_owned_dofs, Index num_nonzeros);
65 void destroy_core(
void* core);
67 SLUIndexType* get_row_ptr(
void* core);
68 SLUIndexType* get_col_idx(
void* core);
69 SLUDataType* get_mat_val(
void* core);
70 SLUDataType* get_vector(
void* core);
72 void init_symbolic(
void* core);
73 int init_numeric(
void* core);
74 void done_numeric(
void* core);
79 int solve(
void* core);
96 template<
typename Matrix_,
typename Filter_>
114 explicit SuperLU(
const Matrix_& matrix,
const Filter_& filter) :
128 XASSERT(this->_core ==
nullptr);
131 this->_core = SuperLU_Aux::create_core(
146 SuperLU_Aux::init_symbolic(this->_core);
151 XASSERT(this->_core !=
nullptr);
153 SuperLU_Aux::destroy_core(this->_core);
154 this->_core =
nullptr;
161 XASSERT(this->_core !=
nullptr);
166 SuperLU_Aux::get_row_ptr(this->_core), SuperLU_Aux::get_col_idx(this->_core));
169 const int info = SuperLU_Aux::init_numeric(this->_core);
173 XASSERTM(info >= 0,
"SuperLU: illegal argument in init_numeric()");
186 XASSERT(this->_core !=
nullptr);
188 SuperLU_Aux::done_numeric(this->_core);
196 this->
_upload_vector(SuperLU_Aux::get_vector(this->_core), vec_def.local());
199 int info = SuperLU_Aux::solve(this->_core);
202 XASSERTM(info == 0,
"SuperLU: solve returned non-zero info value");
205 this->
_download_vector(vec_cor.local(), SuperLU_Aux::get_vector(this->_core));
224 template<
typename Matrix_,
typename Filter_>
225 std::shared_ptr<SuperLU<Matrix_, Filter_>>
new_superlu(
const Matrix_& matrix,
const Filter_& filter)
228 return std::make_shared<SuperLU<Matrix_, Filter_>>(matrix, filter);
230 XABORT(
"new_superlu: SuperLU solver is only available in MPI builds")
#define XASSERT(expr)
Assertion macro definition.
#define XASSERTM(expr, msg)
Assertion macro definition with custom message.
Base-Class for solvers based on Algebraic-DOF-Partitioning.
const Dist::Comm * _get_comm() const
void _upload_symbolic(RPT_ *row_ptr, CIT_ *col_idx)
Uploads the ADP matrix structure to the given arrays.
Index _get_num_owned_dofs() const
Index _get_global_dof_offset() const
void _download_vector(LocalVectorType &vector, const DTV_ *val)
Downloads the ADP vector values from the given array.
void _upload_vector(DTV_ *val, const LocalVectorType &vector)
Uploads the ADP vector values to the given array.
Index _get_num_global_dofs() const
Index _get_adp_matrix_num_nzes() const
void _upload_numeric(DTV_ *val, const RPT_ *row_ptr, const CIT_ *col_idx)
Uploads the (filtered) ADP matrix values to the given array.
Singular Matrix exception.
virtual void init_symbolic()
Symbolic initialization method.
virtual void init_numeric()
Numeric initialization method.
virtual void done_symbolic()
Symbolic finalization method.
virtual void done_numeric()
Numeric finalization method.
Base-class for solver generated exceptions.
(distributed) SuperLU direct sparse solver
virtual void done_symbolic() override
Symbolic finalization method.
virtual String name() const override
Returns a descriptive string.
Matrix_::VectorTypeL VectorType
our vector type
virtual void init_symbolic() override
Symbolic initialization method.
SuperLU(const Matrix_ &matrix, const Filter_ &filter)
Constructor.
ADPSolverBase< Matrix_, Filter_ > BaseClass
our base class
virtual void init_numeric() override
Numeric initialization method.
void * _core
a pointer to our opaque SuperLU core object
virtual void done_numeric() override
Numeric finalization method.
String class implementation.
Status
Solver status return codes enumeration.
@ success
solving successful (convergence criterion fulfilled)
std::shared_ptr< SuperLU< Matrix_, Filter_ > > new_superlu(const Matrix_ &matrix, const Filter_ &filter)
Creates a new SuperLU solver object.
Status solve(SolverBase< Vector_ > &solver, Vector_ &vec_sol, const Vector_ &vec_rhs, const Matrix_ &matrix, const Filter_ &filter)
Solve linear system with initial solution guess.