fix(equation-and-linear-solve): address review findings

This commit is contained in:
KOKO\Mimi
2026-07-31 16:36:07 +09:00
parent 2dd17be5d0
commit 741fc9eaea
12 changed files with 329 additions and 147 deletions
@@ -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);