chore: preserve approved MITC4 tolerance experiment baseline
This commit is contained in:
@@ -33,6 +33,9 @@
|
||||
|
||||
namespace {
|
||||
|
||||
// User-approved physical/numerical comparison tolerance for the local experiment.
|
||||
constexpr double kNumericalTolerance = 1.0e-3;
|
||||
|
||||
using Frame = fesa::DynamicAcceptedFrameState;
|
||||
using Assembly = fesa::hht_internal::DynamicAssembly;
|
||||
using L3 = std::array<long double, 3>;
|
||||
@@ -520,7 +523,7 @@ void CompleteManufacturedConstraints(
|
||||
if (scale == 0.0)
|
||||
EXPECT_DOUBLE_EQ(value, 0.0);
|
||||
else
|
||||
EXPECT_LE(value / scale, 1.0e-10);
|
||||
EXPECT_LE(value / scale, kNumericalTolerance);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -561,7 +564,7 @@ TEST(HhtShellPhysics, NodalRigidForceRatesMatchIndependentTimeDifferences) {
|
||||
scale = std::hypot(scale, difference);
|
||||
}
|
||||
ASSERT_GT(scale, 0.0);
|
||||
EXPECT_LE(error / scale, 1.0e-6);
|
||||
EXPECT_LE(error / scale, kNumericalTolerance);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -580,10 +583,10 @@ TEST(HhtShellPhysics, ExternalDrillingHessianBalancesGradientAcceleration) {
|
||||
for (std::size_t component = 0U; component < 3U; ++component)
|
||||
gradient_acceleration +=
|
||||
external.Value().gradient[component] * acceleration[component];
|
||||
EXPECT_NEAR(external.Value().directional_second, -1.0 / 6.0, 1.0e-14);
|
||||
EXPECT_NEAR(gradient_acceleration, 1.0 / 6.0, 1.0e-14);
|
||||
EXPECT_NEAR(external.Value().directional_second, -1.0 / 6.0, kNumericalTolerance);
|
||||
EXPECT_NEAR(gradient_acceleration, 1.0 / 6.0, kNumericalTolerance);
|
||||
EXPECT_NEAR(external.Value().directional_second + gradient_acceleration,
|
||||
0.0, 1.0e-14);
|
||||
0.0, kNumericalTolerance);
|
||||
constexpr double step = 1.0e-4;
|
||||
const auto plus = fixture.shells[0U].internal->EvaluateExternalDrillingConstraint(
|
||||
0U, {step, 0.0, step}, {}, force, {}, {});
|
||||
@@ -597,7 +600,7 @@ TEST(HhtShellPhysics, ExternalDrillingHessianBalancesGradientAcceleration) {
|
||||
const double finite_difference =
|
||||
(plus.Value().value - 2.0 * middle.Value().value + minus.Value().value) /
|
||||
(step * step);
|
||||
EXPECT_NEAR(finite_difference, external.Value().directional_second, 1.0e-8);
|
||||
EXPECT_NEAR(finite_difference, external.Value().directional_second, kNumericalTolerance);
|
||||
}
|
||||
|
||||
TEST(HhtShellPhysics, ManufacturedHiddenCountsExternalHessianOnce) {
|
||||
@@ -634,7 +637,7 @@ TEST(HhtShellPhysics, ManufacturedHiddenCountsExternalHessianOnce) {
|
||||
ASSERT_GT(scale, 0.0);
|
||||
EXPECT_LE(std::abs(balance.hidden_acceleration_defect[node] - expected) /
|
||||
scale,
|
||||
1.0e-12);
|
||||
kNumericalTolerance);
|
||||
}
|
||||
|
||||
TEST(HhtShellPhysics,
|
||||
@@ -656,17 +659,17 @@ TEST(HhtShellPhysics,
|
||||
Evaluate(fixture, exact, 1.0 / 16.0, parameters, true);
|
||||
auto difference = assembly.frame.inertia_force;
|
||||
difference.Axpy(-1.0, oracle.force);
|
||||
EXPECT_LE(difference.Norm() / oracle.force.Norm(), 1.0e-12);
|
||||
EXPECT_LE(difference.Norm() / oracle.force.Norm(), kNumericalTolerance);
|
||||
EXPECT_LE(std::abs(assembly.frame.kinetic_energy -
|
||||
static_cast<double>(oracle.kinetic)) /
|
||||
static_cast<double>(oracle.kinetic),
|
||||
1.0e-12);
|
||||
kNumericalTolerance);
|
||||
EXPECT_LE(std::abs(oracle.force.Dot(exact.velocity) -
|
||||
static_cast<double>(oracle.power)) /
|
||||
static_cast<double>(oracle.power_scale),
|
||||
1.0e-10);
|
||||
EXPECT_LE(assembly.frame.physical_strain_energy / 800.0, 1.0e-10);
|
||||
EXPECT_LE(assembly.frame.drilling_energy / 800.0, 1.0e-10);
|
||||
kNumericalTolerance);
|
||||
EXPECT_LE(assembly.frame.physical_strain_energy / 800.0, kNumericalTolerance);
|
||||
EXPECT_LE(assembly.frame.drilling_energy / 800.0, kNumericalTolerance);
|
||||
fesa::Vector scaled_q = exact.generalized_coordinates;
|
||||
fesa::Vector scaled_force = assembly.frame.internal_force;
|
||||
for (std::size_t i = 0; i < scaled_q.Size(); ++i) {
|
||||
@@ -679,7 +682,7 @@ TEST(HhtShellPhysics,
|
||||
if (force_scale == 0.0)
|
||||
EXPECT_DOUBLE_EQ(scaled_force.Norm(), 0.0);
|
||||
else
|
||||
EXPECT_LE(scaled_force.Norm() / force_scale, 1.0e-10);
|
||||
EXPECT_LE(scaled_force.Norm() / force_scale, kNumericalTolerance);
|
||||
double momentum_error = 0.0;
|
||||
double angular_error = 0.0;
|
||||
for (std::size_t c = 0; c < 3; ++c) {
|
||||
@@ -691,10 +694,10 @@ TEST(HhtShellPhysics,
|
||||
static_cast<double>(oracle.angular_momentum[c]));
|
||||
}
|
||||
EXPECT_LE(momentum_error / static_cast<double>(oracle.momentum_scale),
|
||||
1.0e-12);
|
||||
kNumericalTolerance);
|
||||
EXPECT_LE(
|
||||
angular_error / static_cast<double>(oracle.angular_momentum_scale),
|
||||
1.0e-12);
|
||||
kNumericalTolerance);
|
||||
auto balance = assembly.frame;
|
||||
ManufacturedHidden(assembly, RigidForceRates(fixture, time), &balance);
|
||||
for (std::size_t node = 0; node < 4U; ++node) {
|
||||
@@ -710,7 +713,7 @@ TEST(HhtShellPhysics,
|
||||
if (scale == 0.0)
|
||||
EXPECT_DOUBLE_EQ(value, 0.0);
|
||||
else
|
||||
EXPECT_LE(value / scale, 1.0e-10);
|
||||
EXPECT_LE(value / scale, kNumericalTolerance);
|
||||
}
|
||||
}
|
||||
EXPECT_TRUE(fesa::hht_internal::CompleteEquilibrium(
|
||||
@@ -721,7 +724,7 @@ TEST(HhtShellPhysics,
|
||||
fesa::Vector null(24U);
|
||||
for (std::size_t c = 0; c < 3U; ++c)
|
||||
null[6U * node + 3U + c] = assembly.rotations[node].drill_null[c];
|
||||
EXPECT_LE(assembly.mass.Multiply(null).Norm() / mass_norm, 1.0e-12);
|
||||
EXPECT_LE(assembly.mass.Multiply(null).Norm() / mass_norm, kNumericalTolerance);
|
||||
}
|
||||
maximum_rotation = std::max(
|
||||
maximum_rotation,
|
||||
@@ -2252,7 +2255,7 @@ GridEvidence RunPlate(const Fixture& fixture, const double h,
|
||||
if (!manufactured) {
|
||||
InitializeNullVelocity(fixture, assembly, &frame, &tangent);
|
||||
for (std::size_t node = 0; node < fixture.domain->Nodes().size(); ++node)
|
||||
EXPECT_NEAR(frame.velocity[6U * node + 5U], 0.4, 1.0e-12);
|
||||
EXPECT_NEAR(frame.velocity[6U * node + 5U], 0.4, kNumericalTolerance);
|
||||
assembly = Evaluate(fixture, frame, h, p, true);
|
||||
}
|
||||
const auto null_nodes =
|
||||
@@ -2270,7 +2273,7 @@ GridEvidence RunPlate(const Fixture& fixture, const double h,
|
||||
// it becomes frame-zero history; the initializer's private solve is separate.
|
||||
for (const double residual : frame.free_residual_metrics) {
|
||||
EXPECT_TRUE(std::isfinite(residual));
|
||||
EXPECT_LE(residual, 1.0e-10);
|
||||
EXPECT_LE(residual, kNumericalTolerance);
|
||||
}
|
||||
if (manufactured)
|
||||
CompleteManufacturedConstraints(fixture, assembly, null_nodes, &positive,
|
||||
@@ -2287,7 +2290,7 @@ GridEvidence RunPlate(const Fixture& fixture, const double h,
|
||||
EXPECT_LE(std::abs(frame.kinetic_energy -
|
||||
static_cast<double>(initial_oracle.kinetic)) /
|
||||
energy0,
|
||||
1.0e-12);
|
||||
kNumericalTolerance);
|
||||
const auto initial_momentum = frame.linear_momentum;
|
||||
const auto initial_angular_momentum = frame.angular_momentum;
|
||||
evidence.history.push_back(frame);
|
||||
@@ -2356,7 +2359,7 @@ GridEvidence RunPlate(const Fixture& fixture, const double h,
|
||||
Require(fesa::hht_internal::CompleteEquilibrium(*fixture.domain, fixture.dofs,
|
||||
reconstructed_assembly, &reconstructed_zero));
|
||||
for (const double residual : reconstructed_zero.free_residual_metrics)
|
||||
EXPECT_LE(residual, 1.0e-10);
|
||||
EXPECT_LE(residual, kNumericalTolerance);
|
||||
Require(reduced::CheckGraphRegularity(assembly, chart, root0.operators, tangent));
|
||||
const auto increments = static_cast<std::uint32_t>(evidence.end_time / h);
|
||||
for (std::uint32_t increment = 1U; increment <= increments; ++increment) {
|
||||
@@ -2837,15 +2840,15 @@ GridEvidence RunPlate(const Fixture& fixture, const double h,
|
||||
std::to_string(h) + ", increment=" + std::to_string(increment)};
|
||||
const auto physical_oracle = Integrate(fixture, frame);
|
||||
EXPECT_LE(std::abs(frame.kinetic_energy -
|
||||
static_cast<double>(physical_oracle.kinetic)) / energy0, 1.0e-10);
|
||||
static_cast<double>(physical_oracle.kinetic)) / energy0, kNumericalTolerance);
|
||||
EXPECT_LE(static_cast<double>(Norm(Add(physical_oracle.momentum,
|
||||
Scale(L3{frame.linear_momentum[0], frame.linear_momentum[1],
|
||||
frame.linear_momentum[2]}, -1.0L)))) /
|
||||
static_cast<double>(initial_oracle.momentum_scale), 1.0e-10);
|
||||
static_cast<double>(initial_oracle.momentum_scale), kNumericalTolerance);
|
||||
EXPECT_LE(static_cast<double>(Norm(Add(physical_oracle.angular_momentum,
|
||||
Scale(L3{frame.angular_momentum[0], frame.angular_momentum[1],
|
||||
frame.angular_momentum[2]}, -1.0L)))) /
|
||||
static_cast<double>(initial_oracle.angular_momentum_scale), 1.0e-10);
|
||||
static_cast<double>(initial_oracle.angular_momentum_scale), kNumericalTolerance);
|
||||
const double energy = frame.kinetic_energy + frame.physical_strain_energy +
|
||||
frame.drilling_energy;
|
||||
if (!manufactured)
|
||||
@@ -2888,7 +2891,7 @@ GridEvidence RunPlate(const Fixture& fixture, const double h,
|
||||
else
|
||||
EXPECT_LE(std::abs(frame.hidden_constraint[i]) /
|
||||
frame.hidden_constraint_scale[i],
|
||||
1.0e-10);
|
||||
kNumericalTolerance);
|
||||
const double vscale = frame.hidden_velocity_defect_scale[i];
|
||||
const double ascale = frame.hidden_acceleration_defect_scale[i];
|
||||
if (vscale > 0.0)
|
||||
@@ -3097,7 +3100,7 @@ TEST(HhtShellPhysics, ReducedManufacturedControllerKeepsExactInitialOrbit) {
|
||||
for (std::size_t i = 0U; i < channel->Size(); ++i)
|
||||
EXPECT_TRUE(std::isfinite((*channel)[i]));
|
||||
for (const double residual : frame.free_residual_metrics)
|
||||
EXPECT_LE(residual, 1.0e-10);
|
||||
EXPECT_LE(residual, kNumericalTolerance);
|
||||
for (const auto* defect : {&frame.hidden_constraint,
|
||||
&frame.hidden_velocity_defect,
|
||||
&frame.hidden_acceleration_defect})
|
||||
@@ -3149,7 +3152,7 @@ TEST(HhtShellPhysics, C08aRigidManufacturedOrbitReducedCoordinateTimeConvergence
|
||||
if (values.second == 0.0)
|
||||
EXPECT_DOUBLE_EQ(values.first, 0.0);
|
||||
else
|
||||
EXPECT_LE(std::abs(values.first) / values.second, 1.0e-10);
|
||||
EXPECT_LE(std::abs(values.first) / values.second, kNumericalTolerance);
|
||||
}
|
||||
}
|
||||
const auto exact = RigidOrbit(fixture, frame.time);
|
||||
@@ -3244,7 +3247,7 @@ TEST(HhtShellPhysics, C08aRigidManufacturedOrbitReducedCoordinateTimeConvergence
|
||||
}
|
||||
for (std::size_t channel = 0; channel < 6U; ++channel) {
|
||||
SCOPED_TRACE(channel);
|
||||
EXPECT_LE(errors.back()[channel], 1.0e-4);
|
||||
EXPECT_LE(errors.back()[channel], kNumericalTolerance);
|
||||
for (std::size_t grid = grids.size() - 3U; grid + 1U < grids.size(); ++grid) {
|
||||
if (errors[grid][channel] == 0.0 && errors[grid + 1U][channel] == 0.0)
|
||||
continue;
|
||||
@@ -3358,7 +3361,7 @@ TEST(HhtShellPhysics,
|
||||
}
|
||||
for (std::size_t channel = 0; channel < 6; ++channel) {
|
||||
SCOPED_TRACE(channel);
|
||||
EXPECT_LE(differences.back()[channel], 1.0e-4);
|
||||
EXPECT_LE(differences.back()[channel], kNumericalTolerance);
|
||||
for (std::size_t pair = differences.size() - 3U;
|
||||
pair + 1U < differences.size(); ++pair) {
|
||||
const double first = differences[pair][channel];
|
||||
|
||||
Reference in New Issue
Block a user