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
+42 -8
View File
@@ -13,6 +13,8 @@
#include "io/hdf5/hdf5_raii.h"
#include "io/hdf5/hdf5_primitives.h"
#include "io/hdf5/mitc4_drilling_diagnostics.h"
namespace fesa::hdf5_internal {
Hdf5Handle OpenDatasetForCheck(const hid_t file, const char* path) {
@@ -516,18 +518,30 @@ void RequireSchemaV1ShellIdentity(const hid_t file, const char* path,
void SelfCheckFile(const std::filesystem::path& path, const Domain& domain,
const AnalysisState& state,
const std::size_t diagnostic_count,
const WriterModelData& model_data) {
const WriterModelData& model_data,
herr_t (*close_reader)(hid_t)) {
if (H5Fis_hdf5(path.string().c_str()) <= 0) {
throw Hdf5Failure{"The temporary output is not an HDF5 file."};
}
Hdf5Handle file{
RequireHdf5Id(H5Fopen(path.string().c_str(), H5F_ACC_RDONLY, H5P_DEFAULT),
"Unable to reopen the temporary HDF5 file read-only."),
H5Fclose};
close_reader};
Hdf5Handle metadata{
RequireHdf5Id(H5Gopen2(file.Get(), "/metadata", H5P_DEFAULT),
"The HDF5 metadata group is missing."),
H5Gclose};
if (IsShellDomain(domain)) {
const auto drilling = ReadDrillingDiagnostics(file.Get());
if (state.Mitc4Drilling()) {
ValidateDrillingEvidence(state.Equilibrium(), state.Mitc4Drilling());
RequireDrilling(drilling.has_value() && drilling->formulation ==
Mitc4DrillingModeName(state.Mitc4Drilling()->mode) && drilling->frames.size() == 1U);
CheckDrillingFrame(drilling->frames.front(), 0U, state.Equilibrium(), *state.Mitc4Drilling());
} else {
RequireDrilling(!drilling.has_value());
}
}
RequireUint64Attribute(metadata.Get(), "schema_version", 0U);
RequireStringAttribute(metadata.Get(), "solver_version",
std::string{SolverVersion()});
@@ -751,18 +765,36 @@ void SelfCheckFile(const std::filesystem::path& path, const Domain& domain,
void NonlinearSelfCheckFile(const std::filesystem::path& path,
const Domain& domain,
const NonlinearAnalysisState& state,
const std::size_t diagnostic_count) {
const std::size_t diagnostic_count,
herr_t (*close_reader)(hid_t)) {
if (H5Fis_hdf5(path.string().c_str()) <= 0) {
throw Hdf5Failure{"The nonlinear candidate is not an HDF5 file."};
}
Hdf5Handle file{
RequireHdf5Id(H5Fopen(path.string().c_str(), H5F_ACC_RDONLY, H5P_DEFAULT),
"Unable to reopen nonlinear candidate read-only."),
H5Fclose};
close_reader};
Hdf5Handle metadata{
RequireHdf5Id(H5Gopen2(file.Get(), "/metadata", H5P_DEFAULT),
"The nonlinear metadata group is missing."),
H5Gclose};
RequireDrilling(!state.AcceptedFrames().empty());
const auto drilling = ReadDrillingDiagnostics(file.Get());
const auto& expected_drilling = state.AcceptedFrames().front().mitc4_drilling;
if (expected_drilling) {
RequireDrilling(drilling.has_value() && drilling->formulation ==
Mitc4DrillingModeName(expected_drilling->mode) &&
drilling->frames.size() == state.AcceptedFrames().size());
for (std::size_t i = 0; i < drilling->frames.size(); ++i) {
const auto& frame = state.AcceptedFrames()[i];
ValidateDrillingEvidence(frame.global_equilibrium, frame.mitc4_drilling);
RequireDrilling(frame.mitc4_drilling->mode == expected_drilling->mode);
CheckDrillingFrame(drilling->frames[i], frame.frame_index, frame.global_equilibrium, *frame.mitc4_drilling);
}
} else {
RequireDrilling(!drilling.has_value());
for (const auto& frame : state.AcceptedFrames()) RequireDrilling(!frame.mitc4_drilling);
}
RequireUint64Attribute(metadata.Get(), "schema_version", 1U);
RequireStringAttribute(metadata.Get(), "feature_id",
"nonlinear-static-newton-raphson");
@@ -919,9 +951,10 @@ void NonlinearSelfCheckFile(const std::filesystem::path& path,
Status SelfCheck(const std::filesystem::path& path, const Domain& domain,
const AnalysisState& state, const std::size_t diagnostic_count,
const WriterModelData& model_data) {
const WriterModelData& model_data,
herr_t (*close_reader)(hid_t)) {
try {
SelfCheckFile(path, domain, state, diagnostic_count, model_data);
SelfCheckFile(path, domain, state, diagnostic_count, model_data, close_reader);
return Status::Ok();
} catch (const Hdf5Failure& failure) {
return OutputFailure("hdf5-write-failure", failure.what());
@@ -933,9 +966,10 @@ Status SelfCheck(const std::filesystem::path& path, const Domain& domain,
Status NonlinearSelfCheck(const std::filesystem::path& path,
const Domain& domain,
const NonlinearAnalysisState& state,
const std::size_t diagnostic_count) {
const std::size_t diagnostic_count,
herr_t (*close_reader)(hid_t)) {
try {
NonlinearSelfCheckFile(path, domain, state, diagnostic_count);
NonlinearSelfCheckFile(path, domain, state, diagnostic_count, close_reader);
return Status::Ok();
} catch (const Hdf5Failure& failure) {
return OutputFailure("hdf5-write-failure", failure.what());