Add MITC4 drilling diagnostics output and comparison contract
This commit is contained in:
@@ -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());
|
||||
|
||||
Reference in New Issue
Block a user