From 092304abaef1236ca19c5e98e3d2af49861710bf Mon Sep 17 00:00:00 2001
From: ludovic noels <l.noels@ulg.ac.be>
Date: Sun, 4 Jun 2023 18:55:56 +0200
Subject: [PATCH] add energy integral

---
 .../materialLaw/mlawHyperelastic.cpp          | 51 +++++++++++++------
 .../materialLaw/mlawHyperelastic.h            |  4 +-
 2 files changed, 37 insertions(+), 18 deletions(-)

diff --git a/NonLinearSolver/materialLaw/mlawHyperelastic.cpp b/NonLinearSolver/materialLaw/mlawHyperelastic.cpp
index 50a6486a3..ec66346a5 100644
--- a/NonLinearSolver/materialLaw/mlawHyperelastic.cpp
+++ b/NonLinearSolver/materialLaw/mlawHyperelastic.cpp
@@ -98,7 +98,7 @@ void mlawHyperViscoElastic::setViscoElasticData(const std::string filename){
   fclose(file);
 };
 
-void mlawHyperViscoElastic::evaluatePhiPCorrection(double tr, const STensor3 &dev, double &A_v, double &dA_vdE, double &B_d, STensor3 &dB_vddev) const
+void mlawHyperViscoElastic::evaluatePhiPCorrection(double tr, const STensor3 &dev, double &A_v, double &dA_vdE, double &intA, double &B_d, STensor3 &dB_vddev, double &intB) const
 {
   int method =1;
   if(method ==0)
@@ -114,18 +114,37 @@ void mlawHyperViscoElastic::evaluatePhiPCorrection(double tr, const STensor3 &de
  
     dB_vddev=dev;
     dB_vddev*=2.*getPiDevCorrection()*getDevCorrection()*pow(exp(getThetaDevCorrection()*dev.dotprod())-1.,getPiDevCorrection()-1.)* exp(getThetaDevCorrection()*dev.dotprod())*getThetaDevCorrection();
+    Msg::Error("mlawHyperViscoElastic::evaluatePhiPCorrection: need to evaluate the volume energy");
   }
   else
   {
     A_v = getVolumeCorrection()*(tanh(getXiVolumeCorrection()/3.*tr*tr-getZetaVolumeCorrection())+tanh(getZetaVolumeCorrection()));  
     dA_vdE = getVolumeCorrection()*getXiVolumeCorrection()*2./3.*(1.-tanh(getXiVolumeCorrection()/3.*tr*tr-getZetaVolumeCorrection())*tanh(getXiVolumeCorrection()/3.*tr*tr-getZetaVolumeCorrection()));
   
+    intA=0.;
+    if (getXiVolumeCorrection()!=0.)
+    {
+      double u=tr*tr;
+      intA=0.5*getVolumeCorrection()*(3./getXiVolumeCorrection()*(log(cosh(getXiVolumeCorrection()/3.*u-getZetaVolumeCorrection())) -log(cosh(-getZetaVolumeCorrection())) ) +tanh(getZetaVolumeCorrection())*u ) ;
+    
+    }
   
     B_d = getDevCorrection()*(tanh(getThetaDevCorrection()*dev.dotprod()-getPiDevCorrection())+tanh(getPiDevCorrection()));
     STensorOperation::zero(dB_vddev);
  
     dB_vddev=dev;
     dB_vddev*=2.*getPiDevCorrection()*getDevCorrection()*(1.-tanh(getThetaDevCorrection()*dev.dotprod()-getPiDevCorrection())*tanh(getThetaDevCorrection()*dev.dotprod()-getPiDevCorrection()) );
+    intB=0.;
+    if(getThetaDevCorrection()!=0)
+    {
+      double u=dev.dotprod();
+      intB=0.5*getDevCorrection()*(1./getThetaDevCorrection()*(log(cosh(getThetaDevCorrection()*u-getPiDevCorrection())) -log(cosh(-getPiDevCorrection())) ) +tanh(getPiDevCorrection())*u ) ;
+    
+    }
+    
+    
+    
+    
     
   }
 }
@@ -140,10 +159,10 @@ double mlawHyperViscoElastic::deformationEnergy(const IPHyperViscoElastic& q) co
     static STensor3 devEe;
     STensorOperation::decomposeDevTr(q._Ee,devEe,trEe);
     
-    double Av, dAv,B_d;
+    double Av, dAv,B_d, intA,intB;
     static STensor3 dB_d;
