fix(elements): retain Hex8 Green strain precision at small deformation

This commit is contained in:
KOKO\Mimi
2026-10-09 02:55:56 +09:00
parent 618dfa2c44
commit 7d1910361e
2 changed files with 47 additions and 5 deletions
+4 -5
View File
@@ -258,12 +258,11 @@ Result<Hex8Response> Hex8Element::Evaluate(const Vector& u,
Tensor strain{};
for (std::size_t i = 0; i < 3; ++i)
for (std::size_t j = 0; j < 3; ++j) {
if (nonlinear) {
strain[i][j] = 0.5 * (gradient[i][j] + gradient[j][i]);
// E = sym(H) + H^T*H/2 avoids subtracting I at tiny strain.
if (nonlinear)
for (std::size_t k = 0; k < 3; ++k)
strain[i][j] += 0.5 * f[k][i] * f[k][j];
if (i == j) strain[i][j] -= 0.5;
} else
strain[i][j] = 0.5 * (gradient[i][j] + gradient[j][i]);
strain[i][j] += 0.5 * gradient[k][i] * gradient[k][j];
}
const double trace = strain[0][0] + strain[1][1] + strain[2][2];
Tensor s{};