16 #ifndef dealii_sparse_direct_h 17 #define dealii_sparse_direct_h 30 #ifdef DEAL_II_WITH_UMFPACK 42 #ifdef SuiteSparse_long 45 using suitesparse_index =
long int;
148 template <
class Matrix>
150 factorize(
const Matrix &
matrix);
155 template <
class Matrix>
157 initialize(
const Matrix & matrix,
259 solve(
Vector<std::complex<double>> &rhs_and_solution,
273 solve(
BlockVector<std::complex<double>> &rhs_and_solution,
282 template <
class Matrix>
284 solve(
const Matrix & matrix,
291 template <
class Matrix>
293 solve(
const Matrix & matrix,
294 Vector<std::complex<double>> &rhs_and_solution,
300 template <
class Matrix>
302 solve(
const Matrix & matrix,
309 template <
class Matrix>
311 solve(
const Matrix & matrix,
312 BlockVector<std::complex<double>> &rhs_and_solution,
328 <<
"UMFPACK routine " << arg1 <<
" returned error status " << arg2 <<
"." 330 << (
"A complete list of error codes can be found in the file " 331 "<bundled/umfpack/UMFPACK/Include/umfpack.h>." 333 "That said, the two most common errors that can happen are " 334 "that your matrix cannot be factorized because it is " 335 "rank deficient, and that UMFPACK runs out of memory " 336 "because your problem is too large." 338 "The first of these cases most often happens if you " 339 "forget terms in your bilinear form necessary to ensure " 340 "that the matrix has full rank, or if your equation has a " 341 "spatially variable coefficient (or nonlinearity) that is " 342 "supposed to be strictly positive but, for whatever " 343 "reasons, is negative or zero. In either case, you probably " 344 "want to check your assembly procedure. Similarly, a " 345 "matrix can be rank deficient if you forgot to apply the " 346 "appropriate boundary conditions. For example, the " 347 "Laplace equation for a problem where only Neumann boundary " 348 "conditions are posed (or where you forget to apply Dirichlet " 349 "boundary conditions) has exactly one eigenvalue equal to zero " 350 "and its rank is therefore deficient by one. Finally, the matrix " 351 "may be rank deficient because you are using a quadrature " 352 "formula with too few quadrature points." 354 "The other common situation is that you run out of memory. " 355 "On a typical laptop or desktop, it should easily be possible " 356 "to solve problems with 100,000 unknowns in 2d. If you are " 357 "solving problems with many more unknowns than that, in " 358 "particular if you are in 3d, then you may be running out " 359 "of memory and you will need to consider iterative " 360 "solvers instead of the direct solver employed by " 395 template <
typename number>
399 template <
typename number>
403 template <
typename number>
418 std::vector<types::suitesparse_index>
Ap;
419 std::vector<types::suitesparse_index>
Ai;
420 std::vector<double>
Ax;
421 std::vector<double>
Az;
431 #endif // dealii_sparse_direct_h
void * symbolic_decomposition
#define DeclException2(Exception2, type1, type2, outsequence)
long int suitesparse_index
Contents is actually a matrix.
std::vector< types::suitesparse_index > Ai
#define DEAL_II_NAMESPACE_CLOSE
void * numeric_decomposition
std::vector< double > control
unsigned int global_dof_index
#define DEAL_II_NAMESPACE_OPEN
std::vector< types::suitesparse_index > Ap