diff --git a/dG3D/src/dG3DIPVariable.cpp b/dG3D/src/dG3DIPVariable.cpp
index d29ab2917974a60884fe98ee77b294444df88f43..e76b8f55d3f9219b7f298c4fe1f5912926477629 100644
--- a/dG3D/src/dG3DIPVariable.cpp
+++ b/dG3D/src/dG3DIPVariable.cpp
@@ -2303,7 +2303,7 @@ double StochDMNDG3DIPVariable::damageEnergy() const
 
 // Overloading for handling additional params at GP @Mohib
 torchANNBasedDG3DIPVariable::torchANNBasedDG3DIPVariable(const int n, const double initial_h, const bool createBodyForceHO, const bool oninter, const int extraInput, const std::vector<double> initialValue_Extra):
-        dG3DIPVariable(createBodyForceHO, oninter), _n(n), _initial_h(initial_h), restart_internalVars(1,n), _kinematicVariables(1,6), _extraVariables(1, extraInput)
+        dG3DIPVariable(createBodyForceHO, oninter), _n(n), _initial_h(initial_h), _kinematicVariables(1,6), _extraVariables(1, extraInput)
 {
 #if defined(HAVE_TORCH)
     _internalVars = _initial_h*torch::ones({1, 1, _n});
@@ -2324,7 +2324,12 @@ torchANNBasedDG3DIPVariable& torchANNBasedDG3DIPVariable::operator =(const IPVar
   const torchANNBasedDG3DIPVariable* psrc = dynamic_cast<const torchANNBasedDG3DIPVariable*>(&src);
   if (psrc!=NULL)
   {
-    _internalVars = psrc->_internalVars;
+    //_internalVars = psrc->_internalVars;
+    
+    auto Vars_a = _internalVars.accessor<float,3>();
+    auto psrc_Vars_a = psrc->_internalVars.accessor<float,3>(); 
+    for(int i=0;i<_n;i++) Vars_a[0][0][i] = psrc_Vars_a[0][0][i];
+
     _kinematicVariables = psrc->_kinematicVariables;
     _extraVariables = psrc->_extraVariables; // Include extra parameters at GP when using overloaded(=) @Mohib
   }
@@ -2340,12 +2345,13 @@ void torchANNBasedDG3DIPVariable::restart()
 #if defined(HAVE_TORCH)
   auto Vars_a = _internalVars.accessor<float,3>();
   
+  fullMatrix<double> restart_internalVars(1,_n); // internal variable
   for(int i=0;i<_n;i++) restart_internalVars(0,i) = Vars_a[0][0][i];
   
   dG3DIPVariable::restart();
   restartManager::restart(restart_internalVars.getDataPtr(),restart_internalVars.size1()*restart_internalVars.size2());
   restartManager::restart(_kinematicVariables.getDataPtr(),_kinematicVariables.size1()*_kinematicVariables.size2());
-  for(int i=0;i<_n;i++) _internalVars[0][0][i] = restart_internalVars(0,i);
+  for(int i=0;i<_n;i++) Vars_a[0][0][i] = restart_internalVars(0,i);
 #else
   Msg::Error("NOT COMPILED WITH TORCH");
 #endif
diff --git a/dG3D/src/dG3DIPVariable.h b/dG3D/src/dG3DIPVariable.h
index 492538adbaccafc523676ca0d47f9612fb1115ba..2841cb2e5942766f9dbca938520e6f61219e7212 100644
--- a/dG3D/src/dG3DIPVariable.h
+++ b/dG3D/src/dG3DIPVariable.h
@@ -2449,7 +2449,6 @@ class torchANNBasedDG3DIPVariable :public dG3DIPVariable
     double _internalVars;
 #endif
     fullMatrix<double> _kinematicVariables; // kinematic variable
-    fullMatrix<double> restart_internalVars; // internal variable
     fullMatrix<double> _extraVariables; // variables other than kinematic and hidden needed at GP @Mohib
 
   public:
diff --git a/dG3D/src/nonLocalDamageDG3DIPVariable.cpp b/dG3D/src/nonLocalDamageDG3DIPVariable.cpp
index 5e559ed6b0a22a4eb79e110a629f16851702dc1e..d8103d4ce9947b15d6d618ac12a29af32b615041 100644
--- a/dG3D/src/nonLocalDamageDG3DIPVariable.cpp
+++ b/dG3D/src/nonLocalDamageDG3DIPVariable.cpp
@@ -281,11 +281,12 @@ void nonLocalDamageDG3DIPVariable::restart()
 /* Beginning IPvariable for nonlocalDamageTorchANNDG3DIPVariable*/
 nonLocalDamageTorchANNDG3DIPVariableDG3DIPVariable::nonLocalDamageTorchANNDG3DIPVariableDG3DIPVariable(const std::vector< CLengthLaw *> cll, const int n_stress, const int n_elTang, const int n_NonDamTang, const double initial_h, const int numNonlocal, const bool createBodyForceHO, const bool oninter):
       dG3DIPVariable(createBodyForceHO, oninter,numNonlocal), _n_stress(n_stress), _n_elTang(n_elTang), _n_NonDamTang(n_NonDamTang), _numNonlocal(numNonlocal), _initial_h(initial_h), _nlD(1,6), _D(1,6), _nlD36comp(6,6), _D36comp(6,6),
-      restart_internalVars_stress(1,n_stress), restart_internalVars_elTang(1,n_elTang), restart_internalVars_NonDamTang(1,n_NonDamTang), _kinematicVariables(1,6),   
+      _kinematicVariables(1,6),   
       _defoEnergy(0.), _plasticEnergy(0.), _damageEnergy(0.), _irreversibleEnergy(0.), _DirrEnergyDF(0.), _DirrEnergyDVar_nl0(0.), _DirrEnergyDVar_nl1(0.)
 
 {
     localVar.resize(numNonlocal,0.);
+    _DirrEnergyDVar_nl.resize(numNonlocal,0.);
     _ipMeca = NULL; 
 #if defined(HAVE_TORCH)
    _internalVars_stress = _initial_h*torch::ones({1, 1, _n_stress});
@@ -305,7 +306,7 @@ nonLocalDamageTorchANNDG3DIPVariableDG3DIPVariable::nonLocalDamageTorchANNDG3DIP
     _D(source._D), _nlD36comp(source._nlD36comp), 
     _D36comp(source._D36comp), _DTensor43(source._DTensor43), _nlDTensor43(source._nlDTensor43), localVar(source.localVar), _internalVars_stress(source._internalVars_stress), _internalVars_elTang(source._internalVars_elTang), _internalVars_NonDamTang(source._internalVars_NonDamTang), 
     _kinematicVariables(source._kinematicVariables),_irreversibleEnergy(source._irreversibleEnergy), _DirrEnergyDF(source._DirrEnergyDF),_DirrEnergyDVar_nl0(source._DirrEnergyDVar_nl0), _DirrEnergyDVar_nl1(source._DirrEnergyDVar_nl1), _plasticEnergy(source._plasticEnergy), 
-     _defoEnergy(source._defoEnergy), _damageEnergy(source._damageEnergy), _ipMeca(NULL)
+     _defoEnergy(source._defoEnergy), _damageEnergy(source._damageEnergy), _ipMeca(NULL), _DirrEnergyDVar_nl(source._DirrEnergyDVar_nl)
 
 {
   for( std::vector< IPCLength * > ::const_iterator it=source.ipvCL.begin(); it!=source.ipvCL.end(); it++)
@@ -335,9 +336,27 @@ nonLocalDamageTorchANNDG3DIPVariableDG3DIPVariable& nonLocalDamageTorchANNDG3DIP
   const nonLocalDamageTorchANNDG3DIPVariableDG3DIPVariable* psrc = dynamic_cast<const nonLocalDamageTorchANNDG3DIPVariableDG3DIPVariable*>(&src);
   if (psrc!=NULL)
   {
-    _internalVars_stress = psrc->_internalVars_stress;
-    _internalVars_elTang = psrc->_internalVars_elTang;
-    _internalVars_NonDamTang = psrc->_internalVars_NonDamTang;
+    //_internalVars_stress = psrc->_internalVars_stress;
+    //_internalVars_elTang = psrc->_internalVars_elTang;
+    //_internalVars_NonDamTang = psrc->_internalVars_NonDamTang;
+
+
+    auto Vars_a = _internalVars_stress.accessor<float,3>();
+    auto Vars_a_elTang = _internalVars_elTang.accessor<float,3>();
+    auto Vars_a_NonDamTang = _internalVars_NonDamTang.accessor<float,3>();
+
+
+    auto psrc_Vars_a = psrc->_internalVars_stress.accessor<float,3>(); 
+    auto psrc_Vars_a_elTang = psrc->_internalVars_elTang.accessor<float,3>();
+    auto psrc_Vars_a_NonDamTang = psrc->_internalVars_NonDamTang.accessor<float,3>();
+
+    for(int i=0;i<_n_stress;i++) Vars_a[0][0][i] = psrc_Vars_a[0][0][i];
+    for(int i=0;i<_n_elTang;i++) Vars_a_elTang[0][0][i] = psrc_Vars_a_elTang[0][0][i];
+    for(int i=0;i<_n_NonDamTang;i++) Vars_a_NonDamTang[0][0][i] = psrc_Vars_a_NonDamTang[0][0][i];
+
+
+
+
     _kinematicVariables = psrc->_kinematicVariables;
     
     _n_stress = psrc->_n_stress;
@@ -364,6 +383,7 @@ nonLocalDamageTorchANNDG3DIPVariableDG3DIPVariable& nonLocalDamageTorchANNDG3DIP
     _DirrEnergyDF = psrc -> _DirrEnergyDF; //added for energy-based path Following
     _DirrEnergyDVar_nl0 = psrc -> _DirrEnergyDVar_nl0; //added for energy-based path Following
     _DirrEnergyDVar_nl1 = psrc -> _DirrEnergyDVar_nl1; //added for energy-based path Following
+    _DirrEnergyDVar_nl = psrc -> _DirrEnergyDVar_nl;
 
     if(psrc->_ipMeca!=NULL)
     {
@@ -422,6 +442,9 @@ void nonLocalDamageTorchANNDG3DIPVariableDG3DIPVariable::restart()
   auto Vars_a = _internalVars_stress.accessor<float,3>();
   auto Vars_a_elTang = _internalVars_elTang.accessor<float,3>();
   auto Vars_a_NonDamTang = _internalVars_NonDamTang.accessor<float,3>();
+  fullMatrix<double> restart_internalVars_stress(1,_n_stress);
+  fullMatrix<double> restart_internalVars_elTang(1,_n_elTang); 
+  fullMatrix<double> restart_internalVars_NonDamTang(1,_n_NonDamTang);
   for(int i=0;i<_n_stress;i++) restart_internalVars_stress(0,i) = Vars_a[0][0][i];
   for(int i=0;i<_n_elTang;i++) restart_internalVars_elTang(0,i) = Vars_a_elTang[0][0][i];
   for(int i=0;i<_n_NonDamTang;i++) restart_internalVars_NonDamTang(0,i) = Vars_a_NonDamTang[0][0][i];
@@ -430,13 +453,17 @@ void nonLocalDamageTorchANNDG3DIPVariableDG3DIPVariable::restart()
   restartManager::restart(restart_internalVars_elTang.getDataPtr(),restart_internalVars_elTang.size1()*restart_internalVars_elTang.size2());
   restartManager::restart(restart_internalVars_NonDamTang.getDataPtr(),restart_internalVars_NonDamTang.size1()*restart_internalVars_NonDamTang.size2());
   restartManager::restart(_kinematicVariables.getDataPtr(),_kinematicVariables.size1()*_kinematicVariables.size2());
-  for(int i=0;i<_n_stress;i++) _internalVars_stress[0][0][i] = restart_internalVars_stress(0,i);
-  for(int i=0;i<_n_elTang;i++) _internalVars_elTang[0][0][i] = restart_internalVars_elTang(0,i);
-  for(int i=0;i<_n_NonDamTang;i++) _internalVars_NonDamTang[0][0][i] = restart_internalVars_NonDamTang(0,i);
+  //for(int i=0;i<_n_stress;i++) _internalVars_stress[0][0][i] = restart_internalVars_stress(0,i);
+  //for(int i=0;i<_n_elTang;i++) _internalVars_elTang[0][0][i] = restart_internalVars_elTang(0,i);
+  //for(int i=0;i<_n_NonDamTang;i++) _internalVars_NonDamTang[0][0][i] = restart_internalVars_NonDamTang(0,i);
+  for(int i=0;i<_n_stress;i++) Vars_a[0][0][i] = restart_internalVars_stress(0,i);
+  for(int i=0;i<_n_elTang;i++) Vars_a_elTang[0][0][i] = restart_internalVars_elTang(0,i);
+  for(int i=0;i<_n_NonDamTang;i++) Vars_a_NonDamTang[0][0][i] = restart_internalVars_NonDamTang(0,i);
+
   restartManager::restart(_nlD.getDataPtr(),_nlD.size1()*_nlD.size2());
   restartManager::restart(_D.getDataPtr(),_nlD.size1()*_nlD.size2());
-  restartManager::restart(_D36comp.getDataPtr(),_nlD36comp.size1()*_nlD36comp.size2());
-  restartManager::restart(_D36comp.getDataPtr(),_nlD36comp.size1()*_nlD36comp.size2());
+  restartManager::restart(_D36comp.getDataPtr(),_D36comp.size1()*_D36comp.size2());
+  restartManager::restart(_nlD36comp.getDataPtr(),_nlD36comp.size1()*_nlD36comp.size2());
   restartManager::restart(localVar);
   //plastic strain
   restartManager::restart(_Eplast);
@@ -444,9 +471,11 @@ void nonLocalDamageTorchANNDG3DIPVariableDG3DIPVariable::restart()
   restartManager::restart(_Eplastrec);
   //elastic stiffness without damage
   restartManager::restart(_Cel);
+  restartManager::restart(_DTensor43);
+  restartManager::restart(_nlDTensor43);
   restartManager::restart(_DS_nlDE);  //DStressreconstructedDStrain
   restartManager::restart(_DEplastDE); //DEplastDE
-  restartManager::restart(ipvCL);
+  //restartManager::restart(ipvCL);   //why do we have to remove it in restart? (the simulation when it is killed does not start again with this line)
   restartManager::restart(_irreversibleEnergy);  //added for energy-based path Following
   restartManager::restart(_DirrEnergyDF);  //added for energy-based path Following
   restartManager::restart(_DirrEnergyDVar_nl0);  //added for energy-based path Following
@@ -454,6 +483,7 @@ void nonLocalDamageTorchANNDG3DIPVariableDG3DIPVariable::restart()
   restartManager::restart(_defoEnergy);  //added for energy-based path Following
   restartManager::restart(_damageEnergy);  //added for energy-based path Following
   restartManager::restart(_plasticEnergy);  //added for energy-based path Following
+  restartManager::restart(_DirrEnergyDVar_nl);  //added for energy-based path Following
   _ipMeca->restart();
   
 #else
diff --git a/dG3D/src/nonLocalDamageDG3DIPVariable.h b/dG3D/src/nonLocalDamageDG3DIPVariable.h
index 0698499f0ffd5328ceb64f34c590f81c538d6945..d110afefb6447949b7da87ab754762fb9483d714 100644
--- a/dG3D/src/nonLocalDamageDG3DIPVariable.h
+++ b/dG3D/src/nonLocalDamageDG3DIPVariable.h
@@ -1611,8 +1611,10 @@ class nonLocalDamageTorchANNDG3DIPVariableDG3DIPVariable : public dG3DIPVariable
     double _damageEnergy;
     double _irreversibleEnergy;   //added for energy-based path Following
     STensor3 _DirrEnergyDF;       //added for energy-based path Following
-    double _DirrEnergyDVar_nl0;   //added for energy-based path Following
-    double _DirrEnergyDVar_nl1;   //added for energy-based path Following
+    double _DirrEnergyDVar_nl0;   //added for energy-based path Following, should be removed
+    double _DirrEnergyDVar_nl1;   //added for energy-based path Following, should be removed
+    
+    std::vector<double> _DirrEnergyDVar_nl; //added for energy-based path Following
     
     
     std::vector<double> localVar;
@@ -1630,9 +1632,6 @@ class nonLocalDamageTorchANNDG3DIPVariableDG3DIPVariable : public dG3DIPVariable
     double _internalVars_NonDamTang;
 #endif
     fullMatrix<double> _kinematicVariables; // kinematic variable
-    fullMatrix<double> restart_internalVars_stress; // internal variable
-    fullMatrix<double> restart_internalVars_elTang; // internal variable
-    fullMatrix<double> restart_internalVars_NonDamTang; // internal variable
 
   public:
     nonLocalDamageTorchANNDG3DIPVariableDG3DIPVariable(const std::vector< CLengthLaw *> cll, const int n_stress, const int n_elTang, const int n_NonDamTang, const double initial_h, const int numNonlocal, const bool createBodyForceHO, const bool oninter);
@@ -1738,8 +1737,24 @@ class nonLocalDamageTorchANNDG3DIPVariableDG3DIPVariable : public dG3DIPVariable
     virtual double & getRefToIrreversibleEnergy() {return _irreversibleEnergy;};   //added for energy-based path Following
     virtual const STensor3 & getConstRefToDIrreversibleEnergyDF() const {return _DirrEnergyDF;};   //added for energy-based path Following
     virtual STensor3 & getRefToDIrreversibleEnergyDF() {return _DirrEnergyDF;};   //added for energy-based path Following
-    virtual const double & getConstRefToDIrreversibleEnergyDNonLocalVariable(const int i) const {if (i==0){return _DirrEnergyDVar_nl0;} else {return _DirrEnergyDVar_nl1;};}   //added for energy-based path Following
-    virtual double & getRefToDIrreversibleEnergyDNonLocalVariable(const int i) {if (i==0){return _DirrEnergyDVar_nl0;} else {return _DirrEnergyDVar_nl1;};}   //added for energy-based path Following
+    //virtual const double & getConstRefToDIrreversibleEnergyDNonLocalVariable(const int i) const {if (i==0){return _DirrEnergyDVar_nl0;} else {return _DirrEnergyDVar_nl1;};}   //added for energy-based path Following, should be removed
+    //virtual double & getRefToDIrreversibleEnergyDNonLocalVariable(const int i) {if (i==0){return _DirrEnergyDVar_nl0;} else {return _DirrEnergyDVar_nl1;};}   //added for energy-based path Following, should be removed
+    virtual const double & getConstRefToDIrreversibleEnergyDNonLocalVariable(const int idex) const
+    {
+      if (idex>=_numNonlocal){
+        Msg::Error("Error in DIrreversibleEnergyDNonLocalVariable");  
+      }else{
+        return _DirrEnergyDVar_nl[idex];
+      };
+    } 
+    virtual double & getRefToDIrreversibleEnergyDNonLocalVariable(const int idex)
+    {
+      if (idex>=_numNonlocal){
+        Msg::Error("Error in DIrreversibleEnergyDNonLocalVariable");  
+      }else{
+        return _DirrEnergyDVar_nl[idex];
+      };
+    } 
     virtual double & getRefToPlasticEnergy() {return _plasticEnergy;};   //added for energy-based path Following
     virtual const double & getConstRefToPlasticEnergy() const {return _plasticEnergy;};   //added for energy-based path Following
     virtual double & getRefToDefoEnergy() {return _defoEnergy;};   //added for energy-based path Following
diff --git a/dG3D/src/nonLocalDamageDG3DMaterialLaw.cpp b/dG3D/src/nonLocalDamageDG3DMaterialLaw.cpp
index b3ddfaf094d9bdae53fcb92532b3ec61289db2b5..2c1310627d818527ac4b4cf8b71cb8d7b773de63 100644
--- a/dG3D/src/nonLocalDamageDG3DMaterialLaw.cpp
+++ b/dG3D/src/nonLocalDamageDG3DMaterialLaw.cpp
@@ -3494,8 +3494,12 @@ void NonlocalDamageTorchANNBasedDG3DMaterialLaw::stress(IPVariable* ipv, const I
     //end step 7.1
     
     //beginning step 7.2: we retrieve the plastic strain reconstructed
-    ipvcur->getRefToEplastrec()=Eplast_rec;
+  ipvcur->getRefToEplastrec()=Eplast_rec;
     //end step 7.2
+    
+    //beginning step 7.3: we retrieve the non local damage
+  ipvcur->getRefToNonLocalDamageTensor43()=D_rec;
+    //end step 7.3
   //end step 7
   
   //beginning step 8: we retrieve the computed values in the current internal variables
@@ -3508,8 +3512,12 @@ void NonlocalDamageTorchANNBasedDG3DMaterialLaw::stress(IPVariable* ipv, const I
     //end step 8.1
     
     //beginning step 8.1.5: we compute the derivatives even if we do not retrieve them yet
+    const STensor3& Eplast0 = ipvprev->getConstRefToEplast();
+    const STensor3& Eplast_rec0 = ipvprev->getConstRefToEplastrec();
     std::vector<STensor3> M(_numNonlocalVar);
     std::vector<STensor3> K(_numNonlocalVar);
+    std::vector<double> DplastEnergDNonLocalVar(_numNonlocalVar);   //for the energy-based path following
+    std::vector<double> DdefoEnergDNonLocalVar(_numNonlocalVar);   //for the energy-based path following
     int idx=0;
     if (_Id0000==1){
       for (int k=0;k<3;k++){
@@ -3523,6 +3531,14 @@ void NonlocalDamageTorchANNBasedDG3DMaterialLaw::stress(IPVariable* ipv, const I
           }
         }
       }
+      DplastEnergDNonLocalVar[idx]=0.;
+      DdefoEnergDNonLocalVar[idx]=0.;
+      for (int i=0;i<3;i++){
+        for (int j=0;j<3;j++){
+          DplastEnergDNonLocalVar[idx]+=M[idx](i,j)*(Eplast_rec(i,j)-Eplast_rec0(i,j));
+          DdefoEnergDNonLocalVar[idx]+=M[idx](i,j)*((E1Tensor(i,j)-E0Tensor(i,j))-(Eplast_rec(i,j)-Eplast_rec0(i,j)));
+        }
+      }
       idx+=1;
     }  
     if (_Id0100==1){
@@ -3537,6 +3553,14 @@ void NonlocalDamageTorchANNBasedDG3DMaterialLaw::stress(IPVariable* ipv, const I
           }
         }
       }
+      DplastEnergDNonLocalVar[idx]=0.;
+      DdefoEnergDNonLocalVar[idx]=0.;
+      for (int i=0;i<3;i++){
+        for (int j=0;j<3;j++){
+          DplastEnergDNonLocalVar[idx]+=M[idx](i,j)*(Eplast_rec(i,j)-Eplast_rec0(i,j));
+          DdefoEnergDNonLocalVar[idx]+=M[idx](i,j)*((E1Tensor(i,j)-E0Tensor(i,j))-(Eplast_rec(i,j)-Eplast_rec0(i,j)));
+        }
+      }
       idx+=1;
     }
     if (_Id0200==1){
@@ -3551,6 +3575,14 @@ void NonlocalDamageTorchANNBasedDG3DMaterialLaw::stress(IPVariable* ipv, const I
           }
         }
       }
+      DplastEnergDNonLocalVar[idx]=0.;
+      DdefoEnergDNonLocalVar[idx]=0.;
+      for (int i=0;i<3;i++){
+        for (int j=0;j<3;j++){
+          DplastEnergDNonLocalVar[idx]+=M[idx](i,j)*(Eplast_rec(i,j)-Eplast_rec0(i,j));
+          DdefoEnergDNonLocalVar[idx]+=M[idx](i,j)*((E1Tensor(i,j)-E0Tensor(i,j))-(Eplast_rec(i,j)-Eplast_rec0(i,j)));
+        }
+      }
       idx+=1;
     }  
     if (_Id1100==1){
@@ -3565,6 +3597,14 @@ void NonlocalDamageTorchANNBasedDG3DMaterialLaw::stress(IPVariable* ipv, const I
           }
         }
       }
+      DplastEnergDNonLocalVar[idx]=0.;
+      DdefoEnergDNonLocalVar[idx]=0.;
+      for (int i=0;i<3;i++){
+        for (int j=0;j<3;j++){
+          DplastEnergDNonLocalVar[idx]+=M[idx](i,j)*(Eplast_rec(i,j)-Eplast_rec0(i,j));
+          DdefoEnergDNonLocalVar[idx]+=M[idx](i,j)*((E1Tensor(i,j)-E0Tensor(i,j))-(Eplast_rec(i,j)-Eplast_rec0(i,j)));
+        }
+      }
       idx+=1;
     }
     if (_Id1200==1){
@@ -3579,6 +3619,14 @@ void NonlocalDamageTorchANNBasedDG3DMaterialLaw::stress(IPVariable* ipv, const I
           }
         }
       }
