61 lines
2.4 KiB
C++
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());
|
|
}
|