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
@@ -17,6 +17,8 @@
#include <utility>
#include <vector>
#include "io/hdf5/mitc4_drilling_diagnostics.h"
namespace {
constexpr const char* kStepRoot = "/steps/Step-1/frames/0";
@@ -525,4 +527,40 @@ TEST(Mitc4ShellCli, WritesShellHdf5ThroughTheExistingApplicationRoute) {
const auto result = RunApplication({input.string()});
ASSERT_EQ(result.exit_code, 0) << result.standard_error;
ExpectShellHdf5Identity(output, input);
const auto file = OpenFile(output);
const auto drilling = fesa::hdf5_internal::ReadDrillingDiagnostics(file.Get());
ASSERT_TRUE(drilling);
EXPECT_EQ(drilling->formulation, "direct-initial-director-spring");
EXPECT_EQ(drilling->version, 1U);
ASSERT_EQ(drilling->frames.size(), 1U);
EXPECT_EQ(drilling->frames.front().frame_index, 0U);
}
TEST(Mitc4ShellCli, DrillingActualHhtPipelineWritesInitialAndAcceptedDiagnostics) {
TempDirectory directory{"shell-drilling-hht"};
const auto input = directory.Path() / "shell.inp";
const auto output = directory.Path() / "shell_results.h5";
std::string deck = AllConstrainedShellDeck();
const auto material = deck.find("*Material, name=Steel\n");
ASSERT_NE(material, std::string::npos);
deck.insert(material + std::string{"*Material, name=Steel\n"}.size(), "*Density\n2.\n");
const auto step = deck.find("*Step,");
ASSERT_NE(step, std::string::npos);
deck.replace(step, std::string::npos,
"*Step, name=Load, nlgeom=YES\n*Dynamic, Direct\n0.25, 0.5\n*Cload\nAll, 3, 1.\n*End Step\n");
WriteText(input, deck);
const auto result = RunApplication({input.string()});
ASSERT_EQ(result.exit_code, 0) << result.standard_error;
const auto file = OpenFile(output);
const auto drilling = fesa::hdf5_internal::ReadDrillingDiagnostics(file.Get());
ASSERT_TRUE(drilling);
EXPECT_EQ(drilling->formulation, "direct-initial-director-spring");
ASSERT_EQ(drilling->frames.size(), 3U);
for (std::size_t i = 0; i < 3U; ++i) {
EXPECT_EQ(drilling->frames[i].frame_index, i);
EXPECT_EQ(drilling->frames[i].raw_equilibrium, (std::array<double, 6>{}));
EXPECT_EQ(drilling->frames[i].drilling_moment, (std::array<double, 3>{}));
EXPECT_EQ(drilling->frames[i].equilibrium_with_drilling, (std::array<double, 6>{}));
}
}