diff --git a/Sofa/Component/SolidMechanics/FEM/HyperElastic/src/sofa/component/solidmechanics/fem/hyperelastic/HyperelasticMaterial.h b/Sofa/Component/SolidMechanics/FEM/HyperElastic/src/sofa/component/solidmechanics/fem/hyperelastic/HyperelasticMaterial.h index c26ab32f1c8..97977cb18e1 100644 --- a/Sofa/Component/SolidMechanics/FEM/HyperElastic/src/sofa/component/solidmechanics/fem/hyperelastic/HyperelasticMaterial.h +++ b/Sofa/Component/SolidMechanics/FEM/HyperElastic/src/sofa/component/solidmechanics/fem/hyperelastic/HyperelasticMaterial.h @@ -22,10 +22,10 @@ #pragma once #include +#include #include #include #include -#include #if !defined(SOFA_COMPONENT_SOLIDMECHANICS_FEM_HYPERELASTIC_HYPERELASTIC_MATERIAL_CPP) #include @@ -35,10 +35,10 @@ namespace sofa::component::solidmechanics::fem::hyperelastic { template -class HyperelasticMaterial : public virtual sofa::core::objectmodel::BaseObject +class HyperelasticMaterial : public elastic::CauchyStressEvaluator { public: - SOFA_ABSTRACT_CLASS(HyperelasticMaterial, sofa::core::objectmodel::BaseObject); + SOFA_ABSTRACT_CLASS(HyperelasticMaterial, elastic::CauchyStressEvaluator); using DataTypes = TDataTypes; protected: @@ -49,6 +49,7 @@ class HyperelasticMaterial : public virtual sofa::core::objectmodel::BaseObject using DeformationGradient = sofa::type::Mat; using RightCauchyGreenTensor = sofa::type::Mat; using StressTensor = sofa::type::Mat; + using StressVoigtVector = typename elastic::CauchyStressEvaluator::StressVoigtVector; using ElasticityTensor = sofa::type::FullySymmetric4Tensor; using TangentModulus = MajorSymmetric4Tensor; @@ -71,6 +72,8 @@ class HyperelasticMaterial : public virtual sofa::core::objectmodel::BaseObject */ virtual TangentModulus materialTangentModulus(Strain& strain) = 0; + StressVoigtVector computeStress(const DeformationGradient& F, sofa::Size elementId) override; + }; #if !defined(SOFA_COMPONENT_SOLIDMECHANICS_FEM_HYPERELASTIC_HYPERELASTIC_MATERIAL_CPP) diff --git a/Sofa/Component/SolidMechanics/FEM/HyperElastic/src/sofa/component/solidmechanics/fem/hyperelastic/HyperelasticMaterial.inl b/Sofa/Component/SolidMechanics/FEM/HyperElastic/src/sofa/component/solidmechanics/fem/hyperelastic/HyperelasticMaterial.inl index 225513ef0c0..28024c3ece2 100644 --- a/Sofa/Component/SolidMechanics/FEM/HyperElastic/src/sofa/component/solidmechanics/fem/hyperelastic/HyperelasticMaterial.inl +++ b/Sofa/Component/SolidMechanics/FEM/HyperElastic/src/sofa/component/solidmechanics/fem/hyperelastic/HyperelasticMaterial.inl @@ -36,4 +36,25 @@ void HyperelasticMaterial::init() } } +template +auto HyperelasticMaterial::computeStress(const DeformationGradient& F, sofa::Size elementId) -> StressVoigtVector +{ + SOFA_UNUSED(elementId); + + Strain strain(deformationGradient, F); + const auto P = this->firstPiolaKirchhoffStress(strain); + const auto J = strain.getDeterminantDeformationGradient(); + assert(std::abs(J) > std::numeric_limits::epsilon()); + const auto sigma = (static_cast(1)/J) * P * F.transposed(); + + StressVoigtVector stressVoigt; + for (sofa::Size i = 0; i < type::NumberOfIndependentElements; ++i) + { + const auto [p, q] = type::toTensorIndices(i); + stressVoigt[i] = (p == q) ? sigma(p, q) : static_cast(0.5) * (sigma(p, q) + sigma(q, p)); + } + + return stressVoigt; +} + } // namespace elasticity diff --git a/examples/Validation/cantilever_beam/hexahedron/svk/parallel/assembled/HyperelasticityFEMForceField.scn b/examples/Validation/cantilever_beam/hexahedron/svk/parallel/assembled/HyperelasticityFEMForceField.scn index 48cb648f56b..c3c42c9282e 100644 --- a/examples/Validation/cantilever_beam/hexahedron/svk/parallel/assembled/HyperelasticityFEMForceField.scn +++ b/examples/Validation/cantilever_beam/hexahedron/svk/parallel/assembled/HyperelasticityFEMForceField.scn @@ -9,4 +9,6 @@ + diff --git a/examples/Validation/cantilever_beam/hexahedron/svk/parallel/matrixfree/HyperelasticityFEMForceField.scn b/examples/Validation/cantilever_beam/hexahedron/svk/parallel/matrixfree/HyperelasticityFEMForceField.scn index 75bbfd8107b..15d033377d5 100644 --- a/examples/Validation/cantilever_beam/hexahedron/svk/parallel/matrixfree/HyperelasticityFEMForceField.scn +++ b/examples/Validation/cantilever_beam/hexahedron/svk/parallel/matrixfree/HyperelasticityFEMForceField.scn @@ -7,5 +7,7 @@ + diff --git a/examples/Validation/cantilever_beam/hexahedron/svk/sequential/assembled/HyperelasticityFEMForceField.scn b/examples/Validation/cantilever_beam/hexahedron/svk/sequential/assembled/HyperelasticityFEMForceField.scn index 4f8e213cf4f..05a5f17f283 100644 --- a/examples/Validation/cantilever_beam/hexahedron/svk/sequential/assembled/HyperelasticityFEMForceField.scn +++ b/examples/Validation/cantilever_beam/hexahedron/svk/sequential/assembled/HyperelasticityFEMForceField.scn @@ -9,5 +9,7 @@ + diff --git a/examples/Validation/cantilever_beam/hexahedron/svk/sequential/matrixfree/HyperelasticityFEMForceField.scn b/examples/Validation/cantilever_beam/hexahedron/svk/sequential/matrixfree/HyperelasticityFEMForceField.scn index 26d221c61b8..605d7a5dc8e 100644 --- a/examples/Validation/cantilever_beam/hexahedron/svk/sequential/matrixfree/HyperelasticityFEMForceField.scn +++ b/examples/Validation/cantilever_beam/hexahedron/svk/sequential/matrixfree/HyperelasticityFEMForceField.scn @@ -7,5 +7,7 @@ + diff --git a/examples/Validation/cantilever_beam/tetrahedron/svk/parallel/assembled/HyperelasticityFEMForceField.scn b/examples/Validation/cantilever_beam/tetrahedron/svk/parallel/assembled/HyperelasticityFEMForceField.scn index 2d7cbda3f67..da1a835e7c7 100644 --- a/examples/Validation/cantilever_beam/tetrahedron/svk/parallel/assembled/HyperelasticityFEMForceField.scn +++ b/examples/Validation/cantilever_beam/tetrahedron/svk/parallel/assembled/HyperelasticityFEMForceField.scn @@ -15,6 +15,8 @@ + diff --git a/examples/Validation/cantilever_beam/tetrahedron/svk/parallel/matrixfree/HyperelasticityFEMForceField.scn b/examples/Validation/cantilever_beam/tetrahedron/svk/parallel/matrixfree/HyperelasticityFEMForceField.scn index 8234a43ee78..de09dd05590 100644 --- a/examples/Validation/cantilever_beam/tetrahedron/svk/parallel/matrixfree/HyperelasticityFEMForceField.scn +++ b/examples/Validation/cantilever_beam/tetrahedron/svk/parallel/matrixfree/HyperelasticityFEMForceField.scn @@ -13,6 +13,8 @@ + diff --git a/examples/Validation/cantilever_beam/tetrahedron/svk/sequential/assembled/HyperelasticityFEMForceField.scn b/examples/Validation/cantilever_beam/tetrahedron/svk/sequential/assembled/HyperelasticityFEMForceField.scn index 1228b5a5f02..ba9a86c134a 100644 --- a/examples/Validation/cantilever_beam/tetrahedron/svk/sequential/assembled/HyperelasticityFEMForceField.scn +++ b/examples/Validation/cantilever_beam/tetrahedron/svk/sequential/assembled/HyperelasticityFEMForceField.scn @@ -15,6 +15,8 @@ + diff --git a/examples/Validation/cantilever_beam/tetrahedron/svk/sequential/matrixfree/HyperelasticityFEMForceField.scn b/examples/Validation/cantilever_beam/tetrahedron/svk/sequential/matrixfree/HyperelasticityFEMForceField.scn index 02886d334dd..6b768ed067d 100644 --- a/examples/Validation/cantilever_beam/tetrahedron/svk/sequential/matrixfree/HyperelasticityFEMForceField.scn +++ b/examples/Validation/cantilever_beam/tetrahedron/svk/sequential/matrixfree/HyperelasticityFEMForceField.scn @@ -13,6 +13,8 @@ +