+      DplastEnergDNonLocalVar[idx]=0.;
+      DdefoEnergDNonLocalVar[idx]=0.;
+      for (int i=0;i<3;i++){
+        for (int j=0;j<3;j++){
+          DplastEnergDNonLocalVar[idx]+=M[idx](i,j)*(Eplast_rec(i,j)-Eplast_rec0(i,j));
+          DdefoEnergDNonLocalVar[idx]+=M[idx](i,j)*((E1Tensor(i,j)-E0Tensor(i,j))-(Eplast_rec(i,j)-Eplast_rec0(i,j)));
+        }
+      }
       idx+=1;
     } 
     if (_Id2200==1){
@@ -3593,6 +3641,14 @@ void NonlocalDamageTorchANNBasedDG3DMaterialLaw::stress(IPVariable* ipv, const I
           }
         }
       }
+      DplastEnergDNonLocalVar[idx]=0.;
+      DdefoEnergDNonLocalVar[idx]=0.;
+      for (int i=0;i<3;i++){
+        for (int j=0;j<3;j++){
+          DplastEnergDNonLocalVar[idx]+=M[idx](i,j)*(Eplast_rec(i,j)-Eplast_rec0(i,j));
+          DdefoEnergDNonLocalVar[idx]+=M[idx](i,j)*((E1Tensor(i,j)-E0Tensor(i,j))-(Eplast_rec(i,j)-Eplast_rec0(i,j)));
+        }
+      }
       idx+=1;
     }  
     if (_Id0101==1){
@@ -3607,6 +3663,14 @@ void NonlocalDamageTorchANNBasedDG3DMaterialLaw::stress(IPVariable* ipv, const I
           }
         }
       }
