Add MITC4 drilling diagnostics output and comparison contract
This commit is contained in:
@@ -22,6 +22,8 @@
|
||||
#error FESA_TEST_BINARY_DIR must identify the CMake binary root.
|
||||
#endif
|
||||
|
||||
#include "io/hdf5/mitc4_drilling_diagnostics.h"
|
||||
|
||||
namespace {
|
||||
|
||||
constexpr const char* kInstanceName = "PART-1-1";
|
||||
@@ -771,3 +773,56 @@ TEST(Mitc4ReferenceComparison, RequiresOnlyDeclaredInputCsvAndHdf5) {
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
|
||||
TEST(Mitc4ReferenceComparison, DrillingOldMarkerlessReportIsNull) {
|
||||
ContractFixture fixture{"drilling-old"};
|
||||
const auto compared = fesa::test::Mitc4ReferenceComparison::Compare(fixture.ReferenceCase());
|
||||
ASSERT_TRUE(compared.HasValue());
|
||||
EXPECT_FALSE(compared.Value().drilling_diagnostics);
|
||||
const auto json = fixture.Root() / "drilling-old.json";
|
||||
ASSERT_TRUE(fesa::test::Mitc4ReferenceComparison::WriteDeterministicJson(compared.Value(), json).IsOk());
|
||||
EXPECT_NE(ReadBytes(json).find("\"drilling_diagnostics\":null"), std::string::npos);
|
||||
}
|
||||
|
||||
TEST(Mitc4ReferenceComparison, DrillingNewMarkersPreserveAllFramesWithoutNewVerdict) {
|
||||
for (const auto mode : {fesa::Mitc4DrillingMode::kDirectSpring,
|
||||
fesa::Mitc4DrillingMode::kLegacyCorotatedTwist}) {
|
||||
ContractFixture fixture{"drilling-new"};
|
||||
{
|
||||
Hdf5Handle file{H5Fopen(fixture.Results().string().c_str(), H5F_ACC_RDWR, H5P_DEFAULT), H5Fclose};
|
||||
fesa::hdf5_internal::WriteDrillingMetadata(file.Get(), mode);
|
||||
// Nonzero raw balance is diagnostic only for the linear displacement comparator.
|
||||
for (const int index : {0, 2, 10}) {
|
||||
const std::string root = "/steps/Step-1/frames/" + std::to_string(index);
|
||||
(void)fesa::hdf5_internal::CreateGroup(file.Get(), (root + "/global").c_str());
|
||||
const std::array<double, 6> raw{1., 2., 3., 4., 5., 6.};
|
||||
const fesa::Mitc4DrillingEvidence evidence{mode, {4., 5., 6.}, {1., 2., 3., 0., 0., 0.}};
|
||||
fesa::hdf5_internal::WriteModelDoubleDataset(file.Get(), root + "/global/equilibrium", {6U},
|
||||
raw.data(), 6U, "", "", "", "");
|
||||
fesa::hdf5_internal::WriteDrillingFrame(file.Get(), root, evidence);
|
||||
}
|
||||
}
|
||||
const auto compared = fesa::test::Mitc4ReferenceComparison::Compare(fixture.ReferenceCase());
|
||||
ASSERT_TRUE(compared.HasValue());
|
||||
EXPECT_TRUE(compared.Value().passed);
|
||||
EXPECT_EQ(compared.Value().metrics.size(), 2U);
|
||||
const auto& diagnostics = compared.Value().drilling_diagnostics;
|
||||
ASSERT_TRUE(diagnostics);
|
||||
EXPECT_EQ(diagnostics->formulation, fesa::Mitc4DrillingModeName(mode));
|
||||
ASSERT_EQ(diagnostics->frames.size(), 3U);
|
||||
EXPECT_EQ(diagnostics->frames[0].frame_index, 0U);
|
||||
EXPECT_EQ(diagnostics->frames[1].frame_index, 2U);
|
||||
EXPECT_EQ(diagnostics->frames[2].frame_index, 10U);
|
||||
const auto json = fixture.Root() / "drilling-new.json";
|
||||
ASSERT_TRUE(fesa::test::Mitc4ReferenceComparison::WriteDeterministicJson(compared.Value(), json).IsOk());
|
||||
const auto bytes = ReadBytes(json);
|
||||
EXPECT_NE(bytes.find("\"drilling_diagnostics\":{\"formulation\":\"" +
|
||||
diagnostics->formulation + "\",\"version\":1,\"frames\":["), std::string::npos);
|
||||
{
|
||||
Hdf5Handle file{H5Fopen(fixture.Results().string().c_str(), H5F_ACC_RDWR, H5P_DEFAULT), H5Fclose};
|
||||
ASSERT_GE(H5Ldelete(file.Get(), "/steps/Step-1/frames/2/global/drilling_moment", H5P_DEFAULT), 0);
|
||||
}
|
||||
EXPECT_FALSE(fesa::test::Mitc4ReferenceComparison::Compare(fixture.ReferenceCase()).HasValue());
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user