fix: restore thickness factor in shell bending resultants
This commit is contained in:
@@ -1389,9 +1389,9 @@ Result<NonlinearMitc4Recovery> NonlinearMitc4Shell::EvaluateKinematics(
|
|||||||
3.0 * thickness_sign * gauss * point.strain[component] / thickness_;
|
3.0 * thickness_sign * gauss * point.strain[component] / thickness_;
|
||||||
row.section_resultant[component] +=
|
row.section_resultant[component] +=
|
||||||
0.5 * thickness_ * point.stress[component];
|
0.5 * thickness_ * point.stress[component];
|
||||||
row.section_resultant[3U + component] += 0.25 * thickness_ *
|
row.section_resultant[3U + component] +=
|
||||||
thickness_sign * gauss *
|
0.25 * thickness_ * thickness_ * thickness_sign * gauss *
|
||||||
point.stress[component];
|
point.stress[component];
|
||||||
}
|
}
|
||||||
for (std::size_t component = 0U; component < 2U; ++component) {
|
for (std::size_t component = 0U; component < 2U; ++component) {
|
||||||
row.generalized_strain[6U + component] +=
|
row.generalized_strain[6U + component] +=
|
||||||
|
|||||||
@@ -91,6 +91,37 @@ TEST(NonlinearMitc4Shell, UndeformedStateHasZeroPhysicalRecovery) {
|
|||||||
ExpectZeroRecovery(recovery.Value());
|
ExpectZeroRecovery(recovery.Value());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(NonlinearMitc4Recovery, BendingResultantsMatchStressThicknessMoments) {
|
||||||
|
const auto nodes = Nodes();
|
||||||
|
auto trial = ZeroTrial();
|
||||||
|
trial.rotation_vector = {{{0.12, -0.05, 0.0},
|
||||||
|
{-0.02, 0.13, 0.0},
|
||||||
|
{-0.12, 0.05, 0.0},
|
||||||
|
{0.02, -0.13, 0.0}}};
|
||||||
|
for (const double thickness : {0.2, 0.5, 2.0}) {
|
||||||
|
SCOPED_TRACE(thickness);
|
||||||
|
auto section = Section();
|
||||||
|
section.thickness = thickness;
|
||||||
|
const auto shell = fesa::NonlinearMitc4Shell::Create(
|
||||||
|
NodePointers(nodes), Frames(), section, Material());
|
||||||
|
ASSERT_TRUE(shell.HasValue());
|
||||||
|
const auto recovery = shell.Value().RecoverState(trial);
|
||||||
|
ASSERT_TRUE(recovery.HasValue());
|
||||||
|
for (const auto& point : recovery.Value().gauss_points) {
|
||||||
|
for (std::size_t component = 0U; component < 3U; ++component) {
|
||||||
|
// Flat reference geometry gives quadratic stress in z. Its odd
|
||||||
|
// thickness moment is exact from independently sampled face stresses.
|
||||||
|
const double moment = thickness * thickness / 12.0 *
|
||||||
|
(point.stress[2U].components[component] -
|
||||||
|
point.stress[0U].components[component]);
|
||||||
|
ASSERT_GT(std::abs(moment), 0.0);
|
||||||
|
EXPECT_NEAR(point.section_resultant[3U + component], moment,
|
||||||
|
1.0e-12 * std::abs(moment));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// NSNR-ELEM-KIN-001A
|
// NSNR-ELEM-KIN-001A
|
||||||
TEST(NonlinearMitc4Shell, RejectsInvalidNodeAndInitialFrameContracts) {
|
TEST(NonlinearMitc4Shell, RejectsInvalidNodeAndInitialFrameContracts) {
|
||||||
const auto nodes = Nodes();
|
const auto nodes = Nodes();
|
||||||
|
|||||||
Reference in New Issue
Block a user