#include "fesa/analysis/solid_static_state.h" #include #include TEST(SolidStaticControls, PurePrescribedUsesAbsoluteForceAndOnlyTwoChannels) { fesa::Vector residual{1U}; fesa::Vector internal{1U}; fesa::Vector external{1U}; fesa::Vector correction{1U}; fesa::Vector increment{1U}; residual[0] = internal[0] = 0.0009; correction[0] = 0.0009; auto result = fesa::EvaluateSolidStaticConvergence( residual, internal, external, correction, increment); ASSERT_TRUE(result.HasValue()); EXPECT_EQ(result.Value().force_residual.branch, fesa::NewtonConvergenceBranch::kZeroScale); EXPECT_DOUBLE_EQ(result.Value().force_residual.denominator_scale, 0.0); EXPECT_EQ(result.Value().force_residual.threshold_unit, fesa::NewtonChannelUnit::kForce); EXPECT_EQ(result.Value().translation_correction.threshold_unit, fesa::NewtonChannelUnit::kLength); EXPECT_TRUE(result.Value().force_residual.passed); EXPECT_TRUE(result.Value().translation_correction.passed); internal[0] = residual[0] = 0.0011; EXPECT_FALSE(fesa::EvaluateSolidStaticConvergence( residual, internal, external, correction, increment) .Value() .force_residual.passed); } TEST(SolidStaticControls, RelativeLimitsRawNormsAndNonfiniteFailure) { fesa::Vector r{1U}, f{1U}, p{1U}, du{1U}, u{1U}; r[0] = 1.0; f[0] = 100.0; p[0] = 99.0; du[0] = 0.1; u[0] = 10.0; auto result = fesa::EvaluateSolidStaticConvergence(r, f, p, du, u); ASSERT_TRUE(result.HasValue()); EXPECT_DOUBLE_EQ(result.Value().force_residual.numerator_norm, 1.0); EXPECT_DOUBLE_EQ(result.Value().force_residual.denominator_scale, 100.0); EXPECT_EQ(result.Value().force_residual.branch, fesa::NewtonConvergenceBranch::kRelative); EXPECT_EQ(result.Value().force_residual.threshold_unit, fesa::NewtonChannelUnit::kDimensionless); EXPECT_TRUE(result.Value().force_residual.passed); EXPECT_TRUE(result.Value().translation_correction.passed); r[0] = 1.0001; EXPECT_FALSE(fesa::EvaluateSolidStaticConvergence(r, f, p, du, u) .Value() .force_residual.passed); p[0] = std::numeric_limits::infinity(); EXPECT_FALSE(fesa::EvaluateSolidStaticConvergence(r, f, p, du, u).HasValue()); EXPECT_FALSE( fesa::EvaluateSolidStaticConvergence(r, f, fesa::Vector{2U}, du, u) .HasValue()); }