+      DplastEnergDNonLocalVar[idx]=0.;
+      DdefoEnergDNonLocalVar[idx]=0.;
+      for (int i=0;i<3;i++){
+        for (int j=0;j<3;j++){
+          DplastEnergDNonLocalVar[idx]+=M[idx](i,j)*(Eplast_rec(i,j)-Eplast_rec0(i,j));
+          DdefoEnergDNonLocalVar[idx]+=M[idx](i,j)*((E1Tensor(i,j)-E0Tensor(i,j))-(Eplast_rec(i,j)-Eplast_rec0(i,j)));
+        }
+      }
       idx+=1;
     } 
     if (_Id0201==1){
@@ -3621,6 +3685,14 @@ void NonlocalDamageTorchANNBasedDG3DMaterialLaw::stress(IPVariable* ipv, const I
           }
         }
       }
+      DplastEnergDNonLocalVar[idx]=0.;
+      DdefoEnergDNonLocalVar[idx]=0.;
+      for (int i=0;i<3;i++){
+        for (int j=0;j<3;j++){
+          DplastEnergDNonLocalVar[idx]+=M[idx](i,j)*(Eplast_rec(i,j)-Eplast_rec0(i,j));
+          DdefoEnergDNonLocalVar[idx]+=M[idx](i,j)*((E1Tensor(i,j)-E0Tensor(i,j))-(Eplast_rec(i,j)-Eplast_rec0(i,j)));
+        }
+      }
       idx+=1;
     }   
     if (_Id1101==1){
@@ -3635,6 +3707,14 @@ void NonlocalDamageTorchANNBasedDG3DMaterialLaw::stress(IPVariable* ipv, const I
           }
         }
       }
