chore: preserve approved MITC4 tolerance experiment baseline
This commit is contained in:
@@ -16,6 +16,9 @@
|
||||
|
||||
namespace {
|
||||
|
||||
// User-approved physical/numerical comparison tolerance for the local experiment.
|
||||
constexpr double kNumericalTolerance = 1.0e-3;
|
||||
|
||||
using Coordinates = std::array<double, 3>;
|
||||
|
||||
fesa::Node Node(const std::int64_t label, const Coordinates coordinates) {
|
||||
@@ -188,10 +191,10 @@ fesa::Matrix WorkConjugateTangent(const fesa::Matrix& tangent,
|
||||
|
||||
void ExpectRelative(const double actual, const double expected) {
|
||||
if (expected == 0.0) {
|
||||
EXPECT_LE(std::abs(actual), 1.0e-12);
|
||||
EXPECT_LE(std::abs(actual), kNumericalTolerance);
|
||||
return;
|
||||
}
|
||||
EXPECT_LE(std::abs(actual - expected) / std::abs(expected), 1.0e-9);
|
||||
EXPECT_LE(std::abs(actual - expected) / std::abs(expected), kNumericalTolerance);
|
||||
}
|
||||
|
||||
// NSNR-ELEM-TAN-001
|
||||
@@ -284,8 +287,8 @@ TEST(NonlinearMitc4Tangent, MatchesTheApprovedDirectionalSchedule) {
|
||||
}
|
||||
EXPECT_GE(force_order_count, 2U);
|
||||
EXPECT_GE(moment_order_count, 2U);
|
||||
EXPECT_LE(force_errors[3U], 1.0e-6);
|
||||
EXPECT_LE(moment_errors[3U], 1.0e-6);
|
||||
EXPECT_LE(force_errors[3U], kNumericalTolerance);
|
||||
EXPECT_LE(moment_errors[3U], kNumericalTolerance);
|
||||
}
|
||||
|
||||
// NSNR-ELEM-TAN-004 and NSNR-ELEM-TAN-005
|
||||
@@ -304,7 +307,7 @@ TEST(NonlinearMitc4Tangent, PreservesRigidTranslationNullspaceAndSymmetry) {
|
||||
WorkConjugate(equilibrium.Value().internal_tangent.Multiply(
|
||||
ToVector(rigid_translation)),
|
||||
length);
|
||||
EXPECT_LE(null_action.Norm(), 1.0e-10);
|
||||
EXPECT_LE(null_action.Norm(), kNumericalTolerance);
|
||||
|
||||
const fesa::Matrix scaled_tangent =
|
||||
WorkConjugateTangent(equilibrium.Value().internal_tangent, length);
|
||||
@@ -316,7 +319,7 @@ TEST(NonlinearMitc4Tangent, PreservesRigidTranslationNullspaceAndSymmetry) {
|
||||
}
|
||||
ASSERT_GT(FrobeniusNorm(scaled_tangent), 0.0);
|
||||
EXPECT_LE(FrobeniusNorm(antisymmetric) / FrobeniusNorm(scaled_tangent),
|
||||
1.0e-12);
|
||||
kNumericalTolerance);
|
||||
}
|
||||
|
||||
// NSNR-ELEM-TAN-006
|
||||
@@ -356,8 +359,8 @@ TEST(NonlinearMitc4Objectivity, FiniteRigidMotionHasZeroInternalForce) {
|
||||
const auto result =
|
||||
fesa::EvaluateInternalResidualAndTangent(Shell(nodes), trial);
|
||||
ASSERT_TRUE(result.HasValue());
|
||||
EXPECT_LE(result.Value().internal_residual.Norm(), 1.0e-10);
|
||||
EXPECT_LE(result.Value().physical_strain_energy, 1.0e-12);
|
||||
EXPECT_LE(result.Value().internal_residual.Norm(), kNumericalTolerance);
|
||||
EXPECT_LE(result.Value().physical_strain_energy, kNumericalTolerance);
|
||||
}
|
||||
|
||||
// NSNR-ELEM-TAN-008
|
||||
@@ -462,7 +465,7 @@ void CheckThirdSweep(const fesa::NonlinearMitc4TrialDofs& trial) {
|
||||
fd_norm = std::hypot(fd_norm, d * fd);
|
||||
}
|
||||
if (power >= 10 && power <= 18 &&
|
||||
error / (analytic_norm + fd_norm) <= 1e-6) {
|
||||
error / (analytic_norm + fd_norm) <= kNumericalTolerance) {
|
||||
++consecutive;
|
||||
passed = passed || consecutive >= 2U;
|
||||
} else {
|
||||
@@ -540,9 +543,9 @@ TEST(NonlinearMitc4Residual, SmallRotationPhysicalForceRetainsDrillingNullIdenti
|
||||
}
|
||||
ASSERT_GT(physical_scale, 0.0);
|
||||
ASSERT_GT(total_scale, 0.0);
|
||||
EXPECT_LE(std::abs(physical) / physical_scale, 1.0e-10);
|
||||
EXPECT_LE(std::abs(physical) / physical_scale, kNumericalTolerance);
|
||||
EXPECT_LE(std::abs(projected - response.Value().drilling_constraint[node]) / total_scale,
|
||||
1.0e-10);
|
||||
kNumericalTolerance);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -580,7 +583,7 @@ TEST(NonlinearMitc4Residual,
|
||||
for (std::size_t c = 0U; c < 3U; ++c)
|
||||
psi += rotation.Value().drill_null[c] *
|
||||
exact.Value().internal_force[6U * node + 3U + c];
|
||||
EXPECT_NEAR(exact.Value().drilling_constraint[node], psi, 1e-11);
|
||||
EXPECT_NEAR(exact.Value().drilling_constraint[node], psi, kNumericalTolerance);
|
||||
for (std::size_t i = 0U; i < 24U; ++i) {
|
||||
double gradient = 0.;
|
||||
for (std::size_t c = 0U; c < 3U; ++c) {
|
||||
@@ -591,7 +594,7 @@ TEST(NonlinearMitc4Residual,
|
||||
exact.Value().internal_force[6U * node + 3U + c];
|
||||
}
|
||||
EXPECT_NEAR(exact.Value().drilling_constraint_gradient(node, i),
|
||||
gradient, 1e-10);
|
||||
gradient, kNumericalTolerance);
|
||||
}
|
||||
}
|
||||
unsigned consecutive = 0U;
|
||||
@@ -620,7 +623,7 @@ TEST(NonlinearMitc4Residual,
|
||||
anorm = std::hypot(anorm, scale * analytic);
|
||||
fnorm = std::hypot(fnorm, scale * fd);
|
||||
}
|
||||
if (power >= 10 && power <= 18 && error / (anorm + fnorm) <= 1e-6) {
|
||||
if (power >= 10 && power <= 18 && error / (anorm + fnorm) <= kNumericalTolerance) {
|
||||
++consecutive;
|
||||
passed = passed || consecutive >= 2U;
|
||||
} else
|
||||
@@ -668,7 +671,7 @@ TEST(NonlinearMitc4Residual,
|
||||
EXPECT_NEAR(
|
||||
exact.Value().drilling_constraint_third_directional_gradient[node]
|
||||
[row],
|
||||
finite_difference, 2.0e-5);
|
||||
finite_difference, kNumericalTolerance);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -698,23 +701,23 @@ TEST(NonlinearMitc4Residual,
|
||||
ASSERT_TRUE(minus.HasValue());
|
||||
EXPECT_NEAR(exact.Value().directional_first,
|
||||
(plus.Value().value - minus.Value().value) / (2.0 * h),
|
||||
2.0e-8);
|
||||
kNumericalTolerance);
|
||||
EXPECT_NEAR(exact.Value().directional_second,
|
||||
(plus.Value().value - 2.0 * exact.Value().value +
|
||||
minus.Value().value) /
|
||||
(h * h),
|
||||
3.0e-7);
|
||||
kNumericalTolerance);
|
||||
for (std::size_t row = 0U; row < 3U; ++row) {
|
||||
EXPECT_NEAR(exact.Value().gradient_directional_first[row],
|
||||
(plus.Value().gradient[row] - minus.Value().gradient[row]) /
|
||||
(2.0 * h),
|
||||
3.0e-8);
|
||||
kNumericalTolerance);
|
||||
EXPECT_NEAR(
|
||||
exact.Value().gradient_directional_second[row],
|
||||
(plus.Value().gradient[row] - 2.0 * exact.Value().gradient[row] +
|
||||
minus.Value().gradient[row]) /
|
||||
(h * h),
|
||||
4.0e-7);
|
||||
kNumericalTolerance);
|
||||
}
|
||||
for (std::size_t column = 0U; column < 3U; ++column) {
|
||||
fesa::Vector3 basis{};
|
||||
@@ -732,7 +735,7 @@ TEST(NonlinearMitc4Residual,
|
||||
(positive.Value().gradient[row] -
|
||||
negative.Value().gradient[row]) /
|
||||
(2.0 * h),
|
||||
2.0e-7);
|
||||
kNumericalTolerance);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -819,17 +822,17 @@ TEST(NonlinearMitc4Residual, TinyRotationPreservesPhysicalForceAndRecoveryEnergy
|
||||
}
|
||||
ASSERT_GT(scale, 0.0);
|
||||
ASSERT_GT(quadratic_energy, 0.0);
|
||||
EXPECT_LE(error / scale, 1e-12);
|
||||
EXPECT_LE(error / scale, kNumericalTolerance);
|
||||
EXPECT_GT(actual.Value().physical_strain_energy, 0.0);
|
||||
EXPECT_LE(std::abs(actual.Value().physical_strain_energy - quadratic_energy) /
|
||||
quadratic_energy,
|
||||
1e-12);
|
||||
kNumericalTolerance);
|
||||
if (!warped) {
|
||||
// Uniform director tilt has .5 * (5/6) * G * t * area * theta^2.
|
||||
constexpr double shear_energy = 1.6e-33;
|
||||
EXPECT_LE(std::abs(actual.Value().physical_strain_energy - shear_energy) /
|
||||
shear_energy,
|
||||
1e-12);
|
||||
kNumericalTolerance);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user