-    evaluatePhiPCorrection(trEe, devEe, Av, dAv, B_d, dB_d);
-    Psy = getUpdatedBulkModulus(&q)*(1.+Av)*(0.5*trEe*trEe)+getUpdatedShearModulus(&q)*(1.+B_d)*STensorOperation::doubledot(devEe,devEe); //this is not correct we should do an integral
+    evaluatePhiPCorrection(trEe, devEe, Av, dAv, intA, B_d, dB_d, intB);
+    Psy = getUpdatedBulkModulus(&q)*(0.5*trEe*trEe+intA)+2.*getUpdatedShearModulus(&q)*(0.5*STensorOperation::doubledot(devEe,devEe)+intB); //this is not correct we should do an integral
 																// 
 																//    
     for (int i=0; i<_N; i++){
@@ -417,7 +436,7 @@ void mlawHyperViscoElastic::updateViscoElasticFlow(const IPHyperViscoElastic *q0
 };
 void mlawHyperViscoElastic::viscoElasticPredictor(const STensor3& Ee, const STensor3& Ee0,
           const IPHyperViscoElastic *q0, IPHyperViscoElastic *q1,
-          double& Ke, double& Ge,     double& A_v,  double& B_d, double& dApr, STensor3& dB_vddev) const{
+          double& Ke, double& Ge,     double& A_v,  double& B_d, double& dApr, STensor3& dB_vddev, double &intA, double &intB) const{
   if ((_Ki.size() > 0) or (_Gi.size() > 0)){
     static STensor3 DE, devDE;
     static double trDE;
@@ -455,7 +474,7 @@ void mlawHyperViscoElastic::viscoElasticPredictor(const STensor3& Ee, const STen
       double p, trEe;
       STensorOperation::decomposeDevTr(Ee,devE,trEe);
 
-      evaluatePhiPCorrection(trEe, devE, A_v, dApr, B_d, dB_vddev);
+      evaluatePhiPCorrection(trEe, devE, A_v, dApr, intA, B_d, dB_vddev, intB);
 
       devK = devE;
       devK *= (2.*getUpdatedShearModulus(q1)*(1.+B_d));  // deviatoric part
@@ -547,7 +566,7 @@ void mlawHyperViscoElastic::viscoElasticPredictor(const STensor3& Ee, const STen
     STensorOperation::decomposeDevTr(Ee,devE,trEe);
 
     STensorOperation::zero(dB_vddev);
-    evaluatePhiPCorrection(trEe, devE, A_v, dApr, B_d, dB_vddev);
+    evaluatePhiPCorrection(trEe, devE, A_v, dApr, intA, B_d, dB_vddev, intB);
             
     devK = devE;
     devK *= (2.*getUpdatedShearModulus(q1)*(1.+B_d));  // deviatoric part
@@ -602,10 +621,10 @@ void mlawHyperViscoElastic::predictorCorrector_ViscoElastic(const STensor3& F0,
   STensorOperation::decomposeDevTr(E,devE,trE);
   
   double Ke, Ge;
-  double A_v_pr=0., B_d_pr = 0., dApr=0.;
+  double A_v_pr=0., B_d_pr = 0., dApr=0., intApr=0., intBpr=0.;
   static STensor3 dB_devpr;
   STensorOperation::zero(dB_devpr);
-  viscoElasticPredictor(E,q0->_Ee,q0,q1,Ke,Ge,A_v_pr, B_d_pr, dApr, dB_devpr);
+  viscoElasticPredictor(E,q0->_Ee,q0,q1,Ke,Ge,A_v_pr, B_d_pr, dApr, dB_devpr,intApr,intBpr);
 
   const STensor3& corKir = q1->getConstRefToCorotationalKirchhoffStress();
   static STensor3 secondPK;
@@ -894,10 +913,10 @@ void mlawPowerYieldHyper::predictorCorrector_nonAssociatedFlow(const STensor3& F
   
   
   
-  double A_v_pr, B_d_pr, dApr;
+  double A_v_pr=0., B_d_pr=0., dApr=0.,intApr=0.,intBpr=0.;
   static STensor3 dB_devpr;
   STensorOperation::zero(dB_devpr);
-  viscoElasticPredictor(Ee,q0->_Ee,q0,q1,Ke,Ge,A_v_pr, B_d_pr, dApr, dB_devpr);
+  viscoElasticPredictor(Ee,q0->_Ee,q0,q1,Ke,Ge,A_v_pr, B_d_pr, dApr, dB_devpr, intApr, intBpr);
   
   STensorOperation::decomposeDevTr(Ee,devEepr,trEepr); 
   //std::cout << "trEepr = "<<trEepr <<std::endl;
@@ -980,7 +999,7 @@ void mlawPowerYieldHyper::predictorCorrector_nonAssociatedFlow(const STensor3& F
   
   double A_v=0.;
   double B_d = 0.;
-  double dAdtrEe=0.;
+  double dAdtrEe=0., intA=0., intB=0.;
   static STensor3 dBddevEe;
   STensorOperation::zero(dBddevEe);
   
@@ -1078,7 +1097,7 @@ void mlawPowerYieldHyper::predictorCorrector_nonAssociatedFlow(const STensor3& F
   
         while (1){
 
-        	evaluatePhiPCorrection(trEe, devEe, A_v, dAdtrEe, B_d, dBddevEe);
+        	evaluatePhiPCorrection(trEe, devEe, A_v, dAdtrEe, intA, B_d, dBddevEe, intB);
         	J=getUpdatedBulkModulus(q1)*A_v*trEe-ptilde_Vol;
         	dJdptilde_Vol = getUpdatedBulkModulus(q1)*( dAdtrEe*dtrEedptilde*trEe+A_v*dtrEedptilde)-1.;
        
@@ -1121,7 +1140,7 @@ void mlawPowerYieldHyper::predictorCorrector_nonAssociatedFlow(const STensor3& F
           
         while (1){
   
-          	evaluatePhiPCorrection(trEe, devEe, A_v, dAdtrEe, B_d, dBddevEe);
+          	evaluatePhiPCorrection(trEe, devEe, A_v, dAdtrEe, intA, B_d, dBddevEe, intB);
 
                 for (int i=0; i<3; i++){
         	        for (int j=0; j<3; j++){
@@ -1735,10 +1754,10 @@ void mlawPowerYieldHyper::predictorCorrector_associatedFlow(const STensor3& F, c
   
   
   
-  double A_v_pr=0., B_d_pr = 0., dApr=0.;
+  double A_v_pr=0., B_d_pr = 0., dApr=0., intApr=0., intBpr=0.;
   static STensor3 dB_devpr;
   STensorOperation::zero(dB_devpr);
-  viscoElasticPredictor(Ee,q0->_Ee,q0,q1,Ke,Ge,A_v_pr, B_d_pr, dApr, dB_devpr);
+  viscoElasticPredictor(Ee,q0->_Ee,q0,q1,Ke,Ge,A_v_pr, B_d_pr, dApr, dB_devpr, intApr, intBpr);
 
   static STensor3 devKpr; // dev corotational kirchoff stress predictor
   static double ppr; // pressure predictor
diff --git a/NonLinearSolver/materialLaw/mlawHyperelastic.h b/NonLinearSolver/materialLaw/mlawHyperelastic.h
index 4118280b8..08d5d5531 100644
--- a/NonLinearSolver/materialLaw/mlawHyperelastic.h
+++ b/NonLinearSolver/materialLaw/mlawHyperelastic.h
@@ -59,14 +59,14 @@ class mlawHyperViscoElastic : public materialLaw{
     void updateViscoElasticFlow(const IPHyperViscoElastic *q0, IPHyperViscoElastic *q1, double& Ke, double& Ge) const;
     void viscoElasticPredictor(const STensor3& Ee, const STensor3& Ee0,
               const IPHyperViscoElastic *q0, IPHyperViscoElastic *q1,
-              double& Ke, double& Ge,     double& A_v,  double& B_d, double& dAprd, STensor3& dB_vddev) const;
+              double& Ke, double& Ge,     double& A_v,  double& B_d, double& dAprd, STensor3& dB_vddev, double &intA, double &intB) const;
 
     void isotropicHookTensor(const double K, const double G, STensor43& L) const;
 
     void predictorCorrector_ViscoElastic(const STensor3& F0, const STensor3& F, STensor3&P, const IPHyperViscoElastic *q0_, IPHyperViscoElastic *q1,
                                   const bool stiff, STensor43& Tangent) const;
 
-    void evaluatePhiPCorrection(double trEe, const STensor3 &devEpr,  double &A_v, double &dAprdEepr, double &B_d, STensor3 &dB_vddevEe) const;
+    void evaluatePhiPCorrection(double trEe, const STensor3 &devEpr,  double &A_v, double &dAprdEepr, double &intA, double &B_d, STensor3 &dB_vddevEe, double &intB) const;
     //void evaluateA_dA(double trEe, double &A_v, double &dAprdEepr) const;
     
   #endif // SWIG
-- 
GitLab