+      DplastEnergDNonLocalVar[idx]=0.;
+      DdefoEnergDNonLocalVar[idx]=0.;
+      for (int i=0;i<3;i++){
+        for (int j=0;j<3;j++){
+          DplastEnergDNonLocalVar[idx]+=M[idx](i,j)*(Eplast_rec(i,j)-Eplast_rec0(i,j));
+          DdefoEnergDNonLocalVar[idx]+=M[idx](i,j)*((E1Tensor(i,j)-E0Tensor(i,j))-(Eplast_rec(i,j)-Eplast_rec0(i,j)));
+        }
+      }
       idx+=1;
     } 
     if (_Id1201==1){
@@ -3649,6 +3729,14 @@ void NonlocalDamageTorchANNBasedDG3DMaterialLaw::stress(IPVariable* ipv, const I
           }
         }
       }
+      DplastEnergDNonLocalVar[idx]=0.;
+      DdefoEnergDNonLocalVar[idx]=0.;
+      for (int i=0;i<3;i++){
+        for (int j=0;j<3;j++){
+          DplastEnergDNonLocalVar[idx]+=M[idx](i,j)*(Eplast_rec(i,j)-Eplast_rec0(i,j));
+          DdefoEnergDNonLocalVar[idx]+=M[idx](i,j)*((E1Tensor(i,j)-E0Tensor(i,j))-(Eplast_rec(i,j)-Eplast_rec0(i,j)));
+        }
+      }
       idx+=1;
     }   
     if (_Id2201==1){
@@ -3663,6 +3751,14 @@ void NonlocalDamageTorchANNBasedDG3DMaterialLaw::stress(IPVariable* ipv, const I
           }
         }
       }
+      DplastEnergDNonLocalVar[idx]=0.;
+      DdefoEnergDNonLocalVar[idx]=0.;
+      for (int i=0;i<3;i++){
+        for (int j=0;j<3;j++){
+          DplastEnergDNonLocalVar[idx]+=M[idx](i,j)*(Eplast_rec(i,j)-Eplast_rec0(i,j));
+          DdefoEnergDNonLocalVar[idx]+=M[idx](i,j)*((E1Tensor(i,j)-E0Tensor(i,j))-(Eplast_rec(i,j)-Eplast_rec0(i,j)));
+        }
+      }
       idx+=1;
     }  
     if (_Id0202==1){
@@ -3677,6 +3773,14 @@ void NonlocalDamageTorchANNBasedDG3DMaterialLaw::stress(IPVariable* ipv, const I
           }
         }
       }
+      DplastEnergDNonLocalVar[idx]=0.;
+      DdefoEnergDNonLocalVar[idx]=0.;
+      for (int i=0;i<3;i++){
+        for (int j=0;j<3;j++){
+          DplastEnergDNonLocalVar[idx]+=M[idx](i,j)*(Eplast_rec(i,j)-Eplast_rec0(i,j));
+          DdefoEnergDNonLocalVar[idx]+=M[idx](i,j)*((E1Tensor(i,j)-E0Tensor(i,j))-(Eplast_rec(i,j)-Eplast_rec0(i,j)));
+        }
+      }
       idx+=1;
     } 
     if (_Id1102==1){
@@ -3691,6 +3795,14 @@ void NonlocalDamageTorchANNBasedDG3DMaterialLaw::stress(IPVariable* ipv, const I
           }
         }
       }
+      DplastEnergDNonLocalVar[idx]=0.;
+      DdefoEnergDNonLocalVar[idx]=0.;
+      for (int i=0;i<3;i++){
+        for (int j=0;j<3;j++){
+          DplastEnergDNonLocalVar[idx]+=M[idx](i,j)*(Eplast_rec(i,j)-Eplast_rec0(i,j));
+          DdefoEnergDNonLocalVar[idx]+=M[idx](i,j)*((E1Tensor(i,j)-E0Tensor(i,j))-(Eplast_rec(i,j)-Eplast_rec0(i,j)));
+        }
+      }
       idx+=1;
     } 
     if (_Id1202==1){
@@ -3705,6 +3817,14 @@ void NonlocalDamageTorchANNBasedDG3DMaterialLaw::stress(IPVariable* ipv, const I
           }
         }
       }
