Skip to content

Commit a0acf2a

Browse files
committed
Merge branch 'master' of https://github.com/sofa-framework/sofa
2 parents d304fbe + 96696fb commit a0acf2a

File tree

1 file changed

+7
-9
lines changed
  • Sofa/Component/SolidMechanics/FEM/HyperElastic/src/sofa/component/solidmechanics/fem/hyperelastic/material

1 file changed

+7
-9
lines changed

Sofa/Component/SolidMechanics/FEM/HyperElastic/src/sofa/component/solidmechanics/fem/hyperelastic/material/Ogden.h

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,7 @@ class Ogden: public HyperelasticMaterial<DataTypes>
6666
const MaterialParameters<DataTypes>& param)
6767
{
6868
const MatrixSym& C = sinfo->deformationTensor;
69-
const Real mu1 = param.parameterArray[0];
7069
const Real alpha1 = param.parameterArray[1];
71-
const Real k0 = param.parameterArray[2];
7270

7371
m_FJ = pow(sinfo->J, -alpha1/static_cast<Real>(3));
7472
m_logJ = log(sinfo->J);
@@ -79,17 +77,16 @@ class Ogden: public HyperelasticMaterial<DataTypes>
7977
for (sofa::Index j = 0; j < 3; ++j)
8078
CEigen(i, j) = C[MatrixSym::voigtID(i, j)];
8179

82-
// 17/11/2025: Disable /*Eigen::SelfAdjointEigenSolver<EigenMatrix>*/
83-
// due to incorrect eigenvector computation for 3x3 matrices.
84-
Eigen::EigenSolver<Eigen::Matrix<Real, 3, 3> > EigenProblemSolver(CEigen, true);
80+
Eigen::SelfAdjointEigenSolver<Eigen::Matrix<Real,3,3> >
81+
EigenProblemSolver(CEigen, Eigen::ComputeEigenvectors);
8582
if (EigenProblemSolver.info() != Eigen::Success)
8683
{
8784
dmsg_warning("Ogden") << "EigenSolver iterations failed to converge";
8885
return;
8986
}
9087

91-
sinfo->Evalue = EigenProblemSolver.eigenvalues().real().eval();
92-
sinfo->Evect = EigenProblemSolver.eigenvectors().real().eval();
88+
sinfo->Evalue = EigenProblemSolver.eigenvalues();
89+
sinfo->Evect = EigenProblemSolver.eigenvectors();
9390

9491
const Real aBy2{alpha1/static_cast<Real>(2)};
9592
m_trCaBy2 = static_cast<Real>(0);
@@ -194,8 +191,9 @@ class Ogden: public HyperelasticMaterial<DataTypes>
194191
{
195192
if (eJ == eI) continue;
196193

197-
const bool isDegenerate = std::fabs(Evalue[eI] - Evalue[eJ]) <
198-
std::numeric_limits<Real>::epsilon();
194+
constexpr Real tol = static_cast<Real>(1e-8);
195+
const Real maxEval = std::max(std::fabs(Evalue[eI]), std::fabs(Evalue[eJ]));
196+
const bool isDegenerate = std::fabs(Evalue[eI] - Evalue[eJ]) < maxEval * tol;
199197
const Real coefRot = isDegenerate
200198
? aBy2Minus1 * evalPowI2
201199
: (evalPowI - pow(Evalue[eJ], aBy2Minus1))/(Evalue[eI] - Evalue[eJ]);

0 commit comments

Comments
 (0)