From 426cce1fc6dff49a40f243731b0528b731816b15 Mon Sep 17 00:00:00 2001 From: "KOKO\\Mimi" Date: Thu, 13 Aug 2026 10:14:08 +0900 Subject: [PATCH] feat(linear-static-mitc4-shell): step 13 - shell-reference-comparison --- .../reference/mitc4_reference_comparison.cpp | 8 +++---- .../mitc4_reference_comparison_test.cpp | 24 +++++++++++++------ 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/tests/reference/mitc4_reference_comparison.cpp b/tests/reference/mitc4_reference_comparison.cpp index a0845b9..2ef807a 100644 --- a/tests/reference/mitc4_reference_comparison.cpp +++ b/tests/reference/mitc4_reference_comparison.cpp @@ -32,8 +32,7 @@ constexpr const char* kDisplacementPath = constexpr const char* kInternalFormulation = "FESA-MITC4"; constexpr const char* kIntegrationRule = "2x2x2-gauss; mitc4-edge-midpoint-shear"; -constexpr double kAbsoluteFloor = 1.0e-9; -constexpr double kRelativeCoefficient = 1.0e-6; +constexpr double kFixedAbsoluteTolerance = 1.0e-5; constexpr std::array kComponents{ "U1", "U2", "U3", "UR1", "UR2", "UR3"}; const std::vector kExpectedHeader{ @@ -761,8 +760,7 @@ Result Mitc4ReferenceComparison::compare( for (std::size_t component = 0U; component < kComponents.size(); ++component) { - const double tolerance = - kAbsoluteFloor + kRelativeCoefficient * scales[component]; + const double tolerance = kFixedAbsoluteTolerance; const double absoluteError = std::abs( hdf5Row.values[component] - reference->second->values[component]); @@ -830,7 +828,7 @@ Result Mitc4ReferenceComparison::compare( report.metrics.push_back({ kComponents[component], scales[component], - kAbsoluteFloor + kRelativeCoefficient * scales[component], + kFixedAbsoluteTolerance, maximumErrors[component], maximumNormalized[component], errorNorms[component] / std::sqrt(rowCount), diff --git a/tests/reference/mitc4_reference_comparison_test.cpp b/tests/reference/mitc4_reference_comparison_test.cpp index f6ae70e..578b7d5 100644 --- a/tests/reference/mitc4_reference_comparison_test.cpp +++ b/tests/reference/mitc4_reference_comparison_test.cpp @@ -659,7 +659,7 @@ TEST(Mitc4ReferenceComparison, RejectsInvalidInventoryBeforeNumericComparison) { } // MITC4-REF-003 -TEST(Mitc4ReferenceComparison, AppliesAbaqusComponentScaleWithoutClampOrRowDenominator) { +TEST(Mitc4ReferenceComparison, AppliesFixedAbsoluteToleranceWithoutScaleClampOrRowDenominator) { ContractFixture fixture{"tolerance"}; auto reference = defaultRows(); reference[0U].values[0U] = 0.0; @@ -668,10 +668,10 @@ TEST(Mitc4ReferenceComparison, AppliesAbaqusComponentScaleWithoutClampOrRowDenom reference[1U].values[1U] = 0.0; writeCsv(fixture.csv(), reference); auto fesaValues = reference; - fesaValues[0U].values[0U] = 1.5e-6; - fesaValues[1U].values[0U] += 2.002e-6; - fesaValues[0U].values[1U] = 0.999e-9; - fesaValues[1U].values[1U] = 1.001e-9; + fesaValues[0U].values[0U] = 0.9999e-5; + fesaValues[1U].values[0U] += 1.0001e-5; + fesaValues[0U].values[1U] = 0.9999e-5; + fesaValues[1U].values[1U] = 1.0001e-5; writeHdf5(fixture.results(), fixture.input(), fesaValues); auto result = fesa::test::Mitc4ReferenceComparison::compare( @@ -687,12 +687,22 @@ TEST(Mitc4ReferenceComparison, AppliesAbaqusComponentScaleWithoutClampOrRowDenom ASSERT_NE(u1Scaled, nullptr); ASSERT_NE(u2Near, nullptr); ASSERT_NE(u2Over, nullptr); - EXPECT_DOUBLE_EQ(u1Zero->tolerance, 2.001e-6); + EXPECT_DOUBLE_EQ(u1Zero->tolerance, 1.0e-5); EXPECT_TRUE(u1Zero->withinTolerance); + EXPECT_NEAR(u1Zero->normalizedError, 0.9999, 1.0e-12); EXPECT_FALSE(u1Scaled->withinTolerance); - EXPECT_DOUBLE_EQ(u2Near->tolerance, 1.0e-9); + EXPECT_NEAR(u1Scaled->normalizedError, 1.0001, 2.0e-11); + EXPECT_DOUBLE_EQ(u2Near->tolerance, 1.0e-5); EXPECT_TRUE(u2Near->withinTolerance); + EXPECT_NEAR(u2Near->normalizedError, 0.9999, 1.0e-12); EXPECT_FALSE(u2Over->withinTolerance); + EXPECT_NEAR(u2Over->normalizedError, 1.0001, 1.0e-12); + for (const auto& row : report.rows) { + EXPECT_DOUBLE_EQ(row.tolerance, 1.0e-5); + } + for (const auto& metric : report.metrics) { + EXPECT_DOUBLE_EQ(metric.tolerance, 1.0e-5); + } const auto* u1Metric = findMetric(report, "U1"); ASSERT_NE(u1Metric, nullptr); EXPECT_DOUBLE_EQ(u1Metric->referenceScale, 2.0);