+      DplastEnergDNonLocalVar[idx]=0.;
+      DdefoEnergDNonLocalVar[idx]=0.;
+      for (int i=0;i<3;i++){
+        for (int j=0;j<3;j++){
+          DplastEnergDNonLocalVar[idx]+=M[idx](i,j)*(Eplast_rec(i,j)-Eplast_rec0(i,j));
+          DdefoEnergDNonLocalVar[idx]+=M[idx](i,j)*((E1Tensor(i,j)-E0Tensor(i,j))-(Eplast_rec(i,j)-Eplast_rec0(i,j)));
+        }
+      }
       idx+=1;
     } 
     if (_Id2202==1){
@@ -3719,6 +3839,14 @@ void NonlocalDamageTorchANNBasedDG3DMaterialLaw::stress(IPVariable* ipv, const I
           }
         }
       }
+      DplastEnergDNonLocalVar[idx]=0.;
+      DdefoEnergDNonLocalVar[idx]=0.;
+      for (int i=0;i<3;i++){
+        for (int j=0;j<3;j++){
+          DplastEnergDNonLocalVar[idx]+=M[idx](i,j)*(Eplast_rec(i,j)-Eplast_rec0(i,j));
+          DdefoEnergDNonLocalVar[idx]+=M[idx](i,j)*((E1Tensor(i,j)-E0Tensor(i,j))-(Eplast_rec(i,j)-Eplast_rec0(i,j)));
+        }
+      }
       idx+=1;
     } 
     if (_Id1111==1){
@@ -3733,6 +3861,14 @@ void NonlocalDamageTorchANNBasedDG3DMaterialLaw::stress(IPVariable* ipv, const I
           }
         }
       }
+      DplastEnergDNonLocalVar[idx]=0.;
+      DdefoEnergDNonLocalVar[idx]=0.;
+      for (int i=0;i<3;i++){
+        for (int j=0;j<3;j++){
+          DplastEnergDNonLocalVar[idx]+=M[idx](i,j)*(Eplast_rec(i,j)-Eplast_rec0(i,j));
+          DdefoEnergDNonLocalVar[idx]+=M[idx](i,j)*((E1Tensor(i,j)-E0Tensor(i,j))-(Eplast_rec(i,j)-Eplast_rec0(i,j)));
+        }
+      }
       idx+=1;
     } 
     if (_Id1211==1){
@@ -3747,6 +3883,14 @@ void NonlocalDamageTorchANNBasedDG3DMaterialLaw::stress(IPVariable* ipv, const I
           }
         }
       }
+      DplastEnergDNonLocalVar[idx]=0.;
+      DdefoEnergDNonLocalVar[idx]=0.;
+      for (int i=0;i<3;i++){
+        for (int j=0;j<3;j++){
+          DplastEnergDNonLocalVar[idx]+=M[idx](i,j)*(Eplast_rec(i,j)-Eplast_rec0(i,j));
+          DdefoEnergDNonLocalVar[idx]+=M[idx](i,j)*((E1Tensor(i,j)-E0Tensor(i,j))-(Eplast_rec(i,j)-Eplast_rec0(i,j)));
+        }
+      }
       idx+=1;
     } 
     if (_Id2211==1){
@@ -3761,6 +3905,14 @@ void NonlocalDamageTorchANNBasedDG3DMaterialLaw::stress(IPVariable* ipv, const I
           }
         }
       }
+      DplastEnergDNonLocalVar[idx]=0.;
+      DdefoEnergDNonLocalVar[idx]=0.;
+      for (int i=0;i<3;i++){
+        for (int j=0;j<3;j++){
+          DplastEnergDNonLocalVar[idx]+=M[idx](i,j)*(Eplast_rec(i,j)-Eplast_rec0(i,j));
+          DdefoEnergDNonLocalVar[idx]+=M[idx](i,j)*((E1Tensor(i,j)-E0Tensor(i,j))-(Eplast_rec(i,j)-Eplast_rec0(i,j)));
+        }
+      }
       idx+=1;
     } 
     if (_Id1212==1){
@@ -3775,6 +3927,14 @@ void NonlocalDamageTorchANNBasedDG3DMaterialLaw::stress(IPVariable* ipv, const I
           }
         }
       }
+      DplastEnergDNonLocalVar[idx]=0.;
+      DdefoEnergDNonLocalVar[idx]=0.;
+      for (int i=0;i<3;i++){
+        for (int j=0;j<3;j++){
+          DplastEnergDNonLocalVar[idx]+=M[idx](i,j)*(Eplast_rec(i,j)-Eplast_rec0(i,j));
+          DdefoEnergDNonLocalVar[idx]+=M[idx](i,j)*((E1Tensor(i,j)-E0Tensor(i,j))-(Eplast_rec(i,j)-Eplast_rec0(i,j)));
+        }
+      }
       idx+=1;
     } 
     if (_Id2212==1){
@@ -3789,6 +3949,14 @@ void NonlocalDamageTorchANNBasedDG3DMaterialLaw::stress(IPVariable* ipv, const I
           }
         }
       }
+      DplastEnergDNonLocalVar[idx]=0.;
+      DdefoEnergDNonLocalVar[idx]=0.;
+      for (int i=0;i<3;i++){
+        for (int j=0;j<3;j++){
+          DplastEnergDNonLocalVar[idx]+=M[idx](i,j)*(Eplast_rec(i,j)-Eplast_rec0(i,j));
+          DdefoEnergDNonLocalVar[idx]+=M[idx](i,j)*((E1Tensor(i,j)-E0Tensor(i,j))-(Eplast_rec(i,j)-Eplast_rec0(i,j)));
+        }
+      }
       idx+=1;
     } 
     if (_Id2222==1){
@@ -3803,6 +3971,14 @@ void NonlocalDamageTorchANNBasedDG3DMaterialLaw::stress(IPVariable* ipv, const I
           }
         }
       }
+      DplastEnergDNonLocalVar[idx]=0.;
+      DdefoEnergDNonLocalVar[idx]=0.;
+      for (int i=0;i<3;i++){
+        for (int j=0;j<3;j++){
+          DplastEnergDNonLocalVar[idx]+=M[idx](i,j)*(Eplast_rec(i,j)-Eplast_rec0(i,j));
+          DdefoEnergDNonLocalVar[idx]+=M[idx](i,j)*((E1Tensor(i,j)-E0Tensor(i,j))-(Eplast_rec(i,j)-Eplast_rec0(i,j)));
+        }
+      }
       idx+=1;
     } 
     if (_Ie00==1){
@@ -3817,6 +3993,14 @@ void NonlocalDamageTorchANNBasedDG3DMaterialLaw::stress(IPVariable* ipv, const I
           }
         }
       }
+      DplastEnergDNonLocalVar[idx]=0.;
+      DdefoEnergDNonLocalVar[idx]=0.;
+      for (int i=0;i<3;i++){
+        for (int j=0;j<3;j++){
+          DplastEnergDNonLocalVar[idx]+=M[idx](i,j)*(Eplast_rec(i,j)-Eplast_rec0(i,j))+S_rec(i,j)*B0(i,j);
+          DdefoEnergDNonLocalVar[idx]+=M[idx](i,j)*((E1Tensor(i,j)-E0Tensor(i,j))-(Eplast_rec(i,j)-Eplast_rec0(i,j)))-S_rec(i,j)*B0(i,j);
+        }
+      }
       idx+=1; 
     } 
     if (_Ie01==1){
@@ -3831,6 +4015,14 @@ void NonlocalDamageTorchANNBasedDG3DMaterialLaw::stress(IPVariable* ipv, const I
           }
         }
       }
