28 #define umfpack_real_symbolic umfpack_di_symbolic
29 #define umfpack_real_numeric umfpack_di_numeric
30 #define umfpack_real_solve umfpack_di_solve
32 #define umfpack_complex_symbolic umfpack_zi_symbolic
33 #define umfpack_complex_numeric umfpack_zi_numeric
34 #define umfpack_complex_solve umfpack_zi_solve
40 template<
typename Scalar>
43 Control[UMFPACK_PRL] = level;
46 template<
typename Scalar>
48 :
DirectSolver<Scalar>(m, rhs), m(m), rhs(rhs), symbolic(nullptr), numeric(nullptr)
50 umfpack_di_defaults(Control);
53 template<
typename Scalar>
59 template<
typename Scalar>
62 free_factorization_data();
65 template<
typename Scalar>
82 if (symbolic !=
nullptr)
84 umfpack_di_free_symbolic(&symbolic);
85 memset(Info, 0, 90 *
sizeof(
double));
89 status = umfpack_real_symbolic(m->get_size(), m->get_size(), m->get_Ap(), m->get_Ai(), m->get_Ax(), &symbolic, Control, Info);
90 if (status != UMFPACK_OK)
93 umfpack_di_free_symbolic(&symbolic);
99 if (numeric !=
nullptr)
101 umfpack_di_free_numeric(&numeric);
102 memset(Info + 0, 0, 90 *
sizeof(
double));
106 status = umfpack_real_numeric(m->get_Ap(), m->get_Ai(), m->get_Ax(), symbolic, &numeric, Control, Info);
107 if (status != UMFPACK_OK)
110 umfpack_di_free_numeric(&numeric);
111 throw Exceptions::LinearMatrixSolverException(check_status(
"UMFPACK numeric factorization", status));
114 umfpack_di_report_info(Control, Info);
128 eff_fact_scheme = reuse_scheme;
131 switch (eff_fact_scheme)
134 if (symbolic !=
nullptr)
135 umfpack_zi_free_symbolic(&symbolic);
137 status = umfpack_complex_symbolic(m->get_size(), m->get_size(), m->get_Ap(), m->get_Ai(), (
double *)m->get_Ax(),
nullptr, &symbolic,
nullptr,
nullptr);
138 if (status != UMFPACK_OK)
141 umfpack_zi_free_symbolic(&symbolic);
142 throw Exceptions::LinearMatrixSolverException(check_status(
"UMFPACK symbolic factorization", status));
147 if (numeric !=
nullptr)
148 umfpack_zi_free_numeric(&numeric);
150 status = umfpack_complex_numeric(m->get_Ap(), m->get_Ai(), (
double *)m->get_Ax(),
nullptr, symbolic, &numeric,
nullptr,
nullptr);
151 if (status != UMFPACK_OK)
154 umfpack_zi_free_numeric(&numeric);
155 throw Exceptions::LinearMatrixSolverException(check_status(
"UMFPACK numeric factorization", status));
165 if (symbolic !=
nullptr) umfpack_di_free_symbolic(&symbolic);
167 if (numeric !=
nullptr) umfpack_di_free_numeric(&numeric);
174 if (symbolic !=
nullptr) umfpack_zi_free_symbolic(&symbolic);
176 if (numeric !=
nullptr) umfpack_zi_free_numeric(&numeric);
183 assert(m !=
nullptr);
184 assert(rhs !=
nullptr);
185 assert(m->get_size() == rhs->get_size());
189 if (!setup_factorization())
192 free_with_check(sln);
194 sln = calloc_with_check<UMFPackLinearMatrixSolver<double>,
double>(m->get_size(),
this);
195 int status = umfpack_real_solve(UMFPACK_A, m->get_Ap(), m->get_Ai(), m->get_Ax(), sln, rhs->v, numeric,
nullptr,
nullptr);
196 if (status != UMFPACK_OK)
198 this->free_factorization_data();
208 assert(m !=
nullptr);
209 assert(rhs !=
nullptr);
210 assert(m->get_size() == rhs->get_size());
213 if (!setup_factorization())
214 this->warn(
"LU factorization could not be completed.");
216 free_with_check(sln);
217 sln = malloc_with_check<UMFPackLinearMatrixSolver<std::complex<double> >, std::complex<double> >(m->get_size(),
this);
219 memset(sln, 0, m->get_size() *
sizeof(std::complex<double>));
220 int status = umfpack_complex_solve(UMFPACK_A, m->get_Ap(), m->get_Ai(), (
double *)m->get_Ax(),
nullptr, (
double*)sln,
nullptr, (
double *)rhs->v,
nullptr, numeric,
nullptr,
nullptr);
221 if (status != UMFPACK_OK)
223 this->free_factorization_data();
228 time = this->accumulated();
231 template<
typename Scalar>
234 char* to_return = malloc_with_check<UMFPackLinearMatrixSolver<Scalar>,
char>(100,
this);
238 case UMFPACK_OK:
break;
239 case UMFPACK_WARNING_singular_matrix: sprintf(to_return,
"%s: UMFPACK_WARNING_singular_matrix!", fn_name);
break;
240 case UMFPACK_ERROR_out_of_memory: sprintf(to_return,
"%s: UMFPACK_ERROR_out_of_memory!", fn_name);
break;
241 case UMFPACK_ERROR_argument_missing: sprintf(to_return,
"%s: UMFPACK_ERROR_argument_missing", fn_name);
break;
242 case UMFPACK_ERROR_invalid_Symbolic_object: sprintf(to_return,
"%s: UMFPACK_ERROR_invalid_Symbolic_object", fn_name);
break;
243 case UMFPACK_ERROR_invalid_Numeric_object: sprintf(to_return,
"%s: UMFPACK_ERROR_invalid_Numeric_object", fn_name);
break;
244 case UMFPACK_ERROR_different_pattern: sprintf(to_return,
"%s: UMFPACK_ERROR_different_pattern", fn_name);
break;
245 case UMFPACK_ERROR_invalid_system: sprintf(to_return,
"%s: UMFPACK_ERROR_invalid_system", fn_name);
break;
246 case UMFPACK_ERROR_n_nonpositive: sprintf(to_return,
"%s: UMFPACK_ERROR_n_nonpositive", fn_name);
break;
247 case UMFPACK_ERROR_invalid_matrix: sprintf(to_return,
"%s: UMFPACK_ERROR_invalid_matrix", fn_name);
break;
248 case UMFPACK_ERROR_internal_error: sprintf(to_return,
"%s: UMFPACK_ERROR_internal_error", fn_name);
break;
249 default: sprintf(to_return,
"%s: unknown error (%d)", fn_name, status);
break;
General namespace for the Hermes library.
File containing common definitions, and basic global enums etc. for HermesCommon. ...
bool setup_factorization()
Vector used with MUMPS solver.
General CSC Matrix class. (can be used in umfpack, in that case use the CSCMatrix subclass...
void set_output_level(double level)
For output (the array Info is filled regardless of the value of the level).
UMFPackLinearMatrixSolver(CSCMatrix< Scalar > *m, SimpleVector< Scalar > *rhs)
existing factorization data.
UMFPACK solver interface.
Encapsulation of UMFPACK linear solver.
pattern as the one already factorized.
File containing common definitions, and basic global enums etc. for HermesCommon. ...
virtual int get_matrix_size()
Get size of matrix.
void free_factorization_data()