feat(analysis): implement Hex8 solid static procedures
This commit is contained in:
@@ -0,0 +1,60 @@
|
||||
#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());
|
||||
}
|
||||
Reference in New Issue
Block a user