feat(hex8): preserve full high-low state in dynamic element responses

This commit is contained in:
KOKO\Mimi
2026-10-09 23:46:42 +09:00
parent d8d06ae8ae
commit 5435acdde3
21 changed files with 1152 additions and 16 deletions
+22
View File
@@ -20,6 +20,16 @@ struct Hex8Response {
std::array<SolidIntegrationPointRow, 8> points{};
};
/// @brief Normalized full-state response for Solid HHT high+low arithmetic.
/// @note Point rows are rounded observables; forces, Hessian and energy retain
/// their low components until global assembly and physical validation.
struct Hex8HighLowResponse {
Hex8Response high;
Vector internal_force_low{24U};
Matrix tangent_low{24U, 24U};
double strain_energy_low{0.0};
};
/// @brief Implements full-integration C3D8 linear and TL StVK mechanics.
/// @note Reference geometry is owned and immutable; no trial is committed.
class Hex8Element final : public Element {
@@ -45,6 +55,15 @@ class Hex8Element final : public Element {
Result<Hex8Response> EvaluateLinear(const Vector& displacement) const;
/// @brief Returns one certified StVK trial and its analytic energy Hessian.
Result<Hex8Response> EvaluateNonlinear(const Vector& displacement) const;
/// @brief Evaluates linear energy/force/Hessian on the complete paired state.
/// @note Uses the same reference-relative gradient operator as the paired TL
/// path. Inputs must have 24 finite normalized high+low translations.
Result<Hex8HighLowResponse> EvaluateLinearHighLow(
const Vector& high, const Vector& low) const;
/// @brief Evaluates certified TL StVK mechanics without collapsing low state.
/// @note Failure preserves immutable reference data and all caller state.
Result<Hex8HighLowResponse> EvaluateNonlinearHighLow(
const Vector& high, const Vector& low) const;
/// @brief Returns the constant reference consistent mass; density required.
Result<ElementStiffnessContribution> ComputeMass() const;
/// @brief Returns immutable positive reference Gauss volume weights.
@@ -67,6 +86,9 @@ class Hex8Element final : public Element {
/// @brief Evaluates without mutating the cached reference or previous values.
Result<Hex8Response> Evaluate(const Vector& displacement,
bool nonlinear) const;
/// @brief Uses one paired gradient for energy, force and analytic Hessian.
Result<Hex8HighLowResponse> EvaluateHighLow(
const Vector& high, const Vector& low, bool nonlinear) const;
/// @brief Attaches stable source context to a model failure.
Status Failure(const char* message) const;