fix(equation-and-linear-solve): address review findings
This commit is contained in:
@@ -106,9 +106,14 @@ public:
|
||||
PardisoSession& operator=(const PardisoSession&) = delete;
|
||||
|
||||
~PardisoSession() noexcept {
|
||||
static_cast<void>(release());
|
||||
}
|
||||
|
||||
MKL_INT release() noexcept {
|
||||
if (!active_) {
|
||||
return;
|
||||
return 0;
|
||||
}
|
||||
active_ = false;
|
||||
|
||||
constexpr MKL_INT release_all = -1;
|
||||
MKL_INT error = 0;
|
||||
@@ -129,6 +134,7 @@ public:
|
||||
right_hand_side_->data(),
|
||||
solution_->data(),
|
||||
&error);
|
||||
return error;
|
||||
}
|
||||
|
||||
MKL_INT execute(
|
||||
@@ -260,37 +266,45 @@ LinearSolveResult PardisoLinearSolver::solve(
|
||||
PardisoSession session;
|
||||
|
||||
constexpr MKL_INT analyze = 11;
|
||||
if (const MKL_INT error =
|
||||
session.execute(
|
||||
analyze, matrix, right_hand_side, solution);
|
||||
error != 0) {
|
||||
MKL_INT error = session.execute(
|
||||
analyze, matrix, right_hand_side, solution);
|
||||
if (error != 0) {
|
||||
result.diagnostics.push_back(solver_error(
|
||||
"solver.analysis_failed",
|
||||
pardiso_failure("analysis", error)));
|
||||
return result;
|
||||
}
|
||||
|
||||
constexpr MKL_INT factorize = 22;
|
||||
if (const MKL_INT error =
|
||||
session.execute(
|
||||
factorize, matrix, right_hand_side, solution);
|
||||
error != 0) {
|
||||
result.diagnostics.push_back(solver_error(
|
||||
"solver.factorization_failed",
|
||||
pardiso_failure("factorization", error)));
|
||||
return result;
|
||||
if (error == 0) {
|
||||
constexpr MKL_INT factorize = 22;
|
||||
error = session.execute(
|
||||
factorize, matrix, right_hand_side, solution);
|
||||
if (error != 0) {
|
||||
result.diagnostics.push_back(solver_error(
|
||||
"solver.factorization_failed",
|
||||
pardiso_failure("factorization", error)));
|
||||
}
|
||||
}
|
||||
|
||||
constexpr MKL_INT solve_system = 33;
|
||||
if (const MKL_INT error =
|
||||
session.execute(
|
||||
solve_system, matrix, right_hand_side, solution);
|
||||
error != 0) {
|
||||
result.diagnostics.push_back(solver_error(
|
||||
"solver.solve_failed",
|
||||
pardiso_failure("solve", error)));
|
||||
return result;
|
||||
if (error == 0) {
|
||||
constexpr MKL_INT solve_system = 33;
|
||||
error = session.execute(
|
||||
solve_system, matrix, right_hand_side, solution);
|
||||
if (error != 0) {
|
||||
result.diagnostics.push_back(solver_error(
|
||||
"solver.solve_failed",
|
||||
pardiso_failure("solve", error)));
|
||||
}
|
||||
}
|
||||
|
||||
if (const MKL_INT release_error = session.release();
|
||||
release_error != 0) {
|
||||
result.diagnostics.push_back(solver_error(
|
||||
"solver.release_failed",
|
||||
pardiso_failure("release", release_error)));
|
||||
}
|
||||
}
|
||||
if (!result.diagnostics.empty()) {
|
||||
return result;
|
||||
}
|
||||
if (!std::ranges::all_of(solution, [](const double value) {
|
||||
return std::isfinite(value);
|
||||
|
||||
Reference in New Issue
Block a user