feat: adopt lumped mass and reduced-coordinate shell HHT
Integrate Hex8 mass verification and fixed-null-basis shell dynamics with numerical and physics handoff evidence. Preserve interrupted reference and full-validation status; full integration validation is deferred until after performance optimization.
This commit is contained in:
@@ -264,6 +264,42 @@ TEST(DynamicHdf5ResultsWriter, RejectsDefaultStateBeforeCreatingOutput) {
|
||||
EXPECT_FALSE(std::filesystem::exists(output.Path()));
|
||||
}
|
||||
|
||||
TEST(DynamicHdf5ResultsWriter, SeparatesReducedFilterCombinationFromLegacyDriver) {
|
||||
auto fixture = MakeFixture();
|
||||
for (std::uint32_t index = 0U; index <= 2U; ++index) {
|
||||
auto frame = MakeFrame(*fixture.domain, index);
|
||||
frame.time_integration_formulation =
|
||||
fesa::DynamicTimeIntegrationFormulation::kReducedCoordinateHht;
|
||||
ASSERT_TRUE(fixture.state.CommitAcceptedFrame(frame).IsOk());
|
||||
}
|
||||
TempFile output{"reduced-schema"};
|
||||
fesa::DynamicHdf5ResultsWriter writer;
|
||||
ASSERT_TRUE(writer.Write(output.Path(), *fixture.domain, fixture.state, {}).IsOk());
|
||||
Hdf5Handle file{
|
||||
H5Fopen(output.Path().string().c_str(), H5F_ACC_RDONLY, H5P_DEFAULT),
|
||||
H5Fclose};
|
||||
ASSERT_GE(file.Get(), 0);
|
||||
Hdf5Handle metadata{H5Gopen2(file.Get(), "/metadata", H5P_DEFAULT), H5Gclose};
|
||||
EXPECT_EQ(ReadAttribute<std::uint64_t>(metadata.Get(), "schema_version",
|
||||
H5T_STD_U64LE, H5T_NATIVE_UINT64), 2U);
|
||||
EXPECT_EQ(ReadString(metadata.Get(), "time_integration_formulation"),
|
||||
"reduced-coordinate-HHT-with-physical-rate-reconstruction");
|
||||
for (std::uint32_t index = 0U; index <= 2U; ++index) {
|
||||
const std::string root = "/steps/Step-1/frames/" + std::to_string(index);
|
||||
Hdf5Handle auxiliary{H5Dopen2(file.Get(),
|
||||
(root + "/nodal/algorithmic_acceleration").c_str(),
|
||||
H5P_DEFAULT), H5Dclose};
|
||||
EXPECT_EQ(ReadAttribute<std::uint64_t>(auxiliary.Get(), "schema_version",
|
||||
H5T_STD_U64LE, H5T_NATIVE_UINT64), 2U);
|
||||
EXPECT_EQ(ReadString(auxiliary.Get(), "quantity_semantics"),
|
||||
"full-chart-HHT-filter-combination-not-predictor-driver");
|
||||
Hdf5Handle physical{H5Dopen2(file.Get(), (root + "/nodal/acceleration").c_str(),
|
||||
H5P_DEFAULT), H5Dclose};
|
||||
EXPECT_EQ(ReadString(physical.Get(), "quantity_semantics"),
|
||||
"physical-endpoint-chart-acceleration");
|
||||
}
|
||||
}
|
||||
|
||||
TEST(DynamicHdf5ResultsWriter, WritesCompletePhysicalClampedHistoryAndSchema) {
|
||||
auto fixture = MakeFixture();
|
||||
CommitHistory(fixture);
|
||||
@@ -295,7 +331,7 @@ TEST(DynamicHdf5ResultsWriter, WritesCompletePhysicalClampedHistoryAndSchema) {
|
||||
"hht-implicit-dynamics");
|
||||
EXPECT_EQ(ReadString(metadata.Get(), "source_step_name"), "Transient Load");
|
||||
EXPECT_EQ(ReadString(metadata.Get(), "mass_formulation"),
|
||||
"consistent-kinetic");
|
||||
"nodal-lumped-kinetic");
|
||||
EXPECT_EQ(ReadString(metadata.Get(), "acceleration_convention"),
|
||||
"physical-endpoint-and-auxiliary-separated");
|
||||
EXPECT_EQ(ReadString(metadata.Get(), "initial_state"),
|
||||
|
||||
@@ -217,7 +217,7 @@ TEST(SolidHdf5ResultsWriter,
|
||||
EXPECT_EQ(Attr(metadata.Get(), "source_step_name"), "RawSolid");
|
||||
EXPECT_EQ(Attr(metadata.Get(), "element_formulation"), "FESA-Hex8");
|
||||
EXPECT_EQ(Attr(metadata.Get(), "integration_rule"), "gauss-2x2x2");
|
||||
EXPECT_EQ(Attr(metadata.Get(), "mass_formulation"), "consistent-reference");
|
||||
EXPECT_EQ(Attr(metadata.Get(), "mass_formulation"), "lumped-reference");
|
||||
EXPECT_EQ(Attr(metadata.Get(), "component_order"), "node-major; UX,UY,UZ");
|
||||
Compound(
|
||||
file.Get(), "/model/nodes",
|
||||
|
||||
Reference in New Issue
Block a user