Skip to content

Commit 39bec93

Browse files
committed
[HyperElastic] Clean up in the getStrainEnergy function
1 parent b9a69ac commit 39bec93

File tree

1 file changed

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

1 file changed

+23
-16
lines changed

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

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -61,15 +61,20 @@ class Ogden: public HyperelasticMaterial<DataTypes>
6161

6262
Real getStrainEnergy(StrainInformation<DataTypes> *sinfo, const MaterialParameters<DataTypes> &param) override
6363
{
64-
MatrixSym C=sinfo->deformationTensor;
65-
Real k0=param.parameterArray[0];
66-
Real mu1=param.parameterArray[1];
67-
Real alpha1=param.parameterArray[2];
68-
Real fj= (Real)(pow(sinfo->J,(Real)(-alpha1/3.0)));
69-
Eigen::Matrix<Real,3,3> CEigen;
64+
const MatrixSym& C = sinfo->deformationTensor;
65+
const Real k0 = param.parameterArray[0];
66+
const Real mu1 = param.parameterArray[1];
67+
const Real alpha1 = param.parameterArray[2];
68+
const Real fj = pow(sinfo->J, -alpha1/3_sreal);
69+
const Real logJSqr = pow(log(sinfo->J), 2_sreal);
70+
71+
// Solve eigen problem for C
72+
Eigen::Matrix<Real, 3, 3> CEigen;
7073
CEigen(0,0)=C[0]; CEigen(0,1)=C[1]; CEigen(1,0)=C[1]; CEigen(1,1)=C[2];
7174
CEigen(1,2)=C[4]; CEigen(2,1)=C[4]; CEigen(2,0)=C[3]; CEigen(0,2)=C[3]; CEigen(2,2)=C[5];
72-
/*Eigen::SelfAdjointEigenSolver<EigenMatrix>*/Eigen::EigenSolver<Eigen::Matrix<Real, 3, 3> > EigenProblemSolver(CEigen,true);
75+
76+
// Disable temporarilly until fixed /*Eigen::SelfAdjointEigenSolver<EigenMatrix>*/
77+
Eigen::EigenSolver<Eigen::Matrix<Real, 3, 3> > EigenProblemSolver(CEigen, true);
7378
if (EigenProblemSolver.info() != Eigen::Success)
7479
{
7580
dmsg_warning("Ogden") << "EigenSolver iterations failed to converge";
@@ -78,14 +83,15 @@ class Ogden: public HyperelasticMaterial<DataTypes>
7883
sinfo->Evalue = EigenProblemSolver.eigenvalues().real();
7984
sinfo->Evect = EigenProblemSolver.eigenvectors().real();
8085

81-
//Real val=pow(sinfo->Evalue[0],alpha1/(Real)2)+pow(sinfo->Evalue[1],alpha1/(Real)2)+pow(sinfo->Evalue[2],alpha1/(Real)2);
82-
//return (Real)fj*val*mu1/(alpha1*alpha1)+k0*log(sinfo->J)*log(sinfo->J)/(Real)2.0-(Real)3.0*mu1/(alpha1*alpha1);
83-
Real trCalpha2 = pow(sinfo->Evalue[0], alpha1 / 2_sreal) +
84-
pow(sinfo->Evalue[1], alpha1 / 2_sreal) +
85-
pow(sinfo->Evalue[2], alpha1 / 2_sreal);
86-
return fj * mu1 / (alpha1 * alpha1) * trCalpha2
87-
- 3_sreal * mu1 / (alpha1 * alpha1)
88-
+ k0 * log(sinfo->J) * log(sinfo->J) / 2_sreal;
86+
// trace of C^(alpha1/2)
87+
const Real aBy2 = alpha1*0.5_sreal;
88+
const Real trCaBy2 = pow(sinfo->Evalue[0], aBy2) +
89+
pow(sinfo->Evalue[1], aBy2) +
90+
pow(sinfo->Evalue[2], aBy2);
91+
92+
const Real muByAlphaSqr = mu1 / (alpha1*alpha1);
93+
94+
return fj*muByAlphaSqr*trCaBy2 - 3_sreal*muByAlphaSqr + k0*logJSqr/2_sreal;
8995
}
9096

9197
void deriveSPKTensor(StrainInformation<DataTypes> *sinfo, const MaterialParameters<DataTypes> &param,MatrixSym &SPKTensorGeneral) override
@@ -98,7 +104,8 @@ class Ogden: public HyperelasticMaterial<DataTypes>
98104
CEigen(0,0)=C[0]; CEigen(0,1)=C[1]; CEigen(1,0)=C[1]; CEigen(1,1)=C[2]; CEigen(1,2)=C[4]; CEigen(2,1)=C[4];
99105
CEigen(2,0)=C[3]; CEigen(0,2)=C[3]; CEigen(2,2)=C[5];
100106

101-
/*Eigen::SelfAdjointEigenSolver<EigenMatrix>*/Eigen::EigenSolver<Eigen::Matrix<Real, 3, 3> > EigenProblemSolver(CEigen,true);
107+
/*Eigen::SelfAdjointEigenSolver<EigenMatrix>*/
108+
Eigen::EigenSolver<Eigen::Matrix<Real, 3, 3> > EigenProblemSolver(CEigen,true);
102109
if (EigenProblemSolver.info() != Eigen::Success)
103110
{
104111
dmsg_warning("Ogden") << "SelfAdjointEigenSolver iterations failed to converge";

0 commit comments

Comments
 (0)