Add MITC4 drilling diagnostics output and comparison contract

This commit is contained in:
KOKO\Mimi
2026-10-20 09:45:58 +09:00
parent 3d5c296651
commit a73d3fc9ca
31 changed files with 1175 additions and 45 deletions
@@ -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());
}
}