test: cover unloaded HHT free degree channels
This commit is contained in:
@@ -83,6 +83,54 @@ TEST(HhtDynamicProcedure, ClampedStepLoadHasPhysicalReactionAndZeroMotion) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(HhtDynamicProcedure, UnloadedFreeChannelsRemainExactlyAtRest) {
|
||||||
|
for (const int fixed_first_dof : {0, 1, 4}) {
|
||||||
|
SCOPED_TRACE(fixed_first_dof);
|
||||||
|
auto definition = MakeDefinition(false);
|
||||||
|
if (fixed_first_dof != 0) {
|
||||||
|
definition.dynamic_step->boundaries = {{"All",
|
||||||
|
fixed_first_dof,
|
||||||
|
fixed_first_dof + 2,
|
||||||
|
0.0,
|
||||||
|
{"dynamic-state.inp", 11U}}};
|
||||||
|
}
|
||||||
|
auto domain = fesa::Domain::Create(std::move(definition));
|
||||||
|
ASSERT_TRUE(domain.HasValue());
|
||||||
|
fesa::SerialParallelFor parallel;
|
||||||
|
fesa::MklPardisoSolver mass;
|
||||||
|
fesa::MklPardisoTangentSolver tangent;
|
||||||
|
fesa::NewtonIterationLogWriter log;
|
||||||
|
const auto path =
|
||||||
|
std::filesystem::temp_directory_path() / "fesa-hht-rest.log";
|
||||||
|
ASSERT_TRUE(log.Open(path).IsOk());
|
||||||
|
auto result = fesa::HhtDynamicProcedureExecutor(parallel, mass, tangent)
|
||||||
|
.Execute(domain.Value(), log);
|
||||||
|
ASSERT_TRUE(log.Close().IsOk());
|
||||||
|
std::filesystem::remove(path);
|
||||||
|
ASSERT_TRUE(result.HasValue())
|
||||||
|
<< (result.HasValue()
|
||||||
|
? ""
|
||||||
|
: result.GetStatus().Diagnostics().front().message);
|
||||||
|
ASSERT_EQ(result.Value().state.AcceptedFrames().size(), 3U);
|
||||||
|
for (const auto& frame : result.Value().state.AcceptedFrames()) {
|
||||||
|
EXPECT_EQ(frame.iteration_count, 0U);
|
||||||
|
for (const auto* values :
|
||||||
|
{&frame.generalized_coordinates, &frame.velocity,
|
||||||
|
&frame.acceleration, &frame.algorithmic_acceleration,
|
||||||
|
&frame.reaction, &frame.residual}) {
|
||||||
|
for (std::size_t i = 0; i < values->Size(); ++i)
|
||||||
|
EXPECT_DOUBLE_EQ((*values)[i], 0.0);
|
||||||
|
}
|
||||||
|
EXPECT_DOUBLE_EQ(frame.kinetic_energy, 0.0);
|
||||||
|
EXPECT_DOUBLE_EQ(frame.physical_strain_energy, 0.0);
|
||||||
|
EXPECT_DOUBLE_EQ(frame.drilling_energy, 0.0);
|
||||||
|
EXPECT_DOUBLE_EQ(frame.energy_defect, 0.0);
|
||||||
|
for (const double metric : frame.free_residual_metrics)
|
||||||
|
EXPECT_DOUBLE_EQ(metric, 0.0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
TEST(HhtDynamicProcedure, LargeDirectStepStartsFromAcceptedGeometry) {
|
TEST(HhtDynamicProcedure, LargeDirectStepStartsFromAcceptedGeometry) {
|
||||||
auto definition = MakeDefinition(false);
|
auto definition = MakeDefinition(false);
|
||||||
definition.materials[0U].youngs_modulus = 1e9;
|
definition.materials[0U].youngs_modulus = 1e9;
|
||||||
|
|||||||
Reference in New Issue
Block a user