feat(linear-static-mitc4-shell): step 13 - shell-reference-comparison

This commit is contained in:
KOKO\Mimi
2026-08-13 10:14:08 +09:00
parent 0a42e3fb75
commit 426cce1fc6
2 changed files with 20 additions and 12 deletions
@@ -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<const char*, 6> kComponents{
"U1", "U2", "U3", "UR1", "UR2", "UR3"};
const std::vector<std::string> kExpectedHeader{
@@ -761,8 +760,7 @@ Result<Mitc4ComparisonReport> 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<Mitc4ComparisonReport> Mitc4ReferenceComparison::compare(
report.metrics.push_back({
kComponents[component],
scales[component],
kAbsoluteFloor + kRelativeCoefficient * scales[component],
kFixedAbsoluteTolerance,
maximumErrors[component],
maximumNormalized[component],
errorNorms[component] / std::sqrt(rowCount),
@@ -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);