fix: evaluate linear Hex8 response relative to translation

This commit is contained in:
KOKO\Mimi
2026-10-09 02:13:40 +09:00
parent f68e4a4d85
commit ca806100c9
2 changed files with 57 additions and 2 deletions
+8 -2
View File
@@ -230,8 +230,14 @@ Result<Hex8Response> Hex8Element::Evaluate(const Vector& u,
if (!nonlinear) {
response.material_tangent = stiffness_;
response.tangent = stiffness_;
response.internal_force = stiffness_.Multiply(u);
response.strain_energy = 0.5 * u.Dot(response.internal_force);
// K0 annihilates uniform translation. Use the same relative field as
// strain recovery to avoid cancellation of a large rigid displacement.
Vector relative{24U};
for (std::size_t a = 0; a < 8; ++a)
for (std::size_t i = 0; i < 3; ++i)
relative[3U * a + i] = u[3U * a + i] - u[i];
response.internal_force = stiffness_.Multiply(relative);
response.strain_energy = 0.5 * relative.Dot(response.internal_force);
}
for (std::size_t g = 0; g < 8; ++g) {
const auto& point = points_[g];