Files
FESADev/tests/unit/analysis/solid_static_state_test.cpp
T

61 lines
2.4 KiB
C++

#include "fesa/analysis/solid_static_state.h"
#include <gtest/gtest.h>
#include <limits>
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<double>::infinity();
EXPECT_FALSE(fesa::EvaluateSolidStaticConvergence(r, f, p, du, u).HasValue());
EXPECT_FALSE(
fesa::EvaluateSolidStaticConvergence(r, f, fesa::Vector{2U}, du, u)
.HasValue());
}