+      DplastEnergDNonLocalVar[idx]=0.;
+      DdefoEnergDNonLocalVar[idx]=0.;
+      for (int i=0;i<3;i++){
+        for (int j=0;j<3;j++){
+          DplastEnergDNonLocalVar[idx]+=M[idx](i,j)*(Eplast_rec(i,j)-Eplast_rec0(i,j))+S_rec(i,j)*B1(i,j);
+          DdefoEnergDNonLocalVar[idx]+=M[idx](i,j)*((E1Tensor(i,j)-E0Tensor(i,j))-(Eplast_rec(i,j)-Eplast_rec0(i,j)))-S_rec(i,j)*B1(i,j);
+        }
+      }
       idx+=1; 
     } 
     if (_Ie02==1){
@@ -3845,6 +4037,14 @@ void NonlocalDamageTorchANNBasedDG3DMaterialLaw::stress(IPVariable* ipv, const I
           }
         }
       }
+      DplastEnergDNonLocalVar[idx]=0.;
+      DdefoEnergDNonLocalVar[idx]=0.;
+      for (int i=0;i<3;i++){
+        for (int j=0;j<3;j++){
+          DplastEnergDNonLocalVar[idx]+=M[idx](i,j)*(Eplast_rec(i,j)-Eplast_rec0(i,j))+S_rec(i,j)*B2(i,j);
+          DdefoEnergDNonLocalVar[idx]+=M[idx](i,j)*((E1Tensor(i,j)-E0Tensor(i,j))-(Eplast_rec(i,j)-Eplast_rec0(i,j)))-S_rec(i,j)*B2(i,j);
+        }
+      }
       idx+=1; 
     }
     if (_Ie11==1){
@@ -3859,6 +4059,14 @@ void NonlocalDamageTorchANNBasedDG3DMaterialLaw::stress(IPVariable* ipv, const I
           }
         }
       }
+      DplastEnergDNonLocalVar[idx]=0.;
+      DdefoEnergDNonLocalVar[idx]=0.;
+      for (int i=0;i<3;i++){
+        for (int j=0;j<3;j++){
+          DplastEnergDNonLocalVar[idx]+=M[idx](i,j)*(Eplast_rec(i,j)-Eplast_rec0(i,j))+S_rec(i,j)*B3(i,j);
+          DdefoEnergDNonLocalVar[idx]+=M[idx](i,j)*((E1Tensor(i,j)-E0Tensor(i,j))-(Eplast_rec(i,j)-Eplast_rec0(i,j)))-S_rec(i,j)*B3(i,j);
+        }
+      }
       idx+=1; 
     }
     if (_Ie12==1){
@@ -3873,6 +4081,14 @@ void NonlocalDamageTorchANNBasedDG3DMaterialLaw::stress(IPVariable* ipv, const I
           }
         }
       }
+      DplastEnergDNonLocalVar[idx]=0.;
+      DdefoEnergDNonLocalVar[idx]=0.;
+      for (int i=0;i<3;i++){
+        for (int j=0;j<3;j++){
+          DplastEnergDNonLocalVar[idx]+=M[idx](i,j)*(Eplast_rec(i,j)-Eplast_rec0(i,j))+S_rec(i,j)*B4(i,j);
+          DdefoEnergDNonLocalVar[idx]+=M[idx](i,j)*((E1Tensor(i,j)-E0Tensor(i,j))-(Eplast_rec(i,j)-Eplast_rec0(i,j)))-S_rec(i,j)*B4(i,j);
+        }
+      }
       idx+=1; 
     }
     if (_Ie22==1){
@@ -3887,6 +4103,14 @@ void NonlocalDamageTorchANNBasedDG3DMaterialLaw::stress(IPVariable* ipv, const I
           }
         }
       }
+      DplastEnergDNonLocalVar[idx]=0.;
+      DdefoEnergDNonLocalVar[idx]=0.;
+      for (int i=0;i<3;i++){
+        for (int j=0;j<3;j++){
+          DplastEnergDNonLocalVar[idx]+=M[idx](i,j)*(Eplast_rec(i,j)-Eplast_rec0(i,j))+S_rec(i,j)*B5(i,j);
+          DdefoEnergDNonLocalVar[idx]+=M[idx](i,j)*((E1Tensor(i,j)-E0Tensor(i,j))-(Eplast_rec(i,j)-Eplast_rec0(i,j)))-S_rec(i,j)*B5(i,j);
+        }
+      }
       idx+=1; 
     }  
     //end step 8.1.5
