feat(linear-static-mitc4-shell): step 13 - shell-reference-comparison
This commit is contained in:
@@ -32,8 +32,7 @@ constexpr const char* kDisplacementPath =
|
|||||||
constexpr const char* kInternalFormulation = "FESA-MITC4";
|
constexpr const char* kInternalFormulation = "FESA-MITC4";
|
||||||
constexpr const char* kIntegrationRule =
|
constexpr const char* kIntegrationRule =
|
||||||
"2x2x2-gauss; mitc4-edge-midpoint-shear";
|
"2x2x2-gauss; mitc4-edge-midpoint-shear";
|
||||||
constexpr double kAbsoluteFloor = 1.0e-9;
|
constexpr double kFixedAbsoluteTolerance = 1.0e-5;
|
||||||
constexpr double kRelativeCoefficient = 1.0e-6;
|
|
||||||
constexpr std::array<const char*, 6> kComponents{
|
constexpr std::array<const char*, 6> kComponents{
|
||||||
"U1", "U2", "U3", "UR1", "UR2", "UR3"};
|
"U1", "U2", "U3", "UR1", "UR2", "UR3"};
|
||||||
const std::vector<std::string> kExpectedHeader{
|
const std::vector<std::string> kExpectedHeader{
|
||||||
@@ -761,8 +760,7 @@ Result<Mitc4ComparisonReport> Mitc4ReferenceComparison::compare(
|
|||||||
for (std::size_t component = 0U;
|
for (std::size_t component = 0U;
|
||||||
component < kComponents.size();
|
component < kComponents.size();
|
||||||
++component) {
|
++component) {
|
||||||
const double tolerance =
|
const double tolerance = kFixedAbsoluteTolerance;
|
||||||
kAbsoluteFloor + kRelativeCoefficient * scales[component];
|
|
||||||
const double absoluteError = std::abs(
|
const double absoluteError = std::abs(
|
||||||
hdf5Row.values[component] -
|
hdf5Row.values[component] -
|
||||||
reference->second->values[component]);
|
reference->second->values[component]);
|
||||||
@@ -830,7 +828,7 @@ Result<Mitc4ComparisonReport> Mitc4ReferenceComparison::compare(
|
|||||||
report.metrics.push_back({
|
report.metrics.push_back({
|
||||||
kComponents[component],
|
kComponents[component],
|
||||||
scales[component],
|
scales[component],
|
||||||
kAbsoluteFloor + kRelativeCoefficient * scales[component],
|
kFixedAbsoluteTolerance,
|
||||||
maximumErrors[component],
|
maximumErrors[component],
|
||||||
maximumNormalized[component],
|
maximumNormalized[component],
|
||||||
errorNorms[component] / std::sqrt(rowCount),
|
errorNorms[component] / std::sqrt(rowCount),
|
||||||
|
|||||||
@@ -659,7 +659,7 @@ TEST(Mitc4ReferenceComparison, RejectsInvalidInventoryBeforeNumericComparison) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// MITC4-REF-003
|
// MITC4-REF-003
|
||||||
TEST(Mitc4ReferenceComparison, AppliesAbaqusComponentScaleWithoutClampOrRowDenominator) {
|
TEST(Mitc4ReferenceComparison, AppliesFixedAbsoluteToleranceWithoutScaleClampOrRowDenominator) {
|
||||||
ContractFixture fixture{"tolerance"};
|
ContractFixture fixture{"tolerance"};
|
||||||
auto reference = defaultRows();
|
auto reference = defaultRows();
|
||||||
reference[0U].values[0U] = 0.0;
|
reference[0U].values[0U] = 0.0;
|
||||||
@@ -668,10 +668,10 @@ TEST(Mitc4ReferenceComparison, AppliesAbaqusComponentScaleWithoutClampOrRowDenom
|
|||||||
reference[1U].values[1U] = 0.0;
|
reference[1U].values[1U] = 0.0;
|
||||||
writeCsv(fixture.csv(), reference);
|
writeCsv(fixture.csv(), reference);
|
||||||
auto fesaValues = reference;
|
auto fesaValues = reference;
|
||||||
fesaValues[0U].values[0U] = 1.5e-6;
|
fesaValues[0U].values[0U] = 0.9999e-5;
|
||||||
fesaValues[1U].values[0U] += 2.002e-6;
|
fesaValues[1U].values[0U] += 1.0001e-5;
|
||||||
fesaValues[0U].values[1U] = 0.999e-9;
|
fesaValues[0U].values[1U] = 0.9999e-5;
|
||||||
fesaValues[1U].values[1U] = 1.001e-9;
|
fesaValues[1U].values[1U] = 1.0001e-5;
|
||||||
writeHdf5(fixture.results(), fixture.input(), fesaValues);
|
writeHdf5(fixture.results(), fixture.input(), fesaValues);
|
||||||
|
|
||||||
auto result = fesa::test::Mitc4ReferenceComparison::compare(
|
auto result = fesa::test::Mitc4ReferenceComparison::compare(
|
||||||
@@ -687,12 +687,22 @@ TEST(Mitc4ReferenceComparison, AppliesAbaqusComponentScaleWithoutClampOrRowDenom
|
|||||||
ASSERT_NE(u1Scaled, nullptr);
|
ASSERT_NE(u1Scaled, nullptr);
|
||||||
ASSERT_NE(u2Near, nullptr);
|
ASSERT_NE(u2Near, nullptr);
|
||||||
ASSERT_NE(u2Over, 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_TRUE(u1Zero->withinTolerance);
|
||||||
|
EXPECT_NEAR(u1Zero->normalizedError, 0.9999, 1.0e-12);
|
||||||
EXPECT_FALSE(u1Scaled->withinTolerance);
|
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_TRUE(u2Near->withinTolerance);
|
||||||
|
EXPECT_NEAR(u2Near->normalizedError, 0.9999, 1.0e-12);
|
||||||
EXPECT_FALSE(u2Over->withinTolerance);
|
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");
|
const auto* u1Metric = findMetric(report, "U1");
|
||||||
ASSERT_NE(u1Metric, nullptr);
|
ASSERT_NE(u1Metric, nullptr);
|
||||||
EXPECT_DOUBLE_EQ(u1Metric->referenceScale, 2.0);
|
EXPECT_DOUBLE_EQ(u1Metric->referenceScale, 2.0);
|
||||||
|
|||||||
Reference in New Issue
Block a user