FEAT 3
Finite Element Analysis Toolbox
Loading...
Searching...
No Matches
superlu.hpp
1// FEAT3: Finite Element Analysis Toolbox, Version 3
2// Copyright (C) 2010 by Stefan Turek & the FEAT group
3// FEAT3 is released under the GNU General Public License version 3,
4// see the file 'copyright.txt' in the top level directory for details.
5
6#pragma once
7
8// includes, FEAT
10#include <kernel/solver/adp_solver_base.hpp>
11
12#if defined(FEAT_HAVE_SUPERLU_DIST) || defined(DOXYGEN)
13
14namespace FEAT
15{
16 namespace Solver
17 {
19
24 namespace SuperLU_Aux
25 {
27 typedef double SLUDataType;
28
31#ifdef FEAT_TPL_SUPERLU_INT64
32 typedef std::int64_t SLUIndexType;
33#else
34 typedef int SLUIndexType;
35#endif
36
62 void* create_core(const void* comm, Index num_global_dofs, Index dof_offset, Index num_owned_dofs, Index num_nonzeros);
63
65 void destroy_core(void* core);
66
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);
71
72 void init_symbolic(void* core);
73 int init_numeric(void* core);
74 void done_numeric(void* core);
75
79 int solve(void* core);
80 } // namespace SuperLU_Aux
82
96 template<typename Matrix_, typename Filter_>
97 class SuperLU :
98 public ADPSolverBase<Matrix_, Filter_>
99 {
100 public:
104 typedef typename Matrix_::VectorTypeL VectorType;
105
106 protected:
108 void* _core;
109
110 public:
114 explicit SuperLU(const Matrix_& matrix, const Filter_& filter) :
115 BaseClass(matrix, filter),
116 _core(nullptr)
117 {
118 }
119
120 virtual String name() const override
121 {
122 return "SuperLU";
123 }
124
125 virtual void init_symbolic() override
126 {
128 XASSERT(this->_core == nullptr);
129
130 // create our core wrapper object
131 this->_core = SuperLU_Aux::create_core(
132#ifdef FEAT_HAVE_MPI
133 &this->_get_comm()->mpi_comm(),
134#else
135 nullptr, // no communicator for non-MPI builds
136#endif
137 this->_get_num_global_dofs(),
139 this->_get_num_owned_dofs(),
141
142 // upload matrix structure
143 BaseClass::_upload_symbolic(SuperLU_Aux::get_row_ptr(this->_core), SuperLU_Aux::get_col_idx(this->_core));
144
145 // initialize
146 SuperLU_Aux::init_symbolic(this->_core);
147 }
148
149 virtual void done_symbolic() override
150 {
151 XASSERT(this->_core != nullptr);
152
153 SuperLU_Aux::destroy_core(this->_core);
154 this->_core = nullptr;
155
157 }
158
159 virtual void init_numeric() override
160 {
161 XASSERT(this->_core != nullptr);
163
164 // upload matrix values
165 this->_upload_numeric(SuperLU_Aux::get_mat_val(this->_core),
166 SuperLU_Aux::get_row_ptr(this->_core), SuperLU_Aux::get_col_idx(this->_core));
167
168 // set the new matrix values
169 const int info = SuperLU_Aux::init_numeric(this->_core);
170
171 // info = 0 means success
172 // info < 0 means illegal argument; this should never happen
173 XASSERTM(info >= 0, "SuperLU: illegal argument in init_numeric()");
174 if(0 < info)
175 {
176 // 0 < info < N: zero pivot = singular matrix
177 if(info <= int(this->_get_num_global_dofs()))
178 throw SingularMatrixException("SuperLU: singular matrix");
179 else // info > N: out of memory
180 throw SolverException("SuperLU: out of memory");
181 }
182 }
183
184 virtual void done_numeric() override
185 {
186 XASSERT(this->_core != nullptr);
187
188 SuperLU_Aux::done_numeric(this->_core);
189
191 }
192
193 virtual Status apply(VectorType& vec_cor, const VectorType& vec_def) override
194 {
195 // upload defect vector into internal correction vector
196 this->_upload_vector(SuperLU_Aux::get_vector(this->_core), vec_def.local());
197
198 // solve
199 int info = SuperLU_Aux::solve(this->_core);
200
201 // info != 0 means something went wrong, but this should never happen here...
202 XASSERTM(info == 0, "SuperLU: solve returned non-zero info value");
203
204 // download solution into correction vector
205 this->_download_vector(vec_cor.local(), SuperLU_Aux::get_vector(this->_core));
206
207 // okay
208 return Status::success;
209 }
210 }; // class SuperLU
211
224 template<typename Matrix_, typename Filter_>
225 std::shared_ptr<SuperLU<Matrix_, Filter_>> new_superlu(const Matrix_& matrix, const Filter_& filter)
226 {
227#ifdef FEAT_HAVE_MPI
228 return std::make_shared<SuperLU<Matrix_, Filter_>>(matrix, filter);
229#else
230 XABORT("new_superlu: SuperLU solver is only available in MPI builds")
231#endif
232 }
233 } // namespace Solver
234} // namespace FEAT
235
236#endif // defined(FEAT_HAVE_SUPERLU_DIST) || defined(DOXYGEN)
#define XASSERT(expr)
Assertion macro definition.
Definition: assertion.hpp:262
#define XASSERTM(expr, msg)
Assertion macro definition with custom message.
Definition: assertion.hpp:263
FEAT Kernel base header.
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.
Definition: base.hpp:159
virtual void init_symbolic()
Symbolic initialization method.
Definition: base.hpp:227
virtual void init_numeric()
Numeric initialization method.
Definition: base.hpp:237
virtual void done_symbolic()
Symbolic finalization method.
Definition: base.hpp:255
virtual void done_numeric()
Numeric finalization method.
Definition: base.hpp:246
Base-class for solver generated exceptions.
Definition: base.hpp:127
(distributed) SuperLU direct sparse solver
Definition: superlu.hpp:99
virtual void done_symbolic() override
Symbolic finalization method.
Definition: superlu.hpp:149
virtual String name() const override
Returns a descriptive string.
Definition: superlu.hpp:120
Matrix_::VectorTypeL VectorType
our vector type
Definition: superlu.hpp:104
virtual void init_symbolic() override
Symbolic initialization method.
Definition: superlu.hpp:125
SuperLU(const Matrix_ &matrix, const Filter_ &filter)
Constructor.
Definition: superlu.hpp:114
ADPSolverBase< Matrix_, Filter_ > BaseClass
our base class
Definition: superlu.hpp:102
virtual void init_numeric() override
Numeric initialization method.
Definition: superlu.hpp:159
void * _core
a pointer to our opaque SuperLU core object
Definition: superlu.hpp:108
virtual void done_numeric() override
Numeric finalization method.
Definition: superlu.hpp:184
String class implementation.
Definition: string.hpp:47
Status
Solver status return codes enumeration.
Definition: base.hpp:47
@ 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.
Definition: superlu.hpp:225
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.
Definition: base.hpp:347
FEAT namespace.
Definition: adjactor.hpp:12