@@ -3937,55 +4161,299 @@ void NonlocalDamageTorchANNBasedDG3DMaterialLaw::stress(IPVariable* ipv, const I
     //end step 8.2
     
   //step 9: for energy-based path Following
-    //beginning step 9.1: computation of the plastic energy
-    const STensor3& Eplast0 = ipvprev->getConstRefToEplast();
-    const STensor3& Eplast_rec0 = ipvprev->getConstRefToEplastrec();
+    //beginning step 9.1: computation of the deformation energy (or elastic energy)
+    //const STensor3& Eplast0 = ipvprev->getConstRefToEplast();
+    //const STensor3& Eplast_rec0 = ipvprev->getConstRefToEplastrec();
  
     double &defoEnergy=ipvcur->getRefToDefoEnergy();
     defoEnergy=ipvprev->getConstRefToDefoEnergy();
+    for (int i=0;i<3;i++){
+      for (int j=0;j<3;j++){
+        defoEnergy+=S_rec(i,j)*((E1Tensor(i,j)-Eplast_rec(i,j))-(E0Tensor(i,j)-Eplast_rec0(i,j)));
+      }
+    }
+    //end step 9.1
+    
+    double &plasticEnergy=ipvcur->getRefToPlasticEnergy();
+    plasticEnergy=ipvprev->getConstRefToPlasticEnergy();
+    for (int i=0;i<3;i++){
+      for (int j=0;j<3;j++){
+        plasticEnergy+=S_rec(i,j)*(Eplast_rec(i,j)-Eplast_rec0(i,j));
+      }
+    }
+    
+    
+    //beginning step 9.2: computation of the damage energy
+    const STensor43& D_rec0 = ipvprev->getConstRefToNonLocalDamageTensor43();
+    double& damageEnergy=ipvcur->getRefToDamageEnergy();
+    damageEnergy=ipvprev->getConstRefToDamageEnergy();
+    for (int i=0;i<3;i++){
+      for (int j=0;j<3;j++){
+        double s=0;
+        for (int p=0;p<3;p++){
+          for (int q=0;q<3;q++){
+            s+=(D_rec(i,j,p,q)-D_rec0(i,j,p,q))*NonDamTangPred(i,j,p,q)*(E1Tensor(p,q)-Eplast_rec(p,q));
+          }
+        }
+        damageEnergy+=0.5*(E1Tensor(i,j)-Eplast_rec(i,j))*s;
+      }
+    }
+    /*
+    double& damageEnergy=ipvcur->getRefToDamageEnergy();
+    damageEnergy=ipvprev->getConstRefToDefoEnergy();
+    
+    int idx2=0;
+    if (_Id0000==1){
       for (int i=0;i<3;i++){
         for (int j=0;j<3;j++){
-          defoEnergy+=S_rec(i,j)*((E1Tensor(i,j)-Eplast_rec(i,j))-(E0Tensor(i,j)-Eplast_rec0(i,j)));
+          damageEnergy+=0.5*(E1Tensor(i,j)-Eplast_rec(i,j))*M[idx2](i,j)*(D_rec(0,0,0,0)-D_rec0(0,0,0,0));
         }
- 
+      }
+      idx2+=1;
+    }
+    if (_Id0100==1){
+      for (int i=0;i<3;i++){
+        for (int j=0;j<3;j++){
+          damageEnergy+=0.5*(E1Tensor(i,j)-Eplast_rec(i,j))*M[idx2](i,j)*(D_rec(0,1,0,0)-D_rec0(0,1,0,0));
+        }
+      }
+      idx2+=1;
+    }
+    if (_Id0200==1){
+      for (int i=0;i<3;i++){
+        for (int j=0;j<3;j++){
+          damageEnergy+=0.5*(E1Tensor(i,j)-Eplast_rec(i,j))*M[idx2](i,j)*(D_rec(0,2,0,0)-D_rec0(0,2,0,0));
+        }
+      }
+      idx2+=1;
+    }
+    if (_Id1100==1){
+      for (int i=0;i<3;i++){
+        for (int j=0;j<3;j++){
+          damageEnergy+=0.5*(E1Tensor(i,j)-Eplast_rec(i,j))*M[idx2](i,j)*(D_rec(1,1,0,0)-D_rec0(1,1,0,0));
+        }
+      }
+      idx2+=1;
+    }
+    if (_Id1200==1){
+      for (int i=0;i<3;i++){
+        for (int j=0;j<3;j++){
+          damageEnergy+=0.5*(E1Tensor(i,j)-Eplast_rec(i,j))*M[idx2](i,j)*(D_rec(1,2,0,0)-D_rec0(1,2,0,0));
+        }
+      }
+      idx2+=1;
+    }
+    if (_Id2200==1){
+      for (int i=0;i<3;i++){
+        for (int j=0;j<3;j++){
+          damageEnergy+=0.5*(E1Tensor(i,j)-Eplast_rec(i,j))*M[idx2](i,j)*(D_rec(2,2,0,0)-D_rec0(2,2,0,0));
+        }
+      }
+      idx2+=1;
+    }
+    if (_Id0101==1){
+      for (int i=0;i<3;i++){
+        for (int j=0;j<3;j++){
+          damageEnergy+=0.5*(E1Tensor(i,j)-Eplast_rec(i,j))*M[idx2](i,j)*(D_rec(0,1,0,1)-D_rec0(0,1,0,1));
+        }
+      }
+      idx2+=1;
+    }
+    if (_Id0201==1){
+      for (int i=0;i<3;i++){
+        for (int j=0;j<3;j++){
+          damageEnergy+=0.5*(E1Tensor(i,j)-Eplast_rec(i,j))*M[idx2](i,j)*(D_rec(0,2,0,1)-D_rec0(0,2,0,1));
+        }
+      }
+      idx2+=1;
+    }
+    if (_Id1101==1){
+      for (int i=0;i<3;i++){
+        for (int j=0;j<3;j++){
+          damageEnergy+=0.5*(E1Tensor(i,j)-Eplast_rec(i,j))*M[idx2](i,j)*(D_rec(1,1,0,1)-D_rec0(1,1,0,1));
+        }
+      }
+      idx2+=1;
+    }
+    if (_Id1201==1){
+      for (int i=0;i<3;i++){
+        for (int j=0;j<3;j++){
+          damageEnergy+=0.5*(E1Tensor(i,j)-Eplast_rec(i,j))*M[idx2](i,j)*(D_rec(1,2,0,1)-D_rec0(1,2,0,1));
+        }
+      }
+      idx2+=1;
+    }
+    if (_Id2201==1){
+      for (int i=0;i<3;i++){
+        for (int j=0;j<3;j++){
+          damageEnergy+=0.5*(E1Tensor(i,j)-Eplast_rec(i,j))*M[idx2](i,j)*(D_rec(2,2,0,1)-D_rec0(2,2,0,1));
+        }
+      }
+      idx2+=1;
+    }
+    if (_Id0202==1){
+      for (int i=0;i<3;i++){
+        for (int j=0;j<3;j++){
+          damageEnergy+=0.5*(E1Tensor(i,j)-Eplast_rec(i,j))*M[idx2](i,j)*(D_rec(0,2,0,2)-D_rec0(0,2,0,2));
+        }
+      }
+      idx2+=1;
+    }
+    if (_Id1102==1){
+      for (int i=0;i<3;i++){
+        for (int j=0;j<3;j++){
+          damageEnergy+=0.5*(E1Tensor(i,j)-Eplast_rec(i,j))*M[idx2](i,j)*(D_rec(1,1,0,2)-D_rec0(1,1,0,2));
+        }
+      }
+      idx2+=1;
+    }
+    if (_Id1202==1){
+      for (int i=0;i<3;i++){
+        for (int j=0;j<3;j++){
+          damageEnergy+=0.5*(E1Tensor(i,j)-Eplast_rec(i,j))*M[idx2](i,j)*(D_rec(1,2,0,2)-D_rec0(1,2,0,2));
+        }
+      }
+      idx2+=1;
+    }
+    if (_Id2202==1){
+      for (int i=0;i<3;i++){
+        for (int j=0;j<3;j++){
+          damageEnergy+=0.5*(E1Tensor(i,j)-Eplast_rec(i,j))*M[idx2](i,j)*(D_rec(2,2,0,2)-D_rec0(2,2,0,2));
+        }
+      }
+      idx2+=1;
+    }
+    if (_Id1111==1){
+      for (int i=0;i<3;i++){
+        for (int j=0;j<3;j++){
+          damageEnergy+=0.5*(E1Tensor(i,j)-Eplast_rec(i,j))*M[idx2](i,j)*(D_rec(1,1,1,1)-D_rec0(1,1,1,1));
+        }
+      }
+      idx2+=1;
+    }
+    if (_Id1211==1){
+      for (int i=0;i<3;i++){
+        for (int j=0;j<3;j++){
+          damageEnergy+=0.5*(E1Tensor(i,j)-Eplast_rec(i,j))*M[idx2](i,j)*(D_rec(1,2,1,1)-D_rec0(1,2,1,1));
+        }
+      }
+      idx2+=1;
+    }
+    if (_Id2211==1){
+      for (int i=0;i<3;i++){
+        for (int j=0;j<3;j++){
+          damageEnergy+=0.5*(E1Tensor(i,j)-Eplast_rec(i,j))*M[idx2](i,j)*(D_rec(2,2,1,1)-D_rec0(2,2,1,1));
+        }
+      }
+      idx2+=1;
+    }
+    if (_Id1212==1){
+      for (int i=0;i<3;i++){
+        for (int j=0;j<3;j++){
+          damageEnergy+=0.5*(E1Tensor(i,j)-Eplast_rec(i,j))*M[idx2](i,j)*(D_rec(1,2,1,2)-D_rec0(1,2,1,2));
+        }
+      }
+      idx2+=1;
+    }
+    if (_Id2212==1){
+      for (int i=0;i<3;i++){
+        for (int j=0;j<3;j++){
+          damageEnergy+=0.5*(E1Tensor(i,j)-Eplast_rec(i,j))*M[idx2](i,j)*(D_rec(2,2,1,2)-D_rec0(2,2,1,2));
+        }
+      }
+      idx2+=1;
+    }
+    if (_Id2222==1){
+      for (int i=0;i<3;i++){
+        for (int j=0;j<3;j++){
+          damageEnergy+=0.5*(E1Tensor(i,j)-Eplast_rec(i,j))*M[idx2](i,j)*(D_rec(2,2,2,2)-D_rec0(2,2,2,2));
+        }
+      }
+      idx2+=1;
+    }
+    //end step 9.2
+    
+    
+    //beginning step 9.3: computation of the plastic energy (must be done after computing the damage energy in the way coded currently)
     double & plasticEnergy = ipvcur->getRefToPlasticEnergy();
     plasticEnergy = ipvprev->getConstRefToPlasticEnergy();
-    for (int i=0;i<3;i++){
-      for (int j=0;j<3;j++){
-        //plasticEnergy+=S(i,j)*(Eplast(i,j)-Eplast0(i,j));;
-        plasticEnergy+=S_rec(i,j)*(Eplast_rec(i,j)-Eplast_rec0(i,j));;
+    if (_Ie00==1){
+      for (int i=0;i<3;i++){
+        for (int j=0;j<3;j++){
+          plasticEnergy+=0.5*(B0(i,j)*S_rec(i,j)+(E1Tensor(i,j)-Eplast_rec(i,j))*M[idx2](i,j))*(Eplast_rec(0,0)-Eplast_rec0(0,0));
+        }
       }
+      idx2+=1;
     }
+    if (_Ie01==1){
+      for (int i=0;i<3;i++){
+        for (int j=0;j<3;j++){
+          plasticEnergy+=0.5*(B1(i,j)*S_rec(i,j)+(E1Tensor(i,j)-Eplast_rec(i,j))*M[idx2](i,j))*(Eplast_rec(0,1)-Eplast_rec0(0,1));
+        }
+      }
+      idx2+=1;
+    }
+    if (_Ie02==1){
+      for (int i=0;i<3;i++){
+        for (int j=0;j<3;j++){
+          plasticEnergy+=0.5*(B2(i,j)*S_rec(i,j)+(E1Tensor(i,j)-Eplast_rec(i,j))*M[idx2](i,j))*(Eplast_rec(0,2)-Eplast_rec0(0,2));
+        }
+      }
+      idx2+=1;
+    }
+    if (_Ie11==1){
+      for (int i=0;i<3;i++){
+        for (int j=0;j<3;j++){
+          plasticEnergy+=0.5*(B3(i,j)*S_rec(i,j)+(E1Tensor(i,j)-Eplast_rec(i,j))*M[idx2](i,j))*(Eplast_rec(1,1)-Eplast_rec0(1,1));
+        }
+      }
+      idx2+=1;
+    }
+    if (_Ie12==1){
+      for (int i=0;i<3;i++){
+        for (int j=0;j<3;j++){
+          plasticEnergy+=0.5*(B4(i,j)*S_rec(i,j)+(E1Tensor(i,j)-Eplast_rec(i,j))*M[idx2](i,j))*(Eplast_rec(1,2)-Eplast_rec0(1,2));
+        }
+      }
+      idx2+=1;
+    }
+    if (_Ie22==1){
+      for (int i=0;i<3;i++){
+        for (int j=0;j<3;j++){
+          plasticEnergy+=0.5*(B5(i,j)*S_rec(i,j)+(E1Tensor(i,j)-Eplast_rec(i,j))*M[idx2](i,j))*(Eplast_rec(2,2)-Eplast_rec0(2,2));
+        }
+      }
+      idx2+=1;
+    }
+    //end step 9.3
+    */
     
+   
+
     
-    //std::cout << "plastEnergyprev = " << _plasticEnergyprev << "\n";
-    //std::cout << "plastEnergycur = " << _plasticEnergy << "\n";
-    //end step 9.1
-    
-    //beginning step 9.2: computation of DplastEnergDE
+    //beginning step ...: computation of DplastEnergDE
     static STensor3 DplastEnergDE;
     for (int k=0;k<3;k++){
       for (int l=0;l<3;l++){
         DplastEnergDE(k,l)=0;
         for (int i=0;i<3;i++){
           for (int j=0;j<3;j++){
-            //DplastEnergDE(k,l)+=DSDETensor43(i,j,k,l)*(Eplast(i,j)-Eplast0(i,j))+S(i,j)*DEplastDE(i,j,k,l);
             DplastEnergDE(k,l) +=DS_nlDE(i,j,k,l)*(Eplast_rec(i,j)-Eplast_rec0(i,j));
             DplastEnergDE(k,l) +=S_rec(i,j)*DEplast_lDE(i,j,k,l); 
           }
         }
       }
     }
-    if (ipvprev->getConstRefToPlasticEnergy()>plasticEnergy){
+    /*if (ipvprev->getConstRefToPlasticEnergy()>plasticEnergy){
       //std::cout << "warning: the plastic energy decreases" << "\n";
       plasticEnergy=ipvprev->getConstRefToPlasticEnergy();
       for (int k=0;k<3;k++)
         for (int l=0;l<3;l++)
           DplastEnergDE(k,l)=0.;
-    }
+    }*/
     
     //computation of DplastEnergDNonLocalVar
-    double DplastEnergDNonLocalVar0=0.;
+    /*double DplastEnergDNonLocalVar0=0.;
     double DplastEnergDNonLocalVar1=0.;
     for (int i=0;i<3;i++){
       for (int j=0;j<3;j++){
@@ -3993,7 +4461,7 @@ void NonlocalDamageTorchANNBasedDG3DMaterialLaw::stress(IPVariable* ipv, const I
         DplastEnergDNonLocalVar1+=M[1](i,j)*(Eplast_rec(i,j)-Eplast_rec0(i,j));
       }
     }
-    DplastEnergDNonLocalVar1+=S_rec(0,0);   //for a case in which Eplast00 is NonLocalVar1, should be generalized
+    DplastEnergDNonLocalVar1+=S_rec(0,0);*/   //for a case in which Eplast00 is NonLocalVar1, should be generalized
 
     static STensor3 DdefoEnergDE;
     for (int k=0;k<3;k++){
@@ -4008,7 +4476,7 @@ void NonlocalDamageTorchANNBasedDG3DMaterialLaw::stress(IPVariable* ipv, const I
     }
     
     //computation of DdefoEnergDNonLocalVar  (case with only two non local variables, should be generalized)
-    double DdefoEnergDNonLocalVar0=0.;
+    /*double DdefoEnergDNonLocalVar0=0.;
     double DdefoEnergDNonLocalVar1=0.;
     for (int i=0;i<3;i++){
       for (int j=0;j<3;j++){
@@ -4016,22 +4484,28 @@ void NonlocalDamageTorchANNBasedDG3DMaterialLaw::stress(IPVariable* ipv, const I
         DdefoEnergDNonLocalVar1+=M[1](i,j)*((E1Tensor(i,j)-Eplast_rec(i,j))-(E0Tensor(i,j)-Eplast_rec0(i,j)));
       }
     }
-    DdefoEnergDNonLocalVar1-=S_rec(0,0);   //for a case in which Eplast00 is NonLocalVar1, should be generalized
+    DdefoEnergDNonLocalVar1-=S_rec(0,0);*/   //for a case in which Eplast00 is NonLocalVar1, should be generalized
     //end step 9.2
 
     static STensor3 I2(1.);
     if (this->getMacroSolver()->getPathFollowingLocalIncrementType() == pathFollowingManager::DEFO_ENERGY){
       ipvcur->getRefToIrreversibleEnergy() = ipvcur->getConstRefToDefoEnergy();
       ipvcur->getRefToDIrreversibleEnergyDF() = DdefoEnergDE; 
-      ipvcur->getRefToDIrreversibleEnergyDNonLocalVariable(0) = DdefoEnergDNonLocalVar0;
-      ipvcur->getRefToDIrreversibleEnergyDNonLocalVariable(1) = DdefoEnergDNonLocalVar1;
+      for (int idx=0;idx<_numNonlocalVar;idx++){
+        ipvcur->getRefToDIrreversibleEnergyDNonLocalVariable(idx) = DdefoEnergDNonLocalVar[idx];
+      }
+      //ipvcur->getRefToDIrreversibleEnergyDNonLocalVariable(0) = DdefoEnergDNonLocalVar0;
+      //ipvcur->getRefToDIrreversibleEnergyDNonLocalVariable(1) = DdefoEnergDNonLocalVar1;
       
     }
     else if (this->getMacroSolver()->getPathFollowingLocalIncrementType() == pathFollowingManager::PLASTIC_ENERGY){
       ipvcur->getRefToIrreversibleEnergy() = ipvcur->getConstRefToPlasticEnergy();
       ipvcur->getRefToDIrreversibleEnergyDF() = DplastEnergDE; 
-      ipvcur->getRefToDIrreversibleEnergyDNonLocalVariable(0) = DplastEnergDNonLocalVar0;
-      ipvcur->getRefToDIrreversibleEnergyDNonLocalVariable(1) = DplastEnergDNonLocalVar1;
+      for (int idx=0;idx<_numNonlocalVar;idx++){
+        ipvcur->getRefToDIrreversibleEnergyDNonLocalVariable(idx) = DplastEnergDNonLocalVar[idx];
+      }
+      //ipvcur->getRefToDIrreversibleEnergyDNonLocalVariable(0) = DplastEnergDNonLocalVar0;
+      //ipvcur->getRefToDIrreversibleEnergyDNonLocalVariable(1) = DplastEnergDNonLocalVar1;
     }
     else if (this->getMacroSolver()->getPathFollowingLocalIncrementType() == pathFollowingManager::DAMAGE_ENERGY){
       ipvcur->getRefToIrreversibleEnergy() = ipvcur->getConstRefToDamageEnergy();
@@ -4051,7 +4525,7 @@ void NonlocalDamageTorchANNBasedDG3DMaterialLaw::stress(IPVariable* ipv, const I
    }
     
   //end step 9
-  }
+  //}
     //end small strain case
   //end code with D0000 and Eplast00 as non local variables*/