feat(linear-static-3d-euler-beam): step 20 - mkl-pardiso-solver-review-fix
This commit is contained in:
@@ -5,7 +5,6 @@
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
#include <algorithm>
|
||||
#include <cmath>
|
||||
#include <initializer_list>
|
||||
#include <limits>
|
||||
@@ -58,7 +57,16 @@ double normalizedResidual(
|
||||
const fesa::Vector& rhs) {
|
||||
auto residual = matrix.multiply(solution);
|
||||
residual.axpy(-1.0, rhs);
|
||||
return residual.norm() / (std::max)(1.0, rhs.norm());
|
||||
const double numerator = residual.norm();
|
||||
const double denominator = rhs.norm();
|
||||
if (!std::isfinite(numerator) || !std::isfinite(denominator)) {
|
||||
return (std::numeric_limits<double>::infinity)();
|
||||
}
|
||||
if (denominator == 0.0) {
|
||||
return numerator == 0.0 ? 0.0 :
|
||||
(std::numeric_limits<double>::infinity)();
|
||||
}
|
||||
return numerator / denominator;
|
||||
}
|
||||
|
||||
double relativeError(
|
||||
@@ -66,7 +74,16 @@ double relativeError(
|
||||
const fesa::Vector& expected) {
|
||||
auto difference = actual;
|
||||
difference.axpy(-1.0, expected);
|
||||
return difference.norm() / (std::max)(1.0, expected.norm());
|
||||
const double numerator = difference.norm();
|
||||
const double denominator = expected.norm();
|
||||
if (!std::isfinite(numerator) || !std::isfinite(denominator)) {
|
||||
return (std::numeric_limits<double>::infinity)();
|
||||
}
|
||||
if (denominator == 0.0) {
|
||||
return numerator == 0.0 ? 0.0 :
|
||||
(std::numeric_limits<double>::infinity)();
|
||||
}
|
||||
return numerator / denominator;
|
||||
}
|
||||
|
||||
void expectStructuredSolverFailure(const fesa::Status& status) {
|
||||
@@ -174,9 +191,13 @@ TEST(MklPardisoSolver, ClassifiesSingularIndefiniteAndNonfiniteFailures) {
|
||||
auto rhs = makeVector({1.0, 2.0});
|
||||
rhs[1U] = (std::numeric_limits<double>::infinity)();
|
||||
fesa::Vector solution{2U};
|
||||
solution[0U] = 23.0;
|
||||
solution[1U] = -9.0;
|
||||
const auto rhsStatus = solver.solve(rhs, solution);
|
||||
expectStructuredSolverFailure(rhsStatus);
|
||||
EXPECT_EQ(rhsStatus.diagnostics()[0U].code, "nonfinite-solver-rhs");
|
||||
EXPECT_DOUBLE_EQ(solution[0U], 23.0);
|
||||
EXPECT_DOUBLE_EQ(solution[1U], -9.0);
|
||||
|
||||
fesa::SparsePattern pattern{{0U, 1U}, {0U}};
|
||||
auto nonfiniteMatrix = fesa::SparseMatrix::fromCoo(
|
||||
|
||||
Reference in New Issue
Block a user