diff --git a/NonLinearSolver/Domain/partDomain.cpp b/NonLinearSolver/Domain/partDomain.cpp
index d2fc80b92fbd875d741e039ca40b590d49a64c94..79943976277d1d8995a567fd271e0ed9116cb166 100644
--- a/NonLinearSolver/Domain/partDomain.cpp
+++ b/NonLinearSolver/Domain/partDomain.cpp
@@ -225,7 +225,7 @@ double partDomain::computeMeanValueDomain(const int num, const IPField* ipf, dou
   return meanVal;
 };
 
-double partDomain::averagingOnActiveDamageZone(const int num, const IPField* ipf, double& solid) const{
+double partDomain::averagingOnActiveDissipationZone(const int num, const IPField* ipf, double& solid) const{
   IntPt* GP;
   double meanVal = 0;
   solid = 0.;
@@ -343,10 +343,10 @@ void partDomain::createIPMap(){
   }
 };
 
-void partDomain::getBlockDamageIps(std::vector<int>& blockDamageIPs) const{
-	blockDamageIPs.reserve(blockDamageIPs.size()+_blockedDamageIPs.size());
-	for (std::set<int>::const_iterator it = _blockedDamageIPs.begin(); it != _blockedDamageIPs.end(); it++){
-		blockDamageIPs.push_back(*it);
+void partDomain::getBlockDissipationIps(std::vector<int>& blockDissipationIPs) const{
+	blockDissipationIPs.reserve(blockDissipationIPs.size()+_blockedDissipationPs.size());
+	for (std::set<int>::const_iterator it = _blockedDissipationPs.begin(); it != _blockedDissipationPs.end(); it++){
+		blockDissipationIPs.push_back(*it);
 	}
 };
 void partDomain::getBrokenIPs(std::vector<int>& brkIps) const{
@@ -356,12 +356,12 @@ void partDomain::getBrokenIPs(std::vector<int>& brkIps) const{
 	}
 };
 
-void partDomain::blockDamageIP(const int ip){
-	_blockedDamageIPs.insert(ip);
+void partDomain::blockDissipationIP(const int ip){
+	_blockedDissipationPs.insert(ip);
 };
 
-void partDomain::clearBlockDamageIPs(){
-	_blockedDamageIPs.clear();
+void partDomain::clearBlockDissipationIPs(){
+	_blockedDissipationPs.clear();
 }
 void partDomain::brokenIP(const int ip){
 	_brokenIPs.insert(ip);
@@ -421,10 +421,10 @@ void partDomain::computeAverageStress(const IPField* ipf, STensor3& sig) const{
 };
 
 
-void partDomain::computeActiveDamagingAverageStressIncrement(const IPField* ipf, STensor3& stress) const{
+void partDomain::computeActiveDissipationAverageStressIncrement(const IPField* ipf, STensor3& stress) const{
   // compute average strain on active damaging part
   // damaging volume will besed on ws= current, previous, or initial
-	if ((g->size()>0) and (ipf->getNumOfActiveDamageIPs() > 0)){
+	if ((g->size()>0) and (ipf->getNumOfActiveDissipationIPs() > 0)){
 		IntPt* GP;
 	// compute from damaging zone
 		for (groupOfElements::elementContainer::iterator it= g->begin(); it!=g->end(); it++){
@@ -436,9 +436,9 @@ void partDomain::computeActiveDamagingAverageStressIncrement(const IPField* ipf,
 			for (int i=0; i<npts; i++){
 				const IPStateBase *ips        = (*vips)[i];
 				const ipFiniteStrain *ipv     = static_cast<const ipFiniteStrain*>(ips->getState(IPStateBase::current));
-				const ipFiniteStrain *ipvprev = static_cast<const ipFiniteStrain*>(ips->getState(IPStateBase::previousActiveDamage));
+				const ipFiniteStrain *ipvprev = static_cast<const ipFiniteStrain*>(ips->getState(IPStateBase::activeDissipation));
 				
-				if (ipvprev->isActiveDamage()){
+				if (ipvprev->dissipationIsActive()){
 					double weight= GP[i].weight;
 					const double &detJ = ipv->getJacobianDeterminant(ele,GP[i]);
           double ratio = detJ*weight;
@@ -508,8 +508,8 @@ double partDomain::computeVolumeDomain(const IPField* ipf) const{
   return volume;
 };
 
-void partDomain::computeActiveDamageCenter(const IPField* ipf, SPoint3& pos) const{
-	if ((g->size()>0) and (ipf->getNumOfActiveDamageIPs() > 0)){
+void partDomain::computeActiveDissipationCenter(const IPField* ipf, SPoint3& pos) const{
+	if ((g->size()>0) and (ipf->getNumOfActiveDissipationIPs() > 0)){
 		IntPt* GP;
 	// compute from damaging zone
 		for (groupOfElements::elementContainer::iterator it= g->begin(); it!=g->end(); it++){
@@ -519,8 +519,8 @@ void partDomain::computeActiveDamageCenter(const IPField* ipf, SPoint3& pos) con
 			for (int i=0; i<npts; i++){
 				const IPStateBase *ips        = (*vips)[i];
 				const ipFiniteStrain *ipv     = static_cast<const ipFiniteStrain*>(ips->getState(IPStateBase::current));
-				const ipFiniteStrain *ipvprev = static_cast<const ipFiniteStrain*>(ips->getState(IPStateBase::previousActiveDamage));
-				if (ipvprev->isActiveDamage()){
+				const ipFiniteStrain *ipvprev = static_cast<const ipFiniteStrain*>(ips->getState(IPStateBase::activeDissipation));
+				if (ipvprev->dissipationIsActive()){
 					double weight= GP[i].weight;
 					const double &detJ = ipv->getJacobianDeterminant(ele,GP[i]);
           double ratio = detJ*weight;
@@ -535,10 +535,10 @@ void partDomain::computeActiveDamageCenter(const IPField* ipf, SPoint3& pos) con
 	}
 };
 
-void partDomain::computeActiveDamagingAverageStrainIncrement(const IPField* ipf, STensor3& strain) const{
+void partDomain::computeActiveDissipationAverageStrainIncrement(const IPField* ipf, STensor3& strain) const{
   // compute average strain on active damaging part
   // damaging volume will besed on ws= current, previous, or initial
-	if ((g->size()>0) and (ipf->getNumOfActiveDamageIPs() > 0)){
+	if ((g->size()>0) and (ipf->getNumOfActiveDissipationIPs() > 0)){
 		IntPt* GP;
 	// compute from damaging zone
 		for (groupOfElements::elementContainer::iterator it= g->begin(); it!=g->end(); it++){
@@ -548,9 +548,9 @@ void partDomain::computeActiveDamagingAverageStrainIncrement(const IPField* ipf,
 			for (int i=0; i<npts; i++){
 				const IPStateBase *ips        = (*vips)[i];
 				const ipFiniteStrain *ipv     = static_cast<const ipFiniteStrain*>(ips->getState(IPStateBase::current));
-				const ipFiniteStrain *ipvprev = static_cast<const ipFiniteStrain*>(ips->getState(IPStateBase::previousActiveDamage));
+				const ipFiniteStrain *ipvprev = static_cast<const ipFiniteStrain*>(ips->getState(IPStateBase::activeDissipation));
 				
-				if (ipvprev->isActiveDamage()){
+				if (ipvprev->dissipationIsActive()){
 					double weight= GP[i].weight;
 					const double &detJ = ipv->getJacobianDeterminant(ele,GP[i]);
           double ratio = detJ*weight;
@@ -567,7 +567,7 @@ void partDomain::computeActiveDamagingAverageStrainIncrement(const IPField* ipf,
 	}
 };
 
-double partDomain::computeVolumeActiveDamageDomain(const IPField* ipf) const{
+double partDomain::computeVolumeActiveDissipationDomain(const IPField* ipf) const{
   double volume = 0.;
 	if (g->size()>0){
 		IntPt* GP;
@@ -576,10 +576,10 @@ double partDomain::computeVolumeActiveDamageDomain(const IPField* ipf) const{
 
 		for (groupOfElements::elementContainer::iterator it= g->begin(); it!=g->end(); it++){
 			MElement* ele= *it;
-			ipf->getIPv(ele,vipvRef,IPStateBase::previousActiveDamage);
+			ipf->getIPv(ele,vipvRef,IPStateBase::activeDissipation);
 			int npts= integBulk->getIntPoints(ele,&GP);
 			for (int i=0; i<npts; i++){
-				if (vipvRef[i]->isActiveDamage()){
+				if (vipvRef[i]->dissipationIsActive()){
 					double weight= GP[i].weight;
 					double &detJ = vipvRef[i]->getJacobianDeterminant(ele,GP[i]);
 					volume+=detJ*weight;
@@ -591,30 +591,6 @@ double partDomain::computeVolumeActiveDamageDomain(const IPField* ipf) const{
   return volume;
 };
 
-void partDomain::computeActiveNonlocalDamageIncrement(const IPField* ipf, double& dD) const{
-	if ((g->size()>0) and ipf->getNumOfActiveDamageIPs() >0){
-		IntPt* GP;
-	// compute from damaging zone
-		for (groupOfElements::elementContainer::iterator it= g->begin(); it!=g->end(); it++){
-			MElement* ele= *it;
-			AllIPState::ipstateElementContainer *vips = ipf->getAips()->getIPstate(ele->getNum());
-			int npts= integBulk->getIntPoints(ele,&GP);
-			for (int i=0; i<npts; i++){
-				const IPStateBase *ips        = (*vips)[i];
-				const ipFiniteStrain *ipv     = static_cast<const ipFiniteStrain*>(ips->getState(IPStateBase::current));
-				const ipFiniteStrain *ipvprev = static_cast<const ipFiniteStrain*>(ips->getState(IPStateBase::previousActiveDamage));
-				
-				if (ipvprev->isActiveDamage()){
-					double weight= GP[i].weight;
-					double &detJ = ipv->getJacobianDeterminant(ele,GP[i]);
-					dD += ((ipv->get(IPField::DAMAGE) - ipvprev->get(IPField::DAMAGE)) *detJ*weight);
-				}
-			};
-		};
-	}
-};
-
-
 void partDomain::computeConstitutiveExtraDofAverageFlux(const int index, const IPField* ipf, SVector3& extraDofFluxpart) const{
 	if (g->size() > 0){
 		IntPt* GP;
diff --git a/NonLinearSolver/Domain/partDomain.h b/NonLinearSolver/Domain/partDomain.h
index d8eedaa065bd38f2e04032ec596e5efae9b44d31..95634ed1685fd7100f5838e33d9db78ddbdd3e50 100644
--- a/NonLinearSolver/Domain/partDomain.h
+++ b/NonLinearSolver/Domain/partDomain.h
@@ -66,7 +66,7 @@ class partDomain{
   std::map<int,std::set<int> > _mapIPBulk; // map IP for bulk elements
 	
 	// for damage blockage 
-	std::set<int> _blockedDamageIPs;
+	std::set<int> _blockedDissipationPs;
 	std::set<int> _brokenIPs;
   #endif //HAVE_MPI
 	
@@ -259,14 +259,13 @@ public:
 
   //compute mechanical average quantities
   virtual void computeAverageStress(const IPField* ipf, STensor3& stress) const;
-  virtual void computeActiveDamagingAverageStressIncrement(const IPField* ipf, STensor3& stress) const;
+  virtual void computeActiveDissipationAverageStressIncrement(const IPField* ipf, STensor3& stress) const;
   virtual void computeAverageHighOrderStress(const IPField* ipf, STensor33& stress) const;
 	virtual double computeVolumeDomain(const IPField* ipf) const;
 	
-	virtual void computeActiveDamageCenter(const IPField* ipf, SPoint3& pos) const;
-	virtual void computeActiveDamagingAverageStrainIncrement(const IPField* _ipf, STensor3& strain) const;
-  virtual double computeVolumeActiveDamageDomain(const IPField* ipf) const;
-	virtual void computeActiveNonlocalDamageIncrement(const IPField* _ipf, double& dD) const; // choose ws between previous or initial
+	virtual void computeActiveDissipationCenter(const IPField* ipf, SPoint3& pos) const;
+	virtual void computeActiveDissipationAverageStrainIncrement(const IPField* _ipf, STensor3& strain) const;
+  virtual double computeVolumeActiveDissipationDomain(const IPField* ipf) const;
 
 	// compute constitutive extra-dof quantities
 	virtual void computeConstitutiveExtraDofAverageFlux(const int index, const IPField* _ipf, SVector3& extraDofFluxpart) const;
@@ -296,16 +295,16 @@ public:
   virtual const std::map<int,std::set<int> >& getMapIPBulk() const {return _mapIPBulk;};
   virtual const std::set<int>& getDomainIPBulk() const {return _domainIPBulk;};
 	
-	virtual void getBlockDamageIps(std::vector<int>& blockDamageIPs) const;
+	virtual void getBlockDissipationIps(std::vector<int>& blockDissipationIPs) const;
 	virtual void getBrokenIPs(std::vector<int>& brkIps) const;
-	virtual void blockDamageIP(const int ip);
-	virtual void clearBlockDamageIPs();
+	virtual void blockDissipationIP(const int ip);
+	virtual void clearBlockDissipationIPs();
 	virtual void brokenIP(const int ip);
 	virtual void clearBrokenIPs();
   #endif //HAVE_MPI
   virtual bool considerForTimeStep(AllIPState *aips,MElement *e) {return true;};
   virtual double computeMeanValueDomain(const int num, const IPField* ipf, double& volume) const;
-  virtual double averagingOnActiveDamageZone(const int num, const IPField* ipf, double & volume) const;
+  virtual double averagingOnActiveDissipationZone(const int num, const IPField* ipf, double & volume) const;
   virtual void initMicroMeshId();
   virtual void writeDeformationGradient(const IPField* ipf, FILE* file){
     Msg::Info("get deformation to file");
diff --git a/NonLinearSolver/field/energyField.cpp b/NonLinearSolver/field/energyField.cpp
index cfa7e8ff689c29c272b1d277cf1592de50b655e2..5c43836e0b38e37881f3cd24dbf182848a3f42bc 100644
--- a/NonLinearSolver/field/energyField.cpp
+++ b/NonLinearSolver/field/energyField.cpp
@@ -63,8 +63,7 @@ energeticField::energeticField(nonLinearMechSolver* sl, const std::vector<dataBu
 		{
 			// initialize file to store energy
 			fpenergy = fopen(_fname.c_str(),"w");
-			fprintf(fpenergy,"Time;Kinetic;Deformation;Plastic;Wext;Inversible;Total\n");
-			fprintf(fpenergy,"0.;0.;0.;0.;0.;0.;0.\n"); // false if initial deformation FIX IT HOW ??
+			fprintf(fpenergy,"Time;Kinetic;Deformation;Plastic;Wext;Damage;Total;LocalPathFollowing\n");
 		}
 		else
 		{
@@ -189,7 +188,14 @@ double energeticField::kineticEnergy(MElement *ele, const partDomain *dom) const
 }
 
 double energeticField::deformationEnergy(MElement *ele, const partDomain *dom) const{
-  return _solver->getIPField()->computeBulkDeformationEnergy(ele,dom,IPStateBase::current);
+  MInterfaceElement* iele = dynamic_cast<MInterfaceElement*>(ele);
+  if (iele){
+    const dgPartDomain* dgdom = dynamic_cast<const dgPartDomain*>(dom);
+    return _solver->getIPField()->computeInterfaceDeformationEnergy(ele,dgdom,IPStateBase::current);
+  }
+  else{
+    return _solver->getIPField()->computeBulkDeformationEnergy(ele,dom,IPStateBase::current);
+  }
 }
 
 double energeticField::deformationEnergy() const{
@@ -197,19 +203,60 @@ double energeticField::deformationEnergy() const{
 }
 
 double energeticField::plasticEnergy(MElement *ele, const partDomain *dom) const{
-  return _solver->getIPField()->computeBulkPlasticEnergy(ele,dom,IPStateBase::current);
+  MInterfaceElement* iele = dynamic_cast<MInterfaceElement*>(ele);
+  if (iele){
+    const dgPartDomain* dgdom = dynamic_cast<const dgPartDomain*>(dom);
+    return _solver->getIPField()->computeInterfacePlasticEnergy(ele,dgdom,IPStateBase::current);
+  }
+  else{
+    return _solver->getIPField()->computeBulkPlasticEnergy(ele,dom,IPStateBase::current);
+  }
 }
 
 double energeticField::plasticEnergy() const{
   return _solver->getIPField()->computePlasticEnergy(IPStateBase::current);
 }
 
-double energeticField::irreversibleEnergy(MElement *ele, const partDomain *dom) const{
-	return _solver->getIPField()->computeBulkIrreversibleEnergy(ele,dom,IPStateBase::current);
+
+double energeticField::damageEnergy(MElement *ele, const partDomain *dom) const{
+  MInterfaceElement* iele = dynamic_cast<MInterfaceElement*>(ele);
+  if (iele){
+    const dgPartDomain* dgdom = dynamic_cast<const dgPartDomain*>(dom);
+    return _solver->getIPField()->computeInterfaceDamageEnergy(ele,dgdom,IPStateBase::current);
+  }
+  else{
+    return _solver->getIPField()->computeBulkDamageEnergy(ele,dom,IPStateBase::current);
+  }
+}
+
+double energeticField::damageEnergy() const{
+  return _solver->getIPField()->computeDamageEnergy(IPStateBase::current);
+}
+
+
+double energeticField::pathFollowingLocalValue(MElement *ele, const partDomain *dom) const{
+  if (_solver->withPathFollowing()){
+    MInterfaceElement* iele = dynamic_cast<MInterfaceElement*>(ele);
+    if (iele){
+      const dgPartDomain* dgdom = dynamic_cast<const dgPartDomain*>(dom);
+      return _solver->getIPField()->computeInterfacePathFollowingLocalValue(ele,dgdom,IPStateBase::current);
+    }
+    else{
+      return _solver->getIPField()->computeBulkPathFollowingLocalValue(ele,dom,IPStateBase::current);
+    }    
+  }
+  else{
+    return 0.;
+  }
 }
 
-double energeticField::irreversibleEnergy() const{
-	return _solver->getIPField()->computeIrreversibleEnergy(IPStateBase::current);
+double energeticField::pathFollowingLocalValue() const{
+  if (_solver->withPathFollowing()){
+    return _solver->getIPField()->computePathFollowingLocalValue(IPStateBase::current);
+  }
+  else{
+    return 0.;
+  }
 };
 
 void energeticField::externalWork()const{ // for multiSystem takes only the first one (displacement)
@@ -286,26 +333,29 @@ int energeticField::fractureEnergy(double*  arrayEnergy) const
 void energeticField::get(partDomain *dom,MElement *ele,std::vector<double> &ener, const int cc,
                          const nlsField::ElemValue ev)const{
   switch(cc){
-   //case 0:
-   // ener[0] = this->kineticEnergy(ele,dom) + this->deformationEnergy(ele,dom);
-   // break;
-   case 1:
+   case 0:
     ener[0] = this->kineticEnergy(ele,dom);
     break;
-   case 2:
+   case 1:
     ener[0] = this->deformationEnergy(ele,dom);
     break;
+   case 2:
+    ener[0] = this->plasticEnergy(ele,dom);
+    break;
    case 3:
     ener[0] = _wext; // false fix this (How and Interrest ?)
 		break;
    case 4:
-    ener[0] = this->plasticEnergy(ele,dom);
+    ener[0] = this->damageEnergy(ele,dom);
 		break;
 	 case 5:
-		ener[0] = this->irreversibleEnergy(ele,dom);
+		ener[0] = this->kineticEnergy(ele,dom) + this->deformationEnergy(ele,dom);
 		break;
+   case 6:
+    ener[0] = this->pathFollowingLocalValue(ele,dom);
+    break;
    default:
-    ener[0] = this->kineticEnergy(ele,dom) + this->deformationEnergy(ele,dom);
+    Msg::Fatal("energy type %d is not defined",cc);
 		break;
   }
 };
@@ -315,7 +365,7 @@ double energeticField::get(whichEnergy we) const
   switch(we)
   {
     case kinetic: case deformation:
-    case plastic: case external: case irreverible: case total:
+    case plastic: case external: case damage: case total: case localPathFollowing:
       return _energy[we];
     default:
       Msg::Fatal("You try to get an energy that does not exist");
@@ -335,33 +385,16 @@ void energeticField::archive(const double time,const int step) {
     if(step%_energyComputation == 0)
     {
       // without MPI transfert user has to sum the contribution of all processors at the end
-/*      double ekin,edefo,etot,eplast;
-      ekin = this->kineticEnergy();
-      edefo= this->deformationEnergy();
-      eplast = this->plasticEnergy();
-      etot = ekin + edefo;
-      fprintf(fpenergy,"%e;%e;%e;%e;%e;%e;\n",time,ekin,edefo,eplast,_wext,etot);
-*/
       _energy[0] = this->kineticEnergy();
       _energy[1] = this->deformationEnergy();
       _energy[2] = this->plasticEnergy();
       _energy[3] = _wext;
-			_energy[4] = this->irreversibleEnergy();
-			
-      #if 0 // No exchange of energy each rank stores its own contribution ( 1 each rank stores all the energy)
-        #if defined(HAVE_MPI)
-        if(Msg::GetCommSize() > 1){
-	      static double localEnergy[5];
-	      for(int i=0; i<5; i++) localEnergy[i]=_energy[i];
-	        MPI_Allreduce(&localEnergy,&_energy,5,MPI_DOUBLE,MPI_SUM,MPI_COMM_WORLD);
-        }
-        #endif // HAVE_MPI
-      # endif // 0 or 1
-
+      _energy[4] = this->damageEnergy();
       _energy[5] = _energy[0]+_energy[1];
-
-      fprintf(fpenergy,"%e;%e;%e;%e;%e;%e;%e;\n",time,_energy[0], _energy[1], _energy[2], _energy[3],_energy[4],_energy[5]);
-      if(step%(_energyComputation*10) == 0)
+			_energy[6] = this->pathFollowingLocalValue();
+			
+      fprintf(fpenergy,"%e;%e;%e;%e;%e;%e;%e;%e;\n",time,_energy[0], _energy[1], _energy[2], _energy[3],_energy[4],_energy[5],_energy[6]);
+      if(step%(_energyComputation*1) == 0)
         fflush(fpenergy);
 
     }
@@ -387,7 +420,7 @@ void energeticField::archive(const double time,const int step) {
           fprintf(fpfrac,"%e;",arrayEnergy[i]);
         }
         fprintf(fpfrac,"\n");
-        if(step%(_fractureEnergyComputation*10) == 0)
+        if(step%(_fractureEnergyComputation*1) == 0)
           fflush(fpfrac);
       }
     }
@@ -403,7 +436,7 @@ energeticField::restart()
 {
   elementsField::restart();
   restartManager::restart(_wext);
-  restartManager::restart(_energy,6);
+  restartManager::restart(_energy,7);
   restartManager::restart(_fextn);
   restartManager::restart(_dispn);
   restartManager::restart(_fextnp1);
@@ -426,7 +459,7 @@ void energeticField::resetFile(){
 	if(_energyComputation>0)
 	{
 		fpenergy = fopen(_fname.c_str(),"a");
-		fprintf(fpenergy,"Time;Kinetic;Deformation;Plastic;Wext;Inversible;Total\n");
+		fprintf(fpenergy,"Time;Kinetic;Deformation;Plastic;Wext;Damage;Total;LocalPathFollowing\n");
 	}
 	if(_fractureEnergyComputation>0)
 	{
diff --git a/NonLinearSolver/field/energyField.h b/NonLinearSolver/field/energyField.h
index 8a4ce54c4447a45ca0d0b45238a6cc4eea85cbab..a197772966c2df961a2e8ccea4d5c1d63401dadb 100644
--- a/NonLinearSolver/field/energyField.h
+++ b/NonLinearSolver/field/energyField.h
@@ -32,15 +32,16 @@ class energeticField : public elementsField{
   mutable std::map<Dof,double> _fextnp1;
   mutable std::map<Dof,double> _dispnp1;
   mutable double _wext;
-  double _energy[6]; // keep in memory to get it
+  double _energy[7]; // keep in memory to get it
  public:
   enum whichEnergy{
     kinetic=0,
     deformation=1,
     plastic=2,
     external=3,
-		irreverible=4,
-    total =5
+		damage=4,
+    total =5,
+    localPathFollowing=6
   };
  #ifndef SWIG
   energeticField(nonLinearMechSolver* sl, const std::vector<dataBuildView> &dbview_,
@@ -56,12 +57,18 @@ class energeticField : public elementsField{
   // functions to compute the different parts of energy
   double kineticEnergy() const; // More efficient than a loop on element thanks to vector operation via PETSC
   double kineticEnergy(MElement *ele, const partDomain *dom) const;
+  // deformation part
   double deformationEnergy(MElement *ele, const partDomain *dom) const;
   double deformationEnergy() const;
+  // plastic part
   double plasticEnergy(MElement *ele, const partDomain *dom) const;
   double plasticEnergy() const;	
-	double irreversibleEnergy(MElement *ele, const partDomain *dom) const;
-  double irreversibleEnergy() const;
+  // damage part
+  double damageEnergy(MElement *ele, const partDomain *dom) const;
+  double damageEnergy() const;
+  // pathfollowing part
+	double pathFollowingLocalValue(MElement *ele, const partDomain *dom) const;
+  double pathFollowingLocalValue() const;
 	
   void externalWork()const; // it is stored in a internal variable _wext
   int fractureEnergy(double* arrayEnergy) const; // int return the number of components to archive (max 12) the first one is the total energy
diff --git a/NonLinearSolver/internalPoints/ipCohesive.h b/NonLinearSolver/internalPoints/ipCohesive.h
index 75526a792d62f4f286083f4ca8f0808782119683..89720c5a6fc9245116c41cc1e65f645672180db7 100644
--- a/NonLinearSolver/internalPoints/ipCohesive.h
+++ b/NonLinearSolver/internalPoints/ipCohesive.h
@@ -16,7 +16,7 @@
 #include "ipvariable.h"
 #include "STensor3.h"
 
-class IPCohesive : public IPVariable{
+class IPCohesive : public IPVariableMechanics{
   protected:
     double _beta; // mixmode parameter
     double _Kp; // initial penalty
@@ -37,12 +37,12 @@ class IPCohesive : public IPVariable{
 		STensor3 _DIrreversibleEnergyDF;
 
   public:
-    IPCohesive():IPVariable(),_beta(0.),_Kp(0.),_sigmac(0.),_deltac(0.),
+    IPCohesive():IPVariableMechanics(),_beta(0.),_Kp(0.),_sigmac(0.),_deltac(0.),
                 _delta0(0.),_deltamax(0.),_sigmamax(0.),_cohesiveDamage(0.),
                 _DcohesiveDamageDdelta(0.),_tension(true),_fracEnergy(0.),
 								_reversibleEnergy(0.),_irreversibleEnergy(0.),_effectivePotential(0.),
 								_DIrreversibleEnergyDJump(0.),_DIrreversibleEnergyDF(0.){}
-    IPCohesive(const IPCohesive& src):IPVariable(src),_beta(src._beta),_Kp(src._Kp),_sigmac(src._sigmac),_deltac(src._deltac),
+    IPCohesive(const IPCohesive& src):IPVariableMechanics(src),_beta(src._beta),_Kp(src._Kp),_sigmac(src._sigmac),_deltac(src._deltac),
                 _delta0(src._delta0),_deltamax(src._deltamax),_sigmamax(src._sigmamax),_cohesiveDamage(src._cohesiveDamage),
                 _DcohesiveDamageDdelta(src._DcohesiveDamageDdelta),_tension(src._tension),
                 _fracEnergy(src._fracEnergy),_reversibleEnergy(src._reversibleEnergy),
@@ -51,7 +51,7 @@ class IPCohesive : public IPVariable{
 								_DIrreversibleEnergyDF(src._DIrreversibleEnergyDF){}
 
     virtual IPCohesive& operator=(const IPVariable& src){
-      IPVariable::operator=(src);
+      IPVariableMechanics::operator=(src);
       const IPCohesive* psrc = dynamic_cast<const IPCohesive*>(&src);
       if (psrc != NULL){
         _beta = psrc->_beta;
@@ -75,6 +75,10 @@ class IPCohesive : public IPVariable{
 
     }
     virtual ~IPCohesive(){}
+    
+    virtual double defoEnergy() const {return _reversibleEnergy;};
+    virtual double plasticEnergy() const {return 0.;};
+    virtual double damageEnergy() const {return _irreversibleEnergy;};
 
     virtual double& getRefToMixedModeParameter() {return _beta;}
     virtual const double& getConstRefToMixedModeParameter() const{return _beta;}
@@ -152,7 +156,7 @@ class IPCohesive : public IPVariable{
     }
 
     virtual void restart(){
-      IPVariable::restart();
+      IPVariableMechanics::restart();
       restartManager::restart(_beta); // mixmode parameter
       restartManager::restart(_Kp); // initial penalty
       restartManager::restart(_sigmac); // critical stress
diff --git a/NonLinearSolver/internalPoints/ipField.cpp b/NonLinearSolver/internalPoints/ipField.cpp
index 8e280bfcf6998d6dfc532fa7244e87f05f95114b..ecf6dd7145aaa2a146d3b8d83b448e521f85f0ba 100644
--- a/NonLinearSolver/internalPoints/ipField.cpp
+++ b/NonLinearSolver/internalPoints/ipField.cpp
@@ -45,17 +45,17 @@ void IPField::nextStep(const double time){
 			_solver->getOtherRanks(Msg::GetCommRank(),otherRanks);
 			if (otherRanks.size() > 0){
 				std::vector<int> brokenIPs;
-				std::vector<int> blockDamageIPs;
+				std::vector<int> blockDissipationIPs;
 				for (int idom=0; idom< domainVector->size(); idom++){
 					(*domainVector)[idom]->getBrokenIPs(brokenIPs);
-					(*domainVector)[idom]->getBlockDamageIps(blockDamageIPs);
+					(*domainVector)[idom]->getBlockDissipationIps(blockDissipationIPs);
 				}
 				// send data
 				for (std::set<int>::const_iterator it = otherRanks.begin(); it != otherRanks.end(); it++){
 					int otherRank = *it;
 					int sizeIPData[2];
 					sizeIPData[0] = brokenIPs.size();
-					sizeIPData[1] = blockDamageIPs.size();
+					sizeIPData[1] = blockDissipationIPs.size();
 					int tag = numericalMaterialBase::createTypeWithTwoInts(Msg::GetCommRank(),1);
 					MPI_Send(sizeIPData,2,MPI_INT,otherRank,tag,MPI_COMM_WORLD);
 					int bufferSize = sizeIPData[0]+sizeIPData[1];
@@ -65,7 +65,7 @@ void IPField::nextStep(const double time){
 							buffer[i] = brokenIPs[i];
 						}
 						for (int i=0; i< sizeIPData[1]; i++){
-							buffer[i+sizeIPData[0]] = blockDamageIPs[i];
+							buffer[i+sizeIPData[0]] = blockDissipationIPs[i];
 						}
 						tag = numericalMaterialBase::createTypeWithTwoInts(Msg::GetCommRank(),2);
 						MPI_Send(&buffer[0],bufferSize,MPI_INT,otherRank,tag,MPI_COMM_WORLD);
@@ -110,7 +110,7 @@ void IPField::nextStep(const double time){
 						IPVariableMechanics* ipvMecha = dynamic_cast<IPVariableMechanics*>(ipv);
 						//printf("rank %d block damage %d \n",Msg::GetCommRank(),buffer[i]);
 						if (ipvMecha != NULL){
-							ipvMecha->blockDamage(true);
+							ipvMecha->blockDissipation(true);
 						}
 					}
 				}
@@ -125,25 +125,25 @@ void IPField::nextStep(const double time){
   _AIPS->nextStep();
 }
 
-void IPField::checkActiveDamage(const IPStateBase::whichState ws){
+void IPField::checkActiveDissipation(const IPStateBase::whichState ws){
 	// check active damage state
 	// should be call after
-	_numOfActiveDamageIPs = 0;
+	_numOfActiveDissipationIPs = 0;
 	for (AllIPState::ipstateContainer::const_iterator it = _AIPS->begin(); it!= _AIPS->end(); it++){
 		const std::vector<IPStateBase*> *vips = &((*it).second);
 		for (int i = 0; i< vips->size(); i++){
 			const IPVariableMechanics* ipvcur = dynamic_cast<const IPVariableMechanics*>((*vips)[i]->getState(ws));
 			if (ipvcur != NULL){
-				if (ipvcur->isActiveDamage()){
-					_numOfActiveDamageIPs++;
+				if (ipvcur->dissipationIsActive()){
+					_numOfActiveDissipationIPs++;
 				}
 			}
 		}
 	}
 	
-	if (_numOfActiveDamageIPs > 0){
-		_numOfActiveDamageIPsReached = _numOfActiveDamageIPs;
-		this->copy(ws,IPStateBase::previousActiveDamage);
+	if (_numOfActiveDissipationIPs > 0){
+		_numOfActiveDissipationIPsReached = _numOfActiveDissipationIPs;
+		this->copy(ws,IPStateBase::activeDissipation);
 	}
 };
 
@@ -246,7 +246,7 @@ void IPField::archive(const double time, const int step){
           if(ipa.evalue==nlsField::mean && totalVolume!=0.) totalValue/=totalVolume;
 //        FILE *fp = fopen(ipa.fname.c_str(),"a");
           fprintf(ipa.fp,"%e;%e\n",time,totalValue);
-          if(step%(ipa.nstep*10) == 0)
+          if(step%(ipa.nstep*1) == 0)
             fflush (ipa.fp);
 //        fclose(fp);
         }
@@ -335,21 +335,25 @@ double IPField::computeInterfaceDeformationEnergy(MElement *ele, const dgPartDom
   }
 
   for(int i=0;i<npts;i++){
-    IPStateBase* ips = (*vips)[i];
+    IPStateBase* ipsm = (*vips)[i];
+    IPStateBase* ipsp = (*vips)[i+npts];
+    
    #ifdef DEBUG_
-    IPVariableMechanics *ipv = dynamic_cast<IPVariableMechanics*>(ips->getState(ws));
-    if(ipv == NULL){
+    IPVariableMechanics *ipvm = dynamic_cast<IPVariableMechanics*>(ipsm->getState(ws));
+    IPVariableMechanics *ipvp = dynamic_cast<IPVariableMechanics*>(ipsp->getState(ws));
+    if(ipvm == NULL){
       Msg::Error("Compute defo energy on an non mechanics gauss' point");
       return 0.;
     }
    #else
-    IPVariableMechanics *ipv = static_cast<IPVariableMechanics*>(ips->getState(ws));
+    IPVariableMechanics *ipvm = static_cast<IPVariableMechanics*>(ipsm->getState(ws));
+    IPVariableMechanics *ipvp = static_cast<IPVariableMechanics*>(ipsp->getState(ws));
    #endif // DEBUG_
 	 
-		IPVariable2ForFractureBase* ipvFrac = dynamic_cast<IPVariable2ForFractureBase*>(ipv);
-		if (ipvFrac != NULL){
-			if (ipvFrac->isbroken()){
-				double enerpt = ipv->defoEnergy();
+		IPVariable2ForFractureBase* ipvmFrac = dynamic_cast<IPVariable2ForFractureBase*>(ipvm);
+		if (ipvmFrac != NULL){
+			if (ipvmFrac->isbroken()){
+				double enerpt = 0.5*(ipvm->defoEnergy()+ipvp->defoEnergy());
 				// gauss point weight
 				double weight = GP[i].weight;
 				ener += weight*vdetJ[i]*enerpt;
@@ -440,6 +444,64 @@ double IPField::computeBulkPlasticEnergy(MElement *ele, const partDomain *dom, c
   return ener;
 }
 
+double IPField::computeInterfacePlasticEnergy(MElement *ele, const dgPartDomain *dom, const IPStateBase::whichState ws) const
+{
+  IntPt *GP;
+  double jac[3][3];
+  int npts = dom->getInterfaceGaussIntegrationRule()->getIntPoints(ele,&GP);
+  AllIPState::ipstateElementContainer *vips = _AIPS->getIPstate(ele->getNum());
+  double ener =0.;
+  // Jacobian values;
+  std::vector<double> vdetJ(npts);
+  nlsFunctionSpaceUVW<double>* nlsspace = dynamic_cast<nlsFunctionSpaceUVW<double>*>(dom->getFunctionSpace());
+  if(nlsspace!=NULL)
+  {
+    std::vector<std::vector<TensorialTraits<double>::GradType> > vgradsuvw;
+    nlsspace->getgradfuvw(ele,npts,GP,vgradsuvw);
+    for(int i=0;i<npts;i++)
+    {
+      vdetJ[i] = ele->getJacobian(vgradsuvw[i],jac);
+    }
+  }
+  else
+  {
+    for(int i=0;i<npts;i++)
+    {
+      const double u = GP[i].pt[0]; const double v = GP[i].pt[1]; const double w = GP[i].pt[2];
+      vdetJ[i] = ele->getJacobian(u, v, w, jac);
+    }
+  }
+
+  for(int i=0;i<npts;i++){
+    IPStateBase* ipsm = (*vips)[i];
+    IPStateBase* ipsp = (*vips)[i+npts];
+   #ifdef DEBUG_
+    IPVariableMechanics *ipvm = dynamic_cast<IPVariableMechanics*>(ipsm->getState(ws));
+    IPVariableMechanics *ipvp = dynamic_cast<IPVariableMechanics*>(ipsp->getState(ws));
+    if(ipvm == NULL){
+      Msg::Error("Compute defo energy on an non mechanics gauss' point");
+      return 0.;
+    }
+   #else
+    IPVariableMechanics *ipvm = static_cast<IPVariableMechanics*>(ipsm->getState(ws));
+    IPVariableMechanics *ipvp = static_cast<IPVariableMechanics*>(ipsp->getState(ws));
+   #endif // DEBUG_
+	 
+		IPVariable2ForFractureBase* ipvmFrac = dynamic_cast<IPVariable2ForFractureBase*>(ipvm);
+		if (ipvmFrac != NULL){
+			if (ipvmFrac->isbroken()){
+				double enerpt = 0.5*(ipvm->plasticEnergy()+ipvp->plasticEnergy());
+				// gauss point weight
+				double weight = GP[i].weight;
+				ener += weight*vdetJ[i]*enerpt;
+			}
+			
+		}
+  }
+  return ener;
+}
+
+
 double IPField::computePlasticEnergy(const IPStateBase::whichState ws) const{
 	const std::vector<partDomain*>* domainVector = _solver->getDomainVector();
 	double ener=0.;
@@ -449,12 +511,34 @@ double IPField::computePlasticEnergy(const IPStateBase::whichState ws) const{
 			MElement *ele = *it;
 			ener += this->computeBulkPlasticEnergy(ele,dom,ws);
 		}
+    if (dom->IsInterfaceTerms()){
+			dgPartDomain* dgdom = static_cast<dgPartDomain*>(dom);
+			for(groupOfElements::elementContainer::const_iterator it=dgdom->gi->begin(); it!=dgdom->gi->end(); ++it){
+				MElement *ele = *it;
+			 #if defined(HAVE_MPI)
+				if(Msg::GetCommSize()>1)
+				{
+					MInterfaceElement *iele = dynamic_cast<MInterfaceElement*>(ele);
+					if(iele->getElem(0)->getPartition()==0 or iele->getElem(0)->getPartition() == Msg::GetCommRank()+1) // if - element is ghost not computed to avoid to count twice the contribution
+					{
+						ener += this->computeInterfacePlasticEnergy(ele,dgdom,ws);
+					}
+				}
+				else
+			 #endif // HAVE_MPI
+				{
+					ener += this->computeInterfacePlasticEnergy(ele,dgdom,ws);
+				}
+				
+			}
+		}
 	}
 	return ener;
 }
 
-double IPField::computeBulkIrreversibleEnergy(MElement *ele, const partDomain *dom, const IPStateBase::whichState ws) const{
-	IntPt *GP;
+double IPField::computeBulkDamageEnergy(MElement *ele, const partDomain *dom, const IPStateBase::whichState ws) const
+{
+  IntPt *GP;
   double jac[3][3];
   int npts = dom->getBulkGaussIntegrationRule()->getIntPoints(ele,&GP);
   AllIPState::ipstateElementContainer *vips = _AIPS->getIPstate(ele->getNum());
@@ -490,20 +574,21 @@ double IPField::computeBulkIrreversibleEnergy(MElement *ele, const partDomain *d
    #else
     IPVariableMechanics *ipv = static_cast<IPVariableMechanics*>(ips->getState(ws));
    #endif // DEBUG_
-    double enerpt = ipv->irreversibleEnergy();
+    double enerpt = ipv->damageEnergy();
     // gauss point weight
     double weight = GP[i].weight;
     ener += weight*vdetJ[i]*enerpt;
   }
   return ener;
-};
+}
 
-double IPField::computeInterfaceIrreversibleEnergy(MElement *ele, const dgPartDomain *dom, const IPStateBase::whichState ws) const{
-	IntPt *GP;
-  static double jac[3][3];
+double IPField::computeInterfaceDamageEnergy(MElement *ele, const dgPartDomain *dom, const IPStateBase::whichState ws) const
+{
+  IntPt *GP;
+  double jac[3][3];
   int npts = dom->getInterfaceGaussIntegrationRule()->getIntPoints(ele,&GP);
   AllIPState::ipstateElementContainer *vips = _AIPS->getIPstate(ele->getNum());
-	double ener =0.;
+  double ener =0.;
   // Jacobian values;
   std::vector<double> vdetJ(npts);
   nlsFunctionSpaceUVW<double>* nlsspace = dynamic_cast<nlsFunctionSpaceUVW<double>*>(dom->getFunctionSpace());
@@ -524,98 +609,244 @@ double IPField::computeInterfaceIrreversibleEnergy(MElement *ele, const dgPartDo
       vdetJ[i] = ele->getJacobian(u, v, w, jac);
     }
   }
-  for(int i=0;i<npts;i++){ // loop on minus interface only to compute energy (otherwise it would be computed twice)
-    IPStateBase* ips = (*vips)[i];
-    IPVariableMechanics *ipv = static_cast<IPVariableMechanics*>(ips->getState(ws));
-		
-		IPVariable2ForFractureBase* ipvFrac = dynamic_cast<IPVariable2ForFractureBase*>(ipv);
-		if (ipvFrac != NULL){		
-			// gauss point weight
-			if (ipvFrac->isbroken()){
-				double enerpt = ipv->irreversibleEnergy();
+
+  for(int i=0;i<npts;i++){
+    IPStateBase* ipsm = (*vips)[i];
+    IPStateBase* ipsp = (*vips)[i+npts];
+   #ifdef DEBUG_
+    IPVariableMechanics *ipvm = dynamic_cast<IPVariableMechanics*>(ipsm->getState(ws));
+    IPVariableMechanics *ipvp = dynamic_cast<IPVariableMechanics*>(ipsp->getState(ws));
+    if(ipvm == NULL){
+      Msg::Error("Compute defo energy on an non mechanics gauss' point");
+      return 0.;
+    }
+   #else
+    IPVariableMechanics *ipvm = static_cast<IPVariableMechanics*>(ipsm->getState(ws));
+    IPVariableMechanics *ipvp = static_cast<IPVariableMechanics*>(ipsp->getState(ws));
+   #endif // DEBUG_
+	 
+		IPVariable2ForFractureBase* ipvmFrac = dynamic_cast<IPVariable2ForFractureBase*>(ipvm);
+		if (ipvmFrac != NULL){
+			if (ipvmFrac->isbroken()){
+				double enerpt = 0.5*(ipvm->damageEnergy()+ipvp->damageEnergy());
+				// gauss point weight
 				double weight = GP[i].weight;
-				const double wJ = weight*vdetJ[i];
 				ener += weight*vdetJ[i]*enerpt;
 			}
 			
 		}
   }
   return ener;
-};
+}
 
-double IPField::computeIrreversibleEnergy(const IPStateBase::whichState ws) const{
+
+double IPField::computeDamageEnergy(const IPStateBase::whichState ws) const{
 	const std::vector<partDomain*>* domainVector = _solver->getDomainVector();
 	double ener=0.;
 	for(std::vector<partDomain*>::const_iterator itdom=domainVector->begin(); itdom!=domainVector->end(); ++itdom){
 		partDomain *dom = *itdom;
 		for(groupOfElements::elementContainer::const_iterator it=dom->g_cbegin(); it!=dom->g_cend(); ++it){
 			MElement *ele = *it;
-			ener += this->computeBulkIrreversibleEnergy(ele,dom,ws);
+			ener += this->computeBulkDamageEnergy(ele,dom,ws);
 		}
-		
-		// interface energy
-		if(dom->IsInterfaceTerms()) // otherwise no fracture
-		{
-			const dgPartDomain* dgdom = static_cast<const dgPartDomain*>(dom);
-			if((dgdom->getMaterialLawMinus()->getType() == materialLaw::fracture) and (dgdom->getMaterialLawPlus()->getType() == materialLaw::fracture))//comment it to get H1 norm in the interface  e.g. LinearThermoMech
-			{
-				for(groupOfElements::elementContainer::const_iterator it=dgdom->gi->begin(); it!=dgdom->gi->end(); ++it)
+    if (dom->IsInterfaceTerms()){
+			dgPartDomain* dgdom = static_cast<dgPartDomain*>(dom);
+			for(groupOfElements::elementContainer::const_iterator it=dgdom->gi->begin(); it!=dgdom->gi->end(); ++it){
+				MElement *ele = *it;
+			 #if defined(HAVE_MPI)
+				if(Msg::GetCommSize()>1)
 				{
-					MElement *ele = *it;
-				 #if defined(HAVE_MPI)
-					if(Msg::GetCommSize()>1)
-					{
-						MInterfaceElement *iele = dynamic_cast<MInterfaceElement*>(ele);
-						if(iele->getElem(0)->getPartition()==0 or iele->getElem(0)->getPartition() == Msg::GetCommRank()+1) // if - element is ghost not computed to avoid to count twice the contribution
-						{
-							ener += this->computeInterfaceIrreversibleEnergy(ele,dgdom,ws);
-						}
-					}
-					else
-				 #endif // HAVE_MPI
+					MInterfaceElement *iele = dynamic_cast<MInterfaceElement*>(ele);
+					if(iele->getElem(0)->getPartition()==0 or iele->getElem(0)->getPartition() == Msg::GetCommRank()+1) // if - element is ghost not computed to avoid to count twice the contribution
 					{
-						ener += this->computeInterfaceIrreversibleEnergy(ele,dgdom,ws);
+						ener += this->computeInterfaceDamageEnergy(ele,dgdom,ws);
 					}
 				}
+				else
+			 #endif // HAVE_MPI
+				{
+					ener += this->computeInterfaceDamageEnergy(ele,dgdom,ws);
+				}
+				
 			}
 		}
 	}
 	return ener;
-};
+}
 
-double IPField::computeInterfaceIrreversibleEnergy(const IPStateBase::whichState ws) const{
-		const std::vector<partDomain*>* domainVector = _solver->getDomainVector();
+double IPField::computeBulkPathFollowingLocalValue(MElement *ele, const partDomain *dom, const IPStateBase::whichState ws) const{
+	IntPt *GP;
+  double jac[3][3];
+  int npts = dom->getBulkGaussIntegrationRule()->getIntPoints(ele,&GP);
+  AllIPState::ipstateElementContainer *vips = _AIPS->getIPstate(ele->getNum());
+  double ener =0.;
+  // Jacobian values;
+  std::vector<double> vdetJ(npts);
+  nlsFunctionSpaceUVW<double>* nlsspace = dynamic_cast<nlsFunctionSpaceUVW<double>*>(dom->getFunctionSpace());
+  if(nlsspace!=NULL)
+  {
+    std::vector<std::vector<TensorialTraits<double>::GradType> > vgradsuvw;
+    nlsspace->getgradfuvw(ele,npts,GP,vgradsuvw);
+    for(int i=0;i<npts;i++)
+    {
+      vdetJ[i] = ele->getJacobian(vgradsuvw[i],jac);
+    }
+  }
+  else
+  {
+    for(int i=0;i<npts;i++)
+    {
+      const double u = GP[i].pt[0]; const double v = GP[i].pt[1]; const double w = GP[i].pt[2];
+      vdetJ[i] = ele->getJacobian(u, v, w, jac);
+    }
+  }
+  for(int i=0;i<npts;i++){
+    IPStateBase* ips = (*vips)[i];
+   #ifdef DEBUG_
+    IPVariableMechanics *ipv = dynamic_cast<IPVariableMechanics*>(ips->getState(ws));
+    if(ipv == NULL){
+      Msg::Error("Compute plastic energy on an non mechanics gauss' point");
+      return 0.;
+    }
+   #else
+    IPVariableMechanics *ipv = static_cast<IPVariableMechanics*>(ips->getState(ws));
+   #endif // DEBUG_
+    double enerpt = ipv->irreversibleEnergy();
+    // gauss point weight
+    double weight = GP[i].weight;
+    ener += weight*vdetJ[i]*enerpt;
+  }
+  return ener;
+};
 
-	double ener=0.;
-	for(std::vector<partDomain*>::const_iterator itdom=domainVector->begin(); itdom!=domainVector->end(); ++itdom){
-		partDomain *dom = *itdom;
+double IPField::computeInterfacePathFollowingLocalValue(MElement *ele, const dgPartDomain *dom, const IPStateBase::whichState ws) const{
+	IntPt *GP;
+  static double jac[3][3];
+  int npts = dom->getInterfaceGaussIntegrationRule()->getIntPoints(ele,&GP);
+  AllIPState::ipstateElementContainer *vips = _AIPS->getIPstate(ele->getNum());
+	double ener =0.;
+  // Jacobian values;
+  std::vector<double> vdetJ(npts);
+  nlsFunctionSpaceUVW<double>* nlsspace = dynamic_cast<nlsFunctionSpaceUVW<double>*>(dom->getFunctionSpace());
+  if(nlsspace!=NULL)
+  {
+    std::vector<std::vector<TensorialTraits<double>::GradType> > vgradsuvw;
+    nlsspace->getgradfuvw(ele,npts,GP,vgradsuvw);
+    for(int i=0;i<npts;i++)
+    {
+      vdetJ[i] = ele->getJacobian(vgradsuvw[i],jac);
+    }
+  }
+  else
+  {
+    for(int i=0;i<npts;i++)
+    {
+      const double u = GP[i].pt[0]; const double v = GP[i].pt[1]; const double w = GP[i].pt[2];
+      vdetJ[i] = ele->getJacobian(u, v, w, jac);
+    }
+  }
+  for(int i=0;i<npts;i++){ // loop on minus interface only to compute energy (otherwise it would be computed twice)
+    IPStateBase* ips = (*vips)[i];
+    IPVariableMechanics *ipv = static_cast<IPVariableMechanics*>(ips->getState(ws));
 		
-		// interface energy
-		if(dom->IsInterfaceTerms()) // otherwise no fracture
-		{
-			const dgPartDomain* dgdom = static_cast<const dgPartDomain*>(dom);
-			if((dgdom->getMaterialLawMinus()->getType() == materialLaw::fracture) and (dgdom->getMaterialLawPlus()->getType() == materialLaw::fracture))//comment it to get H1 norm in the interface  e.g. LinearThermoMech
-			{
-				for(groupOfElements::elementContainer::const_iterator it=dgdom->gi->begin(); it!=dgdom->gi->end(); ++it)
-				{
-					MElement *ele = *it;
-				 #if defined(HAVE_MPI)
-					if(Msg::GetCommSize()>1)
-					{
-						MInterfaceElement *iele = dynamic_cast<MInterfaceElement*>(ele);
-						if(iele->getElem(0)->getPartition()==0 or iele->getElem(0)->getPartition() == Msg::GetCommRank()+1) // if - element is ghost not computed to avoid to count twice the contribution
-						{
-							ener += this->computeInterfaceIrreversibleEnergy(ele,dgdom,ws);
-						}
-					}
-					else
-				 #endif // HAVE_MPI
-					{
-						ener += this->computeInterfaceIrreversibleEnergy(ele,dgdom,ws);
-					}
-				}
+		IPVariable2ForFractureBase* ipvFrac = dynamic_cast<IPVariable2ForFractureBase*>(ipv);
+		if (ipvFrac != NULL){		
+			// gauss point weight
+			if (ipvFrac->isbroken()){
+				double enerpt = ipv->irreversibleEnergy();
+				double weight = GP[i].weight;
+				const double wJ = weight*vdetJ[i];
+				ener += weight*vdetJ[i]*enerpt;
 			}
+			
 		}
+  }
+  return ener;
+};
+
+double IPField::computePathFollowingLocalValue(const IPStateBase::whichState ws) const{
+  const std::vector<partDomain*>* domainVector = _solver->getDomainVector();
+	double ener=0.;
+  if (_solver->withPathFollowing()){
+    if (_solver->getPathFollowingLocation() == nonLinearMechSolver::BULK_INTERFACE){
+      for(std::vector<partDomain*>::const_iterator itdom=domainVector->begin(); itdom!=domainVector->end(); ++itdom){
+        partDomain *dom = *itdom;
+        for(groupOfElements::elementContainer::const_iterator it=dom->g_cbegin(); it!=dom->g_cend(); ++it){
+          MElement *ele = *it;
+          ener += this->computeBulkPathFollowingLocalValue(ele,dom,ws);
+        }
+        
+        // interface energy
+        if(dom->IsInterfaceTerms()) // otherwise no fracture
+        {
+          const dgPartDomain* dgdom = static_cast<const dgPartDomain*>(dom);
+          if((dgdom->getMaterialLawMinus()->getType() == materialLaw::fracture) and (dgdom->getMaterialLawPlus()->getType() == materialLaw::fracture))//comment it to get H1 norm in the interface  e.g. LinearThermoMech
+          {
+            for(groupOfElements::elementContainer::const_iterator it=dgdom->gi->begin(); it!=dgdom->gi->end(); ++it)
+            {
+              MElement *ele = *it;
+             #if defined(HAVE_MPI)
+              if(Msg::GetCommSize()>1)
+              {
+                MInterfaceElement *iele = dynamic_cast<MInterfaceElement*>(ele);
+                if(iele->getElem(0)->getPartition()==0 or iele->getElem(0)->getPartition() == Msg::GetCommRank()+1) // if - element is ghost not computed to avoid to count twice the contribution
+                {
+                  ener += this->computeInterfacePathFollowingLocalValue(ele,dgdom,ws);
+                }
+              }
+              else
+             #endif // HAVE_MPI
+              {
+                ener += this->computeInterfacePathFollowingLocalValue(ele,dgdom,ws);
+              }
+            }
+          }
+        }
+      }
+    }
+    else if (_solver->getPathFollowingLocation() == nonLinearMechSolver::BULK){
+      for(std::vector<partDomain*>::const_iterator itdom=domainVector->begin(); itdom!=domainVector->end(); ++itdom){
+        partDomain *dom = *itdom;
+        // interface energy
+        if(dom->IsInterfaceTerms()) // otherwise no fracture
+        {
+          const dgPartDomain* dgdom = static_cast<const dgPartDomain*>(dom);
+          if((dgdom->getMaterialLawMinus()->getType() == materialLaw::fracture) and (dgdom->getMaterialLawPlus()->getType() == materialLaw::fracture))//comment it to get H1 norm in the interface  e.g. LinearThermoMech
+          {
+            for(groupOfElements::elementContainer::const_iterator it=dgdom->gi->begin(); it!=dgdom->gi->end(); ++it)
+            {
+              MElement *ele = *it;
+             #if defined(HAVE_MPI)
+              if(Msg::GetCommSize()>1)
+              {
+                MInterfaceElement *iele = dynamic_cast<MInterfaceElement*>(ele);
+                if(iele->getElem(0)->getPartition()==0 or iele->getElem(0)->getPartition() == Msg::GetCommRank()+1) // if - element is ghost not computed to avoid to count twice the contribution
+                {
+                  ener += this->computeInterfacePathFollowingLocalValue(ele,dgdom,ws);
+                }
+              }
+              else
+             #endif // HAVE_MPI
+              {
+                ener += this->computeInterfacePathFollowingLocalValue(ele,dgdom,ws);
+              }
+            }
+          }
+        }
+      }
+    }
+    else if (_solver->getPathFollowingLocation() == nonLinearMechSolver::INTERFACE){
+      for(std::vector<partDomain*>::const_iterator itdom=domainVector->begin(); itdom!=domainVector->end(); ++itdom){
+        partDomain *dom = *itdom;
+        for(groupOfElements::elementContainer::const_iterator it=dom->g_cbegin(); it!=dom->g_cend(); ++it){
+          MElement *ele = *it;
+          ener += this->computeBulkPathFollowingLocalValue(ele,dom,ws);
+        }
+      }
+    }
+    else{
+      Msg::Fatal("path following location %d has not been correctly defined",_solver->getPathFollowingLocation());
+    }
 	}
 	return ener;
 };
@@ -726,7 +957,7 @@ int IPField::computeFractureEnergy(double * arrayEnergy,const IPStateBase::which
 IPField::IPField(nonLinearMechSolver* sl, std::vector<ip2archive> &vaip,
           const std::vector<dataBuildView> &dbview_, std::string filename): 
 					_solver(sl),elementsField(filename,100000000,1,dbview_),
-					_numOfActiveDamageIPs(0),_numOfActiveDamageIPsReached(0){
+					_numOfActiveDissipationIPs(0),_numOfActiveDissipationIPsReached(0){
   // Creation of storage for IP data
 	std::vector<partDomain*>* domainVector = _solver->getDomainVector();
   _AIPS = new AllIPState(*domainVector);
@@ -1101,7 +1332,7 @@ void IPField::closeFile()
   };
 }
 
-void IPField::blockDamage(const IPStateBase::whichState ws, const bool fl){
+void IPField::blockDissipation(const IPStateBase::whichState ws, const bool fl){
   AllIPState::ipstateContainer& allMap =*(_AIPS->getAIPSContainer());
   for(AllIPState::ipstateContainer::iterator it=allMap.begin(); it!=allMap.end();++it){
     std::vector<IPStateBase*>& vips = ((*it).second);
@@ -1109,7 +1340,7 @@ void IPField::blockDamage(const IPStateBase::whichState ws, const bool fl){
       IPVariable* ipv = vips[i]->getState(ws);
 			IPVariableMechanics* ipvMeca = dynamic_cast<IPVariableMechanics*>(ipv);
 			if (ipvMeca!=NULL){
-				ipvMeca->blockDamage(fl);
+				ipvMeca->blockDissipation(fl);
 			}
     }
   }
diff --git a/NonLinearSolver/internalPoints/ipField.h b/NonLinearSolver/internalPoints/ipField.h
index f6e29fec3c2262ff0da1f65f4adbcd0c774ff4ba..ad82bd8650beff44cf635e4fc460bc40292b1e37 100644
--- a/NonLinearSolver/internalPoints/ipField.h
+++ b/NonLinearSolver/internalPoints/ipField.h
@@ -180,8 +180,8 @@ class IPField : public elementsField {
     AllIPState *_AIPS;
     std::vector<ip2archive> viparch;
 		nonLinearMechSolver* _solver; // solver to which ipField belongs
-		int _numOfActiveDamageIPs;
-		int _numOfActiveDamageIPsReached;
+		int _numOfActiveDissipationIPs;
+		int _numOfActiveDissipationIPsReached;
 
  public :
   IPField(nonLinearMechSolver* sl, std::vector<ip2archive> &vaip,
@@ -209,9 +209,9 @@ class IPField : public elementsField {
   // Interaction with Aips
   void copy(IPStateBase::whichState source, IPStateBase::whichState dest){_AIPS->copy(source,dest);}
   void nextStep(const double time=0.);
-	int getNumOfActiveDamageIPs() const {return _numOfActiveDamageIPsReached;};
-	int getNumOfActiveDamageIPsCurrent() const {return _numOfActiveDamageIPs;};
-	void checkActiveDamage(const IPStateBase::whichState ws);
+	int getNumOfActiveDissipationIPs() const {return _numOfActiveDissipationIPsReached;};
+	int getNumOfActiveDissipationIPsCurrent() const {return _numOfActiveDissipationIPs;};
+	void checkActiveDissipation(const IPStateBase::whichState ws);
 
   // initial broken
   void initialBroken(GModel* pModel, std::vector<int> &vnumphys);
@@ -344,21 +344,24 @@ class IPField : public elementsField {
   double computeDeformationEnergy(const IPStateBase::whichState ws) const;
 	
   double computeBulkPlasticEnergy(MElement *ele, const partDomain *dom, const IPStateBase::whichState ws) const;
+  double computeInterfacePlasticEnergy(MElement *ele, const dgPartDomain *dom, const IPStateBase::whichState ws) const;
   double computePlasticEnergy(const IPStateBase::whichState ws) const;
+  
+  double computeBulkDamageEnergy(MElement *ele, const partDomain *dom, const IPStateBase::whichState ws) const;
+  double computeInterfaceDamageEnergy(MElement *ele, const dgPartDomain *dom, const IPStateBase::whichState ws) const;
+  double computeDamageEnergy(const IPStateBase::whichState ws) const;
 	
-	double computeBulkIrreversibleEnergy(MElement *ele, const partDomain *dom, const IPStateBase::whichState ws) const;
-	double computeInterfaceIrreversibleEnergy(MElement *ele, const dgPartDomain *dom, const IPStateBase::whichState ws) const;
-	double computeIrreversibleEnergy(const IPStateBase::whichState ws) const;
+	double computeBulkPathFollowingLocalValue(MElement *ele, const partDomain *dom, const IPStateBase::whichState ws) const;
+	double computeInterfacePathFollowingLocalValue(MElement *ele, const dgPartDomain *dom, const IPStateBase::whichState ws) const;
+	double computePathFollowingLocalValue(const IPStateBase::whichState ws) const;
 	
-  double computeInterfaceIrreversibleEnergy(const IPStateBase::whichState ws) const;
-
   int computeFractureEnergy(MElement *ele,const dgPartDomain *dom,double* arrayEnergy, const IPStateBase::whichState ws) const;
   int computeFractureEnergy(double * arrayEnergy,const IPStateBase::whichState ws) const;
 	
   // store all IPVariable values
   virtual void restart();
   // block damage of problem
-  virtual void blockDamage(const IPStateBase::whichState ws, const bool fl);
+  virtual void blockDissipation(const IPStateBase::whichState ws, const bool fl);
 	
 	virtual void checkCritialInterfaceIP();
 	
diff --git a/NonLinearSolver/internalPoints/ipFiniteStrain.cpp b/NonLinearSolver/internalPoints/ipFiniteStrain.cpp
index 6e392e26cfe81459e5e27dc3093f1145c86f6010..dba79dcc209d37fa368fa63b0ea55b564b29f118 100644
--- a/NonLinearSolver/internalPoints/ipFiniteStrain.cpp
+++ b/NonLinearSolver/internalPoints/ipFiniteStrain.cpp
@@ -96,7 +96,7 @@ std::vector<TensorialTraits<double>::ThirdDevType>& ipFiniteStrain::thirdDevf(Fu
 };
 
 double& ipFiniteStrain::getJacobianDeterminant(MInterfaceElement* ele, IntPt &GP) const{
-  if (_GPData == NULL){
+  if (_interfaceGPData == NULL){
 		_interfaceGPData = new IntPtData<double>();
 	};
 	MElement* e = dynamic_cast<MElement*>(ele);
diff --git a/NonLinearSolver/internalPoints/ipHyperelastic.cpp b/NonLinearSolver/internalPoints/ipHyperelastic.cpp
index 4d6c91f4c192d74631b4adef924c3cc53c71e921..f64bfcbae7cb1a138f63cf2b167f021c170d4e25 100644
--- a/NonLinearSolver/internalPoints/ipHyperelastic.cpp
+++ b/NonLinearSolver/internalPoints/ipHyperelastic.cpp
@@ -12,7 +12,8 @@
 #include "ipHyperelastic.h"
 #include "restartManager.h"
 
-IPHyperViscoElastic::IPHyperViscoElastic(const int N):IPVariableMechanics(),_N(N),_elasticEnergy(0.),_Ee(0.),_corKir(0.){
+IPHyperViscoElastic::IPHyperViscoElastic(const int N):IPVariableMechanics(),_N(N),_elasticEnergy(0.),_Ee(0.),_kirchhoff(0.),
+      _irreversibleEnergy(0.),_DirreversibleEnergyDF(0.){
   _A.clear();
   _B.clear();
   for (int i=0; i< N; i++){
@@ -22,18 +23,21 @@ IPHyperViscoElastic::IPHyperViscoElastic(const int N):IPVariableMechanics(),_N(N
   }
 };
 IPHyperViscoElastic::IPHyperViscoElastic(const IPHyperViscoElastic& src): IPVariableMechanics(src), _Ee(src._Ee),
-    _N(src._N),_A(src._A),_B(src._B),_elasticEnergy(src._elasticEnergy), _corKir(src._corKir){};
+    _N(src._N),_A(src._A),_B(src._B),_elasticEnergy(src._elasticEnergy), _kirchhoff(src._kirchhoff),
+    _irreversibleEnergy(src._irreversibleEnergy),_DirreversibleEnergyDF(src._DirreversibleEnergyDF){};
 
 IPHyperViscoElastic& IPHyperViscoElastic::operator =(const IPVariable& src){
   IPVariableMechanics::operator =(src);
   const IPHyperViscoElastic* psrc = dynamic_cast<const IPHyperViscoElastic*>(&src);
   if (psrc != NULL){
     _Ee = psrc->_Ee;
-    _corKir = psrc->_corKir;
+    _kirchhoff = psrc->_kirchhoff;
     _N = psrc->_N;
     _A = psrc->_A;
     _B = psrc->_B;
     _elasticEnergy = psrc->_elasticEnergy;
+    _irreversibleEnergy = psrc->_irreversibleEnergy;
+    _DirreversibleEnergyDF = psrc->_DirreversibleEnergyDF;
   }
   return *this;
 };
@@ -45,145 +49,21 @@ void IPHyperViscoElastic::restart() {
   restartManager::restart(_A);
   restartManager::restart(_B);
   restartManager::restart(_Ee);
-  restartManager::restart(_corKir);
-}
-
-IPHyperViscoElastoPlastic::IPHyperViscoElastoPlastic(const J2IsotropicHardening* comp,
-                const J2IsotropicHardening* trac,const J2IsotropicHardening* shear,
-                const kinematicHardening* kin, const int N) : IPHyperViscoElastic(N),_backsig(0.),
-                _Fe(1.),_Fp(1.),_nup(0.5),_plasticEnergy(0.),_irreversibleEnergy(0.),
-                _epspCompression(0.),_epspTraction(0.),_epspShear(0.),_epspbarre(0.),
-                _DepspbarreDF(0.),_r(0.),_gF(0.),_dgFdF(0.){
-  _ipCompression = NULL;
-  _ipTraction = NULL;
-  _ipShear = NULL;
-  _ipKinematic = NULL;
-
-  if (comp!= NULL)  comp->createIPVariable(_ipCompression);
-  if (trac != NULL) trac->createIPVariable(_ipTraction);
-  if (shear != NULL)  shear->createIPVariable(_ipShear);
-  if (kin != NULL) kin->createIPVariable(_ipKinematic);                    
-};
-IPHyperViscoElastoPlastic::IPHyperViscoElastoPlastic(const IPHyperViscoElastoPlastic& src) :IPHyperViscoElastic(src),
-    _backsig(src._backsig),_Fe(src._Fe),_Fp(src._Fp),_nup(src._nup),_plasticEnergy(src._plasticEnergy),_irreversibleEnergy(src._irreversibleEnergy),
-    _epspCompression(src._epspCompression),_epspTraction(src._epspTraction),_epspShear(src._epspShear),_epspbarre(src._epspbarre),
-    _DepspbarreDF(src._DepspbarreDF),_r(src._r),_gF(src._gF),_dgFdF(src._dgFdF){
-  
-  if (src._ipCompression != NULL)
-    _ipCompression = dynamic_cast<IPJ2IsotropicHardening*>(src._ipCompression->clone());
-  else
-    _ipCompression = NULL;
-
-  if (src._ipTraction != NULL)
-    _ipTraction = dynamic_cast<IPJ2IsotropicHardening*>(src._ipTraction->clone());
-  else
-   _ipTraction = NULL;
-
-  if (src._ipShear!= NULL)
-    _ipShear =dynamic_cast<IPJ2IsotropicHardening*> (src._ipShear->clone());
-  else
-    _ipShear = NULL;
-
-  if (src._ipKinematic != NULL)
-    _ipKinematic = dynamic_cast<IPKinematicHardening*>(src._ipKinematic->clone());
-  else
-    _ipKinematic = NULL;
-};
-IPHyperViscoElastoPlastic& IPHyperViscoElastoPlastic::operator =(const IPVariable &source){
-  IPHyperViscoElastic::operator =(source);
-  const IPHyperViscoElastoPlastic* psrc = dynamic_cast<const IPHyperViscoElastoPlastic*>(&source);
-  if (psrc != NULL){
-    _backsig = psrc->_backsig;
-    _Fe = psrc->_Fe;
-    _Fp = psrc->_Fp;
-    _nup =  psrc->_nup;
-    _plasticEnergy = psrc->_plasticEnergy;
-    _irreversibleEnergy = psrc->_irreversibleEnergy;
-    _epspCompression = psrc->_epspCompression;
-    _epspTraction = psrc->_epspTraction;
-    _epspShear = psrc->_epspShear;
-    _epspbarre = psrc->_epspbarre;
-    _DepspbarreDF = psrc->_DepspbarreDF;
-    _r = psrc->_r;
-    _gF = psrc->_gF;
-    _dgFdF = psrc->_dgFdF;
-    
-    if (_ipCompression != NULL) {
-      if ( psrc->_ipCompression != NULL){
-        _ipCompression->operator=(*dynamic_cast<const IPVariable*>(psrc->_ipCompression));
-      }
-    }
-
-    if (_ipTraction != NULL) {
-      if (psrc->_ipTraction != NULL) {
-        _ipTraction->operator= (*dynamic_cast<const IPVariable*>(psrc->_ipTraction));
-      }
-    }
-
-    if (_ipShear != NULL) {
-      if (psrc->_ipShear != NULL) {
-        _ipShear->operator= (*dynamic_cast<const IPVariable*>(psrc->_ipShear));
-      }
-    }
-
-    if (_ipKinematic!= NULL) {
-      if (psrc->_ipKinematic != NULL) {
-        _ipKinematic->operator= (*dynamic_cast<const IPVariable*>(psrc->_ipKinematic));
-      }
-    }
-  }
-  return *this;
-};
-IPHyperViscoElastoPlastic::~IPHyperViscoElastoPlastic(){
-  if (_ipCompression != NULL) delete _ipCompression;
-  _ipCompression = NULL;
-  if (_ipTraction != NULL) delete _ipTraction;
-  _ipTraction = NULL;
-  if (_ipShear != NULL) delete _ipShear;
-  _ipShear = NULL;
-  if (_ipKinematic!= NULL) delete _ipKinematic;
-  _ipKinematic = NULL;
-};
-
-void IPHyperViscoElastoPlastic::restart() {
-  IPHyperViscoElastic::restart();
-  if (_ipCompression != NULL)
-    restartManager::restart(_ipCompression);
-  if (_ipTraction != NULL)
-    restartManager::restart(_ipTraction);
-  if (_ipShear != NULL)
-    restartManager::restart(_ipShear);
-  if (_ipKinematic != NULL)
-    restartManager::restart(_ipKinematic);
-
-  restartManager::restart(_backsig);
-  restartManager::restart(_Fe);
-  restartManager::restart(_epspbarre);
-  restartManager::restart(_Fp);
-  restartManager::restart(_nup);
-  restartManager::restart(_plasticEnergy);
-  restartManager::restart(_epspCompression);
-  restartManager::restart(_epspTraction);
-  restartManager::restart(_epspShear);
+  restartManager::restart(_kirchhoff);
   restartManager::restart(_irreversibleEnergy);
-  restartManager::restart(_r);
-  restartManager::restart(_DepspbarreDF);
-  restartManager::restart(_gF);
-  restartManager::restart(_dgFdF);
-  return;
+  restartManager::restart(_DirreversibleEnergyDF);
 }
 
 
-IPHyperelastic::IPHyperelastic(const J2IsotropicHardening* comp,
+IPHyperViscoElastoPlastic::IPHyperViscoElastoPlastic(const J2IsotropicHardening* comp,
                     const J2IsotropicHardening* trac,
                     const J2IsotropicHardening* shear,
-                    const kinematicHardening* kin, const int N):IPVariableMechanics(),
-                    _backsig(0),_Fp(1.),_epspbarre(0.),_nup(0.), _elasticEnergy(0.),
+                    const kinematicHardening* kin, const int N):IPHyperViscoElastic(N),
+                    _backsig(0),_Fp(1.),_epspbarre(0.),_nup(0.),
                     _epspCompression(0.),_epspTraction(0.),_epspShear(0.),
-                    _J(1.),_Je(1.),_Jp(1.),_DgammaDt(0.),_DGDt(0.),_Fe(1.),_elasticStrainRate(0.),_strainRate(0.),
-                    _plasticStrainRate(0.),_kirchhoff(0.),_N(N),_Ee(0.),_r(0.),
-                    _DdevKcorDF(0.),_DpcorDF(0.),_DgammaDF(0.),
-                    _DFeDF(0.),_DFpDF(0.),_DKcorDF(0.),_gF(0.),_dgFdF(0.){
+                    _DgammaDt(0.),_Fe(1.),_r(0.),
+                    _DgammaDF(0.),_gF(0.),_dgFdF(0.), _plasticEnergy(0.),
+                    _dissipationActive(false),_dissipationBlocked(false){
 
   _ipCompression = NULL;
   _ipTraction = NULL;
@@ -194,24 +74,14 @@ IPHyperelastic::IPHyperelastic(const J2IsotropicHardening* comp,
   if (trac != NULL) trac->createIPVariable(_ipTraction);
   if (shear != NULL)  shear->createIPVariable(_ipShear);
   if (kin != NULL) kin->createIPVariable(_ipKinematic);
-
-  _A.clear();
-  _B.clear();
-  for (int i=0; i< N; i++){
-    STensor3 el(0.);
-    _A.push_back(el);
-    _B.push_back(0.);
-  }
 };
 
-IPHyperelastic::IPHyperelastic(const IPHyperelastic& src):IPVariableMechanics(src),_Fp(src._Fp),_epspbarre(src._epspbarre),_nup(src._nup),
+IPHyperViscoElastoPlastic::IPHyperViscoElastoPlastic(const IPHyperViscoElastoPlastic& src):IPHyperViscoElastic(src),
+      _Fp(src._Fp),_epspbarre(src._epspbarre),_nup(src._nup),
       _epspCompression(src._epspCompression),_epspTraction(src._epspTraction),_epspShear(src._epspShear),
-      _elasticEnergy(src._elasticEnergy),_backsig(src._backsig),
-      _J(src._J),_Je(src._Je),_Jp(src._Jp),_DgammaDt(src._DgammaDt),_DGDt(src._DGDt),_Fe(src._Fe),
-      _elasticStrainRate(src._elasticStrainRate),_strainRate(src._strainRate),_plasticStrainRate(src._plasticStrainRate),
-      _kirchhoff(src._kirchhoff),_N(src._N),_A(src._A),_B(src._B),_Ee(src._Ee), _r(src._r),
-      _DdevKcorDF(src._DdevKcorDF),_DpcorDF(src._DpcorDF),_DgammaDF(src._DgammaDF),
-      _DFeDF(src._DFeDF),_DFpDF(src._DFpDF),_DKcorDF(src._DKcorDF),_gF(src._gF),_dgFdF(src._dgFdF){
+      _backsig(src._backsig),_DgammaDt(src._DgammaDt),_Fe(src._Fe),
+       _r(src._r),_DgammaDF(src._DgammaDF),_gF(src._gF),_dgFdF(src._dgFdF),
+       _plasticEnergy(src._plasticEnergy),_dissipationActive(src._dissipationActive),_dissipationBlocked(src._dissipationBlocked){
   if (src._ipCompression != NULL)
     _ipCompression = dynamic_cast<IPJ2IsotropicHardening*>(src._ipCompression->clone());
   else
@@ -233,75 +103,69 @@ IPHyperelastic::IPHyperelastic(const IPHyperelastic& src):IPVariableMechanics(sr
     _ipKinematic = NULL;
 };
 
-IPHyperelastic& IPHyperelastic::operator =(const IPVariable &source){
-  IPVariableMechanics::operator=(source);
-  const IPHyperelastic* ps = dynamic_cast<const IPHyperelastic*>(&source);
+IPHyperViscoElastoPlastic& IPHyperViscoElastoPlastic::operator =(const IPVariable &source){
+  IPHyperViscoElastic::operator=(source);
+  const IPHyperViscoElastoPlastic* ps = dynamic_cast<const IPHyperViscoElastoPlastic*>(&source);
   if (ps != NULL){
-    _kirchhoff = ps->_kirchhoff;
     _backsig = ps->_backsig;
     _Fp = ps->_Fp;
     _epspbarre = ps->_epspbarre;
     _nup = ps->_nup;
-    _elasticEnergy = ps->_elasticEnergy;
-
     _epspCompression = ps->_epspCompression;
     _epspTraction = ps->_epspTraction;
     _epspShear = ps->_epspShear;
-
-    _J = ps->_J;
-    _Je = ps->_Je;
-    _Jp = ps->_Jp;
-
     _DgammaDt = ps->_DgammaDt;
-    _DGDt = ps->_DGDt;
-
-
     _Fe = ps->_Fe;
-    _elasticStrainRate = ps->_elasticStrainRate;
-    _plasticStrainRate = ps->_plasticStrainRate;
-    _strainRate = ps->_strainRate;
-
-    _Ee = ps->_Ee;
-
     _r = ps->_r;
-
-    _DdevKcorDF = ps->_DdevKcorDF;
-    _DpcorDF = ps->_DpcorDF;
     _DgammaDF = ps->_DgammaDF;
-    _DFeDF = ps->_DFeDF;
-    _DFpDF = ps->_DFpDF;
-
-    _DKcorDF = ps->_DKcorDF;
-
-    _N = ps->_N;
-    _A.clear();
-    _A.assign(ps->_A.begin(),ps->_A.end());
-    _B.clear();
-    _B.assign(ps->_B.begin(),ps->_B.end());
-
     _gF = ps->_gF;
     _dgFdF = ps->_dgFdF;
-
-    if (_ipCompression != NULL) delete _ipCompression;
-    _ipCompression = NULL;
-    if ( ps->_ipCompression != NULL) _ipCompression = dynamic_cast<IPJ2IsotropicHardening*>(ps->_ipCompression->clone());
-
-    if (_ipTraction != NULL) delete _ipTraction;
-    _ipTraction = NULL;
-    if (ps->_ipTraction != NULL) _ipTraction = dynamic_cast<IPJ2IsotropicHardening*>(ps->_ipTraction->clone());
-
-    if (_ipShear != NULL) delete _ipShear;
-    _ipShear = NULL;
-    if (ps->_ipShear != NULL) _ipShear = dynamic_cast<IPJ2IsotropicHardening*>(ps->_ipShear->clone());
-
-    if (_ipKinematic!= NULL) delete _ipKinematic;
-    _ipKinematic = NULL;
-    if (ps->_ipKinematic != NULL) _ipKinematic = dynamic_cast<IPKinematicHardening*>(ps->_ipKinematic->clone());
+    
+    _plasticEnergy = ps->_plasticEnergy;
+    _dissipationActive = ps->_dissipationActive;
+    _dissipationBlocked = ps->_dissipationBlocked;
+    
+    if ( ps->_ipCompression != NULL) {
+      if (_ipCompression == NULL){
+        _ipCompression = dynamic_cast<IPJ2IsotropicHardening*>(ps->_ipCompression->clone());
+      }
+      else{
+        _ipCompression->operator=(*dynamic_cast<const IPVariable*>(ps->_ipCompression));
+      }
+    }
+    
+     if ( ps->_ipTraction != NULL) {
+      if (_ipTraction == NULL){
+        _ipTraction = dynamic_cast<IPJ2IsotropicHardening*>(ps->_ipTraction->clone());
+      }
+      else{
+        _ipTraction->operator=(*dynamic_cast<const IPVariable*>(ps->_ipTraction));
+      }
+    }
+    
+    if ( ps->_ipShear != NULL) {
+      if (_ipShear == NULL){
+        _ipShear = dynamic_cast<IPJ2IsotropicHardening*>(ps->_ipShear->clone());
+      }
+      else{
+        _ipShear->operator=(*dynamic_cast<const IPVariable*>(ps->_ipShear));
+      }
+    }
+    
+    if ( ps->_ipKinematic != NULL) {
+      if (_ipKinematic == NULL){
+        _ipKinematic = dynamic_cast<IPKinematicHardening*>(ps->_ipKinematic->clone());
+      }
+      else{
+        _ipKinematic->operator=(*dynamic_cast<const IPVariable*>(ps->_ipKinematic));
+      }
+    }
+    
   }
   return *this;
 };
 
-IPHyperelastic::~IPHyperelastic(){
+IPHyperViscoElastoPlastic::~IPHyperViscoElastoPlastic(){
   if (_ipCompression != NULL) delete _ipCompression;
   _ipCompression = NULL;
   if (_ipTraction != NULL) delete _ipTraction;
@@ -313,8 +177,8 @@ IPHyperelastic::~IPHyperelastic(){
 };
 
 
-void IPHyperelastic::restart() {
-  IPVariableMechanics::restart();
+void IPHyperViscoElastoPlastic::restart() {
+  IPHyperViscoElastic::restart();
   if (_ipCompression != NULL)
     restartManager::restart(_ipCompression);
   if (_ipTraction != NULL)
@@ -326,197 +190,129 @@ void IPHyperelastic::restart() {
 
   restartManager::restart(_backsig);
   restartManager::restart(_Fe);
-  restartManager::restart(_elasticStrainRate);
-  restartManager::restart(_plasticStrainRate);
-  restartManager::restart(_strainRate);
   restartManager::restart(_epspbarre);
   restartManager::restart(_Fp);
   restartManager::restart(_nup);
-  restartManager::restart(_elasticEnergy);
   restartManager::restart(_epspCompression);
   restartManager::restart(_epspTraction);
   restartManager::restart(_epspShear);
-  restartManager::restart(_J);
-  restartManager::restart(_Je);
-  restartManager::restart(_Jp);
   restartManager::restart(_DgammaDt);
-  restartManager::restart(_DGDt);
-  restartManager::restart(_N);
-  restartManager::restart(_A);
-  restartManager::restart(_B);
   restartManager::restart(_r);
-  restartManager::restart(_DdevKcorDF);
-  restartManager::restart(_DpcorDF);
-  restartManager::restart(_DFeDF);
-  restartManager::restart(_DFpDF);
   restartManager::restart(_DgammaDF);
-  restartManager::restart(_DKcorDF);
   restartManager::restart(_gF);
   restartManager::restart(_dgFdF);
+  restartManager::restart(_plasticEnergy);
+  restartManager::restart(_dissipationActive);
+  restartManager::restart(_dissipationBlocked);
   return;
 }
 
-const STensor3& IPHyperelastic::getConstRefToBackStress() const{
+const STensor3& IPHyperViscoElastoPlastic::getConstRefToBackStress() const{
   return _backsig;
 };
 
-STensor3& IPHyperelastic::getRefToBackStress(){
+STensor3& IPHyperViscoElastoPlastic::getRefToBackStress(){
   return _backsig;
 };
 
-const STensor3& IPHyperelastic::getConstRefToKirchhoffStress() const{
-  return _kirchhoff;
-};
-STensor3& IPHyperelastic::getRefToKirchhoffStress(){
-  return _kirchhoff;
-};
 
-const STensor3& IPHyperelastic::getConstRefToFe() const{
+const STensor3& IPHyperViscoElastoPlastic::getConstRefToFe() const{
   return _Fe;
 };
-STensor3& IPHyperelastic::getRefToFe(){
+STensor3& IPHyperViscoElastoPlastic::getRefToFe(){
   return _Fe;
 };
 
-const STensor3& IPHyperelastic::getConstRefToElasticStrainRate() const{
-  return _elasticStrainRate;
-};
-STensor3& IPHyperelastic::getRefToElasticStrainRate(){
-  return _elasticStrainRate;
-};
-
-const STensor3& IPHyperelastic::getConstRefToPlasticStrainRate() const{
-  return _plasticStrainRate;
-};
-STensor3& IPHyperelastic::getRefToPlasticStrainRate(){
-  return _plasticStrainRate;
-};
-
-const STensor3& IPHyperelastic::getConstRefToStrainRate() const{
-  return _strainRate;
-};
-STensor3& IPHyperelastic::getRefToStrainRate(){
-  return _strainRate;
-};
-
-const STensor3 & IPHyperelastic::getConstRefToFp() const{
+const STensor3 & IPHyperViscoElastoPlastic::getConstRefToFp() const{
   return _Fp;
 };
-STensor3& IPHyperelastic::getRefToFp(){
+STensor3& IPHyperViscoElastoPlastic::getRefToFp(){
   return _Fp;
 };
 
-const double& IPHyperelastic::getConstRefToCompressionPlasticStrain() const{
+const double& IPHyperViscoElastoPlastic::getConstRefToCompressionPlasticStrain() const{
   return _epspCompression;
 };
-double & IPHyperelastic::getRefToCompressionPlasticStrain(){
+double & IPHyperViscoElastoPlastic::getRefToCompressionPlasticStrain(){
   return _epspCompression;
 };
 
-const double& IPHyperelastic::getConstRefToTractionPlasticStrain() const{
+const double& IPHyperViscoElastoPlastic::getConstRefToTractionPlasticStrain() const{
   return _epspTraction;
 };
-double & IPHyperelastic::getRefToTractionPlasticStrain(){
+double & IPHyperViscoElastoPlastic::getRefToTractionPlasticStrain(){
   return _epspTraction;
 };
 
-const double& IPHyperelastic::getConstRefToShearPlasticStrain() const{
+const double& IPHyperViscoElastoPlastic::getConstRefToShearPlasticStrain() const{
   return _epspShear;
 };
-double & IPHyperelastic::getRefToShearPlasticStrain(){
+double & IPHyperViscoElastoPlastic::getRefToShearPlasticStrain(){
   return _epspShear;
 };
 
-const double& IPHyperelastic::getConstRefToEqPlasticStrain() const{
+const double& IPHyperViscoElastoPlastic::getConstRefToEqPlasticStrain() const{
   return _epspbarre;
 };
-double& IPHyperelastic::getRefToEqPlasticStrain(){
+double& IPHyperViscoElastoPlastic::getRefToEqPlasticStrain(){
   return _epspbarre;
 };
 
-const double IPHyperelastic::getConstRefToPlasticPoissonRatio() const{
+const double IPHyperViscoElastoPlastic::getConstRefToPlasticPoissonRatio() const{
   return _nup;
 };
-double& IPHyperelastic::getRefToPlasticPoissonRatio(){
+double& IPHyperViscoElastoPlastic::getRefToPlasticPoissonRatio(){
   return _nup;
 };
 
-const double& IPHyperelastic::getConstRefToJacobian() const{
-  return _J;
-};
-double & IPHyperelastic::getRefToJacobian(){
-  return _J;
-};
-
-const double& IPHyperelastic::getConstRefToElasticJacobian() const{
-  return _Je;
-};
-double & IPHyperelastic::getRefToElasticJacobian(){
-  return _Je;
-};
-
-const double& IPHyperelastic::getConstRefToPlasticJacobian() const{
-  return _Jp;
-};
-double & IPHyperelastic::getRefToPlasticJacobian(){
-  return _Jp;
-};
-
-const double& IPHyperelastic::getConstRefToPlasticDeformationRate() const{
+const double& IPHyperViscoElastoPlastic::getConstRefToPlasticDeformationRate() const{
   return _DgammaDt;
 };
-double& IPHyperelastic::getRefToPlasticDeformationRate(){
+double& IPHyperViscoElastoPlastic::getRefToPlasticDeformationRate(){
   return _DgammaDt;
 };
 
-const double& IPHyperelastic::getConstRefToFlowFactorRate() const{
-  return _DGDt;
-};
-double& IPHyperelastic::getRefToFlowFactorRate(){
-  return _DGDt;
-};
-
-const IPJ2IsotropicHardening& IPHyperelastic::getConstRefToIPCompressionHardening() const{
+const IPJ2IsotropicHardening& IPHyperViscoElastoPlastic::getConstRefToIPCompressionHardening() const{
   if(_ipCompression==NULL)
-      Msg::Error("IPHyperelastic: _ipCompression not initialized");
+      Msg::Error("IPHyperViscoElastoPlastic: _ipCompression not initialized");
   return *_ipCompression;
 };
-IPJ2IsotropicHardening& IPHyperelastic::getRefToIPCompressionHardening(){
+IPJ2IsotropicHardening& IPHyperViscoElastoPlastic::getRefToIPCompressionHardening(){
   if(_ipCompression==NULL)
-      Msg::Error("IPHyperelastic: _ipCompression not initialized");
+      Msg::Error("IPHyperViscoElastoPlastic: _ipCompression not initialized");
   return *_ipCompression;
 };
 
-const IPJ2IsotropicHardening& IPHyperelastic::getConstRefToIPTractionHardening() const{
+const IPJ2IsotropicHardening& IPHyperViscoElastoPlastic::getConstRefToIPTractionHardening() const{
   if(_ipTraction==NULL)
-      Msg::Error("IPHyperelastic: _ipTraction not initialized");
+      Msg::Error("IPHyperViscoElastoPlastic: _ipTraction not initialized");
   return *_ipTraction;
 };
-IPJ2IsotropicHardening& IPHyperelastic::getRefToIPTractionHardening(){
+IPJ2IsotropicHardening& IPHyperViscoElastoPlastic::getRefToIPTractionHardening(){
   if(_ipTraction==NULL)
-      Msg::Error("IPHyperelastic: _ipTraction not initialized");
+      Msg::Error("IPHyperViscoElastoPlastic: _ipTraction not initialized");
   return *_ipTraction;
 };
 
-const IPJ2IsotropicHardening& IPHyperelastic::getConstRefToIPShearHardening() const{
+const IPJ2IsotropicHardening& IPHyperViscoElastoPlastic::getConstRefToIPShearHardening() const{
   if(_ipShear==NULL)
-      Msg::Error("IPHyperelastic: _ipShear not initialized");
+      Msg::Error("IPHyperViscoElastoPlastic: _ipShear not initialized");
   return *_ipShear;
 };
-IPJ2IsotropicHardening& IPHyperelastic::getRefToIPShearHardening(){
+IPJ2IsotropicHardening& IPHyperViscoElastoPlastic::getRefToIPShearHardening(){
   if(_ipShear==NULL)
-      Msg::Error("IPHyperelastic: _ipShear not initialized");
+      Msg::Error("IPHyperViscoElastoPlastic: _ipShear not initialized");
   return *_ipShear;
 };
 
-const IPKinematicHardening& IPHyperelastic::getConstRefToKinematicHardening() const{
+const IPKinematicHardening& IPHyperViscoElastoPlastic::getConstRefToKinematicHardening() const{
   if (_ipKinematic == NULL)
-    Msg::Error("IPHyperelastic: _ipKinematic not initialized");
+    Msg::Error("IPHyperViscoElastoPlastic: _ipKinematic not initialized");
   return *_ipKinematic;
 };
 
-IPKinematicHardening& IPHyperelastic::getRefToKinematicHardening(){
+IPKinematicHardening& IPHyperViscoElastoPlastic::getRefToKinematicHardening(){
   if (_ipKinematic == NULL)
-    Msg::Error("IPHyperelastic: _ipKinematic not initialized");
+    Msg::Error("IPHyperViscoElastoPlastic: _ipKinematic not initialized");
   return *_ipKinematic;
 };
diff --git a/NonLinearSolver/internalPoints/ipHyperelastic.h b/NonLinearSolver/internalPoints/ipHyperelastic.h
index 3fb00628ed4351999a5d7ad5b5f06e49b92fe922..ce84099e677f9268a47f59f04468fbeb55ad62f6 100644
--- a/NonLinearSolver/internalPoints/ipHyperelastic.h
+++ b/NonLinearSolver/internalPoints/ipHyperelastic.h
@@ -24,7 +24,10 @@ class IPHyperViscoElastic : public IPVariableMechanics{
     std::vector<double> _B; // N elements
     double _elasticEnergy; // elastic energy stored
     STensor3 _Ee; // elastic strain
-    STensor3 _corKir; // corotational Kirchhoff stress
+    STensor3 _kirchhoff; // corotational Kirchhoff stress
+    
+    double _irreversibleEnergy;
+    STensor3 _DirreversibleEnergyDF;
     
   public:
     IPHyperViscoElastic(const int N);
@@ -37,206 +40,72 @@ class IPHyperViscoElastic : public IPVariableMechanics{
     virtual STensor3& getRefToElasticStrain() {return _Ee;};
     virtual const STensor3& getConstRefToElasticStrain() const {return _Ee;};
     
-    virtual STensor3& getRefToCorotationalKirchhoffStress() {return _corKir;};
-    virtual const STensor3& getConstRefToCorotationalKirchhoffStress() const {return _corKir;};
+    virtual STensor3& getRefToCorotationalKirchhoffStress() {return _kirchhoff;};
+    virtual const STensor3& getConstRefToCorotationalKirchhoffStress() const {return _kirchhoff;};
     
     virtual double defoEnergy() const{return _elasticEnergy;}
     virtual double& getRefToElasticEnergy() {return _elasticEnergy;};
     virtual double plasticEnergy() const{return 0.;}
-    virtual void restart();
-};
-
-class IPHyperViscoElastoPlastic : public IPHyperViscoElastic{
-  public:
-    IPJ2IsotropicHardening* _ipCompression; // ip in compression
-    IPJ2IsotropicHardening* _ipTraction; // ip in traction
-    IPJ2IsotropicHardening* _ipShear; // ip in shear
-    IPKinematicHardening* _ipKinematic;
-    
-    STensor3 _backsig; // backstress // back stress
-    STensor3 _Fe; // elastic part of deformation gradient
-    STensor3 _Fp; // plastic part of the deformation gradient
-    double _nup; // plastic poisson ration
-
-    double _plasticEnergy; // plastic energy
-    double _irreversibleEnergy; // irreversible energy
-    
-    //plastic eq deformation in compression, traction and shear
-    double _epspCompression;
-    double _epspTraction;
-    double _epspShear;
-    
-    double _epspbarre; // equivalent plastic strain
-    STensor3 _DepspbarreDF; // DequivalentPlasticStrainDF
-   
-    
-    // failure
-    double _r;  // failure onset CR
-    double _gF; //post failure plastic defor 
-    STensor3 _dgFdF; // 
-  
-  public:
-    IPHyperViscoElastoPlastic(const J2IsotropicHardening* comp,
-                    const J2IsotropicHardening* trac,const J2IsotropicHardening* shear,
-                    const kinematicHardening* kin, const int N);
-    IPHyperViscoElastoPlastic(const IPHyperViscoElastoPlastic& src);
-    virtual IPHyperViscoElastoPlastic& operator =(const IPVariable &source);
-    virtual ~IPHyperViscoElastoPlastic();
-
-    virtual IPVariable* clone() const{return new IPHyperViscoElastoPlastic(*this);};
-    virtual void restart();
-    
-    virtual double plasticEnergy() const {return _plasticEnergy;};
-    virtual double& getRefToPlasticEnergy() {return _plasticEnergy;};
     
     virtual double irreversibleEnergy() const {return _irreversibleEnergy;};
     virtual double & getRefToIrreversibleEnergy() {return _irreversibleEnergy;};
     
-    virtual const IPJ2IsotropicHardening& getConstRefToIPCompressionHardening() const{
-      if(_ipCompression==NULL)
-          Msg::Error("IPHyperViscoElastoPlastic: _ipCompression not initialized");
-      return *_ipCompression;
-    };
-    virtual IPJ2IsotropicHardening& getRefToIPCompressionHardening(){
-      if(_ipCompression==NULL)
-          Msg::Error("IPHyperViscoElastoPlastic: _ipCompression not initialized");
-      return *_ipCompression;
-    };
-
-    virtual const IPJ2IsotropicHardening& getConstRefToIPTractionHardening() const{
-      if(_ipTraction==NULL)
-          Msg::Error("IPHyperViscoElastoPlastic: _ipTraction not initialized");
-      return *_ipTraction;
-    };
-    virtual IPJ2IsotropicHardening& getRefToIPTractionHardening(){
-      if(_ipTraction==NULL)
-          Msg::Error("IPHyperViscoElastoPlastic: _ipTraction not initialized");
-      return *_ipTraction;
-    };
-
-    virtual const IPJ2IsotropicHardening& getConstRefToIPShearHardening() const{
-      if(_ipShear==NULL)
-          Msg::Error("IPHyperViscoElastoPlastic: _ipShear not initialized");
-      return *_ipShear;
-    };
-    virtual IPJ2IsotropicHardening& getRefToIPShearHardening(){
-      if(_ipShear==NULL)
-          Msg::Error("IPHyperViscoElastoPlastic: _ipShear not initialized");
-      return *_ipShear;
-    };
-
-    virtual const IPKinematicHardening& getConstRefToKinematicHardening() const{
-      if (_ipKinematic == NULL)
-        Msg::Error("IPHyperViscoElastoPlastic: _ipKinematic not initialized");
-      return *_ipKinematic;
-    };
-
-    virtual IPKinematicHardening& getRefToKinematicHardening(){
-      if (_ipKinematic == NULL)
-        Msg::Error("IPHyperViscoElastoPlastic: _ipKinematic not initialized");
-      return *_ipKinematic;
-    };
-    
-
-    virtual const STensor3& getConstRefToBackStress() const {return _backsig;};
-    virtual STensor3& getRefToBackStress() {return _backsig;};
-    
-    virtual const STensor3 & getConstRefToFp() const {return _Fp;};
-    virtual STensor3& getRefToFp() {return _Fp;};
-    
-    virtual const STensor3& getConstRefToFe() const {return _Fe;};
-    virtual STensor3& getRefToFe() {return _Fe;};
-    
-    virtual const double& getConstRefToCompressionPlasticStrain() const {return _epspCompression;};
-    virtual double & getRefToCompressionPlasticStrain(){return _epspCompression;};;
-
-    virtual const double& getConstRefToTractionPlasticStrain() const {return _epspTraction;};
-    virtual double & getRefToTractionPlasticStrain(){return _epspTraction;};
-
-    virtual const double& getConstRefToShearPlasticStrain() const{return _epspShear;};
-    virtual double & getRefToShearPlasticStrain() {return _epspShear;};
-
-    virtual const double& getConstRefToEqPlasticStrain() const{return _epspbarre;};
-    virtual double& getRefToEqPlasticStrain(){return _epspbarre;};
-    
-    virtual const STensor3& getConstRefToDEqPlasticStrainDF() const{return _DepspbarreDF;};
-    virtual STensor3& getRefToDEqPlasticStrainDF(){return _DepspbarreDF;};
-
-    virtual const double getConstRefToPlasticPoissonRatio() const{return _nup;};
-    virtual double& getRefToPlasticPoissonRatio() {return _nup;};
+    virtual STensor3& getRefToDIrreversibleEnergyDF() {return _DirreversibleEnergyDF;};
+    virtual const STensor3& getConstRefToDIrreversibleEnergyDF() const{return _DirreversibleEnergyDF;};
     
-    virtual double getFailureOnset() const {return _r;};
-    virtual double& getRefToFailureOnset() {return _r;};
-
-    virtual double getFailurePlasticity() const {return _gF;};
-    virtual double& getRefToFailurePlasticity() {return _gF;};
-
-    virtual const STensor3& getConstRefToDFailurePlasticityDF() const {return _dgFdF;};
-    virtual STensor3& getRefToDFailurePlasticityDF() {return _dgFdF;};
+    virtual void restart();
 };
 
-class IPHyperelastic : public IPVariableMechanics{
+class IPHyperViscoElastoPlastic : public IPHyperViscoElastic{
   public: // defined with public to free access
     IPJ2IsotropicHardening* _ipCompression; // ip in compression
     IPJ2IsotropicHardening* _ipTraction; // ip in traction
     IPJ2IsotropicHardening* _ipShear; // ip in shear
     IPKinematicHardening* _ipKinematic;
 
-    //viscoelastic history
-    int _N; // number spring-Dashpot of element
-    std::vector<STensor3> _A; // N elements
-    std::vector<double> _B; // N elements
-
-    STensor3 _kirchhoff; // kirchhoff stress
-
-    STensor43 _DdevKcorDF; // DdevKirchhoff stress DF
-    STensor43 _DKcorDF; //
-    STensor3 _DpcorDF; // DpcorDF
-    STensor43 _DFeDF;
+   
     STensor3 _DgammaDF; // DequivalentPlasticStrainDF
-    STensor43 _DFpDF;
-
-
-    STensor3 _Ee; // elastic strain
     STensor3 _backsig; // backstress
     STensor3 _Fe; // elastic strain
-    STensor3 _elasticStrainRate; // De = dFeDt*invFe
-    STensor3 _plasticStrainRate; // Dp = dFpDt*invFp;
-    STensor3 _strainRate; // strain rate D = dFDt*invF = De+Fe*Dp*inFe
 
     double _epspbarre; // equivalent plastic strain
     STensor3 _Fp;    // plastic part of the deformation gradient
     double _nup; // plastic poisson ration
-    double _elasticEnergy; // elastic energy stored
 
     //plastic eq deformation in compression, traction and shear
     double _epspCompression;
     double _epspTraction;
     double _epspShear;
 
-    double _J, _Je, _Jp; // Jacobian, elastic jacobian, plastic jacobian
     double _DgammaDt; // plastic deformation rate
 
-    double _DGDt; // flow rule factor rate -->lamba = G/Dt
-
     // failure
     double _r;  // failure onset
     double _gF; //
     STensor3 _dgFdF;
-
+    
+    double _plasticEnergy;
+    bool _dissipationBlocked;
+    bool _dissipationActive;
 
   public:
-    IPHyperelastic(const J2IsotropicHardening* comp,
+    IPHyperViscoElastoPlastic(const J2IsotropicHardening* comp,
                     const J2IsotropicHardening* trac,const J2IsotropicHardening* shear,
                     const kinematicHardening* kin, const int N);
-    IPHyperelastic(const IPHyperelastic& src);
-    IPHyperelastic& operator =(const IPVariable &source);
-    virtual ~IPHyperelastic();
+    IPHyperViscoElastoPlastic(const IPHyperViscoElastoPlastic& src);
+    IPHyperViscoElastoPlastic& operator =(const IPVariable &source);
+    virtual ~IPHyperViscoElastoPlastic();
 
-    virtual IPVariable* clone() const{return new IPHyperelastic(*this);};
+    virtual IPVariable* clone() const{return new IPHyperViscoElastoPlastic(*this);};
+    
+      virtual bool& getRefToDissipationActive(){return _dissipationActive;};
+    virtual bool dissipationIsActive() const {return _dissipationActive;};
 
-    virtual double defoEnergy() const{return _elasticEnergy;}
-    virtual double plasticEnergy() const{return 0.;}
+    virtual void blockDissipation(const bool fl){_dissipationBlocked = fl;};
+    virtual bool dissipationIsBlocked() const{return _dissipationBlocked;};
+
+    virtual double& getRefToPlasticEnergy() {return _plasticEnergy;};
+    virtual double plasticEnergy() const{return _plasticEnergy;}
 
     virtual void restart();
 
@@ -255,21 +124,9 @@ class IPHyperelastic : public IPVariableMechanics{
     virtual const STensor3& getConstRefToBackStress() const;
     virtual STensor3& getRefToBackStress();
 
-    virtual const STensor3& getConstRefToKirchhoffStress() const;
-    virtual STensor3& getRefToKirchhoffStress();
-
     virtual const STensor3& getConstRefToFe() const;
     virtual STensor3& getRefToFe();
 
-    virtual const STensor3& getConstRefToElasticStrainRate() const;
-    virtual STensor3& getRefToElasticStrainRate();
-
-    virtual const STensor3& getConstRefToPlasticStrainRate() const;
-    virtual STensor3& getRefToPlasticStrainRate();
-
-    virtual const STensor3& getConstRefToStrainRate() const;
-    virtual STensor3& getRefToStrainRate();
-
     virtual const double& getConstRefToCompressionPlasticStrain() const;
     virtual double & getRefToCompressionPlasticStrain();
 
@@ -284,22 +141,10 @@ class IPHyperelastic : public IPVariableMechanics{
 
     virtual const double getConstRefToPlasticPoissonRatio() const;
     virtual double& getRefToPlasticPoissonRatio();
-
-    virtual const double& getConstRefToJacobian() const;
-    virtual double & getRefToJacobian();
-
-    virtual const double& getConstRefToElasticJacobian() const;
-    virtual double & getRefToElasticJacobian();
-
-    virtual const double& getConstRefToPlasticJacobian() const;
-    virtual double & getRefToPlasticJacobian();
-
+    
     virtual const double& getConstRefToPlasticDeformationRate() const;
     virtual double& getRefToPlasticDeformationRate();
 
-    virtual const double& getConstRefToFlowFactorRate() const;
-    virtual double& getRefToFlowFactorRate();
-
     virtual const IPJ2IsotropicHardening& getConstRefToIPCompressionHardening() const;
     virtual IPJ2IsotropicHardening& getRefToIPCompressionHardening();
 
@@ -312,7 +157,7 @@ class IPHyperelastic : public IPVariableMechanics{
     virtual const IPKinematicHardening& getConstRefToKinematicHardening() const;
     virtual IPKinematicHardening& getRefToKinematicHardening();
 
-    virtual void saturateHardening(const IPHyperelastic* ipvsource){
+    virtual void saturateHardening(const IPHyperViscoElastoPlastic* ipvsource){
       if (_ipCompression != NULL){
         _ipCompression->saturate(ipvsource->_epspCompression,ipvsource->_ipCompression);
       }
diff --git a/NonLinearSolver/internalPoints/ipJ2linear.cpp b/NonLinearSolver/internalPoints/ipJ2linear.cpp
index f7414593da40a7f410191f7f248958ad5e5cbe81..995465b41888d8d05ff1ebed2b02ac32c4a601fc 100644
--- a/NonLinearSolver/internalPoints/ipJ2linear.cpp
+++ b/NonLinearSolver/internalPoints/ipJ2linear.cpp
@@ -11,7 +11,7 @@
 #include "restartManager.h"
 IPJ2linear::IPJ2linear() : IPVariableMechanics(), _j2lepspbarre(0.), _j2lepsp(1.), _j2ldsy(0.),  _elasticEnergy(0.),
 _plasticPower(0.),_DplasticPowerDF(0.),_Ee(0.),_irreversibleEnergy(0.),_DirreversibleEnergyDF(0.),
-_damageBlocked(false)
+_dissipationBlocked(false),_dissipationActive(false),_plasticEnergy(0.)
 {
   ipvJ2IsotropicHardening=NULL;
   Msg::Error("IPJ2Linear::IPJ2Linear is not initialized with a hardening IP Variable");
@@ -19,7 +19,7 @@ _damageBlocked(false)
 };
 IPJ2linear::IPJ2linear(const J2IsotropicHardening *j2IH) : IPVariableMechanics(), _j2lepspbarre(0.), _j2lepsp(1.), _j2ldsy(0.),
 _elasticEnergy(0.),_plasticPower(0.),_DplasticPowerDF(0.),_Ee(0.),_irreversibleEnergy(0.),_DirreversibleEnergyDF(0.),
-_damageBlocked(false) {
+_dissipationBlocked(false),_dissipationActive(false),_plasticEnergy(0.) {
   ipvJ2IsotropicHardening=NULL;
   if(j2IH ==NULL) Msg::Error("IPJ2Linear::IPJ2Linear has no j2IH");
   j2IH->createIPVariable(ipvJ2IsotropicHardening);
@@ -31,7 +31,8 @@ IPJ2linear::IPJ2linear(const IPJ2linear &source) : IPVariableMechanics(source),
                                                    _plasticPower(source._plasticPower),_DplasticPowerDF(source._DplasticPowerDF),
                                                    _Ee(source._Ee),_irreversibleEnergy(source._irreversibleEnergy),
 																									 _DirreversibleEnergyDF(source._DirreversibleEnergyDF),
-																									 _damageBlocked(source._damageBlocked)
+																									 _dissipationBlocked(source._dissipationBlocked),_dissipationActive(source._dissipationActive),
+                                                   _plasticEnergy(source._plasticEnergy)
 {
   ipvJ2IsotropicHardening = NULL;
   if(source.ipvJ2IsotropicHardening != NULL)
@@ -54,7 +55,9 @@ IPJ2linear& IPJ2linear::operator=(const IPVariable &source)
     _Ee = src->_Ee;
 		_irreversibleEnergy = src->_irreversibleEnergy;
 		_DirreversibleEnergyDF = src->_DirreversibleEnergyDF;
-		_damageBlocked = src->_damageBlocked;
+		_dissipationBlocked = src->_dissipationBlocked;
+    _dissipationActive = src->_dissipationActive;
+    _plasticEnergy = src->_plasticEnergy;
     if(src->ipvJ2IsotropicHardening != NULL)
     {
       if (ipvJ2IsotropicHardening!=NULL){
@@ -80,10 +83,7 @@ double IPJ2linear::defoEnergy() const
 }
 double IPJ2linear::plasticEnergy() const
 {
-  if(ipvJ2IsotropicHardening != NULL)
-    return ipvJ2IsotropicHardening->getIntegR();
-  else
-    return 0.;
+  return _plasticEnergy;
 }
 
 void IPJ2linear::restart()
@@ -99,7 +99,9 @@ void IPJ2linear::restart()
   restartManager::restart(_Ee);
 	restartManager::restart(_irreversibleEnergy);
 	restartManager::restart(_DirreversibleEnergyDF);
-	restartManager::restart(_damageBlocked);
+	restartManager::restart(_dissipationBlocked);
+  restartManager::restart(_dissipationActive);
+  restartManager::restart(_plasticEnergy);
   return;
 }
 
diff --git a/NonLinearSolver/internalPoints/ipJ2linear.h b/NonLinearSolver/internalPoints/ipJ2linear.h
index 3e16194d99d690c571202ca8a05ccca141231998..12286c005346ad908d684e1ba2d858b9aac29adb 100644
--- a/NonLinearSolver/internalPoints/ipJ2linear.h
+++ b/NonLinearSolver/internalPoints/ipJ2linear.h
@@ -24,7 +24,8 @@ class IPJ2linear : public IPVariableMechanics
   STensor3 _j2lepsp;    // plastic part of the deformation gradient
   double _j2ldsy;       // yield stress increment
   double _elasticEnergy; // elastic energy stored
-
+  
+  double _plasticEnergy;
   double _plasticPower; // plastic power
   STensor3 _DplasticPowerDF; // dplastic power DF
   STensor3 _Ee; // elastic deformation
@@ -32,7 +33,8 @@ class IPJ2linear : public IPVariableMechanics
 	double _irreversibleEnergy;
 	STensor3 _DirreversibleEnergyDF;
 	
-	bool _damageBlocked;
+	bool _dissipationBlocked;
+  bool _dissipationActive;
 	
  public:
   IPJ2linear();
@@ -46,8 +48,12 @@ class IPJ2linear : public IPVariableMechanics
       delete ipvJ2IsotropicHardening; ipvJ2IsotropicHardening = NULL;
     }
   }
-	virtual void blockDamage(const bool fl){_damageBlocked = fl;};
-  virtual bool damageIsBlocked() const{return _damageBlocked;};
+  
+  virtual bool& getRefToDissipationActive(){return _dissipationActive;};
+  virtual bool dissipationIsActive() const {return _dissipationActive;};
+
+	virtual void blockDissipation(const bool fl){_dissipationBlocked = fl;};
+  virtual bool dissipationIsBlocked() const{return _dissipationBlocked;};
 	
   virtual double defoEnergy() const;
   virtual double plasticEnergy() const;
@@ -80,6 +86,7 @@ class IPJ2linear : public IPVariableMechanics
   virtual const double& getConstRefToYieldIncrement() const {return _j2ldsy;};
 
   virtual double& getRefToElasticEnergy() {return _elasticEnergy;};
+  virtual double& getRefToPlasticEnergy() {return _plasticEnergy;};
 
   virtual double& getRefToPlasticPower() {return _plasticPower;};
   virtual const double& getConstRefToPlasticPower() const {return _plasticPower;};
diff --git a/NonLinearSolver/internalPoints/ipNonLocalDamage.cpp b/NonLinearSolver/internalPoints/ipNonLocalDamage.cpp
index 1726d6531c8bb7dfa494399d6315e79348221932..23e676337ccd0058c31f2b36cbfcb191cbf9a9b8 100644
--- a/NonLinearSolver/internalPoints/ipNonLocalDamage.cpp
+++ b/NonLinearSolver/internalPoints/ipNonLocalDamage.cpp
@@ -139,6 +139,6 @@ void IPNonLocalDamage::restart()
   restartManager::restart(_nldStatev,_nldNsdv);
   restartManager::restart(_elasticEne);
   restartManager::restart(_plasticEne);
-  restartManager::restart(_damageBlocked);
+  restartManager::restart(_dissipationBlocked);
   return;
 }
diff --git a/NonLinearSolver/internalPoints/ipNonLocalDamage.h b/NonLinearSolver/internalPoints/ipNonLocalDamage.h
index dae84f3c651d166b136dd4c166fbee6b2063fba6..19214d9bb1b4507be8410bda492ac43cb45b0df3 100644
--- a/NonLinearSolver/internalPoints/ipNonLocalDamage.h
+++ b/NonLinearSolver/internalPoints/ipNonLocalDamage.h
@@ -39,7 +39,7 @@ class IPNonLocalDamage : public IPVariableMechanics
   double* _nldStatev;
   double _elasticEne;
   double _plasticEne;
-  bool _damageBlocked;
+  bool _dissipationBlocked;
 
  public:
   IPNonLocalDamage(int _nsdv) : IPVariableMechanics(), _nldNsdv(_nsdv), _nldStrain(6), _nldStress(6),
@@ -47,7 +47,7 @@ class IPNonLocalDamage : public IPVariableMechanics
                             _nldCouplingEffectiveStrainStress(6),
                             _nldEffectivePlasticStrain(0.), _nldCurrentPlasticStrain(0.), _nldDamage(0.),_nldSpBar(0.),
                             _pos_str_mtx(-1), _pos_str_inc(-1),_pos_stn_mtx(-1), _pos_stn_inc(-1), _elasticEne(0.), 
-                            _plasticEne(0.),_damageBlocked(false)
+                            _plasticEne(0.),_dissipationBlocked(false)
     {
        	mallocvector(&_nldStatev,_nldNsdv);
         for(int i = 0; i<_nldNsdv; i++) _nldStatev[i]=0.;
@@ -82,7 +82,7 @@ class IPNonLocalDamage : public IPVariableMechanics
 	_plasticEne=source._plasticEne;
        	mallocvector(&_nldStatev,_nldNsdv);
         copyvect(source._nldStatev,_nldStatev,_nldNsdv);
-        _damageBlocked = source._damageBlocked;
+        _dissipationBlocked = source._dissipationBlocked;
     }
   IPNonLocalDamage &operator = (const IPVariable &_source)
   {
@@ -106,7 +106,7 @@ class IPNonLocalDamage : public IPVariableMechanics
       _plasticEne=source->_plasticEne;
       if(_nldNsdv !=source->_nldNsdv) Msg::Error("IPNonLocalDamage do not have the same number of internal variables");
       copyvect(source->_nldStatev,_nldStatev,_nldNsdv);
-      _damageBlocked = source->_damageBlocked;
+      _dissipationBlocked = source->_dissipationBlocked;
       return *this;
   }
   virtual ~IPNonLocalDamage()
@@ -114,8 +114,8 @@ class IPNonLocalDamage : public IPVariableMechanics
       free(_nldStatev);
   }
   // Archiving data
-  virtual void blockDamage(const bool fl){_damageBlocked = fl;};
-  virtual bool damageIsBlocked() const {return _damageBlocked;};
+  virtual void blockDissipation(const bool fl){_dissipationBlocked = fl;};
+  virtual bool dissipationIsBlocked() const {return _dissipationBlocked;};
   virtual double get(const int i) const;
   virtual double defoEnergy() const;
   virtual double plasticEnergy() const;
diff --git a/NonLinearSolver/internalPoints/ipNonLocalDamageGurson.cpp b/NonLinearSolver/internalPoints/ipNonLocalDamageGurson.cpp
index e664e98e604b09c8ead9aa629393c8c044261535..2a2ff8905dee412b9cbf55f9dcbec55f12fa1a50 100644
--- a/NonLinearSolver/internalPoints/ipNonLocalDamageGurson.cpp
+++ b/NonLinearSolver/internalPoints/ipNonLocalDamageGurson.cpp
@@ -13,7 +13,7 @@
 
 IPNonLocalDamageGurson::IPNonLocalDamageGurson() : IPVariableMechanics(),  _elasticEnergy(0.),
                                                    _eplmatrix(0.), _fV(0),  _fVstar(0), _nldfVstar(0),_DFvStarDNldfVstar(1),
-                                                   _damageBlocked(false)
+                                                   _dissipationBlocked(false)
 {
   ipvJ2IsotropicHardening=NULL;
   ipvCL=NULL;
@@ -33,7 +33,7 @@ IPNonLocalDamageGurson::IPNonLocalDamageGurson(double fVinitial, const J2Isotrop
                                                  const std::vector<GursonDamageNucleation*> *gdnLawContainer) :
                                                  IPVariableMechanics(),  _elasticEnergy(0.),
                                                  _eplmatrix(0.), _fV(fVinitial),  _fVstar(fVinitial),
-                                                 _nldfVstar(fVinitial), _DFvStarDNldfVstar(1.),_damageBlocked(false)
+                                                 _nldfVstar(fVinitial), _DFvStarDNldfVstar(1.),_dissipationBlocked(false)
 {
   ipvJ2IsotropicHardening=NULL;
   if(j2IH ==NULL) Msg::Error("IPNonLocalDamageGurson::IPNonLocalDamageGurson has no j2IH");
@@ -92,7 +92,7 @@ IPNonLocalDamageGurson::IPNonLocalDamageGurson(const IPNonLocalDamageGurson &sou
   _logsqrtCe=source._logsqrtCe;
   _DFvStarDStrain=source._DFvStarDStrain;
   _DFvStarDNldfVstar=source._DFvStarDNldfVstar;
-  _damageBlocked = source._damageBlocked;
+  _dissipationBlocked = source._dissipationBlocked;
 }
 
 IPNonLocalDamageGurson& IPNonLocalDamageGurson::operator=(const IPVariable &source)
@@ -153,7 +153,7 @@ IPNonLocalDamageGurson& IPNonLocalDamageGurson::operator=(const IPVariable &sour
     _logsqrtCe=src->_logsqrtCe;
     _DFvStarDStrain=src->_DFvStarDStrain;
     _DFvStarDNldfVstar=src->_DFvStarDNldfVstar;
-    _damageBlocked = src->_damageBlocked;
+    _dissipationBlocked = src->_dissipationBlocked;
   }
   return *this;
 }
@@ -189,7 +189,7 @@ void IPNonLocalDamageGurson::restart()
   restartManager::restart(_Fp);
   restartManager::restart(_logsqrtCe);
   restartManager::restart(_DFvStarDStrain);
-  restartManager::restart(_damageBlocked);
+  restartManager::restart(_dissipationBlocked);
   return;
 }
 
diff --git a/NonLinearSolver/internalPoints/ipNonLocalDamageGurson.h b/NonLinearSolver/internalPoints/ipNonLocalDamageGurson.h
index f6a9669ee39421f50223f88235d9b1daccd043d7..c1d1798dfcb7b67f2ead49924ad59fe66513e369 100644
--- a/NonLinearSolver/internalPoints/ipNonLocalDamageGurson.h
+++ b/NonLinearSolver/internalPoints/ipNonLocalDamageGurson.h
@@ -42,7 +42,7 @@ class IPNonLocalDamageGurson : public IPVariableMechanics
   double _DFvStarDNldfVstar;  //derivative of the local corrected porosity with the non local corrected porosity
   
   // Damage and transition managing
-  bool _damageBlocked;
+  bool _dissipationBlocked;
 
 
  public:
@@ -81,8 +81,8 @@ class IPNonLocalDamageGurson : public IPVariableMechanics
   
   
   // Damage managing
-  virtual void blockDamage(const bool fl){_damageBlocked = fl;};
-  virtual bool damageIsBlocked() const {return _damageBlocked;};
+  virtual void blockDissipation(const bool fl){_dissipationBlocked = fl;};
+  virtual bool dissipationIsBlocked() const {return _dissipationBlocked;};
   
   
   // Access functions - members values
diff --git a/NonLinearSolver/internalPoints/ipNonLocalDamageHyperelastic.cpp b/NonLinearSolver/internalPoints/ipNonLocalDamageHyperelastic.cpp
index 231a3f22824ff1c1c422f395d5a76b53ce3f7e0e..91ff6a9ad2e8384c56647310d3802bae50e4a1df 100644
--- a/NonLinearSolver/internalPoints/ipNonLocalDamageHyperelastic.cpp
+++ b/NonLinearSolver/internalPoints/ipNonLocalDamageHyperelastic.cpp
@@ -11,27 +11,18 @@
 #include "ipNonLocalDamageHyperelastic.h"
 #include "restartManager.h"
 
-IPNonLocalDamageHyperelasic::IPNonLocalDamageHyperelasic(const J2IsotropicHardening* comp,
+IPHyperViscoElastoPlasticLocalDamage::IPHyperViscoElastoPlasticLocalDamage(const J2IsotropicHardening* comp,
                     const J2IsotropicHardening* trac,const J2IsotropicHardening* shear, const kinematicHardening* kin, const int N,
-                    const CLengthLaw *cll, const DamageLaw *daml): IPHyperelastic(comp,trac,shear,kin,N),_nldJ2HyperDLocalPlasticStrainDStrain(0),
-						_nldJ2HyperEffectivePlasticStrain (0),
-						_nldJ2HyperDLocalPlasticStrainDNonLocalPlasticStrain(0), Peff(0.),Leff(0.),_Dc(1.),_damageBlocked(false)
+                    const DamageLaw *daml): IPHyperViscoElastoPlastic(comp,trac,shear,kin,N),
+                     _Dc(1.)
 {
-  ipvCL=NULL;
-  if(cll ==NULL) Msg::Error("IPNonLocalDamageHyperelasic::IPNonLocalDamageHyperelasic has no cll");
-  cll->createIPVariable(ipvCL);
-
   ipvDam=NULL;
-  if(daml ==NULL) Msg::Error("IPNonLocalDamageHyperelasic::IPNonLocalDamageHyperelasic has no daml");
+  if(daml ==NULL) Msg::Error("IPHyperViscoElastoPlasticLocalDamage::IPHyperViscoElastoPlasticLocalDamage has no daml");
   daml->createIPVariable(ipvDam);
 
 };
 
-IPNonLocalDamageHyperelasic::~IPNonLocalDamageHyperelasic(){
-  if(ipvCL != NULL)
-  {
-    delete ipvCL;
-  }
+IPHyperViscoElastoPlasticLocalDamage::~IPHyperViscoElastoPlasticLocalDamage(){
   if(ipvDam !=NULL)
   {
     delete ipvDam;
@@ -39,52 +30,22 @@ IPNonLocalDamageHyperelasic::~IPNonLocalDamageHyperelasic(){
 };
 
 
-IPNonLocalDamageHyperelasic::IPNonLocalDamageHyperelasic(const IPNonLocalDamageHyperelasic &source):IPHyperelastic(source){
-  _nldJ2HyperDLocalPlasticStrainDStrain=source._nldJ2HyperDLocalPlasticStrainDStrain;
-  _nldJ2HyperEffectivePlasticStrain=source._nldJ2HyperEffectivePlasticStrain;
-  _nldJ2HyperDLocalPlasticStrainDNonLocalPlasticStrain=source._nldJ2HyperDLocalPlasticStrainDNonLocalPlasticStrain;
-  Peff = source.Peff;
-  Leff = source.Leff;
+IPHyperViscoElastoPlasticLocalDamage::IPHyperViscoElastoPlasticLocalDamage(const IPHyperViscoElastoPlasticLocalDamage &source):
+      IPHyperViscoElastoPlastic(source){
   _Dc = source._Dc;
-  _damageBlocked = source._damageBlocked;
-  ipvCL = NULL;
-  if(source.ipvCL != NULL)
-  {
-    ipvCL = dynamic_cast<IPCLength*>(source.ipvCL->clone());
-  }
   ipvDam = NULL;
   if(source.ipvDam != NULL)
   {
     ipvDam = dynamic_cast<IPDamage*>(source.ipvDam->clone());
   }
 };
-IPNonLocalDamageHyperelasic& IPNonLocalDamageHyperelasic::operator=(const IPVariable &source){
-  IPHyperelastic::operator=(source);
-  const IPNonLocalDamageHyperelasic* src = dynamic_cast<const IPNonLocalDamageHyperelasic*>(&source);
+IPHyperViscoElastoPlasticLocalDamage& IPHyperViscoElastoPlasticLocalDamage::operator=(const IPVariable &source){
+  IPHyperViscoElastoPlastic::operator=(source);
+  const IPHyperViscoElastoPlasticLocalDamage* src = dynamic_cast<const IPHyperViscoElastoPlasticLocalDamage*>(&source);
   if(src != NULL)
   {
-    _nldJ2HyperDLocalPlasticStrainDStrain=src->_nldJ2HyperDLocalPlasticStrainDStrain;
-
-    _nldJ2HyperEffectivePlasticStrain=src->_nldJ2HyperEffectivePlasticStrain;
-    _nldJ2HyperDLocalPlasticStrainDNonLocalPlasticStrain=src->_nldJ2HyperDLocalPlasticStrainDNonLocalPlasticStrain;
-    Peff = src->Peff;
-    Leff = src->Leff;
     _Dc = src->_Dc;
-    _damageBlocked = src->_damageBlocked;
 
-    
-    if(src->ipvCL != NULL)
-    {
-			if (ipvCL != NULL){
-				ipvCL->operator=(*dynamic_cast<const IPVariable*>(src->ipvCL));
-			}
-			else
-				ipvCL= dynamic_cast<IPCLength*>(src->ipvCL->clone());
-    }
-		else{
-			if(ipvCL != NULL) delete ipvCL; ipvCL = NULL;
-		}
-		
 		
     if(src->ipvDam != NULL)
     {
@@ -100,91 +61,176 @@ IPNonLocalDamageHyperelasic& IPNonLocalDamageHyperelasic::operator=(const IPVari
   return *this;
   };
 
-void IPNonLocalDamageHyperelasic::restart()
+void IPHyperViscoElastoPlasticLocalDamage::restart()
 {
-  IPHyperelastic::restart();
-  restartManager::restart(ipvCL);
+  IPHyperViscoElastoPlastic::restart();
   restartManager::restart(ipvDam);
-  restartManager::restart(_nldJ2HyperDLocalPlasticStrainDStrain);
-  restartManager::restart(_nldJ2HyperEffectivePlasticStrain);
-  restartManager::restart(_nldJ2HyperDLocalPlasticStrainDNonLocalPlasticStrain);
-  restartManager::restart(Peff);
-  restartManager::restart(Leff);
   restartManager::restart(_Dc);
-  restartManager::restart(_damageBlocked);
   return;
 }
 
 
+IPHyperViscoElastoPlasticNonLocalDamage::IPHyperViscoElastoPlasticNonLocalDamage(const J2IsotropicHardening* comp,
+                    const J2IsotropicHardening* trac,const J2IsotropicHardening* shear, const kinematicHardening* kin, const int N,
+                    const CLengthLaw *cll, const DamageLaw *daml): IPHyperViscoElastoPlasticLocalDamage(comp,trac,shear,kin,N,daml),
+                    _nonlocalPlasticStrain(0.), _DirreversibleEnergyDNonLocalVariable(0.)
+{
+  ipvCL=NULL;
+  if(cll ==NULL) Msg::Error("IPHyperViscoElastoPlasticNonLocalDamage::IPHyperViscoElastoPlasticNonLocalDamage has no cll");
+  cll->createIPVariable(ipvCL);
+};
 
-IPNonLocalDamageHyperelasicWithFailure::IPNonLocalDamageHyperelasicWithFailure(const J2IsotropicHardening* comp,
+IPHyperViscoElastoPlasticNonLocalDamage::~IPHyperViscoElastoPlasticNonLocalDamage(){
+  if(ipvCL != NULL)
+  {
+    delete ipvCL;
+  }
+};
+
+IPHyperViscoElastoPlasticNonLocalDamage::IPHyperViscoElastoPlasticNonLocalDamage(const IPHyperViscoElastoPlasticNonLocalDamage &source):
+      IPHyperViscoElastoPlasticLocalDamage(source), _nonlocalPlasticStrain(source._nonlocalPlasticStrain), 
+      _DirreversibleEnergyDNonLocalVariable(source._DirreversibleEnergyDNonLocalVariable){
+  ipvCL = NULL;
+  if(source.ipvCL != NULL)
+  {
+    ipvCL = dynamic_cast<IPCLength*>(source.ipvCL->clone());
+  }
+};
+IPHyperViscoElastoPlasticNonLocalDamage& IPHyperViscoElastoPlasticNonLocalDamage::operator=(const IPVariable &source){
+  IPHyperViscoElastoPlasticLocalDamage::operator=(source);
+  const IPHyperViscoElastoPlasticNonLocalDamage* src = dynamic_cast<const IPHyperViscoElastoPlasticNonLocalDamage*>(&source);
+  if(src != NULL)
+  {
+    _nonlocalPlasticStrain=src->_nonlocalPlasticStrain;
+    _DirreversibleEnergyDNonLocalVariable = src->_DirreversibleEnergyDNonLocalVariable;
+    if(src->ipvCL != NULL)
+    {
+			if (ipvCL != NULL){
+				ipvCL->operator=(*dynamic_cast<const IPVariable*>(src->ipvCL));
+			}
+			else
+				ipvCL= dynamic_cast<IPCLength*>(src->ipvCL->clone());
+    }
+		else{
+			if(ipvCL != NULL) delete ipvCL; ipvCL = NULL;
+		}
+   
+  }
+  return *this;
+};
+
+void IPHyperViscoElastoPlasticNonLocalDamage::restart()
+{
+  IPHyperViscoElastoPlasticLocalDamage::restart();
+  restartManager::restart(ipvCL);
+  restartManager::restart(_nonlocalPlasticStrain);
+  restartManager::restart(_DirreversibleEnergyDNonLocalVariable);
+};
+
+IPHyperViscoElastoPlasticMultipleLocalDamage::IPHyperViscoElastoPlasticMultipleLocalDamage(const J2IsotropicHardening* comp,
                 const J2IsotropicHardening* trac,const J2IsotropicHardening* shear, const kinematicHardening* kin,
-                const int N, const std::vector<CLengthLaw*>& cll, const std::vector<DamageLaw*>& dl): IPHyperelastic(comp,trac,shear,kin,N),
-                _nonlocalEqPlasticStrain(0.),_nonlocalFailurePlasticity(0.),
-                Peff(0.),Leff(0.),_Dc(1.){
-  numNonLocalVariable = cll.size();
-  ipvCL.clear();
+                const int N, const std::vector<DamageLaw*>& dl): IPHyperViscoElastoPlastic(comp,trac,shear,kin,N),
+                _Dc(1.){
+  numNonLocalVariable = dl.size();
   ipvDam.clear();
-  for (int i=0; i< cll.size(); i++){
-    IPCLength* ipvLength=NULL;
-    cll[i]->createIPVariable(ipvLength);
-    ipvCL.push_back(ipvLength);
+  for (int i=0; i< dl.size(); i++){
     IPDamage* ipvD = NULL;
     dl[i]->createIPVariable(ipvD);
     ipvDam.push_back(ipvD);
   }
 };
-IPNonLocalDamageHyperelasicWithFailure::~IPNonLocalDamageHyperelasicWithFailure(){
+IPHyperViscoElastoPlasticMultipleLocalDamage::~IPHyperViscoElastoPlasticMultipleLocalDamage(){
   for (int i=0; i< numNonLocalVariable; i++){
-    delete ipvCL[i];
     delete ipvDam[i];
   }
-  ipvCL.clear();
   ipvDam.clear();
 };
-IPNonLocalDamageHyperelasicWithFailure::IPNonLocalDamageHyperelasicWithFailure(const IPNonLocalDamageHyperelasicWithFailure& source):
-  IPHyperelastic(source){
+IPHyperViscoElastoPlasticMultipleLocalDamage::IPHyperViscoElastoPlasticMultipleLocalDamage(const IPHyperViscoElastoPlasticMultipleLocalDamage& source):
+  IPHyperViscoElastoPlastic(source){
   numNonLocalVariable = source.numNonLocalVariable;
-  _nonlocalEqPlasticStrain= source._nonlocalEqPlasticStrain;
-  _nonlocalFailurePlasticity = source._nonlocalFailurePlasticity;
-  Peff = source.Peff;
-  Leff = source.Leff;
   _Dc = source._Dc;
 
-  ipvCL.clear();
   ipvDam.clear();
   for (int i=0; i< numNonLocalVariable; i++){
-    if(source.ipvCL[i] != NULL){
-      ipvCL.push_back(dynamic_cast<IPCLength*>(source.ipvCL[i]->clone()));
-    }
     if(source.ipvDam[i] != NULL){
       ipvDam.push_back(dynamic_cast<IPDamage*>(source.ipvDam[i]->clone()));
     }
   }
 };
-IPNonLocalDamageHyperelasicWithFailure& IPNonLocalDamageHyperelasicWithFailure::operator=(const IPVariable& source){
-  IPHyperelastic::operator=(source);
-  const IPNonLocalDamageHyperelasicWithFailure* ipsource = dynamic_cast<const IPNonLocalDamageHyperelasicWithFailure*>(&source);
+IPHyperViscoElastoPlasticMultipleLocalDamage& IPHyperViscoElastoPlasticMultipleLocalDamage::operator=(const IPVariable& source){
+  IPHyperViscoElastoPlastic::operator=(source);
+  const IPHyperViscoElastoPlasticMultipleLocalDamage* ipsource = dynamic_cast<const IPHyperViscoElastoPlasticMultipleLocalDamage*>(&source);
   if (ipsource != NULL){
-    for (int i=0; i< numNonLocalVariable; i++){
-      if (ipvCL[i] != NULL) delete ipvCL[i];
-      if (ipvDam[i] != NULL) delete ipvDam[i];
+    numNonLocalVariable = ipsource->numNonLocalVariable;
+    _Dc = ipsource->_Dc;
+    for (int i=0; i< ipsource->numNonLocalVariable; i++){
+      if(ipsource->ipvDam[i] != NULL){
+        if (ipvDam[i] != NULL){
+          ipvDam[i]->operator=(*dynamic_cast<const IPVariable*>(ipsource->ipvDam[i]));
+        }
+      }
     }
-    ipvCL.clear();
-    ipvDam.clear();
+  }
+  return *this;
+};
 
-    numNonLocalVariable = ipsource->numNonLocalVariable;
+
+void IPHyperViscoElastoPlasticMultipleLocalDamage::restart(){
+  IPHyperViscoElastoPlastic::restart();
+  restartManager::restart(numNonLocalVariable);
+  restartManager::restart(_Dc);
+  for (int i=0; i< numNonLocalVariable; i++){
+    ipvDam[i]->restart();
+  }
+};
+
+
+
+IPHyperViscoElastoPlasticMultipleNonLocalDamage::IPHyperViscoElastoPlasticMultipleNonLocalDamage(const J2IsotropicHardening* comp,
+                const J2IsotropicHardening* trac,const J2IsotropicHardening* shear, const kinematicHardening* kin,
+                const int N, const std::vector<CLengthLaw*>& cll, const std::vector<DamageLaw*>& dl): 
+                IPHyperViscoElastoPlasticMultipleLocalDamage(comp,trac,shear,kin,N,dl),
+                _nonlocalEqPlasticStrain(0.),_nonlocalFailurePlasticity(0.){
+  ipvCL.clear();
+  _DirreversibleEnergyDNonLocalVariable.clear();
+  for (int i=0; i< cll.size(); i++){
+    IPCLength* ipvLength=NULL;
+    cll[i]->createIPVariable(ipvLength);
+    ipvCL.push_back(ipvLength);
+    _DirreversibleEnergyDNonLocalVariable.push_back(0.);
+  }
+};
+IPHyperViscoElastoPlasticMultipleNonLocalDamage::~IPHyperViscoElastoPlasticMultipleNonLocalDamage(){
+  for (int i=0; i< numNonLocalVariable; i++){
+    delete ipvCL[i];
+  }
+  ipvCL.clear();
+};
+IPHyperViscoElastoPlasticMultipleNonLocalDamage::IPHyperViscoElastoPlasticMultipleNonLocalDamage(const IPHyperViscoElastoPlasticMultipleNonLocalDamage& source):
+  IPHyperViscoElastoPlasticMultipleLocalDamage(source){
+  _nonlocalEqPlasticStrain= source._nonlocalEqPlasticStrain;
+  _nonlocalFailurePlasticity = source._nonlocalFailurePlasticity;
+  _DirreversibleEnergyDNonLocalVariable = source._DirreversibleEnergyDNonLocalVariable;
+  ipvCL.clear();
+  for (int i=0; i< numNonLocalVariable; i++){
+    if(source.ipvCL[i] != NULL){
+      ipvCL.push_back(dynamic_cast<IPCLength*>(source.ipvCL[i]->clone()));
+    }
+  }
+};
+IPHyperViscoElastoPlasticMultipleNonLocalDamage& IPHyperViscoElastoPlasticMultipleNonLocalDamage::operator=(const IPVariable& source){
+  IPHyperViscoElastoPlasticMultipleLocalDamage::operator=(source);
+  const IPHyperViscoElastoPlasticMultipleNonLocalDamage* ipsource = dynamic_cast<const IPHyperViscoElastoPlasticMultipleNonLocalDamage*>(&source);
+  if (ipsource != NULL){
     _nonlocalEqPlasticStrain = ipsource->_nonlocalEqPlasticStrain;
     _nonlocalFailurePlasticity = ipsource->_nonlocalFailurePlasticity;
-    Peff = ipsource->Peff;
-    Leff = ipsource->Leff;
-    _Dc = ipsource->_Dc;
+    _DirreversibleEnergyDNonLocalVariable = ipsource->_DirreversibleEnergyDNonLocalVariable;
+
     for (int i=0; i< ipsource->numNonLocalVariable; i++){
       if(ipsource->ipvCL[i] != NULL){
-        ipvCL.push_back(dynamic_cast<IPCLength*>(ipsource->ipvCL[i]->clone()));
-      }
-      if(ipsource->ipvDam[i] != NULL){
-        ipvDam.push_back(dynamic_cast<IPDamage*>(ipsource->ipvDam[i]->clone()));
+        if (ipvCL[i] != NULL){
+          ipvCL[i]->operator=(*dynamic_cast<const IPVariable*>(ipsource->ipvCL[i]));
+        }
       }
     }
   }
@@ -192,17 +238,14 @@ IPNonLocalDamageHyperelasicWithFailure& IPNonLocalDamageHyperelasicWithFailure::
 };
 
 
-void IPNonLocalDamageHyperelasicWithFailure::restart(){
-  IPHyperelastic::restart();
-  restartManager::restart(numNonLocalVariable);
+void IPHyperViscoElastoPlasticMultipleNonLocalDamage::restart(){
+  IPHyperViscoElastoPlasticMultipleLocalDamage::restart();
   restartManager::restart(_nonlocalEqPlasticStrain);
   restartManager::restart(_nonlocalFailurePlasticity);
-  restartManager::restart(Peff);
-  restartManager::restart(Leff);
-  restartManager::restart(_Dc);
+  for (int i=0; i< numNonLocalVariable; i++){
+    restartManager::restart(_DirreversibleEnergyDNonLocalVariable[i]);
+  }
   for (int i=0; i< numNonLocalVariable; i++){
     ipvCL[i]->restart();
-    ipvDam[i]->restart();
   }
-
 };
diff --git a/NonLinearSolver/internalPoints/ipNonLocalDamageHyperelastic.h b/NonLinearSolver/internalPoints/ipNonLocalDamageHyperelastic.h
index db1c0c55a3220e79b91569c0d38fcf284e20bab9..7b045c5207c583ca04bb19d07269ad77cb0aa1ee 100644
--- a/NonLinearSolver/internalPoints/ipNonLocalDamageHyperelastic.h
+++ b/NonLinearSolver/internalPoints/ipNonLocalDamageHyperelastic.h
@@ -18,258 +18,254 @@
 #include "CLengthLaw.h"
 #include "DamageLaw.h"
 
-class IPNonLocalDamageHyperelasic : public IPHyperelastic
+class IPHyperViscoElastoPlasticLocalDamage : public IPHyperViscoElastoPlastic
 {
  protected:
-  IPCLength* ipvCL;
   IPDamage*  ipvDam;
- protected: // All data public to avoid the creation of function to access
-
-  STensor3	_nldJ2HyperDLocalPlasticStrainDStrain;
-
-// bareps
-  double _nldJ2HyperEffectivePlasticStrain;
-  double _nldJ2HyperDLocalPlasticStrainDNonLocalPlasticStrain;
-
-  STensor3 Peff;
-  STensor43 Leff;
-
   double _Dc; // critical damage
-  bool _damageBlocked;
-
 
  public:
-  IPNonLocalDamageHyperelasic(const J2IsotropicHardening* comp,
+  IPHyperViscoElastoPlasticLocalDamage(const J2IsotropicHardening* comp,
                     const J2IsotropicHardening* trac,const J2IsotropicHardening* shear, const kinematicHardening* kin,
-                    const int N,
-                    const CLengthLaw *cll, const DamageLaw *dl);
-  virtual ~IPNonLocalDamageHyperelasic();
-
-  IPNonLocalDamageHyperelasic(const IPNonLocalDamageHyperelasic &source);
-  IPNonLocalDamageHyperelasic& operator=(const IPVariable &source);
-
-  virtual IPVariable* clone() const{return new IPNonLocalDamageHyperelasic(*this);}
-
+                    const int N, const DamageLaw *dl);
+  virtual ~IPHyperViscoElastoPlasticLocalDamage();
 
-  virtual void blockDamage(const bool fl){_damageBlocked = fl;};
-  virtual bool damageIsBlocked() const  {return _damageBlocked;};
+  IPHyperViscoElastoPlasticLocalDamage(const IPHyperViscoElastoPlasticLocalDamage &source);
+  virtual IPHyperViscoElastoPlasticLocalDamage& operator=(const IPVariable &source);
 
-  virtual const STensor3& getConstRefToEffectiveFirstPKStress() const {return Peff;};
-  virtual STensor3& getRefToEffectiveFirstPKStress()  { return Peff;};
-
-  virtual const STensor43& getConstRefToEffectiveTangentModuli() const {return Leff;};
-  virtual STensor43& getRefToEffectiveTangentModuli() {return Leff;};
+  virtual IPVariable* clone() const{return new IPHyperViscoElastoPlasticLocalDamage(*this);}
 
   virtual void setCriticalDamage(const double DT){_Dc = DT;};
   virtual double getCriticalDamage() const {return _Dc;};
 
-
   virtual void restart();
-  virtual double getCurrentPlasticStrain() const { return _epspbarre;}
-  virtual double &getRefToCurrentPlasticStrain() { return _epspbarre;}
-  virtual double getEffectivePlasticStrain() const { return _nldJ2HyperEffectivePlasticStrain;}
-  virtual double &getRefToEffectivePlasticStrain() { return _nldJ2HyperEffectivePlasticStrain;}
-
-  virtual double &getRefToDLocalPlasticStrainDNonLocalPlasticStrain()
-  {
-    return _nldJ2HyperDLocalPlasticStrainDNonLocalPlasticStrain;
-  }
-  virtual double getDLocalPlasticStrainDNonLocalPlasticStrain() const
-  {
-    return _nldJ2HyperDLocalPlasticStrainDNonLocalPlasticStrain;
-  }
-
-  virtual const STensor3 & getConstRefToDLocalPlasticStrainDStrain() const
-  {
-    return _nldJ2HyperDLocalPlasticStrainDStrain;
-  }
-  virtual STensor3 & getRefToDLocalPlasticStrainDStrain()
-  {
-    return _nldJ2HyperDLocalPlasticStrainDStrain;
-  }
-
-  virtual const IPCLength &getConstRefToIPCLength() const
-  {
-    if(ipvCL==NULL)
-      Msg::Error("IPNonLocalDamageQuadYieldHyper: ipvCL not initialized");
-    return *ipvCL;
-  }
-  virtual IPCLength &getRefToIPCLength()
-  {
-    if(ipvCL==NULL)
-      Msg::Error("IPNonLocalDamageQuadYieldHyper: ipvCL not initialized");
-    return *ipvCL;
-  }
-  virtual const STensor3 &getConstRefToCharacteristicLength() const
-  {
-    if(ipvCL==NULL)
-      Msg::Error("IPNonLocalDamageQuadYieldHyper: ipvCL not initialized");
-    return ipvCL->getConstRefToCL();
-  }
-  virtual STensor3 &getRefToCharacteristicLength() const
-  {
-    if(ipvCL==NULL)
-      Msg::Error("IPNonLocalDamageQuadYieldHyper: ipvCL not initialized");
-    return ipvCL->getRefToCL();
-  }
 
   virtual const IPDamage &getConstRefToIPDamage() const
   {
     if(ipvDam==NULL)
-      Msg::Error("IPNonLocalDamageQuadYieldHyper: ipvDam not initialized");
+      Msg::Error("IPHyperViscoElastoPlasticLocalDamage: ipvDam not initialized");
     return *ipvDam;
   }
   virtual IPDamage &getRefToIPDamage()
   {
     if(ipvDam==NULL)
-      Msg::Error("IPNonLocalDamageQuadYieldHyper: ipvDam not initialized");
+      Msg::Error("IPHyperViscoElastoPlasticLocalDamage: ipvDam not initialized");
     return *ipvDam;
   }
 
   virtual double getDamage() const
   {
     if(ipvDam==NULL)
-      Msg::Error("IPNonLocalDamageQuadYieldHyper: ipvDam not initialized");
+      Msg::Error("IPHyperViscoElastoPlasticLocalDamage: ipvDam not initialized");
     return ipvDam->getDamage();
   }
   virtual double getMaximalP() const
   {
     if(ipvDam==NULL)
-      Msg::Error("IPNonLocalDamageQuadYieldHyper: ipvDam not initialized");
+      Msg::Error("IPHyperViscoElastoPlasticLocalDamage: ipvDam not initialized");
     return ipvDam->getMaximalP();
   }
   virtual double getDeltaDamage() const
   {
     if(ipvDam==NULL)
-      Msg::Error("IPNonLocalDamageQuadYieldHyper: ipvDam not initialized");
+      Msg::Error("IPHyperViscoElastoPlasticLocalDamage: ipvDam not initialized");
     return ipvDam->getDeltaDamage();
   }
   virtual double getDDamageDp() const
   {
     if(ipvDam==NULL)
-      Msg::Error("IPNonLocalDamageQuadYieldHyper: ipvDam not initialized");
+      Msg::Error("IPHyperViscoElastoPlasticLocalDamage: ipvDam not initialized");
     return ipvDam->getDDamageDp();
   }
   virtual const STensor3 &getConstRefToDDamageDFe() const
   {
     if(ipvDam==NULL)
-      Msg::Error("IPNonLocalDamageQuadYieldHyper: ipvDam not initialized");
+      Msg::Error("IPHyperViscoElastoPlasticLocalDamage: ipvDam not initialized");
     return ipvDam->getConstRefToDDamageDFe();
   }
 
 };
 
-class IPNonLocalDamageHyperelasicWithFailure : public IPHyperelastic{
+
+class IPHyperViscoElastoPlasticNonLocalDamage : public IPHyperViscoElastoPlasticLocalDamage
+{
+ protected:
+  IPCLength* ipvCL;
+  double _nonlocalPlasticStrain;
+  double _DirreversibleEnergyDNonLocalVariable;
+
+ public:
+  IPHyperViscoElastoPlasticNonLocalDamage(const J2IsotropicHardening* comp,
+                    const J2IsotropicHardening* trac,const J2IsotropicHardening* shear, const kinematicHardening* kin,
+                    const int N,
+                    const CLengthLaw *cll, const DamageLaw *dl);
+  virtual ~IPHyperViscoElastoPlasticNonLocalDamage();
+
+  IPHyperViscoElastoPlasticNonLocalDamage(const IPHyperViscoElastoPlasticNonLocalDamage &source);
+  virtual IPHyperViscoElastoPlasticNonLocalDamage& operator=(const IPVariable &source);
+
+  virtual IPVariable* clone() const{return new IPHyperViscoElastoPlasticNonLocalDamage(*this);}
+  
+  virtual const double& getDIrreversibleEnergyDNonLocalVariable() const {return _DirreversibleEnergyDNonLocalVariable;};
+	virtual double& getRefToDIrreversibleEnergyDNonLocalVariable() {return _DirreversibleEnergyDNonLocalVariable;};
+
+  virtual void restart();
+  virtual double getCurrentPlasticStrain() const { return _epspbarre;}
+  virtual double &getRefToCurrentPlasticStrain() { return _epspbarre;}
+  virtual double getEffectivePlasticStrain() const { return _nonlocalPlasticStrain;}
+  virtual double &getRefToEffectivePlasticStrain() { return _nonlocalPlasticStrain;}
+
+  virtual const IPCLength &getConstRefToIPCLength() const
+  {
+    if(ipvCL==NULL)
+      Msg::Error("IPHyperViscoElastoPlasticNonLocalDamage: ipvCL not initialized");
+    return *ipvCL;
+  }
+  virtual IPCLength &getRefToIPCLength()
+  {
+    if(ipvCL==NULL)
+      Msg::Error("IPHyperViscoElastoPlasticNonLocalDamage: ipvCL not initialized");
+    return *ipvCL;
+  }
+  virtual const STensor3 &getConstRefToCharacteristicLength() const
+  {
+    if(ipvCL==NULL)
+      Msg::Error("IPHyperViscoElastoPlasticNonLocalDamage: ipvCL not initialized");
+    return ipvCL->getConstRefToCL();
+  }
+  virtual STensor3 &getRefToCharacteristicLength() const
+  {
+    if(ipvCL==NULL)
+      Msg::Error("IPHyperViscoElastoPlasticNonLocalDamage: ipvCL not initialized");
+    return ipvCL->getRefToCL();
+  }
+};
+
+class IPHyperViscoElastoPlasticMultipleLocalDamage : public IPHyperViscoElastoPlastic{
   protected:
     int numNonLocalVariable;
-    std::vector<IPCLength*> ipvCL;
     std::vector<IPDamage*> ipvDam;
-
-    // bareps
-    double _nonlocalEqPlasticStrain;
-    double _nonlocalFailurePlasticity;
-
-    STensor3 Peff;
-    STensor43 Leff;
+    
     double _Dc; // critical damage
 
   public:
-    IPNonLocalDamageHyperelasicWithFailure(const J2IsotropicHardening* comp,
+    IPHyperViscoElastoPlasticMultipleLocalDamage(const J2IsotropicHardening* comp,
                     const J2IsotropicHardening* trac,const J2IsotropicHardening* shear, const kinematicHardening* kin,
-                    const int N, const std::vector<CLengthLaw*>& cll, const std::vector<DamageLaw*>& dl);
-    virtual ~IPNonLocalDamageHyperelasicWithFailure();
-    IPNonLocalDamageHyperelasicWithFailure(const IPNonLocalDamageHyperelasicWithFailure& source);
-    IPNonLocalDamageHyperelasicWithFailure& operator=(const IPVariable& source);
-
-    virtual const STensor3& getConstRefToEffectiveFirstPKStress() const {return Peff;};
-    virtual STensor3& getRefToEffectiveFirstPKStress()  { return Peff;};
-
-    virtual const STensor43& getConstRefToEffectiveTangentModuli() const {return Leff;};
-    virtual STensor43& getRefToEffectiveTangentModuli() {return Leff;};
+                    const int N, const std::vector<DamageLaw*>& dl);
+    virtual ~IPHyperViscoElastoPlasticMultipleLocalDamage();
+    IPHyperViscoElastoPlasticMultipleLocalDamage(const IPHyperViscoElastoPlasticMultipleLocalDamage& source);
+    virtual IPHyperViscoElastoPlasticMultipleLocalDamage& operator=(const IPVariable& source);
 
     virtual void setCriticalDamage(const double DT){_Dc = DT;};
     virtual double getCriticalDamage() const {return _Dc;};
 
     virtual int getNumNonLocalVariable() const{return numNonLocalVariable;};
-    virtual IPVariable* clone() const{return new IPNonLocalDamageHyperelasicWithFailure(*this);}
+    virtual IPVariable* clone() const{return new IPHyperViscoElastoPlasticMultipleLocalDamage(*this);}
 
     virtual void restart();
-    virtual double getCurrentPlasticStrain() const { return _epspbarre;}
-    virtual double &getRefToCurrentPlasticStrain() { return _epspbarre;}
-    virtual double getEffectivePlasticStrain() const { return _nonlocalEqPlasticStrain;}
-    virtual double &getRefToEffectivePlasticStrain() { return _nonlocalEqPlasticStrain;}
-
-    virtual double getNonLocalFailurePlasticity() const {return _nonlocalFailurePlasticity;};
-    virtual double & getRefToNonLocalFailurePlasticity() {return _nonlocalFailurePlasticity;};
-
-    virtual const IPCLength &getConstRefToIPCLength(const int i) const
-    {
-      if(ipvCL[i]==NULL)
-        Msg::Error("IPNonLocalDamageHyperelasicWithFailure: ipvCL[%d] not initialized",i);
-      return *ipvCL[i];
-    }
-    virtual IPCLength &getRefToIPCLength(const int i)
-    {
-      if(ipvCL[i]==NULL)
-        Msg::Error("IPNonLocalDamageHyperelasicWithFailure: ipvCL[%d] not initialized",i);
-      return *ipvCL[i];
-    }
-    virtual const STensor3 &getConstRefToCharacteristicLength(const int i) const
-    {
-      if(ipvCL[i]==NULL)
-        Msg::Error("IPNonLocalDamageHyperelasicWithFailure: ipvCL[%d] not initialized",i);
-      return ipvCL[i]->getConstRefToCL();
-    }
-    virtual STensor3 &getRefToCharacteristicLength(const int i) const
-    {
-      if(ipvCL[i]==NULL)
-        Msg::Error("IPNonLocalDamageHyperelasicWithFailure: ipvCL[%d] not initialized",i);
-      return ipvCL[i]->getRefToCL();
-    }
 
     virtual const IPDamage &getConstRefToIPDamage(const int i) const
     {
       if(ipvDam[i]==NULL)
-        Msg::Error("IPNonLocalDamageHyperelasicWithFailure: ipvCL[%d] not initialized",i);
+        Msg::Error("IPHyperViscoElastoPlasticMultipleLocalDamage: ipvCL[%d] not initialized",i);
       return *ipvDam[i];
     }
     virtual IPDamage &getRefToIPDamage(const int i)
     {
       if(ipvDam[i]==NULL)
-        Msg::Error("IPNonLocalDamageHyperelasicWithFailure: ipvCL[%d] not initialized",i);
+        Msg::Error("IPHyperViscoElastoPlasticMultipleLocalDamage: ipvCL[%d] not initialized",i);
       return *ipvDam[i];
     }
 
     virtual double getDamage(const int i) const
     {
       if(ipvDam[i]==NULL)
-        Msg::Error("IPNonLocalDamageHyperelasicWithFailure: ipvCL[%d] not initialized",i);
+        Msg::Error("IPHyperViscoElastoPlasticMultipleLocalDamage: ipvCL[%d] not initialized",i);
       return ipvDam[i]->getDamage();
     }
     virtual double getMaximalP(const int i) const
     {
       if(ipvDam[i]==NULL)
-        Msg::Error("IPNonLocalDamageHyperelasicWithFailure: ipvCL[%d] not initialized",i);
+        Msg::Error("IPHyperViscoElastoPlasticMultipleLocalDamage: ipvCL[%d] not initialized",i);
       return ipvDam[i]->getMaximalP();
     }
     virtual double getDeltaDamage(const int i) const
     {
       if(ipvDam[i]==NULL)
-        Msg::Error("IPNonLocalDamageHyperelasicWithFailure: ipvCL[%d] not initialized",i);
+        Msg::Error("IPHyperViscoElastoPlasticMultipleLocalDamage: ipvCL[%d] not initialized",i);
       return ipvDam[i]->getDeltaDamage();
     }
     virtual double getDDamageDp( const int i) const
     {
       if(ipvDam[i]==NULL)
-        Msg::Error("IPNonLocalDamageHyperelasicWithFailure: ipvCL[%d] not initialized",i);
+        Msg::Error("IPHyperViscoElastoPlasticMultipleLocalDamage: ipvCL[%d] not initialized",i);
       return ipvDam[i]->getDDamageDp();
     }
     virtual const STensor3 &getConstRefToDDamageDFe(const int i) const
     {
       if(ipvDam[i]==NULL)
-        Msg::Error("IPNonLocalDamageHyperelasicWithFailure: ipvCL[%d] not initialized",i);
+        Msg::Error("IPHyperViscoElastoPlasticMultipleLocalDamage: ipvCL[%d] not initialized",i);
       return ipvDam[i]->getConstRefToDDamageDFe();
     }
 };
 
+
+
+class IPHyperViscoElastoPlasticMultipleNonLocalDamage : public IPHyperViscoElastoPlasticMultipleLocalDamage{
+  protected:
+    std::vector<IPCLength*> ipvCL;
+    // bareps
+    double _nonlocalEqPlasticStrain;
+    double _nonlocalFailurePlasticity;
+    std::vector<double> _DirreversibleEnergyDNonLocalVariable;
+
+  public:
+    IPHyperViscoElastoPlasticMultipleNonLocalDamage(const J2IsotropicHardening* comp,
+                    const J2IsotropicHardening* trac,const J2IsotropicHardening* shear, const kinematicHardening* kin,
+                    const int N, const std::vector<CLengthLaw*>& cll, const std::vector<DamageLaw*>& dl);
+    virtual ~IPHyperViscoElastoPlasticMultipleNonLocalDamage();
+    IPHyperViscoElastoPlasticMultipleNonLocalDamage(const IPHyperViscoElastoPlasticMultipleNonLocalDamage& source);
+    virtual IPHyperViscoElastoPlasticMultipleNonLocalDamage& operator=(const IPVariable& source);
+
+    virtual IPVariable* clone() const{return new IPHyperViscoElastoPlasticMultipleNonLocalDamage(*this);}
+    
+    virtual const double& getDIrreversibleEnergyDNonLocalVariable(const int i) const {return _DirreversibleEnergyDNonLocalVariable[i];};
+    virtual double& getRefToDIrreversibleEnergyDNonLocalVariable(const int i) {return _DirreversibleEnergyDNonLocalVariable[i];};
+
+    virtual void restart();
+    virtual double getCurrentPlasticStrain() const { return _epspbarre;}
+    virtual double &getRefToCurrentPlasticStrain() { return _epspbarre;}
+    
+    virtual double getEffectivePlasticStrain() const { return _nonlocalEqPlasticStrain;}
+    virtual double &getRefToEffectivePlasticStrain() { return _nonlocalEqPlasticStrain;}
+
+    virtual double getNonLocalFailurePlasticity() const {return _nonlocalFailurePlasticity;};
+    virtual double & getRefToNonLocalFailurePlasticity() {return _nonlocalFailurePlasticity;};
+
+    virtual const IPCLength &getConstRefToIPCLength(const int i) const
+    {
+      if(ipvCL[i]==NULL)
+        Msg::Error("IPHyperViscoElastoPlasticMultipleNonLocalDamage: ipvCL[%d] not initialized",i);
+      return *ipvCL[i];
+    }
+    virtual IPCLength &getRefToIPCLength(const int i)
+    {
+      if(ipvCL[i]==NULL)
+        Msg::Error("IPHyperViscoElastoPlasticMultipleNonLocalDamage: ipvCL[%d] not initialized",i);
+      return *ipvCL[i];
+    }
+    virtual const STensor3 &getConstRefToCharacteristicLength(const int i) const
+    {
+      if(ipvCL[i]==NULL)
+        Msg::Error("IPHyperViscoElastoPlasticMultipleNonLocalDamage: ipvCL[%d] not initialized",i);
+      return ipvCL[i]->getConstRefToCL();
+    }
+    virtual STensor3 &getRefToCharacteristicLength(const int i) const
+    {
+      if(ipvCL[i]==NULL)
+        Msg::Error("IPHyperViscoElastoPlasticMultipleNonLocalDamage: ipvCL[%d] not initialized",i);
+      return ipvCL[i]->getRefToCL();
+    }
+};
+
 #endif // IPNONLOCALDAMAGEHYPERELASTIC_H_
diff --git a/NonLinearSolver/internalPoints/ipNonLocalDamageIsotropicElasticity.cpp b/NonLinearSolver/internalPoints/ipNonLocalDamageIsotropicElasticity.cpp
index ed5c69b85dc37a87af94be021637127fcf3c3a92..cce622f394d35d02b3f0049b2983d50af184fa9a 100644
--- a/NonLinearSolver/internalPoints/ipNonLocalDamageIsotropicElasticity.cpp
+++ b/NonLinearSolver/internalPoints/ipNonLocalDamageIsotropicElasticity.cpp
@@ -12,7 +12,8 @@
 
 IPNonLocalDamageIsotropicElasticity::IPNonLocalDamageIsotropicElasticity(const CLengthLaw* cLLaw, const DamageLaw* damLaw)
     : IPVariableMechanics(), _elasticEnergy(0.), _EffectiveStrains(0.), _NonLocalEffectiveStrains(0.), _CriticalEffectiveStrains(0.), _Dc(1.), _NonLocalToLocal(false),
-    _damageBlocked(false),_activeDamaging(false), _irreversibleEnergy(0.), _DirreversibleEnergyDF(0.), _DirreversibleEnergyDNonLocalVariable(0.) 
+    _dissipationBlocked(false),_activeDamaging(false), _irreversibleEnergy(0.), _DirreversibleEnergyDF(0.), _DirreversibleEnergyDNonLocalVariable(0.),
+    _damageEnergy(0.)
 {
     _ipvCL = NULL;
     if(cLLaw == NULL)
@@ -45,12 +46,12 @@ IPNonLocalDamageIsotropicElasticity::IPNonLocalDamageIsotropicElasticity(const I
     _CriticalEffectiveStrains = source._CriticalEffectiveStrains;
     _Dc = source._Dc;
     _NonLocalToLocal = source._NonLocalToLocal;
-    _damageBlocked = source._damageBlocked;
+    _dissipationBlocked = source._dissipationBlocked;
     _activeDamaging = source._activeDamaging;
     _irreversibleEnergy = source._irreversibleEnergy;
     _DirreversibleEnergyDF = source._DirreversibleEnergyDF;
     _DirreversibleEnergyDNonLocalVariable = source._DirreversibleEnergyDNonLocalVariable;
-
+    _damageEnergy = source._damageEnergy;
     if(source._ipvCL != NULL)
     {
       _ipvCL = dynamic_cast<IPCLength*>(source._ipvCL->clone());
@@ -74,11 +75,12 @@ IPNonLocalDamageIsotropicElasticity& IPNonLocalDamageIsotropicElasticity::operat
     _CriticalEffectiveStrains = src->_CriticalEffectiveStrains;
     _Dc = src->_Dc;
     _NonLocalToLocal = src->_NonLocalToLocal;
-    _damageBlocked = src->_damageBlocked;
+    _dissipationBlocked = src->_dissipationBlocked;
     _activeDamaging = src->_activeDamaging;
     _irreversibleEnergy = src->_irreversibleEnergy;
     _DirreversibleEnergyDF = src->_DirreversibleEnergyDF;
     _DirreversibleEnergyDNonLocalVariable = src->_DirreversibleEnergyDNonLocalVariable;
+    _damageEnergy = src->_damageEnergy;
 
     if(src->_ipvCL != NULL)
     {
@@ -122,11 +124,12 @@ void IPNonLocalDamageIsotropicElasticity::restart()
   restartManager::restart(_CriticalEffectiveStrains);
   restartManager::restart(_Dc);
   restartManager::restart(_NonLocalToLocal);
-  restartManager::restart(_damageBlocked);
+  restartManager::restart(_dissipationBlocked);
   restartManager::restart(_activeDamaging);
   restartManager::restart(_irreversibleEnergy);
   restartManager::restart(_DirreversibleEnergyDF);
   restartManager::restart(_DirreversibleEnergyDNonLocalVariable);
+  restartManager::restart(_damageEnergy);
   return;
 }
 
diff --git a/NonLinearSolver/internalPoints/ipNonLocalDamageIsotropicElasticity.h b/NonLinearSolver/internalPoints/ipNonLocalDamageIsotropicElasticity.h
index 42fe8bbc801055fe2e45ca96ac9979fe09ca5567..d8eb25f3e76a018edf70a76c4f0bb419cb5abf03 100644
--- a/NonLinearSolver/internalPoints/ipNonLocalDamageIsotropicElasticity.h
+++ b/NonLinearSolver/internalPoints/ipNonLocalDamageIsotropicElasticity.h
@@ -31,7 +31,9 @@ protected:
     double _Dc;                         // Critical damage value
     bool _NonLocalToLocal;              // Flag to switch (if true) between non-local and local scheme after Dc
     bool _activeDamaging;               // true if damage growing false otherwise
-    bool _damageBlocked;                // Flag true if damage evolution is blocked
+    bool _dissipationBlocked;                // Flag true if damage evolution is blocked
+    
+    double _damageEnergy;
     
     // Path following
     double _irreversibleEnergy;         // Irreversible energy (=dissipated) accumulated from the beginning
@@ -57,15 +59,17 @@ public:
             }
     }
 
-    virtual void blockDamage(const bool fl){_damageBlocked = fl;};
-    virtual bool damageIsBlocked() const {return _damageBlocked;};
+    virtual void blockDissipation(const bool fl){_dissipationBlocked = fl;};
+    virtual bool dissipationIsBlocked() const {return _dissipationBlocked;};
 
     virtual void activeDamage(const bool flg) {_activeDamaging = flg;};
-    virtual bool isActiveDamage() const {return _activeDamaging;};
+    virtual bool dissipationIsActive() const {return _activeDamaging;};
 
     // General functions
     virtual double defoEnergy() const {return _elasticEnergy;};
     virtual double plasticEnergy() const{return 0.;}
+    virtual double damageEnergy() const {return _damageEnergy;};
+    virtual double& getRefToDamageEnergy() {return _damageEnergy;};
     virtual void restart();
     virtual IPVariable* clone() const {return new IPNonLocalDamageIsotropicElasticity(*this);};
 
diff --git a/NonLinearSolver/internalPoints/ipNonLocalDamageJ2Hyper.cpp b/NonLinearSolver/internalPoints/ipNonLocalDamageJ2Hyper.cpp
index d85e5844fab98328c028a992bb9f2d919bd27427..f465c0f587088f11525a020e4342c5ea2eb787db 100644
--- a/NonLinearSolver/internalPoints/ipNonLocalDamageJ2Hyper.cpp
+++ b/NonLinearSolver/internalPoints/ipNonLocalDamageJ2Hyper.cpp
@@ -10,9 +10,7 @@
 #include "ipNonLocalDamageJ2Hyper.h"
 #include "restartManager.h"
 
-IPLocalDamageJ2Hyper::IPLocalDamageJ2Hyper() : IPJ2linear(),
-              Dc(1.),activeDamaging(false),
-              _nldJ2HyperDLocalPlasticStrainDStrain(0.)
+IPLocalDamageJ2Hyper::IPLocalDamageJ2Hyper() : IPJ2linear(), Dc(1.),_damageEnergy(0.)
 {
   Msg::Error("IPNonLocalDamageJ2Hyper::IPNonLocalDamageJ2Hyper is not initialized with a damage IP Variable nor a IP CLength");
 ipvDam=NULL;
@@ -21,8 +19,7 @@ ipvDam=NULL;
 
 IPLocalDamageJ2Hyper::IPLocalDamageJ2Hyper(const J2IsotropicHardening *j2IH,
                                                  const DamageLaw *daml) :
-                                                    IPJ2linear(j2IH),
-						Dc(1.),activeDamaging(false),_nldJ2HyperDLocalPlasticStrainDStrain(0.)
+                                                    IPJ2linear(j2IH), Dc(1.),_damageEnergy(0.)
 {
 
   ipvDam=NULL;
@@ -34,11 +31,9 @@ IPLocalDamageJ2Hyper::IPLocalDamageJ2Hyper(const J2IsotropicHardening *j2IH,
 
 
 
-IPLocalDamageJ2Hyper::IPLocalDamageJ2Hyper(const IPLocalDamageJ2Hyper &source) : IPJ2linear(source)
+IPLocalDamageJ2Hyper::IPLocalDamageJ2Hyper(const IPLocalDamageJ2Hyper &source) : IPJ2linear(source),_damageEnergy(source._damageEnergy)
 {
   Dc = source.Dc;
-  activeDamaging = source.activeDamaging;
-  _nldJ2HyperDLocalPlasticStrainDStrain = source._nldJ2HyperDLocalPlasticStrainDStrain;
 	ipvDam = NULL;
   if(source.ipvDam != NULL)
   {
@@ -52,12 +47,7 @@ IPLocalDamageJ2Hyper& IPLocalDamageJ2Hyper::operator=(const IPVariable &source)
   if(src != NULL)
   {
     Dc = src->Dc;
-    activeDamaging = src->activeDamaging;
-    _damageBlocked = src->_damageBlocked;
-
-    _nldJ2HyperDLocalPlasticStrainDStrain = src->_nldJ2HyperDLocalPlasticStrainDStrain;
-
-    
+    _damageEnergy = src->_damageEnergy;
     if(src->ipvDam != NULL)
     {
 			if (ipvDam != NULL)
@@ -77,27 +67,24 @@ void IPLocalDamageJ2Hyper::restart()
   IPJ2linear::restart();
   restartManager::restart(ipvDam);
   restartManager::restart(Dc);
-  restartManager::restart(activeDamaging);
-  restartManager::restart(_nldJ2HyperDLocalPlasticStrainDStrain);
+  restartManager::restart(_damageEnergy);
   return;
 }
 
 
 
 IPNonLocalDamageJ2Hyper::IPNonLocalDamageJ2Hyper() : IPLocalDamageJ2Hyper(),
-							_nldJ2HyperEffectivePlasticStrain (0), _nldJ2HyperDLocalPlasticStrainDNonLocalPlasticStrain(0),
-							nonLocalToLocal(false),_DirreversibleEnergyDNonLocalVariable(0.)
+							_nonlocalPlasticStrain (0), nonLocalToLocal(false),_DirreversibleEnergyDNonLocalVariable(0.)
 {
   Msg::Error("IPNonLocalDamageJ2Hyper::IPNonLocalDamageJ2Hyper is not initialized with a Characteritsic IP Variable nor a IP CLength");
-ipvCL=NULL;
+  ipvCL=NULL;
 
 };
 
 IPNonLocalDamageJ2Hyper::IPNonLocalDamageJ2Hyper(const J2IsotropicHardening *j2IH,
                                                  const CLengthLaw *cll, const DamageLaw *daml) :
                                                     IPLocalDamageJ2Hyper(j2IH,daml),
-						_nldJ2HyperEffectivePlasticStrain (0),
-						_nldJ2HyperDLocalPlasticStrainDNonLocalPlasticStrain(0),nonLocalToLocal(false),
+						_nonlocalPlasticStrain (0),nonLocalToLocal(false),
 						_DirreversibleEnergyDNonLocalVariable(0.)
 {
   ipvCL=NULL;
@@ -110,8 +97,7 @@ IPNonLocalDamageJ2Hyper::IPNonLocalDamageJ2Hyper(const J2IsotropicHardening *j2I
 
 IPNonLocalDamageJ2Hyper::IPNonLocalDamageJ2Hyper(const IPNonLocalDamageJ2Hyper &source) : IPLocalDamageJ2Hyper(source)
 {
-  _nldJ2HyperEffectivePlasticStrain=source._nldJ2HyperEffectivePlasticStrain;
-  _nldJ2HyperDLocalPlasticStrainDNonLocalPlasticStrain=source._nldJ2HyperDLocalPlasticStrainDNonLocalPlasticStrain;
+  _nonlocalPlasticStrain=source._nonlocalPlasticStrain;
   nonLocalToLocal = source.nonLocalToLocal;
 	_DirreversibleEnergyDNonLocalVariable = source._DirreversibleEnergyDNonLocalVariable;
 	ipvCL = NULL;
@@ -126,8 +112,7 @@ IPNonLocalDamageJ2Hyper& IPNonLocalDamageJ2Hyper::operator=(const IPVariable &so
   const IPNonLocalDamageJ2Hyper* src = dynamic_cast<const IPNonLocalDamageJ2Hyper*>(&source);
   if(src != NULL)
   {
-    _nldJ2HyperEffectivePlasticStrain=src->_nldJ2HyperEffectivePlasticStrain;
-    _nldJ2HyperDLocalPlasticStrainDNonLocalPlasticStrain=src->_nldJ2HyperDLocalPlasticStrainDNonLocalPlasticStrain;
+    _nonlocalPlasticStrain=src->_nonlocalPlasticStrain;
     nonLocalToLocal = src->nonLocalToLocal;
 		_DirreversibleEnergyDNonLocalVariable = src->_DirreversibleEnergyDNonLocalVariable;
     
@@ -148,8 +133,7 @@ IPNonLocalDamageJ2Hyper& IPNonLocalDamageJ2Hyper::operator=(const IPVariable &so
 void IPNonLocalDamageJ2Hyper::restart()
 {
   IPLocalDamageJ2Hyper::restart();
-  restartManager::restart(_nldJ2HyperEffectivePlasticStrain);
-  restartManager::restart(_nldJ2HyperDLocalPlasticStrainDNonLocalPlasticStrain);
+  restartManager::restart(_nonlocalPlasticStrain);
   restartManager::restart(ipvCL);
   restartManager::restart(nonLocalToLocal);
 	restartManager::restart(_DirreversibleEnergyDNonLocalVariable);
diff --git a/NonLinearSolver/internalPoints/ipNonLocalDamageJ2Hyper.h b/NonLinearSolver/internalPoints/ipNonLocalDamageJ2Hyper.h
index 373ee8336dc0367c50ba558db4fbbd5d3496d6f9..6ce9f6166edf5459a3cfbab14fb220ebe87bf795 100644
--- a/NonLinearSolver/internalPoints/ipNonLocalDamageJ2Hyper.h
+++ b/NonLinearSolver/internalPoints/ipNonLocalDamageJ2Hyper.h
@@ -21,8 +21,7 @@ class IPLocalDamageJ2Hyper : public IPJ2linear
  protected:
   IPDamage*  ipvDam;
   double Dc; // critical damage
-  bool activeDamaging; // true if damage growing false otherwise
-  STensor3	_nldJ2HyperDLocalPlasticStrainDStrain;
+  double _damageEnergy;
 
  public:
   IPLocalDamageJ2Hyper();
@@ -39,27 +38,15 @@ class IPLocalDamageJ2Hyper : public IPJ2linear
   IPLocalDamageJ2Hyper(const IPLocalDamageJ2Hyper &source);
   virtual IPLocalDamageJ2Hyper& operator=(const IPVariable &source);
   virtual void restart();
+  
+  virtual double damageEnergy()  const {return _damageEnergy;};
+  virtual double& getRefToDamageEnergy() {return _damageEnergy;};
 
   virtual IPVariable* clone() const {return new IPLocalDamageJ2Hyper(*this);};
-  virtual double getCurrentPlasticStrain() const { return _j2lepspbarre;}
-  virtual double &getRefToCurrentPlasticStrain() { return _j2lepspbarre;}
 
   virtual void setCriticalDamage(const double DT){Dc = DT;};
   virtual double getCriticalDamage() const {return Dc;};
 
-  virtual void activeDamage(const bool flg) {activeDamaging = flg;};
-  virtual bool isActiveDamage() const {return activeDamaging;};
-
-  virtual const STensor3 & getConstRefToDLocalPlasticStrainDStrain() const
-  {
-    return _nldJ2HyperDLocalPlasticStrainDStrain;
-  }
-  virtual STensor3 & getRefToDLocalPlasticStrainDStrain()
-  {
-    return _nldJ2HyperDLocalPlasticStrainDStrain;
-  }
-
-
   virtual const IPDamage &getConstRefToIPDamage() const
   {
     if(ipvDam==NULL)
@@ -113,12 +100,9 @@ class IPNonLocalDamageJ2Hyper : public IPLocalDamageJ2Hyper
   IPCLength* ipvCL;
 
   bool nonLocalToLocal; // allows switching from non-local to local
-	
 	double _DirreversibleEnergyDNonLocalVariable;
 // bareps
-  double _nldJ2HyperEffectivePlasticStrain;
-  double _nldJ2HyperDLocalPlasticStrainDNonLocalPlasticStrain;
-
+  double _nonlocalPlasticStrain;
 
  public:
   IPNonLocalDamageJ2Hyper();
@@ -144,19 +128,10 @@ class IPNonLocalDamageJ2Hyper : public IPLocalDamageJ2Hyper
 
 
   virtual IPVariable* clone() const {return new IPNonLocalDamageJ2Hyper(*this);};
-  virtual double getEffectivePlasticStrain() const { return _nldJ2HyperEffectivePlasticStrain;}
-  virtual double &getRefToEffectivePlasticStrain() { return _nldJ2HyperEffectivePlasticStrain;}
+  virtual double getEffectivePlasticStrain() const { return _nonlocalPlasticStrain;}
+  virtual double &getRefToEffectivePlasticStrain() { return _nonlocalPlasticStrain;}
 
  
-  virtual double &getRefToDLocalPlasticStrainDNonLocalPlasticStrain()
-  {
-    return _nldJ2HyperDLocalPlasticStrainDNonLocalPlasticStrain;
-  }
-  virtual double getDLocalPlasticStrainDNonLocalPlasticStrain() const
-  {
-    return _nldJ2HyperDLocalPlasticStrainDNonLocalPlasticStrain;
-  }
-
   virtual const IPCLength &getConstRefToIPCLength() const
   {
     if(ipvCL==NULL)
diff --git a/NonLinearSolver/internalPoints/ipstate.cpp b/NonLinearSolver/internalPoints/ipstate.cpp
index ae293d6fe99af8657e0a1675a6dd0f8ee6175057..5d66e692a4e88177c83f1dd2f2ae48b8335ea93a 100644
--- a/NonLinearSolver/internalPoints/ipstate.cpp
+++ b/NonLinearSolver/internalPoints/ipstate.cpp
@@ -70,7 +70,7 @@ IP3State::~IP3State(){
   if(_step2) {delete _step2; _step2=NULL;}
   if(_step1) {delete _step1; _step1 = NULL;}
 	if (_temp) {delete _temp; _temp = NULL;};
-	if (_prevActiveDamage) {delete _prevActiveDamage; _prevActiveDamage = NULL;};
+	if (_activeDissipation) {delete _activeDissipation; _activeDissipation = NULL;};
 }
 
 IP3State::IP3State(const IP3State &source) : IPStateBase(source)
@@ -89,7 +89,7 @@ IP3State::IP3State(const IP3State &source) : IPStateBase(source)
 	}
   _st = source._st;
 	_temp = NULL;
-	_prevActiveDamage = NULL;
+	_activeDissipation = NULL;
 }
 
 IP3State & IP3State::operator = (const IPStateBase &source){
@@ -142,18 +142,18 @@ IPVariable* IP3State::getState(const whichState wst) const
       }
       return _temp;
       break;
-		case previousActiveDamage :
-			if (_prevActiveDamage == NULL){
+		case activeDissipation :
+			if (_activeDissipation == NULL){
 				if (_initial) 
-					_prevActiveDamage = _initial->clone();
+					_activeDissipation = _initial->clone();
 				else if (_step1)
-					_prevActiveDamage = _step1->clone();
+					_activeDissipation = _step1->clone();
 				else if (_step2)
-					_prevActiveDamage = _step2->clone();
+					_activeDissipation = _step2->clone();
 				else
 					Msg::Fatal("this IP3State is not initialized");
 			}
-			return _prevActiveDamage;
+			return _activeDissipation;
 			break;
     case initial :
       return _initial;
diff --git a/NonLinearSolver/internalPoints/ipstate.h b/NonLinearSolver/internalPoints/ipstate.h
index b59f46b0294a6462480dca972f64b8bd511f2389..b0a56f25eb0c6df862d9967156e958461d1a2161 100644
--- a/NonLinearSolver/internalPoints/ipstate.h
+++ b/NonLinearSolver/internalPoints/ipstate.h
@@ -34,7 +34,7 @@ class IPStateBase{
 		}
 		virtual ~IPStateBase();
 		
-		enum whichState{initial, previous, current, temp, previousActiveDamage};
+		enum whichState{initial, previous, current, temp, activeDissipation};
 		virtual IPVariable* getState(const whichState wst=IPStateBase::current) const=0;
 		virtual void restart()=0;
 		virtual void getAllIPVariable(std::vector<IPVariable*>& allIP) const = 0;
@@ -76,15 +76,15 @@ class IP1State : public IPStateBase{
 class IP3State : public IPStateBase{
  protected :
   mutable IPVariable *_temp; // temporary state
-	mutable IPVariable *_prevActiveDamage;
+	mutable IPVariable *_activeDissipation; // dissipative active
   IPVariable *_initial;     // initial state t=0
   IPVariable *_step1;    // previous step if _st = true and current step otherwise
   IPVariable *_step2;     // current step if _st = true and previous step otherwise
   const bool *_st; // pointer on a bool value to choice what vector is current and what vector is previous
  public :
-  IP3State(bool *st) : IPStateBase(),_st(st), _initial(NULL), _step1(NULL), _step2(NULL),_temp(NULL),_prevActiveDamage(NULL){}
+  IP3State(bool *st) : IPStateBase(),_st(st), _initial(NULL), _step1(NULL), _step2(NULL),_temp(NULL),_activeDissipation(NULL){}
   IP3State(const bool *st,IPVariable *init,
-           IPVariable *st1, IPVariable *st2): _st(st), _initial(init), _step1(st1), _step2(st2),_temp(NULL),_prevActiveDamage(NULL){}
+           IPVariable *st1, IPVariable *st2): _st(st), _initial(init), _step1(st1), _step2(st2),_temp(NULL),_activeDissipation(NULL){}
   virtual ~IP3State();
   IP3State(const IP3State &source);
   virtual IP3State & operator = (const IPStateBase &source);
diff --git a/NonLinearSolver/internalPoints/ipvariable.h b/NonLinearSolver/internalPoints/ipvariable.h
index f6cc477784310affb69449bddc4485a000cbc475..374cee503d4878a5dcc0adecc8381d47e7187ea4 100644
--- a/NonLinearSolver/internalPoints/ipvariable.h
+++ b/NonLinearSolver/internalPoints/ipvariable.h
@@ -97,13 +97,14 @@ class IPVariableMechanics : public IPVariable{
     return *this;
   }
   virtual ~IPVariableMechanics(){}
-	virtual bool isActiveDamage() const {return false;};
+	virtual bool dissipationIsActive() const {return false;};
   
-	virtual void blockDamage(const bool bl){}
-  virtual bool damageIsBlocked() const {return false;}
+	virtual void blockDissipation(const bool bl){}
+  virtual bool dissipationIsBlocked() const {return false;}
 
   virtual double defoEnergy() const{return 0.;}
   virtual double plasticEnergy() const{return 0.;} // dissipation by plasticity
+  virtual double damageEnergy() const {return 0.;}; // dissipation by damage
 	virtual double irreversibleEnergy() const {return 0.;} // irreversible energy for path following
   // Default for fracture (a separate class cannot be defined in order to avoid a double derivation IPVariable2ForFracture)
   virtual int fractureEnergy(double* arrayEnergy) const{return 0;}
diff --git a/NonLinearSolver/materialLaw/DamageLaw.cpp b/NonLinearSolver/materialLaw/DamageLaw.cpp
index f1c1cd0d4cf68efed7629cef886889855731dad4..33f8660db4e227139f0674305c82858705f8f87b 100644
--- a/NonLinearSolver/materialLaw/DamageLaw.cpp
+++ b/NonLinearSolver/materialLaw/DamageLaw.cpp
@@ -12,7 +12,7 @@
 #include "DamageLaw.h"
 #include <math.h>
 
-DamageLaw::DamageLaw(const int num, const bool init): _num(num), _initialized(init), _Dc(1.)
+DamageLaw::DamageLaw(const int num, const bool init): _num(num), _initialized(init), _Dc(0.99999999999)
 {
 
 }
@@ -85,33 +85,31 @@ void LemaitreChabocheDamageLaw::computeDamage(double p1, double p0, double phiel
 
   double D=D0;
   double maxp = maxp0;
-  if (ipvprev.getDamage() < _Dc){
-    if(p1>pc) p1=pc;
-    if(p1>p0 and p1>pInit)
+  if(p1>pc) p1=pc;
+  if(p1>p0 and p1>pInit)
+  {
+    DeltaD = pow(phiel/alpha,n)*(p1-p0);
+    dDdp   = pow(phiel/alpha,n);
+    for(int i=0; i<3; i++)
     {
-      DeltaD = pow(phiel/alpha,n)*(p1-p0);
-      dDdp   = pow(phiel/alpha,n);
-      for(int i=0; i<3; i++)
+      for(int j=0; j<3; j++)
       {
-        for(int j=0; j<3; j++)
-        {
-          dDdFe(i,j)=0.;
-          for(int k=0; k<3; k++)
-            dDdFe(i,j)+=Peff(i,k)*Fp(j,k);
-         }
+        dDdFe(i,j)=0.;
+        for(int k=0; k<3; k++)
+          dDdFe(i,j)+=Peff(i,k)*Fp(j,k);
        }
-       dDdFe *=(pow(phiel/alpha,n-1)*(p1-p0)*n/alpha);
-    }
-    D = D0+DeltaD;
-    if(D>0.99999999999)
-    {
-       double oldDD=DeltaD;
-       DeltaD      = 0.99999999999-D0;
-       double rat = DeltaD/oldDD;
-       D = D0+DeltaD;
-       dDdp   *= rat;
-       dDdFe  *= rat;
-    }
+     }
+     dDdFe *=(pow(phiel/alpha,n-1)*(p1-p0)*n/alpha);
+  }
+  D = D0+DeltaD;
+  if(D>0.99999999999)
+  {
+     double oldDD=DeltaD;
+     DeltaD      = 0.99999999999-D0;
+     double rat = DeltaD/oldDD;
+     D = D0+DeltaD;
+     dDdp   *= rat;
+     dDdFe  *= rat;
   }
 
   if(p1>maxp) maxp=p1;
@@ -519,24 +517,33 @@ void PowerBrittleDamagelaw::computeDamage(double p1, double p0, double phiel, co
     double D = D0;                          // Current new values of damage
     double maxp = maxp0;                    // Current new values of memory variable
 
-    if (ipvprev.getDamage() < _Dc){
-      if(p1>maxp){
-        if((p1>_pi)){
-          double valt = 1. - _H*(_n+1.)/(_m+1.)*(pow(p1,_m+1.) - pow(_pi,_m+1.));
-          double powval = 1./(_n+1.);
-          if (valt > 0){
-            D = 1. - pow(valt,powval);
-            DeltaD = D - D0;
-            dDdp = _H * pow(p1,_m)*pow(1.-D,-_n);
-          }
-          else{
+    if (D0 < _Dc){
+      if ((p1>maxp)and (p1>_pi)){
+        double valt = 1. - _H*(_n+1.)/(_m+1.)*(pow(p1,_m+1.) - pow(_pi,_m+1.));
+        double powval = 1./(_n+1.);
+        if (valt > 0){
+          D = 1. - pow(valt,powval);
+          DeltaD = D - D0;
+          dDdp = _H * pow(p1,_m)*pow(1.-D,-_n);
+          if (D > _Dc){
             D = _Dc;
+            double oldDD=DeltaD;
             DeltaD = D - D0;
-            dDdp = DeltaD/(p1-maxp0);
+            dDdp *= ((D-D0)/oldDD);
           }
         }
+        else{
+          D = _Dc;
+          DeltaD = D - D0;
+          dDdp = DeltaD/(p1-maxp0);
+        }
       }
     }
+    else{
+      D = _Dc;
+      DeltaD = 0.;
+      dDdp = 0.;
+    }
 
     if(p1>maxp) maxp=p1;
     // Values saving
diff --git a/NonLinearSolver/materialLaw/mlaw.h b/NonLinearSolver/materialLaw/mlaw.h
index 8794466b052b2028a8eb8c8b4f9cddf5e60c26f1..6b89fd8ad93ecaaa9537107c1b9422db43432fc5 100644
--- a/NonLinearSolver/materialLaw/mlaw.h
+++ b/NonLinearSolver/materialLaw/mlaw.h
@@ -28,7 +28,7 @@ class materialLaw{
                  transverseIsoYarnB, Anisotropic, AnisotropicStoch, nonLocalDamage, vumat,
                  FSElastic, FSElastoPlastic, numeric, secondOrderElastic, j2smallstrain,nonLocalDamageGurson,nonLocalDamageJ2Hyper, nonLocalDamageIsotropicElasticity,LinearThermoMechanics,J2ThermoMechanics,SMP,LinearElecTherMech,
 		 AnIsotropicElecTherMech, hyperelastic, quadYieldHyper, powerYieldLaw, powerYieldLawWithFailure, nonLocalDamageQuadYieldHyper,nonLocalDamagePowerYieldHyper,
-		 nonLocalDamagePowerYieldHyperWithFailure,ElecSMP,ThermalConducter,AnIsotropicTherMech, localDamageJ2Hyper,linearElastic};
+		 localDamagePowerYieldHyperWithFailure,nonLocalDamagePowerYieldHyperWithFailure,ElecSMP,ThermalConducter,AnIsotropicTherMech, localDamageJ2Hyper,linearElastic};
 
 
  protected :
@@ -71,7 +71,6 @@ class materialLaw{
 	virtual void setMacroSolver(const nonLinearMechSolver* sv){_macroSolver = sv;};
 	virtual const nonLinearMechSolver* getMacroSolver() const {return _macroSolver;};
  
-  virtual bool withDamage() const {return false;};
   virtual bool withEnergyDissipation() const = 0;
   // function to define when one IP is broken
   virtual bool brokenCheck(IPVariable* ipv) const { return false;}
diff --git a/NonLinearSolver/materialLaw/mlawAnIsotropicTherMech.cpp b/NonLinearSolver/materialLaw/mlawAnIsotropicTherMech.cpp
index 7db2a689686ac7039582046b67ff50a79a4526db..8728cf0d26cfa70bfe61522bd436548e971f6bf3 100644
--- a/NonLinearSolver/materialLaw/mlawAnIsotropicTherMech.cpp
+++ b/NonLinearSolver/materialLaw/mlawAnIsotropicTherMech.cpp
@@ -339,7 +339,7 @@ void mlawAnIsotropicTherMech::constitutive(
   double I5= dot(A,CCA);
   double th=3*_alphath*_K/_lambda*(T-_t0);
   double PsyIso = -2.*lnJ*th+th*th;
-  double PsyTr = -6. *_beta*_K/_lambda*(T-_t0)*(I4-1.);
+  double PsyTr = -6. *_beta*_K/_lambda*_alphath*(T-_t0)*(I4-1.);
   return (PsyIso+PsyTr);
 
 }
diff --git a/NonLinearSolver/materialLaw/mlawHyperelastic.cpp b/NonLinearSolver/materialLaw/mlawHyperelastic.cpp
index 2b6367008f49e56a0d36d69998e77ce33d310e0b..8466622c2e2ef0d02ae4ea940f2568ee0de1941a 100644
--- a/NonLinearSolver/materialLaw/mlawHyperelastic.cpp
+++ b/NonLinearSolver/materialLaw/mlawHyperelastic.cpp
@@ -96,6 +96,23 @@ void mlawHyperViscoElastic::setViscoElasticData(const std::string filename){
   fclose(file);
 };
 
+double mlawHyperViscoElastic::deformationEnergy(const STensor3 &C) const
+{
+  static STensor3 logCdev;
+  STensorOperation::logSTensor3(C,_order,logCdev,NULL);
+  double trace = logCdev.trace();
+  double lnJ = 0.5*trace;
+  logCdev(0,0)-=trace/3.;
+  logCdev(1,1)-=trace/3.;
+  logCdev(2,2)-=trace/3.;
+
+  double Psy = _K*0.5*lnJ*lnJ+_mu*0.25*dot(logCdev,logCdev);
+  for (int i=0; i<_N; i++){
+    Psy += _Ki[i]*0.5*lnJ*lnJ+_Gi[i]*0.25*dot(logCdev,logCdev);
+  }
+  return Psy;;
+}
+
 
 mlawHyperViscoElastic::mlawHyperViscoElastic(const int num,const double E,const double nu, const double rho, 
                           const bool matrixbyPerturbation, const double pert):
@@ -146,199 +163,212 @@ double mlawHyperViscoElastic::soundSpeed() const
   return sqrt(_E*factornu/_rho);
 }
 
-void mlawHyperViscoElastic::isotropicHookTensor(const double K, const double G, STensor43& L) const{
-  double lambda = K - 2.*G/3.;
-  static STensor3 I(1.);
-  for (int i=0; i<3; i++){
-    for (int j=0; j<3; j++){
-      for (int k=0; k<3; k++){
-        for (int l=0; l<3; l++){
-          L(i,j,k,l) = lambda*I(i,j)*I(k,l)+ G*(I(i,k)*I(j,l)+I(i,l)*I(j,k));
+void mlawHyperViscoElastic::updateViscoElasticFlow(const IPHyperViscoElastic *q0, IPHyperViscoElastic *q1, double& Ke, double & Ge) const{
+  if ((_Ki.size() > 0) or (_Gi.size() > 0)){
+    
+    double dt = this->getTimeStep();
+    if (_viscoMethod == 0){
+      static STensor3 DE, devDE;
+      static double trDE;
+    
+      DE = q1->_Ee;
+      DE -= q0->_Ee;
+      STensorOperation::decomposeDevTr(DE,devDE,trDE);
+      
+      // maxwell
+      Ge = _mu;
+      Ke = _K;
+
+      for (int i=0; i<_Gi.size(); i++){
+        double dtg = dt/_gi[i];
+        double expmdtg = exp(-dtg);
+        double ztag = exp(-dtg/2.);
+        for (int k=0; k<3; k++){
+          for (int l=0; l<3; l++){
+            q1->_A[i](k,l) = expmdtg*q0->_A[i](k,l) + 2.*_Gi[i]*ztag*devDE(k,l);
+          }
         }
+        Ge += _Gi[i]*ztag;
+      }
+      for (int i=0; i<_Ki.size(); i++){
+        double dtk = dt/_ki[i];
+        double expmdtk = exp(-dtk);
+        double ztak = exp(-dtk/2.);
+        q1->_B[i] = q0->_B[i]*expmdtk +_Ki[i]*ztak*trDE;
+        Ke += _Ki[i]*ztak;
       }
     }
-  }
-};
-
-
-void mlawHyperViscoElastic::elastic(const IPHyperViscoElastic *q0, IPHyperViscoElastic *q1, const bool stiff, STensor43& DsigDE) const{
-
-  /* compute elastic predictor */
-  const STensor3& E1 = q1->getConstRefToElasticStrain();// elastic defo
-  const STensor3& E0 = q0->getConstRefToElasticStrain();
-  
-  STensor3& corKir = q1->getRefToCorotationalKirchhoffStress(); // corrotational Kirchhoff stress
-  for (int i=0; i<3; i++){
-    for (int j=0; j<3; j++){
-      corKir(i,j) = 0.;
-      for (int k=0; k<3; k++){
-        for (int l=0; l<3; l++){
-          corKir(i,j) += Cel(i,j,k,l)*E1(k,l);
+    else if (_viscoMethod == 1){
+      static STensor3 DK, devDK;
+      static double trDK;
+      
+      DK = q1->_kirchhoff;
+      DK -= q0->_kirchhoff;
+      
+      STensorOperation::decomposeDevTr(DK,devDK,trDK);
+      
+      /*update internal variable from stress increment*/
+      for (int i=0; i< _Gi.size(); i++){
+        q1->_A[i] *= 0.;
+        double dtg = dt/(_gi[i]);
+        for (int k=0; k<3; k++){
+          for (int l=0; l<3; l++){
+            q1->_A[i](k,l) += exp(-dtg)*q0->_A[i](k,l) + exp(-dtg/2.)*devDK(k,l);
+          }
         }
       }
-    }
-  }
-  // elastic energy
-  double& energ = q1->_elasticEnergy;
-  energ = 0.5*dot(corKir,E1);
-  
-  if (stiff){
-    isotropicHookTensor(_K,_mu,DsigDE);
-  };
-};
 
-void mlawHyperViscoElastic::viscoelastic_VoigtKelvin(const IPHyperViscoElastic *q0, IPHyperViscoElastic *q1,
-                            const bool stiff, STensor43& DsigDE) const{
-  /* compute viscoelastic model */
-  const STensor3& E1 = q1->getConstRefToElasticStrain();
-  const STensor3& E0 = q0->getConstRefToElasticStrain();
-  
-  static STensor3 DE, devDE;
-  static double trDE;
-  DE =  E1;
-  DE -= E0;
-
-  STensorOperation::decomposeDevTr(DE,devDE,trDE);
-  double dt = this->getTimeStep();
-
-  double invGe = 1./_mu;
-  STensor3 D(0.);
-  for (int i=0; i<_Gi.size(); i++){
-    double dtg = dt/(_gi[i]);
-    invGe += (1.-exp(-dtg/2.))/_Gi[i];
-    for (int k=0; k<3; k++){
-      for (int l=0; l<3; l++){
-        D(k,l) += q0->_A[i](k,l)*(exp(-dtg)-1.)/(2.*_Gi[i]);
+      for (int i=0; i< _Ki.size(); i++){
+        q1->_B[i] *= 0.;
+        double dtk = dt/(_ki[i]);
+        q1->_B[i] += exp(-dtk)*q0->_B[i] + exp(-dtk/2.)*trDK;
       }
     }
-  }
-  double Ge = 1./invGe;
-
-  double invKe = 1./_K;
-  double V= 0.;
-  for (int i=0; i<_Ki.size(); i++){
-    double dtk = dt/(_ki[i]);
-    invKe += (1.-exp(-dtk/2))/_Ki[i];
-    V += q0->_B[i]*(exp(-dtk)-1.)/(3.*_Ki[i]);
-  }
-  double Ke = 1./invKe;
-
-  // stress increment
-  static STensor3 DdevK;
-  DdevK = devDE; // dev corotational kirchoff stress predictor
-  DdevK += D;
-  DdevK *= (2.*Ge);
-  double Dp = Ke*(trDE+ V); // pressure predictor
-
-  /*update internal variable from stress increment*/
-  for (int i=0; i< _Gi.size(); i++){
-    q1->_A[i] *= 0.;
-    double dtg = dt/(_gi[i]);
-    for (int k=0; k<3; k++){
-      for (int l=0; l<3; l++){
-        q1->_A[i](k,l) += exp(-dtg)*q0->_A[i](k,l) + exp(-dtg/2.)*DdevK(k,l);
-      }
+    else{
+      Msg::Fatal("visco elastic method %d has not been defined");
     }
   }
-
-  for (int i=0; i< _Ki.size(); i++){
-    q1->_B[i] *= 0.;
-    double dtk = dt/(_ki[i]);
-    q1->_B[i] += exp(-dtk)*q0->_B[i] + exp(-dtk/2.)*3.*Dp;
-  }
-
-   // corotational Kirchhoff stress tenor from previous and increment
-  STensor3& corK = q1->getRefToCorotationalKirchhoffStress();
-  corK = q0->getConstRefToCorotationalKirchhoffStress();
-  
-  corK += DdevK;
-  corK(0,0) += Dp;
-  corK(1,1) += Dp;
-  corK(2,2) += Dp;
-
-  if (stiff){
-    isotropicHookTensor(Ke,Ge,DsigDE);
-  };
 };
+void mlawHyperViscoElastic::viscoElasticPredictor(const STensor3& Ee, const STensor3& Ee0, 
+          const IPHyperViscoElastic *q0, IPHyperViscoElastic *q1,
+          double& Ke, double& Ge) const{
+  if ((_Ki.size() > 0) or (_Gi.size() > 0)){
+    static STensor3 DE, devDE;
+    static double trDE;
+    DE =  Ee;
+    DE -= Ee0;
+    STensorOperation::decomposeDevTr(DE,devDE,trDE);
+    
+    double dt = this->getTimeStep();
+    if (_viscoMethod == 0){
+      Ge = _mu;
+      Ke = _K;
+      for (int i=0; i<_Gi.size(); i++){
+        double dtg = dt/_gi[i];
+        double expmdtg = exp(-dtg);
+        double ztag = exp(-dtg/2.);
+        for (int k=0; k<3; k++){
+          for (int l=0; l<3; l++){
+            q1->_A[i](k,l) = expmdtg*q0->_A[i](k,l) + 2.*_Gi[i]*ztag*devDE(k,l);
+          }
+        }
+        Ge += _Gi[i]*ztag;
+      }
+      for (int i=0; i<_Ki.size(); i++){
+        double dtk = dt/_ki[i];
+        double expmdtk = exp(-dtk);
+        double ztak = exp(-dtk/2.);
+        q1->_B[i] = q0->_B[i]*expmdtk +_Ki[i]*ztak*trDE;
+        Ke += _Ki[i]*ztak;
+      }
+      
+      static STensor3 devK;
+      static double p;
+      STensorOperation::decomposeDevTr(Ee,devK,p);
+      devK *= (2.*_mu);  // deviatoric part
+      p *= _K; // pressure
+      
+      for (int i=0; i<_Gi.size(); i++){
+        devK += q1->_A[i];
+      }
+      for (int i=0; i<_Ki.size(); i++){
+        p += q1->_B[i];
+      }
+      
+      q1->_kirchhoff = devK;
+      q1->_kirchhoff(0,0) += p;
+      q1->_kirchhoff(1,1) += p;
+      q1->_kirchhoff(2,2) += p;
+    }
+    else if (_viscoMethod == 1){
+      double invGe = 1./_mu;
+      STensor3 D(0.);
+      for (int i=0; i<_Gi.size(); i++){
+        double dtg = dt/(_gi[i]);
+        invGe += (1.-exp(-dtg/2.))/_Gi[i];
+        for (int k=0; k<3; k++){
+          for (int l=0; l<3; l++){
+            D(k,l) += q0->_A[i](k,l)*(exp(-dtg)-1.)/(2.*_Gi[i]);
+          }
+        }
+      }
+      Ge = 1./invGe;
 
-void mlawHyperViscoElastic::viscoelastic_Maxwell(const IPHyperViscoElastic *q0, IPHyperViscoElastic *q1,
-                                                  const bool stiff, STensor43& DsigDE) const{
-  /* compute viscoelastic model */
-  const STensor3& E1 = q1->getConstRefToElasticStrain();
-  const STensor3& E0 = q0->getConstRefToElasticStrain();
-  
-  static STensor3 devE1, devE0;
-  static double trE1, trE0;
-  
-  STensorOperation::decomposeDevTr(E1,devE1,trE1);
-  STensorOperation::decomposeDevTr(E0,devE0,trE0);
-
-  // update A, B
+      double invKe = 1./_K;
+      double V= 0.;
+      for (int i=0; i<_Ki.size(); i++){
+        double dtk = dt/(_ki[i]);
+        invKe += (1.-exp(-dtk/2))/_Ki[i];
+        V += q0->_B[i]*(exp(-dtk)-1.)/(3.*_Ki[i]);
+      }
+      Ke = 1./invKe;
 
-  double dt = this->getTimeStep();
-//  Msg::Error("dt = %e",dt);
-  double Ge = _mu;
-  double Ke = _K;
+      // stress increment
+      static STensor3 DdevK;
+      DdevK = devDE; // dev corotational kirchoff stress predictor
+      DdevK += D;
+      DdevK *= (2.*Ge);
+      double Dp = Ke*(trDE+ V); // pressure predictor
 
-  //Msg::Error("Gi size = %d, Ki size = %d",_Gi.size(), _Ki.size());
+      /*update internal variable from stress increment*/
+      for (int i=0; i< _Gi.size(); i++){
+        q1->_A[i] *= 0.;
+        double dtg = dt/(_gi[i]);
+        for (int k=0; k<3; k++){
+          for (int l=0; l<3; l++){
+            q1->_A[i](k,l) += exp(-dtg)*q0->_A[i](k,l) + exp(-dtg/2.)*DdevK(k,l);
+          }
+        }
+      }
 
-  for (int i=0; i<_Gi.size(); i++){
-    double dtg = dt/_gi[i];
-    double expmdtg = exp(-dtg);
-    double ztag = exp(-dtg/2.);
-    for (int k=0; k<3; k++){
-      for (int l=0; l<3; l++){
-        q1->_A[i](k,l) = expmdtg*q0->_A[i](k,l) + 2.*_Gi[i]*ztag*(devE1(k,l)-devE0(k,l));
+      for (int i=0; i< _Ki.size(); i++){
+        q1->_B[i] *= 0.;
+        double dtk = dt/(_ki[i]);
+        q1->_B[i] += exp(-dtk)*q0->_B[i] + exp(-dtk/2.)*3.*Dp;
       }
-    }
-    Ge += _Gi[i]*ztag;
-  }
 
-  for (int i=0; i<_Ki.size(); i++){
-    double dtk = dt/_ki[i];
-    double expmdtk = exp(-dtk);
-    double ztak = exp(-dtk/2.);
-    q1->_B[i] = q0->_B[i]*expmdtk +_Ki[i]*ztak*(trE1-trE0);
-    Ke += _Ki[i]*ztak;
+       // corotational Kirchhoff stress tenor from previous and increment
+      STensor3& corK = q1->_kirchhoff;
+      corK = q0->_kirchhoff;
+      
+      corK += DdevK;
+      corK(0,0) += Dp;
+      corK(1,1) += Dp;
+      corK(2,2) += Dp;
+    }
+    else{
+      Msg::Fatal("visco elastic method %d has not been defined");
+    }
   }
+  else{
+    static STensor3 devK;
+    static double p;
+    STensorOperation::decomposeDevTr(Ee,devK,p);
+    devK *= (2.*_mu);  // deviatoric part
+    p *= _K; // pressure
+    
+    Ke = _K;
+    Ge = _mu;
 
-    // corotational Kirchhoff stress tenor
-  STensor3& corKir = q1->getRefToCorotationalKirchhoffStress();
-  corKir = devE1;
-  corKir *= (2.*_mu);
-  // update viscoelastic branches
-  for (int i=0; i<_Gi.size(); i++){
-    corKir += q1->_A[i];
-  }
-  
-  double p = _K*trE1;
-  for (int i=0; i<_Ki.size(); i++){
-    p += q1->_B[i];
+    q1->_kirchhoff = devK;
+    q1->_kirchhoff(0,0) += p;
+    q1->_kirchhoff(1,1) += p;
+    q1->_kirchhoff(2,2) += p;
   }
-  // update pressure
-  corKir(0,0) += p;
-  corKir(1,1) += p;
-  corKir(2,2) += p;
-  
-  if (stiff){
-    isotropicHookTensor(Ke,Ge,DsigDE);
-  };
-
 };
 
-void mlawHyperViscoElastic::viscoelastic(const IPHyperViscoElastic *q0, IPHyperViscoElastic *q1, const bool stiff, STensor43& DsigDE) const{
-  if (_Ki.size() == 0 and _Gi.size() == 0){
-    // no visco
-    this->elastic(q0,q1,stiff,DsigDE);
-  }
-  else{
-    if (_viscoMethod == 0)
-      this->viscoelastic_Maxwell(q0,q1,stiff,DsigDE);
-    else if (_viscoMethod == 1)
-      this->viscoelastic_VoigtKelvin(q0,q1,stiff,DsigDE);
 
-    else
-      Msg::Fatal("this visco method has not been implemented");
+void mlawHyperViscoElastic::isotropicHookTensor(const double K, const double G, STensor43& L) const{
+  double lambda = K - 2.*G/3.;
+  static STensor3 I(1.);
+  for (int i=0; i<3; i++){
+    for (int j=0; j<3; j++){
+      for (int k=0; k<3; k++){
+        for (int l=0; l<3; l++){
+          L(i,j,k,l) = lambda*I(i,j)*I(k,l)+ G*(I(i,k)*I(j,l)+I(i,l)*I(j,k));
+        }
+      }
+    }
   }
 };
 
@@ -359,18 +389,22 @@ void mlawHyperViscoElastic::predictorCorrector_ViscoElastic(const STensor3& F0,
   }
   E *= 0.5; // strain
   
-  static STensor43 DcorKDE;
-  
-  this->viscoelastic(q0,q1,stiff,DcorKDE);
+  double Ke, Ge;
+  viscoElasticPredictor(E,q0->_Ee,q0,q1,Ke,Ge);
   
   const STensor3& corKir = q1->getConstRefToCorotationalKirchhoffStress();
   static STensor3 secondPK;
   STensorOperation::multSTensor3STensor43(corKir,dlnCdC,secondPK);
   STensorOperation::multSTensor3(F,secondPK,P);
   // first PK
+  
+  q1->_elasticEnergy=deformationEnergy(C);
 
   if (stiff){
     static STensor43 DsecondPKdC;
+    static STensor43 DcorKDE;
+    isotropicHookTensor(Ke,Ge,DcorKDE);
+    
     for (int i=0; i<3; i++){
       for (int j=0; j<3; j++){
         for (int k=0; k<3; k++){
@@ -441,66 +475,30 @@ void mlawHyperViscoElastic::constitutive(const STensor3& F0, const STensor3& F,
   }
 };
 
-mlawHyperViscoElastoPlasticBase::mlawHyperViscoElastoPlasticBase(const int num,const double E,const double nu, const double rho, const double tol,
-                        const bool matrixbyPerturbation, const double pert): mlawHyperViscoElastic(num,E,nu,rho,matrixbyPerturbation,pert), _tol(tol),
-                        _p(0.),_viscosity(NULL),_compression(NULL),_traction(NULL),_shear(NULL),_kinematic(NULL){
-};
-
-mlawHyperViscoElastoPlasticBase::mlawHyperViscoElastoPlasticBase(const mlawHyperViscoElastoPlasticBase& src): mlawHyperViscoElastic(src){
-  _tol = src._tol;
-  _p = src._p;
-  _viscosity = NULL;
-  if (src._viscosity){
-    _viscosity = src._viscosity->clone();
-  }
-  
-  _compression = NULL;
-  if (src._compression){
-    _compression = src._compression->clone();
-  }
-  _traction = NULL;
-  if (src._traction){
-    _traction = src._traction->clone();
-  }
-  _shear = NULL;
-  if (src._shear){
-    _shear = src._shear->clone();
-  }
-  _kinematic = NULL;
-  if (src._kinematic){
-    _kinematic = src._kinematic->clone();
-  }
-};
-mlawHyperViscoElastoPlasticBase::~mlawHyperViscoElastoPlasticBase(){
-  if (_viscosity) {delete _viscosity; _viscosity = NULL;};
-  if (_compression) {delete _compression; _compression = NULL;}
-  if (_traction) {delete _traction; _traction = NULL;};
-  if (_shear) {delete _shear; _shear = NULL;};
-};
 
-void mlawHyperViscoElastoPlasticBase::setCompressionHardening(const J2IsotropicHardening& comp){
+void mlawPowerYieldHyper::setCompressionHardening(const J2IsotropicHardening& comp){
   if (_compression) delete _compression;
   _compression = comp.clone();
 };
-void mlawHyperViscoElastoPlasticBase::setTractionHardening(const J2IsotropicHardening& trac){
+void mlawPowerYieldHyper::setTractionHardening(const J2IsotropicHardening& trac){
   if (_traction) delete _traction;
   _traction = trac.clone();
 };
-void mlawHyperViscoElastoPlasticBase::setShearHardening(const J2IsotropicHardening& shear){
+void mlawPowerYieldHyper::setShearHardening(const J2IsotropicHardening& shear){
   if (_shear) delete _shear;
   _shear = shear.clone();
 };
-void mlawHyperViscoElastoPlasticBase::setKinematicHardening(const kinematicHardening& kin){
+void mlawPowerYieldHyper::setKinematicHardening(const kinematicHardening& kin){
   if (_kinematic) delete _kinematic;
   _kinematic = kin.clone();
 };
-void mlawHyperViscoElastoPlasticBase::setViscosityEffect(const viscosityLaw& v, const double p){
+void mlawPowerYieldHyper::setViscosityEffect(const viscosityLaw& v, const double p){
   _p = p;
   if (_viscosity) delete _viscosity;
   _viscosity = v.clone();
 };
 
-void mlawHyperViscoElastoPlasticBase::hardening(IPHyperViscoElastoPlastic* q) const{
+void mlawPowerYieldHyper::hardening(IPHyperViscoElastoPlastic* q) const{
   //Msg::Error("epspCompression = %e, epspTRaction = %e, epspShear = %e",q->_epspCompression,q->_epspTraction,q->_epspShear);
   if (_compression != NULL && q->_ipCompression != NULL){
     _compression->hardening(q->_epspCompression,*q->_ipCompression);
@@ -519,35 +517,63 @@ void mlawHyperViscoElastoPlasticBase::hardening(IPHyperViscoElastoPlastic* q) co
     _kinematic->hardening(q->_epspbarre,*q->_ipKinematic);
 };
 
+void mlawPowerYieldHyper::tangent_full_perturbation(
+                             STensor43 &T_,
+                             STensor43& dFedF, 
+                             STensor43& dFpdF,
+                             const STensor3 &P,
+                             const STensor3 &F,
+                             const IPHyperViscoElastoPlastic* q0,
+                             IPHyperViscoElastoPlastic* q1
+                           ) const{
+  
+  static STensor43 tmpSTensor43;
+  static STensor3 Fplus, Pplus;
+  static IPHyperViscoElastoPlastic q11(*q0);
+  
+  for (int i=0; i<3; i++){
+    for (int j=0; j<3; j++){
+      Fplus = F;
+      Fplus(i,j)+=_perturbationfactor;
+      this->predictorCorrector(Fplus,q0,&q11,Pplus,false,tmpSTensor43,tmpSTensor43,tmpSTensor43);
+      q1->_DgammaDF(i,j) = (q11._epspbarre - q1->_epspbarre)/_perturbationfactor;
+      q1->_DirreversibleEnergyDF(i,j) = (q11._irreversibleEnergy - q1->_irreversibleEnergy)/_perturbationfactor;
+      for (int k=0; k<3; k++){
+        for (int l=0; l<3; l++){
+          T_(k,l,i,j) = (Pplus(k,l)-P(k,l))/_perturbationfactor;
+          dFpdF(k,l,i,j) = (q11._Fp(k,l)-q1->_Fp(k,l))/_perturbationfactor;
+          dFedF(k,l,i,j) = (q11._Fe(k,l)-q1->_Fe(k,l))/_perturbationfactor;
+        }
+      }
+    }
+  }
+};
 
 
-mlawHyperViscoElastoPlasticPowerYield::mlawHyperViscoElastoPlasticPowerYield(const int num,const double E,const double nu, const double rho,
-                        const double tol, const bool matrixbyPerturbation, const double pert): 
-                        mlawHyperViscoElastoPlasticBase(nu,E,nu,rho,tol,matrixbyPerturbation,pert),_n(1.5),_b(0.3),_nonAssociatedFlow(true){}
-
-mlawHyperViscoElastoPlasticPowerYield::mlawHyperViscoElastoPlasticPowerYield(const mlawHyperViscoElastoPlasticPowerYield& src):
-                  mlawHyperViscoElastoPlasticBase(src),_n(src._n),_b(src._b),_nonAssociatedFlow(src._nonAssociatedFlow){};
+void mlawPowerYieldHyper::constitutive(
+  const STensor3& F0,         // initial deformation gradient (input @ time n)
+  const STensor3& Fn,         // updated deformation gradient (input @ time n+1)
+  STensor3 &P,                // updated 1st Piola-Kirchhoff stress tensor (output)
+  const IPHyperViscoElastoPlastic *q0,       // array of initial internal variable
+  IPHyperViscoElastoPlastic *q1,             // updated array of internal variable (in ipvcur on output),
+  STensor43 &Tangent,         // constitutive tangents (output)
+  const bool stiff          // if true compute the tangents
+  ) const{
+  
+  static STensor43 dFedF, dFpdF;
 
-void mlawHyperViscoElastoPlasticPowerYield::setPowerFactor(const double n) {
-  _n = n;
-};
-void mlawHyperViscoElastoPlasticPowerYield::nonAssociatedFlowRuleFactor(const double b){
-  _b = b;
-};
-void mlawHyperViscoElastoPlasticPowerYield::setPlasticPoissonRatio(const double nup){
-  _b = 4.5*(1.-2.*nup)/(1.+nup);
-};
-void mlawHyperViscoElastoPlasticPowerYield::setNonAssociatedFlow(const bool flag) {
-  _nonAssociatedFlow = flag; 
-  if (_nonAssociatedFlow){
-    Msg::Info("non associated flow is used");
+  if (_tangentByPerturbation){
+    this->predictorCorrector(Fn,q0,q1,P,false,Tangent,dFedF,dFpdF);
+    if (stiff)
+      this->tangent_full_perturbation(Tangent,dFedF,dFpdF,P,Fn,q0,q1);
   }
   else{
-    Msg::Info("associated flow is used");
+    this->predictorCorrector(Fn,q0,q1,P,stiff,Tangent,dFedF,dFpdF);
   }
 };
 
-void mlawHyperViscoElastoPlasticPowerYield::updateEqPlasticDeformation(IPHyperViscoElastoPlastic *q1, const IPHyperViscoElastoPlastic *q0,
+
+void mlawPowerYieldHyper::updateEqPlasticDeformation(IPHyperViscoElastoPlastic *q1, const IPHyperViscoElastoPlastic *q0,
                                             const double& nup, const double& Dgamma) const{
   q1->_epspbarre = q0->_epspbarre+ Dgamma;
   q1->_epspCompression = q0->_epspCompression+ Dgamma;
@@ -558,7 +584,7 @@ void mlawHyperViscoElastoPlasticPowerYield::updateEqPlasticDeformation(IPHyperVi
 };
 
 
-void mlawHyperViscoElastoPlasticPowerYield::getYieldCoefficients(const IPHyperViscoElastoPlastic *q, fullVector<double>& coeffs) const{
+void mlawPowerYieldHyper::getYieldCoefficients(const IPHyperViscoElastoPlastic *q, fullVector<double>& coeffs) const{
   double sigc = q->_ipCompression->getR();
   double sigt = q->_ipTraction->getR();
 
@@ -573,7 +599,7 @@ void mlawHyperViscoElastoPlasticPowerYield::getYieldCoefficients(const IPHyperVi
   coeffs(0) = (pow(m,_n)+m)/(m+1);
 };
 
-void mlawHyperViscoElastoPlasticPowerYield::getYieldCoefficientDerivatives(const IPHyperViscoElastoPlastic *q, const double& nup, fullVector<double>& Dcoeffs) const{
+void mlawPowerYieldHyper::getYieldCoefficientDerivatives(const IPHyperViscoElastoPlastic *q, const double& nup, fullVector<double>& Dcoeffs) const{
   double sigc(0.), Hc(0.);
   sigc = q->_ipCompression->getR();
   Hc = q->_ipCompression->getDR();
@@ -596,4041 +622,124 @@ void mlawHyperViscoElastoPlasticPowerYield::getYieldCoefficientDerivatives(const
 
 };
 
-void mlawHyperViscoElastoPlasticPowerYield::predictorCorrector_nonAssociatedFlow_Maxwell(const STensor3& F0, const STensor3& F, const IPHyperViscoElastoPlastic *q0, IPHyperViscoElastoPlastic *q1,
-                            STensor3&P, const bool stiff, STensor43& Tangent) const{
+void mlawPowerYieldHyper::predictorCorrector_nonAssociatedFlow(const STensor3& F, const IPHyperViscoElastoPlastic *q0, IPHyperViscoElastoPlastic *q1,
+                            STensor3&P, const bool stiff, STensor43& Tangent, STensor43& dFedF, STensor43& dFpdF) const{
+  /* compute elastic predictor */
+  STensor3& Fp1 = q1->_Fp;
+  const STensor3& Fp0 = q0->_Fp;
+
+  Fp1 = Fp0; // plastic deformation tensor
+  q1->_epspbarre = q0->_epspbarre; // plastic equivalent strain
+  q1->_epspCompression = q0->_epspCompression;
+  q1->_epspTraction = q0->_epspTraction;
+  q1->_epspShear = q0->_epspShear;
+  q1->_backsig = q0->_backsig; // backstress tensor
+  q1->_DgammaDt = 0.;
+
   
-};
+  static STensor3 Fpinv, Ce, Fepr;
+  STensorOperation::inverseSTensor3(Fp1,Fpinv);
+  STensorOperation::multSTensor3(F,Fpinv,Fepr);
+  STensorOperation::multSTensor3FirstTranspose(Fepr,Fepr,Ce);
+  
+  static STensor3 invFp0; // plastic predictor 
+  invFp0= Fpinv;
+  STensor3& Fe = q1->_Fe;
+  Fe = Fepr;
+  
+  static STensor43 DlnDCepr, DlnDCe;
+  static STensor63 DDlnDDCe;
+  static STensor43 dexpAdA; // estimation of dexpA/dA
+  
+  STensor3& Ee = q1->_Ee;
+  STensorOperation::logSTensor3(Ce,_order,Ee,&DlnDCepr,&DDlnDDCe);
+  Ee *= 0.5;
+  DlnDCe = DlnDCepr;
+  
+  // update A, B
+  double Ge, Ke;
+  viscoElasticPredictor(Ee,q0->_Ee,q0,q1,Ke,Ge);
+  
+  static STensor3 PhiPr;
+  PhiPr = q1->_kirchhoff;
+  PhiPr -= q1->_backsig;
+  
+  static STensor3 devPhipr,devPhi; // effective dev stress predictor
+  static double ptildepr,ptilde;
+  STensorOperation::decomposeDevTr(PhiPr,devPhipr,ptildepr);
+  ptildepr/= 3.;
+  
+  ptilde = ptildepr; // current effective pressure
+  devPhi =devPhipr;
+  
+  double PhiEqpr2 = 1.5*devPhipr.dotprod();
+  double PhiEqpr = sqrt(PhiEqpr2);
 
+  // plastic poisson ratio
+  q1->_nup = (9.-2.*_b)/(18.+2.*_b);
+  double kk = 1./sqrt(1.+2.*q1->_nup*q1->_nup);
 
-double mlawHyperelastic::tr(const STensor3& E) const{
-  return E(0,0)+E(1,1)+E(2,2);
-};
-void mlawHyperelastic::dev(const STensor3& E, STensor3& devE, double& trE) const{
-  trE = tr(E);
-  devE = E;
-  double trEover3 = trE/3.;
-
-  devE(0,0) -=trEover3;
-  devE(1,1) -=trEover3;
-  devE(2,2) -=trEover3;
-};
+  double Gamma = 0.; //  // flow rule parameter
+  double PhiEq = PhiEqpr;
+ 
+  
+   // hardening
+  this->hardening(q1);
+  static fullVector<double> a(3), Da(3); // yield coefficients and derivatives in respect to plastic deformation
+  this->getYieldCoefficients(q1,a);
 
-void mlawHyperelastic::logSTensor3(const STensor3& a, STensor3 &loga, STensor43 *dloga, STensor63* ddloga) const
-{
-   /* linear approximation for now */
-  static const STensor3 I(-1.);
-  static const STensor43 I4(1.,1.);
-  STensor3 ami(I);
-  ami+= a;
+  double Hb =0.;
+  if (q1->_ipKinematic != NULL)
+    Hb = q1->_ipKinematic->getDR(); // kinematic hardening parameter
 
-  if (_order == 1){
-    loga = ami;
-  }
-  else if (_order == 2){
-    STensor3 ami2;
-    multSTensor3(ami,ami,ami2);
-    ami2*= -0.5;
-    loga = ami;
-    loga += ami2;
-  }
-  else if (_order == 3){
-    STensor3 ami2;
-    multSTensor3(ami,ami,ami2);
-    STensor3 ami3;
-    multSTensor3(ami2,ami,ami3);
+  double Gt= Ge + kk*Hb/2.;
+  double Kt = Ke + kk*Hb/3.;
+  //a.print("a init");
 
-    loga = ami;
+  static STensor3 devN; // dev part of yield normal
+  static double trN;; // trace part of yield normal
+  static STensor3 N; // yield normal
 
-    ami2*= -0.5;
-    loga += ami2;
+  double f = a(2)*pow(PhiEq,_n) - (a(1)*ptilde+a(0));
 
-    ami3 *=  0.3333333333;
-    loga += ami3;
-  }
-  else{
-    loga = I;
-    loga+= a;
-  }
+  double DfDGamma = 0.;
+  double dfdDgamma = 0.;
+  double u = 1.;
+  double v = 1.;
 
-  if(dloga !=NULL)
-  {
-    if (_order == 1){
-      (*dloga) = I4;
-    }
-    else if (_order == 2){
-      (*dloga) = I4;
-      for (int i=0; i<3; i++){
-        for (int j=0; j<3; j++){
-          for (int k=0; k<3; k++){
-            for (int l=0; l<3; l++){
-              for (int s=0; s<3; s++){
-                dloga->operator()(i,j,k,l) -= 0.5*I4(i,s,k,l)*ami(s,j);
-                dloga->operator()(i,j,k,l) -= 0.5*ami(i,s)*I4(s,j,k,l);
-              }
-            }
-          }
-        }
-      }
-    }
-    else if (_order == 3){
-      (*dloga) = I4;
-      for (int i=0; i<3; i++){
-        for (int j=0; j<3; j++){
-          for (int k=0; k<3; k++){
-            for (int l=0; l<3; l++){
-              for (int s=0; s<3; s++){
-                dloga->operator()(i,j,k,l) -= 0.5*I4(i,s,k,l)*ami(s,j);
-                dloga->operator()(i,j,k,l) -= 0.5*ami(i,s)*I4(s,j,k,l);
+  double A = sqrt(6.*PhiEq*PhiEq+4.*_b*_b/3.*ptilde*ptilde);
 
-                for (int q=0; q<3; q++){
-                  dloga->operator()(i,j,k,l) += 0.3333333333*I4(i,s,k,l)*ami(s,q)*ami(q,j);
-                  dloga->operator()(i,j,k,l) += 0.3333333333*ami(i,s)*I4(s,q,k,l)*ami(q,j);
-                  dloga->operator()(i,j,k,l) += 0.3333333333*ami(i,s)*ami(s,q)*I4(q,j,k,l);
-                }
-              }
-            }
-          }
-        }
-      }
-    }
-    else{
-      (*dloga) = I4;
-    }
 
-  }
-
-  if (ddloga != NULL){
-    if (_order == 1){
-      (*ddloga) *= 0.;
-    }
-    else if (_order == 2){
-      (*ddloga) *= 0.;
-      for (int i=0; i<3; i++){
-        for (int j=0; j<3; j++){
-          for (int k=0; k<3; k++){
-            for (int l=0; l<3; l++){
-              for (int m=0; m<3; m++){
-                for (int n=0; n<3; n++){
-                  for (int s=0; s<3; s++){
-                    ddloga->operator()(i,j,k,l,m,n) -= 0.5*I4(i,s,k,l)*I4(s,j,m,n);
-                    ddloga->operator()(i,j,k,l,m,n) -= 0.5*I4(i,s,m,n)*I4(s,j,k,l);
-                  }
-                }
-              }
-            }
-          }
-        }
-      }
-    }
-    else if (_order == 3){
-      (*ddloga) *= 0.;
-      for (int i=0; i<3; i++){
-        for (int j=0; j<3; j++){
-          for (int k=0; k<3; k++){
-            for (int l=0; l<3; l++){
-              for (int m=0; m<3; m++){
-                for (int n=0; n<3; n++){
-                  for (int s=0; s<3; s++){
-                    ddloga->operator()(i,j,k,l,m,n) -= 0.5*I4(i,s,k,l)*I4(s,j,m,n);
-                    ddloga->operator()(i,j,k,l,m,n) -= 0.5*I4(i,s,m,n)*I4(s,j,k,l);
-                    for (int q=0; q<3; q++){
-                      ddloga->operator()(i,j,k,l,m,n) += 0.3333333333*I4(i,s,k,l)*I4(s,q,m,n)*ami(q,j)+0.3333333333*I4(i,s,k,l)*ami(s,q)*I4(q,j,m,n);
-                      ddloga->operator()(i,j,k,l,m,n) += 0.3333333333*I4(i,s,m,n)*I4(s,q,k,l)*ami(q,j)+0.3333333333*ami(i,s)*I4(s,q,k,l)*I4(q,j,m,n);
-                      ddloga->operator()(i,j,k,l,m,n) += 0.3333333333*I4(i,s,m,n)*ami(s,q)*I4(q,j,k,l)+0.3333333333*ami(i,s)*I4(s,q,m,n)*I4(q,j,k,l);
-                    }
-                  }
-                }
-              }
-            }
-          }
-        }
-      }
-    }
-    else{
-      (*ddloga) *= 0.;
-    }
-  }
-}
-
-void mlawHyperelastic::expSTensor3(const STensor3 &a,STensor3 &expa,STensor43 *dexpa) const
-{
-  static const STensor3 I(1.);
-  static const STensor43 I4(1.,1.);
-
-  if (_order == 1){
-    expa = I;
-    expa += a;
-  }
-  else if (_order == 2){
-    STensor3 a2;
-    multSTensor3(a,a,a2);
-    expa = I;
-    expa += a;
-    a2 *= 0.5;
-    expa += a2;
-  }
-  else if (_order == 3){
-    STensor3 a2;
-    multSTensor3(a,a,a2);
-    STensor3 a3;
-    multSTensor3(a2,a,a3);
-    expa = I;
-    expa += a;
-    a2 *= 0.5;
-    expa += a2;
-    a3 *=0.16666667;
-    expa += a3;
-  }
-  else{
-    expa = I;
-    expa += a;
-  }
-
-
-  if(dexpa!=NULL)
-  {
-    if (_order == 1){
-      (*dexpa) = I4;
-    }
-    else if (_order == 2){
-      (*dexpa) = I4;
-      for (int i=0; i<3; i++){
-        for (int j=0; j<3; j++){
-          for (int k=0; k<3; k++){
-            for (int l=0; l<3; l++){
-              for (int s=0; s<3; s++){
-                dexpa->operator()(i,j,k,l) += 0.5*I4(i,s,k,l)*a(s,j);
-                dexpa->operator()(i,j,k,l) += 0.5*a(i,s)*I4(s,j,k,l);
-              }
-            }
-          }
-        }
-      }
-    }
-    else if (_order == 3){
-      (*dexpa) = I4;
-      for (int i=0; i<3; i++){
-        for (int j=0; j<3; j++){
-          for (int k=0; k<3; k++){
-            for (int l=0; l<3; l++){
-              for (int s=0; s<3; s++){
-                dexpa->operator()(i,j,k,l) += 0.5*I4(i,s,k,l)*a(s,j);
-                dexpa->operator()(i,j,k,l) += 0.5*a(i,s)*I4(s,j,k,l);
-
-                for (int q=0; q<3; q++){
-                  dexpa->operator()(i,j,k,l) += 0.16666667*I4(i,s,k,l)*a(s,q)*a(q,j);
-                  dexpa->operator()(i,j,k,l) += 0.16666667*a(i,s)*I4(s,q,k,l)*a(q,j);
-                  dexpa->operator()(i,j,k,l) += 0.16666667*a(i,s)*a(s,q)*I4(q,j,k,l);
-                }
-              }
-            }
-          }
-        }
-      }
-    }
-    else{
-      (*dexpa) = I4;
-    }
-
-  }
-}
-
-double mlawHyperelastic::determinantSTensor3(const STensor3 &a) const
-{
-  return (a(0,0) * (a(1,1) * a(2,2) - a(1,2) * a(2,1)) -
-          a(0,1) * (a(1,0) * a(2,2) - a(1,2) * a(2,0)) +
-          a(0,2) * (a(1,0) * a(2,1) - a(1,1) * a(2,0)));
-}
-
-void mlawHyperelastic::inverseSTensor3(const STensor3 &a, STensor3 &ainv) const
-{
-  double udet = 1./determinantSTensor3(a);
-  ainv(0,0) =  (a(1,1) * a(2,2) - a(1,2) * a(2,1))* udet;
-  ainv(1,0) = -(a(1,0) * a(2,2) - a(1,2) * a(2,0))* udet;
-  ainv(2,0) =  (a(1,0) * a(2,1) - a(1,1) * a(2,0))* udet;
-  ainv(0,1) = -(a(0,1) * a(2,2) - a(0,2) * a(2,1))* udet;
-  ainv(1,1) =  (a(0,0) * a(2,2) - a(0,2) * a(2,0))* udet;
-  ainv(2,1) = -(a(0,0) * a(2,1) - a(0,1) * a(2,0))* udet;
-  ainv(0,2) =  (a(0,1) * a(1,2) - a(0,2) * a(1,1))* udet;
-  ainv(1,2) = -(a(0,0) * a(1,2) - a(0,2) * a(1,0))* udet;
-  ainv(2,2) =  (a(0,0) * a(1,1) - a(0,1) * a(1,0))* udet;
-}
-
-void mlawHyperelastic::multSTensor3(const STensor3 &a, const STensor3 &b, STensor3 &c) const
-{
-  for(int i=0;i<3;i++)
-    for(int j=0;j<3;j++)
-  {
-    c(i,j) = a(i,0)*b(0,j)+a(i,1)*b(1,j)+a(i,2)*b(2,j);
-  }
-}
-
-void mlawHyperelastic::multSTensor3FirstTranspose(const STensor3 &A, const STensor3 &B, STensor3 &C) const
-{
-  for(int i=0;i<3;i++)
-    for(int j=0;j<3;j++)
-      C(i,j) = A(0,i)*B(0,j) + A(1,i)*B(1,j) + A(2,i)*B(2,j);
-}
-
-void mlawHyperelastic::multSTensor3SecondTranspose(const STensor3 &a, const STensor3 &b, STensor3 &c) const
-{
-  for(int i=0;i<3;i++)
-    for(int j=0;j<3;j++)
-      c(i,j) = a(i,0)*b(j,0)+a(i,1)*b(j,1)+a(i,2)*b(j,2);
-}
-
-void mlawHyperelastic::multSTensor43STensor3(const STensor43 &t, const STensor3 &m,STensor3 &val) const{
-  val*=0.;
-  for (int i = 0; i < 3; i++)
-    for (int j = 0; j < 3; j++)
-      for (int k = 0; k < 3; k++)
-        for (int l = 0; l < 3; l++)
-          val(i,j)+=t(i,j,k,l)*m(k,l);
-};
-void mlawHyperelastic::multSTensor3STensor43(const STensor3 &m, const STensor43 &t,STensor3 &val) const{
-  val*=0.;
-  for (int i = 0; i < 3; i++)
-    for (int j = 0; j < 3; j++)
-      for (int k = 0; k < 3; k++)
-        for (int l = 0; l < 3; l++)
-          val(k,l)+=m(i,j)*t(i,j,k,l);
-};
-void mlawHyperelastic::multSTensor43(const STensor43 &a, const STensor43 &b, STensor43 &c) const
-{
-  c*=0.;
-  for(int i=0;i<3;i++)
-    for(int j=0;j<3;j++)
-      for(int k=0;k<3;k++)
-        for(int l=0;l<3;l++)
-          for(int ii=0;ii<3;ii++)
-            for(int jj=0;jj<3;jj++)
-            {
-              c(i,j,k,l) += a(i,j,ii,jj)*b(ii,jj,k,l);
-            }
-}
-
-mlawHyperelastic::mlawHyperelastic(const int num,const double E,const double nu, const double rho,
-                        const double tol,const bool matrixbyPerturbation, const double pert, const bool init)
-                        :  materialLaw(num,init), _E(E), _nu(nu), _rho(rho),
-                        _lambda((E*nu)/(1.+nu)/(1.-2.*nu)),
-                       _mu(0.5*E/(1.+nu)),_K(E/3./(1.-2.*nu)), _K3(3.*_K), _mu3(3.*_mu),
-                       _mu2(2.*_mu), _I4(1.,1.), _I(1.), _tol(tol),_tangentByPerturbation(matrixbyPerturbation),
-                       _perturbationfactor(pert),
-                       _compression(NULL),_traction(NULL),_shear(NULL),_kinematic(NULL),_order(1),
-                       _p(1.),_viscosity(NULL),_N(0.),_viscoMethod(0){
-
-  Cel=0.;
-  Cel(0,0,0,0) = _lambda + _mu2;
-  Cel(1,1,0,0) = _lambda;
-  Cel(2,2,0,0) = _lambda;
-  Cel(0,0,1,1) = _lambda;
-  Cel(1,1,1,1) = _lambda + _mu2;
-  Cel(2,2,1,1) = _lambda;
-  Cel(0,0,2,2) = _lambda;
-  Cel(1,1,2,2) = _lambda;
-  Cel(2,2,2,2) = _lambda + _mu2;
-
-  Cel(1,0,1,0) = _mu;
-  Cel(2,0,2,0) = _mu;
-  Cel(0,1,0,1) = _mu;
-  Cel(2,1,2,1) = _mu;
-  Cel(0,2,0,2) = _mu;
-  Cel(1,2,1,2) = _mu;
-
-  Cel(0,1,1,0) = _mu;
-  Cel(0,2,2,0) = _mu;
-  Cel(1,0,0,1) = _mu;
-  Cel(1,2,2,1) = _mu;
-  Cel(2,0,0,2) = _mu;
-  Cel(2,1,1,2) = _mu;
-
-  _Idev = _I4;
-   STensor3 mIon3(-1./3);
-   STensor43 mIIon3;
-   tensprod(_I,mIon3, mIIon3);
-   _Idev += mIIon3;
-};
-mlawHyperelastic::mlawHyperelastic(const mlawHyperelastic& source)
-      : materialLaw(source),_E(source._E), _nu(source._nu), _rho(source._rho),
-     _lambda(source._lambda),
-     _mu(source._mu), _K(source._K),_K3(source._K3), _mu3(source._mu3),
-     _mu2(source._mu2), _tol(source._tol),
-     _perturbationfactor(source._perturbationfactor),
-     _tangentByPerturbation(source._tangentByPerturbation),
-     Cel(source.Cel),_I4(source._I4),_I(source._I),_Idev(source._Idev),_N(source._N),
-     _Ki(source._Ki),_ki(source._ki),_Gi(source._Gi),_gi(source._gi),_viscoMethod(source._viscoMethod)
-{
-  _compression = NULL;
-  _shear = NULL;
-  _traction = NULL;
-  _kinematic = NULL;
-  if (source._compression != NULL) _compression = source._compression->clone();
-  if (source._traction != NULL) _traction = source._traction->clone();
-  if (source._shear != NULL) _shear = source._shear->clone();
-  if (source._kinematic != NULL) _kinematic = source._kinematic->clone();
-  _viscosity = NULL;
-  if (source._viscosity != NULL) _viscosity = source._viscosity->clone();
-};
-
-mlawHyperelastic& mlawHyperelastic::operator = (const materialLaw& source){
-  materialLaw::operator=(source);
-  const mlawHyperelastic* src =dynamic_cast<const mlawHyperelastic*>(&source);
-  if(src != NULL)
-  {
-    _E = src->_E;
-    _nu = src->_nu;
-    _rho = src->_rho;
-    _lambda = src->_lambda;
-    _mu = src->_mu;
-    _K = src->_K;
-    _K3 = src->_K3;
-    _mu3 = src->_mu3;
-    _mu2 = src->_mu2;
-    _tol = src->_tol;
-    _perturbationfactor = src->_perturbationfactor;
-    _tangentByPerturbation = src->_tangentByPerturbation;
-
-    Cel = src->Cel;
-    _I4 = src->_I4;
-    _I = src->_I;
-    _Idev = src->_Idev;
-
-    _N = src->_N;
-    _Ki = src->_Ki;
-    _ki = src->_ki;
-    _Gi = src->_Gi;
-    _gi = src->_gi;
-
-    _viscoMethod = src->_viscoMethod;
-
-    if (_compression) delete _compression; _compression = NULL;
-    if (_shear) delete _shear; _shear = NULL;
-    if (_traction) delete _traction; _traction = NULL;
-    if (_kinematic) delete _kinematic; _kinematic = NULL;
-
-    if (src->_compression != NULL) _compression = src->_compression->clone();
-    if (src->_traction != NULL) _traction = src->_traction->clone();
-    if (src->_shear != NULL) _shear = src->_shear->clone();
-    if (src->_kinematic != NULL) _kinematic = src->_kinematic->clone();
-
-    if (_viscosity) delete _viscosity; _viscosity = NULL;
-    if (src->_viscosity != NULL) _viscosity = src->_viscosity->clone();
-  }
-  return *this;
-};
-
-mlawHyperelastic::~mlawHyperelastic(){
-  if (_compression) delete _compression; _compression = NULL;
-  if (_shear) delete _shear; _shear = NULL;
-  if (_traction) delete _traction; _traction = NULL;
-  if (_kinematic) delete _kinematic; _kinematic = NULL;
-  if (_viscosity) delete _viscosity; _viscosity = NULL;
-};
-
-void mlawHyperelastic::createIPState(IPStateBase* &ips,const bool* state_,const MElement *ele, const int nbFF_, const IntPt *GP, const int gpt) const
-{
-  IPVariable* ipvi = new IPHyperelastic(_compression,_traction,_shear,_kinematic,_N);
-  IPVariable* ipv1 = new IPHyperelastic(_compression,_traction,_shear,_kinematic,_N);
-  IPVariable* ipv2 = new IPHyperelastic(_compression,_traction,_shear,_kinematic,_N);
-  if(ips != NULL) delete ips;
-  ips = new IP3State(state_,ipvi,ipv1,ipv2);
-};
-
-
-void mlawHyperelastic::setCompressionHardening(const J2IsotropicHardening& comp){
-  if (_compression) delete _compression;
-  _compression = comp.clone();
-};
-void mlawHyperelastic::setTractionHardening(const J2IsotropicHardening& trac){
-  if (_traction) delete _traction;
-  _traction = trac.clone();
-};
-void mlawHyperelastic::setShearHardening(const J2IsotropicHardening& shear){
-  if (_shear) delete _shear;
-  _shear = shear.clone();
-};
-void mlawHyperelastic::setKinematicHardening(const kinematicHardening& kin){
-  if (_kinematic) delete _kinematic;
-  _kinematic = kin.clone();
-};
-void mlawHyperelastic::setViscosityEffect(const viscosityLaw& v, const double p){
-  _p = p;
-  if (_viscosity) delete _viscosity;
-  _viscosity = v.clone();
-};
-void mlawHyperelastic::setStrainOrder(const int order){
-  _order = order;
-  Msg::Info("order = %d is used to approximate log and exp");
-};
-
-void mlawHyperelastic::setViscoelasticMethod(const int method){
-  _viscoMethod = method;
-  if (_viscoMethod == 0)
-    Msg::Info("generalized maxwell model is used for viscoelasticity");
-  else if (_viscoMethod == 1)
-    Msg::Info("generalized Voigt-Kelvin model is used for viscoelasticity");
-  else
-    Msg::Fatal("this method has not been implemented");
-};
-
-void mlawHyperelastic::setViscoElasticNumberOfElement(const int N){
-  _N = N;
-  Msg::Info("Numer of Spring/Dashpot for generalized Maxwell model: %d",_N);
-  _Ki.clear(); _ki.clear();
-  _Gi.clear(); _gi.clear();
-  _Ki.resize(_N);
-  _ki.resize(_N);
-  _Gi.resize(_N);
-  _gi.resize(_N);
-};
-
-void mlawHyperelastic::setViscoElasticData(const int i, const double Ei, const double taui){
-  if (i> _N)
-    Msg::Error("This setting is invalid %d > %d",i,_N);
-  else{
-    double KK = Ei/(3.*(1.-2.*_nu));
-    double GG = Ei/(2.*(1.+_nu));
-    _Ki[i-1] = KK;
-    _ki[i-1] = taui;
-    _Gi[i-1] = GG;
-    _gi[i-1] = taui;
-
-    Msg::Info("setting: element=%d Ki= %e ki = %e, Gi=%e, gi=%e",i-1,KK,taui,GG,taui);
-  }
-};
-
-void mlawHyperelastic::setViscoElasticData_Bulk(const int i, const double Ki, const double ki){
-  if (i> _N)
-    Msg::Error("This setting is invalid %d > %d",i,_N);
-  else{
-    _Ki[i-1] = Ki;
-    _ki[i-1] = ki;
-    Msg::Info("setting: element=%d Ki= %e ki = %e, ",i-1,Ki,ki);
-  }
-};
-void mlawHyperelastic::setViscoElasticData_Shear(const int i, const double Gi, const double gi){
-  if (i> _N)
-    Msg::Error("This setting is invalid %d > %d",i,_N);
-  else{
-    _Gi[i-1] = Gi;
-    _gi[i-1] = gi;
-
-    Msg::Info("setting: element=%d: Gi=%e, gi=%e",i-1,Gi,gi);
-  }
-};
-
-void mlawHyperelastic::setViscoElasticData(const std::string filename){
-  FILE* file = fopen(filename.c_str(),"r");
-  if (file == NULL) Msg::Fatal("file: %s does not exist",filename.c_str());
-  _Ki.clear(); _ki.clear();
-  _Gi.clear(); _gi.clear();
-  _N = 0;
-  Msg::Info("reading viscoelastic input data");
-
-  while (!feof(file)){
-    fscanf(file,"%d",&_N);
-    Msg::Info("Numer of Maxwell elements: %d",_N);
-    double KK, k, GG, g;
-
-    for (int i=0; i<_N; i++){
-      fscanf(file,"%lf %lf %lf %lf",&KK,&k,&GG,&g);
-      _Ki.push_back(KK);
-      _ki.push_back(k);
-      _Gi.push_back(GG);
-      _gi.push_back(g);
-      Msg::Info("Maxwell element %d: K[%d] = %e, k[%d] = %e, G[%d] = %e, g[%d] = %e",
-                i,i,KK,i,k,i,GG,i,g);
-    }
-  }
-  fclose(file);
-};
-
-double mlawHyperelastic::deformationEnergy(const STensor3 &C) const
-{
-  double Jac= sqrt((C(0,0) * (C(1,1) * C(2,2) - C(1,2) * C(2,1)) -
-          C(0,1) * (C(1,0) * C(2,2) - C(1,2) * C(2,0)) +
-          C(0,2) * (C(1,0) * C(2,1) - C(1,1) * C(2,0))));
-  double lnJ = log(Jac);
-  STensor3 logCdev;
-  logSTensor3(C,logCdev,NULL);
-  double trace = logCdev.trace();
-  logCdev(0,0)-=trace/3.;
-  logCdev(1,1)-=trace/3.;
-  logCdev(2,2)-=trace/3.;
-
-  double Psy = _K*0.5*lnJ*lnJ+_mu*0.25*dot(logCdev,logCdev);
-  for (int i=0; i<_N; i++){
-    Psy += _Ki[i]*0.5*lnJ*lnJ+_Gi[i]*0.25*dot(logCdev,logCdev);
-  }
-  return Psy;;
-}
-
-void mlawHyperelastic::corStress(const STensor3& Ee, STensor3& devK, double& p) const{
-  STensor3 devEe;
-  double trEe;
-  dev(Ee,devEe,trEe);
-  devK = devEe;
-  devK *= _mu2;  // deviatoric part
-  p = _K*trEe; // pressure
-};
-
-void mlawHyperelastic::getDCorStressDCepr(const STensor43& Lpr, STensor3& DpprDCepr, STensor43& DdevKprDCepr) const{
-  multSTensor3STensor43(_I,Lpr,DpprDCepr);
-  DpprDCepr*= (0.5*_K);
-
-  multSTensor43(_Idev,Lpr,DdevKprDCepr);
-  DdevKprDCepr*= _mu;
-};
-
-void mlawHyperelastic::hardening(IPHyperelastic* q) const{
-  //Msg::Error("epspCompression = %e, epspTRaction = %e, epspShear = %e",q->_epspCompression,q->_epspTraction,q->_epspShear);
-  if (_compression != NULL && q->_ipCompression != NULL){
-    _compression->hardening(q->_epspCompression,*q->_ipCompression);
-  }
-
-
-  if (_traction!= NULL && q->_ipTraction != NULL){
-    _traction->hardening(q->_epspTraction,*q->_ipTraction);
-  }
-
-  if (_shear!= NULL && q->_ipShear!= NULL){
-    _shear->hardening(q->_epspShear,*q->_ipShear);
-  }
-
-  if (_kinematic!= NULL && q->_ipKinematic != NULL)
-    _kinematic->hardening(q->_epspbarre,*q->_ipKinematic);
-};
-
-void mlawHyperelastic::computeDKcorprDF_elastic(STensor43& DKcorDF, STensor3& DpDF, STensor43& DdevKDF,
-                          const STensor3& DpprDCepr, const STensor43& DdevKprDCepr,
-                          const STensor3& F, const STensor3& Fp0, const STensor3& invFp0) const{
-  STensor3 DpDCepr(DpprDCepr);
-  STensor43 DdevKDCepr(DdevKprDCepr);
-
-  STensor3 DpDC(0.);
-  for (int k=0; k<3; k++)
-    for (int l=0; l<3; l++)
-      for (int p=0; p<3; p++)
-        for (int q=0; q<3; q++)
-          DpDC(k,l) += DpDCepr(p,q)*invFp0(k,p)*invFp0(l,q);
-
-  DpDF *= 0.;
-  for (int k=0; k<3; k++)
-    for (int l=0; l<3; l++)
-      for (int p=0; p<3; p++)
-        for (int q=0; q<3; q++)
-          DpDF(k,l) += DpDC(p,q)*(F(k,p)*_I(q,l)+F(k,q)*_I(p,l));
-
-
-  STensor43 DdevKDC(0.);
-  for (int i=0; i<3; i++)
-    for (int j=0; j<3; j++)
-      for (int k=0; k<3; k++)
-        for (int l=0; l<3; l++)
-          for (int p=0; p<3; p++)
-            for (int q=0; q<3; q++)
-              DdevKDC(i,j,k,l) += DdevKDCepr(i,j,p,q)*invFp0(k,p)*invFp0(l,q);
-
-
-  DdevKDF*= 0.;
-  for (int i=0; i<3; i++)
-      for (int j=0; j<3; j++)
-        for (int k=0; k<3; k++)
-          for (int l=0; l<3; l++)
-            for (int p=0; p<3; p++)
-              for (int q=0; q<3; q++)
-                DdevKDF(i,j,k,l) += DdevKDC(i,j,p,q)*(F(k,p)*_I(q,l)+F(k,q)*_I(p,l));
-
-  DKcorDF*=0.;
-  for (int m=0; m<3; m++)
-    for (int n=0; n<3; n++)
-      for (int p=0; p<3; p++)
-        for (int q=0; q<3; q++)
-          DKcorDF(m,n,p,q) = _I(m,n)*DpDF(p,q)+ DdevKDF(m,n,p,q);
-};
-
-void mlawHyperelastic::predictorCorrector(const STensor3& F, const IPHyperelastic *q0, IPHyperelastic *q1,
-                            STensor3&P, const bool stiff, STensor43& Tangent) const{
-  if (_Ki.size() == 0 and _Gi.size() == 0){
-    this->predictorCorrector_elastic(F,q0,q1,P,stiff,Tangent);
-  }
-  else{
-    if (_viscoMethod == 0)
-      this->predictorCorrector_viscoelastic_Maxwell(F,q0,q1,P,stiff,Tangent);
-    else if (_viscoMethod == 1)
-      this->predictorCorrector_viscoelastic_VoigtKelvin(F,q0,q1,P,stiff,Tangent);
-
-    else
-      Msg::Fatal("this visco method has not been implemented");
-  }
-
-};
-
-void mlawHyperelastic::predictorCorrector_elastic(const STensor3& F, const IPHyperelastic *q0, IPHyperelastic *q1,
-                            STensor3&P,const bool stiff, STensor43& Tangent) const{
-
-  /* compute elastic predictor */
-  STensor3& Fp1 = q1->_Fp;
-  const STensor3& Fp0 = q0->_Fp;
-  q1->_Fp = q0->_Fp; // plastic deformation tensor
-  q1->_epspbarre = q0->_epspbarre; // plastic equivalent strain
-  q1->_epspCompression = q0->_epspCompression;
-  q1->_epspTraction = q0->_epspTraction;
-  q1->_epspShear = q0->_epspShear;
-  q1->_backsig = q0->_backsig; // backstress tensor
-  q1->_DgammaDt = 0.;
-
-  STensor3& Fe = q1->_Fe;
-  STensor3 Fpinv, Ce;
-  inverseSTensor3(Fp1,Fpinv);
-  multSTensor3(F,Fpinv,Fe);
-  multSTensor3FirstTranspose(Fe,Fe,Ce);
-
-  STensor3& Ee = q1->_Ee;
-  STensor43 Lpr;
-  STensor63 dLpr;
-  logSTensor3(Ce,Ee,&Lpr,&dLpr);
-  Ee *= 0.5;
-
-  STensor43 Epr; // estimation of dexpA/dA
-
-  STensor3 devK(0.); // dev corotational kirchoff stress predictor
-  double p = 0.; // pressure predictor
-  this->corStress(Ee,devK,p);
-
-   // corotational Kirchhoff stress tenor
-  STensor3& KS = q1->_kirchhoff;
-  KS = devK;
-  KS(0,0) += p;
-  KS(1,1) += p;
-  KS(2,2) += p;
-
-  // first Piola Kirchhoff stress
-  STensor3 S(0.);
-  for(int i=0; i<3; i++)
-    for(int j=0; j<3; j++)
-      for(int k=0; k<3; k++)
-        for(int l=0; l<3; l++)
-          S(i,j)+= KS(k,l)*Lpr(k,l,i,j);
-
-  P*= 0.;
-  for(int i=0; i<3; i++)
-    for(int j=0; j<3; j++)
-      for(int k=0; k<3; k++)
-        for(int l=0; l<3; l++)
-          P(i,j) += Fe(i,k)*S(k,l)*Fpinv(j,l);
-
-  // update current internal variables
-  q1->_elasticEnergy=deformationEnergy(Ce);
-  q1->_J = determinantSTensor3(F);
-  q1->_Je = determinantSTensor3(Fe);
-  q1->_Jp = determinantSTensor3(Fp1);
-
-  STensor3 Feinv = Fe.invert();
-  for (int i=0; i<3; i++){
-    for (int j=0; j<3; j++){
-      q1->_elasticStrainRate(i,j) = 0.;
-      q1->_plasticStrainRate(i,j) = 0.;
-      for (int k=0; k<3; k++){
-        q1->_elasticStrainRate(i,j) += (q1->_Fe(i,k)-q0->_Fe(i,k))*Feinv(k,j)/this->getTimeStep();
-        q1->_plasticStrainRate(i,j) += (q1->_Fp(i,k)-q0->_Fp(i,k))*Fpinv(k,j)/this->getTimeStep();
-      }
-    }
-  }
-
-  for (int i=0; i<3; i++){
-    for (int j=0; j<3; j++){
-      q1->_strainRate(i,j) = q1->_elasticStrainRate(i,j);
-      for (int k=0; k<3; k++){
-        for (int l=0; l<3; l++){
-          q1->_strainRate(i,j) += Fe(i,k)*q1->_plasticStrainRate(k,l)*Feinv(l,j);
-        }
-      }
-    }
-  }
-
-
-
-  if (stiff){
-
-    STensor3 invFp0 = Fp0.invert();
-    STensor3 DpprDCepr;
-    STensor43 DdevKprDCepr;
-    getDCorStressDCepr(Lpr,DpprDCepr,DdevKprDCepr);
-
-
-    STensor43& dFpdF = q1->_DFpDF;
-    dFpdF  *= 0.;
-    STensor3& dgammadF = q1->_DgammaDF;
-    dgammadF *= 0;
-
-    STensor43& DKcorDF = q1->_DKcorDF;
-    DKcorDF *= 0.;
-    computeDKcorprDF_elastic(DKcorDF,q1->_DpcorDF, q1->_DdevKcorDF,DpprDCepr,DdevKprDCepr,F, Fp0, invFp0);
-
-    STensor43& dFedF = q1->_DFeDF;
-    dFedF *=0;
-    for (int m=0; m<3; m++)
-      for (int j=0; j<3; j++)
-        for (int k=0; k<3; k++)
-          for (int l=0; l<3; l++){
-            dFedF(m,j,k,l) += _I(m,k)*Fpinv(l,j);
-          }
-
-    STensor43 dCeDF(0.);
-    for (int i=0; i<3; i++)
-      for (int j=0; j<3; j++)
-        for (int k=0; k<3; k++)
-          for (int l=0; l<3; l++)
-            for (int m=0; m<3; m++)
-              dCeDF(i,j,k,l) += dFedF(m,i,k,l)*Fe(m,j)+ Fe(m,i)*dFedF(m,j,k,l);
-
-
-    STensor63 dLprDF(0.);
-    for (int a=0; a<3; a++)
-      for (int b=0; b<3; b++)
-        for (int i=0; i<3; i++)
-          for (int j=0; j<3; j++)
-            for (int k=0; k<3; k++)
-              for (int l=0; l<3; l++)
-                for (int p=0; p<3; p++)
-                  for (int q=0; q<3; q++)
-                    dLprDF(a,b,i,j,k,l) += dLpr(a,b,i,j,p,q)*dCeDF(p,q,k,l);
-
-
-    STensor43 dSdF(0.);
-    for (int i=0; i<3; i++)
-      for (int j=0; j<3; j++)
-        for (int k=0; k<3; k++)
-          for (int l=0; l<3; l++)
-            for (int m=0; m<3; m++)
-              for (int n=0; n<3; n++){
-                dSdF(i,j,k,l) += DKcorDF(m,n,k,l)*Lpr(m,n,i,j);
-                dSdF(i,j,k,l) += KS(m,n)*dLprDF(m,n,i,j,k,l);
-              }
-
-    for (int i=0; i<3; i++)
-      for (int j=0; j<3; j++)
-        for (int k=0; k<3; k++)
-          for (int l=0; l<3; l++){
-            Tangent(i,j,k,l) = 0.;
-            for (int m=0; m<3; m++){
-              for (int n=0; n<3; n++){
-                Tangent(i,j,k,l) += dFedF(i,m,k,l)*S(m,n)*Fpinv(j,n);
-                Tangent(i,j,k,l) += Fe(i,m)*dSdF(m,n,k,l)*Fpinv(j,n);
-              }
-            }
-          }
-
-  };
-};
-
-void mlawHyperelastic::predictorCorrector_viscoelastic_VoigtKelvin(const STensor3& F, const IPHyperelastic *q0, IPHyperelastic *q1,
-                            STensor3&P, const bool stiff, STensor43& Tangent) const{
-  /* compute viscoelastic model */
-  STensor3& Fp1 = q1->_Fp;
-  const STensor3& Fp0 = q0->_Fp;
-  Fp1 = Fp0; // plastic deformation tensor
-  q1->_epspbarre = q0->_epspbarre; // plastic equivalent strain
-  q1->_epspCompression = q0->_epspCompression;
-  q1->_epspTraction = q0->_epspTraction;
-  q1->_epspShear = q0->_epspShear;
-  q1->_backsig = q0->_backsig; // backstress tensor
-  q1->_DgammaDt = 0.;
-
-  STensor3& Fe = q1->_Fe;
-  STensor3 Fpinv, Ce;
-  inverseSTensor3(Fp1,Fpinv);
-  multSTensor3(F,Fpinv,Fe);
-  multSTensor3FirstTranspose(Fe,Fe,Ce);
-
-  STensor3& Ee = q1->_Ee;
-  STensor43 Lpr;
-  STensor63 dLpr;
-  logSTensor3(Ce,Ee,&Lpr,&dLpr);
-  Ee *= 0.5;
-
-  STensor3 DE(q0->_Ee);
-  DE*= -1.;
-  DE += Ee;
-
-  STensor3 devDE(0.);
-  double trDE(0.);
-  dev(DE,devDE,trDE);
-
-  double dt = this->getTimeStep();
-
-  double invGe = 1./_mu;
-  STensor3 D(0.);
-  for (int i=0; i<_Gi.size(); i++){
-    double dtg = dt/(_gi[i]);
-    invGe += (1.-exp(-dtg/2.))/_Gi[i];
-    for (int k=0; k<3; k++){
-      for (int l=0; l<3; l++){
-        D(k,l) += q0->_A[i](k,l)*(exp(-dtg)-1.)/(2.*_Gi[i]);
-      }
-    }
-  }
-  double Ge = 1./invGe;
-
-  double invKe = 1./_K;
-  double V= 0.;
-  for (int i=0; i<_Ki.size(); i++){
-    double dtk = dt/(_ki[i]);
-    invKe += (1.-exp(-dtk/2))/_Ki[i];
-    V += q0->_B[i]*(exp(-dtk)-1.)/(3.*_Ki[i]);
-  }
-  double Ke = 1./invKe;
-
-  // stress increment
-  STensor3 DdevK(devDE); // dev corotational kirchoff stress predictor
-  DdevK += D;
-  DdevK *= (2.*Ge);
-  double Dp = Ke*(trDE+ V); // pressure predictor
-
-  /*update internal variable from stress increment*/
-  for (int i=0; i< _Gi.size(); i++){
-    q1->_A[i] *= 0.;
-    double dtg = dt/(_gi[i]);
-    for (int k=0; k<3; k++){
-      for (int l=0; l<3; l++){
-        q1->_A[i](k,l) += exp(-dtg)*q0->_A[i](k,l) + exp(-dtg/2.)*DdevK(k,l);
-      }
-    }
-  }
-
-  for (int i=0; i< _Ki.size(); i++){
-    q1->_B[i] *= 0.;
-    double dtk = dt/(_ki[i]);
-    q1->_B[i] += exp(-dtk)*q0->_B[i] + exp(-dtk/2.)*3.*Dp;
-  }
-
-   // corotational Kirchhoff stress tenor from previous and increment
-  STensor3& KS = q1->_kirchhoff;
-  KS = q0->_kirchhoff;
-  KS += DdevK;
-  KS(0,0) += Dp;
-  KS(1,1) += Dp;
-  KS(2,2) += Dp;
-
-
-  // first Piola Kirchhoff stress
-  STensor3 S(0.);
-  for(int i=0; i<3; i++)
-    for(int j=0; j<3; j++)
-      for(int k=0; k<3; k++)
-        for(int l=0; l<3; l++)
-          S(i,j)+= KS(k,l)*Lpr(k,l,i,j);
-
-  P*= 0.;
-  for(int i=0; i<3; i++)
-    for(int j=0; j<3; j++)
-      for(int k=0; k<3; k++)
-        for(int l=0; l<3; l++)
-          P(i,j) += Fe(i,k)*S(k,l)*Fpinv(j,l);
-
-  // update current internal variables
-  q1->_elasticEnergy=deformationEnergy(Ce);
-  q1->_J = determinantSTensor3(F);
-  q1->_Je = determinantSTensor3(Fe);
-  q1->_Jp = determinantSTensor3(Fp1);
-
-  STensor3 Feinv = Fe.invert();
-  for (int i=0; i<3; i++){
-    for (int j=0; j<3; j++){
-      q1->_elasticStrainRate(i,j) = 0.;
-      q1->_plasticStrainRate(i,j) = 0.;
-      for (int k=0; k<3; k++){
-        q1->_elasticStrainRate(i,j) += (q1->_Fe(i,k)-q0->_Fe(i,k))*Feinv(k,j)/this->getTimeStep();
-        q1->_plasticStrainRate(i,j) += (q1->_Fp(i,k)-q0->_Fp(i,k))*Fpinv(k,j)/this->getTimeStep();
-      }
-    }
-  }
-
-
-  if (stiff){
-
-    STensor3 invFp0 = Fp0.invert();
-    STensor3 DpprDCepr;
-    STensor43 DdevKprDCepr;
-
-    multSTensor3STensor43(_I,Lpr,DpprDCepr);
-    DpprDCepr*= (0.5*Ke);
-
-    multSTensor43(_Idev,Lpr,DdevKprDCepr);
-    DdevKprDCepr*= Ge;
-
-    STensor43& dFpdF = q1->_DFpDF;
-    dFpdF *= 0.;
-    STensor3& dgammadF = q1->_DgammaDF;
-    dgammadF *= 0;
-    STensor43& DKcorDF = q1->_DKcorDF;
-    DKcorDF *= 0.;
-    computeDKcorprDF_elastic(DKcorDF,q1->_DpcorDF, q1->_DdevKcorDF,DpprDCepr,DdevKprDCepr,F, Fp0, invFp0);
-    STensor43& dFedF = q1->_DFeDF;
-    dFedF *=0;
-    for (int m=0; m<3; m++)
-      for (int j=0; j<3; j++)
-        for (int k=0; k<3; k++)
-          for (int l=0; l<3; l++){
-            dFedF(m,j,k,l) += _I(m,k)*Fpinv(l,j);
-          }
-
-    STensor43 dCeDF(0.);
-    for (int i=0; i<3; i++)
-      for (int j=0; j<3; j++)
-        for (int k=0; k<3; k++)
-          for (int l=0; l<3; l++)
-            for (int m=0; m<3; m++)
-              dCeDF(i,j,k,l) += dFedF(m,i,k,l)*Fe(m,j)+ Fe(m,i)*dFedF(m,j,k,l);
-
-
-    STensor63 dLprDF(0.);
-    for (int a=0; a<3; a++)
-      for (int b=0; b<3; b++)
-        for (int i=0; i<3; i++)
-          for (int j=0; j<3; j++)
-            for (int k=0; k<3; k++)
-              for (int l=0; l<3; l++)
-                for (int p=0; p<3; p++)
-                  for (int q=0; q<3; q++)
-                    dLprDF(a,b,i,j,k,l) += dLpr(a,b,i,j,p,q)*dCeDF(p,q,k,l);
-
-
-    STensor43 dSdF(0.);
-    for (int i=0; i<3; i++)
-      for (int j=0; j<3; j++)
-        for (int k=0; k<3; k++)
-          for (int l=0; l<3; l++)
-            for (int m=0; m<3; m++)
-              for (int n=0; n<3; n++){
-                dSdF(i,j,k,l) += DKcorDF(m,n,k,l)*Lpr(m,n,i,j);
-                dSdF(i,j,k,l) += KS(m,n)*dLprDF(m,n,i,j,k,l);
-              }
-
-    for (int i=0; i<3; i++)
-      for (int j=0; j<3; j++)
-        for (int k=0; k<3; k++)
-          for (int l=0; l<3; l++){
-            Tangent(i,j,k,l) = 0.;
-            for (int m=0; m<3; m++){
-              for (int n=0; n<3; n++){
-                Tangent(i,j,k,l) += dFedF(i,m,k,l)*S(m,n)*Fpinv(j,n);
-                Tangent(i,j,k,l) += Fe(i,m)*dSdF(m,n,k,l)*Fpinv(j,n);
-              }
-            }
-          }
-
-  };
-
-};
-
-void mlawHyperelastic::predictorCorrector_viscoelastic_Maxwell(const STensor3& F, const IPHyperelastic *q0, IPHyperelastic *q1,
-                            STensor3&P, const bool stiff, STensor43& Tangent) const{
-  /* compute viscoelastic model */
-  STensor3& Fp1 = q1->_Fp;
-  const STensor3& Fp0 = q0->_Fp;
-
-  Fp1 = Fp0; // plastic deformation tensor
-  q1->_epspbarre = q0->_epspbarre; // plastic equivalent strain
-  q1->_epspCompression = q0->_epspCompression;
-  q1->_epspTraction = q0->_epspTraction;
-  q1->_epspShear = q0->_epspShear;
-  q1->_backsig = q0->_backsig; // backstress tensor
-  q1->_DgammaDt = 0.;
-
-  STensor3& Fe = q1->_Fe;
-  STensor3 Fpinv, Ce;
-  inverseSTensor3(Fp1,Fpinv);
-  multSTensor3(F,Fpinv,Fe);
-  multSTensor3FirstTranspose(Fe,Fe,Ce);
-
-  STensor3& Ee = q1->_Ee;
-  STensor43 Lpr;
-  STensor63 dLpr;
-  logSTensor3(Ce,Ee,&Lpr,&dLpr);
-  Ee *= 0.5;
-
-  STensor3 devEe(0.);
-  double trEe(0.);
-  dev(Ee,devEe,trEe);
-
-
-  const STensor3& Ee0 = q0->_Ee;
-  STensor3 devEe0(0.);
-  double trEe0(0.);
-  dev(Ee0,devEe0,trEe0);
-
-
-  // update A, B
-
-  double dt = this->getTimeStep();
-//  Msg::Error("dt = %e",dt);
-  double Ge = _mu;
-  double Ke = _K;
-
-  //Msg::Error("Gi size = %d, Ki size = %d",_Gi.size(), _Ki.size());
-
-  for (int i=0; i<_Gi.size(); i++){
-    double dtg = dt/_gi[i];
-    double expmdtg = exp(-dtg);
-    double ztag = exp(-dtg/2.);
-    for (int k=0; k<3; k++){
-      for (int l=0; l<3; l++){
-        q1->_A[i](k,l) = expmdtg*q0->_A[i](k,l) + 2.*_Gi[i]*ztag*(devEe(k,l)-devEe0(k,l));
-      }
-    }
-    Ge += _Gi[i]*ztag;
-  }
-
-  for (int i=0; i<_Ki.size(); i++){
-    double dtk = dt/_ki[i];
-    double expmdtk = exp(-dtk);
-    double ztak = exp(-dtk/2.);
-    q1->_B[i] = q0->_B[i]*expmdtk +_Ki[i]*ztak*(trEe-trEe0);
-    Ke += _Ki[i]*ztak;
-  }
-
-
-  STensor3 devK(0.); // dev corotational kirchoff stress predictor
-  double p = 0.; // pressure predictor
-  this->corStress(Ee,devK,p);
-  for (int i=0; i<_Gi.size(); i++){
-    devK += q1->_A[i];
-  }
-  for (int i=0; i<_Ki.size(); i++){
-    p += q1->_B[i];
-  }
-
-   // corotational Kirchhoff stress tenor
-  STensor3& KS = q1->_kirchhoff;
-  KS = devK;
-  KS(0,0) += p;
-  KS(1,1) += p;
-  KS(2,2) += p;
-
-  // first Piola Kirchhoff stress
-  STensor3 S(0.);
-  for(int i=0; i<3; i++)
-    for(int j=0; j<3; j++)
-      for(int k=0; k<3; k++)
-        for(int l=0; l<3; l++)
-          S(i,j)+= KS(k,l)*Lpr(k,l,i,j);
-
-  P*= 0.;
-  for(int i=0; i<3; i++)
-    for(int j=0; j<3; j++)
-      for(int k=0; k<3; k++)
-        for(int l=0; l<3; l++)
-          P(i,j) += Fe(i,k)*S(k,l)*Fpinv(j,l);
-
-  // update current internal variables
-  q1->_elasticEnergy=deformationEnergy(Ce);
-  q1->_J = determinantSTensor3(F);
-  q1->_Je = determinantSTensor3(Fe);
-  q1->_Jp = determinantSTensor3(Fp1);
-
-  STensor3 Feinv = Fe.invert();
-  for (int i=0; i<3; i++){
-    for (int j=0; j<3; j++){
-      q1->_elasticStrainRate(i,j) = 0.;
-      q1->_plasticStrainRate(i,j) = 0.;
-      for (int k=0; k<3; k++){
-        q1->_elasticStrainRate(i,j) += (q1->_Fe(i,k)-q0->_Fe(i,k))*Feinv(k,j)/this->getTimeStep();
-        q1->_plasticStrainRate(i,j) += (q1->_Fp(i,k)-q0->_Fp(i,k))*Fpinv(k,j)/this->getTimeStep();
-      }
-    }
-  }
-
-
-  if (stiff){
-
-    STensor3 invFp0 = Fp0.invert();
-    STensor3 DpprDCepr;
-    STensor43 DdevKprDCepr;
-
-    multSTensor3STensor43(_I,Lpr,DpprDCepr);
-    DpprDCepr*= (0.5*Ke);
-
-    multSTensor43(_Idev,Lpr,DdevKprDCepr);
-    DdevKprDCepr*= Ge;
-
-    STensor43& dFpdF = q1->_DFpDF;
-    dFpdF *= 0.;
-
-    STensor3& dgammadF = q1->_DgammaDF;
-    dgammadF *= 0;
-    STensor43& DKcorDF = q1->_DKcorDF;
-    DKcorDF *= (0.);
-    computeDKcorprDF_elastic(DKcorDF,q1->_DpcorDF,q1->_DdevKcorDF, DpprDCepr,DdevKprDCepr,F, Fp0, invFp0);
-
-    STensor43& dFedF = q1->_DFeDF;
-    dFedF *=0;
-    for (int m=0; m<3; m++)
-      for (int j=0; j<3; j++)
-        for (int k=0; k<3; k++)
-          for (int l=0; l<3; l++){
-            dFedF(m,j,k,l) += _I(m,k)*Fpinv(l,j);
-          }
-
-    STensor43 dCeDF(0.);
-    for (int i=0; i<3; i++)
-      for (int j=0; j<3; j++)
-        for (int k=0; k<3; k++)
-          for (int l=0; l<3; l++)
-            for (int m=0; m<3; m++)
-              dCeDF(i,j,k,l) += dFedF(m,i,k,l)*Fe(m,j)+ Fe(m,i)*dFedF(m,j,k,l);
-
-
-    STensor63 dLprDF(0.);
-    for (int a=0; a<3; a++)
-      for (int b=0; b<3; b++)
-        for (int i=0; i<3; i++)
-          for (int j=0; j<3; j++)
-            for (int k=0; k<3; k++)
-              for (int l=0; l<3; l++)
-                for (int p=0; p<3; p++)
-                  for (int q=0; q<3; q++)
-                    dLprDF(a,b,i,j,k,l) += dLpr(a,b,i,j,p,q)*dCeDF(p,q,k,l);
-
-
-    STensor43 dSdF(0.);
-    for (int i=0; i<3; i++)
-      for (int j=0; j<3; j++)
-        for (int k=0; k<3; k++)
-          for (int l=0; l<3; l++)
-            for (int m=0; m<3; m++)
-              for (int n=0; n<3; n++){
-                dSdF(i,j,k,l) += DKcorDF(m,n,k,l)*Lpr(m,n,i,j);
-                dSdF(i,j,k,l) += KS(m,n)*dLprDF(m,n,i,j,k,l);
-              }
-
-    for (int i=0; i<3; i++)
-      for (int j=0; j<3; j++)
-        for (int k=0; k<3; k++)
-          for (int l=0; l<3; l++){
-            Tangent(i,j,k,l) = 0.;
-            for (int m=0; m<3; m++){
-              for (int n=0; n<3; n++){
-                Tangent(i,j,k,l) += dFedF(i,m,k,l)*S(m,n)*Fpinv(j,n);
-                Tangent(i,j,k,l) += Fe(i,m)*dSdF(m,n,k,l)*Fpinv(j,n);
-              }
-            }
-          }
-
-  };
-
-};
-
-void mlawHyperelastic::tangent_full_perturbation(
-                             STensor43 &T_,
-                             const STensor3 &P,
-                             const STensor3 &F,
-                             const IPHyperelastic* q0,
-                             IPHyperelastic* q1
-                           ) const{
-  T_*=0;
-  STensor43& dFpdF = q1->_DFpDF;
-  STensor43& dFeDF = q1->_DFeDF;
-  STensor3& DgammaDF = q1->_DgammaDF;
-  STensor3& DpDF = q1->_DpcorDF;
-  STensor43& DdevKDF = q1->_DdevKcorDF;
-  STensor43& DKDF = q1->_DKcorDF;
-
-  dFpdF *=0.;
-  dFeDF *= 0.;
-  DgammaDF*= 0.;
-  DpDF *= 0.;
-  DdevKDF *= 0.;
-  DKDF *= 0.;
-
-  STensor3 Kdev = q1->_kirchhoff.dev();
-
-  for (int i=0; i<3; i++){
-    for (int j=0; j<3; j++){
-      STensor3 Fpp(F);
-      IPHyperelastic q11(*q1);
-      Fpp(i,j)+=_perturbationfactor;
-      STensor3 Pp(0.0);
-      STensor43 T2;
-      this->predictorCorrector(Fpp,q0,&q11,Pp,false,T2);
-      DgammaDF(i,j) = (q11._epspbarre - q1->_epspbarre)/_perturbationfactor;
-      DpDF(i,j) = (q11._kirchhoff.trace() - q1->_kirchhoff.trace())/(3.*_perturbationfactor);
-      STensor3 devKpert = q11._kirchhoff.dev();
-
-      for (int k=0; k<3; k++){
-        for (int l=0; l<3; l++){
-          T_(k,l,i,j) = (Pp(k,l)-P(k,l))/_perturbationfactor;
-          dFpdF(k,l,i,j) = (q11._Fp(k,l)-q1->_Fp(k,l))/_perturbationfactor;
-          dFeDF(k,l,i,j) = (q11._Fe(k,l)-q1->_Fe(k,l))/_perturbationfactor;
-          DKDF(k,l,i,j) = (q11._kirchhoff(k,l) - q1->_kirchhoff(k,l))/_perturbationfactor;
-          DdevKDF(k,l,i,j) = (devKpert(k,l) - Kdev(k,l))/_perturbationfactor;
-        }
-      }
-    }
-  }
-};
-
-double mlawHyperelastic::soundSpeed() const
-{
-  double factornu = (1.-_nu)/((1.+_nu)*(1.-2.*_nu));
-  return sqrt(_E*factornu/_rho);
-}
-void mlawHyperelastic::constitutive(
-  const STensor3& F0,         // initial deformation gradient (input @ time n)
-  const STensor3& Fn,         // updated deformation gradient (input @ time n+1)
-  STensor3 &P,                // updated 1st Piola-Kirchhoff stress tensor (output)
-  const IPHyperelastic *q0,       // array of initial internal variable
-  IPHyperelastic *q1,             // updated array of internal variable (in ipvcur on output),
-  STensor43 &Tangent,         // constitutive tangents (output)
-  const bool stiff          // if true compute the tangents
-  ) const{
-
-
-  if (_tangentByPerturbation){
-    this->predictorCorrector(Fn,q0,q1,P,false,Tangent);
-    if (stiff)
-      this->tangent_full_perturbation(Tangent,P,Fn,q0,q1);
-  }
-  else{
-    this->predictorCorrector(Fn,q0,q1,P,stiff,Tangent);
-  }
-};
-
-
-void mlawQuadYieldHyper::getYieldCoefficients(const IPHyperelastic *q, fullVector<double>& coeffs) const{
-  double sigc(0.);
-  if (q->_ipCompression != NULL){
-    sigc = q->_ipCompression->getR();
-  }
-
-  double sigt(0.);
-  if (q->_ipTraction != NULL){
-    sigt = q->_ipTraction->getR();
-  }
-
-  double sigs(0.);
-  if(q->_ipShear!= NULL){
-    sigs = q->_ipShear->getR();
-  }
-
-  coeffs.resize(3);
-  coeffs.setAll(0.);
-  // coeffs[0] = a0, coeffs[1] = a1, coeffs[2] = a2
-
-  if (_yieldType == 1){
-    coeffs(0) = sigc*sigt;
-    coeffs(1) = 3.*(sigt-sigc);
-    coeffs(2) = 0.;
-  }
-  else if (_yieldType ==2){
-    /*Drucker-Prager yield surface*/
-    double A = 2.*sigt*sigc/(sigc+sigt);
-    double B = 3.*(sigt - sigc)/(sigc+sigt);
-
-    coeffs(0) = A*A;
-    coeffs(1) = 2.*A*B;
-    coeffs(2) = B*B;
-  }
-  else if (_yieldType ==3){
-    /* full quadratic yield surface*/
-    coeffs(0) = 3.*sigs*sigs;
-    coeffs(1) = 9.*sigs*sigs*(sigt-sigc)/(sigc*sigt);
-    coeffs(2) = 9.-27.*sigs*sigs/(sigc*sigt);
-
-  }
-  else
-    Msg::Fatal("yield type must be specified");
-
-};
-
-void mlawQuadYieldHyper::getYieldCoefficientDerivatives(const IPHyperelastic *q, const double &nup, fullVector<double>& Dcoeffs) const{
-  double sigc(0.), Hc(0.);
-  if (q->_ipCompression != NULL){
-    sigc = q->_ipCompression->getR();
-    Hc = q->_ipCompression->getDR();
-  }
-
-  double sigt(0.), Ht(0.);
-  if (q->_ipTraction != NULL){
-    sigt = q->_ipTraction->getR();
-    Ht = q->_ipTraction->getDR();
-  }
-
-  double sigs(0.), Hs(0.);
-  if(q->_ipShear!= NULL){
-    sigs = q->_ipShear->getR();
-    Hs = q->_ipShear->getDR();
-  }
-
-  double Hss = Hs*sqrt(3)/2.;
-  double fact = sqrt(1.5/(1.+2.*nup*nup));
-  double Hcc = Hc*fact;
-  double Htt = Ht*fact;
-
-  Dcoeffs.resize(3);
-  Dcoeffs.setAll(0.);
-
-  // Dcoeffs(0) = H0, Dcoeffs(1) = H1,  Dcoeffs(2) = H2,
-
-  if (_yieldType == 1){
-    Dcoeffs(0) = sigc*Htt+ sigt*Hcc;
-    Dcoeffs(1) = 3.*(Htt-Hcc);
-    Dcoeffs(2) = 0.;
-  }
-  else if (_yieldType == 2){
-    double A = 2.*sigt*sigc/(sigc+sigt);
-    double B = 3.*(sigt - sigc)/(sigc+sigt);
-
-    double dA = 2.*(sigc*sigc*Hcc + sigt*sigt*Htt)/(sigc+sigt)/(sigc+sigt);
-    double dB = 6.*(sigc*Htt - sigt*Hcc)/(sigc+sigt)/(sigc+sigt);
-
-    Dcoeffs(0) = 2.*A*dA;
-    Dcoeffs(1) = dA*B+A*dB;
-    Dcoeffs(2) = 2.*B*dB;
-
-  }
-  else if (_yieldType == 3){
-    /* full quadratic yield surface*/
-    Dcoeffs(0) = 6.*sigs*Hss;
-    Dcoeffs(1) = 18.*sigs*(sigt-sigc)/(sigc*sigt)*Hss+ 9.*sigs*sigs/(sigt*sigt)*Htt - 9.*sigs*sigs/(sigc*sigc)*Hcc;
-    Dcoeffs(2) = 27.*sigs*sigs/(sigc*sigt)*(-2.*Hss/sigs+ Htt/sigt+Hcc/sigc);
-  }
-  else
-    Msg::Fatal("yield type must be specified");
-
-};
-
-
-
-void mlawQuadYieldHyper::getFlowPotentialCoefficients(const fullVector<double>& coeffs,
-                                              fullVector<double>& flowCoeffs) const{
-
-  flowCoeffs.resize(3);
-  flowCoeffs.setAll(0.);
-  if (_flowType == 1){
-    flowCoeffs(2) = coeffs(2);
-    flowCoeffs(1) = coeffs(1);
-  }
-  else if (_flowType ==2){
-    flowCoeffs(2) = coeffs(2);
-    flowCoeffs(1) = _b1;
-  }
-  else if (_flowType ==3){
-    flowCoeffs(2) = _b2;
-    flowCoeffs(1) = _b1;
-  }
-  else
-    Msg::Fatal("Flow rule must be specified");
-};
-
-void mlawQuadYieldHyper::getFlowPotentialCoefficientDerivatives(const fullVector<double>& Dcoeffs,
-                                              fullVector<double>& DflowCoeffs) const{
-  DflowCoeffs.resize(3);
-  DflowCoeffs.setAll(0.);
-  if (_flowType == 1){
-    DflowCoeffs(2) = Dcoeffs(2);
-    DflowCoeffs(1) = Dcoeffs(1);
-  }
-  else if (_flowType ==2){
-    DflowCoeffs(2) = Dcoeffs(2);
-    DflowCoeffs(1) = 0.;
-  }
-  else if (_flowType ==3){
-    DflowCoeffs(2) = 0.;
-    DflowCoeffs(1) = 0.;
-  }
-  else
-    Msg::Fatal("Flow rule must be specified");
-};
-
-double mlawQuadYieldHyper::getPlasticPoissonRatio(const fullVector<double>& flowCoeffs, const double & ppr, const double& Dpression) const{
-  double b2 = flowCoeffs(2);
-  double b1 = flowCoeffs(1);
-  double nup = ((9.+2.*b2)*(ppr+Dpression)+b1)/((18.-2.*b2)*(ppr+Dpression)-b1);
-  return nup;
-};
-
-void mlawQuadYieldHyper::computeResidual(const double& keqpr2, const double& ppr,
-                          const fullVector<double>& unknowns,
-                          const fullVector<double>& coeffs,
-                          const fullVector<double>& flowCoeffs,
-                          fullVector<double>& res) const{
-  double Dgamma = unknowns(0);
-  double Dpression = unknowns(1);
-  double Gamma = unknowns(2);
-
-  double p =  ppr+Dpression; // updated pressure
-  double u = 1.+6.*_mu*Gamma;
-  double uu = u*u;
-
-  res.resize(3);
-  res(0) = Dgamma- sqrt(keqpr2*4.*Gamma*Gamma/uu+ 2./9.*Dpression*Dpression/(_K*_K));
-  res(1) = Dpression/_K- Gamma*(2.*flowCoeffs(2)*ppr+flowCoeffs(1))/(1.-2.*flowCoeffs(2)*_K*Gamma);
-  res(2) = keqpr2/uu/_yield02 - (coeffs(2)*p*p+coeffs(1)*p+coeffs(0))/_yield02;
-};
-
-void mlawQuadYieldHyper::computeJacobian(const double& keq2pr, const double& ppr,
-                          const fullVector<double>& unknowns,
-                          const fullVector<double>& coeffs,
-                          const fullVector<double>& Dcoeffs,
-                          const fullVector<double>& flowCoeffs,
-                          const fullVector<double>& DflowCoeffs,
-                          fullMatrix<double>& J) const{
-  double Dgamma = unknowns(0);
-  double Dpression = unknowns(1);
-  double Gamma = unknowns(2);
-
-  double p =  ppr+Dpression; // updated pressure
-
-  double u = 1.+6.*_mu*Gamma;
-  double uu = u*u;
-  double uuu = uu*u;
-
-  double v = 1.-2.*flowCoeffs(2)*_K*Gamma;
-  double vv = v*v;
-
-  J.resize(3,3);
-  double A = sqrt(keq2pr*4.*Gamma*Gamma/uu+ 2./9.*Dpression*Dpression/(_K*_K));
-
-  if (A <1e-10){
-    J(0,0) = 1.;
-    J(0,1) = -sqrt(2./9.)/_K;
-    J(0,2) = -2.*sqrt(keq2pr);
-  }
-  else{
-    J(0,0) = 1.;
-    J(0,1) = -2./9.*Dpression/(A*_K*_K);
-    J(0,2) = -4.*Gamma*keq2pr/(A*uuu);
-  }
-
-  J(1,0) = -Gamma*(2.*ppr+2.*_K*Gamma*flowCoeffs(1))*DflowCoeffs(2)/vv- Gamma*DflowCoeffs(1)/v;
-  J(1,1) = 1./_K;
-  J(1,2) = -(2.*flowCoeffs(2)*ppr+flowCoeffs(1))/vv;
-
-  J(2,0) = -(Dcoeffs(2)*p*p+Dcoeffs(1)*p+Dcoeffs(0))/_yield02;
-  J(2,1) = -(2.*coeffs(2)*p+coeffs(1))/_yield02;
-  J(2,2) = -12.*_mu*keq2pr/uuu/_yield02;
-};
-
-void mlawQuadYieldHyper::computeDResidualDCepr(const STensor3& devKpr, const double& ppr,
-                          const double & Dgamma, const double& Dpression,const double Gamma,
-                          const fullVector<double>& coeffs,
-                          const fullVector<double>& flowCoeffs,
-                          const STensor3& DpprDCepr, const STensor43& DdevKprDCepr,
-                          STensor3& DPhigammaDCepr,STensor3&  DPhipDCepr,STensor3&  DPhiGDCepr) const{
-  double u = 1.+6.*_mu*Gamma;
-  double uu = u*u;
-  double p = ppr+Dpression;
-
-  double keq2pr = 1.5*devKpr.dotprod();
-
-  double A = sqrt(keq2pr*4.*Gamma*Gamma/uu+ 2./9.*Dpression*Dpression/(_K*_K));
-  double dAdkeq2pr = 2.*Gamma*Gamma/uu/A;
-
-  DPhigammaDCepr*= 0.;
-  for (int i=0; i<3; i++){
-    for (int j=0; j<3; j++){
-      for (int m=0; m<3; m++){
-        for (int l=0; l<3; l++){
-          DPhigammaDCepr(i,j) -= 3.*dAdkeq2pr*devKpr(m,l)*DdevKprDCepr(m,l,i,j);
-        }
-      }
-    }
-  }
-
-  DPhipDCepr *=0.;
-  double fact = -2.*Gamma*flowCoeffs(2)/(1.-2.*flowCoeffs(2)*_K*Gamma);
-  for (int i=0; i<3; i++){
-    for (int j=0; j<3; j++){
-      DPhipDCepr = fact*DpprDCepr(i,j);
-    }
-  }
-
-   DPhiGDCepr *= 0.;
-  for (int i=0; i<3; i++){
-    for (int j=0; j<3; j++){
-      DPhiGDCepr(i,j) = -(2.*coeffs(2)*p+coeffs(1))*DpprDCepr(i,j)/_yield02;
-      for (int k=0; k<3; k++){
-        for (int l=0; l<3; l++){
-          DPhiGDCepr(i,j) += 3.*devKpr(k,l)*DdevKprDCepr(k,l,i,j)/(uu*_yield02);
-        }
-      }
-    }
-  }
-
-
-};
-
-void mlawQuadYieldHyper::computedFpdF(STensor43& dFpdF, STensor43& DkcorDF,
-                          const STensor3& devKpr, const double& ppr,
-                          const STensor3& DpprDCepr, const STensor43& DdevKprDCepr,
-                          const STensor3& DgamaDCepr, const STensor3& DDpDCepr,const STensor3& DGDCepr,
-                          const double& Dgamma, const double& Dpression, const double& Gamma,
-                          const STensor3& N, const STensor3& devN, const double& trN,
-                          const STensor3& F, const STensor3& Fp0, const STensor3& invFp0, const STensor43& Epr) const{
-  dFpdF *= 0.;
-
-  double u = 1.+6.*_mu*Gamma;
-  double uu = u*u;
-
-  STensor3 DtrNDCepr;
-  for (int i=0; i<3; i++)
-    for (int j=0; j<3; j++)
-      DtrNDCepr(i,j) = -DDpDCepr(i,j)/(_K*Gamma)+ Dpression*DGDCepr(i,j)/(_K*Gamma*Gamma);
-
-  STensor43 DdevNDCepr;
-  for (int i=0; i<3; i++)
-    for (int j=0; j<3; j++)
-      for (int k=0; k<3; k++)
-        for (int l=0; l<3; l++){
-          DdevNDCepr(i,j,k,l) = 3./u*DdevKprDCepr(i,j,k,l) - 18.*_mu/uu*devKpr(i,j)*DGDCepr(k,l);
-        }
-
-  STensor43 temp1(0.);
-    for (int i=0; i<3; i++)
-      for (int j=0; j<3; j++)
-        for (int k=0; k<3; k++)
-          for (int l=0; l<3; l++)
-            temp1(i,j,k,l) = N(i,j)*DGDCepr(k,l)+ Gamma*DdevNDCepr(i,j,k,l)+ Gamma/3.*_I(i,j)*DtrNDCepr(k,l);
-
-    STensor43 EprFp0(0.);
-    for (int i=0; i<3; i++)
-      for (int j=0; j<3; j++)
-        for (int k=0; k<3; k++)
-          for (int l=0; l<3; l++){
-              for (int s=0; s<3; s++){
-                EprFp0(i,j,k,l) += Epr(i,s,k,l)*Fp0(s,j);
-              }
-            }
-
-    STensor43 dFpDCepr(0.);
-    multSTensor43(EprFp0,temp1,dFpDCepr);
-    // compute dFpDC
-    STensor43 dFpdC(0.);
-    for (int i=0; i<3; i++)
-      for (int j=0; j<3; j++)
-        for (int k=0; k<3; k++)
-          for (int l=0; l<3; l++)
-            for (int p=0; p<3; p++)
-              for (int q=0; q<3; q++)
-                dFpdC(i,j,k,l) += dFpDCepr(i,j,p,q)*invFp0(k,p)*invFp0(l,q);
-
-    // compute dFpDF
-    dFpdF *= 0.;
-    for (int i=0; i<3; i++)
-      for (int j=0; j<3; j++)
-        for (int k=0; k<3; k++)
-          for (int l=0; l<3; l++)
-            for (int p=0; p<3; p++)
-              for (int q=0; q<3; q++)
-                dFpdF(i,j,k,l) += dFpdC(i,j,p,q)*(F(k,p)*_I(q,l)+F(k,q)*_I(p,l));
-
-    STensor3 DpDCepr(DpprDCepr);
-    STensor43 DdevKDCepr(DdevKprDCepr);
-    for (int i=0; i<3; i++){
-      for (int j=0; j<3; j++){
-        DpDCepr(i,j) -= _K*(DGDCepr(i,j)*trN+Gamma*DtrNDCepr(i,j));
-        for (int k=0; k<3; k++){
-          for (int l=0; l<3; l++){
-            DdevKDCepr(i,j,k,l) -=  2.*_mu*(DGDCepr(k,l)*devN(i,j)+Gamma*DdevNDCepr(i,j,k,l));
-          }
-        }
-      }
-    }
-
-    STensor3 DpDC(0.);
-    for (int k=0; k<3; k++)
-      for (int l=0; l<3; l++)
-        for (int p=0; p<3; p++)
-          for (int q=0; q<3; q++)
-            DpDC(k,l) += DpDCepr(p,q)*invFp0(k,p)*invFp0(l,q);
-
-    STensor3 DpDF(0.);
-    for (int k=0; k<3; k++)
-      for (int l=0; l<3; l++)
-        for (int p=0; p<3; p++)
-          for (int q=0; q<3; q++)
-            DpDF(k,l) += DpDC(p,q)*(F(k,p)*_I(q,l)+F(k,q)*_I(p,l));
-
-
-    STensor43 DdevKDC(0.);
-    for (int i=0; i<3; i++)
-      for (int j=0; j<3; j++)
-        for (int k=0; k<3; k++)
-          for (int l=0; l<3; l++)
-            for (int p=0; p<3; p++)
-              for (int q=0; q<3; q++)
-                DdevKDC(i,j,k,l) += DdevKDCepr(i,j,p,q)*invFp0(k,p)*invFp0(l,q);
-
-
-    STensor43 DdevKDF(0.);
-    for (int i=0; i<3; i++)
-        for (int j=0; j<3; j++)
-          for (int k=0; k<3; k++)
-            for (int l=0; l<3; l++)
-              for (int p=0; p<3; p++)
-                for (int q=0; q<3; q++)
-                  DdevKDF(i,j,k,l) += DdevKDC(i,j,p,q)*(F(k,p)*_I(q,l)+F(k,q)*_I(p,l));
-
-    DkcorDF*=0.;
-    for (int m=0; m<3; m++)
-      for (int n=0; n<3; n++)
-        for (int p=0; p<3; p++)
-          for (int q=0; q<3; q++)
-            DkcorDF(m,n,p,q) = _I(m,n)*DpDF(p,q)+ DdevKDF(m,n,p,q);
-
-
-};
-
-
-void mlawQuadYieldHyper::updateEqPlasticDeformation(IPHyperelastic *q1, const IPHyperelastic *q0,
-                                            const double& nup, const double& Dgamma) const{
-  q1->_epspbarre = q0->_epspbarre+ Dgamma;
-  double fact =sqrt(1.5/(1.+2.*nup*nup));
-  //Msg::Error("fact = %e",fact);
-  q1->_epspCompression = q0->_epspCompression+ Dgamma*fact;
-  q1->_epspTraction = q0->_epspTraction+ Dgamma*fact;
-  q1->_epspShear = q0->_epspShear+ Dgamma*sqrt(3.)/2;
-};
-
-void mlawQuadYieldHyper::predictorCorrector(const STensor3& F,  const IPHyperelastic *q0, IPHyperelastic *q1,
-                            STensor3&P, const bool stiff, STensor43& Tangent) const{
-
-  STensor3& Fp1 = q1->_Fp;
-  const STensor3& Fp0 = q0->_Fp;
-
-  /* compute elastic predictor */
-  Fp1 = Fp0; // plastic deformation tensor
-  q1->_epspbarre = q0->_epspbarre; // plastic equivalent strain
-  q1->_epspCompression = q0->_epspCompression;
-  q1->_epspTraction = q0->_epspTraction;
-  q1->_epspShear = q0->_epspShear;
-
-  STensor3& Fe = q1->_Fe;
-
-  STensor3 Fpinv, Ce;
-  inverseSTensor3(Fp1,Fpinv);
-  multSTensor3(F,Fpinv,Fe);
-  multSTensor3FirstTranspose(Fe,Fe,Ce);
-
-  STensor3 Cepr(Ce);
-
-  STensor3& Ee = q1->_Ee;
-  STensor43 Lpr;
-  STensor63 dLpr;
-  logSTensor3(Ce,Ee,&Lpr,&dLpr);
-  Ee *= 0.5;
-
-  STensor43 Epr; // estimation of dexpA/dA
-
-  STensor3 devKpr; // dev corotational kirchoff stress predictor
-  double ppr; // pressure predictor
-  this->corStress(Ee,devKpr,ppr);
-  double keq2pr = 1.5*devKpr.dotprod();
-
-  double Dgamma = 0.; // increment of equivalent plastic strain
-  double Dpression = 0.;  // increment of pressure
-  double Gamma = 0.; // flow rule parameter
-  double& nup = q1->_nup; // plastic poisson ratio
-
-  Dgamma = 0.;
-  Dpression = 0.;
-  Gamma = 0.;
-  nup = 0.;
-
-  fullMatrix<double> J(3,3); // jacobian
-  fullMatrix<double> invJ(3,3); // inversed jacobian
-
-   // hardening
-  this->hardening(q1);
-  fullVector<double> coeffs, Dcoeffs; // yield coefficients and derivatives in respect to plastic deformation
-  fullVector<double> flowCoeffs, DflowCoeffs;
-  this->getYieldCoefficients(q1,coeffs);
-
-  STensor3 devN(0); // dev part of yield normal
-  double trN=0;; // trace part of yield normal
-  STensor3 N(0.); // yield normal
-
-
-  double f = keq2pr - (coeffs(2)*ppr*ppr+coeffs(1)*ppr+coeffs(0));
-  if (f>0){
-
-    // plasticity
-    int ite = 0;
-    int maxite = 1000; // maximal number of iters
-
-    this->getFlowPotentialCoefficients(coeffs,flowCoeffs);
-
-    // get intial value
-    //this->plasticGuest(keq2pr,ppr,coeffs,flowCoeffs,Dgamma,Dpression,Gamma);
-
-    nup = this->getPlasticPoissonRatio(flowCoeffs,ppr,Dpression); // plastic poisson ratio
-    // modify Eq. plastic strain
-    updateEqPlasticDeformation(q1,q0,nup,Dgamma);
-    this->hardening(q1);
-    this->getYieldCoefficients(q1,coeffs);
-    this->getFlowPotentialCoefficients(coeffs,flowCoeffs);
-
-
-    fullVector<double> unknowns;
-    unknowns.resize(3);
-    unknowns(0) = Dgamma;
-    unknowns(1) = Dpression;
-    unknowns(2) = Gamma;
-
-    fullVector<double> residual; // residual of eqs to estimate Dgamma, Dpression and Gamma
-
-    this->computeResidual(keq2pr,ppr,unknowns,coeffs,flowCoeffs,residual);
-    double res = residual.norm();
-
-    while(res> _tol or ite < 1){
-      // predictor
-      this->getYieldCoefficientDerivatives(q1,nup,Dcoeffs);
-      this->getFlowPotentialCoefficientDerivatives(Dcoeffs,DflowCoeffs);
-     //Msg::Error("H2 = %e, H1 = %e, H0 = %e", H2,H1,H0);
-
-      this->computeJacobian(keq2pr,ppr,unknowns,coeffs,Dcoeffs,flowCoeffs,DflowCoeffs,J);
-
-      J(0,0) *=1.;
-      J(0,1) *= _K;
-      J(0,2) /= _mu;
-
-      J(1,0) *= 1.;
-      J(1,1) *= _K;
-      J(1,2) /= _mu;
-
-      J(2,0) *= 1;
-      J(2,1) *= _K;
-      J(2,2) /= _mu;
-
-      J.invert(invJ);
-
-      //if (fabs(residual(2))<_tol) break;
-
-      //if (res0 <_tol) break;
-      //invJ.print("invJ");
-
-      fullVector<double> sol(3);
-      sol.setAll(0.);
-      invJ.mult(residual,sol);
-
-
-      if (sol(0) >0.1)
-        Dgamma = 0.1;
-      else if (Dgamma - sol(0) <0)
-        Dgamma /= 2.;
-      else
-        Dgamma -= sol(0);
-
-      if (fabs(ppr+Dpression-sol(1)*_K) > 1.5*fabs(ppr))
-        Dpression /= 2.;
-      else
-        Dpression -= sol(1)*_K;
-
-      if (Gamma -sol(2)/_mu < 0){
-        if (Gamma == 0) Gamma = 1e-4/_mu;
-        else Gamma /= 2.;
-      }
-      else
-        Gamma -= sol(2)/_mu;
-
-
-
-      unknowns(0) = Dgamma;
-      unknowns(1) = Dpression;
-      unknowns(2) = Gamma;
-
-
-      updateEqPlasticDeformation(q1,q0,nup,Dgamma);
-      this->hardening(q1);
-      this->getYieldCoefficients(q1,coeffs);
-      this->getFlowPotentialCoefficients(coeffs,flowCoeffs);
-
-      // compute residual
-      this->computeResidual(keq2pr,ppr,unknowns,coeffs,flowCoeffs,residual);
-      //J.print("Jacobian");
-      // convergent norm
-
-      ite++;
-      res = residual.norm();
-      //Msg::Info("iter = %d, res = %e, Dgamma = %e, Dpreesion = %e, Gamma=%e",ite,res, Dgamma,Dpression,Gamma);
-
-
-      if(ite > maxite){
-        Msg::Fatal("No convergence for plastic correction in mlawQuadYieldHyper iter = %d, res = %e!!",ite,res);
-        break;
-      }
-    }
-
-    // estimate yield normal
-    devN = devKpr;
-    devN *= (3./(1.+6.*_mu*Gamma));
-    trN = -Dpression/(_K*Gamma);
-    N = devN;
-    N(0,0) += trN/3.;
-    N(1,1) += trN/3.;
-    N(2,2) += trN/3.;
-
-    // estimate exp(GammaN)
-    STensor3 expGN(0.);
-    STensor3 GammaN = N;
-    GammaN *= Gamma;
-    expSTensor3(GammaN,expGN,&Epr);
-
-    // update plastic deformation tensor
-    multSTensor3(expGN,Fp0,Fp1);
-    // update IP
-    updateEqPlasticDeformation(q1,q0,nup,Dgamma);
-
-    // update elastic deformation tensor, corotational stress
-    inverseSTensor3(Fp1,Fpinv);
-    multSTensor3(F,Fpinv,Fe);
-    multSTensor3FirstTranspose(Fe,Fe,Ce);
-    logSTensor3(Ce,Ee,&Lpr,&dLpr);
-    Ee *= 0.5;
-  }
-
-  STensor3 devK = devKpr;  // dev corotational kirchoff stress
-  double p = ppr; // pressure
-
-  // update
-  p += Dpression;
-  devK*= 1./(1+6.*_mu*Gamma);
-
-  // corotational Kirchhoff stress tenor
-  STensor3 KS = devK;
-  KS(0,0) += p;
-  KS(1,1) += p;
-  KS(2,2) += p;
-
-
-  // first Piola Kirchhoff stress
-  STensor3 S(0.);
-  for(int i=0; i<3; i++)
-    for(int j=0; j<3; j++)
-      for(int k=0; k<3; k++)
-        for(int l=0; l<3; l++)
-          S(i,j)+= KS(k,l)*Lpr(k,l,i,j);
-
-  P*= 0.;
-  for(int i=0; i<3; i++)
-    for(int j=0; j<3; j++)
-      for(int k=0; k<3; k++)
-        for(int l=0; l<3; l++)
-          P(i,j) += Fe(i,k)*S(k,l)*Fpinv(j,l);
-
-  q1->_elasticEnergy=deformationEnergy(Ce);
-  q1->_J = determinantSTensor3(F);
-  q1->_Je = determinantSTensor3(Fe);
-  q1->_Jp = determinantSTensor3(Fp1);
-
-
-  if (stiff){
-    STensor3 DpprDCepr;
-    STensor43 DdevKprDCepr;
-
-    getDCorStressDCepr(Lpr,DpprDCepr,DdevKprDCepr);
-
-    STensor3 invFp0 = Fp0.invert();
-
-    STensor43& DKcorDF = q1->_DKcorDF;
-    DKcorDF *= (0.);
-
-    STensor43& dFpdF = q1->_DFpDF;
-    dFpdF  *= 0.;
-
-    STensor3& dgammadF = q1->_DgammaDF;
-    dgammadF*= 0.;
-
-    STensor43& dFedF =q1->_DFeDF;
-    dFedF *=0;
-
-    STensor3 DgamaDCepr(0.), DDpDCepr(0.), DGDCepr(0.);
-
-    // compute dFpdF
-    if (Dgamma > 0.){
-      STensor3 DPhigammaDCepr(0.), DPhipDCepr(0.),DPhiGDCepr(0.);
-      computeDResidualDCepr(devKpr, ppr, Dgamma,Dpression,Gamma,coeffs,flowCoeffs,DpprDCepr,DdevKprDCepr,
-                          DPhigammaDCepr, DPhipDCepr,DPhiGDCepr);
-
-      for (int i=0; i<3; i++){
-        for (int j=0; j<3; j++){
-          DgamaDCepr(i,j) = -invJ(0,0)*DPhigammaDCepr(i,j)-invJ(0,1)*DPhipDCepr(i,j)- invJ(0,2)*DPhiGDCepr(i,j);
-          DDpDCepr(i,j) = _K*(-invJ(1,0)*DPhigammaDCepr(i,j)-invJ(1,1)*DPhipDCepr(i,j)- invJ(1,2)*DPhiGDCepr(i,j));
-          DGDCepr(i,j) = (-invJ(2,0)*DPhigammaDCepr(i,j)-invJ(2,1)*DPhipDCepr(i,j)- invJ(2,2)*DPhiGDCepr(i,j))/_mu;
-        }
-      }
-
-      //DgamaDCepr.print("DgamaDCepr");
-
-      computedFpdF(dFpdF, DKcorDF,devKpr,ppr,DpprDCepr, DdevKprDCepr,
-                          DgamaDCepr,DDpDCepr,DGDCepr,
-                          Dgamma, Dpression,  Gamma,
-                          N, devN,trN, F, Fp0, invFp0,Epr);
-    }
-    else{
-      dFpdF *= 0.;
-      computeDKcorprDF_elastic(DKcorDF,q1->_DpcorDF,q1->_DdevKcorDF, DpprDCepr,DdevKprDCepr,F, Fp0, invFp0);
-    }
-
-
-
-    STensor3 DgamaDC(0.);
-    for (int k=0; k<3; k++)
-      for (int l=0; l<3; l++)
-        for (int p=0; p<3; p++)
-          for (int q=0; q<3; q++)
-            DgamaDC(k,l) += DgamaDCepr(p,q)*invFp0(k,p)*invFp0(l,q);
-
-
-    for (int k=0; k<3; k++)
-      for (int l=0; l<3; l++)
-        for (int p=0; p<3; p++)
-          for (int q=0; q<3; q++)
-            dgammadF(k,l) += DgamaDC(p,q)*(F(k,p)*_I(q,l)+F(k,q)*_I(p,l));
-
-
-    STensor43 DinvFpDF(0.); //
-    for (int i=0; i<3; i++)
-      for (int s=0; s<3; s++)
-        for (int k=0; k<3; k++)
-          for (int l=0; l<3; l++)
-            for (int m=0; m<3; m++)
-              for (int j=0; j<3; j++)
-                DinvFpDF(i,s,k,l) -= Fpinv(i,m)*dFpdF(m,j,k,l)*Fpinv(j,s);
-
-    for (int m=0; m<3; m++)
-      for (int j=0; j<3; j++)
-        for (int k=0; k<3; k++)
-          for (int l=0; l<3; l++){
-            dFedF(m,j,k,l) += _I(m,k)*Fpinv(l,j);
-            for (int s=0; s<3; s++)
-              dFedF(m,j,k,l) += F(m,s)*DinvFpDF(s,j,k,l);
-          }
-
-    STensor43 dCeDF(0.);
-    for (int i=0; i<3; i++)
-      for (int j=0; j<3; j++)
-        for (int k=0; k<3; k++)
-          for (int l=0; l<3; l++)
-            for (int m=0; m<3; m++)
-              dCeDF(i,j,k,l) += dFedF(m,i,k,l)*Fe(m,j)+ Fe(m,i)*dFedF(m,j,k,l);
-
-
-    STensor63 dLprDF(0.);
-    for (int a=0; a<3; a++)
-      for (int b=0; b<3; b++)
-        for (int i=0; i<3; i++)
-          for (int j=0; j<3; j++)
-            for (int k=0; k<3; k++)
-              for (int l=0; l<3; l++)
-                for (int p=0; p<3; p++)
-                  for (int q=0; q<3; q++)
-                    dLprDF(a,b,i,j,k,l) += dLpr(a,b,i,j,p,q)*dCeDF(p,q,k,l);
-
-
-    STensor43 dSdF(0.);
-    for (int i=0; i<3; i++)
-      for (int j=0; j<3; j++)
-        for (int k=0; k<3; k++)
-          for (int l=0; l<3; l++)
-            for (int m=0; m<3; m++)
-              for (int n=0; n<3; n++){
-                dSdF(i,j,k,l) += DKcorDF(m,n,k,l)*Lpr(m,n,i,j);
-                dSdF(i,j,k,l) += KS(m,n)*dLprDF(m,n,i,j,k,l);
-              }
-
-    for (int i=0; i<3; i++)
-      for (int j=0; j<3; j++)
-        for (int k=0; k<3; k++)
-          for (int l=0; l<3; l++){
-            Tangent(i,j,k,l) = 0.;
-            for (int m=0; m<3; m++){
-              for (int n=0; n<3; n++){
-                Tangent(i,j,k,l) += dFedF(i,m,k,l)*S(m,n)*Fpinv(j,n);
-                Tangent(i,j,k,l) += Fe(i,m)*dSdF(m,n,k,l)*Fpinv(j,n);
-                Tangent(i,j,k,l) += Fe(i,m)*S(m,n)*DinvFpDF(j,n,k,l);
-              }
-            }
-          }
-
-  }
-};
-
-mlawQuadYieldHyper::mlawQuadYieldHyper(const int num,const double E,const double nu, const double rho,
-                        const double tol,const bool matrixbyPerturbation, const double pert, const bool init):
-                    mlawHyperelastic(num,E,nu,rho,tol,matrixbyPerturbation,pert,init){
-}
-
-mlawQuadYieldHyper::mlawQuadYieldHyper(const int num,const double E,const double nu, const double rho,
-                        const double sy0C,const double hc,
-                        const double sy0T,const double ht,
-                        const double tol,
-                        const bool matrixbyPerturbation, const double pert, const bool init):
-                       mlawHyperelastic(num,E,nu,rho,tol,matrixbyPerturbation,pert,init)
-{
-  _flowType = 1;
-  _yieldType = 1;
-
-  _yield0 = std::max(sy0C,sy0T);
-  _yield02 = _yield0*_yield0;
-
-  Msg::Warning("default linear harderning laws are used for compression, traction and shear yieldings");
-  _compression = new LinearExponentialJ2IsotropicHardening(num, sy0C, hc, 0., 10.);
-  _traction = new LinearExponentialJ2IsotropicHardening(num, sy0T, ht, 0., 10.);
-
-};
-
-mlawQuadYieldHyper::mlawQuadYieldHyper(const int num,const double E,const double nu, const double rho,
-                      const J2IsotropicHardening &sc,
-                      const J2IsotropicHardening &st,const double tol,
-                      const bool matrixbyPerturbation , const double pert, const bool init):
-                      mlawHyperelastic(num,E,nu,rho,tol,matrixbyPerturbation,pert,init)
-{
-  _flowType = 1;
-  _yieldType = 1;
-
-  _yield0 = std::max(sc.getYield0(),st.getYield0());
-  _yield02 = _yield0*_yield0;
-
-  _compression= sc.clone();
-  _traction = st.clone();
-};
-
-mlawQuadYieldHyper::mlawQuadYieldHyper(const int num,const double E,const double nu, const double rho,
-                      const double sy0C,const double hc,
-                      const double sy0T,const double ht,
-                      const double sy0S,const double hs,const double tol,
-                      const bool matrixbyPerturbation , const double pert, const bool init):
-                      mlawHyperelastic(num,E,nu,rho,tol,matrixbyPerturbation,pert,init)
-{
-
-  Msg::Warning("default linear harderning laws are used for compression, traction and shear yieldings");
-  _shear = new LinearExponentialJ2IsotropicHardening(num, sy0S, hs, 0., 10.);
-  _compression = new LinearExponentialJ2IsotropicHardening(num, sy0C, hc, 0., 10.);
-  _traction = new LinearExponentialJ2IsotropicHardening(num, sy0T, ht, 0., 10.);
-
-  _yieldType = 3;
-  _flowType = 1;
-  _yield0 = std::max(sy0C,std::max(sy0T,sy0S));
-  _yield02 = _yield0*_yield0;
-};
-
-mlawQuadYieldHyper::mlawQuadYieldHyper(const int num,const double E,const double nu, const double rho,
-                      const J2IsotropicHardening &sc,
-                      const J2IsotropicHardening &st,
-                      const J2IsotropicHardening &ss,const double tol,
-                      const bool matrixbyPerturbation , const double pert, const bool init):
-                      mlawHyperelastic(num,E,nu,rho,tol,matrixbyPerturbation,pert,init)
-{
-  _flowType = 3;
-  _yieldType = 1;
-
-  _yield0 = std::max(sc.getYield0(),std::max(st.getYield0(),ss.getYield0()));
-  _yield02 = _yield0*_yield0;
-
-  _shear = ss.clone();
-  _compression= sc.clone();
-  _traction = st.clone();
-};
-
-mlawQuadYieldHyper::mlawQuadYieldHyper(const mlawQuadYieldHyper& source): mlawHyperelastic(source),
-                                                         _flowType(source._flowType),
-                                                         _b2(source._b2),_b1(source._b1),_yield0(source._yield0),_yield02(source._yield02),
-                                                         _yieldType(source._yieldType)
-{
-};
-
-mlawQuadYieldHyper& mlawQuadYieldHyper::operator = (const materialLaw& source){
-  mlawHyperelastic::operator=(source);
-  const mlawQuadYieldHyper* src =dynamic_cast<const mlawQuadYieldHyper*>(&source);
-  if(src != NULL)
-  {
-    _flowType = src->_flowType;
-    _b2 = src->_b2;
-    _b1 = src->_b1;
-    _yield0 = src->_yield0;
-    _yield02 = src->_yield02;
-    _yieldType = src->_yieldType;
-  }
-  return *this;
-};
-
-mlawQuadYieldHyper::~mlawQuadYieldHyper(){
-};
-
-void mlawQuadYieldHyper::createIPState(IPStateBase* &ips,const bool* state_,const MElement *ele, const int nbFF_, const IntPt *GP, const int gpt) const
-{
-  IPVariable* ipvi = new IPHyperelastic(_compression,_traction,_shear,_kinematic,_N);
-  IPVariable* ipv1 = new IPHyperelastic(_compression,_traction,_shear,_kinematic,_N);
-  IPVariable* ipv2 = new IPHyperelastic(_compression,_traction,_shear,_kinematic,_N);
-  if(ips != NULL) delete ips;
-  ips = new IP3State(state_,ipvi,ipv1,ipv2);
-};
-
-void mlawQuadYieldHyper::nonAssociatedFlowRuleFactor(const double b2, const double b1){
-  _b2 = b2;
-  _b1 = b1;
-};
-
-void mlawQuadYieldHyper::setFlowPotentialType(const int type){
-  _flowType = type;
-  if (_flowType == 1){
-    Msg::Info("associated flow rule is used");
-  }
-  else if (_flowType == 2 or _flowType == 3){
-    Msg::Info("non--associated flow rule type %d is used",_flowType);
-  }
-  else
-    Msg::Fatal("flow type %d has not be implemented",_flowType);
-
-};
-
-void mlawQuadYieldHyper::setYieldSurfaceType(const int type){
-  _yieldType = type;
-  if (_yieldType == 1){
-    Msg::Info("Paraboloidal yield surface is used");
-  }
-  else if (_yieldType == 2){
-    Msg::Info("Generalized Drucker-Prager yield surface is used");
-  }
-  else if (_yieldType == 3){
-    Msg::Info("Full quadratic yield surface is used");
-  }
-  else{
-    Msg::Fatal("yield type %d has not implemented");
-  }
-};
-
-
-void mlawPowerYieldHyper::updateEqPlasticDeformation(IPHyperelastic *q1, const IPHyperelastic *q0,
-                                            const double& nup, const double& Dgamma) const{
-  q1->_epspbarre = q0->_epspbarre+ Dgamma;
-  q1->_epspCompression = q0->_epspCompression+ Dgamma;
-  q1->_epspTraction = q0->_epspTraction+ Dgamma;
-  double k = 1./(sqrt(1.+2.*nup*nup));
-  q1->_epspShear = q0->_epspShear+ Dgamma/(k*sqrt(2.));
-
-};
-
-
-void mlawPowerYieldHyper::getYieldCoefficients(const IPHyperelastic *q, fullVector<double>& coeffs) const{
-  double sigc = q->_ipCompression->getR();
-  double sigt = q->_ipTraction->getR();
-
-  double m = sigt/sigc;
-
-  //Msg::Error("m = %e, _n = %e",m,_n);
-  //Msg::Error("sigc = %e, sigt = %e",sigc,sigt);
-
-  coeffs.resize(3);
-  coeffs(2) = pow(sigc,-_n);
-  coeffs(1) = 3.*(pow(m,_n)-1.)/(m+1.)/sigc;
-  coeffs(0) = (pow(m,_n)+m)/(m+1);
-};
-
-void mlawPowerYieldHyper::getYieldCoefficientDerivatives(const IPHyperelastic *q, const double& nup, fullVector<double>& Dcoeffs) const{
-  double sigc(0.), Hc(0.);
-  sigc = q->_ipCompression->getR();
-  Hc = q->_ipCompression->getDR();
-
-  double sigt(0.), Ht(0.);
-  sigt = q->_ipTraction->getR();
-  Ht = q->_ipTraction->getDR();
-
-
-  Dcoeffs.resize(3);
-  Dcoeffs.setAll(0.);
-
-  double m = sigt/sigc;
-  double Dm = (Ht*sigc- sigt*Hc)/(sigc*sigc);
-  double Da1Dm = 3./sigc*(_n*pow(m,_n-1.)/(m+1.) - (pow(m,_n)-1.)/(m+1.)/(m+1.));
-
-  Dcoeffs(2) = -_n*pow(sigc,-_n-1.)*Hc;
-  Dcoeffs(1) = Da1Dm*Dm -3.*(pow(m,_n)-1.)/(m+1.)/(sigc*sigc)*Hc;
-  Dcoeffs(0) = ((_n*pow(m,_n-1)+1.)/(m+1) - (pow(m,_n)+m)/(m+1.)/(m+1.))*Dm;
-
-};
-
-
-void mlawPowerYieldHyper::predictorCorrector_nonAssociatedFlow_VoigtKelvin(const STensor3& F,
-                            const IPHyperelastic *q0, IPHyperelastic *q1,
-                            STensor3&P, const bool stiff, STensor43& Tangent) const{
-  /* compute elastic predictor */
-  STensor3& Fp1 = q1->_Fp;
-  const STensor3& Fp0 = q0->_Fp;
-
-  Fp1 = Fp0; // plastic deformation tensor
-  q1->_epspbarre = q0->_epspbarre; // plastic equivalent strain
-  q1->_epspCompression = q0->_epspCompression;
-  q1->_epspTraction = q0->_epspTraction;
-  q1->_epspShear = q0->_epspShear;
-  q1->_backsig = q0->_backsig; // backstress tensor
-  q1->_DgammaDt = 0.;
-
-  STensor3& Fe = q1->_Fe;
-
-  STensor3 Fpinv, Ce;
-  inverseSTensor3(Fp1,Fpinv);
-  multSTensor3(F,Fpinv,Fe);
-  multSTensor3FirstTranspose(Fe,Fe,Ce);
-
-  STensor3& Ee = q1->_Ee;
-  STensor43 Lpr;
-  STensor63 dLpr;
-  logSTensor3(Ce,Ee,&Lpr,&dLpr);
-  Ee *= 0.5;
-
-  STensor3 DE(q0->_Ee);
-  DE*= -1.;
-  DE += Ee;
-
-  STensor3 devDE(0.);
-  double trDE(0.);
-  dev(DE,devDE,trDE);
-
-
-  double dt = this->getTimeStep();
-
-  double invGe = 1./_mu;
-  STensor3 D(0.);
-  for (int i=0; i<_Gi.size(); i++){
-    double dtg = dt/(_gi[i]);
-    invGe += (1.-exp(-dtg/2.))/_Gi[i];
-    for (int k=0; k<3; k++){
-      for (int l=0; l<3; l++){
-        D(k,l) += q0->_A[i](k,l)*(exp(-dtg)-1.)/(2.*_Gi[i]);
-      }
-    }
-  }
-  double Ge = 1./invGe;
-
-  double invKe = 1./_K;
-  double V= 0.;
-  for (int i=0; i<_Ki.size(); i++){
-    double dtk = dt/(_ki[i]);
-    invKe += (1.-exp(-dtk/2))/_Ki[i];
-    V += q0->_B[i]*(exp(-dtk)-1.)/(3.*_Ki[i]);
-  }
-  double Ke = 1./invKe;
-
-    // stress increment
-  STensor3 DdevK(devDE); // dev corotational kirchoff stress predictor
-  DdevK += D;
-  DdevK *= (2.*Ge);
-  double Dp = Ke*(trDE+ V); // pressure predictor
-
-  // update in case of elasticity
-  for (int i=0; i< _Gi.size(); i++){
-    q1->_A[i] *= 0.;
-    double dtg = dt/(_gi[i]);
-    for (int k=0; k<3; k++){
-      for (int l=0; l<3; l++){
-        q1->_A[i](k,l) += exp(-dtg)*q0->_A[i](k,l) + exp(-dtg/2.)*DdevK(k,l);
-      }
-    }
-  }
-
-  for (int i=0; i< _Ki.size(); i++){
-    q1->_B[i] *= 0.;
-    double dtk = dt/(_ki[i]);
-    q1->_B[i] += exp(-dtk)*q0->_B[i] + exp(-dtk/2.)*3.*Dp;
-  }
-
-  const STensor3& K0 = q0->_kirchhoff;
-  STensor3 devK0(0.);
-  double p0(0.);
-  dev(K0,devK0,p0);
-  p0 /= 3.;
-
-  STensor3 devKpr(devK0); // dev corotational kirchoff stress predictor
-  devKpr += DdevK;
-  double ppr = p0+Dp; // pressure predictor
-
-  STensor43 Epr; // estimation of dexpA/dA
-
-  STensor3 devBn(0.); // dev of backstress of previous step
-  double trBn(0.); // trace of backstress of previous step
-  this->dev(q0->_backsig,devBn,trBn);
-
-  STensor3 devB(devBn); //dev of backstress of current step
-  double trB(trBn); // trace of backstress of current step
-
-  STensor3 devPhipr(devKpr); // effective dev stress predictor
-  devPhipr -= devBn;
-  double ptildepr = ppr; // effective pression predictor
-  ptildepr -= trBn/3.;
-
-  double PhiEqpr2 = 1.5*devPhipr.dotprod();
-  double PhiEqpr = sqrt(PhiEqpr2);
-
-  STensor3 devK = devKpr;  // dev corotational kirchoff stress
-  double p = ppr; // pressure
-
-  // plastic poisson ratio
-  q1->_nup = (9.-2.*_b)/(18.+2.*_b);
-  double kk = 1./sqrt(1.+2.*q1->_nup*q1->_nup);
-
-  double Gamma = 0.; // q1->_Gamma; // flow rule parameter
-  double PhiEq = PhiEqpr;
-  double ptilde = ptildepr; // current effective pressure
-  STensor3 devPhi(devPhipr); // current effect dev stress
-
-   // hardening
-  this->hardening(q1);
-  fullVector<double> a(3), Da(3); // yield coefficients and derivatives in respect to plastic deformation
-  this->getYieldCoefficients(q1,a);
-
-  double Hb =0.;
-  if (q1->_ipKinematic != NULL)
-    Hb = q1->_ipKinematic->getDR(); // kinematic hardening parameter
-
-  double Gt= Ge + kk*Hb/2.;
-  double Kt = Ke + kk*Hb/3.;
-  //a.print("a init");
-
-  STensor3 devN(0); // dev part of yield normal
-  double trN=0;; // trace part of yield normal
-  STensor3 N(0.); // yield normal
-
-  double f = a(2)*pow(PhiEq,_n) - (a(1)*ptilde+a(0));
-
-  double DfDGamma = 0.;
-  double dfdDgamma = 0.;
-  double u = 1.;
-  double v = 1.;
-
-  double A = sqrt(6.*PhiEq*PhiEq+4.*_b*_b/3.*ptilde*ptilde);
-
-
-  double dDgammaDGamma = 0.;
-
-  if (f>0){
-     // plasticity
-    int ite = 0;
-    int maxite = 100; // maximal number of iters
-    double Dgamma = 0.; // eqplastic strain
-
-    //Msg::Error("plasticity occurs f = %e",f);
-
-    while (fabs(f) >_tol or ite <1){
-      double eta(0.),Deta(0.);
-      if (_viscosity != NULL)
-        _viscosity->get(q1->_epspbarre,eta,Deta);
-      double etaOverDt = eta/this->getTimeStep();
-
-      double dAdGamma = -(72.*Gt*PhiEq*PhiEq/u+ 16.*Kt*_b*_b*_b*ptilde*ptilde/(3.*v))/(2.*A);
-      dDgammaDGamma = kk*(A+Gamma*dAdGamma);
-
-      this->getYieldCoefficientDerivatives(q1,q1->_nup,Da);
-      dfdDgamma = Da(2)*pow(PhiEq,_n) - Da(1)*ptilde -Da(0);
-      if (Gamma>0 and etaOverDt>0)
-        dfdDgamma -= _p*pow(etaOverDt,_p-1.)*Deta/this->getTimeStep()*pow(Gamma,_p);
-
-      DfDGamma = dfdDgamma*dDgammaDGamma - (_n*a(2)*6.*Gt)*pow(PhiEq,_n)/u + a(1)*ptilde*2.*_b*Kt/v;
-      if (Gamma>0 and etaOverDt>0)
-        DfDGamma -=pow(etaOverDt,_p)*_p*pow(Gamma,_p-1.);
-
-      double dGamma = -f/DfDGamma;
-
-      if (Gamma + dGamma <=0.){
-          Gamma /= 2.;
-      }
-      else
-        Gamma += dGamma;
-
-      //Msg::Error("Gamma = %e",Gamma);
-
-      u = 1.+6.*Gt*Gamma;
-      v = 1.+2.*_b*Kt*Gamma;
-      PhiEq = PhiEqpr/u;
-      ptilde = ptildepr/v;
-      A = sqrt(6.*PhiEq*PhiEq+4.*_b*_b/3.*ptilde*ptilde);
-      Dgamma = kk*Gamma*A;
-
-      //Msg::Error("it = %d, u=%e, v=%e, Dgamma=%e",ite,u,v,Dgamma);
-
-      updateEqPlasticDeformation(q1,q0,q1->_nup,Dgamma);
-      hardening(q1);
-      getYieldCoefficients(q1,a);
-      //a.print("a update");
-
-      f = a(2)*pow(PhiEq,_n) - (a(1)*ptilde+a(0));
-      double viscoTerm = etaOverDt*Gamma;
-      if (Gamma>0 and etaOverDt>0) f-= pow(viscoTerm,_p);
-
-      ite++;
-      //if (ite> maxite-5)
-       //Msg::Error("it = %d, DfDGamma = %e error = %e dGamma = %e, Gamma = %e",ite,DfDGamma,f,dGamma,Gamma);
-
-      if (fabs(f) <_tol) break;
-
-      if(ite > maxite){
-        Msg::Fatal("No convergence for plastic correction in mlawPowerYieldHyper nonAssociatedFlow iter = %d, f = %e!!",ite,f);
-        break;
-      }
-    };
-
-    q1->_DgammaDt = Dgamma/this->getTimeStep();
-
-    // update effective stress tensor
-    devPhi *= (1./u);
-    ptilde = ptildepr/v;
-
-    // update normal
-    devN = devPhi;
-    devN *=  3.;
-    trN =  2.*_b*ptilde;
-    N = devN;
-    N(0,0) += trN/3.;
-    N(1,1) += trN/3.;
-    N(2,2) += trN/3.;
-
-    // estimate exp(GammaN)
-    STensor3 expGN(0.);
-    STensor3 GammaN = N;
-    GammaN *= Gamma;
-    expSTensor3(GammaN,expGN,&Epr);
-
-    // update plastic deformation tensor
-    multSTensor3(expGN,Fp0,Fp1);
-    // update IP
-    updateEqPlasticDeformation(q1,q0,q1->_nup,Dgamma);
-
-    // update elastic deformation tensor, corotational stress
-    inverseSTensor3(Fp1,Fpinv);
-    multSTensor3(F,Fpinv,Fe);
-    multSTensor3FirstTranspose(Fe,Fe,Ce);
-    logSTensor3(Ce,Ee,&Lpr,&dLpr);
-    Ee *= 0.5;
-
-    // backstress
-    STensor3 DB(N); // increment
-    DB *= (kk*Hb*Gamma);
-    q1->_backsig += DB; // update
-
-    STensor3 devDB;
-    double trDB;
-    this->dev(DB,devDB,trDB);
-
-    devB += devDB;
-    trB += trDB;
-
-    // corotationaal Kirchhoff stress
-    devK = devPhi;
-    devK += devB;
-
-    p = ptilde + trB/3.;
-
-    for (int i=0; i< _Gi.size(); i++){
-      q1->_A[i] *= 0.;
-      double dtg = dt/(_gi[i]);
-      for (int k=0; k<3; k++){
-        for (int l=0; l<3; l++){
-          q1->_A[i](k,l) += exp(-dtg)*q0->_A[i](k,l) + exp(-dtg/2.)*(devK(k,l)-devK0(k,l));
-        }
-      }
-    }
-
-    for (int i=0; i< _Ki.size(); i++){
-      q1->_B[i] *= 0.;
-      double dtk = dt/(_ki[i]);
-      q1->_B[i] += exp(-dtk)*q0->_B[i] + exp(-dtk/2.)*3.*(p-p0);
-    }
-  };
-
-   // corotational Kirchhoff stress tenor
-  STensor3& KS = q1->_kirchhoff;
-  KS = devK;
-  KS(0,0) += p;
-  KS(1,1) += p;
-  KS(2,2) += p;
-
-  // first Piola Kirchhoff stress
-  STensor3 S(0.);
-  for(int i=0; i<3; i++)
-    for(int j=0; j<3; j++)
-      for(int k=0; k<3; k++)
-        for(int l=0; l<3; l++)
-          S(i,j)+= KS(k,l)*Lpr(k,l,i,j);
-
-  P*= 0.;
-  for(int i=0; i<3; i++)
-    for(int j=0; j<3; j++)
-      for(int k=0; k<3; k++)
-        for(int l=0; l<3; l++)
-          P(i,j) += Fe(i,k)*S(k,l)*Fpinv(j,l);
-
-  // update current internal variables
-  q1->_elasticEnergy=deformationEnergy(Ce);
-  q1->_J = determinantSTensor3(F);
-  q1->_Je = determinantSTensor3(Fe);
-  q1->_Jp = determinantSTensor3(Fp1);
-  q1->_DGDt = Gamma/this->getTimeStep();
-
-  STensor3 Feinv = Fe.invert();
-  for (int i=0; i<3; i++){
-    for (int j=0; j<3; j++){
-      q1->_elasticStrainRate(i,j) = 0.;
-      q1->_plasticStrainRate(i,j) = 0.;
-      for (int k=0; k<3; k++){
-        q1->_elasticStrainRate(i,j) += (q1->_Fe(i,k)-q0->_Fe(i,k))*Feinv(k,j)/this->getTimeStep();
-        q1->_plasticStrainRate(i,j) += (q1->_Fp(i,k)-q0->_Fp(i,k))*Fpinv(k,j)/this->getTimeStep();
-      }
-    }
-  }
-
-  for (int i=0; i<3; i++){
-    for (int j=0; j<3; j++){
-      q1->_strainRate(i,j) = q1->_elasticStrainRate(i,j);
-      for (int k=0; k<3; k++){
-        for (int l=0; l<3; l++){
-          q1->_strainRate(i,j) += Fe(i,k)*q1->_plasticStrainRate(k,l)*Feinv(l,j);
-        }
-      }
-    }
-  }
-
-
-
-  if (stiff){
-
-    STensor3 invFp0 = Fp0.invert();
-    STensor3 DpprDCepr;
-    STensor43 DdevKprDCepr;
-
-    multSTensor3STensor43(_I,Lpr,DpprDCepr);
-    DpprDCepr*= (0.5*Ke);
-
-    multSTensor43(_Idev,Lpr,DdevKprDCepr);
-    DdevKprDCepr*= Ge;
-
-    STensor3 DgamaDCepr(0.);
-
-    STensor43& DKcorDF = q1->_DKcorDF;
-    DKcorDF *= (0.);
-
-    STensor43& dFpdF = q1->_DFpDF;
-    STensor3& dgammadF = q1->_DgammaDF;
-    STensor43& dFedF = q1->_DFeDF;
-    STensor3& DpDF = q1->_DpcorDF;
-    STensor43& DdevKDF = q1->_DdevKcorDF;
-
-    dFpdF *= 0.;
-    dgammadF*= 0.;
-    dFedF *= 0;
-    DpDF *= 0.;
-    DdevKDF *= 0.;
-
-    if (Gamma >0){
-      STensor3 dAdCepr(0.), dfDCepr(0.);
-      double fact = 1.5*a(2)*_n*pow(PhiEq,_n-2.)/(u*u);
-      for (int i=0; i<3; i++){
-        for (int j=0; j<3; j++){
-          dAdCepr(i,j) += 4.*_b*_b*ptildepr/(A*3.*v*v)*DpprDCepr(i,j);
-          dfDCepr(i,j) -=  a(1)/v*DpprDCepr(i,j);
-          for (int k=0; k<3; k++){
-            for (int l=0; l<3; l++){
-              dAdCepr(i,j) += 9./(A*u*u)*devPhipr(k,l)*DdevKprDCepr(k,l,i,j);
-              dfDCepr(i,j) += fact*devPhipr(k,l)*DdevKprDCepr(k,l,i,j);
-            }
-          }
-        }
-      }
-
-      STensor3 DGDCepr(0.);
-      for (int i=0; i<3; i++){
-        for (int j=0; j<3; j++){
-          DGDCepr(i,j) = (-dfDCepr(i,j)-dfdDgamma*kk*Gamma*dAdCepr(i,j))/DfDGamma;
-        }
-      }
-
-      DgamaDCepr *= 0.;
-      for (int i=0; i<3; i++){
-        for (int j=0; j<3; j++){
-          DgamaDCepr(i,j) = kk*Gamma*dAdCepr(i,j)+ kk*dDgammaDGamma*DGDCepr(i,j);
-        }
-      }
-
-
-      STensor3 DtrNDCepr;
-      for (int i=0; i<3; i++)
-        for (int j=0; j<3; j++)
-          DtrNDCepr(i,j) = 2.*_b/v*DpprDCepr(i,j) - 2.*_b*ptildepr*(2.*_b*Kt)/(v*v)*DGDCepr(i,j);
-
-
-      STensor43 DdevNDCepr(DdevKprDCepr);
-      DdevNDCepr *= (3./u);
-      for (int i=0; i<3; i++)
-          for (int j=0; j<3; j++)
-            for (int k=0; k<3; k++)
-              for (int l=0; l<3; l++){
-                DdevNDCepr(i,j,k,l) -= 18.*Gt/(u*u)*devPhipr(i,j)*DGDCepr(k,l);
-              }
-
-
-      STensor43 temp1(0.);
-      for (int i=0; i<3; i++)
-        for (int j=0; j<3; j++)
-          for (int k=0; k<3; k++)
-            for (int l=0; l<3; l++)
-              temp1(i,j,k,l) = N(i,j)*DGDCepr(k,l)+ Gamma*DdevNDCepr(i,j,k,l)+ Gamma/3.*_I(i,j)*DtrNDCepr(k,l);
-
-      STensor43 EprFp0(0.);
-      for (int i=0; i<3; i++)
-        for (int j=0; j<3; j++)
-          for (int k=0; k<3; k++)
-            for (int l=0; l<3; l++){
-                for (int s=0; s<3; s++){
-                  EprFp0(i,j,k,l) += Epr(i,s,k,l)*Fp0(s,j);
-                }
-              }
-
-      STensor43 dFpDCepr(0.);
-      multSTensor43(EprFp0,temp1,dFpDCepr);
-      // compute dFpDC
-      STensor43 dFpdC(0.);
-      for (int i=0; i<3; i++)
-        for (int j=0; j<3; j++)
-          for (int k=0; k<3; k++)
-            for (int l=0; l<3; l++)
-              for (int p=0; p<3; p++)
-                for (int q=0; q<3; q++)
-                  dFpdC(i,j,k,l) += dFpDCepr(i,j,p,q)*invFp0(k,p)*invFp0(l,q);
-
-      // compute dFpDF
-      for (int i=0; i<3; i++)
-        for (int j=0; j<3; j++)
-          for (int k=0; k<3; k++)
-            for (int l=0; l<3; l++)
-              for (int p=0; p<3; p++)
-                for (int q=0; q<3; q++)
-                  dFpdF(i,j,k,l) += dFpdC(i,j,p,q)*(F(k,p)*_I(q,l)+F(k,q)*_I(p,l));
-
-
-      STensor3 DpDCepr(DpprDCepr);
-      STensor43 DdevKDCepr(DdevKprDCepr);
-      for (int i=0; i<3; i++){
-        for (int j=0; j<3; j++){
-          DpDCepr(i,j) -= Ke*(DGDCepr(i,j)*trN+Gamma*DtrNDCepr(i,j));
-          for (int k=0; k<3; k++){
-            for (int l=0; l<3; l++){
-              DdevKDCepr(i,j,k,l) -=  2.*Ge*(DGDCepr(k,l)*devN(i,j)+Gamma*DdevNDCepr(i,j,k,l));
-            }
-          }
-        }
-      }
-
-
-      STensor3 DpDC(0.);
-      for (int k=0; k<3; k++)
-        for (int l=0; l<3; l++)
-          for (int p=0; p<3; p++)
-            for (int q=0; q<3; q++)
-              DpDC(k,l) += DpDCepr(p,q)*invFp0(k,p)*invFp0(l,q);
-
-      for (int k=0; k<3; k++)
-        for (int l=0; l<3; l++)
-          for (int p=0; p<3; p++)
-            for (int q=0; q<3; q++)
-              DpDF(k,l) += DpDC(p,q)*(F(k,p)*_I(q,l)+F(k,q)*_I(p,l));
-
-
-      STensor43 DdevKDC(0.);
-      for (int i=0; i<3; i++)
-        for (int j=0; j<3; j++)
-          for (int k=0; k<3; k++)
-            for (int l=0; l<3; l++)
-              for (int p=0; p<3; p++)
-                for (int q=0; q<3; q++)
-                  DdevKDC(i,j,k,l) += DdevKDCepr(i,j,p,q)*invFp0(k,p)*invFp0(l,q);
-
-
-      for (int i=0; i<3; i++)
-          for (int j=0; j<3; j++)
-            for (int k=0; k<3; k++)
-              for (int l=0; l<3; l++)
-                for (int p=0; p<3; p++)
-                  for (int q=0; q<3; q++)
-                    DdevKDF(i,j,k,l) += DdevKDC(i,j,p,q)*(F(k,p)*_I(q,l)+F(k,q)*_I(p,l));
-
-      DKcorDF *= 0.;
-      for (int m=0; m<3; m++)
-        for (int n=0; n<3; n++)
-          for (int p=0; p<3; p++)
-            for (int q=0; q<3; q++)
-              DKcorDF(m,n,p,q) = _I(m,n)*DpDF(p,q)+ DdevKDF(m,n,p,q);
-
-    }
-    else{
-      dFpdF *= 0.;
-      computeDKcorprDF_elastic(DKcorDF,DpDF, DdevKDF, DpprDCepr,DdevKprDCepr,F, Fp0, invFp0);
-    }
-
-
-    STensor3 DgamaDC(0.);
-    for (int k=0; k<3; k++)
-      for (int l=0; l<3; l++)
-        for (int p=0; p<3; p++)
-          for (int q=0; q<3; q++)
-            DgamaDC(k,l) += DgamaDCepr(p,q)*invFp0(k,p)*invFp0(l,q);
-
-    for (int k=0; k<3; k++)
-      for (int l=0; l<3; l++)
-        for (int p=0; p<3; p++)
-          for (int q=0; q<3; q++)
-            dgammadF(k,l) += DgamaDC(p,q)*(F(k,p)*_I(q,l)+F(k,q)*_I(p,l));
-
-
-    STensor43 DinvFpDF(0.); //
-    for (int i=0; i<3; i++)
-      for (int s=0; s<3; s++)
-        for (int k=0; k<3; k++)
-          for (int l=0; l<3; l++)
-            for (int m=0; m<3; m++)
-              for (int j=0; j<3; j++)
-                DinvFpDF(i,s,k,l) -= Fpinv(i,m)*dFpdF(m,j,k,l)*Fpinv(j,s);
-
-    for (int m=0; m<3; m++)
-      for (int j=0; j<3; j++)
-        for (int k=0; k<3; k++)
-          for (int l=0; l<3; l++){
-            dFedF(m,j,k,l) += _I(m,k)*Fpinv(l,j);
-            for (int s=0; s<3; s++)
-              dFedF(m,j,k,l) += F(m,s)*DinvFpDF(s,j,k,l);
-          }
-
-    STensor43 dCeDF(0.);
-    for (int i=0; i<3; i++)
-      for (int j=0; j<3; j++)
-        for (int k=0; k<3; k++)
-          for (int l=0; l<3; l++)
-            for (int m=0; m<3; m++)
-              dCeDF(i,j,k,l) += dFedF(m,i,k,l)*Fe(m,j)+ Fe(m,i)*dFedF(m,j,k,l);
-
-
-    STensor63 dLprDF(0.);
-    for (int a=0; a<3; a++)
-      for (int b=0; b<3; b++)
-        for (int i=0; i<3; i++)
-          for (int j=0; j<3; j++)
-            for (int k=0; k<3; k++)
-              for (int l=0; l<3; l++)
-                for (int p=0; p<3; p++)
-                  for (int q=0; q<3; q++)
-                    dLprDF(a,b,i,j,k,l) += dLpr(a,b,i,j,p,q)*dCeDF(p,q,k,l);
-
-
-    STensor43 dSdF(0.);
-    for (int i=0; i<3; i++)
-      for (int j=0; j<3; j++)
-        for (int k=0; k<3; k++)
-          for (int l=0; l<3; l++)
-            for (int m=0; m<3; m++)
-              for (int n=0; n<3; n++){
-                dSdF(i,j,k,l) += DKcorDF(m,n,k,l)*Lpr(m,n,i,j);
-                dSdF(i,j,k,l) += KS(m,n)*dLprDF(m,n,i,j,k,l);
-              }
-
-    for (int i=0; i<3; i++)
-      for (int j=0; j<3; j++)
-        for (int k=0; k<3; k++)
-          for (int l=0; l<3; l++){
-            Tangent(i,j,k,l) = 0.;
-            for (int m=0; m<3; m++){
-              for (int n=0; n<3; n++){
-                Tangent(i,j,k,l) += dFedF(i,m,k,l)*S(m,n)*Fpinv(j,n);
-                Tangent(i,j,k,l) += Fe(i,m)*dSdF(m,n,k,l)*Fpinv(j,n);
-                Tangent(i,j,k,l) += Fe(i,m)*S(m,n)*DinvFpDF(j,n,k,l);
-              }
-            }
-          }
-
-  };
-};
-
-void mlawPowerYieldHyper::predictorCorrector_nonAssociatedFlow_Maxwell(const STensor3& F, const IPHyperelastic *q0, IPHyperelastic *q1,
-                            STensor3&P, const bool stiff, STensor43& Tangent) const{
-  /* compute elastic predictor */
-  STensor3& Fp1 = q1->_Fp;
-  const STensor3& Fp0 = q0->_Fp;
-
-  Fp1 = Fp0; // plastic deformation tensor
-  q1->_epspbarre = q0->_epspbarre; // plastic equivalent strain
-  q1->_epspCompression = q0->_epspCompression;
-  q1->_epspTraction = q0->_epspTraction;
-  q1->_epspShear = q0->_epspShear;
-  q1->_backsig = q0->_backsig; // backstress tensor
-  q1->_DgammaDt = 0.;
-
-  STensor3& Fe = q1->_Fe;
-
-  STensor3 Fpinv, Ce;
-  inverseSTensor3(Fp1,Fpinv);
-  multSTensor3(F,Fpinv,Fe);
-  multSTensor3FirstTranspose(Fe,Fe,Ce);
-
-  STensor3& Ee = q1->_Ee;
-  STensor43 Lpr;
-  STensor63 dLpr;
-  logSTensor3(Ce,Ee,&Lpr,&dLpr);
-  Ee *= 0.5;
-
-  STensor3 devEe(0.);
-  double trEe(0.);
-  dev(Ee,devEe,trEe);
-
-
-  const STensor3& Ee0 = q0->_Ee;
-  STensor3 devEe0(0.);
-  double trEe0(0.);
-  dev(Ee0,devEe0,trEe0);
-
-  // update A, B
-  double dt = this->getTimeStep();
-  double Ge = _mu;
-  double Ke = _K;
-
-
-  for (int i=0; i<_Gi.size(); i++){
-    double dtg = dt/_gi[i];
-    double expmdtg = exp(-dtg);
-    double ztag = exp(-dtg/2.);
-    for (int k=0; k<3; k++){
-      for (int l=0; l<3; l++){
-        q1->_A[i](k,l) = expmdtg*q0->_A[i](k,l) + 2.*_Gi[i]*ztag*(devEe(k,l)-devEe0(k,l));
-      }
-    }
-    Ge += _Gi[i]*ztag;
-  }
-  for (int i=0; i<_Ki.size(); i++){
-    double dtk = dt/_ki[i];
-    double expmdtk = exp(-dtk);
-    double ztak = exp(-dtk/2.);
-    q1->_B[i] = q0->_B[i]*expmdtk +_Ki[i]*ztak*(trEe-trEe0);
-    Ke += _Ki[i]*ztak;
-  }
-
-  STensor3 devKpr(0.); // dev corotational kirchoff stress predictor
-  double ppr = 0.; // pressure predictor
-  this->corStress(Ee,devKpr,ppr);
-  for (int i=0; i<_Gi.size(); i++){
-    devKpr += q1->_A[i];
-  }
-  for (int i=0; i<_Ki.size(); i++){
-    ppr += q1->_B[i];
-  }
-
-  STensor43 Epr; // estimation of dexpA/dA
-
-  STensor3 devBn(0.); // dev of backstress of previous step
-  double trBn(0.); // trace of backstress of previous step
-  this->dev(q0->_backsig,devBn,trBn);
-
-  STensor3 devB(devBn); //dev of backstress of current step
-  double trB(trBn); // trace of backstress of current step
-
-  STensor3 devPhipr(devKpr); // effective dev stress predictor
-  devPhipr -= devBn;
-  double ptildepr = ppr; // effective pression predictor
-  ptildepr -= trBn/3.;
-
-  double PhiEqpr2 = 1.5*devPhipr.dotprod();
-  double PhiEqpr = sqrt(PhiEqpr2);
-
-  STensor3 devK = devKpr;  // dev corotational kirchoff stress
-  double p = ppr; // pressure
-
-  // plastic poisson ratio
-  q1->_nup = (9.-2.*_b)/(18.+2.*_b);
-  double kk = 1./sqrt(1.+2.*q1->_nup*q1->_nup);
-
-  double Gamma = 0.; // q1->_Gamma; // flow rule parameter
-  double PhiEq = PhiEqpr;
-  double ptilde = ptildepr; // current effective pressure
-  STensor3 devPhi(devPhipr); // current effect dev stress
-
-   // hardening
-  this->hardening(q1);
-  fullVector<double> a(3), Da(3); // yield coefficients and derivatives in respect to plastic deformation
-  this->getYieldCoefficients(q1,a);
-
-  double Hb =0.;
-  if (q1->_ipKinematic != NULL)
-    Hb = q1->_ipKinematic->getDR(); // kinematic hardening parameter
-
-  double Gt= Ge + kk*Hb/2.;
-  double Kt = Ke + kk*Hb/3.;
-  //a.print("a init");
-
-  STensor3 devN(0); // dev part of yield normal
-  double trN=0;; // trace part of yield normal
-  STensor3 N(0.); // yield normal
-
-  double f = a(2)*pow(PhiEq,_n) - (a(1)*ptilde+a(0));
-
-  double DfDGamma = 0.;
-  double dfdDgamma = 0.;
-  double u = 1.;
-  double v = 1.;
-
-  double A = sqrt(6.*PhiEq*PhiEq+4.*_b*_b/3.*ptilde*ptilde);
-
-
-  double dDgammaDGamma = 0.;
-
-  if (f>0){
-     // plasticity
-    int ite = 0;
-    int maxite = 100; // maximal number of iters
-    double Dgamma = 0.; // eqplastic strain
-
-    //Msg::Error("plasticity occurs f = %e",f);
-
-    //double f0 = fabs(f);
-
-    while (fabs(f) >_tol or ite <1){
-      double eta(0.),Deta(0.);
-      if (_viscosity != NULL)
-        _viscosity->get(q1->_epspbarre,eta,Deta);
-      double etaOverDt = eta/this->getTimeStep();
-      double dAdGamma = -(72.*Gt*PhiEq*PhiEq/u+ 16.*Kt*_b*_b*_b*ptilde*ptilde/(3.*v))/(2.*A);
-      dDgammaDGamma = kk*(A+Gamma*dAdGamma);
-
-      this->getYieldCoefficientDerivatives(q1,q1->_nup,Da);
-      dfdDgamma = Da(2)*pow(PhiEq,_n) - Da(1)*ptilde -Da(0);
-      if (Gamma>0 and etaOverDt>0)
-        dfdDgamma -= _p*pow(etaOverDt,_p-1.)*Deta/this->getTimeStep()*pow(Gamma,_p);
-
-      DfDGamma = dfdDgamma*dDgammaDGamma - (_n*a(2)*6.*Gt)*pow(PhiEq,_n)/u + a(1)*ptilde*2.*_b*Kt/v;
-      if (Gamma>0 and etaOverDt>0)
-        DfDGamma -=pow(etaOverDt,_p)*_p*pow(Gamma,_p-1.);
-
-      double dGamma = -f/DfDGamma;
-
-      if (Gamma + dGamma <=0.){
-          Gamma /= 2.;
-      }
-      else
-        Gamma += dGamma;
-
-      //Msg::Error("Gamma = %e",Gamma);
-
-      u = 1.+6.*Gt*Gamma;
-      v = 1.+2.*_b*Kt*Gamma;
-      PhiEq = PhiEqpr/u;
-      ptilde = ptildepr/v;
-      A = sqrt(6.*PhiEq*PhiEq+4.*_b*_b/3.*ptilde*ptilde);
-      Dgamma = kk*Gamma*A;
-
-      //Msg::Error("it = %d, u=%e, v=%e, Dgamma=%e",ite,u,v,Dgamma);
-
-      updateEqPlasticDeformation(q1,q0,q1->_nup,Dgamma);
-      hardening(q1);
-      getYieldCoefficients(q1,a);
-      //a.print("a update");
-
-      f = a(2)*pow(PhiEq,_n) - (a(1)*ptilde+a(0));
-      double viscoTerm = etaOverDt*Gamma;
-      if (Gamma>0 and etaOverDt>0) f-= pow(viscoTerm,_p);
-
-      ite++;
-      //if (ite> maxite-5)
-       //Msg::Error("it = %d, DfDGamma = %e error = %e dGamma = %e, Gamma = %e",ite,DfDGamma,f,dGamma,Gamma);
-
-      if (fabs(f) <_tol) break;
-
-      if(ite > maxite){
-        Msg::Fatal("No convergence for plastic correction in mlawPowerYieldHyper nonAssociatedFlow Maxwell iter = %d, f = %e!!",ite,f);
-        break;
-      }
-    };
-
-    q1->_DgammaDt = Dgamma/this->getTimeStep();
-
-    // update effective stress tensor
-    devPhi *= (1./u);
-    ptilde = ptildepr/v;
-
-    // update normal
-    devN = devPhi;
-    devN *=  3.;
-    trN =  2.*_b*ptilde;
-    N = devN;
-    N(0,0) += trN/3.;
-    N(1,1) += trN/3.;
-    N(2,2) += trN/3.;
-
-    // estimate exp(GammaN)
-    STensor3 expGN(0.);
-    STensor3 GammaN = N;
-    GammaN *= Gamma;
-    expSTensor3(GammaN,expGN,&Epr);
-
-    // update plastic deformation tensor
-    multSTensor3(expGN,Fp0,Fp1);
-    // update IP
-    updateEqPlasticDeformation(q1,q0,q1->_nup,Dgamma);
-
-    // update elastic deformation tensor, corotational stress
-    inverseSTensor3(Fp1,Fpinv);
-    multSTensor3(F,Fpinv,Fe);
-    multSTensor3FirstTranspose(Fe,Fe,Ce);
-    logSTensor3(Ce,Ee,&Lpr,&dLpr);
-    Ee *= 0.5;
-    dev(Ee,devEe,trEe);
-    // update A, B
-    for (int i=0; i<_Gi.size(); i++){
-      double dtg = dt/_gi[i];
-      double expmdtg = exp(-dtg);
-      double ztag = exp(-dtg/2.);
-      for (int k=0; k<3; k++){
-        for (int l=0; l<3; l++){
-          q1->_A[i](k,l) = expmdtg*q0->_A[i](k,l) + 2.*_Gi[i]*ztag*(devEe(k,l)-devEe0(k,l));
-        }
-      }
-    }
-    for (int i=0; i<_Ki.size(); i++){
-      double dtk = dt/_ki[i];
-      double expmdtk = exp(-dtk);
-      double ztak = exp(-dtk/2.);
-      q1->_B[i] = q0->_B[i]*expmdtk +_Ki[i]*ztak*(trEe-trEe0);
-    }
-
-    // backstress
-    STensor3 DB(N); // increment
-    DB *= (kk*Hb*Gamma);
-    q1->_backsig += DB; // update
-
-    STensor3 devDB;
-    double trDB;
-    this->dev(DB,devDB,trDB);
-
-    devB += devDB;
-    trB += trDB;
-
-    // corotationaal Kirchhoff stress
-    devK = devPhi;
-    devK += devB;
-
-    p = ptilde + trB/3.;
-  };
-
-   // corotational Kirchhoff stress tenor
-  STensor3& KS = q1->_kirchhoff;
-  KS = devK;
-  KS(0,0) += p;
-  KS(1,1) += p;
-  KS(2,2) += p;
-
-  // first Piola Kirchhoff stress
-  STensor3 S(0.);
-  for(int i=0; i<3; i++)
-    for(int j=0; j<3; j++)
-      for(int k=0; k<3; k++)
-        for(int l=0; l<3; l++)
-          S(i,j)+= KS(k,l)*Lpr(k,l,i,j);
-
-  P*= 0.;
-  for(int i=0; i<3; i++)
-    for(int j=0; j<3; j++)
-      for(int k=0; k<3; k++)
-        for(int l=0; l<3; l++)
-          P(i,j) += Fe(i,k)*S(k,l)*Fpinv(j,l);
-
-
-  // update current internal variables
-  q1->_elasticEnergy=deformationEnergy(Ce);
-  q1->_J = determinantSTensor3(F);
-  q1->_Je = determinantSTensor3(Fe);
-  q1->_Jp = determinantSTensor3(Fp1);
-  q1->_DGDt = Gamma/this->getTimeStep();
-
-  STensor3 Feinv = Fe.invert();
-  for (int i=0; i<3; i++){
-    for (int j=0; j<3; j++){
-      q1->_elasticStrainRate(i,j) = 0.;
-      q1->_plasticStrainRate(i,j) = 0.;
-      for (int k=0; k<3; k++){
-        q1->_elasticStrainRate(i,j) += (q1->_Fe(i,k)-q0->_Fe(i,k))*Feinv(k,j)/this->getTimeStep();
-        q1->_plasticStrainRate(i,j) += (q1->_Fp(i,k)-q0->_Fp(i,k))*Fpinv(k,j)/this->getTimeStep();
-      }
-    }
-  }
-
-  for (int i=0; i<3; i++){
-    for (int j=0; j<3; j++){
-      q1->_strainRate(i,j) = q1->_elasticStrainRate(i,j);
-      for (int k=0; k<3; k++){
-        for (int l=0; l<3; l++){
-          q1->_strainRate(i,j) += Fe(i,k)*q1->_plasticStrainRate(k,l)*Feinv(l,j);
-        }
-      }
-    }
-  }
-
-
-
-  if (stiff){
-
-    STensor3 invFp0 = Fp0.invert();
-    STensor3 DpprDCepr;
-    STensor43 DdevKprDCepr;
-
-    multSTensor3STensor43(_I,Lpr,DpprDCepr);
-    DpprDCepr*= (0.5*Ke);
-
-    multSTensor43(_Idev,Lpr,DdevKprDCepr);
-    DdevKprDCepr*= Ge;
-
-    STensor3 DgamaDCepr(0.);
-
-    STensor43& DKcorDF = q1->_DKcorDF;
-    DKcorDF *= (0.);
-
-    STensor43& dFpdF = q1->_DFpDF;
-    STensor3& dgammadF = q1->_DgammaDF;
-    STensor43& dFedF = q1->_DFeDF;
-    STensor3& DpDF = q1->_DpcorDF;
-    STensor43& DdevKDF = q1->_DdevKcorDF;
-
-    dFpdF *= 0.;
-    dgammadF*= 0.;
-    dFedF *= 0;
-    DpDF *= 0.;
-    DdevKDF *= 0.;
-
-    if (Gamma >0){
-      STensor3 dAdCepr(0.), dfDCepr(0.);
-      double fact = 1.5*a(2)*_n*pow(PhiEq,_n-2.)/(u*u);
-      for (int i=0; i<3; i++){
-        for (int j=0; j<3; j++){
-          dAdCepr(i,j) += 4.*_b*_b*ptildepr/(A*3.*v*v)*DpprDCepr(i,j);
-          dfDCepr(i,j) -=  a(1)/v*DpprDCepr(i,j);
-          for (int k=0; k<3; k++){
-            for (int l=0; l<3; l++){
-              dAdCepr(i,j) += 9./(A*u*u)*devPhipr(k,l)*DdevKprDCepr(k,l,i,j);
-              dfDCepr(i,j) += fact*devPhipr(k,l)*DdevKprDCepr(k,l,i,j);
-            }
-          }
-        }
-      }
-
-      STensor3 DGDCepr(0.);
-      for (int i=0; i<3; i++){
-        for (int j=0; j<3; j++){
-          DGDCepr(i,j) = (-dfDCepr(i,j)-dfdDgamma*kk*Gamma*dAdCepr(i,j))/DfDGamma;
-        }
-      }
-
-      DgamaDCepr *= 0.;
-      for (int i=0; i<3; i++){
-        for (int j=0; j<3; j++){
-          DgamaDCepr(i,j) = kk*Gamma*dAdCepr(i,j)+ kk*dDgammaDGamma*DGDCepr(i,j);
-        }
-      }
-
-
-      STensor3 DtrNDCepr;
-      for (int i=0; i<3; i++)
-        for (int j=0; j<3; j++)
-          DtrNDCepr(i,j) = 2.*_b/v*DpprDCepr(i,j) - 2.*_b*ptildepr*(2.*_b*Kt)/(v*v)*DGDCepr(i,j);
-
-
-      STensor43 DdevNDCepr(DdevKprDCepr);
-      DdevNDCepr *= (3./u);
-      for (int i=0; i<3; i++)
-          for (int j=0; j<3; j++)
-            for (int k=0; k<3; k++)
-              for (int l=0; l<3; l++){
-                DdevNDCepr(i,j,k,l) -= 18.*Gt/(u*u)*devPhipr(i,j)*DGDCepr(k,l);
-              }
-
-
-      STensor43 temp1(0.);
-      for (int i=0; i<3; i++)
-        for (int j=0; j<3; j++)
-          for (int k=0; k<3; k++)
-            for (int l=0; l<3; l++)
-              temp1(i,j,k,l) = N(i,j)*DGDCepr(k,l)+ Gamma*DdevNDCepr(i,j,k,l)+ Gamma/3.*_I(i,j)*DtrNDCepr(k,l);
-
-      STensor43 EprFp0(0.);
-      for (int i=0; i<3; i++)
-        for (int j=0; j<3; j++)
-          for (int k=0; k<3; k++)
-            for (int l=0; l<3; l++){
-                for (int s=0; s<3; s++){
-                  EprFp0(i,j,k,l) += Epr(i,s,k,l)*Fp0(s,j);
-                }
-              }
-
-      STensor43 dFpDCepr(0.);
-      multSTensor43(EprFp0,temp1,dFpDCepr);
-      // compute dFpDC
-      STensor43 dFpdC(0.);
-      for (int i=0; i<3; i++)
-        for (int j=0; j<3; j++)
-          for (int k=0; k<3; k++)
-            for (int l=0; l<3; l++)
-              for (int p=0; p<3; p++)
-                for (int q=0; q<3; q++)
-                  dFpdC(i,j,k,l) += dFpDCepr(i,j,p,q)*invFp0(k,p)*invFp0(l,q);
-
-      // compute dFpDF
-      for (int i=0; i<3; i++)
-        for (int j=0; j<3; j++)
-          for (int k=0; k<3; k++)
-            for (int l=0; l<3; l++)
-              for (int p=0; p<3; p++)
-                for (int q=0; q<3; q++)
-                  dFpdF(i,j,k,l) += dFpdC(i,j,p,q)*(F(k,p)*_I(q,l)+F(k,q)*_I(p,l));
-
-
-      STensor3 DpDCepr(DpprDCepr);
-      STensor43 DdevKDCepr(DdevKprDCepr);
-      for (int i=0; i<3; i++){
-        for (int j=0; j<3; j++){
-          DpDCepr(i,j) -= Ke*(DGDCepr(i,j)*trN+Gamma*DtrNDCepr(i,j));
-          for (int k=0; k<3; k++){
-            for (int l=0; l<3; l++){
-              DdevKDCepr(i,j,k,l) -=  2.*Ge*(DGDCepr(k,l)*devN(i,j)+Gamma*DdevNDCepr(i,j,k,l));
-            }
-          }
-        }
-      }
-
-
-      STensor3 DpDC(0.);
-      for (int k=0; k<3; k++)
-        for (int l=0; l<3; l++)
-          for (int p=0; p<3; p++)
-            for (int q=0; q<3; q++)
-              DpDC(k,l) += DpDCepr(p,q)*invFp0(k,p)*invFp0(l,q);
-
-      for (int k=0; k<3; k++)
-        for (int l=0; l<3; l++)
-          for (int p=0; p<3; p++)
-            for (int q=0; q<3; q++)
-              DpDF(k,l) += DpDC(p,q)*(F(k,p)*_I(q,l)+F(k,q)*_I(p,l));
-
-
-      STensor43 DdevKDC(0.);
-      for (int i=0; i<3; i++)
-        for (int j=0; j<3; j++)
-          for (int k=0; k<3; k++)
-            for (int l=0; l<3; l++)
-              for (int p=0; p<3; p++)
-                for (int q=0; q<3; q++)
-                  DdevKDC(i,j,k,l) += DdevKDCepr(i,j,p,q)*invFp0(k,p)*invFp0(l,q);
-
-
-      for (int i=0; i<3; i++)
-          for (int j=0; j<3; j++)
-            for (int k=0; k<3; k++)
-              for (int l=0; l<3; l++)
-                for (int p=0; p<3; p++)
-                  for (int q=0; q<3; q++)
-                    DdevKDF(i,j,k,l) += DdevKDC(i,j,p,q)*(F(k,p)*_I(q,l)+F(k,q)*_I(p,l));
-
-      for (int m=0; m<3; m++)
-        for (int n=0; n<3; n++)
-          for (int p=0; p<3; p++)
-            for (int q=0; q<3; q++)
-              DKcorDF(m,n,p,q) = _I(m,n)*DpDF(p,q)+ DdevKDF(m,n,p,q);
-
-    }
-    else{
-      dFpdF *= 0.;
-      computeDKcorprDF_elastic(DKcorDF,DpDF,DdevKDF,DpprDCepr,DdevKprDCepr,F, Fp0, invFp0);
-    }
-
-
-    STensor3 DgamaDC(0.);
-    for (int k=0; k<3; k++)
-      for (int l=0; l<3; l++)
-        for (int p=0; p<3; p++)
-          for (int q=0; q<3; q++)
-            DgamaDC(k,l) += DgamaDCepr(p,q)*invFp0(k,p)*invFp0(l,q);
-
-    for (int k=0; k<3; k++)
-      for (int l=0; l<3; l++)
-        for (int p=0; p<3; p++)
-          for (int q=0; q<3; q++)
-            dgammadF(k,l) += DgamaDC(p,q)*(F(k,p)*_I(q,l)+F(k,q)*_I(p,l));
-
-
-    STensor43 DinvFpDF(0.); //
-    for (int i=0; i<3; i++)
-      for (int s=0; s<3; s++)
-        for (int k=0; k<3; k++)
-          for (int l=0; l<3; l++)
-            for (int m=0; m<3; m++)
-              for (int j=0; j<3; j++)
-                DinvFpDF(i,s,k,l) -= Fpinv(i,m)*dFpdF(m,j,k,l)*Fpinv(j,s);
-
-    for (int m=0; m<3; m++)
-      for (int j=0; j<3; j++)
-        for (int k=0; k<3; k++)
-          for (int l=0; l<3; l++){
-            dFedF(m,j,k,l) += _I(m,k)*Fpinv(l,j);
-            for (int s=0; s<3; s++)
-              dFedF(m,j,k,l) += F(m,s)*DinvFpDF(s,j,k,l);
-          }
-
-    STensor43 dCeDF(0.);
-    for (int i=0; i<3; i++)
-      for (int j=0; j<3; j++)
-        for (int k=0; k<3; k++)
-          for (int l=0; l<3; l++)
-            for (int m=0; m<3; m++)
-              dCeDF(i,j,k,l) += dFedF(m,i,k,l)*Fe(m,j)+ Fe(m,i)*dFedF(m,j,k,l);
-
-
-    STensor63 dLprDF(0.);
-    for (int a=0; a<3; a++)
-      for (int b=0; b<3; b++)
-        for (int i=0; i<3; i++)
-          for (int j=0; j<3; j++)
-            for (int k=0; k<3; k++)
-              for (int l=0; l<3; l++)
-                for (int p=0; p<3; p++)
-                  for (int q=0; q<3; q++)
-                    dLprDF(a,b,i,j,k,l) += dLpr(a,b,i,j,p,q)*dCeDF(p,q,k,l);
-
-
-    STensor43 dSdF(0.);
-    for (int i=0; i<3; i++)
-      for (int j=0; j<3; j++)
-        for (int k=0; k<3; k++)
-          for (int l=0; l<3; l++)
-            for (int m=0; m<3; m++)
-              for (int n=0; n<3; n++){
-                dSdF(i,j,k,l) += DKcorDF(m,n,k,l)*Lpr(m,n,i,j);
-                dSdF(i,j,k,l) += KS(m,n)*dLprDF(m,n,i,j,k,l);
-              }
-
-    for (int i=0; i<3; i++)
-      for (int j=0; j<3; j++)
-        for (int k=0; k<3; k++)
-          for (int l=0; l<3; l++){
-            Tangent(i,j,k,l) = 0.;
-            for (int m=0; m<3; m++){
-              for (int n=0; n<3; n++){
-                Tangent(i,j,k,l) += dFedF(i,m,k,l)*S(m,n)*Fpinv(j,n);
-                Tangent(i,j,k,l) += Fe(i,m)*dSdF(m,n,k,l)*Fpinv(j,n);
-                Tangent(i,j,k,l) += Fe(i,m)*S(m,n)*DinvFpDF(j,n,k,l);
-              }
-            }
-          }
-
-  };
-};
-
-
-
-void mlawPowerYieldHyper::predictorCorrector_nonAssociatedFlow_full(const STensor3& F, const IPHyperelastic *q0, IPHyperelastic *q1,
-                            STensor3&P, const bool stiff, STensor43& Tangent) const{
-  /* compute elastic predictor */
-  STensor3& Fp1 = q1->_Fp;
-  const STensor3& Fp0 = q0->_Fp;
-
-  Fp1 = Fp0; // plastic deformation tensor
-  q1->_epspbarre = q0->_epspbarre; // plastic equivalent strain
-  q1->_epspCompression = q0->_epspCompression;
-  q1->_epspTraction = q0->_epspTraction;
-  q1->_epspShear = q0->_epspShear;
-  q1->_backsig = q0->_backsig; // backstress tensor
-  q1->_DgammaDt = 0.;
-
-  STensor3& Fe = q1->_Fe;
-
-  STensor3 Fpinv, Ce;
-  inverseSTensor3(Fp1,Fpinv);
-  multSTensor3(F,Fpinv,Fe);
-  multSTensor3FirstTranspose(Fe,Fe,Ce);
-
-  STensor3& Ee = q1->_Ee;
-  STensor43 Lpr;
-  STensor63 dLpr;
-  logSTensor3(Ce,Ee,&Lpr,&dLpr);
-  Ee *= 0.5;
-
-  STensor43 Epr; // estimation of dexpA/dA
-
-  STensor3 devKpr(0.); // dev corotational kirchoff stress predictor
-  double ppr = 0.; // pressure predictor
-  this->corStress(Ee,devKpr,ppr);
-
-  STensor3 devBn(0.); // dev of backstress of previous step
-  double trBn(0.); // trace of backstress of previous step
-  this->dev(q0->_backsig,devBn,trBn);
-
-  STensor3 devB(devBn); //dev of backstress of current step
-  double trB(trBn); // trace of backstress of current step
-
-  STensor3 devPhipr(devKpr); // effective dev stress predictor
-  devPhipr -= devBn;
-  double ptildepr = ppr; // effective pression predictor
-  ptildepr -= trBn/3.;
-
-  double PhiEqpr2 = 1.5*devPhipr.dotprod();
-  double PhiEqpr = sqrt(PhiEqpr2);
-
-  STensor3 devK = devKpr;  // dev corotational kirchoff stress
-  double p = ppr; // pressure
-
-  // plastic poisson ratio
-  q1->_nup = (9.-2.*_b)/(18.+2.*_b);
-  double kk = 1./sqrt(1.+2.*q1->_nup*q1->_nup);
-
-  double Gamma = 0.; // q1->_Gamma; // flow rule parameter
-  double PhiEq = PhiEqpr;
-  double ptilde = ptildepr; // current effective pressure
-  STensor3 devPhi(devPhipr); // current effect dev stress
-
-   // hardening
-  this->hardening(q1);
-  fullVector<double> a(3), Da(3); // yield coefficients and derivatives in respect to plastic deformation
-  this->getYieldCoefficients(q1,a);
-
-  double Hb =0.;
-  if (q1->_ipKinematic != NULL)
-    Hb = q1->_ipKinematic->getDR(); // kinematic hardening parameter
-
-  double Gt= _mu + kk*Hb/2.;
-  double Kt = _K + kk*Hb/3.;
-  //a.print("a init");
-
-  STensor3 devN(0); // dev part of yield normal
-  double trN=0;; // trace part of yield normal
-  STensor3 N(0.); // yield normal
-
-  double f = a(2)*pow(PhiEq,_n) - (a(1)*ptilde+a(0));
-
-  double DfDGamma = 0.;
-  double dfdDgamma = 0.;
-  double u = 1.;
-  double v = 1.;
-
-  double A = sqrt(6.*PhiEq*PhiEq+4.*_b*_b/3.*ptilde*ptilde);
-
-
-  double dDgammaDGamma = 0.;
-
-  if (f>0){
-     // plasticity
-    int ite = 0;
-    int maxite = 100; // maximal number of iters
-    double Dgamma = 0.; // eqplastic strain
-
-    //Msg::Error("plasticity occurs f = %e",f);
-
-    while (fabs(f) >_tol or ite <1){
-      double eta(0.),Deta(0.);
-      if (_viscosity != NULL)
-        _viscosity->get(q1->_epspbarre,eta,Deta);
-      double etaOverDt = eta/this->getTimeStep();
-
-      double dAdGamma = -(72.*Gt*PhiEq*PhiEq/u+ 16.*Kt*_b*_b*_b*ptilde*ptilde/(3.*v))/(2.*A);
-      dDgammaDGamma = kk*(A+Gamma*dAdGamma);
-
-      this->getYieldCoefficientDerivatives(q1,q1->_nup,Da);
-      dfdDgamma = Da(2)*pow(PhiEq,_n) - Da(1)*ptilde -Da(0);
-      if (Gamma>0 and etaOverDt>0)
-        dfdDgamma -= _p*pow(etaOverDt,_p-1.)*Deta/this->getTimeStep()*pow(Gamma,_p);
-
-      DfDGamma = dfdDgamma*dDgammaDGamma - (_n*a(2)*6.*Gt)*pow(PhiEq,_n)/u + a(1)*ptilde*2.*_b*Kt/v;
-      if (Gamma>0 and etaOverDt>0)
-        DfDGamma -=pow(etaOverDt,_p)*_p*pow(Gamma,_p-1.);
-
-      double dGamma = -f/DfDGamma;
-
-      if (Gamma + dGamma <=0.){
-          Gamma /= 2.;
-      }
-      else
-        Gamma += dGamma;
-
-      //Msg::Error("Gamma = %e",Gamma);
-
-      u = 1.+6.*Gt*Gamma;
-      v = 1.+2.*_b*Kt*Gamma;
-      PhiEq = PhiEqpr/u;
-      ptilde = ptildepr/v;
-      A = sqrt(6.*PhiEq*PhiEq+4.*_b*_b/3.*ptilde*ptilde);
-      Dgamma = kk*Gamma*A;
-
-      //Msg::Error("it = %d, u=%e, v=%e, Dgamma=%e",ite,u,v,Dgamma);
-
-      updateEqPlasticDeformation(q1,q0,q1->_nup,Dgamma);
-      hardening(q1);
-      getYieldCoefficients(q1,a);
-      //a.print("a update");
-
-      f = a(2)*pow(PhiEq,_n) - (a(1)*ptilde+a(0));
-      double viscoTerm = etaOverDt*Gamma;
-      if (Gamma>0 and etaOverDt>0) f-= pow(viscoTerm,_p);
-
-      ite++;
-      //if (ite> maxite-5)
-       //Msg::Error("it = %d, DfDGamma = %e error = %e dGamma = %e, Gamma = %e",ite,DfDGamma,f,dGamma,Gamma);
-
-      if (fabs(f) <_tol) break;
-
-      if(ite > maxite){
-        Msg::Fatal("No convergence for plastic correction in mlawPowerYieldHyper nonAssociatedFlow iter = %d, f = %e!!",ite,f);
-        break;
-      }
-    };
-
-    q1->_DgammaDt = Dgamma/this->getTimeStep();
-
-    // update effective stress tensor
-    devPhi *= (1./u);
-    ptilde = ptildepr/v;
-
-    // update normal
-    devN = devPhi;
-    devN *=  3.;
-    trN =  2.*_b*ptilde;
-    N = devN;
-    N(0,0) += trN/3.;
-    N(1,1) += trN/3.;
-    N(2,2) += trN/3.;
-
-    // estimate exp(GammaN)
-    STensor3 expGN(0.);
-    STensor3 GammaN = N;
-    GammaN *= Gamma;
-    expSTensor3(GammaN,expGN,&Epr);
-
-    // update plastic deformation tensor
-    multSTensor3(expGN,Fp0,Fp1);
-    // update IP
-    updateEqPlasticDeformation(q1,q0,q1->_nup,Dgamma);
-
-    // update elastic deformation tensor, corotational stress
-    inverseSTensor3(Fp1,Fpinv);
-    multSTensor3(F,Fpinv,Fe);
-    multSTensor3FirstTranspose(Fe,Fe,Ce);
-    logSTensor3(Ce,Ee,&Lpr,&dLpr);
-    Ee *= 0.5;
-
-    // backstress
-    STensor3 DB(N); // increment
-    DB *= (kk*Hb*Gamma);
-    q1->_backsig += DB; // update
-
-    STensor3 devDB;
-    double trDB;
-    this->dev(DB,devDB,trDB);
-
-    devB += devDB;
-    trB += trDB;
-
-    // corotationaal Kirchhoff stress
-    devK = devPhi;
-    devK += devB;
-
-    p = ptilde + trB/3.;
-  };
-
-   // corotational Kirchhoff stress tenor
-  STensor3 KS = devK;
-  KS(0,0) += p;
-  KS(1,1) += p;
-  KS(2,2) += p;
-
-  // first Piola Kirchhoff stress
-  STensor3 S(0.);
-  for(int i=0; i<3; i++)
-    for(int j=0; j<3; j++)
-      for(int k=0; k<3; k++)
-        for(int l=0; l<3; l++)
-          S(i,j)+= KS(k,l)*Lpr(k,l,i,j);
-
-  P*= 0.;
-  for(int i=0; i<3; i++)
-    for(int j=0; j<3; j++)
-      for(int k=0; k<3; k++)
-        for(int l=0; l<3; l++)
-          P(i,j) += Fe(i,k)*S(k,l)*Fpinv(j,l);
-
-  // update current internal variables
-  q1->_kirchhoff = KS;
-  q1->_elasticEnergy=deformationEnergy(Ce);
-  q1->_J = determinantSTensor3(F);
-  q1->_Je = determinantSTensor3(Fe);
-  q1->_Jp = determinantSTensor3(Fp1);
-  q1->_DGDt = Gamma/this->getTimeStep();
-
-  STensor3 Feinv = Fe.invert();
-  for (int i=0; i<3; i++){
-    for (int j=0; j<3; j++){
-      q1->_elasticStrainRate(i,j) = 0.;
-      q1->_plasticStrainRate(i,j) = 0.;
-      for (int k=0; k<3; k++){
-        q1->_elasticStrainRate(i,j) += (q1->_Fe(i,k)-q0->_Fe(i,k))*Feinv(k,j)/this->getTimeStep();
-        q1->_plasticStrainRate(i,j) += (q1->_Fp(i,k)-q0->_Fp(i,k))*Fpinv(k,j)/this->getTimeStep();
-      }
-    }
-  }
-
-  for (int i=0; i<3; i++){
-    for (int j=0; j<3; j++){
-      q1->_strainRate(i,j) = q1->_elasticStrainRate(i,j);
-      for (int k=0; k<3; k++){
-        for (int l=0; l<3; l++){
-          q1->_strainRate(i,j) += Fe(i,k)*q1->_plasticStrainRate(k,l)*Feinv(l,j);
-        }
-      }
-    }
-  }
-
-
-
-  if (stiff){
-
-    STensor3 invFp0 = Fp0.invert();
-    STensor3 DpprDCepr;
-    STensor43 DdevKprDCepr;
-
-    getDCorStressDCepr(Lpr,DpprDCepr,DdevKprDCepr);
-
-    STensor43& DKcorDF = q1->_DKcorDF;
-    DKcorDF *= (0.);
-    STensor3 DgamaDCepr(0.);
-
-    STensor43& dFpdF = q1->_DFpDF;
-    STensor3& dgammadF = q1->_DgammaDF;
-    STensor43& dFedF = q1->_DFeDF;
-    STensor3& DpDF = q1->_DpcorDF;
-    STensor43& DdevKDF = q1->_DdevKcorDF;
-
-    dFpdF *= 0.;
-    dgammadF*= 0.;
-    dFedF *= 0;
-    DpDF *= 0.;
-    DdevKDF *= 0.;
-
-    if (Gamma >0){
-      STensor3 dAdCepr(0.), dfDCepr(0.);
-      double fact = 1.5*a(2)*_n*pow(PhiEq,_n-2.)/(u*u);
-      for (int i=0; i<3; i++){
-        for (int j=0; j<3; j++){
-          dAdCepr(i,j) += 4.*_b*_b*ptildepr/(A*3.*v*v)*DpprDCepr(i,j);
-          dfDCepr(i,j) -=  a(1)/v*DpprDCepr(i,j);
-          for (int k=0; k<3; k++){
-            for (int l=0; l<3; l++){
-              dAdCepr(i,j) += 9./(A*u*u)*devPhipr(k,l)*DdevKprDCepr(k,l,i,j);
-              dfDCepr(i,j) += fact*devPhipr(k,l)*DdevKprDCepr(k,l,i,j);
-            }
-          }
-        }
-      }
-
-      STensor3 DGDCepr(0.);
-      for (int i=0; i<3; i++){
-        for (int j=0; j<3; j++){
-          DGDCepr(i,j) = (-dfDCepr(i,j)-dfdDgamma*kk*Gamma*dAdCepr(i,j))/DfDGamma;
-        }
-      }
-
-      DgamaDCepr *= 0.;
-      for (int i=0; i<3; i++){
-        for (int j=0; j<3; j++){
-          DgamaDCepr(i,j) = kk*Gamma*dAdCepr(i,j)+ kk*dDgammaDGamma*DGDCepr(i,j);
-        }
-      }
-
-
-      STensor3 DtrNDCepr;
-      for (int i=0; i<3; i++)
-        for (int j=0; j<3; j++)
-          DtrNDCepr(i,j) = 2.*_b/v*DpprDCepr(i,j) - 2.*_b*ptildepr*(2.*_b*Kt)/(v*v)*DGDCepr(i,j);
-
-
-      STensor43 DdevNDCepr(DdevKprDCepr);
-      DdevNDCepr *= (3./u);
-      for (int i=0; i<3; i++)
-          for (int j=0; j<3; j++)
-            for (int k=0; k<3; k++)
-              for (int l=0; l<3; l++){
-                DdevNDCepr(i,j,k,l) -= 18.*Gt/(u*u)*devPhipr(i,j)*DGDCepr(k,l);
-              }
-
-
-      STensor43 temp1(0.);
-      for (int i=0; i<3; i++)
-        for (int j=0; j<3; j++)
-          for (int k=0; k<3; k++)
-            for (int l=0; l<3; l++)
-              temp1(i,j,k,l) = N(i,j)*DGDCepr(k,l)+ Gamma*DdevNDCepr(i,j,k,l)+ Gamma/3.*_I(i,j)*DtrNDCepr(k,l);
-
-      STensor43 EprFp0(0.);
-      for (int i=0; i<3; i++)
-        for (int j=0; j<3; j++)
-          for (int k=0; k<3; k++)
-            for (int l=0; l<3; l++){
-                for (int s=0; s<3; s++){
-                  EprFp0(i,j,k,l) += Epr(i,s,k,l)*Fp0(s,j);
-                }
-              }
-
-      STensor43 dFpDCepr(0.);
-      multSTensor43(EprFp0,temp1,dFpDCepr);
-      // compute dFpDC
-      STensor43 dFpdC(0.);
-      for (int i=0; i<3; i++)
-        for (int j=0; j<3; j++)
-          for (int k=0; k<3; k++)
-            for (int l=0; l<3; l++)
-              for (int p=0; p<3; p++)
-                for (int q=0; q<3; q++)
-                  dFpdC(i,j,k,l) += dFpDCepr(i,j,p,q)*invFp0(k,p)*invFp0(l,q);
-
-      // compute dFpDF
-      for (int i=0; i<3; i++)
-        for (int j=0; j<3; j++)
-          for (int k=0; k<3; k++)
-            for (int l=0; l<3; l++)
-              for (int p=0; p<3; p++)
-                for (int q=0; q<3; q++)
-                  dFpdF(i,j,k,l) += dFpdC(i,j,p,q)*(F(k,p)*_I(q,l)+F(k,q)*_I(p,l));
-
-
-      STensor3 DpDCepr(DpprDCepr);
-      STensor43 DdevKDCepr(DdevKprDCepr);
-      for (int i=0; i<3; i++){
-        for (int j=0; j<3; j++){
-          DpDCepr(i,j) -= _K*(DGDCepr(i,j)*trN+Gamma*DtrNDCepr(i,j));
-          for (int k=0; k<3; k++){
-            for (int l=0; l<3; l++){
-              DdevKDCepr(i,j,k,l) -=  2.*_mu*(DGDCepr(k,l)*devN(i,j)+Gamma*DdevNDCepr(i,j,k,l));
-            }
-          }
-        }
-      }
-
-
-      STensor3 DpDC(0.);
-      for (int k=0; k<3; k++)
-        for (int l=0; l<3; l++)
-          for (int p=0; p<3; p++)
-            for (int q=0; q<3; q++)
-              DpDC(k,l) += DpDCepr(p,q)*invFp0(k,p)*invFp0(l,q);
-
-      for (int k=0; k<3; k++)
-        for (int l=0; l<3; l++)
-          for (int p=0; p<3; p++)
-            for (int q=0; q<3; q++)
-              DpDF(k,l) += DpDC(p,q)*(F(k,p)*_I(q,l)+F(k,q)*_I(p,l));
-
-
-      STensor43 DdevKDC(0.);
-      for (int i=0; i<3; i++)
-        for (int j=0; j<3; j++)
-          for (int k=0; k<3; k++)
-            for (int l=0; l<3; l++)
-              for (int p=0; p<3; p++)
-                for (int q=0; q<3; q++)
-                  DdevKDC(i,j,k,l) += DdevKDCepr(i,j,p,q)*invFp0(k,p)*invFp0(l,q);
-
-
-      for (int i=0; i<3; i++)
-          for (int j=0; j<3; j++)
-            for (int k=0; k<3; k++)
-              for (int l=0; l<3; l++)
-                for (int p=0; p<3; p++)
-                  for (int q=0; q<3; q++)
-                    DdevKDF(i,j,k,l) += DdevKDC(i,j,p,q)*(F(k,p)*_I(q,l)+F(k,q)*_I(p,l));
-
-      for (int m=0; m<3; m++)
-        for (int n=0; n<3; n++)
-          for (int p=0; p<3; p++)
-            for (int q=0; q<3; q++)
-              DKcorDF(m,n,p,q) = _I(m,n)*DpDF(p,q)+ DdevKDF(m,n,p,q);
-
-    }
-    else{
-      dFpdF *= 0.;
-      computeDKcorprDF_elastic(DKcorDF,DpDF,DdevKDF,DpprDCepr,DdevKprDCepr,F, Fp0, invFp0);
-    }
-
-
-    STensor3 DgamaDC(0.);
-    for (int k=0; k<3; k++)
-      for (int l=0; l<3; l++)
-        for (int p=0; p<3; p++)
-          for (int q=0; q<3; q++)
-            DgamaDC(k,l) += DgamaDCepr(p,q)*invFp0(k,p)*invFp0(l,q);
-
-    for (int k=0; k<3; k++)
-      for (int l=0; l<3; l++)
-        for (int p=0; p<3; p++)
-          for (int q=0; q<3; q++)
-            dgammadF(k,l) += DgamaDC(p,q)*(F(k,p)*_I(q,l)+F(k,q)*_I(p,l));
-
-
-    STensor43 DinvFpDF(0.); //
-    for (int i=0; i<3; i++)
-      for (int s=0; s<3; s++)
-        for (int k=0; k<3; k++)
-          for (int l=0; l<3; l++)
-            for (int m=0; m<3; m++)
-              for (int j=0; j<3; j++)
-                DinvFpDF(i,s,k,l) -= Fpinv(i,m)*dFpdF(m,j,k,l)*Fpinv(j,s);
-
-    for (int m=0; m<3; m++)
-      for (int j=0; j<3; j++)
-        for (int k=0; k<3; k++)
-          for (int l=0; l<3; l++){
-            dFedF(m,j,k,l) += _I(m,k)*Fpinv(l,j);
-            for (int s=0; s<3; s++)
-              dFedF(m,j,k,l) += F(m,s)*DinvFpDF(s,j,k,l);
-          }
-
-    STensor43 dCeDF(0.);
-    for (int i=0; i<3; i++)
-      for (int j=0; j<3; j++)
-        for (int k=0; k<3; k++)
-          for (int l=0; l<3; l++)
-            for (int m=0; m<3; m++)
-              dCeDF(i,j,k,l) += dFedF(m,i,k,l)*Fe(m,j)+ Fe(m,i)*dFedF(m,j,k,l);
-
-
-    STensor63 dLprDF(0.);
-    for (int a=0; a<3; a++)
-      for (int b=0; b<3; b++)
-        for (int i=0; i<3; i++)
-          for (int j=0; j<3; j++)
-            for (int k=0; k<3; k++)
-              for (int l=0; l<3; l++)
-                for (int p=0; p<3; p++)
-                  for (int q=0; q<3; q++)
-                    dLprDF(a,b,i,j,k,l) += dLpr(a,b,i,j,p,q)*dCeDF(p,q,k,l);
-
-
-    STensor43 dSdF(0.);
-    for (int i=0; i<3; i++)
-      for (int j=0; j<3; j++)
-        for (int k=0; k<3; k++)
-          for (int l=0; l<3; l++)
-            for (int m=0; m<3; m++)
-              for (int n=0; n<3; n++){
-                dSdF(i,j,k,l) += DKcorDF(m,n,k,l)*Lpr(m,n,i,j);
-                dSdF(i,j,k,l) += KS(m,n)*dLprDF(m,n,i,j,k,l);
-              }
-
-    for (int i=0; i<3; i++)
-      for (int j=0; j<3; j++)
-        for (int k=0; k<3; k++)
-          for (int l=0; l<3; l++){
-            Tangent(i,j,k,l) = 0.;
-            for (int m=0; m<3; m++){
-              for (int n=0; n<3; n++){
-                Tangent(i,j,k,l) += dFedF(i,m,k,l)*S(m,n)*Fpinv(j,n);
-                Tangent(i,j,k,l) += Fe(i,m)*dSdF(m,n,k,l)*Fpinv(j,n);
-                Tangent(i,j,k,l) += Fe(i,m)*S(m,n)*DinvFpDF(j,n,k,l);
-              }
-            }
-          }
-
-  };
-};
-
-void mlawPowerYieldHyper::predictorCorrector_nonAssociatedFlow(const STensor3& F, const IPHyperelastic *q0, IPHyperelastic *q1,
-                            STensor3&P, const bool stiff, STensor43& Tangent) const{
-  /* compute elastic predictor */
-  STensor3& Fp1 = q1->_Fp;
-  const STensor3& Fp0 = q1->_Fp;
-
-  Fp1 = Fp0; // plastic deformation tensor
-  q1->_epspbarre = q0->_epspbarre; // plastic equivalent strain
-  q1->_epspCompression = q0->_epspCompression;
-  q1->_epspTraction = q0->_epspTraction;
-  q1->_epspShear = q0->_epspShear;
-  q1->_DgammaDt = 0.;
-  q1->_DGDt = 0.;
-
-  STensor3& Fe = q1->_Fe;
-  STensor3 Fpinv, Ce;
-  inverseSTensor3(Fp1,Fpinv);
-  multSTensor3(F,Fpinv,Fe);
-  multSTensor3FirstTranspose(Fe,Fe,Ce);
-
-  STensor3& Ee = q1->_Ee;
-  STensor43 Lpr;
-  STensor63 dLpr;
-  logSTensor3(Ce,Ee,&Lpr,&dLpr);
-  Ee *= 0.5;
-
-  STensor43 Epr; // estimation of dexpA/dA
-
-  STensor3 devKpr; // dev corotational kirchoff stress predictor
-  double ppr; // pressure predictor
-  this->corStress(Ee,devKpr,ppr);
-  double keq2pr = 1.5*devKpr.dotprod();
-  double keqpr = sqrt(keq2pr);
-
-  STensor3 devK = devKpr;  // dev corotational kirchoff stress
-  double p = ppr; // pressure
-
-
-  q1->_nup = (9.-2.*_b)/(18.+2.*_b);
-  double kk = 1./sqrt(1.+2.*q1->_nup*q1->_nup);
-
-  double Gamma = 0.; // q1->_Gamma; // flow rule parameter
-  double sigVM = keqpr;
-
-   // hardening
-  this->hardening(q1);
-  fullVector<double> a(3), Da(3); // yield coefficients and derivatives in respect to plastic deformation
-  this->getYieldCoefficients(q1,a);
-  //a.print("a init");
-
-  STensor3 devN(0); // dev part of yield normal
-  double trN=0;; // trace part of yield normal
-  STensor3 N(0.); // yield normal
-
-  double f = a(2)*pow(sigVM,_n) - (a(1)*p+a(0));
-
-  double DfDGamma = 0.;
-  double dfdDgamma = 0.;
-  double u = 1.;
-  double v = 1.;
-
-  double A = sqrt(6.*sigVM*sigVM+4.*_b*_b/3.*p*p);
-  double dDgammaDGamma = 0.;
+  double dDgammaDGamma = 0.;
+  double Dgamma = 0.; // eqplastic strain
 
   if (f>0){
      // plasticity
     int ite = 0;
     int maxite = 100; // maximal number of iters
-    double Dgamma = 0.; // eqplastic strain
+    
 
     //Msg::Error("plasticity occurs f = %e",f);
 
+    //double f0 = fabs(f);
+
     while (fabs(f) >_tol or ite <1){
-       double eta(0.),Deta(0.);
+      double eta(0.),Deta(0.);
       if (_viscosity != NULL)
         _viscosity->get(q1->_epspbarre,eta,Deta);
       double etaOverDt = eta/this->getTimeStep();
-
-      double dAdGamma = -(72.*_mu*sigVM*sigVM/u+ 16.*_K*_b*_b*_b*p*p/(3.*v))/(2.*A);
+      double dAdGamma = -(72.*Gt*PhiEq*PhiEq/u+ 16.*Kt*_b*_b*_b*ptilde*ptilde/(3.*v))/(2.*A);
       dDgammaDGamma = kk*(A+Gamma*dAdGamma);
 
       this->getYieldCoefficientDerivatives(q1,q1->_nup,Da);
-      dfdDgamma = Da(2)*pow(sigVM,_n) - Da(1)*p -Da(0);
+      dfdDgamma = Da(2)*pow(PhiEq,_n) - Da(1)*ptilde -Da(0);
       if (Gamma>0 and etaOverDt>0)
         dfdDgamma -= _p*pow(etaOverDt,_p-1.)*Deta/this->getTimeStep()*pow(Gamma,_p);
 
-      DfDGamma = dfdDgamma*dDgammaDGamma - (_n*a(2)*6.*_mu)*pow(sigVM,_n)/u + a(1)*p*2.*_b*_K/v;
+      DfDGamma = dfdDgamma*dDgammaDGamma - (_n*a(2)*6.*Gt)*pow(PhiEq,_n)/u + a(1)*ptilde*2.*_b*Kt/v;
       if (Gamma>0 and etaOverDt>0)
         DfDGamma -=pow(etaOverDt,_p)*_p*pow(Gamma,_p-1.);
 
-
       double dGamma = -f/DfDGamma;
 
       if (Gamma + dGamma <=0.){
@@ -4641,11 +750,11 @@ void mlawPowerYieldHyper::predictorCorrector_nonAssociatedFlow(const STensor3& F
 
       //Msg::Error("Gamma = %e",Gamma);
 
-      u = 1.+6.*_mu*Gamma;
-      v = 1.+2.*_b*_K*Gamma;
-      sigVM = keqpr/u;
-      p = ppr/v;
-      A = sqrt(6.*sigVM*sigVM+4.*_b*_b/3.*p*p);
+      u = 1.+6.*Gt*Gamma;
+      v = 1.+2.*_b*Kt*Gamma;
+      PhiEq = PhiEqpr/u;
+      ptilde = ptildepr/v;
+      A = sqrt(6.*PhiEq*PhiEq+4.*_b*_b/3.*ptilde*ptilde);
       Dgamma = kk*Gamma*A;
 
       //Msg::Error("it = %d, u=%e, v=%e, Dgamma=%e",ite,u,v,Dgamma);
@@ -4655,69 +764,82 @@ void mlawPowerYieldHyper::predictorCorrector_nonAssociatedFlow(const STensor3& F
       getYieldCoefficients(q1,a);
       //a.print("a update");
 
-      f = a(2)*pow(sigVM,_n) - (a(1)*p+a(0));
+      f = a(2)*pow(PhiEq,_n) - (a(1)*ptilde+a(0));
       double viscoTerm = etaOverDt*Gamma;
       if (Gamma>0 and etaOverDt>0) f-= pow(viscoTerm,_p);
 
       ite++;
       //if (ite> maxite-5)
-       // Msg::Error("it = %d, DfDGamma = %e error = %e dGamma = %e, Gamma = %e",ite,DfDGamma,f,dGamma,Gamma);
+       //Msg::Error("it = %d, DfDGamma = %e error = %e dGamma = %e, Gamma = %e",ite,DfDGamma,f,dGamma,Gamma);
 
       if (fabs(f) <_tol) break;
 
       if(ite > maxite){
-        Msg::Fatal("No convergence for plastic correction in mlawPowerYieldHyper nonAssociatedFlow iter = %d, f = %e!!",ite,f);
+        Msg::Fatal("No convergence for plastic correction in mlawPowerYieldHyper nonAssociatedFlow Maxwell iter = %d, f = %e!!",ite,f);
         break;
       }
     };
 
     q1->_DgammaDt = Dgamma/this->getTimeStep();
 
-    devK *= (1./u);
-    p = ppr/v;
+    // update effective stress tensor
+    devPhi *= (1./u);
+    ptilde = ptildepr/v;
 
-    devN = devK;
+    // update normal
+    devN = devPhi;
     devN *=  3.;
-    trN =  2.*_b*p;
+    trN =  2.*_b*ptilde;
     N = devN;
     N(0,0) += trN/3.;
     N(1,1) += trN/3.;
     N(2,2) += trN/3.;
 
     // estimate exp(GammaN)
-    STensor3 expGN(0.);
-    STensor3 GammaN = N;
+    static STensor3 expGN;
+    static STensor3 GammaN;
+    GammaN = N;
     GammaN *= Gamma;
-    expSTensor3(GammaN,expGN,&Epr);
+    STensorOperation::expSTensor3(GammaN,_order,expGN,&dexpAdA);
 
     // update plastic deformation tensor
-    multSTensor3(expGN,Fp0,Fp1);
+    STensorOperation::multSTensor3(expGN,Fp0,Fp1);
     // update IP
     updateEqPlasticDeformation(q1,q0,q1->_nup,Dgamma);
 
     // update elastic deformation tensor, corotational stress
-    inverseSTensor3(Fp1,Fpinv);
-    multSTensor3(F,Fpinv,Fe);
-    multSTensor3FirstTranspose(Fe,Fe,Ce);
-    logSTensor3(Ce,Ee,&Lpr,&dLpr);
+    STensorOperation::inverseSTensor3(Fp1,Fpinv);
+    STensorOperation::multSTensor3(F,Fpinv,Fe);
+    STensorOperation::multSTensor3FirstTranspose(Fe,Fe,Ce);
+    STensorOperation::logSTensor3(Ce,_order,Ee,&DlnDCe,&DDlnDDCe);
     Ee *= 0.5;
-  };
+    // update A, B
+    updateViscoElasticFlow(q0,q1,Ke,Ge);
 
-   // corotational Kirchhoff stress tenor
-  STensor3& KS = q1->_kirchhoff;
-  KS= devK;
-  KS(0,0) += p;
-  KS(1,1) += p;
-  KS(2,2) += p;
+    // backstress
+    static STensor3 DB; // increment
+    DB = (N); // increment
+    DB *= (kk*Hb*Gamma);
+    q1->_backsig += DB; // update
 
-  // first Piola Kirchhoff stress
-  STensor3 S(0.);
-  for(int i=0; i<3; i++)
-    for(int j=0; j<3; j++)
-      for(int k=0; k<3; k++)
-        for(int l=0; l<3; l++)
-          S(i,j)+= KS(k,l)*Lpr(k,l,i,j);
+    // corotationaal Kirchhoff stress
+    q1->_kirchhoff = devPhi;
+    q1->_kirchhoff += q1->_backsig;
+
+    q1->_kirchhoff(0,0) += (ptilde);
+    q1->_kirchhoff(1,1) += (ptilde);
+    q1->_kirchhoff(2,2) += (ptilde);
+  }
+  else{
+    N *= 0.;
+  }
 
+  
+  const STensor3& KS = q1->_kirchhoff;
+  // second Piola Kirchhoff stress
+  static STensor3 S;
+  STensorOperation::multSTensor3STensor43(KS,DlnDCe,S);
+  
   P*= 0.;
   for(int i=0; i<3; i++)
     for(int j=0; j<3; j++)
@@ -4725,232 +847,207 @@ void mlawPowerYieldHyper::predictorCorrector_nonAssociatedFlow(const STensor3& F
         for(int l=0; l<3; l++)
           P(i,j) += Fe(i,k)*S(k,l)*Fpinv(j,l);
 
-  q1->_elasticEnergy=deformationEnergy(Ce);
-  q1->_J = determinantSTensor3(F);
-  q1->_Je = determinantSTensor3(Fe);
-  q1->_Jp = determinantSTensor3(Fp1);
-  q1->_DGDt = Gamma/this->getTimeStep();
 
+  // defo energy
+  q1->_elasticEnergy=deformationEnergy(Ce);
+  
+  // dissipation
+  double& irrEnerg = q1->getRefToIrreversibleEnergy();
+  irrEnerg = q0->irreversibleEnergy();
+  if (Gamma > 0){
+    double dotKSN = dot(KS,N);
+    irrEnerg += Gamma*dotKSN;
+  }
+  
   if (stiff){
-
-    STensor3 invFp0 = Fp0.invert();
-    STensor3 DpprDCepr;
-    STensor43 DdevKprDCepr;
-
-    getDCorStressDCepr(Lpr,DpprDCepr,DdevKprDCepr);
-    STensor3 DgamaDCepr(0.);
-
-    STensor43& DKcorDF = q1->_DKcorDF;
-    DKcorDF *= (0.);
-
-    STensor43& dFpdF = q1->_DFpDF;
-    STensor3& dgammadF = q1->_DgammaDF;
-    STensor43& dFedF = q1->_DFeDF;
-    STensor3& DpDF = q1->_DpcorDF;
-    STensor43& DdevKDF = q1->_DdevKcorDF;
-
-    dFpdF *= 0.;
-    dgammadF*= 0.;
-    dFedF *= 0;
-    DpDF *= 0.;
-    DdevKDF *= 0.;
-
+    static STensor3 DpprDCepr;
+    static STensor43 DdevKprDCepr;
+    STensorOperation::multSTensor3STensor43(_I,DlnDCepr,DpprDCepr);
+    DpprDCepr*= (0.5*Ke);
+    STensorOperation::multSTensor43(_Idev,DlnDCepr,DdevKprDCepr);
+    DdevKprDCepr*= Ge;
+    
+    static STensor3 DpDCepr;
+    static STensor43 DdevKDCepr;
+    DpDCepr = DpprDCepr;
+    DdevKDCepr = DdevKprDCepr;
+    
+    static STensor43 dFpDCepr;
+    static STensor3 DgamaDCepr;
+    static STensor3 DtrNDCepr;
+    static STensor43 DdevNDCepr;
+    static STensor3 DGDCepr;
+    
     if (Gamma >0){
-      STensor3 dAdCepr(0.), dfDCepr(0.);
-      double fact = 1.5*a(2)*_n*pow(sigVM,_n-2.)/(u*u);
+      // plastic
+      static STensor3 dAdCepr, dfDCepr;
+      
+      double fact = 1.5*a(2)*_n*pow(PhiEq,_n-2.)/(u*u);
       for (int i=0; i<3; i++){
         for (int j=0; j<3; j++){
-          dAdCepr(i,j) += 4.*_b*_b*ppr/(A*3.*v*v)*DpprDCepr(i,j);
-          dfDCepr(i,j) -=  a(1)/v*DpprDCepr(i,j);
+          dAdCepr(i,j) = (4.*_b*_b*ptildepr/(A*3.*v*v))*DpprDCepr(i,j);
+          dfDCepr(i,j) =  -(a(1)/v)*DpprDCepr(i,j);
           for (int k=0; k<3; k++){
             for (int l=0; l<3; l++){
-              dAdCepr(i,j) += 9./(A*u*u)*devKpr(k,l)*DdevKprDCepr(k,l,i,j);
-              dfDCepr(i,j) += fact*devKpr(k,l)*DdevKprDCepr(k,l,i,j);
+              dAdCepr(i,j) += (9./(A*u*u))*devPhipr(k,l)*DdevKprDCepr(k,l,i,j);
+              dfDCepr(i,j) += fact*devPhipr(k,l)*DdevKprDCepr(k,l,i,j);
             }
           }
         }
       }
 
-      STensor3 DGDCepr(0.);
+      
       for (int i=0; i<3; i++){
         for (int j=0; j<3; j++){
-          DGDCepr(i,j) = (-dfDCepr(i,j)-dfdDgamma*Gamma*dAdCepr(i,j))/DfDGamma;
+          DGDCepr(i,j) = (-dfDCepr(i,j)-dfdDgamma*kk*Gamma*dAdCepr(i,j))/DfDGamma;
         }
       }
 
-      DgamaDCepr *= 0.;
       for (int i=0; i<3; i++){
         for (int j=0; j<3; j++){
-          DgamaDCepr(i,j) = Gamma*dAdCepr(i,j)+ dDgammaDGamma*DGDCepr(i,j);
+          DgamaDCepr(i,j) = kk*Gamma*dAdCepr(i,j)+ kk*dDgammaDGamma*DGDCepr(i,j);
         }
       }
 
-
-      STensor3 DtrNDCepr;
+      
       for (int i=0; i<3; i++)
         for (int j=0; j<3; j++)
-          DtrNDCepr(i,j) = 2.*_b/v*DpprDCepr(i,j) - 2.*_b*ppr*(2.*_b*_K)/(v*v)*DGDCepr(i,j);
-
+          DtrNDCepr(i,j) = 2.*_b/v*DpprDCepr(i,j) - 2.*_b*ptildepr*(2.*_b*Kt)/(v*v)*DGDCepr(i,j);
 
-      STensor43 DdevNDCepr(DdevKprDCepr);
+      DdevNDCepr  = (DdevKprDCepr);
       DdevNDCepr *= (3./u);
       for (int i=0; i<3; i++)
           for (int j=0; j<3; j++)
             for (int k=0; k<3; k++)
               for (int l=0; l<3; l++){
-                DdevNDCepr(i,j,k,l) -= 18.*_mu/(u*u)*devKpr(i,j)*DGDCepr(k,l);
+                DdevNDCepr(i,j,k,l) -= 18.*Gt/(u*u)*devPhipr(i,j)*DGDCepr(k,l);
               }
 
 
-      STensor43 temp1(0.);
+      static STensor43 temp1;
       for (int i=0; i<3; i++)
         for (int j=0; j<3; j++)
           for (int k=0; k<3; k++)
             for (int l=0; l<3; l++)
               temp1(i,j,k,l) = N(i,j)*DGDCepr(k,l)+ Gamma*DdevNDCepr(i,j,k,l)+ Gamma/3.*_I(i,j)*DtrNDCepr(k,l);
 
-      STensor43 EprFp0(0.);
+      static STensor43 EprFp0;
       for (int i=0; i<3; i++)
         for (int j=0; j<3; j++)
           for (int k=0; k<3; k++)
             for (int l=0; l<3; l++){
+                EprFp0(i,j,k,l) = 0.;
                 for (int s=0; s<3; s++){
-                  EprFp0(i,j,k,l) += Epr(i,s,k,l)*Fp0(s,j);
+                  EprFp0(i,j,k,l) += dexpAdA(i,s,k,l)*Fp0(s,j);
                 }
               }
 
-      STensor43 dFpDCepr(0.);
-      multSTensor43(EprFp0,temp1,dFpDCepr);
-      // compute dFpDC
-      STensor43 dFpdC(0.);
-      for (int i=0; i<3; i++)
-        for (int j=0; j<3; j++)
-          for (int k=0; k<3; k++)
-            for (int l=0; l<3; l++)
-              for (int p=0; p<3; p++)
-                for (int q=0; q<3; q++)
-                  dFpdC(i,j,k,l) += dFpDCepr(i,j,p,q)*invFp0(k,p)*invFp0(l,q);
-
-      // compute dFpDF
-      for (int i=0; i<3; i++)
-        for (int j=0; j<3; j++)
-          for (int k=0; k<3; k++)
-            for (int l=0; l<3; l++)
-              for (int p=0; p<3; p++)
-                for (int q=0; q<3; q++)
-                  dFpdF(i,j,k,l) += dFpdC(i,j,p,q)*(F(k,p)*_I(q,l)+F(k,q)*_I(p,l));
-
-
-      STensor3 DpDCepr(DpprDCepr);
-      STensor43 DdevKDCepr(DdevKprDCepr);
+      STensorOperation::multSTensor43(EprFp0,temp1,dFpDCepr);
+      // update
       for (int i=0; i<3; i++){
         for (int j=0; j<3; j++){
-          DpDCepr(i,j) -= _K*(DGDCepr(i,j)*trN+Gamma*DtrNDCepr(i,j));
+          DpDCepr(i,j) -= Ke*(DGDCepr(i,j)*trN+Gamma*DtrNDCepr(i,j));
           for (int k=0; k<3; k++){
             for (int l=0; l<3; l++){
-              DdevKDCepr(i,j,k,l) -=  2.*_mu*(DGDCepr(k,l)*devN(i,j)+Gamma*DdevNDCepr(i,j,k,l));
+              DdevKDCepr(i,j,k,l) -=  2.*Ge*(DGDCepr(k,l)*devN(i,j)+Gamma*DdevNDCepr(i,j,k,l));
             }
           }
         }
       }
-
-
-      STensor3 DpDC(0.);
-      for (int k=0; k<3; k++)
-        for (int l=0; l<3; l++)
-          for (int p=0; p<3; p++)
-            for (int q=0; q<3; q++)
-              DpDC(k,l) += DpDCepr(p,q)*invFp0(k,p)*invFp0(l,q);
-
-      for (int k=0; k<3; k++)
-        for (int l=0; l<3; l++)
-          for (int p=0; p<3; p++)
-            for (int q=0; q<3; q++)
-              DpDF(k,l) += DpDC(p,q)*(F(k,p)*_I(q,l)+F(k,q)*_I(p,l));
-
-
-      STensor43 DdevKDC(0.);
-      for (int i=0; i<3; i++)
-        for (int j=0; j<3; j++)
-          for (int k=0; k<3; k++)
-            for (int l=0; l<3; l++)
-              for (int p=0; p<3; p++)
-                for (int q=0; q<3; q++)
-                  DdevKDC(i,j,k,l) += DdevKDCepr(i,j,p,q)*invFp0(k,p)*invFp0(l,q);
-
-
-      for (int i=0; i<3; i++)
-          for (int j=0; j<3; j++)
-            for (int k=0; k<3; k++)
-              for (int l=0; l<3; l++)
-                for (int p=0; p<3; p++)
-                  for (int q=0; q<3; q++)
-                    DdevKDF(i,j,k,l) += DdevKDC(i,j,p,q)*(F(k,p)*_I(q,l)+F(k,q)*_I(p,l));
-
-      for (int m=0; m<3; m++)
-        for (int n=0; n<3; n++)
-          for (int p=0; p<3; p++)
-            for (int q=0; q<3; q++)
-              DKcorDF(m,n,p,q) = _I(m,n)*DpDF(p,q)+ DdevKDF(m,n,p,q);
-
     }
     else{
+      // elastic
+      DgamaDCepr *= 0.;
+      dFpDCepr *= 0.;
+      DtrNDCepr *= 0.;
+      DdevNDCepr *= 0.;
+      DGDCepr *= 0.;
+    }
+    
+    static STensor43 dKcorDcepr;
+    dKcorDcepr = DdevKDCepr;
+    for (int i=0; i<3; i++){
+      for (int j=0; j<3; j++){
+        for (int k=0; k<3; k++){
+          for (int l=0; l<3; l++){
+            dKcorDcepr(i,j,k,l) += _I(i,j)*DpDCepr(k,l);
+          }
+        }
+      }
+    }
+    
+    static STensor43 CeprToF;
+    for (int i=0; i<3; i++){
+      for (int j=0; j<3; j++){
+        for (int k=0; k<3; k++){
+          for (int l=0; l<3; l++){
+            CeprToF(i,j,k,l) = 2.*Fepr(k,i)*invFp0(j,l);
+          }
+        }
+      }
+    }
+    
+    STensor3& DgammaDF = q1->_DgammaDF;
+    static STensor43 DKcorDF;
+    
+    STensorOperation::multSTensor43(dKcorDcepr,CeprToF,DKcorDF);
+    if (Gamma > 0){
+      STensorOperation::multSTensor3STensor43(DgamaDCepr,CeprToF,DgammaDF);
+      STensorOperation::multSTensor43(dFpDCepr,CeprToF,dFpdF);      
+    }
+    else{
+      DgammaDF *= 0.;
       dFpdF *= 0.;
-      computeDKcorprDF_elastic(DKcorDF,DpDF,DdevKDF,DpprDCepr,DdevKprDCepr,F, Fp0, invFp0);
     }
-
-
-    STensor3 DgamaDC(0.);
-    for (int k=0; k<3; k++)
-      for (int l=0; l<3; l++)
-        for (int p=0; p<3; p++)
-          for (int q=0; q<3; q++)
-            DgamaDC(k,l) += DgamaDCepr(p,q)*invFp0(k,p)*invFp0(l,q);
-
-    for (int k=0; k<3; k++)
-      for (int l=0; l<3; l++)
-        for (int p=0; p<3; p++)
-          for (int q=0; q<3; q++)
-            dgammadF(k,l) += DgamaDC(p,q)*(F(k,p)*_I(q,l)+F(k,q)*_I(p,l));
-
-
-    STensor43 DinvFpDF(0.); //
+    
+    static STensor43 DinvFpDF; //
     for (int i=0; i<3; i++)
       for (int s=0; s<3; s++)
         for (int k=0; k<3; k++)
-          for (int l=0; l<3; l++)
+          for (int l=0; l<3; l++){
+            DinvFpDF(i,s,k,l) = 0.;
             for (int m=0; m<3; m++)
               for (int j=0; j<3; j++)
                 DinvFpDF(i,s,k,l) -= Fpinv(i,m)*dFpdF(m,j,k,l)*Fpinv(j,s);
+                
+          }
 
     for (int m=0; m<3; m++)
       for (int j=0; j<3; j++)
         for (int k=0; k<3; k++)
           for (int l=0; l<3; l++){
-            dFedF(m,j,k,l) += _I(m,k)*Fpinv(l,j);
+            dFedF(m,j,k,l) = _I(m,k)*Fpinv(l,j);
             for (int s=0; s<3; s++)
               dFedF(m,j,k,l) += F(m,s)*DinvFpDF(s,j,k,l);
           }
 
-    STensor43 dCeDF(0.);
-    for (int i=0; i<3; i++)
-      for (int j=0; j<3; j++)
-        for (int k=0; k<3; k++)
-          for (int l=0; l<3; l++)
-            for (int m=0; m<3; m++)
-              dCeDF(i,j,k,l) += dFedF(m,i,k,l)*Fe(m,j)+ Fe(m,i)*dFedF(m,j,k,l);
-
-
-    STensor63 dLprDF(0.);
-    for (int a=0; a<3; a++)
-      for (int b=0; b<3; b++)
-        for (int i=0; i<3; i++)
-          for (int j=0; j<3; j++)
-            for (int k=0; k<3; k++)
-              for (int l=0; l<3; l++)
-                for (int p=0; p<3; p++)
-                  for (int q=0; q<3; q++)
-                    dLprDF(a,b,i,j,k,l) += dLpr(a,b,i,j,p,q)*dCeDF(p,q,k,l);
+    static STensor63 DlnDF;
+    if (_order != 1){
+      for (int i=0; i<3; i++){
+        for (int j=0; j<3; j++){
+          for (int k=0; k<3; k++){
+            for (int l=0; l<3; l++){
+              for (int p=0; p<3; p++){
+                for (int q=0; q<3; q++){
+                  DlnDF(i,j,k,l,p,q) = 0.;
+                  for (int r=0; r<3; r++){
+                    for (int s=0; s<3; s++){
+                      for (int a=0; a<3; a++){
+                        DlnDF(i,j,k,l,p,q) += DDlnDDCe(i,j,k,l,r,s)*2.*Fe(a,r)*dFedF(a,s,p,q);
+                      }
+                    }
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+      
+    }
+    else{
+      DlnDF *= 0.;
+    }
 
 
     STensor43 dSdF(0.);
@@ -4960,8 +1057,8 @@ void mlawPowerYieldHyper::predictorCorrector_nonAssociatedFlow(const STensor3& F
           for (int l=0; l<3; l++)
             for (int m=0; m<3; m++)
               for (int n=0; n<3; n++){
-                dSdF(i,j,k,l) += DKcorDF(m,n,k,l)*Lpr(m,n,i,j);
-                dSdF(i,j,k,l) += KS(m,n)*dLprDF(m,n,i,j,k,l);
+                dSdF(i,j,k,l) += DKcorDF(m,n,k,l)*DlnDCe(m,n,i,j);
+                dSdF(i,j,k,l) += KS(m,n)*DlnDF(m,n,i,j,k,l);
               }
 
     for (int i=0; i<3; i++)
@@ -4977,14 +1074,35 @@ void mlawPowerYieldHyper::predictorCorrector_nonAssociatedFlow(const STensor3& F
               }
             }
           }
-
+    
+    
+    // irreversible energy
+    STensor3& DirrEnergDF = q1->_DirreversibleEnergyDF;
+    if (Dgamma > 0){
+      static STensor3 DirrEnergDCepr;
+      double dotKSN = dot(KS,N);
+      DirrEnergDCepr = DGDCepr;
+      DirrEnergDCepr *= dotKSN;
+      for (int i=0; i<3; i++){
+        for (int j=0; j<3; j++){
+          for (int k=0; k<3; k++){
+            for (int l=0; l<3; l++){
+              DirrEnergDCepr(i,j) += (Gamma*dKcorDcepr(k,l,i,j)*N(k,l)+ Gamma*KS(k,l)*(DdevNDCepr(k,l,i,j)+_I(k,l)*DtrNDCepr(i,j)/3.));
+            }
+          }
+        }
+      }
+      STensorOperation::multSTensor3STensor43(DirrEnergDCepr,CeprToF,DirrEnergDF);
+    }
+    else{
+      DirrEnergDF *= 0.;
+    }
   };
-
 };
 
-void mlawPowerYieldHyper::predictorCorrector_associatedFlow(const STensor3& F, const IPHyperelastic *q0, IPHyperelastic *q1,
-                            STensor3&P, const bool stiff, STensor43& Tangent) const{
 
+void mlawPowerYieldHyper::predictorCorrector_associatedFlow(const STensor3& F, const IPHyperViscoElastoPlastic *q0, IPHyperViscoElastoPlastic *q1,
+                            STensor3&P, const bool stiff, STensor43& Tangent, STensor43& dFedF, STensor43& dFpdF) const{
   /* compute elastic predictor */
   STensor3& Fp1 = q1->_Fp;
   const STensor3& Fp0 = q0->_Fp;
@@ -4994,40 +1112,51 @@ void mlawPowerYieldHyper::predictorCorrector_associatedFlow(const STensor3& F, c
   q1->_epspCompression = q0->_epspCompression;
   q1->_epspTraction = q0->_epspTraction;
   q1->_epspShear = q0->_epspShear;
-
+  q1->_backsig = q0->_backsig; // backstress tensor
+  q1->_DgammaDt = 0.; // plastic rate --> failure
+  
+  static STensor3 Fpinv, Ce, Fepr;
+  STensorOperation::inverseSTensor3(Fp1,Fpinv);
+  STensorOperation::multSTensor3(F,Fpinv,Fepr);
+  STensorOperation::multSTensor3FirstTranspose(Fepr,Fepr,Ce);
+  
+  static STensor3 invFp0; // plastic predictor 
+  invFp0= Fpinv;
   STensor3& Fe = q1->_Fe;
-
-  STensor3 Fpinv, Ce;
-  inverseSTensor3(Fp1,Fpinv);
-  multSTensor3(F,Fpinv,Fe);
-  multSTensor3FirstTranspose(Fe,Fe,Ce);
-
+  Fe = Fepr;
+  
+  static STensor43 DlnDCepr, DlnDCe;
+  static STensor63 DDlnDDCe;
+  static STensor43 dexpAdA; // estimation of dexpA/dA
+  
   STensor3& Ee = q1->_Ee;
-  STensor43 Lpr;
-  STensor63 dLpr;
-  logSTensor3(Ce,Ee,&Lpr,&dLpr);
+  STensorOperation::logSTensor3(Ce,_order,Ee,&DlnDCepr,&DDlnDDCe);
   Ee *= 0.5;
-
-  STensor43 Epr; // estimation of dexpA/dA
-
-  STensor3 devKpr; // dev corotational kirchoff stress predictor
-  double ppr; // pressure predictor
-  this->corStress(Ee,devKpr,ppr);
+  DlnDCe = DlnDCepr;
+  
+  // update A, B
+  double Ge, Ke;
+  viscoElasticPredictor(Ee,q0->_Ee,q0,q1,Ke,Ge);
+  
+  static STensor3 devKpr; // dev corotational kirchoff stress predictor
+  static double ppr; // pressure predictor
+  
+  STensorOperation::decomposeDevTr(q1->_kirchhoff,devKpr,ppr);
+  ppr /= 3.;
   double keqpr = sqrt(1.5*devKpr.dotprod());
 
-  STensor3 devK = devKpr;  // dev corotational kirchoff stress
+  static STensor3 devK;
+  devK= devKpr;  // dev corotational kirchoff stress
   double p = ppr; // pressure
 
-
    // hardening
   this->hardening(q1);
   fullVector<double> a(3), Da(3); // yield coefficients and derivatives in respect to plastic deformation
   this->getYieldCoefficients(q1,a);
 
-
-  STensor3 devN(0); // dev part of yield normal
-  double trN=0;; // trace part of yield normal
-  STensor3 N(0.); // yield normal
+  static STensor3 devN; // dev part of yield normal
+  static double trN;; // trace part of yield normal
+  static STensor3 N; // yield normal
 
 
   double sigVM = keqpr;
@@ -5038,13 +1167,13 @@ void mlawPowerYieldHyper::predictorCorrector_associatedFlow(const STensor3& F, c
   double z = a(1)/a(2)*pow(sigVM,1.-_n);
   double A = sqrt(1.5+1.*z*z/(3.*_n*_n));
 
-  fullMatrix<double> invJ(2,2); // inversed jacobian
+  static fullMatrix<double> invJ(2,2); // inversed jacobian
   invJ.setAll(0.);
 
   double dAdz =0.;
   double dzdDgamma = 0.;
   double dzdsigVM = 0.;
-  double dg0dsigVM = -1./(3.*_mu);
+  double dg0dsigVM = -1./(3.*Ge);
 
   double f = a(2)*pow(sigVM,_n) - (a(1)*ppr+a(0));
   if (f>0){
@@ -5060,7 +1189,7 @@ void mlawPowerYieldHyper::predictorCorrector_associatedFlow(const STensor3& F, c
     fullVector<double> R(2); // residual of eqs to estimate Dgamma, Dpression and Gamma
 
     R(0) = Dgamma - g0*A;
-    R(1) = a(2)*pow(sigVM,_n) - a(1)*(ppr+_K*z*g0/_n) - a(0);
+    R(1) = a(2)*pow(sigVM,_n) - a(1)*(ppr+Ke*z*g0/_n) - a(0);
 
     double res = R.norm();
 
@@ -5080,8 +1209,8 @@ void mlawPowerYieldHyper::predictorCorrector_associatedFlow(const STensor3& F, c
       J(0,0) = 1. - g0*dAdz*dzdDgamma;
       J(0,1) = -dg0dsigVM*A-g0*dAdz*dzdsigVM;
 
-      J(1,0) =  Da(2)*pow(sigVM,_n) - Da(1)*(ppr+_K*z*g0/_n) - Da(0) - a(1)*_K*dzdDgamma*g0/_n;
-      J(1,1) = a(2)*_n*pow(sigVM,_n-1) - a(1)*_K/_n*(dzdsigVM*g0+z*dg0dsigVM);
+      J(1,0) =  Da(2)*pow(sigVM,_n) - Da(1)*(ppr+Ke*z*g0/_n) - Da(0) - a(1)*Ke*dzdDgamma*g0/_n;
+      J(1,1) = a(2)*_n*pow(sigVM,_n-1) - a(1)*Ke/_n*(dzdsigVM*g0+z*dg0dsigVM);
 
 
 
@@ -5117,12 +1246,12 @@ void mlawPowerYieldHyper::predictorCorrector_associatedFlow(const STensor3& F, c
       this->hardening(q1);
       this->getYieldCoefficients(q1,a);
 
-      g0 = (keqpr- sigVM)/(3.*_mu);
+      g0 = (keqpr- sigVM)/(3.*Ge);
       z = a(1)/a(2)*pow(sigVM,1.-_n);
       A = kk*sqrt(1.5+1.*z*z/(3.*_n*_n));
 
       R(0) = Dgamma - g0*A;
-      R(1) = a(2)*pow(sigVM,_n) - a(1)*(ppr+_K*z*g0/_n) - a(0);
+      R(1) = a(2)*pow(sigVM,_n) - a(1)*(ppr+Ke*z*g0/_n) - a(0);
 
       res = R.norm();
 
@@ -5139,10 +1268,10 @@ void mlawPowerYieldHyper::predictorCorrector_associatedFlow(const STensor3& F, c
     Gamma = z*g0/(_n*a(1));
 
     // update
-    p += _K*Gamma*a(1);
+    p += Ke*Gamma*a(1);
 
     double ff =a(2)*_n*pow(sigVM,_n-2.);
-    devK*= 1./(1.+3.*_mu*Gamma*ff);
+    devK*= 1./(1.+3.*Ge*Gamma*ff);
 
     // estimate yield normal
     devN = devK;
@@ -5155,22 +1284,25 @@ void mlawPowerYieldHyper::predictorCorrector_associatedFlow(const STensor3& F, c
     N(2,2) += trN/3.;
 
     // estimate exp(GammaN)
-    STensor3 expGN(0.);
-    STensor3 GammaN = N;
+    static STensor3 expGN;
+    static STensor3 GammaN;
+    GammaN = N;
     GammaN *= Gamma;
-    expSTensor3(GammaN,expGN,&Epr);
+    STensorOperation::expSTensor3(GammaN,_order,expGN,&dexpAdA);
 
     // update plastic deformation tensor
-    multSTensor3(expGN,Fp0,Fp1);
+    STensorOperation::multSTensor3(expGN,Fp0,Fp1);
     // update IP
     updateEqPlasticDeformation(q1,q0,q1->_nup,Dgamma);
 
     // update elastic deformation tensor, corotational stress
-    inverseSTensor3(Fp1,Fpinv);
-    multSTensor3(F,Fpinv,Fe);
-    multSTensor3FirstTranspose(Fe,Fe,Ce);
-    logSTensor3(Ce,Ee,&Lpr,&dLpr);
+    STensorOperation::inverseSTensor3(Fp1,Fpinv);
+    STensorOperation::multSTensor3(F,Fpinv,Fe);
+    STensorOperation::multSTensor3FirstTranspose(Fe,Fe,Ce);
+    STensorOperation::logSTensor3(Ce,_order,Ee,&DlnDCe,&DDlnDDCe);
     Ee *= 0.5;
+    
+    updateViscoElasticFlow(q0,q1,Ke,Ge);
   }
 
 
@@ -5188,7 +1320,7 @@ void mlawPowerYieldHyper::predictorCorrector_associatedFlow(const STensor3& F, c
     for(int j=0; j<3; j++)
       for(int k=0; k<3; k++)
         for(int l=0; l<3; l++)
-          S(i,j)+= KS(k,l)*Lpr(k,l,i,j);
+          S(i,j)+= KS(k,l)*DlnDCe(k,l,i,j);
 
   P*= 0.;
   for(int i=0; i<3; i++)
@@ -5197,62 +1329,65 @@ void mlawPowerYieldHyper::predictorCorrector_associatedFlow(const STensor3& F, c
         for(int l=0; l<3; l++)
           P(i,j) += Fe(i,k)*S(k,l)*Fpinv(j,l);
 
+  // defo energy
   q1->_elasticEnergy=deformationEnergy(Ce);
-  q1->_J = determinantSTensor3(F);
-  q1->_Je = determinantSTensor3(Fe);
-  q1->_Jp = determinantSTensor3(Fp1);
+  
+  // dissipation
+  double& irrEnerg = q1->getRefToIrreversibleEnergy();
+  irrEnerg = q0->irreversibleEnergy();
+  if (Dgamma > 0){
+    double dotKSN = dot(KS,N);
+    irrEnerg += Gamma*dotKSN;
+  }
 
   if (stiff){
-    STensor3 DpprDCepr;
-    STensor43 DdevKprDCepr;
-
-    getDCorStressDCepr(Lpr,DpprDCepr,DdevKprDCepr);
-
-    STensor3 invFp0 = Fp0.invert();
-    STensor43& DKcorDF = q1->_DKcorDF;
-    DKcorDF *= (0.);
-
-    STensor3 DgamaDCepr(0.), DsigVMDCepr(0.) ;
-    STensor3 DGDCepr(0.);
-
-    STensor43& dFpdF = q1->_DFpDF;
-    STensor3& dgammadF = q1->_DgammaDF;
-    STensor43& dFedF = q1->_DFeDF;
-    STensor3& DpDF = q1->_DpcorDF;
-    STensor43& DdevKDF = q1->_DdevKcorDF;
-
-    dFpdF *= 0.;
-    dgammadF*= 0.;
-    dFedF *= 0;
-    DpDF *= 0.;
-    DdevKDF *= 0.;
-
-     if (Dgamma > 0.){
-      STensor3 dg0dCepr(0.);
+    static STensor3 DpprDCepr;
+    static STensor43 DdevKprDCepr;
+    STensorOperation::multSTensor3STensor43(_I,DlnDCepr,DpprDCepr);
+    DpprDCepr*= (0.5*Ke);
+    STensorOperation::multSTensor43(_Idev,DlnDCepr,DdevKprDCepr);
+    DdevKprDCepr*= Ge;
+    
+    static STensor3 DpDCepr;
+    static STensor43 DdevKDCepr;
+    DpDCepr = DpprDCepr;
+    DdevKDCepr = DdevKprDCepr;
+    
+    static STensor43 dFpDCepr;
+    static STensor3 DgamaDCepr;
+    static STensor3 DGDCepr;
+    static STensor3 DtrNDCepr;
+    static STensor43 DdevNDCepr;
+    if (Dgamma > 0.){
+      static STensor3 dg0dCepr;
       for (int i=0; i<3; i++)
-        for (int j=0; j<3; j++)
+        for (int j=0; j<3; j++){
+          dg0dCepr(i,j) = 0.;
           for (int k=0; k<3; k++)
             for (int l=0; l<3; l++)
-              dg0dCepr(i,j) += devKpr(k,l)*DdevKprDCepr(k,l,i,j)/(2.*_mu*keqpr);
+              dg0dCepr(i,j) += devKpr(k,l)*DdevKprDCepr(k,l,i,j)/(2.*Ge*keqpr);
+              
+        }
 
-      STensor3 DPhigammaDCepr(dg0dCepr);
+      static STensor3 DPhigammaDCepr;
+      DPhigammaDCepr = dg0dCepr;
       DPhigammaDCepr *= -A;
 
 
-      STensor3 DPhiSigVMDCepr(dg0dCepr);
-      DPhiSigVMDCepr *= _K*z/_n;
+      static STensor3 DPhiSigVMDCepr;
+      DPhiSigVMDCepr = (dg0dCepr);
+      DPhiSigVMDCepr *= Ke*z/_n;
       DPhiSigVMDCepr += DpprDCepr;
       DPhiSigVMDCepr *= -a(1);
 
-
-
+      static STensor3 DsigVMDCepr;
       for (int i=0; i<3; i++)
         for (int j=0; j<3; j++){
           DgamaDCepr(i,j) = -invJ(0,0)*DPhigammaDCepr(i,j) - invJ(0,1)*DPhiSigVMDCepr(i,j);
           DsigVMDCepr(i,j) = -invJ(1,0)*DPhigammaDCepr(i,j) - invJ(1,1)*DPhiSigVMDCepr(i,j);
         }
 
-
+      
       for (int i=0; i<3; i++)
         for (int j=0; j<3; j++){
           DGDCepr(i,j) = (g0/(_n*a(1)))*(dzdDgamma*DgamaDCepr(i,j)+dzdsigVM*DsigVMDCepr(i,j)) +
@@ -5260,18 +1395,21 @@ void mlawPowerYieldHyper::predictorCorrector_associatedFlow(const STensor3& F, c
         }
 
 
-      STensor3 DtrNDCepr(DgamaDCepr);
+      
+      DtrNDCepr = (DgamaDCepr);
       DtrNDCepr  *= -Da(1);
 
-      STensor43 DdevNDCepr(DdevKprDCepr);
+     
+      DdevNDCepr = (DdevKprDCepr);
       double B = a(2)*pow(sigVM,_n-2.);
-      double u = 1.+3.*_mu*Gamma*_n*B;
+      double u = 1.+3.*Ge*Gamma*_n*B;
       double u2 = u*u;
-      STensor3 DdevNDB(devKpr);
+      static STensor3 DdevNDB;
+      DdevNDB = (devKpr);
       DdevNDB *= (1.5*_n/u2);
-      STensor3 DdevNDGamma(devKpr);
-      DdevNDGamma *= (-1.5*_n*B*3.*_mu*_n*B/u2);
-
+      static STensor3 DdevNDGamma;
+      DdevNDGamma = (devKpr);
+      DdevNDGamma *= (-1.5*_n*B*3.*Ge*_n*B/u2);
 
       DdevNDCepr *= (1.5*_n*B/u);
       for (int i=0; i<3; i++)
@@ -5286,165 +1424,141 @@ void mlawPowerYieldHyper::predictorCorrector_associatedFlow(const STensor3& F, c
 
 
       // compute dFpdF
-      STensor43 temp1(0.);
+      static STensor43 temp1;
       for (int i=0; i<3; i++)
         for (int j=0; j<3; j++)
           for (int k=0; k<3; k++)
             for (int l=0; l<3; l++)
               temp1(i,j,k,l) = N(i,j)*DGDCepr(k,l)+ Gamma*DdevNDCepr(i,j,k,l)+ Gamma/3.*_I(i,j)*DtrNDCepr(k,l);
 
-      STensor43 EprFp0(0.);
+      static STensor43 EprFp0;
       for (int i=0; i<3; i++)
         for (int j=0; j<3; j++)
           for (int k=0; k<3; k++)
             for (int l=0; l<3; l++){
-                for (int s=0; s<3; s++){
-                  EprFp0(i,j,k,l) += Epr(i,s,k,l)*Fp0(s,j);
-                }
+              EprFp0(i,j,k,l) = 0.;
+              for (int s=0; s<3; s++){
+                EprFp0(i,j,k,l) += dexpAdA(i,s,k,l)*Fp0(s,j);
               }
+            }
 
-      STensor43 dFpDCepr(0.);
-      multSTensor43(EprFp0,temp1,dFpDCepr);
-      // compute dFpDC
-      STensor43 dFpdC(0.);
-      for (int i=0; i<3; i++)
-        for (int j=0; j<3; j++)
-          for (int k=0; k<3; k++)
-            for (int l=0; l<3; l++)
-              for (int p=0; p<3; p++)
-                for (int q=0; q<3; q++)
-                  dFpdC(i,j,k,l) += dFpDCepr(i,j,p,q)*invFp0(k,p)*invFp0(l,q);
-
-      // compute dFpDF
-      for (int i=0; i<3; i++)
-        for (int j=0; j<3; j++)
-          for (int k=0; k<3; k++)
-            for (int l=0; l<3; l++)
-              for (int p=0; p<3; p++)
-                for (int q=0; q<3; q++)
-                  dFpdF(i,j,k,l) += dFpdC(i,j,p,q)*(F(k,p)*_I(q,l)+F(k,q)*_I(p,l));
+      STensorOperation::multSTensor43(EprFp0,temp1,dFpDCepr);
 
-      STensor3 DpDCepr(DpprDCepr);
-      STensor43 DdevKDCepr(DdevKprDCepr);
       for (int i=0; i<3; i++){
         for (int j=0; j<3; j++){
-          DpDCepr(i,j) -= _K*(DGDCepr(i,j)*trN+Gamma*DtrNDCepr(i,j));
+          DpDCepr(i,j) -= Ke*(DGDCepr(i,j)*trN+Gamma*DtrNDCepr(i,j));
           for (int k=0; k<3; k++){
             for (int l=0; l<3; l++){
-              DdevKDCepr(i,j,k,l) -=  2.*_mu*(DGDCepr(k,l)*devN(i,j)+Gamma*DdevNDCepr(i,j,k,l));
+              DdevKDCepr(i,j,k,l) -=  2.*Ge*(DGDCepr(k,l)*devN(i,j)+Gamma*DdevNDCepr(i,j,k,l));
             }
           }
         }
       }
-
-      STensor3 DpDC(0.);
-      for (int k=0; k<3; k++)
-        for (int l=0; l<3; l++)
-          for (int p=0; p<3; p++)
-            for (int q=0; q<3; q++)
-              DpDC(k,l) += DpDCepr(p,q)*invFp0(k,p)*invFp0(l,q);
-
-      for (int k=0; k<3; k++)
-        for (int l=0; l<3; l++)
-          for (int p=0; p<3; p++)
-            for (int q=0; q<3; q++)
-              DpDF(k,l) += DpDC(p,q)*(F(k,p)*_I(q,l)+F(k,q)*_I(p,l));
-
-
-      STensor43 DdevKDC(0.);
-      for (int i=0; i<3; i++)
-        for (int j=0; j<3; j++)
-          for (int k=0; k<3; k++)
-            for (int l=0; l<3; l++)
-              for (int p=0; p<3; p++)
-                for (int q=0; q<3; q++)
-                  DdevKDC(i,j,k,l) += DdevKDCepr(i,j,p,q)*invFp0(k,p)*invFp0(l,q);
-
-
-      for (int i=0; i<3; i++)
-          for (int j=0; j<3; j++)
-            for (int k=0; k<3; k++)
-              for (int l=0; l<3; l++)
-                for (int p=0; p<3; p++)
-                  for (int q=0; q<3; q++)
-                    DdevKDF(i,j,k,l) += DdevKDC(i,j,p,q)*(F(k,p)*_I(q,l)+F(k,q)*_I(p,l));
-
-      for (int m=0; m<3; m++)
-        for (int n=0; n<3; n++)
-          for (int p=0; p<3; p++)
-            for (int q=0; q<3; q++)
-              DKcorDF(m,n,p,q) = _I(m,n)*DpDF(p,q)+ DdevKDF(m,n,p,q);
     }
     else{
-      dFpdF *= 0.;
-      computeDKcorprDF_elastic(DKcorDF,DpDF,DdevKDF,DpprDCepr,DdevKprDCepr,F, Fp0, invFp0);
+      DgamaDCepr *= 0.;
+      dFpDCepr *= 0.;
+      DGDCepr *= 0.;
+      DdevNDCepr *= 0.;
+      DtrNDCepr *= 0.;
     }
 
 
-
-    STensor3 DgamaDC(0.);
-    for (int k=0; k<3; k++)
-      for (int l=0; l<3; l++)
-        for (int p=0; p<3; p++)
-          for (int q=0; q<3; q++)
-            DgamaDC(k,l) += DgamaDCepr(p,q)*invFp0(k,p)*invFp0(l,q);
-
-    for (int k=0; k<3; k++)
-      for (int l=0; l<3; l++)
-        for (int p=0; p<3; p++)
-          for (int q=0; q<3; q++)
-            dgammadF(k,l) += DgamaDC(p,q)*(F(k,p)*_I(q,l)+F(k,q)*_I(p,l));
-
-
-    STensor43 DinvFpDF(0.); //
+    static STensor43 dKcorDcepr;
+    dKcorDcepr = DdevKDCepr;
+    for (int i=0; i<3; i++){
+      for (int j=0; j<3; j++){
+        for (int k=0; k<3; k++){
+          for (int l=0; l<3; l++){
+            dKcorDcepr(i,j,k,l) += _I(i,j)*DpDCepr(k,l);
+          }
+        }
+      }
+    }
+    
+    static STensor43 CeprToF;
+    for (int i=0; i<3; i++){
+      for (int j=0; j<3; j++){
+        for (int k=0; k<3; k++){
+          for (int l=0; l<3; l++){
+            CeprToF(i,j,k,l) = 2.*Fepr(k,i)*invFp0(j,l);
+          }
+        }
+      }
+    }
+    
+    STensor3& DgammaDF = q1->_DgammaDF;
+    static STensor43 DKcorDF;
+    
+    STensorOperation::multSTensor3STensor43(DgamaDCepr,CeprToF,DgammaDF);
+    STensorOperation::multSTensor43(dKcorDcepr,CeprToF,DKcorDF);
+    STensorOperation::multSTensor43(dFpDCepr,CeprToF,dFpdF);
+    
+    static STensor43 DinvFpDF; //
     for (int i=0; i<3; i++)
       for (int s=0; s<3; s++)
         for (int k=0; k<3; k++)
-          for (int l=0; l<3; l++)
+          for (int l=0; l<3; l++){
+            DinvFpDF(i,s,k,l) = 0.;
             for (int m=0; m<3; m++)
               for (int j=0; j<3; j++)
                 DinvFpDF(i,s,k,l) -= Fpinv(i,m)*dFpdF(m,j,k,l)*Fpinv(j,s);
+                
+          }
 
     for (int m=0; m<3; m++)
       for (int j=0; j<3; j++)
         for (int k=0; k<3; k++)
           for (int l=0; l<3; l++){
-            dFedF(m,j,k,l) += _I(m,k)*Fpinv(l,j);
+            dFedF(m,j,k,l) = _I(m,k)*Fpinv(l,j);
             for (int s=0; s<3; s++)
               dFedF(m,j,k,l) += F(m,s)*DinvFpDF(s,j,k,l);
           }
 
-    STensor43 dCeDF(0.);
-    for (int i=0; i<3; i++)
-      for (int j=0; j<3; j++)
-        for (int k=0; k<3; k++)
-          for (int l=0; l<3; l++)
-            for (int m=0; m<3; m++)
-              dCeDF(i,j,k,l) += dFedF(m,i,k,l)*Fe(m,j)+ Fe(m,i)*dFedF(m,j,k,l);
-
-
-    STensor63 dLprDF(0.);
-    for (int a=0; a<3; a++)
-      for (int b=0; b<3; b++)
-        for (int i=0; i<3; i++)
-          for (int j=0; j<3; j++)
-            for (int k=0; k<3; k++)
-              for (int l=0; l<3; l++)
-                for (int p=0; p<3; p++)
-                  for (int q=0; q<3; q++)
-                    dLprDF(a,b,i,j,k,l) += dLpr(a,b,i,j,p,q)*dCeDF(p,q,k,l);
+    static STensor63 DlnDF;
+    if (_order != 1){
+      for (int i=0; i<3; i++){
+        for (int j=0; j<3; j++){
+          for (int k=0; k<3; k++){
+            for (int l=0; l<3; l++){
+              for (int p=0; p<3; p++){
+                for (int q=0; q<3; q++){
+                  DlnDF(i,j,k,l,p,q) = 0.;
+                  for (int r=0; r<3; r++){
+                    for (int s=0; s<3; s++){
+                      for (int a=0; a<3; a++){
+                        DlnDF(i,j,k,l,p,q) += DDlnDDCe(i,j,k,l,r,s)*2.*Fe(a,r)*dFedF(a,s,p,q);
+                      }
+                    }
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+      
+    }
+    else{
+      DlnDF *= 0.;
+    }
 
 
-    STensor43 dSdF(0.);
+    static STensor43 dSdF;
     for (int i=0; i<3; i++)
       for (int j=0; j<3; j++)
         for (int k=0; k<3; k++)
-          for (int l=0; l<3; l++)
+          for (int l=0; l<3; l++){
+            dSdF(i,j,k,l) = 0.;
             for (int m=0; m<3; m++)
               for (int n=0; n<3; n++){
-                dSdF(i,j,k,l) += DKcorDF(m,n,k,l)*Lpr(m,n,i,j);
-                dSdF(i,j,k,l) += KS(m,n)*dLprDF(m,n,i,j,k,l);
+                dSdF(i,j,k,l) += DKcorDF(m,n,k,l)*DlnDCe(m,n,i,j);
+                if (_order != 1){
+                  dSdF(i,j,k,l) += KS(m,n)*DlnDF(m,n,i,j,k,l);
+                }
               }
+              
+          }
 
     for (int i=0; i<3; i++)
       for (int j=0; j<3; j++)
@@ -5459,33 +1573,53 @@ void mlawPowerYieldHyper::predictorCorrector_associatedFlow(const STensor3& F, c
               }
             }
           }
+    // irreversible energy
+    STensor3& DirrEnergDF = q1->_DirreversibleEnergyDF;
+    if (Dgamma > 0){
+      static STensor3 DirrEnergDCepr;
+      double dotKSN = dot(KS,N);
+      DirrEnergDCepr = DGDCepr;
+      DirrEnergDCepr *= dotKSN;
+      for (int i=0; i<3; i++){
+        for (int j=0; j<3; j++){
+          for (int k=0; k<3; k++){
+            for (int l=0; l<3; l++){
+              DirrEnergDCepr(i,j) += (Gamma*dKcorDcepr(k,l,i,j)*N(k,l)+ Gamma*KS(k,l)*(DdevNDCepr(k,l,i,j)+_I(k,l)*DtrNDCepr(i,j)/3.));
+            }
+          }
+        }
+      }
+      STensorOperation::multSTensor3STensor43(DirrEnergDCepr,CeprToF,DirrEnergDF);
+    }
+    else{
+      DirrEnergDF *= 0.;
+    }
   }
 };
 
-void mlawPowerYieldHyper::predictorCorrector(const STensor3& F, const IPHyperelastic *q0, IPHyperelastic *q1,
-                            STensor3&P, const bool stiff, STensor43& Tangent) const{
-  if (_Ki.size()==0 and _Gi.size() == 0){
-    // rate independent cases
-    if (_nonAssociatedFlow)
-      if(_kinematic == NULL)
-        this->predictorCorrector_nonAssociatedFlow(F,q0,q1,P,stiff,Tangent);
-      else
-        this->predictorCorrector_nonAssociatedFlow_full(F,q0,q1,P,stiff,Tangent);
-    else
-      this->predictorCorrector_associatedFlow(F,q0,q1,P,stiff,Tangent);
+void mlawPowerYieldHyper::predictorCorrector(const STensor3& F, const IPHyperViscoElastoPlastic *q0, IPHyperViscoElastoPlastic *q1,
+                            STensor3&P, const bool stiff, STensor43& Tangent,STensor43& dFedF, STensor43& dFpdF) const{
+  
+  if (_tangentByPerturbation){
+    if (_nonAssociatedFlow){
+      this->predictorCorrector_nonAssociatedFlow(F,q0,q1,P,false,Tangent,dFedF,dFpdF);
+    }
+    else{
+      this->predictorCorrector_associatedFlow(F,q0,q1,P,false,Tangent,dFedF,dFpdF);
+    }
+    
+    if (stiff){
+      tangent_full_perturbation(Tangent,dFedF,dFpdF,P,F,q0,q1);
+    }
+    
   }
   else{
-    // rate dependent cases
     if (_nonAssociatedFlow){
-      if (_viscoMethod == 0)
-        this->predictorCorrector_nonAssociatedFlow_Maxwell(F,q0,q1,P,stiff,Tangent);
-      else if (_viscoMethod == 1)
-        this->predictorCorrector_nonAssociatedFlow_VoigtKelvin(F,q0,q1,P,stiff,Tangent);
-      else
-        Msg::Fatal("this viscoelastic-viscoplastic model has not been implemented");
+      this->predictorCorrector_nonAssociatedFlow(F,q0,q1,P,stiff,Tangent,dFedF,dFpdF);
     }
-    else
-      Msg::Fatal("This is not implemeted mlawPowerYieldHyper::predictorCorrector");
+    else{
+      this->predictorCorrector_associatedFlow(F,q0,q1,P,stiff,Tangent,dFedF,dFpdF);
+    }    
   }
 };
 
@@ -5493,71 +1627,47 @@ void mlawPowerYieldHyper::predictorCorrector(const STensor3& F, const IPHyperela
 
 mlawPowerYieldHyper::mlawPowerYieldHyper(const int num,const double E,const double nu, const double rho,
                         const double tol,
-                        const bool matrixbyPerturbation, const double pert, const bool init):
-                        mlawHyperelastic(num,E,nu,rho,tol,matrixbyPerturbation,pert,init){
-  _n = 1.5;
-  _nonAssociatedFlow = false;
-  _b = 0.3;
+                        const bool matrixbyPerturbation, const double pert):
+                        mlawHyperViscoElastic(num,E,nu,rho,matrixbyPerturbation,pert),_tol(tol),
+                        _n(1.5),_nonAssociatedFlow(true),_b(0.3), _I4(1.,1.), _I(1.),
+                        _viscosity(NULL),_p(1.),_compression(NULL),_traction(NULL),_kinematic(NULL),
+                        _shear(NULL){
+  _Idev = _I4;
+   STensor3 mIon3(-1./3);
+   STensor43 mIIon3;
+   tensprod(_I,mIon3, mIIon3);
+   _Idev += mIIon3;
 };
 
-mlawPowerYieldHyper::mlawPowerYieldHyper(const int num,const double E,const double nu, const double rho,
-                        const double sy0C,const double hc,
-                        const double sy0T,const double ht,
-                        const double tol,
-                        const bool matrixbyPerturbation, const double pert, const bool init):
-                        mlawHyperelastic(num,E,nu,rho,tol,matrixbyPerturbation,pert,init){
-  _n = 1.5;
-  _nonAssociatedFlow = false;
-  _b = 0.3;
-
-  _compression = new LinearExponentialJ2IsotropicHardening(num, sy0C, hc, 0., 10.);
-  _traction = new LinearExponentialJ2IsotropicHardening(num, sy0T, ht, 0., 10.);
-};
 
-mlawPowerYieldHyper::mlawPowerYieldHyper(const int num,const double E,const double nu, const double rho,
-                      const J2IsotropicHardening &sc,
-                      const J2IsotropicHardening &st,
-                      const double tol,
-                      const bool matrixbyPerturbation, const double pert, const bool init):
-                      mlawHyperelastic(num,E,nu,rho,tol,matrixbyPerturbation,pert,init){
-  _n = 1.5;
-  _nonAssociatedFlow = false;
-  _b = 0.3;
-  _compression = sc.clone();
-  _traction = st.clone();
+mlawPowerYieldHyper::mlawPowerYieldHyper(const mlawPowerYieldHyper& src):mlawHyperViscoElastic(src),
+                        _tol(src._tol),_n(src._n),_nonAssociatedFlow(src._nonAssociatedFlow),_b(src._b),
+                          _I4(src._I4), _I(src._I), _Idev(src._Idev),_p(1.){
+  _viscosity = NULL;
+  if (src._viscosity) _viscosity = src._viscosity->clone();
+  
+  _compression = NULL;
+  if (src._compression) _compression = src._compression->clone();
+  
+  _traction = NULL;
+  if (src._traction) _traction = src._traction->clone();
+  
+  _shear = NULL;
+  if (src._shear) _shear = src._shear->clone();
+  
+  _kinematic= NULL;
+  if (src._kinematic) _kinematic = src._kinematic->clone();
 };
 
-mlawPowerYieldHyper::mlawPowerYieldHyper(const int num,const double E,const double nu, const double rho,
-                      const J2IsotropicHardening &sc,
-                      const J2IsotropicHardening &st,
-                      const kinematicHardening &sk,
-                      const double tol,
-                      const bool matrixbyPerturbation, const double pert,const bool init):
-                      mlawHyperelastic(num,E,nu,rho,tol,matrixbyPerturbation,pert,init){
-  _n = 1.5;
-  _nonAssociatedFlow = false;
-  _b = 0.3;
-  _kinematic = sk.clone();
-  _compression = sc.clone();
-  _traction = st.clone();
+mlawPowerYieldHyper::~mlawPowerYieldHyper(){
+  if (_compression) delete _compression; _compression = NULL;
+  if (_shear) delete _shear; _shear = NULL;
+  if (_traction) delete _traction; _traction = NULL;
+  if (_kinematic) delete _kinematic; _kinematic = NULL;
+  if (_viscosity) delete _viscosity; _viscosity = NULL;
 };
 
 
-mlawPowerYieldHyper::mlawPowerYieldHyper(const mlawPowerYieldHyper& src):mlawHyperelastic(src),_n(src._n),
-            _nonAssociatedFlow(src._nonAssociatedFlow), _b(src._b){};
-mlawPowerYieldHyper& mlawPowerYieldHyper::operator = (const materialLaw& src){
-  mlawHyperelastic::operator=(src);
-  const mlawPowerYieldHyper* psrc =dynamic_cast<const mlawPowerYieldHyper*>(&src);
-  if(psrc != NULL)
-  {
-    _n = psrc->_n;
-    _nonAssociatedFlow = psrc->_nonAssociatedFlow;
-    _b = psrc->_b;
-  };
-
-  return *this;
-};
-
 void mlawPowerYieldHyper::setPowerFactor(const double n) {
   _n = n;
 };
@@ -5573,40 +1683,24 @@ void mlawPowerYieldHyper::setNonAssociatedFlow(const bool flag) {
     Msg::Info("non associated flow is used");
   }
   else{
-    Msg::Info("associated flow is used");
+    Msg::Info("associated flow is used, kinematic hardening is not considered");
   }
 };
 
 void mlawPowerYieldHyper::createIPState(IPStateBase* &ips,const bool* state_,const MElement *ele, const int nbFF_, const IntPt *GP, const int gpt) const
 {
-  IPVariable* ipvi = new IPHyperelastic(_compression,_traction,_shear,_kinematic,_N);
-  IPVariable* ipv1 = new IPHyperelastic(_compression,_traction,_shear,_kinematic,_N);
-  IPVariable* ipv2 = new IPHyperelastic(_compression,_traction,_shear,_kinematic,_N);
+  IPVariable* ipvi = new IPHyperViscoElastoPlastic(_compression,_traction,_shear,_kinematic,_N);
+  IPVariable* ipv1 = new IPHyperViscoElastoPlastic(_compression,_traction,_shear,_kinematic,_N);
+  IPVariable* ipv2 = new IPHyperViscoElastoPlastic(_compression,_traction,_shear,_kinematic,_N);
   if(ips != NULL) delete ips;
   ips = new IP3State(state_,ipvi,ipv1,ipv2);
 };
 
 
 mlawPowerYieldHyperWithFailure::mlawPowerYieldHyperWithFailure(const int num,const double E,const double nu, const double rho,
-                    const double tol, const bool matrixbyPerturbation, const double pert,
-                    const bool init):mlawPowerYieldHyper(num,E,nu,rho,tol,matrixbyPerturbation,pert,init),_compFailure(NULL),_tracFailure(NULL){};
+                    const double tol, const bool matrixbyPerturbation, const double pert):
+                    mlawPowerYieldHyper(num,E,nu,rho,tol,matrixbyPerturbation,pert),_compFailure(NULL),_tracFailure(NULL){};
 
-mlawPowerYieldHyperWithFailure::mlawPowerYieldHyperWithFailure(const int num,const double E,const double nu, const double rho,
-                    const double sy0C,const double hc,
-                    const double sy0T,const double ht,
-                    const double tol, const bool matrixbyPerturbation, const double pert,const bool init):
-                    mlawPowerYieldHyper(num,E,nu,rho,sy0C,hc,sy0T,ht,tol,matrixbyPerturbation,pert,init),_compFailure(NULL),_tracFailure(NULL){};
-mlawPowerYieldHyperWithFailure::mlawPowerYieldHyperWithFailure(const int num,const double E,const double nu, const double rho,
-                  const J2IsotropicHardening &sc,
-                  const J2IsotropicHardening &st,
-                  const double tol ,const bool matrixbyPerturbation, const double pert,const bool init):
-                  mlawPowerYieldHyper(num,E,nu,rho,sc,st,tol,matrixbyPerturbation,pert,init),_compFailure(NULL),_tracFailure(NULL){};
-mlawPowerYieldHyperWithFailure::mlawPowerYieldHyperWithFailure(const int num,const double E,const double nu, const double rho,
-                  const J2IsotropicHardening &sc,
-                  const J2IsotropicHardening &st,
-                  const kinematicHardening& sk,
-                  const double tol ,const bool matrixbyPerturbation, const double pert, const bool init):
-                  mlawPowerYieldHyper(num,E,nu,rho,sc,st,sk,tol,matrixbyPerturbation,pert,init),_compFailure(NULL),_tracFailure(NULL){};
 
 
 mlawPowerYieldHyperWithFailure::mlawPowerYieldHyperWithFailure(const mlawPowerYieldHyperWithFailure& src):
@@ -5617,27 +1711,15 @@ mlawPowerYieldHyperWithFailure::mlawPowerYieldHyperWithFailure(const mlawPowerYi
     if (src._tracFailure != NULL) _tracFailure = src._tracFailure->clone();
     if (src._compFailure != NULL) _compFailure = src._compFailure->clone();
 };
-mlawPowerYieldHyperWithFailure& mlawPowerYieldHyperWithFailure::operator=(const materialLaw& src){
-  mlawPowerYieldHyper::operator=(src);
-  const mlawPowerYieldHyperWithFailure* psrc = dynamic_cast<const mlawPowerYieldHyperWithFailure*>(&src);
-  if (psrc != NULL){
-    _failurePower = psrc->_failurePower;
-    if (_tracFailure != NULL) delete _tracFailure; _tracFailure = NULL;
-    if (_compFailure != NULL) delete _compFailure; _compFailure = NULL;
-    if (psrc->_tracFailure != NULL) _tracFailure = psrc->_tracFailure->clone();
-    if (psrc->_compFailure != NULL) _compFailure = psrc->_compFailure->clone();
-  }
-  return *this;
-};
 mlawPowerYieldHyperWithFailure::~mlawPowerYieldHyperWithFailure(){
   if (_compFailure != NULL) delete _compFailure;
   if (_tracFailure != NULL) delete _tracFailure;
 };
 
 
-void mlawPowerYieldHyperWithFailure::predictorCorrector(const STensor3& F, const IPHyperelastic *q0, IPHyperelastic *q1,
-                            STensor3&P, const bool stiff, STensor43& Tangent) const{
-  mlawPowerYieldHyper::predictorCorrector(F,q0,q1,P,stiff,Tangent);
+void mlawPowerYieldHyperWithFailure::predictorCorrector(const STensor3& F, const IPHyperViscoElastoPlastic *q0, IPHyperViscoElastoPlastic *q1,
+                            STensor3&P, const bool stiff, STensor43& Tangent, STensor43& dFedF, STensor43& dFpdF) const{
+  mlawPowerYieldHyper::predictorCorrector(F,q0,q1,P,stiff,Tangent,dFedF,dFpdF);
 
   // compute failure r and DrDF
   const STensor3& K = q1->_kirchhoff;
diff --git a/NonLinearSolver/materialLaw/mlawHyperelastic.h b/NonLinearSolver/materialLaw/mlawHyperelastic.h
index 467af0c110ba3c6eb9fe360971e22c19053f5edb..1974c61bcd9ae3ce7a7cbe57f6ea5ad34b5d6c8b 100644
--- a/NonLinearSolver/materialLaw/mlawHyperelastic.h
+++ b/NonLinearSolver/materialLaw/mlawHyperelastic.h
@@ -17,6 +17,7 @@
 #include "viscosityLaw.h"
 #include "materialStrengthLaw.h"
 
+class getYieldCoefficientDerivatives;
 class mlawHyperViscoElastic : public materialLaw{
   #ifndef SWIG
   protected:
@@ -42,18 +43,14 @@ class mlawHyperViscoElastic : public materialLaw{
     std::vector<double> _gi;
     
   protected:
+    virtual double deformationEnergy(const STensor3 &C) const ;
+    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) const;
+              
     void isotropicHookTensor(const double K, const double G, STensor43& L) const;
     
-    void elastic(const IPHyperViscoElastic *q0_, IPHyperViscoElastic *q1, const bool stiff, STensor43& DsigDE) const;
-
-    void viscoelastic_Maxwell(const IPHyperViscoElastic *q0_, IPHyperViscoElastic *q1,
-                              const bool stiff, STensor43& DsigDE) const;
-
-    void viscoelastic_VoigtKelvin(const IPHyperViscoElastic *q0_, IPHyperViscoElastic *q1,
-                                  const bool stiff, STensor43& DsigDE) const;
-
-    void viscoelastic(const IPHyperViscoElastic *q0_, IPHyperViscoElastic *q1, const bool stiff, STensor43& DsigDE) const;
-    
     void predictorCorrector_ViscoElastic(const STensor3& F0, const STensor3& F, STensor3&P, const IPHyperViscoElastic *q0_, IPHyperViscoElastic *q1,
                                   const bool stiff, STensor43& Tangent) const;
     
@@ -106,108 +103,16 @@ class mlawHyperViscoElastic : public materialLaw{
     #endif // SWIG
 };
 
-class mlawHyperViscoElastoPlasticBase : public mlawHyperViscoElastic{
-  protected:
-    #ifndef SWIG
-    double _tol; // plasticity correction tolerance
-    // Perzyna rate effects
-    double _p; // exponent in rate
-    viscosityLaw* _viscosity;
-    
-    // hardening data
-    J2IsotropicHardening* _compression;
-    J2IsotropicHardening* _traction;
-    J2IsotropicHardening* _shear;
-    kinematicHardening* _kinematic;
-  
-  protected:
-    void hardening(IPHyperViscoElastoPlastic* q) const;
-    #endif
-  
-  public:
-    mlawHyperViscoElastoPlasticBase(const int num,const double E,const double nu, const double rho,
-                        const double tol = 1e-6,
-                        const bool matrixbyPerturbation = false, const double pert = 1e-8);
-    virtual void setCompressionHardening(const J2IsotropicHardening& comp);
-    virtual void setTractionHardening(const J2IsotropicHardening& trac);
-    virtual void setShearHardening(const J2IsotropicHardening& shear);
-    virtual void setKinematicHardening(const kinematicHardening& kin);
-    virtual void setViscosityEffect(const viscosityLaw& v, const double p);
-    
-    #ifndef SWIG
-    mlawHyperViscoElastoPlasticBase(const mlawHyperViscoElastoPlasticBase& src);
-    virtual ~mlawHyperViscoElastoPlasticBase();
-    virtual materialLaw* clone() const {return new mlawHyperViscoElastoPlasticBase(*this);};
-    virtual bool withEnergyDissipation() const{return true;};
-    
-    virtual J2IsotropicHardening* getConstRefToCompressionHardening() const {return _compression;};
-    virtual J2IsotropicHardening* getConstRefToTractionHardening() const{return _traction;};
-    virtual J2IsotropicHardening* getConstRefToShearHardening() const {return _shear;};
-    virtual kinematicHardening* getConstRefToKinematicHardening() const{return _kinematic;};
-    
-    #endif //SWIG
-};
-
-class mlawHyperViscoElastoPlasticPowerYield : public mlawHyperViscoElastoPlasticBase{
-  #ifndef SWIG
-  protected:
-    double _n; // pow 
-    double _b; // flow coefficient g = sigVM^2+ bp^2 --> non-associated flow
-    bool _nonAssociatedFlow; // true --> g = sigVM^2+ bp^2 false -->g = f
-    
-  protected:
-    void updateEqPlasticDeformation(IPHyperViscoElastoPlastic *q1, const IPHyperViscoElastoPlastic *q0,
-                                            const double& nup, const double& Dgamma) const;
-
-    void getYieldCoefficients(const IPHyperViscoElastoPlastic *q, fullVector<double>& coeffs) const;
-    void getYieldCoefficientDerivatives(const IPHyperViscoElastoPlastic *q, const double& nup, fullVector<double>& Dcoeffs) const;
-    
-    void predictorCorrector_nonAssociatedFlow_Maxwell(const STensor3& F0, const STensor3& F, const IPHyperViscoElastoPlastic *q0_, IPHyperViscoElastoPlastic *q1,
-                            STensor3&P, const bool stiff, STensor43& Tangent) const;
-  #endif // SWIG
-  
-  public:
-    mlawHyperViscoElastoPlasticPowerYield(const int num,const double E,const double nu, const double rho,
-                        const double tol = 1.e-6,
-                        const bool matrixbyPerturbation = false, const double pert = 1e-8);
-                        
-    void setPowerFactor(const double n);
-    void nonAssociatedFlowRuleFactor(const double b);
-    void setPlasticPoissonRatio(const double nup);
-    void setNonAssociatedFlow(const bool flag);
-    #ifndef SWIG
-    mlawHyperViscoElastoPlasticPowerYield(const mlawHyperViscoElastoPlasticPowerYield& src);
-    virtual ~mlawHyperViscoElastoPlasticPowerYield(){};
-    
-    virtual materialLaw* clone() const {return new mlawHyperViscoElastoPlasticPowerYield(*this);};
-    #endif // SWIG
-  
-};
-
-class mlawHyperelastic : public materialLaw{
-  #ifndef SWIG
+// general interface for yield surface f = a2 sigVM^n - (a1*p+a0)
+// non-associated flow wit f = sigVM^2 + b* p^2
+// associated flow
+class mlawPowerYieldHyper : public mlawHyperViscoElastic{
   protected:
-    double _rho; // density
-    double _E; // young modulus
-    double _nu; // Poisson ratio
-    double _lambda; // 1st lame parameter
-    double _mu; // 2nd lame parameter (=G)
-    double _K; // bulk modulus
-    double _K3; // 3*bulk modulus
-    double _mu3; // 3*_mu = 3*G
-    double _mu2; // 2*_mu = 2*G
-
-    double _tol; // correction tolerance
-    double _perturbationfactor; // perturbation factor
-    bool _tangentByPerturbation; // flag for tangent by perturbation
-
-    STensor43 Cel; // elastic hook tensor
+    double _tol; // for plasticity convergence
     STensor43 _I4; // symetric 4th order unit tensor
     STensor3  _I; // second order tensor
     STensor43 _Idev; // dev part of _I4
 
-    int _order ; // to approximated log and exp of a tensor
-
     // rate effects
     double _p; // exponent in rate
     viscosityLaw* _viscosity;
@@ -218,327 +123,90 @@ class mlawHyperelastic : public materialLaw{
     J2IsotropicHardening* _shear;
     kinematicHardening* _kinematic;
 
-    // viscoelastic data
-    int _viscoMethod; // viscoelastic method 0- generalized Maxwell model, 1- generalized Kelvin-Voight model
-    int _N; // number of Maxwell elements
-    std::vector<double> _Ki;
-    std::vector<double> _ki;
-    std::vector<double> _Gi;
-    std::vector<double> _gi;
-
-
+    // yield surface option
+    double _n;
+    double _b; // flow coefficient g = sigVM^2+ bp^2
+    bool _nonAssociatedFlow;
+    
   protected:
-    // tensor operators
-    double tr(const STensor3& E) const;
-    void dev(const STensor3& E, STensor3& devE, double& trE) const;
+    
+    virtual void hardening(IPHyperViscoElastoPlastic* q) const;
+    
+     virtual void updateEqPlasticDeformation(IPHyperViscoElastoPlastic *q1, const IPHyperViscoElastoPlastic *q0,
+                                            const double& nup, const double& Dgamma) const;
 
-    void logSTensor3(const STensor3& a, STensor3 &loga, STensor43 *dloga=NULL, STensor63* ddloga = NULL) const;
-    void expSTensor3(const STensor3 &a,STensor3 &expa,STensor43 *dexpa=NULL) const;
+    virtual void getYieldCoefficients(const IPHyperViscoElastoPlastic *q, fullVector<double>& coeffs) const;
+    virtual void getYieldCoefficientDerivatives(const IPHyperViscoElastoPlastic *q, const double& nup, fullVector<double>& Dcoeffs) const;
 
-    double determinantSTensor3(const STensor3 &a) const;
-    void inverseSTensor3(const STensor3 &a, STensor3 &ainv) const;
-    void multSTensor3(const STensor3 &a, const STensor3 &b, STensor3 &c) const;
-    void multSTensor3FirstTranspose(const STensor3 &A, const STensor3 &B, STensor3 &C) const;
-    void multSTensor3SecondTranspose(const STensor3 &a, const STensor3 &b, STensor3 &c) const;
-    void multSTensor43STensor3(const STensor43 &t, const STensor3 &m,STensor3 &val) const;
-    void multSTensor3STensor43(const STensor3 &m, const STensor43 &t,STensor3 &val) const;
-    void multSTensor43(const STensor43 &a, const STensor43 &b, STensor43 &c) const;
 
-  private:
-     virtual void predictorCorrector_elastic(const STensor3& F,
-                            const IPHyperelastic *q0_, IPHyperelastic *q1,
-                            STensor3&P, const bool stiff, STensor43& Tangent) const;
+  #ifndef SWIG
+  protected:
 
-    virtual void predictorCorrector_viscoelastic_Maxwell(const STensor3& F, const IPHyperelastic *q0_, IPHyperelastic *q1,
-                            STensor3&P, const bool stiff, STensor43& Tangent) const;
+    virtual void predictorCorrector_nonAssociatedFlow(const STensor3& F, const IPHyperViscoElastoPlastic *q0_, IPHyperViscoElastoPlastic *q1,
+                            STensor3&P, const bool stiff, STensor43& Tangent,  STensor43& dFedF, STensor43& dFpdF) const;
 
-    virtual void predictorCorrector_viscoelastic_VoigtKelvin(const STensor3& F, const IPHyperelastic *q0_, IPHyperelastic *q1,
-                            STensor3&P, const bool stiff, STensor43& Tangent) const;
+    virtual void predictorCorrector_associatedFlow(const STensor3& F, const IPHyperViscoElastoPlastic *q0_, IPHyperViscoElastoPlastic *q1,
+                            STensor3&P, const bool stiff, STensor43& Tangent, STensor43& dFedF, STensor43& dFpdF) const;
 
   protected:
-    virtual double deformationEnergy(const STensor3 &C) const ;
-    virtual void corStress(const STensor3& Ee, STensor3& devK, double& p) const;
-    virtual void getDCorStressDCepr(const STensor43& Lpr, STensor3& DpprDCepr, STensor43& DdevKprDCepr) const;
-    virtual void computeDKcorprDF_elastic(STensor43& DKcorDF, STensor3& DpDF, STensor43& DdevKDF,
-                          const STensor3& DpprDCepr, const STensor43& DdevKprDCepr,
-                          const STensor3& F, const STensor3& Fp0, const STensor3& invFp0) const;
-    virtual void hardening(IPHyperelastic* q) const;
-    virtual void predictorCorrector(const STensor3& F,const IPHyperelastic *q0, IPHyperelastic *q1,
-                            STensor3&P, const bool stiff, STensor43& Tangent) const;
-
+   
 
+    virtual void predictorCorrector(const STensor3& F, const IPHyperViscoElastoPlastic *q0_, IPHyperViscoElastoPlastic *q1,
+                            STensor3&P, const bool stiff, STensor43& Tangent, STensor43& dFedF, STensor43& dFpdF) const;
     virtual void tangent_full_perturbation( // compute tangent by perturbation
                              STensor43 &T, // current tangent
+                             STensor43& dFedF, 
+                             STensor43& dFpdF,
                              const STensor3 &P, // current PK stress
                              const STensor3 &F, // current deformation gradient
-                             const IPHyperelastic* q0, // previous internal variables
-                             IPHyperelastic* q1 // current internal variables
+                             const IPHyperViscoElastoPlastic* q0, // previous internal variables
+                             IPHyperViscoElastoPlastic* q1 // current internal variables
                            ) const;
-  #endif // SWIG
-
-  public:
-    mlawHyperelastic(const int num,const double E,const double nu, const double rho,
-                        const double tol = 1.e-6,
-                        const bool matrixbyPerturbation = false, const double pert = 1e-8,
-                        const bool init = true);
-    virtual void setCompressionHardening(const J2IsotropicHardening& comp);
-    virtual void setTractionHardening(const J2IsotropicHardening& trac);
-    virtual void setShearHardening(const J2IsotropicHardening& shear);
-    virtual void setKinematicHardening(const kinematicHardening& kin);
-    virtual void setViscosityEffect(const viscosityLaw& v, const double p);
-    virtual void setStrainOrder(const int order);
-
-    virtual void setViscoelasticMethod(const int method);
-    virtual void setViscoElasticNumberOfElement(const int N);
-    virtual void setViscoElasticData(const int i, const double Ei, const double taui);
-    virtual void setViscoElasticData_Bulk(const int i, const double Ki, const double ki);
-    virtual void setViscoElasticData_Shear(const int i, const double Gi, const double gi);
-    virtual void setViscoElasticData(const std::string filename);
-
-    #ifndef SWIG
-    mlawHyperelastic(const mlawHyperelastic& src);
-    virtual mlawHyperelastic& operator = (const materialLaw& src);
-    virtual ~mlawHyperelastic();
-
-    virtual matname getType() const{return materialLaw::hyperelastic;}
-    virtual void createIPState(IPStateBase* &ips,const bool* state_=NULL,const MElement *ele=NULL, const int nbFF_=0, const IntPt *GP=NULL, const int gpt = 0) const;
-    virtual void initLaws(const std::map<int,materialLaw*> &maplaw){}; // this law is initialized so nothing to do
-
-    virtual materialLaw* clone() const {return new mlawHyperelastic(*this);};
-    virtual bool withEnergyDissipation() const {return false;};
-    virtual int getViscoElasticNumberOfElement() const{return _N;};
-
-    virtual double soundSpeed() const; // default but you can redefine it for your case
-    virtual double density()const{return _rho;}
-    virtual const double bulkModulus() const{return _K;}
-    virtual const double shearModulus() const{return _mu;}
-    virtual const double poissonRatio() const{return _nu;}
-
-    virtual double scaleFactor() const { return _mu;};
-
-    virtual J2IsotropicHardening* getConstRefToCompressionHardening() const {return _compression;};
-    virtual J2IsotropicHardening* getConstRefToTractionHardening() const{return _traction;};
-    virtual J2IsotropicHardening* getConstRefToShearHardening() const {return _shear;};
-    virtual kinematicHardening* getConstRefToKinematicHardening() const{return _kinematic;};
-
-
-    virtual void constitutive(
-            const STensor3& F0,         // initial deformation gradient (input @ time n)
-            const STensor3& Fn,         // updated deformation gradient (input @ time n+1)
-            STensor3 &P,                // updated 1st Piola-Kirchhoff stress tensor (output)
-            const IPHyperelastic *q0,       // array of initial internal variable
-            IPHyperelastic *q1,             // updated array of internal variable (in ipvcur on output),
-            STensor43 &Tangent,         // constitutive tangents (output)
-            const bool stiff          // if true compute the tangents
-           ) const;
-
-  #endif // SWIG
-
-};
-
-/*
-general material interface with yield function f = sigVM^2 - (a2*p^2+a1*p +a0)
-with quadratic flow potential g = sigVM^2 - (b2*p^2+b1*p), three are three types:
-Type 1) Associated flow rule g = f thus b2 = a2, b1 = a1
-Type 2) Non-associated flow rule g = sigVM^2 - (a2*p^2+b1*p) with b1 = const; b2 = a2
-Type 3) Non-asscociated flow rule g = sigVM^2 - (b2*p^2+b1*p) with b1 =const; b2 = const
-*/
-
-class mlawQuadYieldHyper :public mlawHyperelastic{
-  #ifndef SWIG
-  protected:
-    double _yield0;
-    double _yield02; // reference value for yield surface --> non-dimension value
-
-    int _flowType; // specify flow type = 1, 2, 3
-    double _b2, _b1; // flow rule in case non-associated type
-    // specify yield surface used
-    // Type 1 = two-yield surface with paraboloidal surface--> a2 = 0 ,  f = sigVM^2 - (a1*p +a0)
-    // Type 2 = two-yield surface with generalized Drucker-Prager surface,
-    //          a2 = A^2, a1 = 2AB, a0 = B^2-->f = sigVM^2 - (A*p +B)^2
-    // Type 3= three-yield surface with quadratic form f = sigVM^2 - (a2*p^2+a1*p +a0)
-    int _yieldType;
-
-
-
-  protected:
-    void computeResidual(const double& keqpr2, const double& ppr,
-                          const fullVector<double>& unknowns,
-                          const fullVector<double>& coeffs,
-                          const fullVector<double>& flowCoeffs,
-                          fullVector<double>& res) const;
-    void computeJacobian(const double& keq2pr, const double& ppr,
-                          const fullVector<double>& unknowns,
-                          const fullVector<double>& coeffs,
-                          const fullVector<double>& Dcoeffs,
-                          const fullVector<double>& flowCoeffs,
-                          const fullVector<double>& DflowCoeffs,
-                          fullMatrix<double>& J) const;
-
-    void computeDResidualDCepr(const STensor3& devKpr, const double& ppr,
-                          const double & Dgamma, const double& Dpression,const double Gamma,
-                          const fullVector<double>& coeffs,
-                          const fullVector<double>& flowCoeffs,
-                          const STensor3& DpprDCepr, const STensor43& DdevKprDCepr,
-                          STensor3& DPhigammaDCepr, STensor3& DPhipDCepr, STensor3&  DPhiGDCepr) const;
-
-    void computedFpdF(STensor43& dFpdF, STensor43& DKcorDF,
-                          const STensor3& devKpr, const double& ppr,
-                          const STensor3& DpprDCepr, const STensor43& DdevKprDCepr,
-                          const STensor3& DgamaDCepr, const STensor3& DDpDCepr,const STensor3& DGDCepr,
-                          const double& Dgamma, const double& Dpression, const double& Gamma,
-                          const STensor3& N, const STensor3& devN, const double& trN,
-                          const STensor3& F, const STensor3& Fp0, const STensor3& invFp0, const STensor43& Epr) const;
-
-  protected:
-    virtual void getYieldCoefficients(const IPHyperelastic *q, fullVector<double>& coeffs) const;
-    virtual void getYieldCoefficientDerivatives(const IPHyperelastic *q, const double& nup, fullVector<double>& Dcoeffs) const;
-    virtual void getFlowPotentialCoefficients(const fullVector<double>& coeffs,
-                                              fullVector<double>& flowCoeffs) const;
-    virtual void getFlowPotentialCoefficientDerivatives(const fullVector<double>& Dcoeffs,
-                                              fullVector<double>& DflowCoeffs) const;
-    virtual double getPlasticPoissonRatio(const fullVector<double>& flowCoeffs, const double & ppr, const double &Dpression) const;
-    virtual void updateEqPlasticDeformation(IPHyperelastic *q1, const IPHyperelastic *q0,
-                                            const double& nup, const double& Dgamma) const;
-
-    virtual void predictorCorrector(const STensor3& F,const IPHyperelastic *q0_, IPHyperelastic *q1,
-                            STensor3&P, const bool stiff, STensor43& Tangent) const;
-  #endif // SWIG
-  public:
-
-    mlawQuadYieldHyper(const int num,const double E,const double nu, const double rho,
-                        const double tol = 1.e-6,
-                        const bool matrixbyPerturbation = false, const double pert = 1e-8,
-                        const bool init = true);
-
-    mlawQuadYieldHyper(const int num,const double E,const double nu, const double rho,
-                        const double sy0C,const double hc,
-                        const double sy0T,const double ht,
-                        const double tol = 1.e-6,
-                        const bool matrixbyPerturbation = false, const double pert = 1e-8,
-                         const bool init = true);
-
-    mlawQuadYieldHyper(const int num,const double E,const double nu, const double rho,
-                      const J2IsotropicHardening &sc,
-                      const J2IsotropicHardening &st,
-                      const double tol = 1.e-6,
-                      const bool matrixbyPerturbation = false, const double pert = 1e-8,
-                      const bool init = true);
-
-    mlawQuadYieldHyper(const int num,const double E,const double nu, const double rho,
-                      const double sy0C,const double hc,
-                      const double sy0T,const double ht,
-                      const double sy0S,const double hs,
-                      const double tol = 1.e-6,
-                      const bool matrixbyPerturbation = false, const double pert = 1e-8,
-                       const bool init = true);
-
-    mlawQuadYieldHyper(const int num,const double E,const double nu, const double rho,
-                      const J2IsotropicHardening &sc,
-                      const J2IsotropicHardening &st,
-                      const J2IsotropicHardening &ss,
-                      const double tol = 1.e-6,
-                      const bool matrixbyPerturbation = false, const double pert = 1e-8,
-                      const bool init = true);
-
-    void nonAssociatedFlowRuleFactor(const double b2, const double b1);
-    void setFlowPotentialType(const int type);
-    void setYieldSurfaceType(const int type);
-
-
-    #ifndef SWIG
-    mlawQuadYieldHyper(const mlawQuadYieldHyper& src);
-    mlawQuadYieldHyper& operator = (const materialLaw& src);
-
-    virtual ~mlawQuadYieldHyper();
-
-    virtual materialLaw* clone() const{return new mlawQuadYieldHyper(*this);};
-    virtual bool withEnergyDissipation() const {return true;};
-      // function of materialLaw
-    virtual matname getType() const{return materialLaw::quadYieldHyper;}
-    virtual void createIPState(IPStateBase* &ips,const bool* state_=NULL,const MElement *ele=NULL, const int nbFF_=0, const IntPt *GP=NULL, const int gpt = 0) const;
-    virtual void initLaws(const std::map<int,materialLaw*> &maplaw){}; // this law is initialized so nothing to do
-    #endif // SWIG
-};
-
-// general interface for yield surface f = a2 sigVM^n - (a1*p+a0)
-// non-associated flow wit f = sigVM^2 + b* p^2
-// associated flow
-class mlawPowerYieldHyper : public mlawHyperelastic{
-
-  protected:
-    double _n;
-    double _b; // flow coefficient g = sigVM^2+ bp^2
-    bool _nonAssociatedFlow;
-
-  #ifndef SWIG
-  protected:
-    virtual void predictorCorrector_nonAssociatedFlow_VoigtKelvin(const STensor3& F, const IPHyperelastic *q0_, IPHyperelastic *q1,
-                            STensor3&P, const bool stiff, STensor43& Tangent) const;
-
-    virtual void predictorCorrector_nonAssociatedFlow_Maxwell(const STensor3& F, const IPHyperelastic *q0_, IPHyperelastic *q1,
-                            STensor3&P, const bool stiff, STensor43& Tangent) const;
-
-    virtual void predictorCorrector_nonAssociatedFlow_full(const STensor3& F, const IPHyperelastic *q0_, IPHyperelastic *q1,
-                            STensor3&P, const bool stiff, STensor43& Tangent) const;
-
-    virtual void predictorCorrector_nonAssociatedFlow(const STensor3& F, const IPHyperelastic *q0_, IPHyperelastic *q1,
-                            STensor3&P, const bool stiff, STensor43& Tangent) const;
-
-    virtual void predictorCorrector_associatedFlow(const STensor3& F, const IPHyperelastic *q0_, IPHyperelastic *q1,
-                            STensor3&P, const bool stiff, STensor43& Tangent) const;
-
-  protected:
-    virtual void updateEqPlasticDeformation(IPHyperelastic *q1, const IPHyperelastic *q0,
-                                            const double& nup, const double& Dgamma) const;
-
-    virtual void getYieldCoefficients(const IPHyperelastic *q, fullVector<double>& coeffs) const;
-    virtual void getYieldCoefficientDerivatives(const IPHyperelastic *q, const double& nup, fullVector<double>& Dcoeffs) const;
-
-
-    virtual void predictorCorrector(const STensor3& F, const IPHyperelastic *q0_, IPHyperelastic *q1,
-                            STensor3&P, const bool stiff, STensor43& Tangent) const;
 
   #endif // SWIG
   public:
     mlawPowerYieldHyper(const int num,const double E,const double nu, const double rho,
                         const double tol = 1.e-6,
-                        const bool matrixbyPerturbation = false, const double pert = 1e-8,
-                        const bool init = true);
-
-    mlawPowerYieldHyper(const int num,const double E,const double nu, const double rho,
-                        const double sy0C,const double hc,
-                        const double sy0T,const double ht,
-                        const double tol = 1.e-6,
-                        const bool matrixbyPerturbation = false, const double pert = 1e-8,const bool init = true);
-    mlawPowerYieldHyper(const int num,const double E,const double nu, const double rho,
-                      const J2IsotropicHardening &sc,
-                      const J2IsotropicHardening &st,
-                      const double tol = 1.e-6,
-                      const bool matrixbyPerturbation = false, const double pert = 1e-8,const bool init = true);
-    mlawPowerYieldHyper(const int num,const double E,const double nu, const double rho,
-                      const J2IsotropicHardening &sc,
-                      const J2IsotropicHardening &st,
-                      const kinematicHardening& sk,
-                      const double tol = 1.e-6,
-                      const bool matrixbyPerturbation = false, const double pert = 1e-8,const bool init = true);
+                        const bool matrixbyPerturbation = false, const double pert = 1e-8);
 
     void setPowerFactor(const double n);
     void nonAssociatedFlowRuleFactor(const double b);
     void setPlasticPoissonRatio(const double nup);
     void setNonAssociatedFlow(const bool flag);
+    
+    void setCompressionHardening(const J2IsotropicHardening& comp);
+    void setTractionHardening(const J2IsotropicHardening& trac);
+    void setShearHardening(const J2IsotropicHardening& shear);
+    void setKinematicHardening(const kinematicHardening& kin);
+    void setViscosityEffect(const viscosityLaw& v, const double p);
 
     #ifndef SWIG
     mlawPowerYieldHyper(const mlawPowerYieldHyper& src);
-    mlawPowerYieldHyper& operator = (const materialLaw& src);
-    virtual ~mlawPowerYieldHyper(){}
+    virtual ~mlawPowerYieldHyper();
 
     virtual materialLaw* clone() const{return new mlawPowerYieldHyper(*this);};
     virtual bool withEnergyDissipation() const {return true;};
+    
+    virtual J2IsotropicHardening* getConstRefToCompressionHardening() const {return _compression;};
+    virtual J2IsotropicHardening* getConstRefToTractionHardening() const{return _traction;};
+    virtual J2IsotropicHardening* getConstRefToShearHardening() const {return _shear;};
+    virtual kinematicHardening* getConstRefToKinematicHardening() const{return _kinematic;};
+    
 
     virtual matname getType() const{return materialLaw::powerYieldLaw;}
     virtual void createIPState(IPStateBase* &ips,const bool* state_=NULL,const MElement *ele=NULL, const int nbFF_=0, const IntPt *GP=NULL, const int gpt = 0) const;
     virtual void initLaws(const std::map<int,materialLaw*> &maplaw){}; // this law is initialized so nothing to do
+    
+    virtual void constitutive(
+            const STensor3& F0,         // initial deformation gradient (input @ time n)
+            const STensor3& Fn,         // updated deformation gradient (input @ time n+1)
+            STensor3 &P,                // updated 1st Piola-Kirchhoff stress tensor (output)
+            const IPHyperViscoElastoPlastic *q0,       // array of initial internal variable
+            IPHyperViscoElastoPlastic *q1,             // updated array of internal variable (in ipvcur on output),
+            STensor43 &Tangent,         // constitutive tangents (output)
+            const bool stiff          // if true compute the tangents
+           ) const;
+           
     #endif // SWIG
 };
 
@@ -550,38 +218,21 @@ class mlawPowerYieldHyperWithFailure : public mlawPowerYieldHyper{
 
   #ifndef SWIG
   protected:
-    virtual void predictorCorrector(const STensor3& F, const IPHyperelastic *q0_, IPHyperelastic *q1,
-                            STensor3&P, const bool stiff, STensor43& Tangent) const;
+    virtual void predictorCorrector(const STensor3& F, const IPHyperViscoElastoPlastic *q0_, IPHyperViscoElastoPlastic *q1,
+                            STensor3&P, const bool stiff, STensor43& Tangent, STensor43& dFedF, STensor43& dFpdF) const;
   #endif // SWIG
   public:
     mlawPowerYieldHyperWithFailure(const int num,const double E,const double nu, const double rho,
                         const double tol = 1.e-6,
-                        const bool matrixbyPerturbation = false, const double pert = 1e-8,
-                        const bool init = true);
+                        const bool matrixbyPerturbation = false, const double pert = 1e-8);
+
 
-    mlawPowerYieldHyperWithFailure(const int num,const double E,const double nu, const double rho,
-                        const double sy0C,const double hc,
-                        const double sy0T,const double ht,
-                        const double tol = 1.e-6,
-                        const bool matrixbyPerturbation = false, const double pert = 1e-8,const bool init = true);
-    mlawPowerYieldHyperWithFailure(const int num,const double E,const double nu, const double rho,
-                      const J2IsotropicHardening &sc,
-                      const J2IsotropicHardening &st,
-                      const double tol = 1.e-6,
-                      const bool matrixbyPerturbation = false, const double pert = 1e-8,const bool init = true);
-    mlawPowerYieldHyperWithFailure(const int num,const double E,const double nu, const double rho,
-                      const J2IsotropicHardening &sc,
-                      const J2IsotropicHardening &st,
-                      const kinematicHardening& sk,
-                      const double tol = 1.e-6,
-                      const bool matrixbyPerturbation = false, const double pert = 1e-8,const bool init = true);
     void setCompressiveFailureModel(const RateFailureLaw& compStrength);
     void setTractionFailureModel(const RateFailureLaw& tracStrength);
     void setFailurePower(const double power);
 
   #ifndef SWIG
     mlawPowerYieldHyperWithFailure(const mlawPowerYieldHyperWithFailure& src);
-    mlawPowerYieldHyperWithFailure& operator=(const materialLaw& src);
     virtual ~mlawPowerYieldHyperWithFailure();
 
     virtual materialLaw* clone() const{return new mlawPowerYieldHyperWithFailure(*this);};
diff --git a/NonLinearSolver/materialLaw/mlawHyperelasticDamage.cpp b/NonLinearSolver/materialLaw/mlawHyperelasticDamage.cpp
index c05f33f6fe3048ead7db912fa8f6699703ca44f7..8823df60dd6c73fbd698c75989d10659873cbd8d 100644
--- a/NonLinearSolver/materialLaw/mlawHyperelasticDamage.cpp
+++ b/NonLinearSolver/materialLaw/mlawHyperelasticDamage.cpp
@@ -79,8 +79,8 @@ void mlawNonlocalDamageHyperelastic::constitutive(
 	_elasticLaw->getLocalValForNonLocalEquation(F,q->getRefToLocalEffectiveStrains(),stiff,&dLocalVardF);
 
 
-	if (q0->damageIsBlocked()){
-    q->blockDamage(true);
+	if (q0->dissipationIsBlocked()){
+    q->blockDissipation(true);
     q->setNonLocalToLocal(false);
     q->setCriticalDamage(q0->getCriticalDamage());
 
@@ -94,7 +94,7 @@ void mlawNonlocalDamageHyperelastic::constitutive(
   }
   else
   {
-    q->blockDamage(false);
+    q->blockDissipation(false);
 		static STensor3 Fp(1.);
 
     if (q0->getNonLocalToLocal()){
@@ -228,8 +228,8 @@ void mlawNonlocalAnisotropicDamageHyperelastic::constitutive(
 	// local strain
 	_elasticLaw->getLocalPositiveValForNonLocalEquation(F,q->getRefToLocalEffectiveStrains(),stiff,&dLocalVardF);
 
-	if (q0->damageIsBlocked()){
-    q->blockDamage(true);
+	if (q0->dissipationIsBlocked()){
+    q->blockDissipation(true);
     q->setNonLocalToLocal(false);
     q->setCriticalDamage(q0->getCriticalDamage());
 
@@ -243,7 +243,7 @@ void mlawNonlocalAnisotropicDamageHyperelastic::constitutive(
   }
   else
   {
-    q->blockDamage(false);
+    q->blockDissipation(false);
 		static STensor3 Fp(1.);
 
     if (q0->getNonLocalToLocal()){
diff --git a/NonLinearSolver/materialLaw/mlawHyperelasticDamage.h b/NonLinearSolver/materialLaw/mlawHyperelasticDamage.h
index a332a31a5b7ec81473dea6398ebd56fc3ae74078..4849a7aaaa044479d2f591ae7e12583e53d48765 100644
--- a/NonLinearSolver/materialLaw/mlawHyperelasticDamage.h
+++ b/NonLinearSolver/materialLaw/mlawHyperelasticDamage.h
@@ -33,7 +33,6 @@ class mlawNonlocalDamageHyperelastic : public materialLaw {
 
     // General functions
     virtual matname getType() const {return materialLaw::nonLocalDamageIsotropicElasticity;}
-    virtual bool withDamage() const {return true;};
     virtual bool withEnergyDissipation() const {return true;};
     virtual void createIPState(IPStateBase* &ips,const bool* state_ = NULL,const MElement *ele = NULL, const int nbFF_ = 0, const IntPt *GP=NULL, const int gpt=0) const{
 		};
diff --git a/NonLinearSolver/materialLaw/mlawJ2linear.cpp b/NonLinearSolver/materialLaw/mlawJ2linear.cpp
index 7d3cf1f659a11dff78a1dceb739a390d73c76fff..81dc8e12d58fb850ff57908cdff017e315bca351 100644
--- a/NonLinearSolver/materialLaw/mlawJ2linear.cpp
+++ b/NonLinearSolver/materialLaw/mlawJ2linear.cpp
@@ -12,6 +12,7 @@
 #include "mlawJ2linear.h"
 #include <math.h>
 #include "MInterfaceElement.h"
+#include "nonLinearMechSolver.h"
 
 // Keep this constructor for retro compatibility !
 mlawJ2linear::mlawJ2linear(const int num,const double E,const double nu,
@@ -19,8 +20,7 @@ mlawJ2linear::mlawJ2linear(const int num,const double E,const double nu,
                            const double tol, const bool pert, const double eps) : materialLaw(num,true), _E(E), _nu(nu), _rho(rho),
                                                 _lambda((E*nu)/(1.+nu)/(1.-2.*nu)),
                                                _mu(0.5*E/(1.+nu)),_K(E/3./(1.-2.*nu)), _K3(3.*_K), _mu3(3.*_mu),
-                                               _mu2(2.*_mu), _tol(tol),_perturbationfactor(eps),_tangentByPerturbation(pert),_order(1),
-																							 _pfApproxMethod(Implicit)
+                                               _mu2(2.*_mu), _tol(tol),_perturbationfactor(eps),_tangentByPerturbation(pert),_order(1)
 {
 
   _j2IH = new LinearExponentialJ2IsotropicHardening(num, sy0, h, 0., 10.);
@@ -70,8 +70,7 @@ mlawJ2linear::mlawJ2linear(const int num,const double E,const double nu, const d
                            const double tol, const bool pert, const double eps) : materialLaw(num,true), _E(E), _nu(nu), _rho(rho),
                                                _lambda((E*nu)/(1.+nu)/(1.-2.*nu)),
                                                _mu(0.5*E/(1.+nu)),_K(E/3./(1.-2.*nu)), _K3(3.*_K), _mu3(3.*_mu),
-                                               _mu2(2.*_mu), _tol(tol),_perturbationfactor(eps),_tangentByPerturbation(pert),_order(1),
-																							 _pfApproxMethod(Implicit)
+                                               _mu2(2.*_mu), _tol(tol),_perturbationfactor(eps),_tangentByPerturbation(pert),_order(1)
 {
   _j2IH=j2IH.clone();
 
@@ -119,7 +118,7 @@ mlawJ2linear::mlawJ2linear(const mlawJ2linear &source) : materialLaw(source),_E(
                                                          _mu2(source._mu2), _tol(source._tol),
                                                          _perturbationfactor(source._perturbationfactor),
                                                          _tangentByPerturbation(source._tangentByPerturbation),_order(source._order),
-                                                         _Cel(source._Cel),_I4dev(source._I4dev),_pfApproxMethod(source._pfApproxMethod)
+                                                         _Cel(source._Cel),_I4dev(source._I4dev)
 {
 	_j2IH = NULL;
   if(source._j2IH != NULL)
@@ -148,7 +147,6 @@ mlawJ2linear& mlawJ2linear::operator=(const materialLaw &source)
     _tangentByPerturbation = src->_tangentByPerturbation;
     _Cel = src->_Cel;
     _I4dev = src->_I4dev;
-		_pfApproxMethod = src->_pfApproxMethod;
 
     if(_j2IH != NULL) delete _j2IH;
     if(src->_j2IH != NULL)
@@ -159,9 +157,6 @@ mlawJ2linear& mlawJ2linear::operator=(const materialLaw &source)
   return *this;
 }
 
-void mlawJ2linear::setPathFollowingApproximationMethod(const int i){
-	_pfApproxMethod = (ApproximationMethod)i;
-};
 
 void mlawJ2linear::createIPState(IPStateBase* &ips,const bool* state_,const MElement *ele, const int nbFF_, const IntPt *GP, const int gpt) const
 {
@@ -408,8 +403,9 @@ void mlawJ2linear::predictorCorector(const STensor3& F0,         // initial defo
   static STensor3 N;
   this->J2flow(N,Eepr); 
   
-  if (q0->damageIsBlocked()){
-    q->blockDamage(true);
+  if (q0->dissipationIsBlocked()){
+    q->blockDissipation(true);
+    q->getRefToDissipationActive() = false;
   }
   else{
   
@@ -420,7 +416,7 @@ void mlawJ2linear::predictorCorector(const STensor3& F0,         // initial defo
     
     if(VMcriterion >0.)
     {
-
+      q->getRefToDissipationActive() = true;
       int ite = 0, maxite = 1000;
       while(fabs(VMcriterion)/Sy0 > _tol)
       {
@@ -469,6 +465,9 @@ void mlawJ2linear::predictorCorector(const STensor3& F0,         // initial defo
         STensorOperation::logSTensor3(Ce,_order,Ee,&L,&dLDCe);
       }
       Ee *= 0.5;
+    }
+    else{
+      q->getRefToDissipationActive() = false;
     };
   }
 
@@ -484,27 +483,34 @@ void mlawJ2linear::predictorCorector(const STensor3& F0,         // initial defo
   STensorOperation::multSTensor3(Fe,S,FeS);
   STensorOperation::multSTensor3SecondTranspose(FeS,Fpinv,P);
     
-  
-
   // elastic energy
   q->getRefToElasticEnergy()= this->deformationEnergy(Ce);
+  // plastic energy
+  q->getRefToPlasticEnergy() = q->getRefToIPJ2IsotropicHardening().getIntegR();
     // plastic power (Wp1- Wp0)/dt
-  q->getRefToPlasticPower() = Deps*Sy/this->getTimeStep();
-  
-  // irreversible energy
-  double& irrEneg = q->getRefToIrreversibleEnergy();
-	irrEneg = q0->irreversibleEnergy();
-	// explicite approximation
-	if (_pfApproxMethod == Explicit){
-		irrEneg += Sy0*Deps;
-	}
-	else if (_pfApproxMethod == Implicit){
-		irrEneg += Sy*Deps;
-	}
-	else {
-		Msg::Fatal("path following approx method %d has been implemented",_pfApproxMethod);
-	}
- 
+  if (Deps > 0.){
+    q->getRefToPlasticPower() = Deps*Sy/this->getTimeStep();
+  }
+  else
+  {
+    q->getRefToPlasticPower() = 0.;
+  }
+    
+  if (this->getMacroSolver()->withPathFollowing()){
+    // irreversible energy
+    double& irrEneg = q->getRefToIrreversibleEnergy();
+    if (this->getMacroSolver()->getPathFollowingLocalIncrementType() == nonLinearMechSolver::DEFO_ENERGY){
+      //
+      irrEneg = q->defoEnergy();
+    }
+    else if ((this->getMacroSolver()->getPathFollowingLocalIncrementType() == nonLinearMechSolver::PLASTIC_ENERGY) or
+             (this->getMacroSolver()->getPathFollowingLocalIncrementType() == nonLinearMechSolver::DISSIPATION_ENERGY)) {
+      irrEneg = (Sy*Deps+q0->irreversibleEnergy());
+    }
+    else{
+      irrEneg = 0.;
+    }
+  }
  
   if (stiff){
     if (_tangentByPerturbation){
@@ -529,27 +535,13 @@ void mlawJ2linear::predictorCorector(const STensor3& F0,         // initial defo
           }
           
           dpdF(k,l) = (qTmp._j2lepspbarre - eps)/_tol;
+          q->getRefToDIrreversibleEnergyDF()(k,l) = (qTmp.irreversibleEnergy() - q->irreversibleEnergy())/_tol;
         }
       }
       
       STensor3& dplasticpowerDF = q->getRefToDPlasticPowerDF();
       dplasticpowerDF = dpdF;
       dplasticpowerDF *= (Sy+H*Deps)/this->getTimeStep();
-      
-      STensor3& DirrEnegDF = q->getRefToDIrreversibleEnergyDF();
-      if (_pfApproxMethod == Explicit){
-        DirrEnegDF = dpdF;
-        DirrEnegDF*= Sy0;
-      }
-      else if (_pfApproxMethod == Implicit){
-        DirrEnegDF = dpdF;
-        DirrEnegDF*= (Sy+H*Deps);
-      }
-      else {
-        Msg::Fatal("path following approx method %d has been implemented",_pfApproxMethod);
-      }
-      
-      
     }
     else{
       static STensor43 DcorKirDEepr;
@@ -728,21 +720,41 @@ void mlawJ2linear::predictorCorector(const STensor3& F0,         // initial defo
         }
       }
       
+      // plastic power
       STensor3& dplasticpowerDF = q->getRefToDPlasticPowerDF();
-      dplasticpowerDF = dpdF;
-      dplasticpowerDF *= (Sy+H*Deps)/this->getTimeStep();
-      
-      STensor3& DirrEnegDF = q->getRefToDIrreversibleEnergyDF();
-      if (_pfApproxMethod == Explicit){
-        DirrEnegDF = dpdF;
-        DirrEnegDF*= Sy0;
+      if (Deps > 0.){
+        dplasticpowerDF = dpdF;
+        dplasticpowerDF *= (Sy+H*Deps)/this->getTimeStep();        
       }
-      else if (_pfApproxMethod == Implicit){
-        DirrEnegDF = dpdF;
-        DirrEnegDF*= (Sy+H*Deps);
+      else{
+        dplasticpowerDF *= 0.;
       }
-      else {
-        Msg::Fatal("path following approx method %d has been implemented",_pfApproxMethod);
+      
+      if (this->getMacroSolver()->withPathFollowing()){
+        // irreversible energy
+        STensor3& DirrEnegDF = q->getRefToDIrreversibleEnergyDF();
+        if (this->getMacroSolver()->getPathFollowingLocalIncrementType() == nonLinearMechSolver::DEFO_ENERGY){
+          for(int i=0;i<3;i++){
+            for(int j=0;j<3;j++){
+              DirrEnegDF(i,j) = 0.;
+              for(int k=0;k<3;k++){
+                for(int l=0;l<3;l++){
+                  for (int m=0; m<3; m++){
+                    DirrEnegDF(i,j) += P(k,m)*Fp(l,m)*dFedF(k,l,i,j);
+                  }
+                }
+              }
+            }
+          }
+        }
+        else if ((this->getMacroSolver()->getPathFollowingLocalIncrementType() == nonLinearMechSolver::PLASTIC_ENERGY) or
+                 (this->getMacroSolver()->getPathFollowingLocalIncrementType() == nonLinearMechSolver::DISSIPATION_ENERGY)) {
+          DirrEnegDF = dpdF;
+          DirrEnegDF*= (Sy+H*Deps); 
+        }
+        else{
+          DirrEnegDF *= 0.;
+        }
       }
     }
   }
diff --git a/NonLinearSolver/materialLaw/mlawJ2linear.h b/NonLinearSolver/materialLaw/mlawJ2linear.h
index 918204750870bf324ecdebf0a15329127e995fdd..a41e4a2343659470a0737954c99a2d28018d6d8e 100644
--- a/NonLinearSolver/materialLaw/mlawJ2linear.h
+++ b/NonLinearSolver/materialLaw/mlawJ2linear.h
@@ -39,7 +39,6 @@ class mlawJ2linear : public materialLaw
 
   STensor43 _Cel; // elastic hook tensor
   STensor43 _I4dev; // dev part of _I4
-	ApproximationMethod _pfApproxMethod; // for pathFollowing
 
  public:
   mlawJ2linear(const int num,const double E,const double nu, const double rho,const double sy0,const double h,const double tol=1.e-6,
@@ -49,9 +48,7 @@ class mlawJ2linear : public materialLaw
  #ifndef SWIG
   mlawJ2linear(const mlawJ2linear &source);
   mlawJ2linear& operator=(const materialLaw &source);
-	
-	void setPathFollowingApproximationMethod(const int i);
-	
+		
   virtual ~mlawJ2linear()
   {
     if(_j2IH!=NULL) {delete _j2IH; _j2IH = NULL;};
diff --git a/NonLinearSolver/materialLaw/mlawLocalDamageJ2Hyper.cpp b/NonLinearSolver/materialLaw/mlawLocalDamageJ2Hyper.cpp
index a05e96887b6123eb3dc893fa4ba3ef44ef48b5ee..3ac96130ddf0e32b2af8084f875f77084159f9fb 100644
--- a/NonLinearSolver/materialLaw/mlawLocalDamageJ2Hyper.cpp
+++ b/NonLinearSolver/materialLaw/mlawLocalDamageJ2Hyper.cpp
@@ -77,8 +77,8 @@ void mlawLocalDamageJ2Hyper::constitutive(const STensor3& F0,const STensor3& Fn,
   static STensor43 dFpdF, dFedF;
   static STensor3 Fe, Peff;
   static STensor3 Fpinv;
+  static STensor3 dpdF;
   
-  STensor3 &dpdF=q1->getRefToDLocalPlasticStrainDStrain();  
   mlawJ2linear::predictorCorector(F0,Fn,P,q0,q1,Tangent,dFpdF,dFedF,dpdF,stiff);
   
   const STensor3 &Fp  = q1->getConstRefToFp();
@@ -87,8 +87,8 @@ void mlawLocalDamageJ2Hyper::constitutive(const STensor3& F0,const STensor3& Fn,
 
   double ene = q1->defoEnergy();
 
-  if (q0->damageIsBlocked()){
-    q1->blockDamage(true);
+  if (q0->dissipationIsBlocked()){
+    q1->blockDissipation(true);
   //if (1){
     // at bulk elelent when damage is blocked
     // damage stop increasing
@@ -100,20 +100,20 @@ void mlawLocalDamageJ2Hyper::constitutive(const STensor3& F0,const STensor3& Fn,
     curDama.getRefToMaximalP() = q1->getMaximalP();
     //Msg::Info("bulk damage stops increasing = %e",ipvcur->getDamage());
 
-    q1->activeDamage(false);
+    q1->getRefToDissipationActive() = (false);
   }
   else{
     // compute damage for ipcur
-    damLaw->computeDamage(q1->getCurrentPlasticStrain(),q0->getCurrentPlasticStrain(),
+    damLaw->computeDamage(q1->getConstRefToEquivalentPlasticStrain(),q0->getConstRefToEquivalentPlasticStrain(),
                         ene, Fe, Fp, Peff, Cel,
                         q0->getConstRefToIPDamage(),q1->getRefToIPDamage());
 
     // check active damage
-    if ((q1->getDamage() > q0->getDamage()) and (q1->getCurrentPlasticStrain() > q0->getCurrentPlasticStrain())){
-      q1->activeDamage(true);
+    if ((q1->getDamage() > q0->getDamage()) and (q1->getConstRefToEquivalentPlasticStrain() > q0->getConstRefToEquivalentPlasticStrain())){
+      q1->getRefToDissipationActive()  = (true);
     }
     else{
-      q1->activeDamage(false);
+      q1->getRefToDissipationActive() = (false);
     }
   }
 
diff --git a/NonLinearSolver/materialLaw/mlawLocalDamageJ2Hyper.h b/NonLinearSolver/materialLaw/mlawLocalDamageJ2Hyper.h
index f8864036b73c3f28d133ad76760a58d82126af13..1d51d0e8b22820b567a4c7cbdb64c38c977e9c1f 100644
--- a/NonLinearSolver/materialLaw/mlawLocalDamageJ2Hyper.h
+++ b/NonLinearSolver/materialLaw/mlawLocalDamageJ2Hyper.h
@@ -34,7 +34,6 @@ class mlawLocalDamageJ2Hyper : public mlawJ2linear
 	virtual materialLaw* clone() const {return new mlawLocalDamageJ2Hyper(*this);};
   // function of materialLaw
   virtual matname getType() const{return materialLaw::localDamageJ2Hyper;}
-  virtual bool withDamage() const {return true;};
   virtual bool withEnergyDissipation() const {return true;};
   virtual void createIPState(IPStateBase* &ips,const bool* state_=NULL,const MElement *ele=NULL, const int nbFF_=0, const IntPt *GP=NULL, const int gpt = 0) const;
 
diff --git a/NonLinearSolver/materialLaw/mlawNonLocalDamage.h b/NonLinearSolver/materialLaw/mlawNonLocalDamage.h
index 1896caffb7da0d6cd8f1d6f26f073f29710821a1..8d7c1651da5733ccd612e85806d4b410b64bfce1 100644
--- a/NonLinearSolver/materialLaw/mlawNonLocalDamage.h
+++ b/NonLinearSolver/materialLaw/mlawNonLocalDamage.h
@@ -64,7 +64,6 @@ class mlawNonLocalDamage : public materialLawWithDamage
      Msg::Error("Cannot be called");
   }
 
-  virtual bool withDamage() const {return true;};
   virtual bool withEnergyDissipation() const {return true;};
   virtual void createIPState(IPNonLocalDamage *ivi, IPNonLocalDamage *iv1, IPNonLocalDamage *iv2) const;
   virtual void createIPVariable(IPNonLocalDamage *&ipv,const MElement *ele,const int nbFF, const IntPt *GP, const int gpt) const;
diff --git a/NonLinearSolver/materialLaw/mlawNonLocalDamageGurson.h b/NonLinearSolver/materialLaw/mlawNonLocalDamageGurson.h
index a8a88b7b05ece9992f4447408bb864c301b0c19b..fd75da5ab8471e9bcd2a3838e72a59e6d394be0a 100644
--- a/NonLinearSolver/materialLaw/mlawNonLocalDamageGurson.h
+++ b/NonLinearSolver/materialLaw/mlawNonLocalDamageGurson.h
@@ -143,7 +143,6 @@ public:
   
   // Function of materialLaw
   virtual matname getType() const{return materialLaw::nonLocalDamageGurson;}
-  virtual bool withDamage() const {return true;};
   virtual void createIPState(IPNonLocalDamageGurson *ivi, IPNonLocalDamageGurson *iv1, IPNonLocalDamageGurson *iv2) const;
   virtual void createIPState(IPStateBase* &ips,const bool* state_=NULL,const MElement *ele=NULL, const int nbFF_=0, const IntPt *GP=NULL, const int gpt = 0) const;
   virtual void createIPVariable(IPNonLocalDamageGurson *&ipv) const;
diff --git a/NonLinearSolver/materialLaw/mlawNonLocalDamageHyperelastic.cpp b/NonLinearSolver/materialLaw/mlawNonLocalDamageHyperelastic.cpp
index 92aa89c7a6edc5760a2400eec679866294c80eca..dac34f789f055b097cb1d94fa500efecfea20d7f 100644
--- a/NonLinearSolver/materialLaw/mlawNonLocalDamageHyperelastic.cpp
+++ b/NonLinearSolver/materialLaw/mlawNonLocalDamageHyperelastic.cpp
@@ -11,27 +11,13 @@
 #include "mlawNonLocalDamageHyperelastic.h"
 
 
-mlawNonLocalDamageQuadYieldHyper::mlawNonLocalDamageQuadYieldHyper(const int num,const double E,const double nu, const double rho,
-				const double tol, const bool matrixbyPerturbation, const double pert):
-				mlawQuadYieldHyper(num,E,nu,rho,tol,matrixbyPerturbation,pert),cLLaw(NULL),damLaw(NULL){
+mlawNonLocalDamagePowerYieldHyper::mlawNonLocalDamagePowerYieldHyper(const int num,const double E,const double nu, const double rho,
+				const double tol, const bool matrixbyPerturbation , const double pert):
+				mlawPowerYieldHyper(num,E,nu,rho,tol,matrixbyPerturbation,pert),cLLaw(NULL),damLaw(NULL){};
 
-}
 
-mlawNonLocalDamageQuadYieldHyper::mlawNonLocalDamageQuadYieldHyper(const int num,const double E,const double nu, const double rho,
-                      const J2IsotropicHardening &sc,
-                      const J2IsotropicHardening &st,
-                      const J2IsotropicHardening &ss,
-                      const CLengthLaw &_cLLaw,
-                      const DamageLaw &_damLaw,
-                      const double tol,
-                      const bool matrixbyPerturbation, const double pert):
-                      mlawQuadYieldHyper(num,E,nu,rho,sc,st,ss,tol,matrixbyPerturbation,pert){
-  cLLaw = _cLLaw.clone();
-  damLaw = _damLaw.clone();
-};
 
-mlawNonLocalDamageQuadYieldHyper::mlawNonLocalDamageQuadYieldHyper(const mlawNonLocalDamageQuadYieldHyper &source):
-      mlawQuadYieldHyper(source){
+mlawNonLocalDamagePowerYieldHyper::mlawNonLocalDamagePowerYieldHyper(const mlawNonLocalDamagePowerYieldHyper &source):mlawPowerYieldHyper(source){
   cLLaw = NULL;
   damLaw = NULL;
   if(source.cLLaw != NULL)
@@ -41,68 +27,60 @@ mlawNonLocalDamageQuadYieldHyper::mlawNonLocalDamageQuadYieldHyper(const mlawNon
   if(source.damLaw != NULL)
   {
     damLaw=source.damLaw->clone();
-  }
+  };
+}
+
+void mlawNonLocalDamagePowerYieldHyper::setCLengthLaw(const CLengthLaw &_cLLaw){
+  if (cLLaw) delete cLLaw;
+  cLLaw = _cLLaw.clone();
 };
-mlawNonLocalDamageQuadYieldHyper& mlawNonLocalDamageQuadYieldHyper::operator=(const materialLaw &source){
-  mlawQuadYieldHyper::operator=(source);
-  const mlawNonLocalDamageQuadYieldHyper* src = dynamic_cast<const mlawNonLocalDamageQuadYieldHyper*>(&source);
-  if(src != NULL)
-  {
-    if(cLLaw != NULL) delete cLLaw; cLLaw = NULL;
-    if(src->cLLaw != NULL)
-    {
-      cLLaw=src->cLLaw->clone();
-    }
-    if(damLaw != NULL) delete damLaw; damLaw = NULL;
-    if(src->damLaw != NULL)
-    {
-      damLaw=src->damLaw->clone();
-    }
-  }
-  return *this;
+void mlawNonLocalDamagePowerYieldHyper::setDamageLaw(const DamageLaw &_damLaw){
+  if (damLaw) delete damLaw;
+  damLaw = _damLaw.clone();
 };
 
-mlawNonLocalDamageQuadYieldHyper::~mlawNonLocalDamageQuadYieldHyper(){
+
+mlawNonLocalDamagePowerYieldHyper::~mlawNonLocalDamagePowerYieldHyper(){
   if (cLLaw!= NULL) delete cLLaw;
   if (damLaw!= NULL) delete damLaw;
 };
 
-void mlawNonLocalDamageQuadYieldHyper::createIPState(IPStateBase* &ips,const bool* state_,const MElement *ele, const int nbFF_, const IntPt *GP, const int gpt) const
+void mlawNonLocalDamagePowerYieldHyper::createIPState(IPStateBase* &ips,const bool* state_,const MElement *ele, const int nbFF_, const IntPt *GP, const int gpt) const
 {
-  IPVariable* ipvi = new IPNonLocalDamageHyperelasic(_compression,_traction,_shear,_kinematic,_N,cLLaw,damLaw);
-  IPVariable* ipv1 = new IPNonLocalDamageHyperelasic(_compression,_traction,_shear,_kinematic,_N,cLLaw,damLaw);
-  IPVariable* ipv2 = new IPNonLocalDamageHyperelasic(_compression,_traction,_shear,_kinematic,_N,cLLaw,damLaw);
+  IPVariable* ipvi = new IPHyperViscoElastoPlasticNonLocalDamage(_compression,_traction,_shear,_kinematic,_N,cLLaw,damLaw);
+  IPVariable* ipv1 = new IPHyperViscoElastoPlasticNonLocalDamage(_compression,_traction,_shear,_kinematic,_N,cLLaw,damLaw);
+  IPVariable* ipv2 = new IPHyperViscoElastoPlasticNonLocalDamage(_compression,_traction,_shear,_kinematic,_N,cLLaw,damLaw);
   if(ips != NULL) delete ips;
   ips = new IP3State(state_,ipvi,ipv1,ipv2);
 }
-void mlawNonLocalDamageQuadYieldHyper::createIPState(IPNonLocalDamageHyperelasic *ivi, IPNonLocalDamageHyperelasic *iv1, IPNonLocalDamageHyperelasic *iv2) const
+void mlawNonLocalDamagePowerYieldHyper::createIPState(IPHyperViscoElastoPlasticNonLocalDamage *ivi, IPHyperViscoElastoPlasticNonLocalDamage *iv1, IPHyperViscoElastoPlasticNonLocalDamage *iv2) const
 {
 
 }
-void mlawNonLocalDamageQuadYieldHyper::createIPVariable(IPNonLocalDamageHyperelasic *&ipv,const MElement *ele,const int nbFF,const IntPt *GP, const int gpt) const
+void mlawNonLocalDamagePowerYieldHyper::createIPVariable(IPHyperViscoElastoPlasticNonLocalDamage *&ipv,const MElement *ele,const int nbFF,const IntPt *GP, const int gpt) const
 {
 
 }
 
-double mlawNonLocalDamageQuadYieldHyper::soundSpeed() const
+double mlawNonLocalDamagePowerYieldHyper::soundSpeed() const
 {
-  return mlawQuadYieldHyper::soundSpeed();
+  return mlawPowerYieldHyper::soundSpeed();
 }
 
-void mlawNonLocalDamageQuadYieldHyper::constitutive(const STensor3& F0,const STensor3& Fn,STensor3 &P,const IPNonLocalDamageHyperelasic *q0,
-	IPNonLocalDamageHyperelasic *q1,STensor43 &Tangent,
+void mlawNonLocalDamagePowerYieldHyper::constitutive(const STensor3& F0,const STensor3& Fn,STensor3 &P,const IPHyperViscoElastoPlasticNonLocalDamage *q0,
+	IPHyperViscoElastoPlasticNonLocalDamage *q1,STensor43 &Tangent,
                                 const bool stiff) const
 {
-  mlawQuadYieldHyper::constitutive(F0,Fn,P,q0,q1,Tangent,stiff);
+  mlawPowerYieldHyper::constitutive(F0,Fn,P,q0,q1,Tangent,stiff);
 }
 
-void mlawNonLocalDamageQuadYieldHyper::constitutive(
+void mlawNonLocalDamagePowerYieldHyper::constitutive(
                             const STensor3& F0,         // initial deformation gradient (input @ time n)
                             const STensor3& Fn,         // updated deformation gradient (input @ time n+1)
                             STensor3 &P,                // updated 1st Piola-Kirchhoff stress tensor (output)
                                                         // contains the initial values on input
-                            const IPNonLocalDamageHyperelasic *ipvprev,       // array of initial internal variable
-                            IPNonLocalDamageHyperelasic *ipvcur,             // updated array of internal variable (in ipvcur on output),
+                            const IPHyperViscoElastoPlasticNonLocalDamage *ipvprev,       // array of initial internal variable
+                            IPHyperViscoElastoPlasticNonLocalDamage *ipvcur,             // updated array of internal variable (in ipvcur on output),
                             STensor43 &Tangent,         // constitutive tangents (output)
                             STensor3  &dLocalPlasticStrainDStrain,
                             STensor3  &dStressDNonLocalPlasticStrain,
@@ -112,20 +90,18 @@ void mlawNonLocalDamageQuadYieldHyper::constitutive(
 {
   double p0 = ipvprev->getCurrentPlasticStrain();
   cLLaw->computeCL(p0, ipvcur->getRefToIPCLength());
+  
+  static STensor43 dFedF, dFpdF;
+  static STensor3 Peff;
+  mlawPowerYieldHyper::predictorCorrector(Fn,ipvprev,ipvcur,Peff,stiff,Tangent,dFedF,dFpdF);
 
-
-  mlawQuadYieldHyper::constitutive(F0,Fn,P,ipvprev,ipvcur,Tangent,stiff);
-
-  const STensor43& dFpdF = ipvcur->_DFpDF;
   const STensor3& Fe = ipvcur->_Fe;
-  const STensor43& dFedF = ipvcur->_DFeDF;
   const STensor3& dgammadF = ipvcur->_DgammaDF;
-
   const STensor3 &Fp  = ipvcur->getConstRefToFp();
+
   double ene = ipvcur->defoEnergy();
   //Msg::Info("enery = %e",ene);
 
-  STensor3 Peff(P);
   damLaw->computeDamage(ipvcur->getEffectivePlasticStrain(),
                         ipvprev->getEffectivePlasticStrain(),
                         ene, Fe, Fp, Peff, Cel,
@@ -133,13 +109,12 @@ void mlawNonLocalDamageQuadYieldHyper::constitutive(
 
 
   double D = ipvcur->getDamage();
+  P = Peff;
   P*=(1.-D);
 
+
   if(stiff)
   {
-    const STensor3 &Fp0  = ipvprev->getConstRefToFp();
-    ipvcur->getRefToDLocalPlasticStrainDStrain() = dgammadF;
-
     // we need to correct partial P/partial F: (1-D) partial P/partial F - Peff otimes partial D partial F
     Tangent*=(1.-D);
 
@@ -165,233 +140,183 @@ void mlawNonLocalDamageQuadYieldHyper::constitutive(
 
 
     // partial p/partial F
-    dLocalPlasticStrainDStrain = ipvcur->getConstRefToDLocalPlasticStrainDStrain();
+    dLocalPlasticStrainDStrain = dgammadF;
 
     // -hat{P} partial D/partial tilde p
     dStressDNonLocalPlasticStrain = Peff*(-1*ipvcur->getDDamageDp());
 
     // partial p partial tilde p (0 if no MFH)
-    ipvcur->getRefToDLocalPlasticStrainDNonLocalPlasticStrain()=0;
-    dLocalPlasticStrainDNonLocalPlasticStrain = ipvcur->getDLocalPlasticStrainDNonLocalPlasticStrain();
+    dLocalPlasticStrainDNonLocalPlasticStrain = 0.;
 
   }
 
 }
 
-mlawNonLocalDamagePowerYieldHyper::mlawNonLocalDamagePowerYieldHyper(const int num,const double E,const double nu, const double rho,
+mlawLocalDamagePowerYieldHyperWithFailure::mlawLocalDamagePowerYieldHyperWithFailure(const int num,const double E,const double nu, const double rho,
 				const double tol, const bool matrixbyPerturbation , const double pert):
-				mlawPowerYieldHyper(num,E,nu,rho,tol,matrixbyPerturbation,pert),cLLaw(NULL),damLaw(NULL){};
-mlawNonLocalDamagePowerYieldHyper::mlawNonLocalDamagePowerYieldHyper(const int num,const double E,const double nu, const double rho,
-                      const J2IsotropicHardening &sc,
-                      const J2IsotropicHardening &st,
-                      const CLengthLaw &_cLLaw,
-                      const DamageLaw &_damLaw,
-                      const double tol,
-                      const bool matrixbyPerturbation, const double pert):
-                      mlawPowerYieldHyper(num,E,nu,rho,sc,st,tol,matrixbyPerturbation,pert){
-  cLLaw = _cLLaw.clone();
-  damLaw = _damLaw.clone();
+				mlawPowerYieldHyperWithFailure(num,E,nu,rho,tol,matrixbyPerturbation,pert), _saturated(false){};
+
+void mlawLocalDamagePowerYieldHyperWithFailure::clearAllDamageLaw(){
+  for (int i=0; i< damLaw.size(); i++){
+    if (damLaw[i]!= NULL) delete damLaw[i];
+  }
+  damLaw.clear();
 };
 
-mlawNonLocalDamagePowerYieldHyper::mlawNonLocalDamagePowerYieldHyper(const int num,const double E,const double nu, const double rho,
-                      const J2IsotropicHardening &sc,
-                      const J2IsotropicHardening &st,
-                      const kinematicHardening &kin,
-                      const CLengthLaw &_cLLaw,
-                      const DamageLaw &_damLaw,
-                      const double tol,
-                      const bool matrixbyPerturbation, const double pert):
-                      mlawPowerYieldHyper(num,E,nu,rho,sc,st,kin,tol,matrixbyPerturbation,pert){
-  cLLaw = _cLLaw.clone();
-  damLaw = _damLaw.clone();
+void mlawLocalDamagePowerYieldHyperWithFailure::setDamageLaw(const DamageLaw &_damLaw){
+  damLaw.push_back(_damLaw.clone());
 };
 
-mlawNonLocalDamagePowerYieldHyper::mlawNonLocalDamagePowerYieldHyper(const mlawNonLocalDamagePowerYieldHyper &source):mlawPowerYieldHyper(source){
-  cLLaw = NULL;
-  damLaw = NULL;
-  if(source.cLLaw != NULL)
-  {
-    cLLaw=source.cLLaw->clone();
+mlawLocalDamagePowerYieldHyperWithFailure::mlawLocalDamagePowerYieldHyperWithFailure(const mlawLocalDamagePowerYieldHyperWithFailure &source):
+            mlawPowerYieldHyperWithFailure(source),_saturated(source._saturated){
+  damLaw.clear();
+  for (int i=0; i< source.damLaw.size(); i++){
+    if(source.damLaw[i] != NULL)
+    {
+      damLaw.push_back(source.damLaw[i]->clone());
+    };
   }
-  if(source.damLaw != NULL)
-  {
-    damLaw=source.damLaw->clone();
-  };
 }
 
-mlawNonLocalDamagePowerYieldHyper& mlawNonLocalDamagePowerYieldHyper::operator=(const materialLaw &source){
-  mlawPowerYieldHyper::operator=(source);
-  const mlawNonLocalDamagePowerYieldHyper* src = dynamic_cast<const mlawNonLocalDamagePowerYieldHyper*>(&source);
-  if(src != NULL)
-  {
-    if(cLLaw != NULL) delete cLLaw; cLLaw = NULL;
-    if(src->cLLaw != NULL)
-    {
-      cLLaw=src->cLLaw->clone();
-    }
-    if(damLaw != NULL) delete damLaw; damLaw = NULL;
-    if(src->damLaw != NULL)
-    {
-      damLaw=src->damLaw->clone();
-    }
+mlawLocalDamagePowerYieldHyperWithFailure::~mlawLocalDamagePowerYieldHyperWithFailure(){
+  for (int i=0; i< damLaw.size(); i++){
+    if (damLaw[i]!= NULL) delete damLaw[i];
   }
-  return *this;
-};
-mlawNonLocalDamagePowerYieldHyper::~mlawNonLocalDamagePowerYieldHyper(){
-  if (cLLaw!= NULL) delete cLLaw;
-  if (damLaw!= NULL) delete damLaw;
+  damLaw.clear();
 };
 
-void mlawNonLocalDamagePowerYieldHyper::createIPState(IPStateBase* &ips,const bool* state_,const MElement *ele, const int nbFF_, const IntPt *GP, const int gpt) const
+void mlawLocalDamagePowerYieldHyperWithFailure::createIPState(IPStateBase* &ips,const bool* state_,const MElement *ele, const int nbFF_, const IntPt *GP, const int gpt) const
 {
-  IPVariable* ipvi = new IPNonLocalDamageHyperelasic(_compression,_traction,_shear,_kinematic,_N,cLLaw,damLaw);
-  IPVariable* ipv1 = new IPNonLocalDamageHyperelasic(_compression,_traction,_shear,_kinematic,_N,cLLaw,damLaw);
-  IPVariable* ipv2 = new IPNonLocalDamageHyperelasic(_compression,_traction,_shear,_kinematic,_N,cLLaw,damLaw);
+  IPVariable* ipvi = new IPHyperViscoElastoPlasticMultipleLocalDamage(_compression,_traction,_shear,_kinematic,_N,damLaw);
+  IPVariable* ipv1 = new IPHyperViscoElastoPlasticMultipleLocalDamage(_compression,_traction,_shear,_kinematic,_N,damLaw);
+  IPVariable* ipv2 = new IPHyperViscoElastoPlasticMultipleLocalDamage(_compression,_traction,_shear,_kinematic,_N,damLaw);
   if(ips != NULL) delete ips;
   ips = new IP3State(state_,ipvi,ipv1,ipv2);
 }
-void mlawNonLocalDamagePowerYieldHyper::createIPState(IPNonLocalDamageHyperelasic *ivi, IPNonLocalDamageHyperelasic *iv1, IPNonLocalDamageHyperelasic *iv2) const
+void mlawLocalDamagePowerYieldHyperWithFailure::createIPState(IPHyperViscoElastoPlasticMultipleLocalDamage *ivi, IPHyperViscoElastoPlasticMultipleLocalDamage *iv1, IPHyperViscoElastoPlasticMultipleLocalDamage *iv2) const
 {
 
 }
-void mlawNonLocalDamagePowerYieldHyper::createIPVariable(IPNonLocalDamageHyperelasic *&ipv,const MElement *ele,const int nbFF,const IntPt *GP, const int gpt) const
+void mlawLocalDamagePowerYieldHyperWithFailure::createIPVariable(IPHyperViscoElastoPlasticMultipleLocalDamage *&ipv,const MElement *ele,const int nbFF,const IntPt *GP, const int gpt) const
 {
 
 }
 
-double mlawNonLocalDamagePowerYieldHyper::soundSpeed() const
+double mlawLocalDamagePowerYieldHyperWithFailure::soundSpeed() const
 {
-  return mlawPowerYieldHyper::soundSpeed();
-}
-
-void mlawNonLocalDamagePowerYieldHyper::constitutive(const STensor3& F0,const STensor3& Fn,STensor3 &P,const IPNonLocalDamageHyperelasic *q0,
-	IPNonLocalDamageHyperelasic *q1,STensor43 &Tangent,
-                                const bool stiff) const
-{
-  mlawPowerYieldHyper::constitutive(F0,Fn,P,q0,q1,Tangent,stiff);
+  return mlawPowerYieldHyperWithFailure::soundSpeed();
 }
 
-void mlawNonLocalDamagePowerYieldHyper::constitutive(
+void mlawLocalDamagePowerYieldHyperWithFailure::constitutive(
                             const STensor3& F0,         // initial deformation gradient (input @ time n)
                             const STensor3& Fn,         // updated deformation gradient (input @ time n+1)
                             STensor3 &P,                // updated 1st Piola-Kirchhoff stress tensor (output)
-                                                        // contains the initial values on input
-                            const IPNonLocalDamageHyperelasic *ipvprev,       // array of initial internal variable
-                            IPNonLocalDamageHyperelasic *ipvcur,             // updated array of internal variable (in ipvcur on output),
+                            const IPHyperViscoElastoPlasticMultipleLocalDamage *ipvprev,       // array of initial internal variable
+                            IPHyperViscoElastoPlasticMultipleLocalDamage *ipvcur,             // updated array of internal variable (in ipvcur on output),
                             STensor43 &Tangent,         // constitutive tangents (output)
-                            STensor3  &dLocalPlasticStrainDStrain,
-                            STensor3  &dStressDNonLocalPlasticStrain,
-                            double   &dLocalPlasticStrainDNonLocalPlasticStrain,
                             const bool stiff            // if true compute the tangents
                            ) const
 {
-  double p0 = ipvprev->getCurrentPlasticStrain();
-  cLLaw->computeCL(p0, ipvcur->getRefToIPCLength());
-
 
-  mlawPowerYieldHyper::constitutive(F0,Fn,P,ipvprev,ipvcur,Tangent,stiff);
+  if (isSaturatedHardening()){
+    // saturate when defined critical for damage law
+    if (ipvprev->getDamage(1) >= damLaw[1]->getCriticalDamage()){
+      ipvcur->saturateHardening(ipvprev);
+    }
+  }
+  static STensor43 dFedF, dFpdF;
+  static STensor3 Peff;
+  mlawPowerYieldHyperWithFailure::predictorCorrector(Fn,ipvprev,ipvcur,Peff,stiff,Tangent,dFedF,dFpdF);
 
-  const STensor43& dFpdF = ipvcur->_DFpDF;
+  // get result from effective law
   const STensor3& Fe = ipvcur->_Fe;
-  const STensor43& dFedF = ipvcur->_DFeDF;
   const STensor3& dgammadF = ipvcur->_DgammaDF;
-
-
   const STensor3 &Fp  = ipvcur->getConstRefToFp();
-
+  const STensor3& dgFdF = ipvcur->getConstRefToDFailurePlasticityDF();
+  
   double ene = ipvcur->defoEnergy();
   //Msg::Info("enery = %e",ene);
 
-  STensor3 Peff(P);
-  damLaw->computeDamage(ipvcur->getEffectivePlasticStrain(),
-                        ipvprev->getEffectivePlasticStrain(),
+  // saturation damage always develops
+  damLaw[0]->computeDamage(ipvcur->getConstRefToEqPlasticStrain(),
+                        ipvprev->getConstRefToEqPlasticStrain(),
                         ene, Fe, Fp, Peff, Cel,
-                        ipvprev->getConstRefToIPDamage(),ipvcur->getRefToIPDamage());
+                        ipvprev->getConstRefToIPDamage(0),ipvcur->getRefToIPDamage(0));
 
 
-  double D = ipvcur->getDamage();
-  P*=(1.-D);
+  if (ipvprev->getDamage(1) < ipvcur->getCriticalDamage()){
+    // set for current critical damage
+    ipvcur->setCriticalDamage(ipvcur->getCriticalDamage());
+    // damage evolution
+    damLaw[1]->computeDamage(ipvcur->getFailurePlasticity(),
+                          ipvprev->getFailurePlasticity(),
+                          ene, Fe, Fp, Peff, Cel,
+                          ipvprev->getConstRefToIPDamage(1),ipvcur->getRefToIPDamage(1));
+  }
+  else{
+    // damage stop increasing
+    STensor3 dDDFe(0.);
+    IPDamage& curDama1 = ipvcur->getRefToIPDamage(1);
+    curDama1.setValues(ipvprev->getDamage(1),ipvcur->getMaximalP(1),0.,0.,dDDFe);
+  }
+
+
+  // computue total softening
+  double D1 = ipvcur->getDamage(0);
+  double D2 = ipvcur->getDamage(1);
+  double D =  1. - (1.- D1)*(1.-D2);
+  P = Peff;
+  P*= (1.- D);
 
 
   if(stiff)
   {
-    const STensor3 &Fp0  = ipvprev->getConstRefToFp();
-    ipvcur->getRefToDLocalPlasticStrainDStrain() = dgammadF;
-
     // we need to correct partial P/partial F: (1-D) partial P/partial F - Peff otimes partial D partial F
     Tangent*=(1.-D);
 
-    for(int i=0;i<3;i++)
-    {
-      for(int j=0;j<3;j++)
-      {
-        for(int k=0;k<3;k++)
-        {
-          for(int l=0;l<3;l++)
-          {
-            for(int m=0; m<3; m++)
-            {
-              for(int n=0; n<3; n++)
-              {
-                Tangent(i,j,k,l)-=Peff(i,j)*ipvcur->getConstRefToDDamageDFe()(m,n)*dFedF(m,n,k,l);
+    for(int i=0;i<3;i++){
+      for(int j=0;j<3;j++){
+        for(int k=0;k<3;k++){
+          for(int l=0;l<3;l++){
+            Tangent(i,j,k,l)-=Peff(i,j)*(ipvcur->getDDamageDp(0)*dgammadF(k,l)*(1.- D2)+(1.-D1)*ipvcur->getDDamageDp(1)*dgFdF(k,l));
+            for(int m=0; m<3; m++){
+              for(int n=0; n<3; n++){
+                Tangent(i,j,k,l)-=Peff(i,j)*((1.-D2)*ipvcur->getConstRefToDDamageDFe(0)(m,n) +(1.-D1)*ipvcur->getConstRefToDDamageDFe(1)(m,n)) *dFedF(m,n,k,l);
               }
             }
           }
         }
       }
     }
-
-
-    // partial p/partial F
-    dLocalPlasticStrainDStrain = ipvcur->getConstRefToDLocalPlasticStrainDStrain();
-
-    // -hat{P} partial D/partial tilde p
-    dStressDNonLocalPlasticStrain = Peff*(-1*ipvcur->getDDamageDp());
-
-    // partial p partial tilde p (0 if no MFH)
-    ipvcur->getRefToDLocalPlasticStrainDNonLocalPlasticStrain()=0;
-    dLocalPlasticStrainDNonLocalPlasticStrain = ipvcur->getDLocalPlasticStrainDNonLocalPlasticStrain();
-
   }
-
 }
 
 
 
+
+
 mlawNonLocalDamagePowerYieldHyperWithFailure::mlawNonLocalDamagePowerYieldHyperWithFailure(const int num,const double E,const double nu, const double rho,
 				const double tol, const bool matrixbyPerturbation , const double pert):
 				mlawPowerYieldHyperWithFailure(num,E,nu,rho,tol,matrixbyPerturbation,pert), _saturated(false){};
-mlawNonLocalDamagePowerYieldHyperWithFailure::mlawNonLocalDamagePowerYieldHyperWithFailure(const int num,const double E,const double nu, const double rho,
-                      const J2IsotropicHardening &sc,
-                      const J2IsotropicHardening &st,
-                      const CLengthLaw &_cLLaw1, const CLengthLaw &_cLLaw2,
-                      const DamageLaw &_damLaw1,const DamageLaw &_damLaw2,
-                      const double tol,
-                      const bool matrixbyPerturbation, const double pert):
-                      mlawPowerYieldHyperWithFailure(num,E,nu,rho,sc,st,tol,matrixbyPerturbation,pert), _saturated(false){
-  cLLaw.clear();
-  damLaw.clear();
-  cLLaw.push_back(_cLLaw1.clone());
-  cLLaw.push_back(_cLLaw2.clone());
-  damLaw.push_back(_damLaw1.clone());
-  damLaw.push_back(_damLaw2.clone());
-};
 
-mlawNonLocalDamagePowerYieldHyperWithFailure::mlawNonLocalDamagePowerYieldHyperWithFailure(const int num,const double E,const double nu, const double rho,
-                      const J2IsotropicHardening &sc,
-                      const J2IsotropicHardening &st,
-                      const kinematicHardening &kin,
-                      const CLengthLaw &_cLLaw1, const CLengthLaw &_cLLaw2,
-                      const DamageLaw &_damLaw1, const DamageLaw &_damLaw2,
-                      const double tol,
-                      const bool matrixbyPerturbation, const double pert):
-                      mlawPowerYieldHyperWithFailure(num,E,nu,rho,sc,st,kin,tol,matrixbyPerturbation,pert),_saturated(false){
+void mlawNonLocalDamagePowerYieldHyperWithFailure::clearAllCLengthLaw(){
+  for (int i=0; i< cLLaw.size(); i++){
+    if (cLLaw[i]!= NULL) delete cLLaw[i];
+  }
   cLLaw.clear();
+};
+void mlawNonLocalDamagePowerYieldHyperWithFailure::clearAllDamageLaw(){
+  for (int i=0; i< damLaw.size(); i++){
+    if (damLaw[i]!= NULL) delete damLaw[i];
+  }
   damLaw.clear();
-  cLLaw.push_back(_cLLaw1.clone());
-  cLLaw.push_back(_cLLaw2.clone());
-  damLaw.push_back(_damLaw1.clone());
-  damLaw.push_back(_damLaw2.clone());
+};
+    
+void mlawNonLocalDamagePowerYieldHyperWithFailure::setCLengthLaw(const CLengthLaw &_cLLaw){
+  cLLaw.push_back(_cLLaw.clone());
+};
+void mlawNonLocalDamagePowerYieldHyperWithFailure::setDamageLaw(const DamageLaw &_damLaw){
+  damLaw.push_back(_damLaw.clone());
 };
 
 mlawNonLocalDamagePowerYieldHyperWithFailure::mlawNonLocalDamagePowerYieldHyperWithFailure(const mlawNonLocalDamagePowerYieldHyperWithFailure &source):
@@ -411,32 +336,6 @@ mlawNonLocalDamagePowerYieldHyperWithFailure::mlawNonLocalDamagePowerYieldHyperW
   }
 }
 
-mlawNonLocalDamagePowerYieldHyperWithFailure& mlawNonLocalDamagePowerYieldHyperWithFailure::operator=(const materialLaw &source){
-  mlawPowerYieldHyperWithFailure::operator=(source);
-  const mlawNonLocalDamagePowerYieldHyperWithFailure* src = dynamic_cast<const mlawNonLocalDamagePowerYieldHyperWithFailure*>(&source);
-  if(src != NULL)
-  {
-    for (int i=0; i< cLLaw.size(); i++){
-      if(cLLaw[i] != NULL) delete cLLaw[i];
-      if(damLaw[i] != NULL) delete damLaw[i];
-    }
-    cLLaw.clear();
-    damLaw.clear();
-
-    for (int i=0; i< src->cLLaw.size(); i++){
-      if(src->cLLaw[i] != NULL)
-      {
-        cLLaw.push_back(src->cLLaw[i]->clone());
-      }
-
-      if(src->damLaw[i] != NULL)
-      {
-        damLaw.push_back(src->damLaw[i]->clone());
-      }
-    }
-  }
-  return *this;
-};
 mlawNonLocalDamagePowerYieldHyperWithFailure::~mlawNonLocalDamagePowerYieldHyperWithFailure(){
   for (int i=0; i< cLLaw.size(); i++){
     if (cLLaw[i]!= NULL) delete cLLaw[i];
@@ -448,17 +347,17 @@ mlawNonLocalDamagePowerYieldHyperWithFailure::~mlawNonLocalDamagePowerYieldHyper
 
 void mlawNonLocalDamagePowerYieldHyperWithFailure::createIPState(IPStateBase* &ips,const bool* state_,const MElement *ele, const int nbFF_, const IntPt *GP, const int gpt) const
 {
-  IPVariable* ipvi = new IPNonLocalDamageHyperelasicWithFailure(_compression,_traction,_shear,_kinematic,_N,cLLaw,damLaw);
-  IPVariable* ipv1 = new IPNonLocalDamageHyperelasicWithFailure(_compression,_traction,_shear,_kinematic,_N,cLLaw,damLaw);
-  IPVariable* ipv2 = new IPNonLocalDamageHyperelasicWithFailure(_compression,_traction,_shear,_kinematic,_N,cLLaw,damLaw);
+  IPVariable* ipvi = new IPHyperViscoElastoPlasticMultipleNonLocalDamage(_compression,_traction,_shear,_kinematic,_N,cLLaw,damLaw);
+  IPVariable* ipv1 = new IPHyperViscoElastoPlasticMultipleNonLocalDamage(_compression,_traction,_shear,_kinematic,_N,cLLaw,damLaw);
+  IPVariable* ipv2 = new IPHyperViscoElastoPlasticMultipleNonLocalDamage(_compression,_traction,_shear,_kinematic,_N,cLLaw,damLaw);
   if(ips != NULL) delete ips;
   ips = new IP3State(state_,ipvi,ipv1,ipv2);
 }
-void mlawNonLocalDamagePowerYieldHyperWithFailure::createIPState(IPNonLocalDamageHyperelasicWithFailure *ivi, IPNonLocalDamageHyperelasicWithFailure *iv1, IPNonLocalDamageHyperelasicWithFailure *iv2) const
+void mlawNonLocalDamagePowerYieldHyperWithFailure::createIPState(IPHyperViscoElastoPlasticMultipleNonLocalDamage *ivi, IPHyperViscoElastoPlasticMultipleNonLocalDamage *iv1, IPHyperViscoElastoPlasticMultipleNonLocalDamage *iv2) const
 {
 
 }
-void mlawNonLocalDamagePowerYieldHyperWithFailure::createIPVariable(IPNonLocalDamageHyperelasicWithFailure *&ipv,const MElement *ele,const int nbFF,const IntPt *GP, const int gpt) const
+void mlawNonLocalDamagePowerYieldHyperWithFailure::createIPVariable(IPHyperViscoElastoPlasticMultipleNonLocalDamage *&ipv,const MElement *ele,const int nbFF,const IntPt *GP, const int gpt) const
 {
 
 }
@@ -468,8 +367,8 @@ double mlawNonLocalDamagePowerYieldHyperWithFailure::soundSpeed() const
   return mlawPowerYieldHyperWithFailure::soundSpeed();
 }
 
-void mlawNonLocalDamagePowerYieldHyperWithFailure::constitutive(const STensor3& F0,const STensor3& Fn,STensor3 &P,const IPNonLocalDamageHyperelasicWithFailure *q0,
-	IPNonLocalDamageHyperelasicWithFailure *q1,STensor43 &Tangent,
+void mlawNonLocalDamagePowerYieldHyperWithFailure::constitutive(const STensor3& F0,const STensor3& Fn,STensor3 &P,const IPHyperViscoElastoPlasticMultipleNonLocalDamage *q0,
+	IPHyperViscoElastoPlasticMultipleNonLocalDamage *q1,STensor43 &Tangent,
                                 const bool stiff) const
 {
   mlawPowerYieldHyperWithFailure::constitutive(F0,Fn,P,q0,q1,Tangent,stiff);
@@ -479,8 +378,8 @@ void mlawNonLocalDamagePowerYieldHyperWithFailure::constitutive(
                             const STensor3& F0,         // initial deformation gradient (input @ time n)
                             const STensor3& Fn,         // updated deformation gradient (input @ time n+1)
                             STensor3 &P,                // updated 1st Piola-Kirchhoff stress tensor (output)
-                            const IPNonLocalDamageHyperelasicWithFailure *ipvprev,       // array of initial internal variable
-                            IPNonLocalDamageHyperelasicWithFailure *ipvcur,             // updated array of internal variable (in ipvcur on output),
+                            const IPHyperViscoElastoPlasticMultipleNonLocalDamage *ipvprev,       // array of initial internal variable
+                            IPHyperViscoElastoPlasticMultipleNonLocalDamage *ipvcur,             // updated array of internal variable (in ipvcur on output),
                             STensor43 &Tangent,         // constitutive tangents (output)
                             std::vector<STensor3>  &dLocalVariableDStrain,
                             std::vector<STensor3>  &dStressDNonLocalVariable,
@@ -500,27 +399,19 @@ void mlawNonLocalDamagePowerYieldHyperWithFailure::constitutive(
       ipvcur->saturateHardening(ipvprev);
     }
   }
+  static STensor43 dFedF, dFpdF;
+  static STensor3 Peff;
+  mlawPowerYieldHyperWithFailure::predictorCorrector(Fn,ipvprev,ipvcur,Peff,stiff,Tangent,dFedF,dFpdF);
 
-
-  // compute effective law
-  mlawPowerYieldHyperWithFailure::constitutive(F0,Fn,P,ipvprev,ipvcur,Tangent,stiff);
   // get result from effective law
-  const STensor43& dFpdF = ipvcur->_DFpDF;
   const STensor3& Fe = ipvcur->_Fe;
-  const STensor43& dFedF = ipvcur->_DFeDF;
   const STensor3& dgammadF = ipvcur->_DgammaDF;
   const STensor3 &Fp  = ipvcur->getConstRefToFp();
   const STensor3& dgFdF = ipvcur->getConstRefToDFailurePlasticityDF();
-
+  
   double ene = ipvcur->defoEnergy();
   //Msg::Info("enery = %e",ene);
 
-  // effective stress and tangent
-  STensor3& Peff = ipvcur->getRefToEffectiveFirstPKStress();
-  STensor43& Leff = ipvcur->getRefToEffectiveTangentModuli();
-  Peff = P;
-  Leff = Tangent;
-
   // saturation damage always develops
   damLaw[0]->computeDamage(ipvcur->getEffectivePlasticStrain(),
                         ipvprev->getEffectivePlasticStrain(),
@@ -546,54 +437,85 @@ void mlawNonLocalDamagePowerYieldHyperWithFailure::constitutive(
 
 
   // computue total softening
-  double D1 = ipvcur->getDamage(0);
-  double D2 = ipvcur->getDamage(1);
-  double D =  1. - (1.- D1)*(1.-D2);
+  double D0 = ipvcur->getDamage(0);
+  double D1 = ipvcur->getDamage(1);
+  double D =  1. - (1.- D0)*(1.-D1);
+  P = Peff;
   P*= (1.- D);
-
-
+  
+  ipvcur->_elasticEnergy = (1-D)*ene;
+  
+  
+  
+  double Dprev = 1- (1-ipvprev->getDamage(0))*(1-ipvprev->getDamage(1));
+  // dissipation
+  double& irrEnerg = ipvcur->getRefToIrreversibleEnergy();
+  irrEnerg = ipvprev->irreversibleEnergy();
+  irrEnerg += (ene*(D - Dprev));
+  
   if(stiff)
   {
     // we need to correct partial P/partial F: (1-D) partial P/partial F - Peff otimes partial D partial F
     Tangent*=(1.-D);
 
-    for(int i=0;i<3;i++)
-    {
-      for(int j=0;j<3;j++)
-      {
-        for(int k=0;k<3;k++)
-        {
-          for(int l=0;l<3;l++)
-          {
-            for(int m=0; m<3; m++)
-            {
-              for(int n=0; n<3; n++)
-              {
-                Tangent(i,j,k,l)-=Peff(i,j)*((1.-D2)*ipvcur->getConstRefToDDamageDFe(0)(m,n) +(1.-D1)*ipvcur->getConstRefToDDamageDFe(1)(m,n)) *dFedF(m,n,k,l);
-              }
-            }
+    static STensor3 dDdF;
+    for(int i=0;i<3;i++){
+      for(int j=0;j<3;j++){
+        dDdF(i,j) = 0.;
+        for(int k=0;k<3;k++){
+          for(int l=0;l<3;l++){
+            dDdF(i,j)+=((1.-D1)*ipvcur->getConstRefToDDamageDFe(0)(k,l) +(1.-D0)*ipvcur->getConstRefToDDamageDFe(1)(k,l)) *dFedF(k,l,i,j);
           }
         }
       }
     }
 
 
+    for(int i=0;i<3;i++){
+      for(int j=0;j<3;j++){
+        for(int k=0;k<3;k++){
+          for(int l=0;l<3;l++){
+            Tangent(i,j,k,l)-=Peff(i,j)*dDdF(k,l);
+          }
+        }
+      }
+    }
+
+  
+   dLocalVariableDStrain[0] = dgammadF;
+   dLocalVariableDStrain[1] = dgFdF;  
+
     // -hat{P} partial D/partial tilde p
     for (int i=0; i<3; i++){
       for (int j=0; j<3; j++){
         // partial p/partial F
-        dLocalVariableDStrain[0](i,j) = dgammadF(i,j);
-        dLocalVariableDStrain[1](i,j) = dgFdF(i,j);
-
-        dStressDNonLocalVariable[0](i,j) = -1.*Peff(i,j)*ipvcur->getDDamageDp(0)*(1.- D2);
-        dStressDNonLocalVariable[1](i,j) = -1.*Peff(i,j)*(1.-D1)*ipvcur->getDDamageDp(1);
+        dStressDNonLocalVariable[0](i,j) = -1.*Peff(i,j)*ipvcur->getDDamageDp(0)*(1.- D1);
+        dStressDNonLocalVariable[1](i,j) = -1.*Peff(i,j)*(1.-D0)*ipvcur->getDDamageDp(1);
       }
     }
 
     // partial p partial tilde p (0 if no MFH)
     dLocalVariableDNonLocalVariable.setAll(0.);
-
+    
+        
+    STensor3& DirrEnergDF = ipvcur->getRefToDIrreversibleEnergyDF();
+    DirrEnergDF *= (0.);
+    for(int i=0;i<3;i++){
+      for(int j=0;j<3;j++){
+        for(int k=0;k<3;k++){
+          for(int l=0;l<3;l++){
+            for(int m=0; m<3; m++){
+              DirrEnergDF(i,j) += (D - Dprev)*Peff(k,m)*Fp(l,m)*dFedF(k,l,i,j);
+            };
+          }
+        }
+      }
+    }
+    DirrEnergDF.daxpy(dDdF,ene);
+    
+    ipvcur->getRefToDIrreversibleEnergyDNonLocalVariable(0) = (ene)*(ipvcur->getDDamageDp(0)*(1.- D1));
+    ipvcur->getRefToDIrreversibleEnergyDNonLocalVariable(1) = (ene)*(ipvcur->getDDamageDp(1)*(1.- D0));
+     
   }
-
 }
 
diff --git a/NonLinearSolver/materialLaw/mlawNonLocalDamageHyperelastic.h b/NonLinearSolver/materialLaw/mlawNonLocalDamageHyperelastic.h
index 82bf6cb3a8d72f3bd02dc42bfb1023a4fa6c3fe3..c009e6f8de2e95801940416cc3953db781381b01 100644
--- a/NonLinearSolver/materialLaw/mlawNonLocalDamageHyperelastic.h
+++ b/NonLinearSolver/materialLaw/mlawNonLocalDamageHyperelastic.h
@@ -18,73 +18,6 @@
 #include "CLengthLaw.h"
 #include "DamageLaw.h"
 
-class mlawNonLocalDamageQuadYieldHyper : public mlawQuadYieldHyper{
-  protected:
-    CLengthLaw *cLLaw;
-    DamageLaw  *damLaw;
-
-  public:
-  mlawNonLocalDamageQuadYieldHyper(const int num,const double E,const double nu, const double rho,
-				const double tol=1.e-6, const bool matrixbyPerturbation = false, const double pert = 1e-8);
-  mlawNonLocalDamageQuadYieldHyper(const int num,const double E,const double nu, const double rho,
-                      const J2IsotropicHardening &sc,
-                      const J2IsotropicHardening &st,
-                      const J2IsotropicHardening &ss,
-                      const CLengthLaw &_cLLaw,
-                      const DamageLaw &_damLaw,
-                      const double tol = 1.e-6,
-                      const bool matrixbyPerturbation = false, const double pert = 1e-8);
-
- #ifndef SWIG
-  mlawNonLocalDamageQuadYieldHyper(const mlawNonLocalDamageQuadYieldHyper &source);
-  mlawNonLocalDamageQuadYieldHyper& operator=(const materialLaw &source);
-  virtual ~mlawNonLocalDamageQuadYieldHyper();
-	
-	virtual materialLaw* clone() const { return new mlawNonLocalDamageQuadYieldHyper(*this);}
-  virtual bool withEnergyDissipation() const {return true;};
-
-  // function of materialLaw
-  virtual matname getType() const{return materialLaw::nonLocalDamageQuadYieldHyper;}
-  virtual bool withDamage() const {return true;};
-  virtual void createIPState(IPNonLocalDamageHyperelasic *ivi, IPNonLocalDamageHyperelasic *iv1, IPNonLocalDamageHyperelasic *iv2) const;
-  virtual void createIPState(IPStateBase* &ips,const bool* state_=NULL,const MElement *ele=NULL, const int nbFF_=0, const IntPt *GP=NULL, const int gpt = 0) const;
-  virtual void createIPVariable(IPNonLocalDamageHyperelasic *&ipv,const MElement *ele,const int nbFF,const IntPt *GP, const int gpt) const;
-
-  virtual void initLaws(const std::map<int,materialLaw*> &maplaw){}; // this law is initialized so nothing to do
-  virtual double soundSpeed() const; // default but you can redefine it for your case
-  virtual const CLengthLaw *getCLengthLaw() const {return cLLaw; };
-  virtual const DamageLaw *getDamageLaw() const {return damLaw; };
-  // specific function
- public:
-  virtual void constitutive(
-                            const STensor3& F0,         // initial deformation gradient (input @ time n)
-                            const STensor3& Fn,         // updated deformation gradient (input @ time n+1)
-                            STensor3 &P,                // updated 1st Piola-Kirchhoff stress tensor (output)
-                                                        // contains the initial values on input
-                            const IPNonLocalDamageHyperelasic *q0,       // array of initial internal variable
-                            IPNonLocalDamageHyperelasic *q1,             // updated array of internal variable (in ipvcur on output),
-                            STensor43 &Tangent,         // constitutive tangents (output)
-                            const bool stiff            // if true compute the tangents
-                           ) const;
-
-  virtual void constitutive(
-                            const STensor3& F0,         // initial deformation gradient (input @ time n)
-                            const STensor3& Fn,         // updated deformation gradient (input @ time n+1)
-                            STensor3 &P,                // updated 1st Piola-Kirchhoff stress tensor (output)
-                                                        // contains the initial values on input
-                            const IPNonLocalDamageHyperelasic *q0,       // array of initial internal variable
-                            IPNonLocalDamageHyperelasic *q1,             // updated array of internal variable (in ipvcur on output),
-                            STensor43 &Tangent,         // constitutive tangents (output)
-                            STensor3  &dLocalPlasticStrainDStrain,
-  			                STensor3  &dStressDNonLocalPlasticStrain,
-                            double   &dLocalPlasticStrainDNonLocalPlasticStrain,
-                            const bool stiff            // if true compute the tangents
-                           ) const;
-
-
-#endif // SWIG
-};
-
 class mlawNonLocalDamagePowerYieldHyper : public mlawPowerYieldHyper{
   protected:
     CLengthLaw *cLLaw;
@@ -93,35 +26,20 @@ class mlawNonLocalDamagePowerYieldHyper : public mlawPowerYieldHyper{
   public:
     mlawNonLocalDamagePowerYieldHyper(const int num,const double E,const double nu, const double rho,
           const double tol=1.e-6, const bool matrixbyPerturbation = false, const double pert = 1e-8);
-    mlawNonLocalDamagePowerYieldHyper(const int num,const double E,const double nu, const double rho,
-                        const J2IsotropicHardening &sc,
-                        const J2IsotropicHardening &st,
-                        const CLengthLaw &_cLLaw,
-                        const DamageLaw &_damLaw,
-                        const double tol = 1.e-6,
-                        const bool matrixbyPerturbation = false, const double pert = 1e-8);
-    mlawNonLocalDamagePowerYieldHyper(const int num,const double E,const double nu, const double rho,
-                        const J2IsotropicHardening &sc,
-                        const J2IsotropicHardening &st,
-                        const kinematicHardening &kin,
-                        const CLengthLaw &_cLLaw,
-                        const DamageLaw &_damLaw,
-                        const double tol = 1.e-6,
-                        const bool matrixbyPerturbation = false, const double pert = 1e-8);
+    void setCLengthLaw(const CLengthLaw &_cLLaw);
+    void setDamageLaw(const DamageLaw &_damLaw);
 
    #ifndef SWIG
     mlawNonLocalDamagePowerYieldHyper(const mlawNonLocalDamagePowerYieldHyper &source);
-    mlawNonLocalDamagePowerYieldHyper& operator=(const materialLaw &source);
     virtual ~mlawNonLocalDamagePowerYieldHyper();
 		
 		virtual materialLaw* clone() const { return new mlawNonLocalDamagePowerYieldHyper(*this);}
 
     // function of materialLaw
     virtual matname getType() const{return materialLaw::nonLocalDamagePowerYieldHyper;}
-    virtual bool withDamage() const {return true;};
-    virtual void createIPState(IPNonLocalDamageHyperelasic *ivi, IPNonLocalDamageHyperelasic *iv1, IPNonLocalDamageHyperelasic *iv2) const;
+    virtual void createIPState(IPHyperViscoElastoPlasticNonLocalDamage *ivi, IPHyperViscoElastoPlasticNonLocalDamage *iv1, IPHyperViscoElastoPlasticNonLocalDamage *iv2) const;
     virtual void createIPState(IPStateBase* &ips,const bool* state_=NULL,const MElement *ele=NULL, const int nbFF_=0, const IntPt *GP=NULL, const int gpt = 0) const;
-    virtual void createIPVariable(IPNonLocalDamageHyperelasic *&ipv,const MElement *ele,const int nbFF,const IntPt *GP, const int gpt) const;
+    virtual void createIPVariable(IPHyperViscoElastoPlasticNonLocalDamage *&ipv,const MElement *ele,const int nbFF,const IntPt *GP, const int gpt) const;
 
     virtual void initLaws(const std::map<int,materialLaw*> &maplaw){}; // this law is initialized so nothing to do
     virtual double soundSpeed() const; // default but you can redefine it for your case
@@ -134,8 +52,8 @@ class mlawNonLocalDamagePowerYieldHyper : public mlawPowerYieldHyper{
                               const STensor3& Fn,         // updated deformation gradient (input @ time n+1)
                               STensor3 &P,                // updated 1st Piola-Kirchhoff stress tensor (output)
                                                           // contains the initial values on input
-                              const IPNonLocalDamageHyperelasic *q0,       // array of initial internal variable
-                              IPNonLocalDamageHyperelasic *q1,             // updated array of internal variable (in ipvcur on output),
+                              const IPHyperViscoElastoPlasticNonLocalDamage *q0,       // array of initial internal variable
+                              IPHyperViscoElastoPlasticNonLocalDamage *q1,             // updated array of internal variable (in ipvcur on output),
                               STensor43 &Tangent,         // constitutive tangents (output)
                               const bool stiff            // if true compute the tangents
                              ) const;
@@ -145,8 +63,8 @@ class mlawNonLocalDamagePowerYieldHyper : public mlawPowerYieldHyper{
                               const STensor3& Fn,         // updated deformation gradient (input @ time n+1)
                               STensor3 &P,                // updated 1st Piola-Kirchhoff stress tensor (output)
                                                           // contains the initial values on input
-                              const IPNonLocalDamageHyperelasic *q0,       // array of initial internal variable
-                              IPNonLocalDamageHyperelasic *q1,             // updated array of internal variable (in ipvcur on output),
+                              const IPHyperViscoElastoPlasticNonLocalDamage *q0,       // array of initial internal variable
+                              IPHyperViscoElastoPlasticNonLocalDamage *q1,             // updated array of internal variable (in ipvcur on output),
                               STensor43 &Tangent,         // constitutive tangents (output)
                               STensor3  &dLocalPlasticStrainDStrain,
                           STensor3  &dStressDNonLocalPlasticStrain,
@@ -158,6 +76,53 @@ class mlawNonLocalDamagePowerYieldHyper : public mlawPowerYieldHyper{
 #endif // SWIG
 };
 
+class mlawLocalDamagePowerYieldHyperWithFailure : public mlawPowerYieldHyperWithFailure{
+  protected:
+    std::vector<DamageLaw*> damLaw;
+    bool _saturated; // saturate after reaching critical state
+
+  public:
+    mlawLocalDamagePowerYieldHyperWithFailure(const int num,const double E,const double nu, const double rho,
+          const double tol=1.e-6, const bool matrixbyPerturbation = false, const double pert = 1e-8);
+    
+    void clearAllDamageLaw();
+    void setDamageLaw(const DamageLaw &_damLaw);
+    
+
+   #ifndef SWIG
+    mlawLocalDamagePowerYieldHyperWithFailure(const mlawLocalDamagePowerYieldHyperWithFailure &source);
+    virtual ~mlawLocalDamagePowerYieldHyperWithFailure();
+		
+		virtual materialLaw* clone() const { return new mlawLocalDamagePowerYieldHyperWithFailure(*this);}
+
+    bool isSaturatedHardening() const {return _saturated;};
+    void saturatedHardening(const bool falg) {_saturated = falg;};
+
+    // function of materialLaw
+    virtual matname getType() const{return materialLaw::localDamagePowerYieldHyperWithFailure;}
+    virtual void createIPState(IPHyperViscoElastoPlasticMultipleLocalDamage *ivi, IPHyperViscoElastoPlasticMultipleLocalDamage *iv1, IPHyperViscoElastoPlasticMultipleLocalDamage *iv2) const;
+    virtual void createIPState(IPStateBase* &ips,const bool* state_=NULL,const MElement *ele=NULL, const int nbFF_=0, const IntPt *GP=NULL, const int gpt = 0) const;
+    virtual void createIPVariable(IPHyperViscoElastoPlasticMultipleLocalDamage *&ipv,const MElement *ele,const int nbFF,const IntPt *GP, const int gpt) const;
+
+    virtual void initLaws(const std::map<int,materialLaw*> &maplaw){}; // this law is initialized so nothing to do
+    virtual double soundSpeed() const; // default but you can redefine it for your case
+    virtual const std::vector<DamageLaw*>& getDamageLaw() const {return damLaw; };
+    // specific function
+   public:
+
+    virtual void constitutive(
+                              const STensor3& F0,         // initial deformation gradient (input @ time n)
+                              const STensor3& Fn,         // updated deformation gradient (input @ time n+1)
+                              STensor3 &P,                // updated 1st Piola-Kirchhoff stress tensor (output)
+                              const IPHyperViscoElastoPlasticMultipleLocalDamage *q0,       // array of initial internal variable
+                              IPHyperViscoElastoPlasticMultipleLocalDamage *q1,             // updated array of internal variable (in ipvcur on output),
+                              STensor43 &Tangent,         // constitutive tangents (output)
+                              const bool stiff            // if true compute the tangents
+                             ) const;
+  #endif // SWIG
+};
+
+
 class mlawNonLocalDamagePowerYieldHyperWithFailure : public mlawPowerYieldHyperWithFailure{
   protected:
     std::vector<CLengthLaw*> cLLaw;
@@ -167,25 +132,15 @@ class mlawNonLocalDamagePowerYieldHyperWithFailure : public mlawPowerYieldHyperW
   public:
     mlawNonLocalDamagePowerYieldHyperWithFailure(const int num,const double E,const double nu, const double rho,
           const double tol=1.e-6, const bool matrixbyPerturbation = false, const double pert = 1e-8);
-    mlawNonLocalDamagePowerYieldHyperWithFailure(const int num,const double E,const double nu, const double rho,
-                        const J2IsotropicHardening &sc,
-                        const J2IsotropicHardening &st,
-                        const CLengthLaw &_cLLaw1, const CLengthLaw &_cLLaw2,
-                        const DamageLaw &_damLaw, const DamageLaw &_damLaw2,
-                        const double tol = 1.e-6,
-                        const bool matrixbyPerturbation = false, const double pert = 1e-8);
-    mlawNonLocalDamagePowerYieldHyperWithFailure(const int num,const double E,const double nu, const double rho,
-                        const J2IsotropicHardening &sc,
-                        const J2IsotropicHardening &st,
-                        const kinematicHardening &kin,
-                        const CLengthLaw &_cLLaw1, const CLengthLaw &_cLLaw2,
-                        const DamageLaw &_damLaw1, const DamageLaw &_damLaw2,
-                        const double tol = 1.e-6,
-                        const bool matrixbyPerturbation = false, const double pert = 1e-8);
+    
+    void clearAllCLengthLaw();
+    void clearAllDamageLaw();
+    void setCLengthLaw(const CLengthLaw &_cLLaw);
+    void setDamageLaw(const DamageLaw &_damLaw);
+    
 
    #ifndef SWIG
     mlawNonLocalDamagePowerYieldHyperWithFailure(const mlawNonLocalDamagePowerYieldHyperWithFailure &source);
-    mlawNonLocalDamagePowerYieldHyperWithFailure& operator=(const materialLaw &source);
     virtual ~mlawNonLocalDamagePowerYieldHyperWithFailure();
 		
 		virtual materialLaw* clone() const { return new mlawNonLocalDamagePowerYieldHyperWithFailure(*this);}
@@ -195,10 +150,9 @@ class mlawNonLocalDamagePowerYieldHyperWithFailure : public mlawPowerYieldHyperW
 
     // function of materialLaw
     virtual matname getType() const{return materialLaw::nonLocalDamagePowerYieldHyperWithFailure;}
-    virtual bool withDamage() const {return true;};
-    virtual void createIPState(IPNonLocalDamageHyperelasicWithFailure *ivi, IPNonLocalDamageHyperelasicWithFailure *iv1, IPNonLocalDamageHyperelasicWithFailure *iv2) const;
+    virtual void createIPState(IPHyperViscoElastoPlasticMultipleNonLocalDamage *ivi, IPHyperViscoElastoPlasticMultipleNonLocalDamage *iv1, IPHyperViscoElastoPlasticMultipleNonLocalDamage *iv2) const;
     virtual void createIPState(IPStateBase* &ips,const bool* state_=NULL,const MElement *ele=NULL, const int nbFF_=0, const IntPt *GP=NULL, const int gpt = 0) const;
-    virtual void createIPVariable(IPNonLocalDamageHyperelasicWithFailure *&ipv,const MElement *ele,const int nbFF,const IntPt *GP, const int gpt) const;
+    virtual void createIPVariable(IPHyperViscoElastoPlasticMultipleNonLocalDamage *&ipv,const MElement *ele,const int nbFF,const IntPt *GP, const int gpt) const;
 
     virtual void initLaws(const std::map<int,materialLaw*> &maplaw){}; // this law is initialized so nothing to do
     virtual double soundSpeed() const; // default but you can redefine it for your case
@@ -210,8 +164,8 @@ class mlawNonLocalDamagePowerYieldHyperWithFailure : public mlawPowerYieldHyperW
                               const STensor3& F0,         // initial deformation gradient (input @ time n)
                               const STensor3& Fn,         // updated deformation gradient (input @ time n+1)
                               STensor3 &P,                // updated 1st Piola-Kirchhoff stress tensor (output)
-                              const IPNonLocalDamageHyperelasicWithFailure *q0,       // array of initial internal variable
-                              IPNonLocalDamageHyperelasicWithFailure *q1,             // updated array of internal variable (in ipvcur on output),
+                              const IPHyperViscoElastoPlasticMultipleNonLocalDamage *q0,       // array of initial internal variable
+                              IPHyperViscoElastoPlasticMultipleNonLocalDamage *q1,             // updated array of internal variable (in ipvcur on output),
                               STensor43 &Tangent,         // constitutive tangents (output)
                               const bool stiff            // if true compute the tangents
                              ) const;
@@ -220,8 +174,8 @@ class mlawNonLocalDamagePowerYieldHyperWithFailure : public mlawPowerYieldHyperW
                               const STensor3& F0,         // initial deformation gradient (input @ time n)
                               const STensor3& Fn,         // updated deformation gradient (input @ time n+1)
                               STensor3 &P,                // updated 1st Piola-Kirchhoff stress tensor (output)
-                              const IPNonLocalDamageHyperelasicWithFailure *q0,       // array of initial internal variable
-                              IPNonLocalDamageHyperelasicWithFailure *q1,             // updated array of internal variable (in ipvcur on output),
+                              const IPHyperViscoElastoPlasticMultipleNonLocalDamage *q0,       // array of initial internal variable
+                              IPHyperViscoElastoPlasticMultipleNonLocalDamage *q1,             // updated array of internal variable (in ipvcur on output),
                               STensor43 &Tangent,         // constitutive tangents (output)
                               std::vector<STensor3>  &dLocalVariableDStrain,
                               std::vector<STensor3>  &dStressDNonLocalVariable,
diff --git a/NonLinearSolver/materialLaw/mlawNonLocalDamageIsotropicElasticity.cpp b/NonLinearSolver/materialLaw/mlawNonLocalDamageIsotropicElasticity.cpp
index ae81f06bdf80c1b09b63945f53a62e7d672d63fe..3246c9b3e23bf7e87f379659617ac08ce2dc9580 100644
--- a/NonLinearSolver/materialLaw/mlawNonLocalDamageIsotropicElasticity.cpp
+++ b/NonLinearSolver/materialLaw/mlawNonLocalDamageIsotropicElasticity.cpp
@@ -11,6 +11,7 @@
 #include "mlawNonLocalDamageIsotropicElasticity.h"
 #include <math.h>
 #include "MInterfaceElement.h"
+#include "nonLinearMechSolver.h"
 
 
 mlawNonLocalDamageIsotropicElasticity::mlawNonLocalDamageIsotropicElasticity(const int num,const double rho, const double E,
@@ -217,15 +218,14 @@ void  mlawNonLocalDamageIsotropicElasticity::constitutive(
 
 
 // - Elastic energy release rate
-  q1->getRefToElasticEnergy() = deformationEnergy(epsilon_strains,Peff);
-
+  double effEner = deformationEnergy(epsilon_strains,Peff);
 
 // - Damage computation and transition managing
-  if (q0->damageIsBlocked())
+  if (q0->dissipationIsBlocked())
   {
   // If damage evolution is blocked (ie. bulk near a crack):
     // ==> keep damage constant
-    q1->blockDamage(true);
+    q1->blockDissipation(true);
     q1->setNonLocalToLocal(false);
     q1->setCriticalDamage(q0->getCriticalDamage());
     IPDamage& curDama = q1->getRefToIPDamage();
@@ -234,14 +234,14 @@ void  mlawNonLocalDamageIsotropicElasticity::constitutive(
     curDama.getRefToDDamageDFe() *= 0.;
     curDama.getRefToDeltaDamage() = 0;
     curDama.getRefToMaximalP() = q0->getMaximalP();
-    //Msg::Info("stop damage cur %e prev %e critical cur %e prev %e and flag %e",q1->getDamage(),q0->getDamage(),q1->getCriticalDamage(),q0->getCriticalDamage(),q0->damageIsBlocked());
+    //Msg::Info("stop damage cur %e prev %e critical cur %e prev %e and flag %e",q1->getDamage(),q0->getDamage(),q1->getCriticalDamage(),q0->getCriticalDamage(),q0->dissipationIsBlocked());
 		
 		q1->activeDamage(false);
   }
   else
   {
   // If damage evolution is not blocked,
-    q1->blockDamage(false);
+    q1->blockDissipation(false);
 
     // If local transition is allowed: (ie cracked interface)
     if (q0->getNonLocalToLocal())
@@ -251,9 +251,9 @@ void  mlawNonLocalDamageIsotropicElasticity::constitutive(
       q1->getRefToNonLocalEffectiveStrains() = q0->getNonLocalEffectiveStrains() + (q1->getLocalEffectiveStrains() - q0->getLocalEffectiveStrains());
       // q1->setCriticalDamage(q0->getCriticalDamage()); done at cohesive ipv::transfer DatatoBulk
       _damLaw->computeDamage(q1->getNonLocalEffectiveStrains(), q0->getNonLocalEffectiveStrains(),
-                             q1->defoEnergy(), F1, 0., Peff, _ElasticityTensor,
+                             effEner, F1, 0., Peff, _ElasticityTensor,
                              q0->getConstRefToIPDamage(), q1->getRefToIPDamage());
-      //Msg::Info("local damage cur %e prev %e critical cur %e prev %e and flag %e",q1->getDamage(),q0->getDamage(),q1->getCriticalDamage(),q0->getCriticalDamage(),q0->damageIsBlocked());
+      //Msg::Info("local damage cur %e prev %e critical cur %e prev %e and flag %e",q1->getDamage(),q0->getDamage(),q1->getCriticalDamage(),q0->getCriticalDamage(),q0->dissipationIsBlocked());
     }
     else
     {
@@ -265,7 +265,7 @@ void  mlawNonLocalDamageIsotropicElasticity::constitutive(
       if(q0->getDamage() < q0->getCriticalDamage())
       {
         _damLaw->computeDamage(q1->getNonLocalEffectiveStrains(), q0->getNonLocalEffectiveStrains(),
-                             q1->defoEnergy(), F1, 0., Peff, _ElasticityTensor,
+                             effEner, F1, 0., Peff, _ElasticityTensor,
                              q0->getConstRefToIPDamage(), q1->getRefToIPDamage());
       }
       else
@@ -277,7 +277,7 @@ void  mlawNonLocalDamageIsotropicElasticity::constitutive(
         curDama.getRefToDeltaDamage() = 0;
         curDama.getRefToMaximalP() = q0->getMaximalP();
       }
-     //Msg::Info("nl damage cur %e prev %e critical cur %e prev %e and flag %e",q1->getDamage(),q0->getDamage(),q1->getCriticalDamage(),q0->getCriticalDamage(),q0->damageIsBlocked());
+     //Msg::Info("nl damage cur %e prev %e critical cur %e prev %e and flag %e",q1->getDamage(),q0->getDamage(),q1->getCriticalDamage(),q0->getCriticalDamage(),q0->dissipationIsBlocked());
     }
 
 
@@ -297,7 +297,7 @@ void  mlawNonLocalDamageIsotropicElasticity::constitutive(
   // If nonlocal diffusion is restrained (ie. bulk near a crack after crack insertion)
   if (_nonLocalLimitingMethod == 1)
   {
-    if (q0->damageIsBlocked())
+    if (q0->dissipationIsBlocked())
     {
       // Recopying previous max/critical value and restrained local value if needed
       q1->getRefToCriticalEffectiveStrains() = q0->getCriticalEffectiveStrains();
@@ -330,7 +330,7 @@ void  mlawNonLocalDamageIsotropicElasticity::constitutive(
 
 
 // - Stored energy computation
-  q1->getRefToElasticEnergy() *= (1.-D);
+  q1->getRefToElasticEnergy() = effEner*(1-D);
 
 
 // - Tangent data computation
@@ -401,33 +401,61 @@ void  mlawNonLocalDamageIsotropicElasticity::constitutive(
 
   }
   
+  q1->getRefToDamageEnergy() = q0->damageEnergy() + effEner* (D-q0->getDamage());
+  
   // Path following only - irreversible energy
   // Dissipated energy = previous dissipated energy + Y delta_D
-  q1->getRefToIrreversibleEnergy() = q0->irreversibleEnergy() + q1->defoEnergy()/(1.-q1->getDamage()) * (D-q0->getDamage());
-  if (stiff)
-  {
-    if (q0->getNonLocalToLocal())
+  if (this->getMacroSolver()->withPathFollowing()){
+    if (this->getMacroSolver()->getPathFollowingLocalIncrementType() == nonLinearMechSolver::DEFO_ENERGY){
+      q1->getRefToIrreversibleEnergy() = q1->defoEnergy();
+    }
+    else if ((this->getMacroSolver()->getPathFollowingLocalIncrementType() == nonLinearMechSolver::DISSIPATION_ENERGY) or 
+            (this->getMacroSolver()->getPathFollowingLocalIncrementType() == nonLinearMechSolver::DAMAGE_ENERGY)){
+      q1->getRefToIrreversibleEnergy() = q1->damageEnergy();
+    
+    }
+    else{
+      q1->getRefToIrreversibleEnergy() = 0.;
+    }
+  
+    
+    if (stiff)
     {
       STensor3& DIrrevEnergyDF = q1->getRefToDIrreversibleEnergyDF();
-      for (int i=0; i<3; i++)
-      {
-        for (int j=0; j<3; j++)
+      double& DIrrevEnergyDNonlocalVar = q1->getRefToDIrreversibleEnergyDNonLocalVariable();
+      
+      DIrrevEnergyDF = Peff;
+      
+      if (this->getMacroSolver()->getPathFollowingLocalIncrementType() == nonLinearMechSolver::DEFO_ENERGY){
+        DIrrevEnergyDF*= (1.-D);
+        if (q0->getNonLocalToLocal()){
+          DIrrevEnergyDF.daxpy(dLocalEffectiveStrainsDStrains,-q1->getDDamageDp()*effEner);
+          DIrrevEnergyDNonlocalVar = 0.;
+        }
+        else
         {
-          DIrrevEnergyDF(i,j) = Peff(i,j)*(D-q0->getDamage()) + q1->defoEnergy()/(1.-q1->getDamage())*q1->getDDamageDp()*dLocalEffectiveStrainsDStrains(i,j);
+          DIrrevEnergyDNonlocalVar =  -effEner*q1->getDDamageDp();
         }
       }
-      q1->getRefToDIrreversibleEnergyDNonLocalVariable() = 0.;
-      dLocalEffectiveStrainsDStrains *= 0.;
-    }
-    else
-    {
-      q1->getRefToDIrreversibleEnergyDF() = Peff;
-      q1->getRefToDIrreversibleEnergyDF() *= (D-q0->getDamage());
-      q1->getRefToDIrreversibleEnergyDNonLocalVariable() = q1->defoEnergy()/(1.-q1->getDamage()) * q1->getDDamageDp();
+      else if ((this->getMacroSolver()->getPathFollowingLocalIncrementType() == nonLinearMechSolver::DISSIPATION_ENERGY) or 
+            (this->getMacroSolver()->getPathFollowingLocalIncrementType() == nonLinearMechSolver::DAMAGE_ENERGY)){
+        DIrrevEnergyDF *= (D - q0->getDamage());
+        if (q0->getNonLocalToLocal()){
+          DIrrevEnergyDF.daxpy(dLocalEffectiveStrainsDStrains,q1->getDDamageDp()*effEner);
+          DIrrevEnergyDNonlocalVar = 0.;
+        }
+        else
+        {
+          DIrrevEnergyDNonlocalVar =  effEner*q1->getDDamageDp();
+        }
+      }
+      else{
+        DIrrevEnergyDF = 0.;
+        DIrrevEnergyDNonlocalVar = 0.;
+      }
     }
   }
   
-  
 }
 
 
diff --git a/NonLinearSolver/materialLaw/mlawNonLocalDamageIsotropicElasticity.h b/NonLinearSolver/materialLaw/mlawNonLocalDamageIsotropicElasticity.h
index a4c4a340da5fe0b4b04151b02693d7983f501f58..62f6aa5de36b25fbcee0ba21e74ffae7039a23c6 100644
--- a/NonLinearSolver/materialLaw/mlawNonLocalDamageIsotropicElasticity.h
+++ b/NonLinearSolver/materialLaw/mlawNonLocalDamageIsotropicElasticity.h
@@ -48,7 +48,6 @@ public:
 
     // General functions
     virtual matname getType() const {return materialLaw::nonLocalDamageIsotropicElasticity;}
-    virtual bool withDamage() const {return true;};
     virtual bool withEnergyDissipation() const {return true;};
     virtual void createIPState(IPStateBase* &ips,const bool* state_ = NULL,const MElement *ele = NULL, const int nbFF_ = 0, const IntPt *GP=NULL, const int gpt=0) const;
     virtual void createIPState(IPNonLocalDamageIsotropicElasticity *ivi, IPNonLocalDamageIsotropicElasticity *iv1, IPNonLocalDamageIsotropicElasticity *iv2) const;
diff --git a/NonLinearSolver/materialLaw/mlawNonLocalDamageJ2Hyper.cpp b/NonLinearSolver/materialLaw/mlawNonLocalDamageJ2Hyper.cpp
index 267d29500584eb2abbd63f977d844492e53030df..644c7297b7e661dac3a74f449eb852e79892670b 100644
--- a/NonLinearSolver/materialLaw/mlawNonLocalDamageJ2Hyper.cpp
+++ b/NonLinearSolver/materialLaw/mlawNonLocalDamageJ2Hyper.cpp
@@ -12,6 +12,7 @@
 #include "mlawNonLocalDamageJ2Hyper.h"
 #include <math.h>
 #include "MInterfaceElement.h"
+#include "nonLinearMechSolver.h"
 
 mlawNonLocalDamageJ2Hyper::mlawNonLocalDamageJ2Hyper(const int num,const double E,const double nu,
                            const double rho, const J2IsotropicHardening &_j2IH,
@@ -128,13 +129,13 @@ void mlawNonLocalDamageJ2Hyper::constitutive(
                             const bool stiff            // if true compute the tangents
                            ) const
 {
-  double p0 = ipvprev->getCurrentPlasticStrain();
+  double p0 = ipvprev->getConstRefToEquivalentPlasticStrain();
   cLLaw->computeCL(p0, ipvcur->getRefToIPCLength());
 
   static STensor43 dFpdF, dFedF;
   static STensor3 Fe, Peff;
   static STensor3 Fpinv;
-  STensor3 &dpdF=ipvcur->getRefToDLocalPlasticStrainDStrain();
+  static STensor3 dpdF;
 
   mlawJ2linear::predictorCorector(F0,Fn,Peff,ipvprev,ipvcur,Tangent,dFpdF,dFedF,dpdF,stiff);
   
@@ -144,8 +145,8 @@ void mlawNonLocalDamageJ2Hyper::constitutive(
 
   double ene = ipvcur->defoEnergy();
 
-  if (ipvprev->damageIsBlocked()){
-    ipvcur->blockDamage(true);
+  if (ipvprev->dissipationIsBlocked()){
+    ipvcur->blockDissipation(true);
     // at bulk elelent when damage is blocked
     // damage stop increasing
     IPDamage& curDama = ipvcur->getRefToIPDamage();
@@ -155,7 +156,7 @@ void mlawNonLocalDamageJ2Hyper::constitutive(
     curDama.getRefToDeltaDamage() = 0;
     curDama.getRefToMaximalP() = ipvprev->getMaximalP();
     // damage is not active
-    ipvcur->activeDamage(false);
+    ipvcur->getRefToDissipationActive() =  false;
 
   }
   else{
@@ -166,7 +167,7 @@ void mlawNonLocalDamageJ2Hyper::constitutive(
       // increment of non-local plastic strain by true plastic strain
       // in order to obtain damage continuously developed
       ipvcur->getRefToEffectivePlasticStrain() = ipvprev->getEffectivePlasticStrain();
-      ipvcur->getRefToEffectivePlasticStrain() += (ipvcur->getCurrentPlasticStrain() - ipvprev->getCurrentPlasticStrain());
+      ipvcur->getRefToEffectivePlasticStrain() += (ipvcur->getConstRefToEquivalentPlasticStrain() - ipvprev->getConstRefToEquivalentPlasticStrain());
       // computed damage with current effective plastic strain
       damLaw->computeDamage(ipvcur->getEffectivePlasticStrain(),
                         ipvprev->getEffectivePlasticStrain(),
@@ -187,11 +188,11 @@ void mlawNonLocalDamageJ2Hyper::constitutive(
 
     }
 
-    if (ipvcur->getDamage() > ipvprev->getDamage() and ipvcur->getCurrentPlasticStrain() > ipvprev->getCurrentPlasticStrain()){
-      ipvcur->activeDamage(true);
+    if (ipvcur->getDamage() > ipvprev->getDamage() and ipvcur->getConstRefToEquivalentPlasticStrain() > ipvprev->getConstRefToEquivalentPlasticStrain()){
+      ipvcur->getRefToDissipationActive() = true;
     }
     else{
-      ipvcur->activeDamage(false);
+      ipvcur->getRefToDissipationActive() = false;
     }
   }
 
@@ -202,25 +203,35 @@ void mlawNonLocalDamageJ2Hyper::constitutive(
   // get true PK1 stress from damage and effective PK1 stress
 	P = Peff;
   P*=(1.-D);
-  double elEne = (1-D)*ene;
-  ipvcur->_elasticEnergy=elEne;
-	
-	double dp=ipvcur->getCurrentPlasticStrain()-ipvprev->getCurrentPlasticStrain();
-	double Sy0 = ipvprev->getConstRefToIPJ2IsotropicHardening().getR();
-	double Sy = ipvcur->getConstRefToIPJ2IsotropicHardening().getR();
-  double enePrev = ipvprev->_elasticEnergy/(1.- ipvprev->getDamage());
-	// compute irreversible energy
-	double& dissEnerg = ipvcur->getRefToIrreversibleEnergy();
-	dissEnerg = ipvprev->irreversibleEnergy();
-	if (this->_pfApproxMethod == mlawJ2linear::Explicit){
-		dissEnerg+= (1-D0)*Sy0*dp + enePrev*(D-D0);
-	}
-	else if (this->_pfApproxMethod == mlawJ2linear::Implicit){
-		dissEnerg+= (1-D)*Sy*dp + ene*(D-D0);
-	}
-	else{
-		Msg::Fatal("path following approx method %d has been implemented",this->_pfApproxMethod);
-	}
+  
+  ipvcur->getRefToElasticEnergy()*= (1.-D);
+  ipvcur->getRefToPlasticPower() *= (1.-D);
+  
+  double Sy   = ipvcur->getConstRefToIPJ2IsotropicHardening().getR();
+  double H    = ipvcur->getConstRefToIPJ2IsotropicHardening().getDR();
+  double Deps = ipvcur->getConstRefToEquivalentPlasticStrain() - ipvprev->getConstRefToEquivalentPlasticStrain();
+  ipvcur->getRefToPlasticEnergy() = (1-D)*Sy*Deps +ipvprev->plasticEnergy();
+  ipvcur->getRefToDamageEnergy() = ene*(D-D0) + ipvprev->damageEnergy();
+  
+  if (this->getMacroSolver()->withPathFollowing()){
+    // irreversible energy
+    double& irrEneg = ipvcur->getRefToIrreversibleEnergy();
+    if (this->getMacroSolver()->getPathFollowingLocalIncrementType() == nonLinearMechSolver::DEFO_ENERGY){
+      irrEneg = ipvcur->defoEnergy();
+    }
+    else if (this->getMacroSolver()->getPathFollowingLocalIncrementType() == nonLinearMechSolver::PLASTIC_ENERGY){
+      irrEneg = ipvcur->plasticEnergy();
+    }
+    else if (this->getMacroSolver()->getPathFollowingLocalIncrementType() == nonLinearMechSolver::DAMAGE_ENERGY) {
+      irrEneg = ipvcur->damageEnergy();
+    }
+    else if (this->getMacroSolver()->getPathFollowingLocalIncrementType() == nonLinearMechSolver::DISSIPATION_ENERGY){
+      irrEneg = ipvcur->plasticEnergy()+ ipvcur->damageEnergy();
+    }
+    else{
+      irrEneg = 0.;
+    }
+  }
 
   if(stiff)
   {
@@ -253,7 +264,7 @@ void mlawNonLocalDamageJ2Hyper::constitutive(
     }
 
     // partial p/partial F
-    dLocalPlasticStrainDStrain = ipvcur->getConstRefToDLocalPlasticStrainDStrain();
+    dLocalPlasticStrainDStrain = dpdF;
 
     // -hat{P} partial D/partial tilde p
     if (ipvprev->getNonLocalToLocal()){
@@ -264,40 +275,105 @@ void mlawNonLocalDamageJ2Hyper::constitutive(
     }
 
     // partial p partial tilde p (0 if no MFH)
-    ipvcur->getRefToDLocalPlasticStrainDNonLocalPlasticStrain()=0;
-    dLocalPlasticStrainDNonLocalPlasticStrain = ipvcur->getDLocalPlasticStrainDNonLocalPlasticStrain();
-		
-		
-		// compute derivative of irreversive energy
-		STensor3& DdissEnergDF = ipvcur->getRefToDIrreversibleEnergyDF();
-		double& DdissEnergDNonlocalVar = ipvcur->getRefToDIrreversibleEnergyDNonLocalVariable();
-		
-		if (this->_pfApproxMethod == mlawJ2linear::Explicit){
-			DdissEnergDF = dpdF;
-			DdissEnergDF *= ((1-D0)*Sy0);
-			DdissEnergDF.daxpy(DDamageDF,enePrev);
-			
-			DdissEnergDNonlocalVar = ipvcur->getDDamageDp();
-			DdissEnergDNonlocalVar *= (enePrev);
-		}
-		else if (this->_pfApproxMethod == mlawJ2linear::Implicit){
-			double H = ipvcur->getConstRefToIPJ2IsotropicHardening().getDR();
-			DdissEnergDF = Peff;
-      DdissEnergDF*= (D-D0);
-      double DdissDD = ene - Sy*dp;
-      DdissEnergDF.daxpy(DDamageDF,DdissDD);
+    dLocalPlasticStrainDNonLocalPlasticStrain = 0.;
+    
+    STensor3& DplasticPowerDF = ipvcur->getRefToDPlasticPowerDF();
+    DplasticPowerDF *= (1-D);
+    DplasticPowerDF.daxpy(DDamageDF,-ipvcur->getConstRefToPlasticPower()/(1.-D));
+    
+		if (this->getMacroSolver()->withPathFollowing()){
+      // irreversible energy
+      STensor3& DdissEnergDF = ipvcur->getRefToDIrreversibleEnergyDF();
+      double& DdissEnergDNonlocalVar = ipvcur->getRefToDIrreversibleEnergyDNonLocalVariable();
       
-      double DdissDp = (1-D)*(Sy+H*dp);
-      DdissEnergDF.daxpy(dpdF,DdissDp);
+      if (this->getMacroSolver()->getPathFollowingLocalIncrementType() == nonLinearMechSolver::DEFO_ENERGY){
+        for(int i=0;i<3;i++){
+          for(int j=0;j<3;j++){
+            DdissEnergDF(i,j) = 0.;
+            for(int k=0;k<3;k++){
+              for(int l=0;l<3;l++){
+                for (int m=0; m<3; m++){
+                  DdissEnergDF(i,j) += Peff(k,m)*Fp(l,m)*dFedF(k,l,i,j)*(1.-D);
+                }
+              }
+            }
+          }
+        }
+        DdissEnergDF.daxpy(DDamageDF,-ene);
+        if (ipvprev->getNonLocalToLocal()){
+          DdissEnergDF.daxpy(dpdF,-ipvcur->getDDamageDp()*ene);
+          DdissEnergDNonlocalVar = 0.;
+        }
+        else{
+          DdissEnergDNonlocalVar = -ipvcur->getDDamageDp()*ene;
+        }
+      }
+      else if (this->getMacroSolver()->getPathFollowingLocalIncrementType() == nonLinearMechSolver::PLASTIC_ENERGY){
+        DdissEnergDF = dpdF;
+        DdissEnergDF *= ((1-D)*(Sy+ H*Deps));
+        DdissEnergDF.daxpy(DDamageDF,-Sy*Deps);
+        
+        if (ipvprev->getNonLocalToLocal()){
+          DdissEnergDF.daxpy(dpdF,-ipvcur->getDDamageDp()*Sy*Deps);
+          DdissEnergDNonlocalVar = 0.;
+        }
+        else{
+          DdissEnergDNonlocalVar = -ipvcur->getDDamageDp()*Sy*Deps;
+        }
+      }
+      else if (this->getMacroSolver()->getPathFollowingLocalIncrementType() == nonLinearMechSolver::DAMAGE_ENERGY) {
+        for(int i=0;i<3;i++){
+          for(int j=0;j<3;j++){
+            DdissEnergDF(i,j) = 0.;
+            for(int k=0;k<3;k++){
+              for(int l=0;l<3;l++){
+                for (int m=0; m<3; m++){
+                  DdissEnergDF(i,j) += Peff(k,m)*Fp(l,m)*dFedF(k,l,i,j)*(D-D0);
+                }
+              }
+            }
+          }
+        }
+        DdissEnergDF.daxpy(DDamageDF,ene);
+        if (ipvprev->getNonLocalToLocal()){
+          DdissEnergDF.daxpy(dpdF, ipvcur->getDDamageDp()*ene);
+          DdissEnergDNonlocalVar = 0.;
+        }
+        else{
+          DdissEnergDNonlocalVar = ipvcur->getDDamageDp()*ene;
+        }
+        
+      }
+      else if (this->getMacroSolver()->getPathFollowingLocalIncrementType() == nonLinearMechSolver::DISSIPATION_ENERGY){
+        DdissEnergDF *= (1-D);
+        for(int i=0;i<3;i++){
+          for(int j=0;j<3;j++){
+            for(int k=0;k<3;k++){
+              for(int l=0;l<3;l++){
+                for (int m=0; m<3; m++){
+                  DdissEnergDF(i,j) += Peff(k,m)*Fp(l,m)*dFedF(k,l,i,j)*(D-D0);
+                }
+              }
+            }
+          }
+        }
+        
+        double DdissDD = ene - Sy*Deps;
+        DdissEnergDF.daxpy(DDamageDF,DdissDD);
+        if (ipvprev->getNonLocalToLocal()){
+          DdissEnergDF.daxpy(dpdF, ipvcur->getDDamageDp()*DdissDD);
+          DdissEnergDNonlocalVar = 0.;
+        }
+        else{
+          DdissEnergDNonlocalVar = ipvcur->getDDamageDp()*DdissDD;
+        }
+      }
+      else{
+        DdissEnergDF *= 0.;
+        DdissEnergDNonlocalVar = 0.;
+      }
       
-
-			DdissEnergDNonlocalVar = ipvcur->getDDamageDp()*DdissDD;
-		}
-		else{
-			Msg::Fatal("path following approx method %d has been implemented",this->_pfApproxMethod);
-		}
-
-		
+    }
   }
 }
 
diff --git a/NonLinearSolver/materialLaw/mlawNonLocalDamageJ2Hyper.h b/NonLinearSolver/materialLaw/mlawNonLocalDamageJ2Hyper.h
index 5d2f9517d0c7a0be5427607ec4cca3a49a3c1d0b..da7f12af34a1fc01a9ef70e20a8c297b97fa6059 100644
--- a/NonLinearSolver/materialLaw/mlawNonLocalDamageJ2Hyper.h
+++ b/NonLinearSolver/materialLaw/mlawNonLocalDamageJ2Hyper.h
@@ -39,7 +39,6 @@ class mlawNonLocalDamageJ2Hyper : public mlawJ2linear
 	virtual materialLaw* clone() const {return new mlawNonLocalDamageJ2Hyper(*this);}
   // function of materialLaw
   virtual matname getType() const{return materialLaw::nonLocalDamageJ2Hyper;}
-  virtual bool withDamage() const {return true;};
   virtual bool withEnergyDissipation() const {return true;};
   virtual void createIPState(IPNonLocalDamageJ2Hyper *ivi, IPNonLocalDamageJ2Hyper *iv1, IPNonLocalDamageJ2Hyper *iv2) const;
   virtual void createIPState(IPStateBase* &ips,const bool* state_=NULL,const MElement *ele=NULL, const int nbFF_=0, const IntPt *GP=NULL, const int gpt = 0) const;
diff --git a/NonLinearSolver/materialLaw/nonLocalDamageLaw.h b/NonLinearSolver/materialLaw/nonLocalDamageLaw.h
index 0ac792a499d90fd28aa5f40045cbe0b14359ac46..6fda3a6500c1689cbbcdbda6c1efb9742ff1efd5 100644
--- a/NonLinearSolver/materialLaw/nonLocalDamageLaw.h
+++ b/NonLinearSolver/materialLaw/nonLocalDamageLaw.h
@@ -27,7 +27,6 @@ class materialLawWithDamage : public materialLaw
   virtual matname getType() const=0;
 	virtual materialLaw* clone() const = 0;
   virtual bool withEnergyDissipation() const {return true;};
-  virtual bool withDamage() const {return true;};
   virtual void createIPState(IPStateBase* &ips,const bool* state_=NULL,const MElement *ele=NULL, const int nbFF_=0, const IntPt *GP=NULL, const int gpt = 0) const=0;
   virtual void initLaws(const std::map<int,materialLaw*> &maplaw)=0;
   // specific functions
diff --git a/NonLinearSolver/materialLaw/numericalMaterial.cpp b/NonLinearSolver/materialLaw/numericalMaterial.cpp
index f37e879d13ae38166ce91234b24f8a736e88d27e..4ccdf599018b6f05f1ab8499b137999f8d1bf154 100644
--- a/NonLinearSolver/materialLaw/numericalMaterial.cpp
+++ b/NonLinearSolver/materialLaw/numericalMaterial.cpp
@@ -61,7 +61,6 @@ void numericalMaterialBase::distributeMacroIP(const std::vector<int>& allIPNum,
 
 numericalMaterial::numericalMaterial(int tag)
                    :numericalMaterialBase(),_tag(tag),_numstep(1),_tol(1e-6),_absTol(1e-10),
-										_xPeriodicity(0.,0.,0.),_yPeriodicity(0.,0.,0.),_zPeriodicity(0.,0.,0.),
                     _stressFlag(true),_stressIntegFlag(0), _sameStateCriterion(1e-10),
                     _tangentFlag(true),_tangentIntegFlag(0),_tangentPerturbation(1.e-7),
                     _isIterative(true),_stiffModification(true),
@@ -89,10 +88,6 @@ numericalMaterial::numericalMaterial(const numericalMaterial& src):numericalMate
   _meshDim = src._meshDim;
   _meshOrder = src._meshOrder;
   _meshIncomplete = src._meshIncomplete;
-
-  _xPeriodicity = src._xPeriodicity;
-  _yPeriodicity = src._yPeriodicity;
-  _zPeriodicity = src._zPeriodicity; // micro-perioidcity
 
   _stressFlag = src._stressFlag;
   _stressIntegFlag = src._stressIntegFlag; // 0- volume, 1-surface
@@ -225,9 +220,7 @@ nonLinearMechSolver* numericalMaterial::createMicroSolver(const int ele, const i
   if (_rveVolume >0){
     solver->setRVEVolume(_rveVolume);
   }
-  /**set micro periodicity**/
-  solver->setPeriodicity(_xPeriodicity,_yPeriodicity,_zPeriodicity);
-
+  
   /** set micro BC**/
   if (_microBC == NULL){
 		Msg::Fatal("microscopic BC must be specified to launch multiscale analyses");
@@ -351,27 +344,6 @@ void numericalMaterial::setPerturbationMaterialLawIP(const int ele, const int ip
 void numericalMaterial::addPerturbationMaterialLaw(materialLaw* mlaw){
   _allPertubationLaw.push_back(mlaw);
 }
-// set micro periodicity
-void numericalMaterial::setPeriodicity(const double x, const double y, const double z, const std::string direction){
-  if ((direction =="x") or (direction =="X")){
-		_xPeriodicity(0) = x;
-		_xPeriodicity(1) = y;
-		_xPeriodicity(2) = z;
-	}
-	else if ((direction =="y") or (direction =="Y")){
-		_yPeriodicity(0) = x;
-		_yPeriodicity(1) = y;
-		_yPeriodicity(2) = z;
-	}
-	else if ((direction =="z") or (direction =="Z")){
-		_zPeriodicity(0) = x;
-		_zPeriodicity(1) = y;
-		_zPeriodicity(2) = z;
-	}
-	else{
-    Msg::Error("periodic geometry must be correctly defined");
-	}
-};
 
 void numericalMaterial::addMicroBC(nonLinearMicroBC* bc){
   _microBC = bc;
diff --git a/NonLinearSolver/materialLaw/numericalMaterial.h b/NonLinearSolver/materialLaw/numericalMaterial.h
index f5904d5e31ebbed985e59c26134dbe82d1d032b6..632b44d464469f753ea6aaaa7cbbdac5184d13ba 100644
--- a/NonLinearSolver/materialLaw/numericalMaterial.h
+++ b/NonLinearSolver/materialLaw/numericalMaterial.h
@@ -140,8 +140,6 @@ class numericalMaterial : public numericalMaterialBase{
 
     std::set<int> _pertMaterialLawIP; // all perturbed by material law
     std::vector<materialLaw*> _allPertubationLaw; // all perturbed law
-
-    SVector3 _xPeriodicity, _yPeriodicity, _zPeriodicity; // micro-perioidcity
 		
     // initial BCs
     std::vector<initialBoundaryCondition> _allInitialBC;
@@ -202,8 +200,6 @@ class numericalMaterial : public numericalMaterialBase{
 		virtual void addPertutationalMeshIP(const int ele, const int ip, const std::string meshfile);
     virtual void setPerturbationMaterialLawIP(const int ele, const int ip);
     virtual void addPerturbationMaterialLaw(materialLaw* mlaw);
-		// set micro periodicity
-		virtual void setPeriodicity(const double x,const double y,const double z, const std::string direction);
 		// add micro BC
     virtual void addMicroBC(nonLinearMicroBC* bc);
 		// set tolerence for micro newton-raphson
diff --git a/NonLinearSolver/nlsolver/homogenizedData.cpp b/NonLinearSolver/nlsolver/homogenizedData.cpp
index 64bed5a9103c1f69fb878400a24bb8f56e310ea7..88bd995f214f6f4d6f13670bac2dbcc22ac73dc5 100644
--- a/NonLinearSolver/nlsolver/homogenizedData.cpp
+++ b/NonLinearSolver/nlsolver/homogenizedData.cpp
@@ -135,7 +135,7 @@ dfluxVdF(src.dfluxVdF),dfluxVdG(src.dfluxVdG),dfluxVdgradT(src.dfluxVdgradT),dfl
 dsrcTdF(src.dsrcTdF),dsrcTdG(src.dsrcTdG),dsrcTdgradT(src.dsrcTdgradT),dsrcTdT(src.dsrcTdT),dsrcTdgradV(src.dsrcTdgradV),
 _cohesiveJump(src._cohesiveJump),_cohesiveTraction(src._cohesiveTraction),_lostSolutionUniquenssCriterion(src._lostSolutionUniquenssCriterion),
 _isBroken(src._isBroken),_damageVolume(src._damageVolume),_Fdam(src._Fdam),_stressDam(src._stressDam),
-_averageCohesiveBandWidth(src._averageCohesiveBandWidth),_DamageActiveZone(src._DamageActiveZone),
+_averageCohesiveBandWidth(src._averageCohesiveBandWidth),
 dCohesivejumpdF(src.dCohesivejumpdF),dCohesivejumpdG(src.dCohesivejumpdG),dCohesivejumpdgradT(src.dCohesivejumpdgradT),
 dCohesivejumpdT(src.dCohesivejumpdT),dCohesivejumpdgradV(src.dCohesivejumpdgradV),
 dFdamdF(src.dFdamdF),dFdamdG(src.dFdamdG),dFdamdgradT(src.dFdamdgradT),dFdamdT(src.dFdamdT),dFdamdgradV(src.dFdamdgradV),
@@ -186,7 +186,6 @@ homogenizedData& homogenizedData::operator = (const homogenizedData& src){
 	_Fdam = src._Fdam;
 	_stressDam = src._stressDam;
 	_averageCohesiveBandWidth = src._averageCohesiveBandWidth;
-	_DamageActiveZone = src._DamageActiveZone;
 	dCohesivejumpdF = src.dCohesivejumpdF;
 	dCohesivejumpdG = src.dCohesivejumpdG;
 	dCohesivejumpdgradT = src.dCohesivejumpdgradT;
@@ -276,9 +275,6 @@ void allFailureFiles::openFiles(const int _enum, const int _gnum, const nonLinea
 		
 		filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_Fdam.csv";
 		FDam_File = Tensor11::createFile(filename);
-
-		filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_DamageActiveZone.csv";
-		DamageActiveZone_File = Tensor11::createFile(filename);
 		
 		filename = "E_"+int2str(_enum)+"_GP_"+int2str(_gnum)+"_tangentCohesiveJumpDF.csv";
 		dCohesiveJumpDF_File = Tensor33::createFile(filename);
@@ -290,7 +286,7 @@ void allFailureFiles::dataToFile(const double time, const nonLinearMechSolver* s
 	};
 	
 	if (damageVolume_File!=NULL){
-		Tensor11::writeData(damageVolume_File,data->getActiveDamageVolume(),time);
+		Tensor11::writeData(damageVolume_File,data->getActiveDissipationVolume(),time);
 	};
 	if (cohesiveTraction_File!=NULL){
 		Tensor13::writeData(cohesiveTraction_File,data->getHomogenizedCohesiveTraction(),time);
@@ -299,11 +295,8 @@ void allFailureFiles::dataToFile(const double time, const nonLinearMechSolver* s
 		Tensor11::writeData(averageCohesiveBandWidth_File,data->getAverageLocalizationBandWidth(),time);
 	};
 	if (FDam_File != NULL){
-		Tensor23::writeData(FDam_File,data->getHomogenizedActiveDamageDeformationGradient(),time);
+		Tensor23::writeData(FDam_File,data->getHomogenizedActiveDissipationDeformationGradient(),time);
 	}
-	if (DamageActiveZone_File!=NULL){
-		Tensor11::writeData(DamageActiveZone_File,data->getActiveDamage(),time);
-	};
 	if (dCohesiveJumpDF_File!=NULL){
 		Tensor33::writeData(dCohesiveJumpDF_File,data->getHomogenizedTangentOperator_CohesiveJump_F(),time);
 	}
diff --git a/NonLinearSolver/nlsolver/homogenizedData.h b/NonLinearSolver/nlsolver/homogenizedData.h
index ab108393f834f9ef7534f2891c272e81b5fe7020..b3f584b69bcfc8d7b60312ac4fddc9b648c334ed 100644
--- a/NonLinearSolver/nlsolver/homogenizedData.h
+++ b/NonLinearSolver/nlsolver/homogenizedData.h
@@ -87,7 +87,6 @@ class homogenizedData {
     STensor3 _Fdam; // deformation average over active damage zone
     STensor3 _stressDam; 
     double _averageCohesiveBandWidth;
-    double _DamageActiveZone;
 		
 		STensor33 dCohesivejumpdF;
 		STensor43 dCohesivejumpdG;
@@ -184,21 +183,18 @@ class homogenizedData {
 		bool& getBrokenFlag() {return _isBroken;};
 		const bool& getBrokenFlag() const {return _isBroken;};
 		
-		double& getActiveDamageVolume() {return _damageVolume;};
-		const double& getActiveDamageVolume() const{return _damageVolume;};
+		double& getActiveDissipationVolume() {return _damageVolume;};
+		const double& getActiveDissipationVolume() const{return _damageVolume;};
 		
-		STensor3& getHomogenizedActiveDamageDeformationGradient() {return _Fdam;};
-		const STensor3& getHomogenizedActiveDamageDeformationGradient() const {return _Fdam;};
+		STensor3& getHomogenizedActiveDissipationDeformationGradient() {return _Fdam;};
+		const STensor3& getHomogenizedActiveDissipationDeformationGradient() const {return _Fdam;};
 		
-		STensor3& getHomogenizedActiveDamageStress() {return _stressDam;};
-		const STensor3& getHomogenizedActiveDamageStress() const {return _stressDam;};
+		STensor3& getHomogenizedActiveDissipationStress() {return _stressDam;};
+		const STensor3& getHomogenizedActiveDissipationStress() const {return _stressDam;};
 		
 		double& getAverageLocalizationBandWidth() {return _averageCohesiveBandWidth;}
 		const double& getAverageLocalizationBandWidth() const {return _averageCohesiveBandWidth;}
-		
-		double& getActiveDamage() {return _DamageActiveZone;};
-		const double& getActiveDamage() const {return _DamageActiveZone;};
-		
+				
 		STensor33& getHomogenizedTangentOperator_CohesiveJump_F() {return dCohesivejumpdF;};
 		const STensor33& getHomogenizedTangentOperator_CohesiveJump_F() const {return dCohesivejumpdF;};
 		STensor43& getHomogenizedTangentOperator_CohesiveJump_G() {return dCohesivejumpdG;};
@@ -210,16 +206,16 @@ class homogenizedData {
 		STensor3& getHomogenizedTangentOperator_CohesiveJump_gradV(const int index) {return dCohesivejumpdgradV[index];};
 		const STensor3& getHomogenizedTangentOperator_CohesiveJump_gradV(const int index) const {return dCohesivejumpdgradV[index];};
 		
-		STensor43& getHomogenizedTangentOperator_ActiveDamageDeformationGradient_F(){return dFdamdF;};
-		const STensor43& getHomogenizedTangentOperator_ActiveDamageDeformationGradient_F() const{return dFdamdF;}; 
-		STensor53& getHomogenizedTangentOperator_ActiveDamageDeformationGradient_G(){return dFdamdG;};
-		const STensor53& getHomogenizedTangentOperator_ActiveDamageDeformationGradient_G() const {return dFdamdG;};
-		STensor33& getHomogenizedTangentOperator_ActiveDamageDeformationGradient_gradT(const int index){return dFdamdgradT[index];};
-		const STensor33& getHomogenizedTangentOperator_ActiveDamageDeformationGradient_gradT(const int index) const{return dFdamdgradT[index];};
-		STensor3& getHomogenizedTangentOperator_ActiveDamageDeformationGradient_T(const int index){return dFdamdT[index];};
-		const STensor3& getHomogenizedTangentOperator_ActiveDamageDeformationGradient_T(const int index) const{return dFdamdT[index];};
-		STensor33& getHomogenizedTangentOperator_ActiveDamageDeformationGradient_gradV(const int index) {return dFdamdgradV[index];};
-		const STensor33& getHomogenizedTangentOperator_ActiveDamageDeformationGradient_gradV(const int index) const{return dFdamdgradV[index];};
+		STensor43& getHomogenizedTangentOperator_ActiveDissipationDeformationGradient_F(){return dFdamdF;};
+		const STensor43& getHomogenizedTangentOperator_ActiveDissipationDeformationGradient_F() const{return dFdamdF;}; 
+		STensor53& getHomogenizedTangentOperator_ActiveDissipationDeformationGradient_G(){return dFdamdG;};
+		const STensor53& getHomogenizedTangentOperator_ActiveDissipationDeformationGradient_G() const {return dFdamdG;};
+		STensor33& getHomogenizedTangentOperator_ActiveDissipationDeformationGradient_gradT(const int index){return dFdamdgradT[index];};
+		const STensor33& getHomogenizedTangentOperator_ActiveDissipationDeformationGradient_gradT(const int index) const{return dFdamdgradT[index];};
+		STensor3& getHomogenizedTangentOperator_ActiveDissipationDeformationGradient_T(const int index){return dFdamdT[index];};
+		const STensor3& getHomogenizedTangentOperator_ActiveDissipationDeformationGradient_T(const int index) const{return dFdamdT[index];};
+		STensor33& getHomogenizedTangentOperator_ActiveDissipationDeformationGradient_gradV(const int index) {return dFdamdgradV[index];};
+		const STensor33& getHomogenizedTangentOperator_ActiveDissipationDeformationGradient_gradV(const int index) const{return dFdamdgradV[index];};
 		
 		// constitutive extraDof
 		SVector3& getHomogenizedConstitutiveExtraDofFlux(const int index){return fluxT[index];};
@@ -322,11 +318,10 @@ class allFailureFiles{
 					*cohesiveTraction_File,
 					*averageCohesiveBandWidth_File,
 					*FDam_File,
-					*DamageActiveZone_File,
 					*dCohesiveJumpDF_File;
 		allFailureFiles():cohesiveJump_File(NULL),
 						damageVolume_File(NULL),cohesiveTraction_File(NULL),averageCohesiveBandWidth_File(NULL), FDam_File(NULL),
-						DamageActiveZone_File(NULL),dCohesiveJumpDF_File(NULL){};
+						dCohesiveJumpDF_File(NULL){};
 		~allFailureFiles(){};
 		void openFiles(const int _enum, const int _gnum, const nonLinearMechSolver* solver,const bool strainToFile, const bool stressToFile, const bool failureToFile);
 		void dataToFile(const double time, const nonLinearMechSolver* solver, const homogenizedData* data);
@@ -336,7 +331,6 @@ class allFailureFiles{
 			if (cohesiveTraction_File!=NULL){fclose(cohesiveTraction_File);cohesiveTraction_File=NULL;};
 			if (averageCohesiveBandWidth_File!=NULL) {fclose(averageCohesiveBandWidth_File);averageCohesiveBandWidth_File=NULL;};
 			if (FDam_File !=NULL){fclose(FDam_File); FDam_File = NULL;};
-			if (DamageActiveZone_File!=NULL){fclose(DamageActiveZone_File);DamageActiveZone_File=NULL;};
 			if (dCohesiveJumpDF_File!=NULL){fclose(dCohesiveJumpDF_File);dCohesiveJumpDF_File=NULL;}
 		};
 		
diff --git a/NonLinearSolver/nlsolver/nonLinearMechSolver.cpp b/NonLinearSolver/nlsolver/nonLinearMechSolver.cpp
index 07ca904bc810a6d883e83f75eb2399790f5a0ba6..a67e0e2c1d0c18091ec57a79ffe5e201b0cd4190 100644
--- a/NonLinearSolver/nlsolver/nonLinearMechSolver.cpp
+++ b/NonLinearSolver/nlsolver/nonLinearMechSolver.cpp
@@ -122,8 +122,9 @@
 																																			_pathFollowingEqRatio(1.),_extractIrreversibleEnergy(false),
 																																			_stressExtractLocation(WHOLE_VOLUME),
 																																			_pathFollowingLocation(BULK_INTERFACE),
-																																			_homogenizedStressLastActiveDamage(0.),_homogenizedStrainLastActiveDamage(0.),
-																																			_homogenizedCohesiveJumpLastActiveDamage(0.),
+																																			_homogenizedStressLastActiveDissipation(0.),_homogenizedStrainLastActiveDissipation(0.),
+                                                                      _homogenizedDissipationStrainLastActiveDissipation(0.),
+																																			_homogenizedCohesiveJumpLastActiveDissipation(0.),
 																																			_lostSolutionUniquenssTolerance(0.), _voidPartInLocalizationBand(0.),
 																																			_GModelIsRotated(false), _checkFailureOnset(false),
 																																			_damageVolumeCenter(0.,0.,0.),_homogenizedCrackSurface(0.),
@@ -1058,7 +1059,10 @@ void nonLinearMechSolver::oneStepPreSolvePathFollowing(const double curtime, con
 			currentPathFollowingIncr = _loadStep;
 		}
 		else if (pathsys->getControlType() == pathFollowingSystemBase::LOCAL_CONTROL){
-      double ff = double(_numNROptimalLocal)/double(_numNROptimal);
+      double ff = 1.;
+      if (_timeStepAdaptation){
+        ff = double(_numNROptimalLocal)/double(_numNROptimal);
+      }
 			_localStep = _localStepPrev*_timeStepAdaptationFractor*ff;
 			currentPathFollowingIncr = _localStep;
 		}
@@ -2369,6 +2373,12 @@ void nonLinearMechSolver::setPathFollowingLocalIncrementType(const int i){
 	else if (i == 1){
 		Msg::Info("pf increment with dissipation energy");
 	}
+  else if (i == 2){
+    Msg::Info("pf increment with plastic energy");
+  }
+  else if (i == 3){
+    Msg::Info("pf increment with damage energy");
+  }
 	else{
 		Msg::Fatal("missing case nonLinearMechSolver::setPathFollowingLocalIncrementType %d",i);
 	}
@@ -3636,7 +3646,7 @@ void nonLinearMechSolver::pathFollowingArchiving(const double curtime, const int
 
     fprintf(_controlStateFile,"%e; %e; %e; \n",curtime,control,state);
 
-    if (numstep%10==0) fflush(_controlStateFile);
+    if (numstep%1==0) fflush(_controlStateFile);
   }
 };
 
@@ -3747,7 +3757,7 @@ void nonLinearMechSolver::computeIPCompDamageZoneAveraging(const double time){
     for (int j=0; j<domainVector.size(); j++){
       partDomain* dom = domainVector[j];
       double vsolidPart = 0.;
-      double val = dom->averagingOnActiveDamageZone(am.comp,_ipf,vsolidPart);
+      double val = dom->averagingOnActiveDissipationZone(am.comp,_ipf,vsolidPart);
       fprintf(am.file,"%e; %e;",val,vsolidPart);
     }
     fprintf(am.file,"\n");
@@ -3926,51 +3936,160 @@ void nonLinearMechSolver::symetryBC(std::string onwhat, const int phy){
 };
 
 void nonLinearMechSolver::applySameDispBC(dofManager<double>* p){
-  //for (const nonLinearSameDisplacementBC& sdbc : allSameDisp){
   for(std::list<nonLinearSameDisplacementBC>::const_iterator sdbc=allSameDisp.begin(); sdbc!=allSameDisp.end(); ++sdbc){
-		if (isDgDomain()) {
-			Msg::Warning("nonLinearSameDisplacementBC has not been implemented in DG formulation, wil be completed ...");
-			return;
+		if (isDgDomain()){
+      MElement* e = *(sdbc->gRoot->begin());
+      MVertex* vroot = e->getVertex(0);
+      
+      MElement* eleRoot = NULL;
+      FunctionSpaceBase* spaceRoot = NULL;
+      int vpos = 0.;
+    
+      for (int i=0; i< domainVector.size(); i++){
+        partDomain* dom = domainVector[i];
+        for (groupOfElements::elementContainer::iterator it = dom->g_cbegin(); it != dom->g_cend(); it++){
+          MElement* ele = *it;
+          for (int j=0; j< ele->getNumVertices(); j++){
+            MVertex* vj = ele->getVertex(j);
+            if (vj->getNum() == vroot->getNum()){
+               eleRoot = ele;
+               spaceRoot = dom->getFunctionSpace();
+               vpos = j;
+               Msg::Info("found root element %d for root node %d vpos = %d",eleRoot->getNum(),vroot->getNum(),vpos);
+               break;
+            }
+          }
+          if (eleRoot != NULL) break;
+        }
+        if (eleRoot != NULL) break;
+      }
+      
+      if (eleRoot == NULL) Msg::Fatal("root vertex is wrongly defined in nonLinearMechSolver::applySameDispBC");
+      std::vector<Dof> RRoot; 
+      std::vector<Dof> dofRoot;
+      spaceRoot->getKeys(eleRoot,RRoot);
+      dofRoot.push_back(RRoot[vpos+eleRoot->getNumVertices()*sdbc->comp]);
+      
+      // fill domain
+      std::set<Dof> others;
+      for (groupOfElements::elementContainer::iterator itg = sdbc->g->begin(); itg!=sdbc->g->end(); itg++){
+        MElement* eleBound = *itg;
+        std::vector<int> vvBound(eleBound->getNumPrimaryVertices());
+        for (int iv=0; iv < eleBound->getNumPrimaryVertices(); iv++){
+          vvBound[iv] = eleBound->getVertex(iv)->getNum();
+        }
+        
+        // find bulk element
+        
+        MElement* eleBulk = NULL;
+        FunctionSpaceBase* spaceBulk = NULL;
+        
+        for (int i=0; i< domainVector.size(); i++){
+          partDomain* dom = domainVector[i];
+          for (groupOfElements::elementContainer::iterator it = dom->g_cbegin(); it != dom->g_cend(); it++){
+            MElement* eleb = *it;
+            std::set<int> vvb;
+            for (int iv=0; iv < eleb->getNumPrimaryVertices(); iv++){
+              vvb.insert(eleb->getVertex(iv)->getNum());
+            }
+            
+            bool isFound = true;
+            for (int iv=0; iv< vvBound.size(); iv++){
+              if (vvb.find(vvBound[iv]) == vvb.end()){
+                isFound = false;
+                break;
+              }
+            }
+            
+            if (isFound){
+              eleBulk = eleb;
+              spaceBulk = dom->getFunctionSpace();
+              break;
+            }
+            
+          }
+          if (eleBulk != NULL) break;
+        }
+        
+        if (eleBulk == NULL) Msg::Fatal("nonLinearSameDisplacementBC is wrongly defined nonLinearMechSolver::applySameDispBC");
+        std::vector<Dof> R;
+        spaceBulk->getKeys(eleBulk,R);
+        int nbFFb = eleBulk->getNumShapeFunctions();
+
+        std::vector<int> positionBulk;
+        for (int iv=0; iv< eleBound->getNumVertices(); iv++){
+          MVertex* vi = eleBound->getVertex(iv);
+          //
+          if (vi->getNum() != vroot->getNum()){
+            for (int jv=0; jv < eleBulk->getNumVertices(); jv++){
+              MVertex* vj = eleBulk->getVertex(jv);
+              if (vi->getNum() == vj->getNum()){
+                positionBulk.push_back(jv);
+                break;
+              }
+            }        
+          }
+        }
+
+        for (int k=0; k<positionBulk.size(); k++){
+          Dof*  D = &R[positionBulk[k]+nbFFb*sdbc->comp];
+          if (others.find(*D) == others.end()){
+            others.insert(*D);
+          }
+        }
+      }
+      
+      DofAffineConstraint<double> dof;
+      dof.linear.push_back(std::pair<Dof,double>(dofRoot[0],1.));
+      dof.shift = 0.;
+      
+      
+      for (std::set<Dof>::iterator itd = others.begin(); itd != others.end(); itd++){
+        p->setLinearConstraint(*itd,dof);
+      };
+      
 		}
-    // because of CG
-    FunctionSpaceBase* spb = domainVector[0]->getFunctionSpace();
-    FilterDof* fiterDof = domainVector[0]->createFilterDof(sdbc->comp);
-
-    // get Root Dof
-    MElement* e = *(sdbc->gRoot->begin());
-    MVertex* vroot = e->getVertex(0);
-    std::vector<Dof> R, dofRoot;
-    spb->getKeys(e,R);
-    for (int idof=0; idof<R.size(); idof++){
-      if (fiterDof->operator()(R[idof])){
-        dofRoot.push_back(R[idof]);
-        break;
+    else{
+      // because of CG
+      FunctionSpaceBase* spb = domainVector[0]->getFunctionSpace();
+      FilterDof* fiterDof = domainVector[0]->createFilterDof(sdbc->comp);
+
+      // get Root Dof
+      MElement* e = *(sdbc->gRoot->begin());
+      MVertex* vroot = e->getVertex(0);
+      std::vector<Dof> R, dofRoot;
+      spb->getKeys(e,R);
+      for (int idof=0; idof<R.size(); idof++){
+        if (fiterDof->operator()(R[idof])){
+          dofRoot.push_back(R[idof]);
+          break;
+        }
       }
-    }
 
-    std::vector<Dof> others;
-    // get constraint Dof
-    for (groupOfElements::vertexContainer::iterator it = sdbc->g->vbegin(); it!=sdbc->g->vend(); it++){
-      MVertex* vv = *it;
-      if (vv->getNum() != vroot->getNum()){
-        MPoint point(*it);
-        R.clear();
-        spb->getKeys(&point,R);
-        for (int idof=0; idof<R.size(); idof++){
-          if (fiterDof->operator()(R[idof])){
-            others.push_back(R[idof]);
-            break;
+      std::vector<Dof> others;
+      // get constraint Dof
+      for (groupOfElements::vertexContainer::iterator it = sdbc->g->vbegin(); it!=sdbc->g->vend(); it++){
+        MVertex* vv = *it;
+        if (vv->getNum() != vroot->getNum()){
+          MPoint point(*it);
+          R.clear();
+          spb->getKeys(&point,R);
+          for (int idof=0; idof<R.size(); idof++){
+            if (fiterDof->operator()(R[idof])){
+              others.push_back(R[idof]);
+              break;
+            }
           }
         }
       }
-    }
 
-    DofAffineConstraint<double> dof;
-    dof.linear.push_back(std::pair<Dof,double>(dofRoot[0],1.));
-    dof.shift = 0.;
+      DofAffineConstraint<double> dof;
+      dof.linear.push_back(std::pair<Dof,double>(dofRoot[0],1.));
+      dof.shift = 0.;
 
-    for (int j =0; j<others.size(); j++){
-      p->setLinearConstraint(others[j],dof);
+      for (int j =0; j<others.size(); j++){
+        p->setLinearConstraint(others[j],dof);
+      };
     };
   };
 
@@ -5245,29 +5364,8 @@ void nonLinearMechSolver::initializeStaticScheme()
 
 bool nonLinearMechSolver::localPathFollowingSwitching() const{
 	// for test
-	double cr = -1.;
-  if (_pathFollowingLocation == INTERFACE){
-    if (_pathFollowingIncrementType == DISSIPATION_ENERGY){
-      cr = _ipf->computeInterfaceIrreversibleEnergy(IPStateBase::previous);
-    }
-    else{
-      Msg::Fatal("missing case nonLinearMechSolver::localPathFollowingSwitching %d",_pathFollowingIncrementType);
-    }
-  }
-  else{
-	  if (_pathFollowingIncrementType == DEFO_ENERGY){
-		  cr = _ipf->computeDeformationEnergy(IPStateBase::previous);
-	  }
-	  else if (_pathFollowingIncrementType == DISSIPATION_ENERGY){
-		  cr = _ipf->computeIrreversibleEnergy(IPStateBase::previous);
-    }
-    else{
-      Msg::Fatal("missing case nonLinearMechSolver::localPathFollowingSwitching %d",_pathFollowingIncrementType);
-    }
-	}
-
+	double cr = _ipf->computePathFollowingLocalValue(IPStateBase::previous);
 	printf("rank %d cr = %e \n",Msg::GetCommRank(),cr);
-
 	#if defined(HAVE_MPI)
 	if (Msg::GetCommSize()> 1){
 		double totalCr = 0;
@@ -5285,18 +5383,8 @@ bool nonLinearMechSolver::localPathFollowingSwitching() const{
 
 double nonLinearMechSolver::computeLocalPathFollowingStep() const{
 	// for adaptive purpose
-	// for test
-	double localStep = 0.;
-	if (_pathFollowingIncrementType == DEFO_ENERGY){
-		localStep = _ipf->computeDeformationEnergy(IPStateBase::current) - _ipf->computeDeformationEnergy(IPStateBase::previous);
-	}
-	else if (_pathFollowingIncrementType == DISSIPATION_ENERGY){
-		localStep = _ipf->computeIrreversibleEnergy(IPStateBase::current) - _ipf->computeIrreversibleEnergy(IPStateBase::previous);
-	}
-	else{
-		Msg::Fatal("missing case in nonLinearMechSolver::computeLocalPathFollowingStep() %d",_pathFollowingIncrementType);
-	}
-
+	double localStep = _ipf->computePathFollowingLocalValue(IPStateBase::current) - _ipf->computePathFollowingLocalValue(IPStateBase::previous);
+	// accumulate from all procs
 	#if defined(HAVE_MPI)
 	if (Msg::GetCommSize() > 1){
 		double totalStep = 0;
@@ -5506,6 +5594,10 @@ double nonLinearMechSolver::getHomogenizedSecondFirstTangent(const int i, const
   return _currentState->getHomogenizedTangentOperator_G_F()(i,j,k,p,q);
 };
 
+double nonLinearMechSolver::getHomogenizedCohesiveJump(const int i) const{
+  return _currentState->getHomogenizedCohesiveJump()(i);
+};
+
 // for element erosion
 void nonLinearMechSolver::setElementErosion(const bool bulkErosion, const bool interfaceErosion, const int method){
 	_bulkElementErosionFlag  = bulkErosion;
@@ -7696,7 +7788,7 @@ void nonLinearMechSolver::setStrainMappingFollowing(const bool flag){
   _strainMappingFollwing = flag;
 };
 
-void nonLinearMechSolver::blockDamage(const IPStateBase::whichState ws, const bool fl){
+void nonLinearMechSolver::blockDissipation(const IPStateBase::whichState ws, const bool fl){
   if (_ipf){
 		if (fl and !_damageIsBlocked){
       printf("rank %d damage is blocked ele = %d, gp = %d  \n",Msg::GetCommRank(),_enum,_gnum);
@@ -7708,14 +7800,14 @@ void nonLinearMechSolver::blockDamage(const IPStateBase::whichState ws, const bo
       printf("rank %d damage is unblocked ele = %d, gp = %d  \n",Msg::GetCommRank(),_enum,_gnum);
     }
 		_damageIsBlocked = fl;
-    _ipf->blockDamage(ws,fl);
+    _ipf->blockDissipation(ws,fl);
 
   }
   else
     Msg::Fatal("IPField has not been initialized");
 }
 
-bool nonLinearMechSolver::damageIsBlocked() const{
+bool nonLinearMechSolver::dissipationIsBlocked() const{
 	return _damageIsBlocked;
 };
 
@@ -7863,22 +7955,7 @@ void nonLinearMechSolver::microNumberDof(){
 };
 
 void nonLinearMechSolver::setPeriodicity(const double x, const double y, const double z, const std::string direction){
-	if ((direction == "x") or (direction == "X")) {
-		_Lx(0) = x; _Lx(1) = y; _Lx(2) = z;
-	}
-	else if ((direction == "y") or (direction == "Y")){
-		_Ly(0) = x; _Ly(1) = y; _Ly(2) = z;
-	}
-	else if ((direction == "z") or (direction == "Z")){
-		_Lz(0) = x; _Lz(1) = y; _Lz(2) = z;
-	}
-	else {
-		Msg::Error("Incorrect direction is used in setting the periodicity!");
-	};
-};
-
-void nonLinearMechSolver::setPeriodicity(const SVector3& xd, const SVector3& yd, const SVector3& zd){
-  _Lx = xd; _Ly = yd; _Lz = zd;
+  Msg::Warning(" nonLinearMechSolver::setPeriodicity is no longer necessary!");
 };
 
 void nonLinearMechSolver::addMicroBC(const nonLinearMicroBC* bc){
@@ -8009,9 +8086,9 @@ const double& nonLinearMechSolver::getHomogenizedCrackFace() const{
 STensor3& nonLinearMechSolver::getFdamOnset() {return _FdamOnset;};
 const STensor3& nonLinearMechSolver::getFdamOnset() const {return _FdamOnset;};
 
-bool nonLinearMechSolver::isDamage() const{
+bool nonLinearMechSolver::withEnergyDissipation() const{
 	for (std::map<int, materialLaw*>::const_iterator it = maplaw.begin(); it!= maplaw.end(); it++){
-		if (it->second->withDamage()){
+		if (it->second->withEnergyDissipation()){
 			return true;
 		}
 	}
@@ -8051,21 +8128,21 @@ void nonLinearMechSolver::extractAverageStressByVolumeIntegral(homogenizedData*
 	double volumeRVEInv = 1./this->getRVEVolume();
   // basic mechanics quantities
 	if (_microBC->getTotalNumberOfMechanicalDofs()> 0){
-		double& damageVolume = homoData->getActiveDamageVolume();
+		double& damageVolume = homoData->getActiveDissipationVolume();
 		damageVolume = 0.;
 		double& clength = homoData->getAverageLocalizationBandWidth();
 		clength = 0.;
 
-		if (isDamage()){
+		if (withEnergyDissipation()){
       // compute current damage volume
 			for (int i=0; i<domainVector.size(); i++){
-				damageVolume += domainVector[i]->computeVolumeActiveDamageDomain(_ipf);
+				damageVolume += domainVector[i]->computeVolumeActiveDissipationDomain(_ipf);
 			}
 			// active damage center
 			_damageVolumeCenter *= 0.;
 			if (damageVolume > 0.){
 				for (int i=0; i<domainVector.size(); i++){
-					domainVector[i]->computeActiveDamageCenter(_ipf,_damageVolumeCenter);
+					domainVector[i]->computeActiveDissipationCenter(_ipf,_damageVolumeCenter);
 				}
 				_damageVolumeCenter *= (1./damageVolume);
 				
@@ -8090,10 +8167,10 @@ void nonLinearMechSolver::extractAverageStressByVolumeIntegral(homogenizedData*
 		}
 		else if (_stressExtractLocation == ACTIVE_DAMAGE_VOLUME){
 			if (homoDataPrev->getBrokenFlag()){
-				P = _homogenizedStressLastActiveDamage;
+				P = _homogenizedStressLastActiveDissipation;
 				STensor3 dPdam(0.);
 				for (int i=0; i<domainVector.size(); i++){
-					domainVector[i]->computeActiveDamagingAverageStressIncrement(_ipf,dPdam); // to avoid derivatives in terms of damage volume
+					domainVector[i]->computeActiveDissipationAverageStressIncrement(_ipf,dPdam); // to avoid derivatives in terms of damage volume
 				}
 				dPdam*=(_surfaceReductionRatio/damageVolume);
 				P += dPdam;
@@ -8120,28 +8197,16 @@ void nonLinearMechSolver::extractAverageStressByVolumeIntegral(homogenizedData*
 		}
 
     // extract cohesive law
-    if (isDamage()){
+    if (withEnergyDissipation()){
       // compute homogenized damage and homogenized deformation gradient on
-      // active damage zone
-			double& D = homoData->getActiveDamage();
-			D = homoDataPrev->getActiveDamage();
-			if (damageVolume > 0.){
-				double dD = 0.; // damage increment
-				for (int i=0; i<domainVector.size(); i++){
-					domainVector[i]->computeActiveNonlocalDamageIncrement(_ipf,dD);
-				}
-				dD *= (1./damageVolume);
-				D += dD;
-			}
-
 			if (getDamageToCohesiveJumpFlag()){
 
-				STensor3& Fdam = homoData->getHomogenizedActiveDamageDeformationGradient();
-				Fdam = _homogenizedStrainLastActiveDamage;
+				STensor3& Fdam = homoData->getHomogenizedActiveDissipationDeformationGradient();
+				Fdam = _homogenizedDissipationStrainLastActiveDissipation;
 				STensor3 dFdam(0.);
 				if (damageVolume > 0.){
 					for (int i=0; i<domainVector.size(); i++){
-						domainVector[i]->computeActiveDamagingAverageStrainIncrement(_ipf,dFdam);
+						domainVector[i]->computeActiveDissipationAverageStrainIncrement(_ipf,dFdam);
 					}
 					dFdam *= (1./damageVolume);
 					Fdam += dFdam;
@@ -8160,7 +8225,7 @@ void nonLinearMechSolver::extractAverageStressByVolumeIntegral(homogenizedData*
 
 				// compute cohesive jump
 				SVector3& cjump = homoData->getHomogenizedCohesiveJump();
-				cjump  = _homogenizedCohesiveJumpLastActiveDamage;
+				cjump  = _homogenizedCohesiveJumpLastActiveDissipation;
 				if (homoDataPrev->getBrokenFlag()){
 					for (int i=0; i<3; i++){
 						for (int j=0; j<3; j++){
@@ -8460,7 +8525,7 @@ void nonLinearMechSolver::extractAveragePropertiesByInSystemCondensation(homogen
 
 
   // extract cohesive law
-  if (isDamage() and getDamageToCohesiveJumpFlag()){
+  if (withEnergyDissipation() and getDamageToCohesiveJumpFlag()){
     // in case of multiscale analyses, previous macro-state is initial micro-state
 	  const homogenizedData* homoDataPrev = this->getHomogenizationState(IPStateBase::previous);
 
@@ -8470,7 +8535,7 @@ void nonLinearMechSolver::extractAveragePropertiesByInSystemCondensation(homogen
 		const double& clength = homoData->getAverageLocalizationBandWidth();
 
 		if (homoDataPrev->getBrokenFlag()){
-			const STensor43&  dFdamDF = homoData->getHomogenizedTangentOperator_ActiveDamageDeformationGradient_F();
+			const STensor43&  dFdamDF = homoData->getHomogenizedTangentOperator_ActiveDissipationDeformationGradient_F();
 			for (int i=0; i<3; i++){
 				for (int j=0; j<3; j++){
 					for (int k=0; k<3; k++){
@@ -8486,7 +8551,7 @@ void nonLinearMechSolver::extractAveragePropertiesByInSystemCondensation(homogen
 			STensor43& dcjumpdG = homoData->getHomogenizedTangentOperator_CohesiveJump_G();
 			dcjumpdG *= 0.;
 			if (homoDataPrev->getBrokenFlag()){
-				const STensor53& dFdamDG = homoData->getHomogenizedTangentOperator_ActiveDamageDeformationGradient_G();
+				const STensor53& dFdamDG = homoData->getHomogenizedTangentOperator_ActiveDissipationDeformationGradient_G();
 				for (int i=0; i<3; i++){
 					for (int j=0; j<3; j++){
 						for (int k=0; k<3; k++){
@@ -8509,8 +8574,8 @@ void nonLinearMechSolver::extractAveragePropertiesByInSystemCondensation(homogen
 				SVector3& dcjumpdT = homoData->getHomogenizedTangentOperator_CohesiveJump_T(index);
 				dcjumpdT*= 0.;
 				if (homoDataPrev->getBrokenFlag()){
-					const STensor3& dFdamDT = homoData->getHomogenizedTangentOperator_ActiveDamageDeformationGradient_T(index);
-					const STensor33& dFdamDgradT = homoData->getHomogenizedTangentOperator_ActiveDamageDeformationGradient_gradT(index);
+					const STensor3& dFdamDT = homoData->getHomogenizedTangentOperator_ActiveDissipationDeformationGradient_T(index);
+					const STensor33& dFdamDgradT = homoData->getHomogenizedTangentOperator_ActiveDissipationDeformationGradient_gradT(index);
 					for (int i=0; i<3; i++){
 						for (int j=0; j<3; j++){
 							dcjumpdT(i) += clength*dFdamDT(i,j)*_lostSolutionUniquenssNormal(j);
@@ -8528,7 +8593,7 @@ void nonLinearMechSolver::extractAveragePropertiesByInSystemCondensation(homogen
 				STensor3& dcjumpdgradV = homoData->getHomogenizedTangentOperator_CohesiveJump_gradV(index);
 				dcjumpdgradV*= 0.;
 				if (homoDataPrev->getBrokenFlag()){
-					const STensor33& dFdamDgradV = homoData->getHomogenizedTangentOperator_ActiveDamageDeformationGradient_gradV(index);
+					const STensor33& dFdamDgradV = homoData->getHomogenizedTangentOperator_ActiveDissipationDeformationGradient_gradV(index);
 					for (int i=0; i<3; i++){
 						for (int j=0; j<3; j++){
 							for (int k=0; k<3; k++){
@@ -8542,7 +8607,7 @@ void nonLinearMechSolver::extractAveragePropertiesByInSystemCondensation(homogen
 
 		if (this->getLocationForStressExtraction() == ACTIVE_DAMAGE_VOLUME){
 			if (homoDataPrev->getBrokenFlag()){
-				double vD = homoData->getActiveDamageVolume();
+				double vD = homoData->getActiveDissipationVolume();
 				double volumeFrac  = _surfaceReductionRatio*vRVE/vD;
 
 				if (_microBC->getTotalNumberOfMechanicalDofs()> 0){
@@ -9342,7 +9407,7 @@ void nonLinearMechSolver::fillTangent(const fullMatrix<double>& L, homogenizedDa
 		// this tangent is only computed by using option INSYSTEMCONDEN
 		if (_damageToCohesiveJump and (_homogenizeTangentMethod == INSYSTEMCONDEN)){
 			// first order damage only
-			double Vd = homoData->getActiveDamageVolume();
+			double Vd = homoData->getActiveDissipationVolume();
 			double vRve = this->getRVEVolume();
 			double fact = vRve/Vd;
 
@@ -9355,7 +9420,7 @@ void nonLinearMechSolver::fillTangent(const fullMatrix<double>& L, homogenizedDa
 				for (int col = atCol; col< atCol+9; col++){
 					int k,l;
 					Tensor23::getIntsFromIndex(col-atCol,k,l);
-					homoData->getHomogenizedTangentOperator_ActiveDamageDeformationGradient_F()(i,j,k,l) = fact*L(row,col);
+					homoData->getHomogenizedTangentOperator_ActiveDissipationDeformationGradient_F()(i,j,k,l) = fact*L(row,col);
 				}
 				atCol+= 9;
 
@@ -9364,7 +9429,7 @@ void nonLinearMechSolver::fillTangent(const fullMatrix<double>& L, homogenizedDa
 					for (int col = atCol; col< atCol+27; col++){
 						int p,q,r;
 						Tensor33::getIntsFromIndex(col-atCol,p,q,r);
-						homoData->getHomogenizedTangentOperator_ActiveDamageDeformationGradient_G()(i,j,p,q,r) = fact*L(row,col);
+						homoData->getHomogenizedTangentOperator_ActiveDissipationDeformationGradient_G()(i,j,p,q,r) = fact*L(row,col);
 					}
 					atCol+= 27;
 				}
@@ -9375,11 +9440,11 @@ void nonLinearMechSolver::fillTangent(const fullMatrix<double>& L, homogenizedDa
 						for (int col = atCol; col< atCol+3; col++){
 							int p;
 							Tensor13::getIntsFromIndex(col-atCol,p);
-							homoData->getHomogenizedTangentOperator_ActiveDamageDeformationGradient_gradT(index)(i,j,p) = fact*L(row,col);
+							homoData->getHomogenizedTangentOperator_ActiveDissipationDeformationGradient_gradT(index)(i,j,p) = fact*L(row,col);
 						}
 						atCol += 3;
 						// tangent P-ExtraDof
-						homoData->getHomogenizedTangentOperator_ActiveDamageDeformationGradient_T(index)(i,j) = fact*L(row,atCol);
+						homoData->getHomogenizedTangentOperator_ActiveDissipationDeformationGradient_T(index)(i,j) = fact*L(row,atCol);
 						atCol += 1;
 
 					}
@@ -9391,7 +9456,7 @@ void nonLinearMechSolver::fillTangent(const fullMatrix<double>& L, homogenizedDa
 						for (int col = atCol; col< atCol+3; col++){
 							int p;
 							Tensor13::getIntsFromIndex(col-atCol,p);
-							homoData->getHomogenizedTangentOperator_ActiveDamageDeformationGradient_gradV(index)(i,j,p) = fact*L(row,col);
+							homoData->getHomogenizedTangentOperator_ActiveDissipationDeformationGradient_gradV(index)(i,j,p) = fact*L(row,col);
 						}
 						atCol += 3;
 					}
@@ -9590,7 +9655,7 @@ void nonLinearMechSolver::checkFailureOnset_withoutNormalVector(){
 		if ((cr < _lostSolutionUniquenssTolerance*_maximalLostEllipticityCriterion) and (_maximalLostEllipticityCriterion > 0.)){
 			homoData->getBrokenFlag() = true;
 
-			_FdamOnset = homoData->getHomogenizedActiveDamageDeformationGradient();
+			_FdamOnset = homoData->getHomogenizedActiveDissipationDeformationGradient();
 			printf("solver is broken at ele %d gpt %d at rank %d  real tolearance = %e, following minimal normal direction [%e %e %e] \n",
 							_enum,_gnum,Msg::GetCommRank(),cr/_maximalLostEllipticityCriterion,normal[0],normal[1],normal[2]);
 		}
@@ -9624,11 +9689,11 @@ void nonLinearMechSolver::checkFailureOnset_withNormalVector(){
 		if ((cr < _lostSolutionUniquenssTolerance*_maximalLostEllipticityCriterion) and (_maximalLostEllipticityCriterion > 0.)){
 			homoData->getBrokenFlag() = true;
 
-			_FdamOnset = homoData->getHomogenizedActiveDamageDeformationGradient();
+			_FdamOnset = homoData->getHomogenizedActiveDissipationDeformationGradient();
 			printf("solver is broken at ele %d gpt %d at rank %d  real tolearance = %e, following prescribed direction %e %e %e \n",
 							_enum,_gnum,Msg::GetCommRank(),cr/_maximalLostEllipticityCriterion,normal[0],normal[1],normal[2]);
 
-			_homogenizedCohesiveJumpLastActiveDamage *= 0.;
+			_homogenizedCohesiveJumpLastActiveDissipation *= 0.;
 		}
 		else {
 			homoData->getBrokenFlag() = false;
@@ -9640,10 +9705,13 @@ void nonLinearMechSolver::computeHomogenizedCrackFace(){
 	if (_pAl == NULL){
 		Msg::Fatal("pbcAlgorithm object must be created");
 	}
+  
+  SVector3 Lx, Ly, Lz;
+  _pAl->getPBCConstraintGroup()->getPeriodicity(Lx, Ly, Lz);
 	
 	if (_lostSolutionUniquenssNormal.norm() < 1e-6){
 		// normally, _lostSolutionUniquenssNormal.norm() == 1
-		_homogenizedCrackSurface = std::max(_Lx.norm(),_Ly.norm()); // nothing to do
+		_homogenizedCrackSurface = std::max(Lx.norm(),Ly.norm()); // nothing to do
 		return;
 	}
 	
@@ -9654,19 +9722,19 @@ void nonLinearMechSolver::computeHomogenizedCrackFace(){
 
 	if (getDim() == 2){
 		SPoint3 v2(v1); 
-		v2 += (_Lx.point());
+		v2 += (Lx.point());
 		SPoint3 v4(v1); 
-		v4 += (_Ly.point());
+		v4 += (Ly.point());
 		SPoint3 v3(v1); 
-		v3 += (_Lx.point()); 
-		v3 += (_Ly.point());
+		v3 += (Lx.point()); 
+		v3 += (Ly.point());
 		
-		if (dot(_lostSolutionUniquenssNormal,_Lx)/(_Lx.norm()) < 1e-8){
-			_homogenizedCrackSurface = _Lx.norm();
+		if (dot(_lostSolutionUniquenssNormal,Lx)/(Lx.norm()) < 1e-8){
+			_homogenizedCrackSurface = Lx.norm();
 			Msg::Info("_homogenizedCrackSurface following Lx = %f",_homogenizedCrackSurface);
 		}
-		else if (dot(_lostSolutionUniquenssNormal,_Ly)/(_Ly.norm()) < 1e-8){
-			_homogenizedCrackSurface = _Ly.norm();
+		else if (dot(_lostSolutionUniquenssNormal,Ly)/(Ly.norm()) < 1e-8){
+			_homogenizedCrackSurface = Ly.norm();
 			Msg::Info("_homogenizedCrackSurface following Ly = %f",_homogenizedCrackSurface);
 		}
 		else{
@@ -9702,7 +9770,7 @@ void nonLinearMechSolver::computeHomogenizedCrackFace(){
 			}
 			
 		}
-		_homogenizedCrackSurface *= (_Lz.norm()); // generally, _LzNorm = 1
+		_homogenizedCrackSurface *= (Lz.norm()); // generally, _LzNorm = 1
 		
 		#ifdef _DEBUG
 		printf("on ele %d gp %d _homogenizedCrackSurface = %e \n",_enum,_gnum,_homogenizedCrackSurface);
@@ -9916,13 +9984,14 @@ void nonLinearMechSolver::nextStep(){
   // save data for nex macroscopic step
   _ipf->copy(IPStateBase::current,IPStateBase::initial);
 
-	if (isDamage()){
-		_ipf->checkActiveDamage(IPStateBase::initial);
-		if (_ipf->getNumOfActiveDamageIPsCurrent() > 0){
+	if (withEnergyDissipation()){
+		_ipf->checkActiveDissipation(IPStateBase::initial);
+		if (_ipf->getNumOfActiveDissipationIPsCurrent() > 0){
 			// store historical value
-			_homogenizedStressLastActiveDamage = this->getHomogenizationState(IPStateBase::current)->getHomogenizedStress();
-			_homogenizedStrainLastActiveDamage = this->getHomogenizationState(IPStateBase::current)->getHomogenizedActiveDamageDeformationGradient();
-			_homogenizedCohesiveJumpLastActiveDamage = this->getHomogenizationState(IPStateBase::current)->getHomogenizedCohesiveJump();
+			_homogenizedStressLastActiveDissipation = this->getHomogenizationState(IPStateBase::current)->getHomogenizedStress();
+			_homogenizedStrainLastActiveDissipation = this->getMicroBC()->getFirstOrderKinematicalVariable();
+      _homogenizedDissipationStrainLastActiveDissipation = this->getHomogenizationState(IPStateBase::current)->getHomogenizedActiveDissipationDeformationGradient();
+			_homogenizedCohesiveJumpLastActiveDissipation = this->getHomogenizationState(IPStateBase::current)->getHomogenizedCohesiveJump();
 		}
 	}
 
@@ -10556,13 +10625,14 @@ void nonLinearMechSolver::microPostSolveStep(const double curtime, const int num
 		this->writeDeformedMesh(numstep);
 	}
 	this->archiveData(curtime,numstep);
-	if (isDamage()){
-		_ipf->checkActiveDamage(IPStateBase::current);
-		if (_ipf->getNumOfActiveDamageIPsCurrent() > 0){
+	if (withEnergyDissipation()){
+		_ipf->checkActiveDissipation(IPStateBase::current);
+		if (_ipf->getNumOfActiveDissipationIPsCurrent() > 0){
 			// store historical value
-			_homogenizedStressLastActiveDamage = this->getHomogenizationState(IPStateBase::current)->getHomogenizedStress();
-			_homogenizedStrainLastActiveDamage = this->getHomogenizationState(IPStateBase::current)->getHomogenizedActiveDamageDeformationGradient();
-			_homogenizedCohesiveJumpLastActiveDamage = this->getHomogenizationState(IPStateBase::current)->getHomogenizedCohesiveJump();
+			_homogenizedStressLastActiveDissipation = this->getHomogenizationState(IPStateBase::current)->getHomogenizedStress();
+			_homogenizedStrainLastActiveDissipation = this->getMicroBC()->getFirstOrderKinematicalVariable();
+      _homogenizedDissipationStrainLastActiveDissipation = this->getHomogenizationState(IPStateBase::current)->getHomogenizedActiveDissipationDeformationGradient();
+			_homogenizedCohesiveJumpLastActiveDissipation = this->getHomogenizationState(IPStateBase::current)->getHomogenizedCohesiveJump();
 
 		}
 	}
diff --git a/NonLinearSolver/nlsolver/nonLinearMechSolver.h b/NonLinearSolver/nlsolver/nonLinearMechSolver.h
index 183dc7cebdc5c3fe174a9192827dea2b2fc8b185..38902ee462eb6c991d8f4893d99a53e93bcc8c8c 100644
--- a/NonLinearSolver/nlsolver/nonLinearMechSolver.h
+++ b/NonLinearSolver/nlsolver/nonLinearMechSolver.h
@@ -166,7 +166,7 @@ class nonLinearMechSolver
   enum solver{ Gmm=0,Taucs=1,Petsc=2, GMRESk=3};
   enum scheme{StaticLinear=0, StaticNonLinear=1, Explicit=2, Multi=3, Implicit=4, Eigen=5};
 	enum pathFollowingMethod{GLOBAL_ARC_LENGTH_BASED=0, LOCAL_BASED=1};
-	enum pathFollowingLocalIncrementType{DEFO_ENERGY=0, DISSIPATION_ENERGY=1};
+	enum pathFollowingLocalIncrementType{DEFO_ENERGY=0, DISSIPATION_ENERGY=1,PLASTIC_ENERGY=2,DAMAGE_ENERGY=3};
 	enum pathFollowingLocation{BULK_INTERFACE=0,BULK=1,INTERFACE=2};
 	enum elementErosionType{FIRST_IP_FAILED=1, ALL_IP_FAILED=2};
  #endif //SWIG
@@ -434,7 +434,7 @@ class nonLinearMechSolver
 	void getOtherRanks(const int rootRank, std::set<int>& otherRanks) const;
 	bool isMultiscale() const;
   bool isDgDomain() const;
-	bool isDamage() const;
+	bool withEnergyDissipation() const;
 	void getLocalBasis(const MElement* ele, const int gpt, SVector3& n, SVector3& t, SVector3& b) const;
 
   int getDim() const {return _dim;};
@@ -458,7 +458,8 @@ class nonLinearMechSolver
   virtual bool mustRestart(const int numstep);
 	pathFollowingLocalIncrementType getPathFollowingLocalIncrementType() const{return _pathFollowingIncrementType;};
 	pathFollowingLocation getPathFollowingLocation() const {return _pathFollowingLocation;};
-
+  
+  bool withPathFollowing() const {return _pathFollowing;};
 	void rotateModel(const SVector3& n1, const SVector3& n2, const SVector3& n3);
   bool GModelIsRotated() const {return _GModelIsRotated;}
 	
@@ -614,7 +615,7 @@ class nonLinearMechSolver
   virtual double getHomogenizedSecondTangent(const int i, const int j, const int k, const int p, const int q, const int r) const;
   virtual double getHomogenizedFirstSecondTangent(const int i, const int j, const int p, const int q, const int r) const;
   virtual double getHomogenizedSecondFirstTangent(const int i, const int j, const int k, const int p, const int q) const;
-
+  virtual double getHomogenizedCohesiveJump(const int i) const;
 	//
 	// for element erosion
 	virtual void setElementErosion(const bool bulkErosion, const bool interfaceErosion, const int method);
@@ -676,8 +677,6 @@ class nonLinearMechSolver
   bool _microFlag, _multiscaleFlag;
   // Element number and Integration point number
   int _enum, _gnum;
-  // for periodicity == RVE dimension
-  SVector3  _Lx, _Ly, _Lz;
   //micro BC
   nonLinearMicroBC* _microBC;
 	nonLinearMicroBC* _microBCOld;
@@ -758,9 +757,10 @@ class nonLinearMechSolver
 	STRESS_EXTRACT_LOCATION _stressExtractLocation;
 
 	// last extract value
-	STensor3 _homogenizedStressLastActiveDamage;
-	STensor3 _homogenizedStrainLastActiveDamage;
-	SVector3 _homogenizedCohesiveJumpLastActiveDamage;
+	STensor3 _homogenizedStressLastActiveDissipation;
+  STensor3 _homogenizedStrainLastActiveDissipation;
+	STensor3 _homogenizedDissipationStrainLastActiveDissipation;
+	SVector3 _homogenizedCohesiveJumpLastActiveDissipation;
 	SPoint3 _damageVolumeCenter;
 	double _homogenizedCrackSurface;
   bool _useMatMatSolveToInvertMatrix;
@@ -826,9 +826,8 @@ class nonLinearMechSolver
   double microSolveSNL();
   //rve volume
   double getRVEVolume() const;
-	bool damageIsBlocked() const;
-  void blockDamage(const IPStateBase::whichState ws, const bool fl);
-  void setPeriodicity(const SVector3& xd, const SVector3& yd, const SVector3& zd);
+	bool dissipationIsBlocked() const;
+  void blockDissipation(const IPStateBase::whichState ws, const bool fl);
   int getElementSolverNumber() const;
   int getGaussPointSolverNumber() const;
   void extractAverageProperties(bool stiff);
diff --git a/NonLinearSolver/nlsolver/testcheck.cpp b/NonLinearSolver/nlsolver/testcheck.cpp
index b36762e8329ae70ba02fa16f59108d477947d4f6..61be9abc42f1aec2ac05953477dc8d5c2885ddbb 100644
--- a/NonLinearSolver/nlsolver/testcheck.cpp
+++ b/NonLinearSolver/nlsolver/testcheck.cpp
@@ -1,6 +1,12 @@
 #include "testcheck.h"
 #include <cmath>
 #include "GmshMessage.h"
+#if defined(HAVE_MPI)
+#include "mpi.h"
+#endif //HAVE_MPI
+
+
+
 TestCheck::TestCheck(){}
 
 TestCheck::~TestCheck(){}
@@ -8,9 +14,15 @@ TestCheck::~TestCheck(){}
 void
 TestCheck::equal(double ref, double cur, double tol) const
 {
-  if(Msg::GetCommRank() != 0) return; // check only on rank 0
-  if(fabs(ref-cur)/fabs(ref)>tol){
-    Msg::Fatal("reference %e current value %e relative error %e tol %e",ref,cur,fabs(ref-cur)/fabs(ref),tol);
+  //if(Msg::GetCommRank() != 0) return; // check only on rank 0
+  //
+  double curTr = cur;
+  #if defined(HAVE_MPI)
+  MPI_Bcast(&curTr,1,MPI_DOUBLE,0,MPI_COMM_WORLD);
+  #endif //HAVE_MPI
+
+  if(fabs(ref-curTr)/fabs(ref)>tol){
+    Msg::Fatal("reference %e current value %e relative error %e tol %e",ref,curTr,fabs(ref-curTr)/fabs(ref),tol);
   }
   return;
 }
@@ -18,8 +30,13 @@ TestCheck::equal(double ref, double cur, double tol) const
 void
 TestCheck::equal(int ref, int cur) const
 {
-  if(Msg::GetCommRank() != 0) return; // check only on rank 0
-  if(ref != cur)
+  //if(Msg::GetCommRank() != 0) return; // check only on rank 0
+  double curTr = cur;
+  #if defined(HAVE_MPI)
+  MPI_Bcast(&curTr,1,MPI_INT,0,MPI_COMM_WORLD);
+  #endif //HAVE_MPI
+
+  if(ref != curTr)
     exit(1);
   return;
 }
diff --git a/NonLinearSolver/periodicBC/pbcCreateConstraints.cpp b/NonLinearSolver/periodicBC/pbcCreateConstraints.cpp
index c6683e1fcc748b301521352b1f43e89927c316bd..59e03594390eb3c0edbeb58c66368c70273a9493 100644
--- a/NonLinearSolver/periodicBC/pbcCreateConstraints.cpp
+++ b/NonLinearSolver/periodicBC/pbcCreateConstraints.cpp
@@ -1061,7 +1061,7 @@ void pbcConstraintElementGroup::__init__(){
   SVector3 crossV = crossprod(_periodic12,_periodic14);
   
   _rveVolume = fabs(dot(crossV,_periodic15));
-  printf("RVE volume computed  = %e \n",_rveVolume);
+  Msg::Info("RVE volume computed  = %e \n",_rveVolume);
   
 };
 
@@ -3367,6 +3367,11 @@ SPoint3 pbcConstraintElementGroup::getRootPoint(){
 			Msg::Fatal("getRootPoint has not been implemented for %d D problems",_solver->getMicroBC()->getDim());
 		}
 	}
+};
 
+void pbcConstraintElementGroup::getPeriodicity(SVector3& Lx, SVector3& Ly, SVector3& Lz){
+  Lx = _periodic12;
+  Ly = _periodic14;
+  Lz = _periodic15;
 };
 
diff --git a/NonLinearSolver/periodicBC/pbcCreateConstraints.h b/NonLinearSolver/periodicBC/pbcCreateConstraints.h
index 5a473a96dde7459ff665cfee1eb839ce170d7187..f89dcb382661d0ea426a7f673f78235c519b2b2f 100644
--- a/NonLinearSolver/periodicBC/pbcCreateConstraints.h
+++ b/NonLinearSolver/periodicBC/pbcCreateConstraints.h
@@ -313,6 +313,16 @@ class pbcConstraintElementGroup{
     double getRVEVolume() const {return _rveVolume;};
 		
 		SPoint3 getRootPoint();
+    void getPeriodicity(SVector3& Lx, SVector3& Ly, SVector3& Lz);
 };
 
 #endif // PBCCREATCONSTRAINTS_H_
+//
+//
+// Description: create linear system from micro BCs
+//
+// Author:  <Van Dung NGUYEN>, (C) 2011
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
diff --git a/dG3D/benchmarks/CMakeLists.txt b/dG3D/benchmarks/CMakeLists.txt
index f088dcefad72672989c9d9c51edf0f70992247e5..74805e7ccbae6566a689987e2e13b48fd28a8091 100644
--- a/dG3D/benchmarks/CMakeLists.txt
+++ b/dG3D/benchmarks/CMakeLists.txt
@@ -124,3 +124,6 @@ add_subdirectory(compositeHyperDamage)
 add_subdirectory(mixedmodeDelaminationExpoLaw)
 add_subdirectory(hyperViscoElastic)
 add_subdirectory(powerYieldViscoElastoPlastic)
+add_subdirectory(powerYieldViscoElastoPlasticSaturationDamage)
+add_subdirectory(powerYieldViscoElastoPlasticFullFailure)
+add_subdirectory(J2plasticExtractCohesiveLaw)
diff --git a/dG3D/benchmarks/CohesiveBand_Plate/notchedPlate.py b/dG3D/benchmarks/CohesiveBand_Plate/notchedPlate.py
index cdd56e6112b60cbbc3abdf2a906e0a575a219037..2e17eb5a851041421e12be3bd67407419a04e919 100755
--- a/dG3D/benchmarks/CohesiveBand_Plate/notchedPlate.py
+++ b/dG3D/benchmarks/CohesiveBand_Plate/notchedPlate.py
@@ -59,7 +59,7 @@ ftime =1.0   		# Final time
 tol=1.e-5  		# Relative tolerance for NR scheme
 tolAbs=1.e-15  		# Relative tolerance for NR scheme
 nstepArch=1		# Number of step between 2 archiving
-nstepArchEnergy = 10000	# Number of step between 2 energy computation and archiving
+nstepArchEnergy = 1	# Number of step between 2 energy computation and archiving
 nstepArchForce = 1	# Number of step between 2 force archiving
 
 MaxIter = 11		# Maximum number of iterations
diff --git a/dG3D/benchmarks/J2plasticExtractCohesiveLaw/CMakeLists.txt b/dG3D/benchmarks/J2plasticExtractCohesiveLaw/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..c542337d1c067eb440b4489f095393dd48b6050e
--- /dev/null
+++ b/dG3D/benchmarks/J2plasticExtractCohesiveLaw/CMakeLists.txt
@@ -0,0 +1,9 @@
+# test file
+
+set(PYFILE RVE1.py)
+
+set(FILES2DELETE 
+  E_0_GP_0*.csv
+)
+
+add_cm3python_test(${PYFILE} "${FILES2DELETE}")
diff --git a/dG3D/benchmarks/J2plasticExtractCohesiveLaw/RVE1.geo b/dG3D/benchmarks/J2plasticExtractCohesiveLaw/RVE1.geo
new file mode 100644
index 0000000000000000000000000000000000000000..78b0b618348ed3c8ef80f4c99d0b144660e06cdb
--- /dev/null
+++ b/dG3D/benchmarks/J2plasticExtractCohesiveLaw/RVE1.geo
@@ -0,0 +1,164 @@
+cl__1 = 0.015;
+cl__2 = 1e+22;
+Point(1) = {0.3, 0, 0, 0.015};
+Point(2) = {0.3, 0.3, 0, 0.015};
+Point(3) = {0, 0.3, 0, 0.015};
+Point(4) = {0, 0, 0, 0.015};
+Point(5) = {0.03599824519995404, 0.09425852764599107, 0, 1e+22};
+Point(6) = {0.02437867649958841, 0.09425852764599107, 0, 0.015};
+Point(7) = {0.03599824519995404, 0.1058780963463567, 0, 0.015};
+Point(8) = {0.04761781390031966, 0.09425852764599107, 0, 0.015};
+Point(9) = {0.03599824519995404, 0.08263895894562545, 0, 0.015};
+Point(10) = {0.04712301541176261, 0.1234941944718658, 0, 1e+22};
+Point(11) = {0.03614597715923168, 0.1234941944718658, 0, 0.015};
+Point(12) = {0.04712301541176261, 0.1344712327243968, 0, 0.015};
+Point(13) = {0.05810005366429355, 0.1234941944718658, 0, 0.015};
+Point(14) = {0.04712301541176261, 0.1125171562193349, 0, 0.015};
+Point(15) = {0.06415355488137053, 0.2584919934068711, 0, 1e+22};
+Point(16) = {0.04283164719153354, 0.2584919934068711, 0, 0.015};
+Point(17) = {0.06415355488137053, 0.2798139010967081, 0, 0.015};
+Point(18) = {0.08547546257120753, 0.2584919934068711, 0, 0.015};
+Point(19) = {0.06415355488137053, 0.2371700857170341, 0, 0.015};
+Point(20) = {0.1746749575297588, 0.03892509835496766, 0, 1e+22};
+Point(21) = {0.1606988920990446, 0.03892509835496766, 0, 0.015};
+Point(22) = {0.1746749575297588, 0.05290116378568177, 0, 0.015};
+Point(23) = {0.188651022960473, 0.03892509835496766, 0, 0.015};
+Point(24) = {0.1746749575297588, 0.02494903292425354, 0, 0.015};
+Point(25) = {0.09975293879095848, 0.05525547448280149, 0, 1e+22};
+Point(26) = {0.06871751611817917, 0.05525547448280149, 0, 0.015};
+Point(27) = {0.09975293879095848, 0.0862908971555808, 0, 0.015};
+Point(28) = {0.1307883614637378, 0.05525547448280149, 0, 0.015};
+Point(29) = {0.09975293879095848, 0.02422005181002218, 0, 0.015};
+Point(30) = {0.1588794843533144, 0.1136301380324881, 0, 1e+22};
+Point(31) = {0.130478445089528, 0.1136301380324881, 0, 0.015};
+Point(32) = {0.1588794843533144, 0.1420311772962745, 0, 0.015};
+Point(33) = {0.1872805236171009, 0.1136301380324881, 0, 0.015};
+Point(34) = {0.1588794843533144, 0.08522909876870161, 0, 0.015};
+Point(35) = {0.1182571101141734, 0.1773159517790773, 0, 1e+22};
+Point(36) = {0.08720162967218809, 0.1773159517790773, 0, 0.015};
+Point(37) = {0.1182571101141734, 0.2083714322210627, 0, 0.015};
+Point(38) = {0.1493125905561588, 0.1773159517790773, 0, 0.015};
+Point(39) = {0.1182571101141734, 0.146260471337092, 0, 0.015};
+Point(40) = {0.1728715926819994, 0.2327950844232471, 0, 1e+22};
+Point(41) = {0.144029685701405, 0.2327950844232471, 0, 0.015};
+Point(42) = {0.1728715926819994, 0.2616369914038416, 0, 0.015};
+Point(43) = {0.2017134996625938, 0.2327950844232471, 0, 0.015};
+Point(44) = {0.1728715926819994, 0.2039531774426527, 0, 0.015};
+Point(45) = {0.1153675521897498, 0.2738668804769339, 0, 1e+22};
+Point(46) = {0.09430956788605865, 0.2738668804769339, 0, 0.015};
+Point(47) = {0.1153675521897498, 0.2949248647806251, 0, 0.015};
+Point(48) = {0.136425536493441, 0.2738668804769339, 0, 0.015};
+Point(49) = {0.1153675521897498, 0.2528088961732426, 0, 0.015};
+Point(50) = {0.2379532033020713, 0.04098391168056675, 0, 1e+22};
+Point(51) = {0.2202227089295549, 0.04098391168056675, 0, 0.015};
+Point(52) = {0.2379532033020713, 0.0587144060530832, 0, 0.015};
+Point(53) = {0.2556836976745877, 0.04098391168056675, 0, 0.015};
+Point(54) = {0.2379532033020713, 0.02325341730805031, 0, 0.015};
+Point(55) = {0.2031621140922319, 0.05816734680959873, 0, 1e+22};
+Point(56) = {0.1910297644227151, 0.05816734680959873, 0, 0.015};
+Point(57) = {0.2031621140922319, 0.07029969647911549, 0, 0.015};
+Point(58) = {0.2152944637617488, 0.05816734680959873, 0, 0.015};
+Point(59) = {0.2031621140922319, 0.04603499714008197, 0, 0.015};
+Point(60) = {0.2348689464385331, 0.111588425598883, 0, 1e+22};
+Point(61) = {0.216354150124288, 0.111588425598883, 0, 0.015};
+Point(62) = {0.2348689464385331, 0.1301032219131281, 0, 0.015};
+Point(63) = {0.2533837427527781, 0.111588425598883, 0, 0.015};
+Point(64) = {0.2348689464385331, 0.09307362928463803, 0, 0.015};
+Point(65) = {0.2209345058858645, 0.1640510301825279, 0, 1e+22};
+Point(66) = {0.2097755231506618, 0.1640510301825279, 0, 0.015};
+Point(67) = {0.2209345058858645, 0.1752100129177305, 0, 0.015};
+Point(68) = {0.2320934886210672, 0.1640510301825279, 0, 0.015};
+Point(69) = {0.2209345058858645, 0.1528920474473252, 0, 0.015};
+Point(70) = {0.2530762165185168, 0.2181409899822236, 0, 1e+22};
+Point(71) = {0.2442832734374767, 0.2181409899822236, 0, 0.015};
+Point(72) = {0.2530762165185168, 0.2269339330632637, 0, 0.015};
+Point(73) = {0.2618691595995568, 0.2181409899822236, 0, 0.015};
+Point(74) = {0.2530762165185168, 0.2093480469011836, 0, 0.015};
+Point(75) = {0.2386033987639932, 0.2686425171597744, 0, 1e+22};
+Point(76) = {0.2150695708196276, 0.2686425171597744, 0, 0.015};
+Point(77) = {0.2386033987639932, 0.2921763451041399, 0, 0.015};
+Point(78) = {0.2621372267083587, 0.2686425171597744, 0, 0.015};
+Point(79) = {0.2386033987639932, 0.2451086892154088, 0, 0.015};
+Circle(1) = {6, 5, 7};
+Circle(2) = {7, 5, 8};
+Circle(3) = {8, 5, 9};
+Circle(4) = {9, 5, 6};
+Circle(6) = {11, 10, 12};
+Circle(7) = {12, 10, 13};
+Circle(8) = {13, 10, 14};
+Circle(9) = {14, 10, 11};
+Circle(11) = {16, 15, 17};
+Circle(12) = {17, 15, 18};
+Circle(13) = {18, 15, 19};
+Circle(14) = {19, 15, 16};
+Circle(16) = {21, 20, 22};
+Circle(17) = {22, 20, 23};
+Circle(18) = {23, 20, 24};
+Circle(19) = {24, 20, 21};
+Circle(21) = {26, 25, 27};
+Circle(22) = {27, 25, 28};
+Circle(23) = {28, 25, 29};
+Circle(24) = {29, 25, 26};
+Circle(26) = {31, 30, 32};
+Circle(27) = {32, 30, 33};
+Circle(28) = {33, 30, 34};
+Circle(29) = {34, 30, 31};
+Circle(31) = {36, 35, 37};
+Circle(32) = {37, 35, 38};
+Circle(33) = {38, 35, 39};
+Circle(34) = {39, 35, 36};
+Circle(36) = {41, 40, 42};
+Circle(37) = {42, 40, 43};
+Circle(38) = {43, 40, 44};
+Circle(39) = {44, 40, 41};
+Circle(41) = {46, 45, 47};
+Circle(42) = {47, 45, 48};
+Circle(43) = {48, 45, 49};
+Circle(44) = {49, 45, 46};
+Circle(46) = {51, 50, 52};
+Circle(47) = {52, 50, 53};
+Circle(48) = {53, 50, 54};
+Circle(49) = {54, 50, 51};
+Circle(51) = {56, 55, 57};
+Circle(52) = {57, 55, 58};
+Circle(53) = {58, 55, 59};
+Circle(54) = {59, 55, 56};
+Circle(56) = {61, 60, 62};
+Circle(57) = {62, 60, 63};
+Circle(58) = {63, 60, 64};
+Circle(59) = {64, 60, 61};
+Circle(61) = {66, 65, 67};
+Circle(62) = {67, 65, 68};
+Circle(63) = {68, 65, 69};
+Circle(64) = {69, 65, 66};
+Circle(66) = {71, 70, 72};
+Circle(67) = {72, 70, 73};
+Circle(68) = {73, 70, 74};
+Circle(69) = {74, 70, 71};
+Circle(71) = {76, 75, 77};
+Circle(72) = {77, 75, 78};
+Circle(73) = {78, 75, 79};
+Circle(74) = {79, 75, 76};
+Line(76) = {4, 1};
+Line(77) = {1, 2};
+Line(78) = {3, 2};
+Line(79) = {4, 3};
+Line Loop(11) = {76, 77, -78, -79, -4, -3, -2, -1, -9, -8, -7, -6, -14, -13, -12, -11, -19, -18, -17, -16, -24, -23, -22, -21, -29, -28, -27, -26, -34, -33, -32, -31, -39, -38, -37, -36, -44, -43, -42, -41, -49, -48, -47, -46, -54, -53, -52, -51, -59, -58, -57, -56, -64, -63, -62, -61, -69, -68, -67, -66, -74, -73, -72, -71};
+Plane Surface(11) = {11};
+y = 1;
+Physical Line(y) = {76};
+top = 2;
+Physical Line(top) = {77};
+top = 3;
+Physical Line(top) = {78};
+p = 4;
+Physical Line(p) = {79};
+Physical Surface(11) = {11};
+//+
+Physical Point(3) = {2};
+//+
+Physical Point(1) = {4};
+//+
+Physical Point(2) = {1};
+//+
+Physical Point(4) = {3};
diff --git a/dG3D/benchmarks/J2plasticExtractCohesiveLaw/RVE1.msh b/dG3D/benchmarks/J2plasticExtractCohesiveLaw/RVE1.msh
new file mode 100644
index 0000000000000000000000000000000000000000..311725b448e853bbf8695e183137154de1a77507
--- /dev/null
+++ b/dG3D/benchmarks/J2plasticExtractCohesiveLaw/RVE1.msh
@@ -0,0 +1,3379 @@
+$MeshFormat
+2.2 0 8
+$EndMeshFormat
+$Nodes
+2266
+1 0.3 0 0
+2 0.3 0.3 0
+3 0 0.3 0
+4 0 0 0
+5 0.02437867649958841 0.09425852764599107 0
+6 0.03599824519995404 0.1058780963463567 0
+7 0.04761781390031966 0.09425852764599107 0
+8 0.03599824519995404 0.08263895894562545 0
+9 0.03614597715923168 0.1234941944718658 0
+10 0.04712301541176261 0.1344712327243968 0
+11 0.05810005366429355 0.1234941944718658 0
+12 0.04712301541176261 0.1125171562193349 0
+13 0.04283164719153354 0.2584919934068711 0
+14 0.06415355488137053 0.2798139010967081 0
+15 0.08547546257120753 0.2584919934068711 0
+16 0.06415355488137053 0.2371700857170341 0
+17 0.1606988920990446 0.03892509835496766 0
+18 0.1746749575297588 0.05290116378568177 0
+19 0.188651022960473 0.03892509835496766 0
+20 0.1746749575297588 0.02494903292425354 0
+21 0.06871751611817917 0.05525547448280149 0
+22 0.09975293879095848 0.0862908971555808 0
+23 0.1307883614637378 0.05525547448280149 0
+24 0.09975293879095848 0.02422005181002218 0
+25 0.130478445089528 0.1136301380324881 0
+26 0.1588794843533144 0.1420311772962745 0
+27 0.1872805236171009 0.1136301380324881 0
+28 0.1588794843533144 0.08522909876870161 0
+29 0.08720162967218809 0.1773159517790773 0
+30 0.1182571101141734 0.2083714322210627 0
+31 0.1493125905561588 0.1773159517790773 0
+32 0.1182571101141734 0.146260471337092 0
+33 0.144029685701405 0.2327950844232471 0
+34 0.1728715926819994 0.2616369914038416 0
+35 0.2017134996625938 0.2327950844232471 0
+36 0.1728715926819994 0.2039531774426527 0
+37 0.09430956788605865 0.2738668804769339 0
+38 0.1153675521897498 0.2949248647806251 0
+39 0.136425536493441 0.2738668804769339 0
+40 0.1153675521897498 0.2528088961732426 0
+41 0.2202227089295549 0.04098391168056675 0
+42 0.2379532033020713 0.0587144060530832 0
+43 0.2556836976745877 0.04098391168056675 0
+44 0.2379532033020713 0.02325341730805031 0
+45 0.1910297644227151 0.05816734680959873 0
+46 0.2031621140922319 0.07029969647911549 0
+47 0.2152944637617488 0.05816734680959873 0
+48 0.2031621140922319 0.04603499714008197 0
+49 0.216354150124288 0.111588425598883 0
+50 0.2348689464385331 0.1301032219131281 0
+51 0.2533837427527781 0.111588425598883 0
+52 0.2348689464385331 0.09307362928463803 0
+53 0.2097755231506618 0.1640510301825279 0
+54 0.2209345058858645 0.1752100129177305 0
+55 0.2320934886210672 0.1640510301825279 0
+56 0.2209345058858645 0.1528920474473252 0
+57 0.2442832734374767 0.2181409899822236 0
+58 0.2530762165185168 0.2269339330632637 0
+59 0.2618691595995568 0.2181409899822236 0
+60 0.2530762165185168 0.2093480469011836 0
+61 0.2150695708196276 0.2686425171597744 0
+62 0.2386033987639932 0.2921763451041399 0
+63 0.2621372267083587 0.2686425171597744 0
+64 0.2386033987639932 0.2451086892154088 0
+65 0.02778196937746599 0.102474803468486 0
+66 0.02526316350108147 0.09870514407885864 0
+67 0.03155162876709214 0.104993609344866 0
+68 0.04421452102240815 0.1024748034685199 0
+69 0.04044486163279244 0.1049936093448757 0
+70 0.04673332689881898 0.09870514407887702 0
+71 0.04421452102244197 0.08604225182349604 0
+72 0.04673332689883695 0.08981191121314849 0
+73 0.04044486163280988 0.08352344594711365 0
+74 0.02778196937749809 0.08604225182346403 0
+75 0.03155162876711617 0.08352344594710621 0
+76 0.02526316350107818 0.08981191121313147 0
+77 0.03936107722606907 0.1312561326575898 0
+78 0.03698155444265828 0.1276949251475532 0
+79 0.04292228473610077 0.1336356554409807 0
+80 0.05488495359743982 0.1312561326576062 0
+81 0.05132374608739514 0.1336356554409929 0
+82 0.05726447638086074 0.1276949251475683 0
+83 0.05488495359748879 0.1157322562861745 0
+84 0.05726447638086533 0.1192934637961745 0
+85 0.05132374608745501 0.1133527335027636 0
+86 0.03936107722607168 0.1157322562861393 0
+87 0.04292228473609175 0.1133527335027547 0
+88 0.03698155444265422 0.1192934637961883 0
+89 0.04568824116482326 0.2691529472517867 0
+90 0.05349260103645331 0.2769573071234175 0
+91 0.04355817357801375 0.2640105091949496 0
+92 0.04907668936606828 0.2735688589222036 0
+93 0.05863503909334342 0.2790873747102417 0
+94 0.07481450872627289 0.276957307123426 0
+95 0.08261886859789221 0.2691529472518311 0
+96 0.06967207066941421 0.2790873747102373 0
+97 0.07923042039667498 0.2735688589222013 0
+98 0.084748936184719 0.2640105091949806 0
+99 0.08261886859791379 0.2478310395619485 0
+100 0.07481450872630754 0.2400266796903362 0
+101 0.08474893618472995 0.2529734776188024 0
+102 0.07923042039668687 0.2434151278915528 0
+103 0.06967207066941795 0.237896612103506 0
+104 0.05349260103647848 0.2400266796903102 0
+105 0.04568824116484309 0.2478310395619211 0
+106 0.05863503909333782 0.237896612103502 0
+107 0.04907668936608636 0.2434151278915206 0
+108 0.04355817357801937 0.2529734776187715 0
+109 0.16479238688939 0.04880766899532869 0
+110 0.1617627567332873 0.04427350704496186 0
+111 0.169326548839765 0.05183729915143935 0
+112 0.1845575281700985 0.04880766899535766 0
+113 0.1800233662197115 0.05183729915145624 0
+114 0.1875871583262207 0.04427350704498469 0
+115 0.1845575281701522 0.02904252771463126 0
+116 0.1875871583262478 0.03357668966501583 0
+117 0.1800233662197594 0.02601289755849882 0
+118 0.1647923868894181 0.02904252771457873 0
+119 0.1693265488398169 0.02601289755847458 0
+120 0.1617627567332869 0.03357668966497478 0
+121 0.07107994700072712 0.06713221655608861 0
+122 0.07780758096201129 0.07720083231168025 0
+123 0.08787619671761257 0.08392846627300851 0
+124 0.06931385306240155 0.06131018508592911 0
+125 0.07394792793355322 0.07249783148894368 0
+126 0.08251058178473883 0.08106048534015499 0
+127 0.09369822818781953 0.08569456021135616 0
+128 0.1116296808642495 0.08392846627303123 0
+129 0.121698296619847 0.07720083231173894 0
+130 0.1284259305811658 0.06713221655614662 0
+131 0.1058076493940919 0.08569456021135725 0
+132 0.1169952957971189 0.08106048534019458 0
+133 0.1255579496483343 0.07249783148898772 0
+134 0.1301920245195099 0.06131018508595684 0
+135 0.1284259305811898 0.04337873240951431 0
+136 0.1216982966199134 0.03331011665393043 0
+137 0.1116296808643041 0.02658248269259436 0
+138 0.1301920245195141 0.04920076387966745 0
+139 0.1255579496483775 0.03801311747667997 0
+140 0.1169952957971751 0.02945046362544598 0
+141 0.105807649394119 0.0248163887542511 0
+142 0.08787619671767381 0.02658248269256911 0
+143 0.07780758096208015 0.03331011665385387 0
+144 0.07107994700075233 0.04337873240945349 0
+145 0.0936982281878314 0.02481638875424446 0
+146 0.08251058178482137 0.02945046362539284 0
+147 0.07394792793359495 0.03801311747659686 0
+148 0.06931385306240792 0.04920076387964183 0
+149 0.1342834628569708 0.1278306576643376 0
+150 0.1446789647214006 0.1382261595287945 0
+151 0.13144618703497 0.1209808678946483 0
+152 0.1387969168971064 0.1337127054886176 0
+153 0.1515287544910951 0.1410634353508167 0
+154 0.1730800039851802 0.1382261595288223 0
+155 0.1834755058496118 0.1278306576644175 0
+156 0.1662302142154835 0.1410634353508302 0
+157 0.1789620518094483 0.1337127054886918 0
+158 0.1863127816716554 0.120980867894661 0
+159 0.183475505849651 0.09942961840062632 0
+160 0.1730800039852383 0.08903411653618742 0
+161 0.1863127816716584 0.1062794081703261 0
+162 0.178962051809528 0.09354757057636406 0
+163 0.166230214215505 0.08619684071415172 0
+164 0.1446789647214785 0.08903411653613659 0
+165 0.1342834628570198 0.09942961840055357 0
+166 0.1515287544911243 0.0861968407141516 0
+167 0.1387969168972138 0.09354757057625102 0
+168 0.1314461870349785 0.1062794081702956 0
+169 0.08956558736149957 0.1892003696283172 0
+170 0.09629756930059152 0.1992754925925635 0
+171 0.1063726922648549 0.2060074745317186 0
+172 0.087798352020825 0.1833745754588759 0
+173 0.0924354218311704 0.1945694522847126 0
+174 0.1010036096084561 0.2031376400620255 0
+175 0.1121984864343712 0.207774709872425 0
+176 0.1301415279633995 0.2060074745317569 0
+177 0.1402166509276341 0.1992754925926848 0
+178 0.1469486328668038 0.1892003696284223 0
+179 0.1243157337939345 0.2077747098724332 0
+180 0.1355106106197796 0.2031376400620998 0
+181 0.1440787983970948 0.1945694522848349 0
+182 0.1487158682075198 0.1833745754588864 0
+183 0.1469486328668377 0.165431533929814 0
+184 0.1402166509277543 0.1553564109655901 0
+185 0.1301415279634731 0.1486244290264281 0
+186 0.1487158682075262 0.1712573280993005 0
+187 0.1440787983971829 0.1600624512734516 0
+188 0.1355106106199025 0.1514942634961368 0
+189 0.1243157337939739 0.1468571936857292 0
+190 0.1063726922649044 0.1486244290264155 0
+191 0.09629756930067468 0.155356410965508 0
+192 0.08956558736152054 0.1654315339297868 0
+193 0.1121984864343755 0.1468571936857288 0
+194 0.1010036096085298 0.1514942634960799 0
+195 0.09243542183121775 0.1600624512733712 0
+196 0.08779835202082242 0.1712573280992918 0
+197 0.1462251451440355 0.2438324043825397 0
+198 0.1524772846736875 0.2531893924315951 0
+199 0.1618342727226781 0.2594415319611991 0
+200 0.1445838748566719 0.2384218613436435 0
+201 0.1488904234667771 0.2488187894051834 0
+202 0.1568478877000643 0.2567762536384702 0
+203 0.1672448157615605 0.2610828022485662 0
+204 0.1839089126412409 0.2594415319612323 0
+205 0.1932659006902697 0.2531893924316367 0
+206 0.1995180402199611 0.2438324043825452 0
+207 0.1784983696023916 0.2610828022485756 0
+208 0.1888952976638875 0.2567762536385019 0
+209 0.1968527618971792 0.2488187894052473 0
+210 0.2011593105073262 0.2384218613436476 0
+211 0.1995180402199787 0.2217577644639918 0
+212 0.193265900690359 0.2124007764149468 0
+213 0.18390891264129 0.2061486368852824 0
+214 0.201159310507331 0.227168307502871 0
+215 0.1968527618972518 0.2167713794413556 0
+216 0.1888952976639689 0.2088139152080469 0
+217 0.1784983696024053 0.2045073665979214 0
+218 0.1618342727227385 0.2061486368852701 0
+219 0.1524772846737393 0.2124007764148473 0
+220 0.1462251451440579 0.2217577644639006 0
+221 0.1672448157615946 0.2045073665979212 0
+222 0.1568478877001332 0.2088139152079779 0
+223 0.1488904234668157 0.2167713794412529 0
+224 0.1445838748566795 0.2271683075028125 0
+225 0.09713080283028765 0.2843958726288286 0
+226 0.1048385600378986 0.2921036298364212 0
+227 0.0950271013012107 0.2793170878661469 0
+228 0.1004773086904942 0.2887571239761981 0
+229 0.1099173448005119 0.2942073313654663 0
+230 0.1258965443415497 0.2921036298364508 0
+231 0.1336043015491872 0.2843958726288715 0
+232 0.1208177595789898 0.2942073313654658 0
+233 0.1302577956889452 0.2887571239762582 0
+234 0.1357080030782618 0.279317087866248 0
+235 0.1336043015492408 0.2633378883250891 0
+236 0.1258965443416125 0.2556301311174533 0
+237 0.1357080030782752 0.2684166730876696 0
+238 0.1302577956890351 0.2589766369776993 0
+239 0.1208177595790222 0.2535264295884107 0
+240 0.1048385600379268 0.2556301311174302 0
+241 0.09713080283024352 0.2633378883251153 0
+242 0.1099173448004684 0.253526429588413 0
+243 0.1004773086904722 0.2589766369776915 0
+244 0.09502710130123189 0.2684166730876412 0
+245 0.2254158504974823 0.05352126448517029 0
+246 0.2215723624500021 0.04776907812458382 0
+247 0.2311680368580386 0.05736475253262951 0
+248 0.2504905561066638 0.05352126448516691 0
+249 0.2447383697460216 0.05736475253266368 0
+250 0.2543340441541301 0.04776907812460909 0
+251 0.2504905561066869 0.02844655887598983 0
+252 0.2543340441541386 0.03419874523654493 0
+253 0.2447383697461008 0.02460307082850265 0
+254 0.2254158504974922 0.02844655887595321 0
+255 0.231168036858065 0.02460307082849302 0
+256 0.2215723624499926 0.0341987452365724 0
+257 0.1945832473691712 0.06674621353262136 0
+258 0.1919532845512839 0.06281019602375544 0
+259 0.1985192648779925 0.06937617635051251 0
+260 0.2117409808152458 0.06674621353266821 0
+261 0.2078049633064293 0.06937617635052987 0
+262 0.2143709436331646 0.06281019602379237 0
+263 0.2117409808153029 0.04958848008658622 0
+264 0.2143709436331843 0.05352449759545241 0
+265 0.2078049633064713 0.04695851726868486 0
+266 0.1945832473692223 0.04958848008652501 0
+267 0.1985192648781195 0.04695851726863242 0
+268 0.1919532845513043 0.05352449759539275 0
+269 0.2217770084124438 0.1246803636249745 0
+270 0.2177635050751837 0.1186737314019517 0
+271 0.2277836406355008 0.1286938669622475 0
+272 0.247960884464637 0.1246803636249599 0
+273 0.2419542522416069 0.1286938669622303 0
+274 0.251974387801888 0.1186737314019383 0
+275 0.2479608844646588 0.09849648757282806 0
+276 0.2519743878019024 0.1045031197958627 0
+277 0.2419542522416834 0.0944829842355675 0
+278 0.2217770084124917 0.09849648757274376 0
+279 0.2277836406354518 0.09448298423553897 0
+280 0.2177635050752032 0.1045031197957676 0
+281 0.2130439135226359 0.1719416225457101 0
+282 0.2106249501331443 0.1683213879972908 0
+283 0.216664148070952 0.1743605859351861 0
+284 0.2288250982490617 0.1719416225457415 0
+285 0.225204863700673 0.1743605859352291 0
+286 0.2312440616385516 0.1683213879973703 0
+287 0.2288250982490846 0.1561604378193371 0
+288 0.231244061638587 0.1597806723677706 0
+289 0.2252048637007321 0.1537414744298511 0
+290 0.2130439135226878 0.1561604378192938 0
+291 0.2166641480710922 0.1537414744298116 0
+292 0.2106249501331742 0.1597806723676929 0
+293 0.2468586668392746 0.224358539661363 0
+294 0.2449525963754124 0.2215059036210797 0
+295 0.2497113028796115 0.2262646101253076 0
+296 0.2592937661977526 0.2243585396613694 0
+297 0.2564411301573255 0.2262646101253476 0
+298 0.2611998366616667 0.2215059036209698 0
+299 0.2592937661977298 0.2119234403030552 0
+300 0.2611998366616317 0.2147760763433931 0
+301 0.2564411301573638 0.2100173698391156 0
+302 0.2468586668393634 0.2119234403029955 0
+303 0.2497113028797416 0.2100173698390858 0
+304 0.2449525963754309 0.2147760763433233 0
+305 0.2182225059158491 0.2804094311319028 0
+306 0.226836484791777 0.2890234100078678 0
+307 0.2158714665610609 0.2747335200358444 0
+308 0.2219624694371637 0.2852834464864216 0
+309 0.2325123958878135 0.2913744493626773 0
+310 0.250370312736125 0.2890234100079164 0
+311 0.258984291612077 0.2804094311320071 0
+312 0.2446944016401676 0.2913744493626786 0
+313 0.2552443280906778 0.2852834464865664 0
+314 0.2613353309668695 0.2747335200360532 0
+315 0.2589842916120938 0.2568756031875708 0
+316 0.2503703127361848 0.2482616243116668 0
+317 0.2613353309668872 0.2625515142835619 0
+318 0.2552443280907334 0.252001587833038 0
+319 0.2446944016401976 0.2459105849568782 0
+320 0.2268364847918414 0.2482616243116438 0
+321 0.218222505915882 0.256875603187589 0
+322 0.2325123958878809 0.2459105849568534 0
+323 0.2219624694372626 0.2520015878330282 0
+324 0.215871466561095 0.2625515142835771 0
+325 0.01499999999997001 0 0
+326 0.02999999999994495 0 0
+327 0.04499999999991141 0 0
+328 0.05999999999987042 0 0
+329 0.07499999999982671 0 0
+330 0.089999999999783 0 0
+331 0.1049999999997393 0 0
+332 0.119999999999701 0 0
+333 0.1349999999996573 0 0
+334 0.149999999999619 0 0
+335 0.1649999999996555 0 0
+336 0.179999999999692 0 0
+337 0.1949999999997296 0 0
+338 0.2099999999997737 0 0
+339 0.2249999999998124 0 0
+340 0.2399999999998511 0 0
+341 0.2549999999998799 0 0
+342 0.2699999999999185 0 0
+343 0.2849999999999636 0 0
+344 0.007499999999985718 0 0
+345 0.02249999999995655 0 0
+346 0.03749999999993252 0 0
+347 0.05249999999989092 0 0
+348 0.06749999999984856 0 0
+349 0.08249999999980485 0 0
+350 0.09749999999976114 0 0
+351 0.1124999999997202 0 0
+352 0.1274999999996791 0 0
+353 0.1424999999996381 0 0
+354 0.1574999999996426 0 0
+355 0.1724999999996732 0 0
+356 0.1874999999997104 0 0
+357 0.2024999999997543 0 0
+358 0.2174999999997944 0 0
+359 0.2324999999998336 0 0
+360 0.2474999999998637 0 0
+361 0.2624999999998854 0 0
+362 0.2774999999999314 0 0
+363 0.2924999999999751 0 0
+364 0.3 0.01499999999997001 0
+365 0.3 0.02999999999994495 0
+366 0.3 0.04499999999991141 0
+367 0.3 0.05999999999987042 0
+368 0.3 0.07499999999982671 0
+369 0.3 0.089999999999783 0
+370 0.3 0.1049999999997393 0
+371 0.3 0.119999999999701 0
+372 0.3 0.1349999999996573 0
+373 0.3 0.149999999999619 0
+374 0.3 0.1649999999996555 0
+375 0.3 0.179999999999692 0
+376 0.3 0.1949999999997296 0
+377 0.3 0.2099999999997737 0
+378 0.3 0.2249999999998124 0
+379 0.3 0.2399999999998511 0
+380 0.3 0.2549999999998799 0
+381 0.3 0.2699999999999185 0
+382 0.3 0.2849999999999636 0
+383 0.3 0.007499999999985718 0
+384 0.3 0.02249999999995655 0
+385 0.3 0.03749999999993252 0
+386 0.3 0.05249999999989092 0
+387 0.3 0.06749999999984856 0
+388 0.3 0.08249999999980485 0
+389 0.3 0.09749999999976114 0
+390 0.3 0.1124999999997202 0
+391 0.3 0.1274999999996791 0
+392 0.3 0.1424999999996381 0
+393 0.3 0.1574999999996426 0
+394 0.3 0.1724999999996732 0
+395 0.3 0.1874999999997104 0
+396 0.3 0.2024999999997543 0
+397 0.3 0.2174999999997944 0
+398 0.3 0.2324999999998336 0
+399 0.3 0.2474999999998637 0
+400 0.3 0.2624999999998854 0
+401 0.3 0.2774999999999314 0
+402 0.3 0.2924999999999751 0
+403 0.01499999999997001 0.3 0
+404 0.02999999999994495 0.3 0
+405 0.04499999999991141 0.3 0
+406 0.05999999999987042 0.3 0
+407 0.07499999999982671 0.3 0
+408 0.089999999999783 0.3 0
+409 0.1049999999997393 0.3 0
+410 0.119999999999701 0.3 0
+411 0.1349999999996573 0.3 0
+412 0.149999999999619 0.3 0
+413 0.1649999999996555 0.3 0
+414 0.179999999999692 0.3 0
+415 0.1949999999997296 0.3 0
+416 0.2099999999997737 0.3 0
+417 0.2249999999998124 0.3 0
+418 0.2399999999998511 0.3 0
+419 0.2549999999998799 0.3 0
+420 0.2699999999999185 0.3 0
+421 0.2849999999999636 0.3 0
+422 0.007499999999985718 0.3 0
+423 0.02249999999995655 0.3 0
+424 0.03749999999993252 0.3 0
+425 0.05249999999989092 0.3 0
+426 0.06749999999984856 0.3 0
+427 0.08249999999980485 0.3 0
+428 0.09749999999976114 0.3 0
+429 0.1124999999997202 0.3 0
+430 0.1274999999996791 0.3 0
+431 0.1424999999996381 0.3 0
+432 0.1574999999996426 0.3 0
+433 0.1724999999996732 0.3 0
+434 0.1874999999997104 0.3 0
+435 0.2024999999997543 0.3 0
+436 0.2174999999997944 0.3 0
+437 0.2324999999998336 0.3 0
+438 0.2474999999998637 0.3 0
+439 0.2624999999998854 0.3 0
+440 0.2774999999999314 0.3 0
+441 0.2924999999999751 0.3 0
+442 0 0.01499999999997001 0
+443 0 0.02999999999994495 0
+444 0 0.04499999999991141 0
+445 0 0.05999999999987042 0
+446 0 0.07499999999982671 0
+447 0 0.089999999999783 0
+448 0 0.1049999999997393 0
+449 0 0.119999999999701 0
+450 0 0.1349999999996573 0
+451 0 0.149999999999619 0
+452 0 0.1649999999996555 0
+453 0 0.179999999999692 0
+454 0 0.1949999999997296 0
+455 0 0.2099999999997737 0
+456 0 0.2249999999998124 0
+457 0 0.2399999999998511 0
+458 0 0.2549999999998799 0
+459 0 0.2699999999999185 0
+460 0 0.2849999999999636 0
+461 0 0.007499999999985718 0
+462 0 0.02249999999995655 0
+463 0 0.03749999999993252 0
+464 0 0.05249999999989092 0
+465 0 0.06749999999984856 0
+466 0 0.08249999999980485 0
+467 0 0.09749999999976114 0
+468 0 0.1124999999997202 0
+469 0 0.1274999999996791 0
+470 0 0.1424999999996381 0
+471 0 0.1574999999996426 0
+472 0 0.1724999999996732 0
+473 0 0.1874999999997104 0
+474 0 0.2024999999997543 0
+475 0 0.2174999999997944 0
+476 0 0.2324999999998336 0
+477 0 0.2474999999998637 0
+478 0 0.2624999999998854 0
+479 0 0.2774999999999314 0
+480 0 0.2924999999999751 0
+481 0.07767472299891677 0.1887053702008941 0
+482 0.2395155917905332 0.211589913292709 0
+483 0.2378745381526065 0.1711925516031393 0
+484 0.01435398319374404 0.2100193442307646 0
+485 0.05681869320988179 0.05182622134387425 0
+486 0.2031345814549321 0.1694033063089884 0
+487 0.06536925463370878 0.1192390658224351 0
+488 0.2264945033133554 0.1812578976272888 0
+489 0.260548617677373 0.2061973888559728 0
+490 0.28596772223992 0.149929743969532 0
+491 0.05548437868061395 0.1396174959264575 0
+492 0.2088750282690013 0.2155056249343649 0
+493 0.09941112740530061 0.1393577359150807 0
+494 0.03878494309539164 0.1399490263521044 0
+495 0.1121296697175281 0.2429816455139209 0
+496 0.2661039225941044 0.2238098238270619 0
+497 0.06843563424025546 0.2266376705776996 0
+498 0.1969202700294957 0.2033643083882207 0
+499 0.01418900159080621 0.04553349025299917 0
+500 0.1750670521246448 0.1929158574833813 0
+501 0.0858593188449305 0.1503816674754931 0
+502 0.1513758561365841 0.03049451259310299 0
+503 0.02714745751970696 0.07719146414321695 0
+504 0.07301900735811234 0.08785487653808097 0
+505 0.2112031037437482 0.1802801746372572 0
+506 0.09615171524946448 0.1004277602824877 0
+507 0.03547898526434023 0.2460497466969806 0
+508 0.07464679750929468 0.1755214632881099 0
+509 0.03502728731990713 0.2720095412250745 0
+510 0.2620638632710548 0.097485446792487 0
+511 0.2645279744602087 0.029015336600353 0
+512 0.2634043084719139 0.05439368554864166 0
+513 0.09195887710071135 0.2102987118938441 0
+514 0.2405648134478293 0.2264363187120844 0
+515 0.06773896520648344 0.02658248269254769 0
+516 0.1815195556970704 0.1508428231081926 0
+517 0.1588330507160952 0.1630675762405079 0
+518 0.2514587683711728 0.06702682955426841 0
+519 0.1842987827412913 0.2716141334560961 0
+520 0.1597513873771892 0.2721962856846792 0
+521 0.2849999999999629 0.1799999999996926 0
+522 0.2847484359318204 0.1971651530455827 0
+523 0.04385209974316093 0.07629062418944219 0
+524 0.08906143476883471 0.239319863678076 0
+525 0.2707512055842793 0.2835623662282341 0
+526 0.270751205584279 0.2537226680913461 0
+527 0.2098047868190288 0.1494057913120044 0
+528 0.1947990749319342 0.07671378479902559 0
+529 0.1508163214586844 0.04301859314531502 0
+530 0.01467160619063285 0.1783155343261416 0
+531 0.1640291933948953 0.05945343313019223 0
+532 0.04521769307521619 0.01414987020364078 0
+533 0.2088044038847124 0.07766398751215431 0
+534 0.01499999651833761 0.01499999651359491 0
+535 0.1158931524247849 0.2202558500703208 0
+536 0.01682444524142774 0.1492081085354503 0
+537 0.1426328246393106 0.06192901041636527 0
+538 0.01499999999995627 0.1349999999996573 0
+539 0.2610151454128851 0.1266887168693096 0
+540 0.2858347858768935 0.2112031769881891 0
+541 0.2652733577051974 0.2117677073412756 0
+542 0.2863823691383613 0.2258609882437094 0
+543 0.1347797752920201 0.228261962610664 0
+544 0.120082943225121 0.1316356754317791 0
+545 0.2101692085085891 0.1004534777151779 0
+546 0.2052676698799599 0.274154579427699 0
+547 0.2877277210787638 0.1048666186138354 0
+548 0.2850000000000437 0.119999999999701 0
+549 0.1376188775128769 0.03559445324323539 0
+550 0.2502659517005825 0.1390064834796711 0
+551 0.237325051170229 0.1555510772613835 0
+552 0.2852240148425454 0.07490094495355104 0
+553 0.01833395489938896 0.08759857063906093 0
+554 0.0155089570502674 0.0987477035540526 0
+555 0.2021384648162998 0.1192468625246739 0
+556 0.2300527083071047 0.1494516773055906 0
+557 0.2473130712682121 0.2298545556303173 0
+558 0.01500000000003377 0.2399999999998461 0
+559 0.02745601586459762 0.1277038885362378 0
+560 0.01499999748834003 0.285000002514566 0
+561 0.0150000000000337 0.2699999999999136 0
+562 0.1162779254576699 0.1098251202649484 0
+563 0.18412426833292 0.06433632744607828 0
+564 0.1280455091160287 0.02397832811726087 0
+565 0.05363180599516557 0.08866381782930988 0
+566 0.2850000000000423 0.04499999999991277 0
+567 0.2106694023898744 0.236061454756181 0
+568 0.02904968582304853 0.119652052250999 0
+569 0.2106647251730546 0.03206900838725277 0
+570 0.1611970084054382 0.1796799094684788 0
+571 0.2250621342414232 0.06555449091656299 0
+572 0.1848232732027233 0.01652739482042341 0
+573 0.1676869248144258 0.01688168161825937 0
+574 0.1952032923049958 0.02827933422012404 0
+575 0.1467669127851145 0.2853846542204006 0
+576 0.2850000000000317 0.01499999999997671 0
+577 0.1404697946394007 0.07434335596344854 0
+578 0.2489719252449294 0.08439350876643177 0
+579 0.05423721200619179 0.09828189539762527 0
+580 0.1434841898794216 0.2634751833079153 0
+581 0.2715830799560361 0.01327770788283756 0
+582 0.1799999999996926 0.2849999999999629 0
+583 0.2032638617374908 0.2593922872829212 0
+584 0.2365068243312921 0.2333549203468842 0
+585 0.2849999999999711 0.2399999999998511 0
+586 0.20952826199486 0.01556812746154751 0
+587 0.2831027570284944 0.2550331838667543 0
+588 0.01499999999995628 0.07499999999982672 0
+589 0.2850000269481692 0.285000027050235 0
+590 0.2223833481542128 0.01328805893763027 0
+591 0.2460607044132798 0.01417932896780172 0
+592 0.1626845021208509 0.07102857913685939 0
+593 0.1949968497265657 0.2823648350487019 0
+594 0.1024402869844494 0.01367963706673045 0
+595 0.1192258108962024 0.09603139375411798 0
+596 0.0287479737704184 0.2830797823609176 0
+597 0.08445936832221122 0.2903936650867203 0
+598 0.1432637001577537 0.2090873602225415 0
+599 0.08999999999978299 0.01499999999995629 0
+600 0.06351750919976262 0.1305697603175614 0
+601 0.07370322148656096 0.2862656533474861 0
+602 0.06223950085036091 0.2891489383275987 0
+603 0.07625158366866239 0.01556482039897355 0
+604 0.09418539364480105 0.245482191936654 0
+605 0.190292466206045 0.08731253331319405 0
+606 0.2589214839392188 0.2325728744731618 0
+607 0.225989647405433 0.08340662375523064 0
+608 0.1325948410822044 0.07940114451916197 0
+609 0.02728535886538538 0.1113299219610567 0
+610 0.2088709257549822 0.0416483926576973 0
+611 0.2270209536208342 0.1402648716647927 0
+612 0.08450605630821391 0.2801720543192043 0
+613 0.05548437868063576 0.1073708930173013 0
+614 0.1364659351794647 0.01243678940718997 0
+615 0.2193397740995489 0.2420717346043218 0
+616 0.09669540190757633 0.2535884747457146 0
+617 0.2483166468331557 0.2043076492486388 0
+618 0.1989871322280789 0.03952877207491369 0
+619 0.1529030740286303 0.1517882632901127 0
+620 0.2103922191551548 0.2890234100078367 0
+621 0.2096376230241817 0.1286690336740497 0
+622 0.0193599937499506 0.1206117870096347 0
+623 0.1259290837271405 0.1383315965072385 0
+624 0.1999479727352779 0.09457781697379687 0
+625 0.06401790584719785 0.1889538692724462 0
+626 0.05400190482283616 0.229756556364419 0
+627 0.07555988797209644 0.1247951667663083 0
+628 0.2025051068991925 0.1783343102655279 0
+629 0.06483279781213622 0.1407126758652587 0
+630 0.2322762751073699 0.2259785821040233 0
+631 0.06454918344213274 0.1099703924544862 0
+632 0.2657911516141237 0.23283702318513 0
+633 0.2685558927813517 0.2051950237019508 0
+634 0.2626324618226463 0.1401276628108088 0
+635 0.02537525909734778 0.06816226388313285 0
+636 0.05873988327087191 0.06489201889587079 0
+637 0.2614441985949148 0.08032719005168111 0
+638 0.1539825564882787 0.01172082554652042 0
+639 0.07865342576030872 0.1666986732542012 0
+640 0.08568239237369241 0.09512582712659948 0
+641 0.1829020720584463 0.1946123459428891 0
+642 0.08285063048191621 0.2311885366180772 0
+643 0.1043571801406036 0.2181030552625264 0
+644 0.1651139921541166 0.1936057016145957 0
+645 0.02682550145489466 0.2604641298081403 0
+646 0.173231600501126 0.1660829265635675 0
+647 0.02819302263162486 0.138570670406911 0
+648 0.1231142771538237 0.2447127864650182 0
+649 0.1854446306787723 0.07660519155913573 0
+650 0.05990334700222241 0.03736563197982826 0
+651 0.06249006750141173 0.07838354256370267 0
+652 0.1620667156300309 0.2858115113912584 0
+653 0.2743235452172207 0.2714503229216025 0
+654 0.2862426984334158 0.1668660831804849 0
+655 0.1899670654822093 0.1402213163241506 0
+656 0.04331279493978892 0.2365190938290349 0
+657 0.01386961905983472 0.1615955303937349 0
+658 0.1393150933246154 0.2536197537351055 0
+659 0.01436841479650417 0.2556312760100591 0
+660 0.2055587725653168 0.1562608570104594 0
+661 0.06322957141547739 0.09294151492162533 0
+662 0.1274756571767436 0.2185037877417562 0
+663 0.01472400175397849 0.228616116823038 0
+664 0.2809722749302683 0.03003191807596417 0
+665 0.2730934513914757 0.1835820831300938 0
+666 0.01459322018358907 0.1934827332221937 0
+667 0.2851719097321499 0.1348280818062612 0
+668 0.2683367554971504 0.06514322310350659 0
+669 0.1178962984760666 0.01500132712867213 0
+670 0.01460515136047838 0.03007026964893169 0
+671 0.2838641922862519 0.05991149810497234 0
+672 0.02989410687503868 0.01489379872868582 0
+673 0.2851727928759852 0.08982720243391572 0
+674 0.01345108063958382 0.06264393010973017 0
+675 0.1966402096003087 0.01653918726569566 0
+676 0.2716203854616837 0.1119451982390912 0
+677 0.235273711332794 0.1812009720053422 0
+678 0.172956340115786 0.06448760020437186 0
+679 0.1479469422304792 0.2725929725921231 0
+680 0.2094892722545652 0.2493870365129128 0
+681 0.04086576179204277 0.2849927280723861 0
+682 0.1538930978473335 0.1995629444774942 0
+683 0.1717976956860407 0.2752517843871676 0
+684 0.2369782632867913 0.07386807490303154 0
+685 0.06061767622415248 0.01437398818509078 0
+686 0.1339830512897913 0.2418723470320377 0
+687 0.2132210675986361 0.08734406299268702 0
+688 0.01498937984051156 0.1096940359987784 0
+689 0.04758110710179692 0.1436750684841738 0
+690 0.1405718452144765 0.04853852616925027 0
+691 0.2614454692989774 0.2430115834725713 0
+692 0.2863048229545284 0.2688970898473043 0
+693 0.2103041717150617 0.2250118727316655 0
+694 0.2384458676246247 0.1453520119937164 0
+695 0.1400157666455299 0.02460419414884476 0
+696 0.2195780795130068 0.1838878600283824 0
+697 0.2752080708080115 0.2144439080099643 0
+698 0.09689189290645264 0.2302866234146765 0
+699 0.08159271364827643 0.2027379564274411 0
+700 0.2725573044944307 0.2411122131260221 0
+701 0.2363151001316887 0.2183954616452609 0
+702 0.1277012188491301 0.08929520122833912 0
+703 0.1076943970988103 0.09808067636978081 0
+704 0.1083048642807865 0.1343879995603225 0
+705 0.05147104439968433 0.2897783015102983 0
+706 0.1950148659279583 0.2680724915175932 0
+707 0.1545095050134283 0.06332142523521787 0
+708 0.1528920127683642 0.05417810951527822 0
+709 0.2185782034135256 0.07522198753002961 0
+710 0.03588667950754763 0.07217694345043422 0
+711 0.1365002631436423 0.2161339747012788 0
+712 0.05095278679408481 0.07980288220522325 0
+713 0.2014208825027845 0.08271714719195854 0
+714 0.2292586988995228 0.2368652757573536 0
+715 0.2575324629872183 0.01698378646539642 0
+716 0.102720289040563 0.2387452359544839 0
+717 0.2160184280644279 0.139804369040047 0
+718 0.1975952096972633 0.1314920724463683 0
+719 0.2712711477014774 0.04227243744212886 0
+720 0.1506425125812972 0.07414759767612154 0
+721 0.1188586285570216 0.1233282949519927 0
+722 0.1736978768310074 0.07522530126164674 0
+723 0.2419094707129456 0.1636994060024685 0
+724 0.2711520575108641 0.1956919881051521 0
+725 0.2547447886106617 0.2019510657137748 0
+726 0.1530988153766911 0.2641790731955023 0
+727 0.2323391567692073 0.01447929711920117 0
+728 0.1568820759222804 0.02173128697117921 0
+729 0.06214598758174977 0.1020875844632064 0
+730 0.1662665152578713 0.1527364594420707 0
+731 0.1019830518904254 0.2461661724685932 0
+732 0.1562439285785505 0.188846736850592 0
+733 0.2001466088412849 0.1073256464718632 0
+734 0.2417809696406716 0.2053082685876613 0
+735 0.2688800059841938 0.2181515043291105 0
+736 0.2354424168051554 0.2048636519202651 0
+737 0.2427302391937808 0.1784754530917689 0
+738 0.0630195929870172 0.1764603903581725 0
+739 0.2731456011289488 0.1734606664883831 0
+740 0.02689752077655217 0.167024345430958 0
+741 0.02887727907928024 0.1957418268923016 0
+742 0.2410755354047332 0.1994161984884702 0
+743 0.04754383768135615 0.03858127191871545 0
+744 0.09355186896092743 0.1291622450096394 0
+745 0.05485227939005574 0.2173217236835172 0
+746 0.1921059692278139 0.1799858705439362 0
+747 0.20927567182693 0.188439465828707 0
+748 0.2283531148966277 0.1899027045189474 0
+749 0.07458978782576649 0.1134137427863491 0
+750 0.2148473362855481 0.210325031969079 0
+751 0.03632360762904337 0.06332583832570346 0
+752 0.03043428186106405 0.1485401960015446 0
+753 0.1984309026058997 0.1616910784622998 0
+754 0.2463504980568588 0.1531280687586863 0
+755 0.1733561560883303 0.1815306273407912 0
+756 0.02933827361638049 0.03059175886738406 0
+757 0.02913682843694566 0.2344073257721534 0
+758 0.08019064766130299 0.2181392541037804 0
+759 0.06898313258196508 0.2002031281863514 0
+760 0.1235242167117834 0.2329498574975808 0
+761 0.2606878888291375 0.1885559086453001 0
+762 0.262130893716516 0.1982989756356317 0
+763 0.2742877491942757 0.2257861518148463 0
+764 0.1024418038605288 0.1095363181731678 0
+765 0.09124984565819734 0.2216032362585809 0
+766 0.07228426007981978 0.1337353463250835 0
+767 0.0724633512960699 0.1012194734577475 0
+768 0.1092527334902859 0.2305537112855848 0
+769 0.1971964270399159 0.1500220786799671 0
+770 0.2283384066679722 0.217383276072208 0
+771 0.04671018017432645 0.06428170672988909 0
+772 0.03912395699756897 0.1490620613183491 0
+773 0.2478166044056512 0.1952687839122324 0
+774 0.1037241304320536 0.1226601787580809 0
+775 0.221511915711616 0.2280482133642114 0
+776 0.05665356623815833 0.1485243139388761 0
+777 0.08479888143982842 0.1061432933575572 0
+778 0.0272406884908491 0.2229189027145774 0
+779 0.2747824762188599 0.1258792756689979 0
+780 0.05368957834972315 0.02601487512102964 0
+781 0.273557409499266 0.1378418808346463 0
+782 0.2523280919782787 0.2360207050243561 0
+783 0.2317616225935461 0.2111046338723211 0
+784 0.02681709565514648 0.05657809591736777 0
+785 0.02360863381041316 0.2474131287054604 0
+786 0.2754162863987435 0.09876021452958184 0
+787 0.02412015200671878 0.2741106911817224 0
+788 0.2770998485817882 0.2047398499701678 0
+789 0.204388714002993 0.1407867282282991 0
+790 0.2266520620867932 0.0745127942762137 0
+791 0.1474096429910755 0.02028876906195807 0
+792 0.2712251455113722 0.08873810461108197 0
+793 0.2734263562010414 0.1623487777448713 0
+794 0.2743752807913672 0.05334416883983244 0
+795 0.2492582516366517 0.1721930262116575 0
+796 0.05200105067145057 0.07143386609959565 0
+797 0.05178174421143038 0.1776813329484802 0
+798 0.06535598153341995 0.165828509215697 0
+799 0.2381605280524609 0.1915778563143037 0
+800 0.06609970314407362 0.1517231000505903 0
+801 0.2632810569715421 0.1595367325704161 0
+802 0.07699643732507412 0.1438899069320757 0
+803 0.05571309583366382 0.2023543054057648 0
+804 0.04004152210195498 0.2228815075287743 0
+805 0.06746114921703686 0.2129675271388778 0
+806 0.2184507087547475 0.193040017615921 0
+807 0.02907386890518047 0.1822567986533653 0
+808 0.0824263946453777 0.1333811930638399 0
+809 0.0287451890457876 0.2101695695325384 0
+810 0.02840999093030893 0.04471953692265442 0
+811 0.2276702766601661 0.2037068667656196 0
+812 0.250807325665633 0.1812728392401376 0
+813 0.03959776293546544 0.05105384354317852 0
+814 0.2325633865667747 0.1976468009503837 0
+815 0.08626156926232147 0.1182032756176159 0
+816 0.1827581561397474 0.1848113092593457 0
+817 0.1983078522866003 0.1876420342328042 0
+818 0.04722175773805878 0.1565251636729333 0
+819 0.04034794131515351 0.0264740740803277 0
+820 0.2535732146597415 0.1618027608871349 0
+821 0.2703234353721461 0.1500596680499545 0
+822 0.2556019727659226 0.1948436637927422 0
+823 0.218332778972341 0.2176512496916144 0
+824 0.09307077246202633 0.1102648187076729 0
+825 0.2582676842958535 0.1509163594101425 0
+826 0.2067410981708614 0.2055357997502018 0
+827 0.1948368334147494 0.1703575181312598 0
+828 0.1883919264614067 0.1612886694381555 0
+829 0.2444667781885775 0.1862657642184269 0
+830 0.2740188613464469 0.07380419216495862 0
+831 0.2435762263291758 0.2360082695752394 0
+832 0.2229088137993188 0.2104290947605321 0
+833 0.04177404411076575 0.2084383827057722 0
+834 0.05402431602963037 0.1671503103297045 0
+835 0.2114375868240345 0.1973375967388677 0
+836 0.05125477609749005 0.1892659894405199 0
+837 0.2621232947723628 0.1677096173383189 0
+838 0.1841134403055289 0.1740094868795093 0
+839 0.04051240618848433 0.1698318243685835 0
+840 0.03474925879708817 0.1576178039468853 0
+841 0.07733607142563911 0.1569309740586225 0
+842 0.2025048471189172 0.1962342054888613 0
+843 0.04247640086214838 0.1819643458138904 0
+844 0.09577856142483351 0.1176933897830354 0
+845 0.2181048954394545 0.2023982764707025 0
+846 0.05764969648791294 0.1582932850109345 0
+847 0.25197682042748 0.1896536139035321 0
+848 0.2248570337458159 0.1968856733934812 0
+849 0.1896841306576378 0.1884275175946684 0
+850 0.08444993021018077 0.1263854701143509 0
+851 0.08936178107624974 0.1415588348352058 0
+852 0.03633709671643634 0.03822127894576437 0
+853 0.04228473373300983 0.1953760937620176 0
+854 0.2611010124656206 0.1775442758761633 0
+855 0.1923466035755811 0.1950860279943666 0
+856 0.02455502514719337 0.1567971968617146 0
+857 0.2664442161463189 0.2611825926255603 0
+858 0.2725373754007498 0.2625864955064743 0
+859 0.2682303859627897 0.2700464200406885 0
+860 0.05062303688384458 0.1618377370013189 0
+861 0.04726836110905735 0.168491067349144 0
+862 0.04386708196327156 0.1631784940207584 0
+863 0.1824116366012077 0.008263697410211704 0
+864 0.1762550990085746 0.01670453821934139 0
+865 0.1738434624070589 0.008440840809129683 0
+866 0.2556907732045073 0.1699513217749882 0
+867 0.2616121536189917 0.1726269466072411 0
+868 0.2551796320511361 0.1748686510439104 0
+869 0.08243817633555242 0.1830106609899857 0
+870 0.07616076025410573 0.182113416744502 0
+871 0.08092421359074138 0.1764187075335936 0
+872 0.2761004738917011 0.06252736060423947 0
+873 0.2789415268163494 0.06685784513496548 0
+874 0.2711778084217987 0.06947370763423261 0
+875 0.09741928001884081 0.2960518149182106 0
+876 0.09356540141503533 0.2921979363144143 0
+877 0.2713560181442588 0.05924369597166952 0
+878 0.2791197365388095 0.05662783347240239 0
+879 0.1532591500811518 0.2787904699525399 0
+880 0.1473569275077969 0.2789888134062618 0
+881 0.1538491648038342 0.2723946291384011 0
+882 0.2514157331481965 0.1669978935493962 0
+883 0.2578482547160522 0.1647561891127269 0
+884 0.1660323256086106 0.1645752514020377 0
+885 0.1672143044532821 0.1728814180160232 0
+886 0.1600150295607667 0.1713737428544934 0
+887 0.154072820636127 0.1701917640097926 0
+888 0.1552547994807985 0.1784979306237781 0
+889 0.2367171196926274 0.1863894141598229 0
+890 0.2332568214745443 0.1907402804166256 0
+891 0.2318134131147108 0.1855518382621448 0
+892 0.06150283901066644 0.1620608971133157 0
+893 0.06187469981599328 0.1550081925307624 0
+894 0.06572784233874679 0.1587758046331436 0
+895 0.2542668179982179 0.1449614214449068 0
+896 0.2523090911763561 0.1520222140844144 0
+897 0.2483082248787206 0.1460672761191787 0
+898 0.06173465414900117 0.1213666301471505 0
+899 0.06444338191673571 0.1249044130699982 0
+900 0.06080878143202809 0.1270319773947136 0
+901 0.2050585906219335 0.09751564734448737 0
+902 0.206584520166957 0.09096093998324195 0
+903 0.2116951380536126 0.09389877035393245 0
+904 0.06784646135577364 0.09708049418968644 0
+905 0.06730466943890984 0.101653528960477 0
+906 0.06268777949861358 0.09751454969241588 0
+907 0.1343021507744222 0.2921979363144357 0
+908 0.1304482721706035 0.2960518149182254 0
+909 0.03763083249278625 0.1637248141577344 0
+910 0.04098550826757348 0.1570714838099093 0
+911 0.2029340087390252 0.03017417130368841 0
+912 0.2023657771499279 0.02192373084083578 0
+913 0.2100964935839573 0.02381856792440015 0
+914 0.07171788728485637 0.1543270370546064 0
+915 0.07134602647952953 0.1613797416371597 0
+916 0.2259182423957947 0.2945117050039339 0
+917 0.2176961095774836 0.2945117050039183 0
+918 0.2186143519734659 0.2890234100078523 0
+919 0.1229482721706254 0.2960518149182254 0
+920 0.1176837760947254 0.2974624323903126 0
+921 0.04717918141424804 0.2809750175979018 0
+922 0.04327700147843302 0.2770728376620864 0
+923 0.1958201048000192 0.00826959363284783 0
+924 0.190731741401516 0.01653329104305953 0
+925 0.1899116366012265 0.008263697410211704 0
+926 0.04566876821708538 0.1074959798439274 0
+927 0.04984944985152195 0.1049228482429106 0
+928 0.05130369704619918 0.1099440246183181 0
+929 0.1374102463424369 0.1434252942776113 0
+930 0.1280353058453068 0.1434780127668333 0
+931 0.1353040242242705 0.1382788780180165 0
+932 0.2010746231601554 0.04278188460749783 0
+933 0.2039290289915305 0.0405885823663055 0
+934 0.2060165199236071 0.04384169489888963 0
+935 0.0708463144230573 0.1888296197366702 0
+936 0.06933235167824627 0.182237666280278 0
+937 0.05518466613906227 0.1115515746517379 0
+938 0.06001678106138425 0.1086706427358937 0
+939 0.05971706851981076 0.1128513243703303 0
+940 0.2559541690656268 0.1794085575581505 0
+941 0.2500327886511423 0.1767329327258975 0
+942 0.1355293776102382 0.06453061348625594 0
+943 0.1415513096393557 0.06813618318990691 0
+944 0.1344478626102833 0.07073778625979758 0
+945 0.02761354329272771 0.05064881642001109 0
+946 0.03400387693288719 0.04788669023291647 0
+947 0.03320742929530596 0.05381596973027315 0
+948 0.0348285743232141 0.2594780616075057 0
+949 0.03115224335961744 0.2532569382525605 0
+950 0.03915531622793689 0.2522708700519259 0
+951 0.1772997798411253 0.1445344913185074 0
+952 0.1738930354774708 0.1517896412751316 0
+953 0.1696732596215257 0.1454813094854465 0
+954 0.140502460218039 0.2250098635372823 0
+955 0.1356400192178312 0.2221979686559714 0
+956 0.1413627041438501 0.2189458695825897 0
+957 0.007494689920255778 0.1148470179992397 0
+958 0.01717468679523108 0.1151529115042065 0
+959 0.0096799968749753 0.1203058935046678 0
+960 0.03767966121301286 0.110805176316248 0
+961 0.03332321804572853 0.113531089123598 0
+962 0.03164180203266971 0.1086040091537067 0
+963 0.02122800793227694 0.1313519442679476 0
+964 0.02782451924811124 0.1331372794715744 0
+965 0.02159651131579057 0.1367853352032841 0
+966 0.1519912782439488 0.005860412773260212 0
+967 0.1452242458338717 0.0120788074768552 0
+968 0.1432329675895418 0.006218394703594985 0
+969 0.2078299445175573 0.2815889947177678 0
+970 0.2026945344408602 0.2856941225282693 0
+971 0.2001322598032628 0.2782597072382005 0
+972 0.2050937213049177 0.2399469295693631 0
+973 0.2100793373222198 0.2427242456345469 0
+974 0.2045036562372631 0.2466097204477291 0
+975 0.1466376686103039 0.06803830404624341 0
+976 0.145556153610349 0.07424547681978505 0
+977 0.1030723131983693 0.2304201673501307 0
+978 0.1059865112654244 0.2346494736200344 0
+979 0.0998060909735078 0.2345159296845802 0
+980 0.2429885662290561 0.193423320113268 0
+981 0.2413136531205192 0.1889218102663653 0
+982 0.2461416912971144 0.1907672740653296 0
+983 0.2747479100011436 0.2201150299124053 0
+984 0.2715838775892347 0.2219688280719784 0
+985 0.2720440383961026 0.2162977061695374 0
+986 0.0342053815245601 0.1176921542685692 0
+987 0.02816752234421695 0.1154909871060279 0
+988 0.2861085775076274 0.2185320826159493 0
+989 0.2807952199731864 0.2201524481268369 0
+990 0.2805214283424525 0.2128235424990767 0
+991 0.1006245365235281 0.2241948393386014 0
+992 0.094070869282325 0.2259449298366287 0
+993 0.09780351289940047 0.2198531457605536 0
+994 0.195005857827262 0.2752186632831476 0
+995 0.2001412679039591 0.2711135354726461 0
+996 0.06892838818396574 0.2830397772220971 0
+997 0.06797136116846093 0.2877072958375424 0
+998 0.06319652786586571 0.2844814197121535 0
+999 0.2150045882447116 0.2390665946802514 0
+1000 0.2144145231770571 0.2457293855586173 0
+1001 0.1896568243346248 0.2698433124868447 0
+1002 0.1896478162339285 0.276989484252399 0
+1003 0.2769269813063867 0.2543779259790502 0
+1004 0.2787131511228575 0.2632417533941784 0
+1005 0.2190143941338771 0.1884639388221517 0
+1006 0.2138631902908387 0.190739741722314 0
+1007 0.2144268756699684 0.1861636629285447 0
+1008 0.06394932010531706 0.04760247687666387 0
+1009 0.0583610201060521 0.04459592666185126 0
+1010 0.06549164700148738 0.04037218219464087 0
+1011 0.1792623173320053 0.08281965404766158 0
+1012 0.1878685484424086 0.08195886243616489 0
+1013 0.1816862350956416 0.08817332492469074 0
+1014 0.2779502467213423 0.1964285705753674 0
+1015 0.27212275445117 0.189637035617623 0
+1016 0.278920943661648 0.1903736180878383 0
+1017 0.1635333578148432 0.2929057556956292 0
+1018 0.1710333578148617 0.2854057556956107 0
+1019 0.172499999999674 0.2924999999999814 0
+1020 0.09282967518846222 0.1484576229003569 0
+1021 0.09438645424077519 0.1404582853751433 0
+1022 0.09785434835298765 0.1473570734402944 0
+1023 0.04922586651429997 0.1003783494330726 0
+1024 0.05486079534341377 0.1028263942074633 0
+1025 0.1733889404081229 0.08212970889891708 0
+1026 0.1795712537548899 0.07591524641039124 0
+1027 0.07274117932709112 0.09453717499791425 0
+1028 0.06812428938679486 0.09039819572985315 0
+1029 0.01717999687495344 0.127805893504646 0
+1030 0.02340800480727411 0.1241578377729362 0
+1031 0.02059695812569941 0.2580477029090997 0
+1032 0.01898852430345866 0.2515222023577597 0
+1033 0.02521706763265391 0.2539386292568003 0
+1034 0.2562662314935491 0.008491893232698212 0
+1035 0.251796583700249 0.01558155771659907 0
+1036 0.2505303522065798 0.007089664483900859 0
+1037 0.2180402878352734 0.03025778363160299 0
+1038 0.2174720562461761 0.02200734316875036 0
+1039 0.1672765822468842 0.180605268404635 0
+1040 0.1692350741212234 0.1875681644776934 0
+1041 0.1631555002797774 0.1866428055415373 0
+1042 0.1311277162343819 0.2233828751762101 0
+1043 0.131987960160193 0.2173188812215175 0
+1044 0.05806093674828865 0.08352368019650627 0
+1045 0.06285981945844456 0.085662528742664 0
+1046 0.05843068870532148 0.09080266637546761 0
+1047 0.08089168065478972 0.2104386052656107 0
+1048 0.07382589843916992 0.2155533906213291 0
+1049 0.07452693143265665 0.2078527417831594 0
+1050 0.0077544785251337 0.0943738517769178 0
+1051 0.0077544785251337 0.101873851776896 0
+1052 0.1068049568154448 0.2243283832740556 0
+1053 0.06822214089950096 0.2065853276626146 0
+1054 0.07528792311512075 0.2014705423068962 0
+1055 0.2398702447606857 0.1837333681118845 0
+1056 0.2632915399779581 0.006638853941418778 0
+1057 0.2645577714716272 0.01513074717411699 0
+1058 0.2925000000000212 0.03749999999992885 0
+1059 0.2829861374651553 0.03751595903793847 0
+1060 0.2904861374651341 0.03001595903795456 0
+1061 0.03794652455597496 0.2785011346487303 0
+1062 0.0403577642423652 0.2705812442384306 0
+1063 0.1424478078245774 0.1467912852471923 0
+1064 0.1875770163778175 0.06125183712783851 0
+1065 0.1843408982515092 0.05657199822071797 0
+1066 0.1877936462964068 0.05348750790247819 0
+1067 0.2315076687717473 0.06213444848482309 0
+1068 0.2252389923694528 0.05953787770086664 0
+1069 0.1510960887976343 0.03675655286920901 0
+1070 0.1442175994857806 0.0393065231942752 0
+1071 0.1444973668247305 0.03304448291816919 0
+1072 0.08345082939357983 0.1611812539942046 0
+1073 0.08159769513528481 0.1536563207670578 0
+1074 0.08771245310322552 0.15790660070264 0
+1075 0.1606789603663335 0.1912262192325939 0
+1076 0.1587204684919943 0.1842633231595354 0
+1077 0.28298613746515 0.02251595903797044 0
+1078 0.2925000000000159 0.02249999999996083 0
+1079 0.09107844407280259 0.1528690392205006 0
+1080 0.08761054996059012 0.1459702511553495 0
+1081 0.2482217993080288 0.1879596890609795 0
+1082 0.2498967124165656 0.1924611989078823 0
+1083 0.1971778897426011 0.1405040222762249 0
+1084 0.2007925705214544 0.1454044034541331 0
+1085 0.1935817462610626 0.1451216975020588 0
+1086 0.1401856071671508 0.2848902634246361 0
+1087 0.1408834563923859 0.2926923271102003 0
+1088 0.2143073625355019 0.2847164205698697 0
+1089 0.1881277581084355 0.2006173324398245 0
+1090 0.1946334368025384 0.1992251681912937 0
+1091 0.1904145913353929 0.2047564726367515 0
+1092 0.1421862393619601 0.2732299265345285 0
+1093 0.1415962246392778 0.2796257673486673 0
+1094 0.1465598624781923 0.1535723371278514 0
+1095 0.149925853447734 0.1586098986099634 0
+1096 0.01468420739826893 0.2628156380049864 0
+1097 0.02091275072746418 0.265232064904027 0
+1098 0.245185156367988 0.2945117050039582 0
+1099 0.2393016993819221 0.29608817255207 0
+1100 0.2285368309639695 0.1448582744851916 0
+1101 0.2327334106227295 0.1428084418292545 0
+1102 0.2342492879658647 0.1474018446496535 0
+1103 0.1291519960019017 0.2306059100541224 0
+1104 0.1254999369442635 0.2257268226196685 0
+1105 0.02954380953737669 0.2467314377012205 0
+1106 0.2856911845691662 0.2329304941217802 0
+1107 0.2796438745971234 0.2328930759073486 0
+1108 0.2803350591663185 0.2258235700292778 0
+1109 0.2366574070315789 0.1377276169534222 0
+1110 0.2309449500296836 0.1351840467889604 0
+1111 0.1070349839243768 0.0201310598796624 0
+1112 0.110168292730258 0.01434048209770129 0
+1113 0.1147629896701854 0.02079190491063324 0
+1114 0.2000034994306102 0.2089682880825743 0
+1115 0.2078080632199313 0.2105207123422833 0
+1116 0.2010704644796801 0.2139532006746558 0
+1117 0.285291610904357 0.2041841650168859 0
+1118 0.2814673172293409 0.2079715134791784 0
+1119 0.2809241422568043 0.2009525015078753 0
+1120 0.16090905150361 0.2790038985379688 0
+1121 0.1544168142075727 0.2855980828058295 0
+1122 0.2787786522472009 0.2405561065629366 0
+1123 0.2734225268443532 0.2334491824704342 0
+1124 0.2614093912728267 0.1934274421404659 0
+1125 0.2588664332412193 0.196571319714187 0
+1126 0.25814493079753 0.1916997862190211 0
+1127 0.2502153468080511 0.07571016916035009 0
+1128 0.2429750942658603 0.07913079183473165 0
+1129 0.2442185158289821 0.07044745222864998 0
+1130 0.05218126544561897 0.04520374663129485 0
+1131 0.05372359234178928 0.03797345194927185 0
+1132 0.124871902867971 0.02864422238559565 0
+1133 0.1328321933144528 0.02978639068024813 0
+1134 0.1296585870663951 0.03445228494858291 0
+1135 0.06495921903792076 0.1146047291384606 0
+1136 0.06012710411559878 0.1174856610543048 0
+1137 0.04840269798813369 0.2382728867596725 0
+1138 0.04865734988131254 0.2331378250967269 0
+1139 0.05374725292965732 0.2348916180273646 0
+1140 0.007494689920255778 0.1073470179992588 0
+1141 0.17233464418402 0.2684443878955046 0
+1142 0.1657745415316149 0.2737240350359234 0
+1143 0.1663114900295943 0.2669166385442604 0
+1144 0.1216844048007643 0.2193798189060385 0
+1145 0.1197086845682842 0.2266028537839508 0
+1146 0.1245054107477181 0.2501714587912357 0
+1147 0.1285486642218075 0.2432925667485279 0
+1148 0.1299397978157019 0.2487512390747454 0
+1149 0.1946911611505527 0.07172999916582348 0
+1150 0.1901218528053532 0.07665948817908066 0
+1151 0.1900139390239717 0.07167570254587854 0
+1152 0.2239777297533493 0.1465784595560589 0
+1153 0.2254936070964846 0.1511718623764579 0
+1154 0.2185784156563926 0.05155487228587825 0
+1155 0.2203551571296156 0.05584430564738451 0
+1156 0.2114243501708583 0.1527831145656491 0
+1157 0.2153696463524466 0.1511489193796648 0
+1158 0.02547282673080672 0.2672874104949313 0
+1159 0.01956007600337624 0.272055345590818 0
+1160 0.2138558890852236 0.2531313198502509 0
+1161 0.2187811400077155 0.2494736688959554 0
+1162 0.2097678254640184 0.03685870052247504 0
+1163 0.2048259287005668 0.03579889023108324 0
+1164 0.1937811375897363 0.1358566943852594 0
+1165 0.2009919618501282 0.1361394003373337 0
+1166 0.1663434624070407 0.008440840809129683 0
+1167 0.1608347406513523 0.01430125358238989 0
+1168 0.1594912782439671 0.005860412773260212 0
+1169 0.07716625437535662 0.1504104404953491 0
+1170 0.08142787808500232 0.1471357872037844 0
+1171 0.2425674490695578 0.1345548526963996 0
+1172 0.2443559096626036 0.1421792477366938 0
+1173 0.1229709037960476 0.0194898276229665 0
+1174 0.1271811168277656 0.01371905826793105 0
+1175 0.1322557221477467 0.01820755876222542 0
+1176 0.1330224040470333 0.03948659282637484 0
+1177 0.09108543223939193 0.2560402340762928 0
+1178 0.09691310236890993 0.258463181535415 0
+1179 0.09130313270072551 0.2609149408659932 0
+1180 0.1834054923498682 0.2003804914140857 0
+1181 0.1876243378170137 0.1948491869686279 0
+1182 0.1894751368601391 0.1721835025053846 0
+1183 0.1862526833834678 0.1676490781588324 0
+1184 0.191614379938078 0.1658230937847076 0
+1185 0.2668906701103066 0.186068995887697 0
+1186 0.260894450647379 0.1830500922607317 0
+1187 0.2670972319285482 0.1805631795031286 0
+1188 0.1793996129313394 0.05861874561588003 0
+1189 0.178540304224353 0.06441196382522507 0
+1190 0.1738156488227724 0.05869438199502681 0
+1191 0.2184764669751462 0.1463482082436861 0
+1192 0.221519690842631 0.1400346203524198 0
+1193 0.03986938962535427 0.0742337838199382 0
+1194 0.04129842984093704 0.06822932509016166 0
+1195 0.04528113995874369 0.07028616545966564 0
+1196 0.02050304862297634 0.05105579308518347 0
+1197 0.02013408814736515 0.05961101301354897 0
+1198 0.01382004111519501 0.05408871018136467 0
+1199 0.015912222620692 0.1421040542675538 0
+1200 0.0225087339365263 0.1438893894711806 0
+1201 0.07971141598522591 0.1386355499979578 0
+1202 0.08589408786081372 0.1374700139495229 0
+1203 0.08317910920066193 0.1427243708836408 0
+1204 0.1425743796804396 0.08168873624979256 0
+1205 0.1476607386513879 0.08159085710612907 0
+1206 0.1388173220792034 0.03009932369604007 0
+1207 0.145695811391057 0.02754935337097388 0
+1208 0.08983042810800429 0.2519870926717626 0
+1209 0.09544039777618869 0.2495353333411843 0
+1210 0.08840213112135742 0.2466566157493013 0
+1211 0.2564514834830438 0.07367700980297476 0
+1212 0.2552080619199221 0.08236034940905644 0
+1213 0.2064550523027969 0.1667271682457581 0
+1214 0.2007827420304159 0.1655471923856441 0
+1215 0.2041032128782808 0.1628710543224138 0
+1216 0.08410950656091462 0.166065103591994 0
+1217 0.07799474859297392 0.1618148236564119 0
+1218 0.2628756027920797 0.291781183114117 0
+1219 0.2703756027920989 0.291781183114117 0
+1220 0.1547609984673058 0.07968834822241158 0
+1221 0.2848742179658916 0.1885825765226377 0
+1222 0.2790467256957193 0.1817910415648932 0
+1223 0.04702171346239557 0.2263190319465966 0
+1224 0.04744690074600535 0.2201016156061457 0
+1225 0.05442709210644595 0.2235391400239681 0
+1226 0.1982648812138803 0.256290839857279 0
+1227 0.1991393638327246 0.2637323894002572 0
+1228 0.194140383309114 0.260630941974615 0
+1229 0.1487910193750154 0.1450072114094536 0
+1230 0.02098234512241379 0.2257675097688077 0
+1231 0.02818875846389738 0.2286631142433654 0
+1232 0.02193041509546207 0.2315117212975957 0
+1233 0.2439389423580207 0.2281454371712008 0
+1234 0.2454446487986939 0.2329314126027783 0
+1235 0.2420705198885025 0.2312222941436619 0
+1236 0.06382115610435293 0.03197405733618797 0
+1237 0.06940945610361789 0.03498060755100059 0
+1238 0.02931365224634445 0.1435554332042278 0
+1239 0.0236293635512459 0.1488741522684974 0
+1240 0.1950930853599274 0.2078825424015837 0
+1241 0.2018306841001786 0.2044500540692112 0
+1242 0.2861052103366679 0.1583979135750084 0
+1243 0.2798345273172286 0.1646074304626781 0
+1244 0.2796970392204807 0.1561392608572016 0
+1245 0.1588421998288771 0.05149288925530346 0
+1246 0.1518541671135243 0.04859835133029662 0
+1247 0.1578043541740372 0.04591313107032186 0
+1248 0.1399548631864313 0.2686710318924246 0
+1249 0.1457155660549504 0.2680340779500192 0
+1250 0.2666414756136901 0.1969954818703919 0
+1251 0.2659199731700008 0.1921239483752261 0
+1252 0.01486200087700613 0.234308058411442 0
+1253 0.02206841421848971 0.2372036628859998 0
+1254 0.2310201987641073 0.06971128290979726 0
+1255 0.2318151626867923 0.07419043458962263 0
+1256 0.2258570981641082 0.07003364259638833 0
+1257 0.1558680623723628 0.1574279197653103 0
+1258 0.1528908417914664 0.164249555085161 0
+1259 0.2374657332944313 0.06629124047805737 0
+1260 0.1894618892845996 0.2637570117394127 0
+1261 0.1847844495058462 0.07047075950260701 0
+1262 0.1893537578510456 0.06554127048934982 0
+1263 0.1966338680103246 0.1660242982967798 0
+1264 0.1934114145336532 0.1614898739502276 0
+1265 0.224398981016639 0.1324726176448836 0
+1266 0.2188977182384358 0.1322423663325108 0
+1267 0.2318016993819028 0.29608817255207 0
+1268 0.2798912381094518 0.1229396378343494 0
+1269 0.2732014308402718 0.1189122369540445 0
+1270 0.2783101927308637 0.1159725991193961 0
+1271 0.1271832030410459 0.1297331665480583 0
+1272 0.1194707858910713 0.1274819851918859 0
+1273 0.1265710457069962 0.1255794763081652 0
+1274 0.2159731084605404 0.09947498264396082 0
+1275 0.2174990380055639 0.09292027528271539 0
+1276 0.2049111059675202 0.2233848185978286 0
+1277 0.2060088356888277 0.2289034785774563 0
+1278 0.02637273112367941 0.2409102272388069 0
+1279 0.03230790685064294 0.240228536234567 0
+1280 0.0686197504250938 0.2945744691637994 0
+1281 0.07435161074319382 0.2931328266737431 0
+1282 0.2610302187237135 0.02299956153287471 0
+1283 0.2680555272081224 0.02114652224159528 0
+1284 0.09081842956925078 0.2822839634740165 0
+1285 0.08940781209713627 0.2770194673980692 0
+1286 0.03180099651191465 0.1255990415040518 0
+1287 0.02825285084382307 0.1236779703936184 0
+1288 0.0325978314911401 0.1215731233614324 0
+1289 0.123378185273599 0.1117276291487183 0
+1290 0.1252806941573449 0.104627369332751 0
+1291 0.04831316175041075 0.2128800531946447 0
+1292 0.04874356997221478 0.2053963440557685 0
+1293 0.05528268761185978 0.209838014544641 0
+1294 0.2796740532702238 0.1084059084264633 0
+1295 0.2735183359302136 0.1053527063843365 0
+1296 0.2815720037387537 0.1018134165717086 0
+1297 0.2091667162785592 0.2640174022213478 0
+1298 0.2107431838266864 0.2581339452352551 0
+1299 0.2469732695326803 0.2421349469434531 0
+1300 0.2479521591537272 0.2360144872997977 0
+1301 0.2513492023572317 0.2421411646680115 0
+1302 0.2863638605394038 0.1124333093067682 0
+1303 0.2107942172282048 0.2079304158596404 0
+1304 0.212422996805158 0.2039670381104521 0
+1305 0.2164761158625013 0.2063616542198907 0
+1306 0.0522922963946252 0.08423335001726656 0
+1307 0.05672142714774827 0.07909321238446296 0
+1308 0.1557576067788645 0.04097184575014134 0
+1309 0.2762776774431522 0.02165481297940086 0
+1310 0.2727501246952385 0.02952362733815859 0
+1311 0.2022641309972948 0.007784063730773757 0
+1312 0.2030842357975844 0.01605365736362159 0
+1313 0.08987483571406786 0.2662454177884732 0
+1314 0.09079508557624943 0.2873947688577744 0
+1315 0.08448271231521257 0.2852828597029623 0
+1316 0.2847037899915114 0.2619651368570293 0
+1317 0.2803141840858746 0.2701737063844534 0
+1318 0.1282329675895829 0.006218394703594985 0
+1319 0.1189481492378838 0.007500663564336063 0
+1320 0.240041525330234 0.2346815949610618 0
+1321 0.2385358188895607 0.2298956195294843 0
+1322 0.1340306378807793 0.02429126113305281 0
+1323 0.0379606852822544 0.05718984093444099 0
+1324 0.04315397155489594 0.0576677751365338 0
+1325 0.04151689390168491 0.06380377252779627 0
+1326 0.1416023349268936 0.05523376829280777 0
+1327 0.1467319289914203 0.05135831784226425 0
+1328 0.1477624187038374 0.05805355996582175 0
+1329 0.07154807023457388 0.147806503491333 0
+1330 0.01930431690522346 0.2437065643526533 0
+1331 0.1669322056580358 0.280531647889213 0
+1332 0.02274070620954796 0.08239501739113894 0
+1333 0.01666697744967262 0.08129928531944383 0
+1334 0.02107372875983162 0.07609573207152184 0
+1335 0.2671233067972847 0.1755024711822732 0
+1336 0.2731195262602122 0.1785213748092385 0
+1337 0.06775453742976204 0.08311920955089182 0
+1338 0.1700905221393807 0.1932607795489885 0
+1339 0.1742116041064876 0.1872232424120862 0
+1340 0.03237354382337264 0.04147040793420939 0
+1341 0.03796742982595089 0.04463756124447144 0
+1342 0.1456940833365805 0.04577855965728265 0
+1343 0.2308841073230747 0.1812294348163155 0
+1344 0.2274238091049915 0.1855803010731181 0
+1345 0.1198375949901664 0.02528040540492761 0
+1346 0.1595847946432508 0.1522623613660917 0
+1347 0.1625497829869832 0.1579020178412893 0
+1348 0.06061497538614182 0.07163778072978673 0
+1349 0.05724555908643115 0.07490870433164916 0
+1350 0.05537046697116124 0.06816294249773322 0
+1351 0.2238833279089623 0.0909515556639872 0
+1352 0.230429296921983 0.08824012651993433 0
+1353 0.05243572711298586 0.1574092243419339 0
+1354 0.05583700625877165 0.1627217976703195 0
+1355 0.04167715852087195 0.2297003006789046 0
+1356 0.1895703877696604 0.04919807454094134 0
+1357 0.1301062732920557 0.1330811270857881 0
+1358 0.1019230561741374 0.09925421832613426 0
+1359 0.1050681004796695 0.1038084972714743 0
+1360 0.09929675955499662 0.1049820392278278 0
+1361 0.1916171351648476 0.04425678922074634 0
+1362 0.08894514147443397 0.2010067245100023 0
+1363 0.085579150504888 0.1959691630278791 0
+1364 0.209089342497448 0.2014366982445348 0
+1365 0.2147712411317445 0.1998679366047851 0
+1366 0.2778756162662243 0.2842811966392346 0
+1367 0.2775000134740438 0.2925000135251175 0
+1368 0.2333498182008341 0.1715670870744404 0
+1369 0.2365741247427002 0.1761967618042408 0
+1370 0.2320494047909278 0.1765712972755418 0
+1371 0.06158712252535034 0.2076609162723213 0
+1372 0.0611567143035463 0.2151446254111974 0
+1373 0.01427061262523378 0.1699555323599382 0
+1374 0.02038356991819344 0.1643099379123464 0
+1375 0.02078456348359251 0.1726699398785498 0
+1376 0.06234811420781444 0.2012787167960581 0
+1377 0.1868839860278479 0.09337107585691018 0
+1378 0.06351874941710753 0.1827071298153093 0
+1379 0.06883319524815594 0.1759909268231412 0
+1380 0.007094500795403104 0.0527667451264348 0
+1381 0.006725540319791908 0.0613219650548003 0
+1382 0.1789110725819637 0.06978081435386252 0
+1383 0.1959217509526523 0.02240926074290985 0
+1384 0.03370496348251825 0.1684280848997707 0
+1385 0.0347931375468324 0.1760443115109744 0
+1386 0.02798569484086632 0.1746405720421616 0
+1387 0.04090778310636037 0.2156599451172732 0
+1388 0.208089247488784 0.1706724644273492 0
+1389 0.1114481492379029 0.007500663564336063 0
+1390 0.1037201434920944 0.006839818533365223 0
+1391 0.2128280255443048 0.1342367013570483 0
+1392 0.2157073157183128 0.1266746986495121 0
+1393 0.04202938892188779 0.2019072382338949 0
+1394 0.04899891478333682 0.1988651995838912 0
+1395 0.1246685368232748 0.1184792164922404 0
+1396 0.09775628816127754 0.1099005684404203 0
+1397 0.0946112438557454 0.1053462894950803 0
+1398 0.1366490723072034 0.2477460503835716 0
+1399 0.132605818833114 0.2546249424262794 0
+1400 0.2129116074417283 0.1446050801760257 0
+1401 0.2598977619341616 0.06608502632888749 0
+1402 0.2648904770460326 0.07273520657759386 0
+1403 0.08846421824197542 0.2715099138643825 0
+1404 0.2196053575020345 0.08537534337395883 0
+1405 0.1733271084733967 0.06985645073300931 0
+1406 0.06794839172864617 0.2198025988582887 0
+1407 0.07431314095077923 0.22238846234074 0
+1408 0.2403023886731937 0.1748340023474541 0
+1409 0.2390019752632874 0.1798382125485555 0
+1410 0.2004063497027588 0.1919381198608328 0
+1411 0.1974257253472491 0.195660116741614 0
+1412 0.1953272279310907 0.1913640311135854 0
+1413 0.2159818448724289 0.04528619588357648 0
+1414 0.2676344479506558 0.170585141913351 0
+1415 0.08722968416099711 0.2951968325433602 0
+1416 0.1385442457143312 0.2634065358165022 0
+1417 0.0361051435682955 0.06775139088806884 0
+1418 0.2160906590507452 0.2320548340601962 0
+1419 0.2204258449055825 0.2350599739842666 0
+1420 0.01468420739826897 0.2478156380049526 0
+1421 0.05176443669210412 0.05805396403688167 0
+1422 0.04820822807267361 0.05144003244352639 0
+1423 0.2931911845691807 0.2254304941217609 0
+1424 0.2929173929384468 0.2181015884940007 0
+1425 0.20419653424449 0.2186316946991783 0
+1426 0.2095895999920315 0.2202587488330152 0
+1427 0.255907891017581 0.2456366038921191 0
+1428 0.2602148804555356 0.2499435933300711 0
+1429 0.2653433932489339 0.2017469996687912 0
+1430 0.2698539751461079 0.2004435059035515 0
+1431 0.04614707519995735 0.1737565786585318 0
+1432 0.05290303012053037 0.1724158216390924 0
+1433 0.2931213492167079 0.1659330415900702 0
+1434 0.29298386111996 0.1574648719845937 0
+1435 0.2276598007812086 0.1765997600865152 0
+1436 0.1874984248631291 0.2836824175243324 0
+1437 0.1821493913704919 0.2783070667280295 0
+1438 0.2840513785142328 0.2475165919333027 0
+1439 0.2778300307614626 0.2480726984963882 0
+1440 0.2154437170513048 0.03652646003390976 0
+1441 0.2253853073055694 0.2324567445607825 0
+1442 0.2242992364995359 0.2394685051808377 0
+1443 0.2559204494777975 0.1563595601486387 0
+1444 0.2499618563583001 0.1574654148229106 0
+1445 0.06678500725106942 0.07275787955989564 0
+1446 0.06490991513579952 0.0660121177259797 0
+1447 0.2563323546283087 0.1891047612744161 0
+1448 0.2513920730465565 0.1854632265718349 0
+1449 0.2557476072473852 0.1849143739427188 0
+1450 0.2929173929384468 0.2106015884939814 0
+1451 0.2923742179659102 0.2035825765226782 0
+1452 0.2117450878979045 0.2772820052798009 0
+1453 0.2101686203497938 0.2713985482937367 0
+1454 0.05147691873276769 0.07561837415240945 0
+1455 0.2132616793164385 0.1060209516570304 0
+1456 0.1365323178608026 0.07687225024130526 0
+1457 0.1305103858316851 0.0732666805376543 0
+1458 0.007499999999978135 0.1274999999996791 0
+1459 0.07352656956091819 0.1073166081220483 0
+1460 0.07863111636794916 0.1036813834076523 0
+1461 0.07969433463279746 0.1097785180719531 0
+1462 0.2077745102109141 0.175137966405619 0
+1463 0.2028198441770623 0.1738688082872581 0
+1464 0.08798913180315257 0.1312717190367396 0
+1465 0.08343816242777924 0.1298833315890954 0
+1466 0.0890008995855541 0.1277738575619951 0
+1467 0.2101961095774642 0.2945117050039183 0
+1468 0.233931048831758 0.2409869824863812 0
+1469 0.2328827616154075 0.2351100980521189 0
+1470 0.2375551115476427 0.2392318047811465 0
+1471 0.02079733584229657 0.216469123472671 0
+1472 0.01453899247386126 0.2193177305269013 0
+1473 0.2498205816232454 0.2329376303273367 0
+1474 0.1132809871974799 0.1403242354487073 0
+1475 0.1141939037529537 0.1330118374960508 0
+1476 0.1191700266696472 0.1389480733844355 0
+1477 0.1815235347336948 0.1392237379264864 0
+1478 0.1857433105896398 0.1455320697161716 0
+1479 0.2410898125465845 0.2405584793953241 0
+1480 0.1447444226509058 0.215422562343221 0
+1481 0.1478704924157465 0.2107440683186944 0
+1482 0.2716542550393549 0.2474174406086841 0
+1483 0.1483834563923668 0.2926923271102003 0
+1484 0.2725373754007501 0.2775063445749183 0
+1485 0.266444216146319 0.2761024416940042 0
+1486 0.279661786082695 0.2782251749859188 0
+1487 0.2856524249513488 0.2769485584487696 0
+1488 0.2575092652834478 0.02873094773817142 0
+1489 0.2601058360673982 0.03499962414045987 0
+1490 0.2046229726448893 0.2008850026195316 0
+1491 0.2069712169714758 0.1967859011138645 0
+1492 0.1924378666571821 0.1225611052394282 0
+1493 0.1905353577734376 0.1296613650553929 0
+1494 0.1230060134761307 0.1349836359695088 0
+1495 0.1220930969206569 0.1422960339221653 0
+1496 0.1678204211183185 0.06775808967061563 0
+1497 0.1681911894759292 0.07312694019925306 0
+1498 0.1119861612782401 0.1039528983173646 0
+1499 0.1134601039975063 0.0970560350619494 0
+1500 0.1177518681769362 0.1029282570095332 0
+1501 0.2349840133868369 0.1676217908928336 0
+1502 0.08206389019316809 0.02107365154577133 0
+1503 0.0831257918342227 0.01528241019946492 0
+1504 0.0889380983587284 0.0207912413462627 0
+1505 0.1073387782728454 0.141506214293369 0
+1506 0.02332267630766799 0.1159708544853457 0
+1507 0.02113736935294847 0.1105119789799175 0
+1508 0.1711809411720923 0.02091535727125645 0
+1509 0.1797491153662411 0.02073821387233847 0
+1510 0.09145682501858859 0.1353605399224226 0
+1511 0.2923742179659102 0.1960825765226562 0
+1512 0.2924999999999814 0.1874999999997111 0
+1513 0.1527782595673546 0.1830813443148347 0
+1514 0.1607819932370827 0.0781288389527805 0
+1515 0.1662886805921609 0.08022720001517417 0
+1516 0.08535574973625112 0.1222943728659834 0
+1517 0.08990671911162446 0.1236827603136277 0
+1518 0.256886780638628 0.2395161442484637 0
+1519 0.2924999999999855 0.2399999999998511 0
+1520 0.2931911845691807 0.2329304941217802 0
+1521 0.006934809529917358 0.1632977651966952 0
+1522 0.007335803095316425 0.1716577671628985 0
+1523 0.02187273754790666 0.1802861664897534 0
+1524 0.06629459456081299 0.2319038781473668 0
+1525 0.07162507148328151 0.2333321751340179 0
+1526 0.2159558050745364 0.01442809319958889 0
+1527 0.2238995993258525 0.02086730890679174 0
+1528 0.210486787052468 0.2305366637439232 0
+1529 0.2061914510262341 0.234428269589714 0
+1530 0.1949984248631477 0.2911824175243509 0
+1531 0.2026961095774422 0.2945117050039183 0
+1532 0.2601834766190981 0.2377922289728666 0
+1533 0.2556247879587488 0.2342967897487589 0
+1534 0.02749465350412871 0.1526686964316296 0
+1535 0.02068973519431055 0.1530026526985824 0
+1536 0.1246997577344885 0.08324801677003903 0
+1537 0.1196654498566898 0.08661183375068518 0
+1538 0.220178299001586 0.06186091886308086 0
+1539 0.2184015575283345 0.0661503522246156 0
+1540 0.1574665440496846 0.2618103025783507 0
+1541 0.1527880500251893 0.2586842328135487 0
+1542 0.07541329416006182 0.08252785442488061 0
+1543 0.07014882423171151 0.07779218743769145 0
+1544 0.05786605094340711 0.2830531227255081 0
+1545 0.05291768464968434 0.01426192919436578 0
+1546 0.05715362728693782 0.02019443165306021 0
+1547 0.04945363571246968 0.02008237266233521 0
+1548 0.006725540319791908 0.06882196505477844 0
+1549 0.01422554031977005 0.06882196505477844 0
+1550 0.007499999999978142 0.07499999999982671 0
+1551 0.007499999999978135 0.1424999999996381 0
+1552 0.00841222262071387 0.1496040542675346 0
+1553 0.06997952122973763 0.1163264043043921 0
+1554 0.07507483789893146 0.1191044547763287 0
+1555 0.07046457130290261 0.1220171162943717 0
+1556 0.2540115095469526 0.02271517267069313 0
+1557 0.089999999999783 0.007499999999978143 0
+1558 0.0831257918342227 0.007782410199486777 0
+1559 0.2790728005644558 0.1767303332440379 0
+1560 0.04676975491524994 0.1923210416012687 0
+1561 0.05348393596557693 0.1958101474231423 0
+1562 0.03892946725572034 0.2652507673159728 0
+1563 0.0309263943874009 0.2662368355166074 0
+1564 0.1622845003683531 0.01930648429471929 0
+1565 0.1554323162052795 0.01672605625884982 0
+1566 0.1100010279448618 0.1162426495115146 0
+1567 0.1030829671462912 0.1160982484656243 0
+1568 0.1093598646590994 0.1096807192190581 0
+1569 0.1758988478428666 0.2801258921935652 0
+1570 0.178048239213666 0.2734329589216319 0
+1571 0.08044760203786246 0.08589167140554474 0
+1572 0.06956948563394962 0.1116920676204176 0
+1573 0.1364596974369281 0.2584788210300973 0
+1574 0.007500000000016883 0.2474999999998631 0
+1575 0.007184207398252085 0.2553156380049695 0
+1576 0.1947094942167004 0.116438500278581 0
+1577 0.1998668372567816 0.1253694674855211 0
+1578 0.2482756302599833 0.02131294392189578 0
+1579 0.0766501116348017 0.1711100682711555 0
+1580 0.08292752771624839 0.1720073125166393 0
+1581 0.08193797174757113 0.2396732716842061 0
+1582 0.08584015168337425 0.2435754516200123 0
+1583 0.2527021542483977 0.2314773190438099 0
+1584 0.2501946438933644 0.2283942443467905 0
+1585 0.02305796213844353 0.08682041123126248 0
+1586 0.02746471344860252 0.08161685798334049 0
+1587 0.0351210240950961 0.02068393640450676 0
+1588 0.034843107465767 0.02853291647385588 0
+1589 0.02961619024570959 0.02274277879803494 0
+1590 0.08524063690676041 0.1006345602420783 0
+1591 0.07907287183488115 0.09817265029217351 0
+1592 0.2475876568362596 0.2081155447758171 0
+1593 0.2506964316758362 0.2068278480749112 0
+1594 0.09412822320065144 0.2047871022432038 0
+1595 0.0867757953744939 0.2065183341606426 0
+1596 0.01956007474752941 0.2795553468481442 0
+1597 0.02643406288856859 0.27859523677132 0
+1598 0.02187398562937921 0.2840398924377419 0
+1599 0.2660983374416282 0.2483671257819587 0
+1600 0.2648677485981864 0.2552991356394585 0
+1601 0.2216538712502817 0.1949628455047011 0
+1602 0.2214809645926352 0.1996419749320918 0
+1603 0.218277802097101 0.1977191470433118 0
+1604 0.1084841148777274 0.2493058883156756 0
+1605 0.1137486109536389 0.2478952708435818 0
+1606 0.2924999999999814 0.1799999999996923 0
+1607 0.2856213492166894 0.1734330415900888 0
+1608 0.2931213492167079 0.1734330415900885 0
+1609 0.1028919098351025 0.1439910824707481 0
+1610 0.06953869858592954 0.1276824635419349 0
+1611 0.0739220740259581 0.1292652565456959 0
+1612 0.0679008846397912 0.1321525533213224 0
+1613 0.2761539596948999 0.2095918789900661 0
+1614 0.1580841215130011 0.02976852015384086 0
+1615 0.1541289660294323 0.0261128997821411 0
+1616 0.1608372314058492 0.02538690734287897 0
+1617 0.01499999874418687 0.2775000012572398 0
+1618 0.04935561542288851 0.06785778641474237 0
+1619 0.04792657520730575 0.07386224514451892 0
+1620 0.04293288089597709 0.2924963640361931 0
+1621 0.04616840309586355 0.2873855147913422 0
+1622 0.04823552219979788 0.2948891507551491 0
+1623 0.2252895452297425 0.2070679807630758 0
+1624 0.2205068546193867 0.2064136856156173 0
+1625 0.2228875860498103 0.203052571618161 0
+1626 0.0194131698684658 0.06540309699643151 0
+1627 0.02018762954865203 0.07158113194147978 0
+1628 0.07200470364686434 0.1662635912349491 0
+1629 0.226263655202991 0.2002962700795504 0
+1630 0.0815206390716096 0.2246638953609288 0
+1631 0.08572024665975017 0.2198712451811806 0
+1632 0.08705023807005677 0.2263958864383291 0
+1633 0.2796876403957048 0.04917208441987261 0
+1634 0.2728232142464223 0.04780830314098065 0
+1635 0.2781355738507599 0.04363621872102082 0
+1636 0.007176991596872018 0.2175096721152885 0
+1637 0.007362000876989243 0.2268080584114252 0
+1638 0.1997125585742064 0.199799256938541 0
+1639 0.02626135830852737 0.0726768640131749 0
+1640 0.1175682770073458 0.1165767076084706 0
+1641 0.1112913794945376 0.1229942368550368 0
+1642 0.139881981650698 0.2126106674619102 0
+1643 0.02937398688518167 0.2915398911804588 0
+1644 0.03480686778123059 0.2840362552166519 0
+1645 0.03543288089599386 0.2924963640361931 0
+1646 0.1874999999997111 0.2924999999999814 0
+1647 0.01447360168866655 0.2017510387264791 0
+1648 0.02173524963143466 0.1946122800572476 0
+1649 0.02161563113651214 0.2028805855615331 0
+1650 0.2761217113158728 0.03615217775904652 0
+1651 0.2925000134740846 0.2775000135250767 0
+1652 0.2931524114772642 0.2694485449236114 0
+1653 0.279762565869593 0.1438858124020891 0
+1654 0.279364659615708 0.1363349813204537 0
+1655 0.2855698159860349 0.1423789128878966 0
+1656 0.2280475918456821 0.2425634500344987 0
+1657 0.02244705169668814 0.01494689762114037 0
+1658 0.02216913506735904 0.02279587769048948 0
+1659 0.04357080030841079 0.04481755773094698 0
+1660 0.1789126041321961 0.1888635833713635 0
+1661 0.1828301140990969 0.1897118276011174 0
+1662 0.1789845620915456 0.1937641017131352 0
+1663 0.08893482695092737 0.108204056032615 0
+1664 0.09047529834464645 0.1032855268200224 0
+1665 0.2796941497811823 0.170163374834434 0
+1666 0.2042657658087254 0.2667734333553101 0
+1667 0.1367105930515242 0.05859224244958338 0
+1668 0.1163884751010347 0.2317517843915828 0
+1669 0.1125729429575354 0.2254047806779528 0
+1670 0.1566635073510741 0.07258808840649048 0
+1671 0.1525760087973628 0.06873451145566971 0
+1672 0.1585970035671396 0.06717500218603864 0
+1673 0.07000138952135732 0.1706749862519034 0
+1674 0.2559988502288678 0.2297534037682127 0
+1675 0.1010966128877039 0.01894984443837631 0
+1676 0.06276810466403047 0.05354084791333787 0
+1677 0.01534703215063123 0.1554018194645926 0
+1678 0.006934809529917358 0.155797765196677 0
+1679 0.06030883811201145 0.007186994092545392 0
+1680 0.0526088465375433 0.00707493510182039 0
+1681 0.1862211433986926 0.1866194134270071 0
+1682 0.1862931013580421 0.1915199317687787 0
+1683 0.2626988443959285 0.2240841817442157 0
+1684 0.265947537104114 0.2283234235060959 0
+1685 0.2625424589059381 0.2285977814232497 0
+1686 0.1170751312694792 0.2143136411456917 0
+1687 0.1101251662826943 0.2191794526664236 0
+1688 0.1113071451273885 0.2132372437417945 0
+1689 0.2092463074702939 0.1154176440617784 0
+1690 0.2011425368287924 0.1132862544982685 0
+1691 0.2082503794827864 0.1094570360353731 0
+1692 0.2188780750424335 0.2103770633648055 0
+1693 0.1482915026280563 0.2638271282517087 0
+1694 0.1479807372765546 0.2583322878697552 0
+1695 0.2058880439202408 0.1239579480993618 0
+1696 0.2036164163607225 0.130080553060209 0
+1697 0.1394047304967125 0.2305285235169555 0
+1698 0.1267546368766111 0.09773050607733577 0
+1699 0.1234635148726663 0.09266329749122855 0
+1700 0.130992340853075 0.09436240981444635 0
+1701 0.0962201434921162 0.006839818533365223 0
+1702 0.09622014349211619 0.01433981853334337 0
+1703 0.09271766558232544 0.09070836214109014 0
+1704 0.08677929454565249 0.08952714669980399 0
+1705 0.09795232702021148 0.09335932871903427 0
+1706 0.09091705381157844 0.0977767937045436 0
+1707 0.01439707647564229 0.03780187995096543 0
+1708 0.02150757114539366 0.03739490328579306 0
+1709 0.02129949626055757 0.04512651358782679 0
+1710 0.09916578468278311 0.2081530932127814 0
+1711 0.2627021758719525 0.1636231749543675 0
+1712 0.2584271358156418 0.1606697467287755 0
+1713 0.206376566996028 0.254389661897917 0
+1714 0.2013909509787259 0.2516123458327332 0
+1715 0.035325661595023 0.2020901047990369 0
+1716 0.03525961657827668 0.2093039761191553 0
+1717 0.02881123406253392 0.20295569821242 0
+1718 0.1989805945120831 0.07350674063907053 0
+1719 0.02197171248842943 0.03033101425815787 0
+1720 0.01480257393940799 0.0225351330812633 0
+1721 0.1386369029018414 0.08421763052764927 0
+1722 0.2218201688274744 0.07038823922329629 0
+1723 0.2151595921143857 0.0709841005313489 0
+1724 0.1780571561140388 0.1831709683000685 0
+1725 0.2670013868967041 0.2420618982992967 0
+1726 0.2102035710337104 0.1402955486341731 0
+1727 0.2070131685135874 0.1347278809511744 0
+1728 0.2915513785142472 0.2550165919333171 0
+1729 0.2924999999999855 0.2474999999998655 0
+1730 0.1361900917853043 0.08916465888223785 0
+1731 0.1301480299656673 0.08434817287375054 0
+1732 0.03558100640614503 0.1955589603271596 0
+1733 0.1778868323702228 0.1992827616927709 0
+1734 0.1739693224033221 0.198434517463017 0
+1735 0.007499999999978142 0.08249999999980487 0
+1736 0.06418778726021858 0.1711444497869347 0
+1737 0.1485783990025436 0.2043251523500179 0
+1738 0.1531851912605364 0.2059818604461708 0
+1739 0.08987126169418443 0.2307375800163768 0
+1740 0.01921232210351404 0.1591963636277248 0
+1741 0.05272503172259918 0.06458686281287994 0
+1742 0.1787347981969296 0.1777700571101502 0
+1743 0.1834357982226381 0.1794103980694275 0
+1744 0.05852195450832379 0.1718053503439385 0
+1745 0.05969014878152516 0.1664894097727008 0
+1746 0.2683537065862918 0.1609427551576437 0
+1747 0.2668022461718441 0.1547982003101853 0
+1748 0.2718748957865937 0.1562042228974129 0
+1749 0.06850626736910131 0.1055949329561169 0
+1750 0.2160688048148064 0.1777450937774939 0
+1751 0.212123508633192 0.1761108985914837 0
+1752 0.09102006534357748 0.1179483327003257 0
+1753 0.09466521519288047 0.1234278173963374 0
+1754 0.2669146252432746 0.2084813655216132 0
+1755 0.2718819817946816 0.2098194658559576 0
+1756 0.2702407142566045 0.21310580767562 0
+1757 0.1938190775942759 0.03922693521494067 0
+1758 0.1967851897986506 0.04455862608071935 0
+1759 0.007499999999978135 0.1349999999996573 0
+1760 0.2677315299706808 0.07706569110831987 0
+1761 0.2678995610808431 0.03564388702124093 0
+1762 0.2591076250684857 0.2284657070672656 0
+1763 0.044500518052316 0.242175066695478 0
+1764 0.1560333578148249 0.2929057556956292 0
+1765 0.02609617737624713 0.06237017990025031 0
+1766 0.1009283666208569 0.1317751222849809 0
+1767 0.09863799969649051 0.1259112118838601 0
+1768 0.10601449735642 0.1285240891592017 0
+1769 0.2158996355060809 0.0812830252613583 0
+1770 0.2222839254094793 0.07931430564263012 0
+1771 0.2443198182400175 0.2086158544453284 0
+1772 0.2450488082369137 0.20480795891815 0
+1773 0.1917117392924644 0.0970037176872116 0
+1774 0.2000472907882814 0.10095173172283 0
+1775 0.1918110573454679 0.1033776324362448 0
+1776 0.007184207398252085 0.2628156380049887 0
+1777 0.007500000000016849 0.2699999999999161 0
+1778 0.2741259530463261 0.20021591903766 0
+1779 0.2796214380944961 0.07435256855925483 0
+1780 0.2845441035643986 0.06740622152926169 0
+1781 0.08356246245305306 0.2746625007855177 0
+1782 0.02249999874414249 0.292500001257283 0
+1783 0.02753366412142568 0.1069023627147714 0
+1784 0.02138567460898877 0.1060844197336322 0
+1785 0.007296610091794537 0.1942413666109616 0
+1786 0.007176991596872018 0.2025096721152471 0
+1787 0.2677748254867022 0.1650291975415951 0
+1788 0.2230881294456951 0.2451666794579828 0
+1789 0.2732859786649951 0.1679047221166272 0
+1790 0.04149440352531635 0.1758980850912369 0
+1791 0.03577513488366443 0.1821105722336279 0
+1792 0.2564492067616144 0.13956707314524 0
+1793 0.2604500730592499 0.1455220111104756 0
+1794 0.007362000876989243 0.2343080584114445 0
+1795 0.007500000000016883 0.2399999999998486 0
+1796 0.1034108059641761 0.2508981517930117 0
+1797 0.1070563608039767 0.2445739089912571 0
+1798 0.07972968416101897 0.2951968325433602 0
+1799 0.2118611822772747 0.212915328451722 0
+1800 0.2165900576289446 0.2139881408303467 0
+1801 0.2136039036206712 0.2165784373129896 0
+1802 0.02887413227334471 0.03765564789501924 0
+1803 0.2161916740769932 0.006644029468815133 0
+1804 0.2097641309973169 0.007784063730773757 0
+1805 0.1951202194706614 0.09094517514349545 0
+1806 0.29298386111996 0.1424648719845946 0
+1807 0.292585954866075 0.1349140409029592 0
+1808 0.04278281719518486 0.02031197214198424 0
+1809 0.03755589997512744 0.0145218344661633 0
+1810 0.007500000000016849 0.2774999999999386 0
+1811 0.007499998744170016 0.2850000012572648 0
+1812 0.07562579183424455 0.007782410199486777 0
+1813 0.1053649362027292 0.2120552648971225 0
+1814 0.06417832071531795 0.02047823543881924 0
+1815 0.06843462994640744 0.01496940429203217 0
+1816 0.07199527443757292 0.02107365154576062 0
+1817 0.07883256960411188 0.2356076081542067 0
+1818 0.08595603262537546 0.2352542001480766 0
+1819 0.02799293876831835 0.2165442361235579 0
+1820 0.03439335557387128 0.2165255385306563 0
+1821 0.03364110529640204 0.2229002051216759 0
+1822 0.06780883811198959 0.007186994092545392 0
+1823 0.08091072861720895 0.1214992211919621 0
+1824 0.08000490909113861 0.1255903184403296 0
+1825 0.1038579958430435 0.1368728677377016 0
+1826 0.2931524114772642 0.2619485449235921 0
+1827 0.1893579913684931 0.1504324508940798 0
+1828 0.1919271576327344 0.03360221628754585 0
+1829 0.1970952122665374 0.03390405314751886 0
+1830 0.1937135662291929 0.1104778922521756 0
+1831 0.2058902594729236 0.1923368356587842 0
+1832 0.2037917620567651 0.1880407500307556 0
+1833 0.135732967589561 0.006218394703594985 0
+1834 0.2202562926994356 0.1795489364730565 0
+1835 0.2153905916283775 0.1820840173328198 0
+1836 0.06111975042511567 0.2945744691637994 0
+1837 0.02183354454438477 0.1878697659377795 0
+1838 0.01463241318711096 0.1858991337741676 0
+1839 0.2102393877853391 0.1843598202329821 0
+1840 0.1096620389815299 0.09100457132140602 0
+1841 0.1037236679448844 0.0921857867626808 0
+1842 0.07332892779044092 0.1944542491936228 0
+1843 0.06650051921458147 0.1945784987293988 0
+1844 0.08362015518020817 0.1889528699146057 0
+1845 0.2364205442775996 0.2262074504080538 0
+1846 0.2342956876195293 0.2221870218746421 0
+1847 0.238439956789759 0.2224158901786726 0
+1848 0.2491134180826097 0.1318434235523155 0
+1849 0.05573552219977738 0.2948891507551491 0
+1850 0.1470548743874838 0.1994192185350895 0
+1851 0.1417401755426939 0.2041814264076131 0
+1852 0.04238056729757911 0.188670219787954 0
+1853 0.03567930131909515 0.1888164462076914 0
+1854 0.03907301016073036 0.1356025795048471 0
+1855 0.03348898286350825 0.1392598483795077 0
+1856 0.03377704992884697 0.1349134015322503 0
+1857 0.1799999999996923 0.2924999999999814 0
+1858 0.04686558847981921 0.1856151676272051 0
+1859 0.1390063684955982 0.2373337157276424 0
+1860 0.1343814132909057 0.2350671548213508 0
+1861 0.09648149818311402 0.13425999046236 0
+1862 0.2159080437133388 0.2265300430479384 0
+1863 0.2544880149387611 0.1256845402471347 0
+1864 0.2556405485567338 0.1328476001744903 0
+1865 0.02154958611976582 0.2100944568816515 0
+1866 0.1537007588908962 0.05874976737524805 0
+1867 0.1485711648263695 0.06262521782579157 0
+1868 0.03063096930244771 0.07016960366678354 0
+1869 0.03151706851362729 0.07468420379682558 0
+1870 0.166239655851922 0.02296210466641905 0
+1871 0.2781455788060331 0.1499947060097432 0
+1872 0.271940422435706 0.1439507744423004 0
+1873 0.1841038476912661 0.2655278327086642 0
+1874 0.1785851877116453 0.2666255624299689 0
+1875 0.2058903893630612 0.1833868880471175 0
+1876 0.2068541053214704 0.1793072424513926 0
+1877 0.226894095409493 0.2270133977341174 0
+1878 0.2249251611897941 0.2227157447182097 0
+1879 0.2303073408876711 0.2216809290881157 0
+1880 0.2351461800356393 0.01886635721362574 0
+1881 0.2391999305912435 0.01432931304350145 0
+1882 0.2420069538576755 0.01871637313792601 0
+1883 0.1505228788035852 0.2683860228938126 0
+1884 0.1564251013769402 0.2681876794400907 0
+1885 0.2802945396373643 0.09429370848174878 0
+1886 0.2864502569773745 0.09734691052387556 0
+1887 0.1867212856659106 0.1340259869942841 0
+1888 0.1401040982169134 0.2428523757072887 0
+1889 0.2431871293149483 0.2117566767978523 0
+1890 0.2406482807156024 0.2084490909401851 0
+1891 0.2286695783845099 0.007239648559600587 0
+1892 0.22736125246171 0.01388367802841572 0
+1893 0.2236916740770126 0.006644029468815133 0
+1894 0.03340854654533335 0.1294800105969138 0
+1895 0.07899314130873707 0.1290881799150741 0
+1896 0.03283768516640841 0.03440651890657422 0
+1897 0.1625729998055928 0.1473838183691726 0
+1898 0.2926120074212727 0.06745047247671074 0
+1899 0.2919320961431259 0.05995574905242138 0
+1900 0.007335803095316425 0.1791577671629168 0
+1901 0.007296610091794537 0.1867413666109429 0
+1902 0.2782915399780339 0.01413885394140713 0
+1903 0.007302575680239191 0.03003513482443831 0
+1904 0.007094500795403104 0.03776674512647206 0
+1905 0.1287536340007874 0.2374111022648092 0
+1906 0.0796337183235966 0.1957216633141676 0
+1907 0.09160436137945435 0.2159509740762125 0
+1908 0.08607476238100717 0.2142189829988123 0
+1909 0.05740066859922379 0.1770708616533263 0
+1910 0.03760884653758056 0.00707493510182039 0
+1911 0.02994705343749181 0.007446899364342911 0
+1912 0.2607743706336978 0.1552265459902793 0
+1913 0.2850859548660968 0.1274140409029811 0
+1914 0.2799771929755049 0.1303536787376295 0
+1915 0.2370014796670064 0.1638752180924982 0
+1916 0.2398920044327761 0.1674459788028039 0
+1917 0.2022914982975082 0.07650842183553702 0
+1918 0.1981099787173593 0.07971546599549206 0
+1919 0.2850000134740664 0.2925000135251175 0
+1920 0.1154277458802259 0.0899799300135746 0
+1921 0.2623563177766712 0.2327049488291459 0
+1922 0.2938638605393819 0.09743330930680921 0
+1923 0.2925863964379926 0.08991360121684935 0
+1924 0.08042567854404398 0.1158085092019825 0
+1925 0.1515962807226771 0.1890235532395072 0
+1926 0.2019948375856083 0.1589759677363796 0
+1927 0.1978136648229078 0.1558565785711334 0
+1928 0.2013775998026164 0.1531414678452132 0
+1929 0.29298386111996 0.1499648719845755 0
+1930 0.292585954866075 0.1274140409029811 0
+1931 0.2925000000000219 0.119999999999701 0
+1932 0.2680949356609562 0.1389847718227276 0
+1933 0.2664779485973962 0.1450936654303817 0
+1934 0.2925000134740846 0.2925000135251175 0
+1935 0.2925000134740846 0.2850000135250993 0
+1936 0.02897557399223036 0.1889993127728335 0
+1937 0.241899432614005 0.2148654516374663 0
+1938 0.1558912791909723 0.1469097202931936 0
+1939 0.02135631569948868 0.090928549142526 0
+1940 0.05986550084043084 0.1956540873391055 0
+1941 0.05763634097234395 0.189109929356483 0
+1942 0.01499999874415502 0.292500001257283 0
+1943 0.007499998744170016 0.292500001257283 0
+1944 0.1927941767506613 0.1556553740590613 0
+1945 0.1849557410792385 0.156065746273174 0
+1946 0.05777928824037686 0.05835912011987252 0
+1947 0.1697490578794986 0.1594096930028191 0
+1948 0.2035006069294723 0.1497139349959857 0
+1949 0.2070967504110109 0.1450962597701518 0
+1950 0.2919320961431259 0.05245574905244187 0
+1951 0.2844320961431471 0.05245574905244255 0
+1952 0.2925000000000212 0.04499999999991209 0
+1953 0.1228663836454585 0.2134376099814095 0
+1954 0.2361695783845292 0.007239648559600587 0
+1955 0.2537893965967013 0.1922486388481371 0
+1956 0.2430303522065654 0.007089664483900859 0
+1957 0.2849999999999977 0.007499999999988356 0
+1958 0.2782915399779999 0.006638853941418778 0
+1959 0.09589086190469884 0.2390325498162799 0
+1960 0.09845284134268201 0.242113713945569 0
+1961 0.09162341420681788 0.242401027807365 0
+1962 0.007176991596872018 0.2100096721152692 0
+1963 0.2851984038592653 0.08236407369373339 0
+1964 0.2781989691936787 0.08928265352249884 0
+1965 0.2782245801769588 0.08181952478231651 0
+1966 0.007094500795403104 0.04526674512645529 0
+1967 0.2059832589884721 0.0739818419956349 0
+1968 0.2051126431937484 0.08019056735205643 0
+1969 0.04058361321459165 0.2469403931294509 0
+1970 0.03939589010206457 0.2412844202630077 0
+1971 0.0451088465375638 0.00707493510182039 0
+1972 0.2925863964379926 0.08241360121687122 0
+1973 0.2926120074212727 0.07495047247668887 0
+1974 0.1437127048183027 0.02244648160540141 0
+1975 0.1493927495638298 0.02539164082753053 0
+1976 0.007499998259168803 0.01499999825678246 0
+1977 0.007302575680239191 0.02253513482445085 0
+1978 0.08966617086217391 0.1142340471626444 0
+1979 0.08553022535107493 0.1121732844875865 0
+1980 0.2938638605393819 0.1124333093067682 0
+1981 0.2726220034289096 0.0812711483880203 0
+1982 0.2663346720531435 0.08453264733138155 0
+1983 0.2288775036333498 0.02146292799757719 0
+1984 0.02244705343750435 0.007446899364342911 0
+1985 0.01499999825915381 0.007499998256797454 0
+1986 0.06372869969452555 0.06007374668933614 0
+1987 0.02572627296187277 0.1619107711463363 0
+1988 0.2447059858366221 0.06287061780367581 0
+1989 0.0727732730842818 0.02994629967320078 0
+1990 0.1504208653570687 0.1943816570529583 0
+1991 0.214944147789391 0.1951888071773944 0
+1992 0.2103566293254822 0.1928885312837874 0
+1993 0.03188763054516276 0.2775446617929961 0
+1994 0.1458961889991515 0.2534045730833503 0
+1995 0.1427701192343255 0.2487260790588226 0
+1996 0.110691201603907 0.2367676783997529 0
+1997 0.1178269432146558 0.2379657515057509 0
+1998 0.2707915399779773 0.006638853941418778 0
+1999 0.1288085925700715 0.2122556311367566 0
+2000 0.2076817796921728 0.1528333241612319 0
+2001 0.2304582507317012 0.1937747527346656 0
+2002 0.2287102101562953 0.1972662371719325 0
+2003 0.2266050743212218 0.1933941889562144 0
+2004 0.2004064795928964 0.1829881722491661 0
+2005 0.01524916844538948 0.1042208697764155 0
+2006 0.02164546321386669 0.1006112535112693 0
+2007 0.22371450459961 0.1782339552725097 0
+2008 0.2230362914131811 0.1825728788278356 0
+2009 0.1344988878978332 0.04595862928938229 0
+2010 0.1356801033391072 0.05189700032602589 0
+2011 0.2233355928201566 0.2175172628819112 0
+2012 0.2206207963858299 0.2140401722260733 0
+2013 0.2256236102336455 0.2139061854163701 0
+2014 0.2076671478579893 0.1601559435964936 0
+2015 0.2093013430440023 0.1562106474148766 0
+2016 0.03082338978682017 0.1623210746889217 0
+2017 0.2733207159550579 0.09374915957033191 0
+2018 0.2925000000000159 0.01499999999997336 0
+2019 0.2925000000000159 0.007499999999988356 0
+2020 0.2938638605393819 0.1049333093067873 0
+2021 0.007499998259168803 0.007499998256797454 0
+2022 0.234391549719331 0.2296667512254537 0
+2023 0.09297666383764368 0.2348032435463762 0
+2024 0.05151826015446022 0.1834736611945 0
+2025 0.05789982502931412 0.1833176011104632 0
+2026 0.1367026140605766 0.2075474173771492 0
+2027 0.1684927667553406 0.06197051666728205 0
+2028 0.1693520754623271 0.056177298457937 0
+2029 0.155068513212942 0.1942048406640431 0
+2030 0.1413996416020185 0.2585474685215104 0
+2031 0.068558528945978 0.1372240110951711 0
+2032 0.06417515350594942 0.1356412180914101 0
+2033 0.05881518313119277 0.1047292387402539 0
+2034 0.06334758551194125 0.1060289884588463 0
+2035 0.05679646267597278 0.03169025355042895 0
+2036 0.0607142717781033 0.02629867890678866 0
+2037 0.2234019118256876 0.1914713610674342 0
+2038 0.2618238036177657 0.1334081898400592 0
+2039 0.1176219734356759 0.2438472159894695 0
+2040 0.1192409146717867 0.2487608413191304 0
+2041 0.05685527262502262 0.2894636199189485 0
+2042 0.05248182271806882 0.2833678043168579 0
+2043 0.2419204358417312 0.08873356902553489 0
+2044 0.2484664048547941 0.09144499816962992 0
+2045 0.04712907253678938 0.1798228393811853 0
+2046 0.205157908674937 0.1038895620935205 0
+2047 0.2435985086911792 0.1823706086550979 0
+2048 0.1560373741178143 0.03470980547403532 0
+2049 0.03259177032907611 0.1530789999742149 0
+2050 0.02965214197214077 0.1572075004043 0
+2051 0.1607928300499336 0.2658189088229391 0
+2052 0.1634741324384276 0.1998771692499329 0
+2053 0.168992792418058 0.1987794395286242 0
+2054 0.2571994440828316 0.1191385712340963 0
+2055 0.07464034870244696 0.1388126266285796 0
+2056 0.07091461756860518 0.1423012913986672 0
+2057 0.2625020641072309 0.1117668119189871 0
+2058 0.2663177654372844 0.1193169575542004 0
+2059 0.113581746418904 0.1288581472561576 0
+2060 0.06137663469111598 0.1501237069947332 0
+2061 0.05715163136303564 0.1534087994749053 0
+2062 0.2555178942579921 0.09093947777945938 0
+2063 0.2550123738678568 0.09799096718265753 0
+2064 0.2239655972048172 0.1868952822736649 0
+2065 0.2741699428590629 0.1318605782518221 0
+2066 0.2648677485981782 0.2819858986801206 0
+2067 0.0616439568151556 0.2219796971306084 0
+2068 0.2673377280866956 0.04833306149538526 0
+2069 0.2688897946316405 0.05386892719423705 0
+2070 0.2617540309329848 0.08890631842208405 0
+2071 0.1233192469328036 0.2388313219812995 0
+2072 0.2687400748348991 0.09812283066103442 0
+2073 0.2668421243663692 0.1047153225157891 0
+2074 0.2658705319845321 0.05976845432607412 0
+2075 0.2307674870034464 0.2314219289306884 0
+2076 0.2634774226880325 0.04162817456134781 0
+2077 0.2595440030732508 0.04768879861460421 0
+2078 0.04194046719889624 0.03840127543223991 0
+2079 0.1007669809727516 0.2546093029315724 0
+2080 0.09933922689900086 0.2498773236071539 0
+2081 0.1390953613636767 0.04206648970624283 0
+2082 0.07735532736259873 0.1335582696944617 0
+2083 0.05907772985210334 0.2334633210407265 0
+2084 0.06121876953154581 0.2281971134710593 0
+2085 0.2642955598339998 0.1504880137300485 0
+2086 0.2678988108158725 0.1262839962691537 0
+2087 0.2577238030119164 0.104536936195685 0
+2088 0.2509746622389183 0.06027404701971766 0
+2089 0.2666445043912135 0.09311177570178449 0
+2090 0.05061670801553965 0.03229807351987254 0
+2091 0.03622481168836729 0.2354632098005941 0
+2092 0.05092751295325573 0.09627021152180817 0
+2093 0.157863685285036 0.2028557906813822 0
+2094 0.1271465688510257 0.07830098841545045 0
+2095 0.2347092698956481 0.1598010537219557 0
+2096 0.2396172609415873 0.159625241631926 0
+2097 0.05130369704618828 0.1370443643254272 0
+2098 0.05153274289120544 0.1416462822053157 0
+2099 0.04735206125677976 0.1390731506042853 0
+2100 0.236819460985754 0.198531499719427 0
+2101 0.2353619573096178 0.1946123286323437 0
+2102 0.2396180317285971 0.195497027401387 0
+2103 0.2340029016859651 0.2012552264353244 0
+2104 0.2382589761049443 0.2021399252043677 0
+2105 0.02957371966331296 0.2730601162033984 0
+2106 0.1023516704654942 0.2424557042115385 0
+2107 0.1074249793790455 0.2408634407342024 0
+2108 0.2574315384215433 0.06071025755145504 0
+2109 0.2569474322892888 0.05395747501690429 0
+2110 0.2301168316134704 0.2006768338580016 0
+2111 0.2476370519271053 0.1837693017292822 0
+2112 0.05193766198810856 0.1525247388059047 0
+2113 0.2199223473419785 0.2228497315279129 0
+2114 0.1333208955535209 0.2110707246165179 0
+2115 0.03458917526945032 0.2286444166504638 0
+2116 0.2102726923499791 0.07220510052241126 0
+2117 0.2323267533998304 0.2178893688587344 0
+2118 0.2300500146307591 0.2142439549722646 0
+2119 0.2340383613626174 0.214750047758791 0
+2120 0.242424043442653 0.222288654347154 0
+2121 0.2402991867845827 0.2182682258137422 0
+2122 0.03834251901579493 0.03234767651304604 0
+2123 0.04394588949825483 0.03252767299952158 0
+2124 0.2444460699051922 0.1973424912003513 0
+2125 0.05518466613902689 0.1354368142920318 0
+2126 0.1989857074348407 0.1698804122201241 0
+2127 0.237915345961111 0.2149926874689849 0
+2128 0.04701875983243833 0.02624447460067867 0
+2129 0.05873339171083459 0.0956117051596253 0
+2130 0.05393450900067868 0.09347285661346758 0
+2131 0.2414282525227024 0.2023622335380658 0
+2132 0.2446960911189444 0.2018619238685545 0
+2133 0.05950094394018829 0.1350936281220095 0
+2134 0.06015858824637509 0.1401650858958581 0
+2135 0.2672862774560756 0.132265298851978 0
+2136 0.04318302509859429 0.1418120474181391 0
+2137 0.04295397925357712 0.1372101295382506 0
+2138 0.06546625047810492 0.1462178879579245 0
+2139 0.2374790042978443 0.208226782606487 0
+2140 0.2386116932229135 0.2050859602539632 0
+2141 0.189880410237574 0.02866093096737765 0
+2142 0.04892316350880377 0.08735303482640296 0
+2143 0.05062480994774261 0.09146117273765048 0
+2144 0.2636183104565505 0.2379243033288507 0
+2145 0.1633568477578731 0.06524100613352582 0
+2146 0.152145859456678 0.02101002801656864 0
+2147 0.06074318202514727 0.1446184949020674 0
+2148 0.03477911942931651 0.1488011286599468 0
+2149 0.03693660789732857 0.1533399326326172 0
+2150 0.09487646939537073 0.01961002590498923 0
+2151 0.05211733666997763 0.1460996912115249 0
+2152 0.04740143241992785 0.1501001160785536 0
+2153 0.1986709701569709 0.1743459141983938 0
+2154 0.04758365390826339 0.08292256701435964 0
+2155 0.2728278706815699 0.2049674368360593 0
+2156 0.09442466694342992 0.1139791042453541 0
+2157 0.1644107901421427 0.05413055106276046 0
+2158 0.2480666256194035 0.1997882165804356 0
+2159 0.2356386071920397 0.211347273582515 0
+2160 0.2336020196993508 0.2079841428962931 0
+2161 0.05920123139860122 0.1309129464875838 0
+2162 0.213691303649119 0.07644298752109197 0
+2163 0.1952069107572071 0.1838139523883702 0
+2164 0.1939959914721191 0.1880347759137363 0
+2165 0.1908950499427259 0.1842066940693023 0
+2166 0.2418377746135439 0.1543395730100349 0
+2167 0.2441299843849022 0.1584137373805773 0
+2168 0.2512806965081565 0.1986099248130036 0
+2169 0.2517092885857869 0.1950562238524873 0
+2170 0.2551733806882922 0.1983973647532585 0
+2171 0.2515307177219087 0.2031293574812068 0
+2172 0.1900132827538596 0.02240336452027372 0
+2173 0.2467687824297069 0.1798741461659533 0
+2174 0.05819159979397078 0.1001847399304159 0
+2175 0.0315728513598305 0.0799152115444212 0
+2176 0.07425886510641692 0.2816114802354561 0
+2177 0.2110127357416743 0.08250402525242066 0
+2178 0.05606897245938614 0.1440709049326668 0
+2179 0.04335253204968295 0.1463685649012615 0
+2180 0.03895445004648031 0.1445055438352268 0
+2181 0.2315563467326608 0.2042852593429423 0
+2182 0.2477413426863435 0.1627510834448017 0
+2183 0.2455838611747986 0.167946216107063 0
+2184 0.03460961247822784 0.1442446111768245 0
+2185 0.1973055380635032 0.1791600904047321 0
+2186 0.03992517247155748 0.07946479156753382 0
+2187 0.04403331038280145 0.08116643800646911 0
+2188 0.1846904006864377 0.02278496126752733 0
+2189 0.2330750747096568 0.1558557575403603 0
+2190 0.2226151327501594 0.07486739090312165 0
+2191 0.1595035450007251 0.196584323046045 0
+2192 0.2073209750507103 0.08503060509232277 0
+2193 0.1910153671166094 0.1917567727945175 0
+2194 0.04317285736781388 0.1527936124956412 0
+2195 0.2568124170979449 0.2077727178785782 0
+2196 0.2599211919375514 0.209060414579514 0
+2197 0.1934714013212816 0.175171694337598 0
+2198 0.2103059532851426 0.04561843637214176 0
+2199 0.2437117401435519 0.2253974291867237 0
+2200 0.2297159496268561 0.2074057503189703 0
+2201 0.2336888797386669 0.152501377283487 0
+2202 0.2378854593974269 0.1504515446275499 0
+2203 0.2653745827918753 0.2181462471556671 0
+2204 0.2674919642891491 0.2209806640780862 0
+2205 0.2639865410968306 0.2209754069046427 0
+2206 0.03594246235375083 0.07740795119802985 0
+2207 0.2635712586523771 0.2149543486617496 0
+2208 0.2670766818446956 0.2149596058351931 0
+2209 0.03084943336319557 0.06574405110441815 0
+2210 0.1881097047666714 0.1769976787117228 0
+2211 0.2263208547461131 0.07895970901572216 0
+2212 0.2314839553461121 0.07863734932913109 0
+2213 0.1592693492041618 0.06138742918270505 0
+2214 0.09808422276761322 0.2458241822026236 0
+2215 0.1584606030816297 0.05681577132273523 0
+2216 0.04740244326862287 0.07804675319733272 0
+2217 0.2294389032780947 0.1528060575624638 0
+2218 0.2622835619514636 0.2118455738221654 0
+2219 0.2701958358941901 0.2247979878209541 0
+2220 0.2584378411635889 0.2001250206747033 0
+2221 0.09975134592844354 0.1201767842705581 0
+2222 0.01994381677492791 0.09650311560002184 0
+2223 0.2273352181964325 0.2107668643164266 0
+2224 0.2143184753437014 0.2213315612116399 0
+2225 0.0796602825172434 0.2785646807213152 0
+2226 0.2470858690537434 0.2271065476458401 0
+2227 0.2645522552293623 0.2056962062789618 0
+2228 0.2629109876912852 0.2089825480986242 0
+2229 0.2423981828407418 0.1492400403762013 0
+2230 0.07910463889738743 0.2832188538333452 0
+2231 0.1874320626837807 0.182398589901641 0
+2232 0.2539105025645892 0.2056495563074792 0
+2233 0.1506960997396771 0.01600479730423925 0
+2234 0.1958566743544147 0.0850148402525763 0
+2235 0.1925457705689896 0.08201315905610981 0
+2236 0.07908129490438609 0.2883296592171032 0
+2237 0.2700394504041997 0.2293115874999881 0
+2238 0.2576467031440174 0.2040742272848738 0
+2239 0.2435663948946291 0.1716927889073984 0
+2240 0.2459942454152163 0.1753342396517132 0
+2241 0.2613397556969445 0.2022481822458023 0
+2242 0.09911018264268114 0.1136148539781016 0
+2243 0.1382408509124973 0.01852049177801736 0
+2244 0.1419377890852701 0.01636277923457402 0
+2245 0.03157035164209492 0.05995196712153562 0
+2246 0.01692145597482818 0.09317313709655677 0
+2247 0.2145468173422685 0.04131615216913202 0
+2248 0.2691742280542772 0.236974618155576 0
+2249 0.2006844276190312 0.0886474820828777 0
+2250 0.1101837760947445 0.2974624323903126 0
+2251 0.104919280018819 0.2960518149182106 0
+2252 0.1773755780990982 0.1584628748358801 0
+2253 0.04156063030585833 0.1091976262828458 0
+2254 0.2129958865742348 0.1201287296364663 0
+2255 0.2359236048626622 0.08347085209383479 0
+2256 0.07564313236108583 0.2289131035978884 0
+2257 0.07935069986590237 0.09149035183234022 0
+2258 0.07702958231537127 0.02443746852641372 0
+2259 0.09815802862065748 0.2142008835781853 0
+2260 0.2569921458059785 0.2902047155660035 0
+2261 0.2526851563680025 0.2945117050039582 0
+2262 0.009166977449694479 0.08879928531942197 0
+2263 0.1808117634812663 0.1636857980008615 0
+2264 0.02420483978649957 0.1201319196303169 0
+2265 0.1732938782947281 0.1738067769521794 0
+2266 0.1786725204033274 0.1700462067215384 0
+$EndNodes
+$Elements
+1104
+1 15 2 2 1 1
+2 15 2 3 2 2
+3 15 2 4 3 3
+4 15 2 1 4 4
+5 8 2 1 76 4 325 344
+6 8 2 1 76 325 326 345
+7 8 2 1 76 326 327 346
+8 8 2 1 76 327 328 347
+9 8 2 1 76 328 329 348
+10 8 2 1 76 329 330 349
+11 8 2 1 76 330 331 350
+12 8 2 1 76 331 332 351
+13 8 2 1 76 332 333 352
+14 8 2 1 76 333 334 353
+15 8 2 1 76 334 335 354
+16 8 2 1 76 335 336 355
+17 8 2 1 76 336 337 356
+18 8 2 1 76 337 338 357
+19 8 2 1 76 338 339 358
+20 8 2 1 76 339 340 359
+21 8 2 1 76 340 341 360
+22 8 2 1 76 341 342 361
+23 8 2 1 76 342 343 362
+24 8 2 1 76 343 1 363
+25 8 2 2 77 1 364 383
+26 8 2 2 77 364 365 384
+27 8 2 2 77 365 366 385
+28 8 2 2 77 366 367 386
+29 8 2 2 77 367 368 387
+30 8 2 2 77 368 369 388
+31 8 2 2 77 369 370 389
+32 8 2 2 77 370 371 390
+33 8 2 2 77 371 372 391
+34 8 2 2 77 372 373 392
+35 8 2 2 77 373 374 393
+36 8 2 2 77 374 375 394
+37 8 2 2 77 375 376 395
+38 8 2 2 77 376 377 396
+39 8 2 2 77 377 378 397
+40 8 2 2 77 378 379 398
+41 8 2 2 77 379 380 399
+42 8 2 2 77 380 381 400
+43 8 2 2 77 381 382 401
+44 8 2 2 77 382 2 402
+45 8 2 3 78 3 403 422
+46 8 2 3 78 403 404 423
+47 8 2 3 78 404 405 424
+48 8 2 3 78 405 406 425
+49 8 2 3 78 406 407 426
+50 8 2 3 78 407 408 427
+51 8 2 3 78 408 409 428
+52 8 2 3 78 409 410 429
+53 8 2 3 78 410 411 430
+54 8 2 3 78 411 412 431
+55 8 2 3 78 412 413 432
+56 8 2 3 78 413 414 433
+57 8 2 3 78 414 415 434
+58 8 2 3 78 415 416 435
+59 8 2 3 78 416 417 436
+60 8 2 3 78 417 418 437
+61 8 2 3 78 418 419 438
+62 8 2 3 78 419 420 439
+63 8 2 3 78 420 421 440
+64 8 2 3 78 421 2 441
+65 8 2 4 79 4 442 461
+66 8 2 4 79 442 443 462
+67 8 2 4 79 443 444 463
+68 8 2 4 79 444 445 464
+69 8 2 4 79 445 446 465
+70 8 2 4 79 446 447 466
+71 8 2 4 79 447 448 467
+72 8 2 4 79 448 449 468
+73 8 2 4 79 449 450 469
+74 8 2 4 79 450 451 470
+75 8 2 4 79 451 452 471
+76 8 2 4 79 452 453 472
+77 8 2 4 79 453 454 473
+78 8 2 4 79 454 455 474
+79 8 2 4 79 455 456 475
+80 8 2 4 79 456 457 476
+81 8 2 4 79 457 458 477
+82 8 2 4 79 458 459 478
+83 8 2 4 79 459 460 479
+84 8 2 4 79 460 3 480
+85 9 2 11 11 63 526 653 857 858 859
+86 9 2 11 11 818 834 839 860 861 862
+87 9 2 11 11 336 572 573 863 864 865
+88 9 2 11 11 795 837 854 866 867 868
+89 9 2 11 11 29 481 508 869 870 871
+90 9 2 11 11 668 671 830 872 873 874
+91 9 2 11 11 225 226 408 228 875 876
+92 9 2 11 11 668 794 671 877 878 872
+93 9 2 11 11 520 575 679 879 880 881
+94 9 2 11 11 795 820 837 882 883 866
+95 9 2 11 11 517 646 570 884 885 886
+96 9 2 11 11 31 517 570 887 886 888
+97 9 2 11 11 677 799 748 889 890 891
+98 9 2 11 11 798 846 800 892 893 894
+99 9 2 11 11 550 825 754 895 896 897
+100 9 2 11 11 11 487 600 898 899 900
+101 9 2 11 11 545 624 687 901 902 903
+102 9 2 11 11 661 767 729 904 905 906
+103 9 2 11 11 231 411 230 907 908 233
+104 9 2 11 11 818 839 840 862 909 910
+105 9 2 11 11 569 574 586 911 912 913
+106 9 2 11 11 798 800 841 894 914 915
+107 9 2 11 11 306 417 620 916 917 918
+108 9 2 11 11 230 410 38 919 920 232
+109 9 2 11 11 89 90 681 92 921 922
+110 9 2 11 11 337 675 572 923 924 925
+111 9 2 11 11 12 68 613 926 927 928
+112 9 2 11 11 150 185 623 929 930 931
+113 9 2 11 11 48 618 610 932 933 934
+114 9 2 11 11 481 625 508 935 936 870
+115 9 2 11 11 83 613 631 937 938 939
+116 9 2 11 11 795 854 812 868 940 941
+117 9 2 11 11 130 537 577 942 943 944
+118 9 2 11 11 784 810 813 945 946 947
+119 9 2 11 11 13 645 507 948 949 950
+120 9 2 11 11 154 516 730 951 952 953
+121 9 2 11 11 220 543 711 954 955 956
+122 9 2 11 11 449 688 622 957 958 959
+123 9 2 11 11 6 86 609 960 961 962
+124 9 2 11 11 538 559 647 963 964 965
+125 9 2 11 11 334 638 614 966 967 968
+126 9 2 11 11 546 620 593 969 970 971
+127 9 2 11 11 206 567 680 972 973 974
+128 9 2 11 11 537 720 577 975 976 943
+129 9 2 11 11 698 768 716 977 978 979
+130 9 2 11 11 773 799 829 980 981 982
+131 9 2 11 11 697 763 735 983 984 985
+132 9 2 11 11 86 568 609 986 987 961
+133 9 2 11 11 540 542 697 988 989 990
+134 9 2 11 11 643 698 765 991 992 993
+135 9 2 11 11 546 593 706 971 994 995
+136 9 2 11 11 14 601 602 996 997 998
+137 9 2 11 11 567 615 680 999 1000 973
+138 9 2 11 11 519 706 593 1001 994 1002
+139 9 2 11 11 526 587 653 1003 1004 858
+140 9 2 11 11 696 806 747 1005 1006 1007
+141 9 2 11 11 144 485 650 1008 1009 1010
+142 9 2 11 11 160 649 605 1011 1012 1013
+143 9 2 11 11 522 724 665 1014 1015 1016
+144 9 2 11 11 413 652 582 1017 1018 1019
+145 9 2 11 11 191 851 493 1020 1021 1022
+146 9 2 11 11 68 579 613 1023 1024 927
+147 9 2 11 11 160 722 649 1025 1026 1011
+148 9 2 11 11 504 767 661 1027 904 1028
+149 9 2 11 11 538 622 559 1029 1030 963
+150 9 2 11 11 645 659 785 1031 1032 1033
+151 9 2 11 11 341 715 591 1034 1035 1036
+152 9 2 11 11 336 337 572 356 925 863
+153 9 2 11 11 254 569 586 1037 913 1038
+154 9 2 11 11 570 755 644 1039 1040 1041
+155 9 2 11 11 543 662 711 1042 1043 955
+156 9 2 11 11 565 651 661 1044 1045 1046
+157 9 2 11 11 699 758 805 1047 1048 1049
+158 9 2 11 11 447 554 448 1050 1051 467
+159 9 2 11 11 643 768 698 1052 977 991
+160 9 2 11 11 699 805 759 1049 1053 1054
+161 9 2 11 11 677 829 799 1055 981 889
+162 9 2 11 11 341 581 715 1056 1057 1034
+163 9 2 11 11 365 566 664 1058 1059 1060
+164 9 2 11 11 89 681 509 922 1061 1062
+165 9 2 11 11 150 184 185 1063 188 929
+166 9 2 11 11 45 563 112 1064 1065 1066
+167 9 2 11 11 42 571 245 1067 1068 247
+168 9 2 11 11 502 529 549 1069 1070 1071
+169 9 2 11 11 192 841 501 1072 1073 1074
+170 9 2 11 11 570 644 732 1041 1075 1076
+171 9 2 11 11 365 664 576 1060 1077 1078
+172 9 2 11 11 191 501 851 1079 1080 1020
+173 9 2 11 11 773 829 847 982 1081 1082
+174 9 2 11 11 655 789 769 1083 1084 1085
+175 9 2 11 11 231 575 411 1086 1087 907
+176 9 2 11 11 305 306 620 308 918 1088
+177 9 2 11 11 213 855 498 1089 1090 1091
+178 9 2 11 11 39 679 575 1092 880 1093
+179 9 2 11 11 183 184 619 187 1094 1095
+180 9 2 11 11 561 659 645 1096 1031 1097
+181 9 2 11 11 310 418 62 1098 1099 312
+182 9 2 11 11 556 611 694 1100 1101 1102
+183 9 2 11 11 543 760 662 1103 1104 1042
+184 9 2 11 11 507 645 785 949 1033 1105
+185 9 2 11 11 542 585 763 1106 1107 1108
+186 9 2 11 11 50 694 611 1109 1101 1110
+187 9 2 11 11 137 594 669 1111 1112 1113
+188 9 2 11 11 212 826 492 1114 1115 1116
+189 9 2 11 11 522 540 788 1117 1118 1119
+190 9 2 11 11 520 652 575 1120 1121 879
+191 9 2 11 11 585 700 763 1122 1123 1107
+192 9 2 11 11 761 762 822 1124 1125 1126
+193 9 2 11 11 518 578 684 1127 1128 1129
+194 9 2 11 11 485 743 650 1130 1131 1009
+195 9 2 11 11 136 564 549 1132 1133 1134
+196 9 2 11 11 83 631 487 939 1135 1136
+197 9 2 11 11 104 656 626 1137 1138 1139
+198 9 2 11 11 448 688 449 1140 957 468
+199 9 2 11 11 34 683 520 1141 1142 1143
+200 9 2 11 11 535 662 760 1144 1104 1145
+201 9 2 11 11 236 648 686 1146 1147 1148
+202 9 2 11 11 257 528 649 1149 1150 1151
+203 9 2 11 11 56 611 556 1152 1100 1153
+204 9 2 11 11 263 245 47 1154 1155 264
+205 9 2 11 11 56 290 527 291 1156 1157
+206 9 2 11 11 561 645 787 1097 1158 1159
+207 9 2 11 11 321 680 615 1160 1000 1161
+208 9 2 11 11 569 610 618 1162 933 1163
+209 9 2 11 11 655 718 789 1164 1165 1083
+210 9 2 11 11 335 573 638 1166 1167 1168
+211 9 2 11 11 501 841 802 1073 1169 1170
+212 9 2 11 11 50 550 694 1171 1172 1109
+213 9 2 11 11 564 669 614 1173 1174 1175
+214 9 2 11 11 135 136 549 139 1134 1176
+215 9 2 11 11 15 616 241 1177 1178 1179
+216 9 2 11 11 213 641 855 1180 1181 1089
+217 9 2 11 11 827 838 828 1182 1183 1184
+218 9 2 11 11 665 761 854 1185 1186 1187
+219 9 2 11 11 18 563 678 1188 1189 1190
+220 9 2 11 11 56 717 611 1191 1192 1152
+221 9 2 11 11 523 710 771 1193 1194 1195
+222 9 2 11 11 499 784 674 1196 1197 1198
+223 9 2 11 11 536 538 647 1199 965 1200
+224 9 2 11 11 802 808 851 1201 1202 1203
+225 9 2 11 11 164 577 720 1204 976 1205
+226 9 2 11 11 502 549 695 1071 1206 1207
+227 9 2 11 11 15 604 616 1208 1209 1177
+228 9 2 11 11 15 99 604 101 1210 1208
+229 9 2 11 11 518 637 578 1211 1212 1127
+230 9 2 11 11 53 486 753 1213 1214 1215
+231 9 2 11 11 192 639 841 1216 1217 1072
+232 9 2 11 11 419 525 420 1218 1219 439
+233 9 2 11 11 28 164 720 166 1205 1220
+234 9 2 11 11 521 522 665 1221 1016 1222
+235 9 2 11 11 626 804 745 1223 1224 1225
+236 9 2 11 11 205 583 706 1226 1227 1228
+237 9 2 11 11 150 619 184 1229 1094 1063
+238 9 2 11 11 663 778 757 1230 1231 1232
+239 9 2 11 11 514 557 831 1233 1234 1235
+240 9 2 11 11 144 650 515 1010 1236 1237
+241 9 2 11 11 536 647 752 1200 1238 1239
+242 9 2 11 11 212 498 826 1240 1241 1114
+243 9 2 11 11 490 654 793 1242 1243 1244
+244 9 2 11 11 109 708 529 1245 1246 1247
+245 9 2 11 11 39 580 679 1248 1249 1092
+246 9 2 11 11 724 762 761 1250 1124 1251
+247 9 2 11 11 558 663 757 1252 1232 1253
+248 9 2 11 11 571 684 790 1254 1255 1256
+249 9 2 11 11 183 619 517 1095 1257 1258
+250 9 2 11 11 42 684 571 1259 1254 1067
+251 9 2 11 11 204 205 706 208 1228 1260
+252 9 2 11 11 257 649 563 1151 1261 1262
+253 9 2 11 11 753 827 828 1263 1184 1264
+254 9 2 11 11 269 611 717 1265 1192 1266
+255 9 2 11 11 306 62 417 309 1267 916
+256 9 2 11 11 548 779 676 1268 1269 1270
+257 9 2 11 11 149 544 721 1271 1272 1273
+258 9 2 11 11 278 545 687 1274 903 1275
+259 9 2 11 11 35 211 693 214 1276 1277
+260 9 2 11 11 507 785 757 1105 1278 1279
+261 9 2 11 11 407 602 601 1280 997 1281
+262 9 2 11 11 511 715 581 1282 1057 1283
+263 9 2 11 11 37 225 612 227 1284 1285
+264 9 2 11 11 9 559 568 1286 1287 1288
+265 9 2 11 11 25 562 165 1289 1290 168
+266 9 2 11 11 745 833 803 1291 1292 1293
+267 9 2 11 11 547 676 786 1294 1295 1296
+268 9 2 11 11 61 583 321 1297 1298 324
+269 9 2 11 11 542 763 697 1108 983 989
+270 9 2 11 11 316 831 782 1299 1300 1301
+271 9 2 11 11 547 548 676 1302 1270 1294
+272 9 2 11 11 750 826 845 1303 1304 1305
+273 9 2 11 11 565 712 651 1306 1307 1044
+274 9 2 11 11 501 802 851 1170 1203 1080
+275 9 2 11 11 335 336 573 355 865 1166
+276 9 2 11 11 17 109 529 110 1247 1308
+277 9 2 11 11 511 581 664 1283 1309 1310
+278 9 2 11 11 337 586 675 1311 1312 923
+279 9 2 11 11 15 241 95 1179 1313 98
+280 9 2 11 11 225 597 612 1314 1315 1284
+281 9 2 11 11 587 692 653 1316 1317 1004
+282 9 2 11 11 332 614 669 1318 1174 1319
+283 9 2 11 11 514 831 584 1235 1320 1321
+284 9 2 11 11 549 564 695 1133 1322 1206
+285 9 2 11 11 751 813 771 1323 1324 1325
+286 9 2 11 11 537 690 708 1326 1327 1328
+287 9 2 11 11 800 802 841 1329 1169 914
+288 9 2 11 11 558 757 785 1253 1278 1330
+289 9 2 11 11 520 683 652 1142 1331 1120
+290 9 2 11 11 503 553 588 1332 1333 1334
+291 9 2 11 11 665 854 739 1187 1335 1336
+292 9 2 11 11 504 661 651 1028 1045 1337
+293 9 2 11 11 500 644 755 1338 1040 1339
+294 9 2 11 11 810 852 813 1340 1341 946
+295 9 2 11 11 529 708 690 1246 1327 1342
+296 9 2 11 11 488 677 748 1343 891 1344
+297 9 2 11 11 137 669 564 1113 1173 1345
+298 9 2 11 11 517 619 730 1257 1346 1347
+299 9 2 11 11 39 575 231 1093 1086 234
+300 9 2 11 11 636 651 796 1348 1349 1350
+301 9 2 11 11 52 278 607 279 1351 1352
+302 9 2 11 11 818 846 834 1353 1354 860
+303 9 2 11 11 626 656 804 1138 1355 1223
+304 9 2 11 11 112 266 45 1356 268 1066
+305 9 2 11 11 149 150 623 152 931 1357
+306 9 2 11 11 506 703 764 1358 1359 1360
+307 9 2 11 11 19 266 112 1361 1356 114
+308 9 2 11 11 169 170 699 173 1362 1363
+309 9 2 11 11 826 835 845 1364 1365 1304
+310 9 2 11 11 420 525 589 1219 1366 1367
+311 9 2 11 11 284 483 677 1368 1369 1370
+312 9 2 11 11 745 803 805 1293 1371 1372
+313 9 2 11 11 530 657 740 1373 1374 1375
+314 9 2 11 11 759 805 803 1053 1371 1376
+315 9 2 11 11 159 160 605 162 1013 1377
+316 9 2 11 11 508 625 738 936 1378 1379
+317 9 2 11 11 445 499 674 1380 1198 1381
+318 9 2 11 11 563 649 722 1261 1026 1382
+319 9 2 11 11 574 675 586 1383 1312 912
+320 9 2 11 11 740 839 807 1384 1385 1386
+321 9 2 11 11 745 804 833 1224 1387 1291
+322 9 2 11 11 53 281 486 282 1388 1213
+323 9 2 11 11 331 669 594 1389 1112 1390
+324 9 2 11 11 269 717 621 1266 1391 1392
+325 9 2 11 11 803 833 853 1292 1393 1394
+326 9 2 11 11 25 149 721 151 1273 1395
+327 9 2 11 11 506 764 824 1360 1396 1397
+328 9 2 11 11 236 686 658 1148 1398 1399
+329 9 2 11 11 56 527 717 1157 1400 1191
+330 9 2 11 11 518 668 637 1401 1402 1211
+331 9 2 11 11 241 37 95 244 1403 1313
+332 9 2 11 11 278 687 607 1275 1404 1351
+333 9 2 11 11 563 722 678 1382 1405 1189
+334 9 2 11 11 497 805 758 1406 1048 1407
+335 9 2 11 11 483 737 677 1408 1409 1369
+336 9 2 11 11 817 842 855 1410 1411 1412
+337 9 2 11 11 41 245 263 246 1154 1413
+338 9 2 11 11 739 854 837 1335 867 1414
+339 9 2 11 11 225 408 597 876 1415 1314
+340 9 2 11 11 39 235 580 237 1416 1248
+341 9 2 11 11 710 751 771 1417 1325 1194
+342 9 2 11 11 567 775 615 1418 1419 999
+343 9 2 11 11 558 785 659 1330 1032 1420
+344 9 2 11 11 485 771 813 1421 1324 1422
+345 9 2 11 11 378 542 540 1423 988 1424
+346 9 2 11 11 211 492 693 1425 1426 1276
+347 9 2 11 11 315 316 691 318 1427 1428
+348 9 2 11 11 633 762 724 1429 1250 1430
+349 9 2 11 11 797 839 834 1431 861 1432
+350 9 2 11 11 374 654 490 1433 1242 1434
+351 9 2 11 11 284 677 488 1370 1343 1435
+352 9 2 11 11 519 593 582 1002 1436 1437
+353 9 2 11 11 585 587 700 1438 1439 1122
+354 9 2 11 11 41 569 254 1440 1037 256
+355 9 2 11 11 615 775 714 1419 1441 1442
+356 9 2 11 11 754 825 820 896 1443 1444
+357 9 2 11 11 121 651 636 1445 1348 1446
+358 9 2 11 11 50 611 269 1110 1265 271
+359 9 2 11 11 761 847 812 1447 1448 1449
+360 9 2 11 11 377 540 522 1450 1117 1451
+361 9 2 11 11 61 305 546 307 1452 1453
+362 9 2 11 11 651 712 796 1307 1454 1349
+363 9 2 11 11 49 545 278 1455 1274 280
+364 9 2 11 11 130 577 608 944 1456 1457
+365 9 2 11 11 449 622 538 959 1029 1458
+366 9 2 11 11 749 767 777 1459 1460 1461
+367 9 2 11 11 281 628 486 1462 1463 1388
+368 9 2 11 11 744 808 850 1464 1465 1466
+369 9 2 11 11 416 620 417 1467 917 436
+370 9 2 11 11 64 714 584 1468 1469 1470
+371 9 2 11 11 11 83 487 84 1136 898
+372 9 2 11 11 484 778 663 1471 1230 1472
+373 9 2 11 11 557 782 831 1473 1300 1234
+374 9 2 11 11 32 704 544 1474 1475 1476
+375 9 2 11 11 154 655 516 1477 1478 951
+376 9 2 11 11 64 584 831 1470 1320 1479
+377 9 2 11 11 219 220 598 223 1480 1481
+378 9 2 11 11 331 332 669 351 1319 1389
+379 9 2 11 11 526 700 587 1482 1439 1003
+380 9 2 11 11 411 575 412 1087 1483 431
+381 9 2 11 11 63 653 525 859 1484 1485
+382 9 2 11 11 589 653 692 1486 1317 1487
+383 9 2 11 11 43 251 511 252 1488 1489
+384 9 2 11 11 826 842 835 1490 1491 1364
+385 9 2 11 11 27 718 155 1492 1493 158
+386 9 2 11 11 32 544 623 1476 1494 1495
+387 9 2 11 11 592 678 722 1496 1405 1497
+388 9 2 11 11 562 703 595 1498 1499 1500
+389 9 2 11 11 55 483 284 1501 1368 286
+390 9 2 11 11 142 603 599 1502 1503 1504
+391 9 2 11 11 32 190 704 193 1505 1474
+392 9 2 11 11 609 622 688 1506 958 1507
+393 9 2 11 11 20 573 572 1508 864 1509
+394 9 2 11 11 744 851 808 1510 1202 1464
+395 9 2 11 11 376 522 521 1511 1221 1512
+396 9 2 11 11 31 570 732 888 1076 1513
+397 9 2 11 11 28 592 722 1514 1497 1515
+398 9 2 11 11 744 850 815 1466 1516 1517
+399 9 2 11 11 316 782 691 1301 1518 1427
+400 9 2 11 11 379 585 542 1519 1106 1520
+401 9 2 11 11 452 657 530 1521 1373 1522
+402 9 2 11 11 530 740 807 1375 1386 1523
+403 9 2 11 11 16 497 100 1524 1525 103
+404 9 2 11 11 254 586 590 1038 1526 1527
+405 9 2 11 11 35 693 567 1277 1528 1529
+406 9 2 11 11 415 593 620 1530 970 1531
+407 9 2 11 11 606 691 782 1532 1518 1533
+408 9 2 11 11 536 752 856 1239 1534 1535
+409 9 2 11 11 128 129 702 132 1536 1537
+410 9 2 11 11 47 571 260 1538 1539 262
+411 9 2 11 11 198 199 726 202 1540 1541
+412 9 2 11 11 122 504 651 1542 1337 1543
+413 9 2 11 11 14 602 90 998 1544 93
+414 9 2 11 11 532 685 780 1545 1546 1547
+415 9 2 11 11 446 674 588 1548 1549 1550
+416 9 2 11 11 451 538 536 1551 1199 1552
+417 9 2 11 11 487 749 627 1553 1554 1555
+418 9 2 11 11 251 715 511 1556 1282 1488
+419 9 2 11 11 330 599 603 1557 1503 1558
+420 9 2 11 11 521 665 739 1222 1336 1559
+421 9 2 11 11 803 853 836 1394 1560 1561
+422 9 2 11 11 13 509 645 1562 1563 948
+423 9 2 11 11 573 728 638 1564 1565 1167
+424 9 2 11 11 211 212 492 215 1116 1425
+425 9 2 11 11 562 774 764 1566 1567 1568
+426 9 2 11 11 519 582 683 1437 1569 1570
+427 9 2 11 11 122 123 504 126 1571 1542
+428 9 2 11 11 487 631 749 1135 1572 1553
+429 9 2 11 11 235 236 658 238 1399 1573
+430 9 2 11 11 458 558 659 1574 1420 1575
+431 9 2 11 11 27 555 718 1576 1577 1492
+432 9 2 11 11 251 591 715 1578 1035 1556
+433 9 2 11 11 29 508 639 871 1579 1580
+434 9 2 11 11 562 764 703 1568 1359 1498
+435 9 2 11 11 99 100 524 102 1581 1582
+436 9 2 11 11 58 782 557 1583 1473 1584
+437 9 2 11 11 74 553 503 1585 1332 1586
+438 9 2 11 11 672 819 756 1587 1588 1589
+439 9 2 11 11 640 777 767 1590 1460 1591
+440 9 2 11 11 60 302 617 303 1592 1593
+441 9 2 11 11 170 513 699 1594 1595 1362
+442 9 2 11 11 560 787 596 1596 1597 1598
+443 9 2 11 11 315 691 526 1428 1599 1600
+444 9 2 11 11 806 848 845 1601 1602 1603
+445 9 2 11 11 191 192 501 195 1074 1079
+446 9 2 11 11 40 240 495 242 1604 1605
+447 9 2 11 11 375 521 654 1606 1607 1608
+448 9 2 11 11 190 191 493 194 1022 1609
+449 9 2 11 11 600 627 766 1610 1611 1612
+450 9 2 11 11 540 697 788 990 1613 1118
+451 9 2 11 11 118 502 728 1614 1615 1616
+452 9 2 11 11 560 561 787 1617 1159 1596
+453 9 2 11 11 523 771 796 1195 1618 1619
+454 9 2 11 11 405 681 705 1620 1621 1622
+455 9 2 11 11 811 832 845 1623 1624 1625
+456 9 2 11 11 588 674 635 1549 1626 1627
+457 9 2 11 11 639 798 841 1628 915 1217
+458 9 2 11 11 811 845 848 1625 1602 1629
+459 9 2 11 11 642 758 765 1630 1631 1632
+460 9 2 11 11 566 794 719 1633 1634 1635
+461 9 2 11 11 456 484 663 1636 1472 1637
+462 9 2 11 11 498 855 842 1090 1411 1638
+463 9 2 11 11 503 588 635 1334 1627 1639
+464 9 2 11 11 562 721 774 1640 1641 1566
+465 9 2 11 11 220 711 598 956 1642 1480
+466 9 2 11 11 404 596 681 1643 1644 1645
+467 9 2 11 11 415 582 593 1646 1436 1530
+468 9 2 11 11 484 666 741 1647 1648 1649
+469 9 2 11 11 121 122 651 125 1543 1445
+470 9 2 11 11 566 719 664 1635 1650 1059
+471 9 2 11 11 381 589 692 1651 1487 1652
+472 9 2 11 11 490 781 667 1653 1654 1655
+473 9 2 11 11 64 320 714 322 1656 1468
+474 9 2 11 11 534 672 756 1657 1589 1658
+475 9 2 11 11 761 812 854 1449 940 1186
+476 9 2 11 11 485 813 743 1422 1659 1130
+477 9 2 11 11 500 816 641 1660 1661 1662
+478 9 2 11 11 506 824 777 1397 1663 1664
+479 9 2 11 11 521 739 654 1559 1665 1607
+480 9 2 11 11 61 546 583 1453 1666 1297
+481 9 2 11 11 23 537 130 1667 942 134
+482 9 2 11 11 535 760 768 1145 1668 1669
+483 9 2 11 11 592 720 707 1670 1671 1672
+484 9 2 11 11 508 798 639 1673 1628 1579
+485 9 2 11 11 58 606 782 1674 1533 1583
+486 9 2 11 11 24 594 137 1675 1111 141
+487 9 2 11 11 21 485 144 1676 1008 148
+488 9 2 11 11 451 536 657 1552 1677 1678
+489 9 2 11 11 328 685 532 1679 1545 1680
+490 9 2 11 11 641 816 849 1661 1681 1682
+491 9 2 11 11 296 496 632 1683 1684 1685
+492 9 2 11 11 30 535 643 1686 1687 1688
+493 9 2 11 11 49 555 733 1689 1690 1691
+494 9 2 11 11 750 845 832 1305 1624 1692
+495 9 2 11 11 198 726 580 1541 1693 1694
+496 9 2 11 11 555 621 718 1695 1696 1577
+497 9 2 11 11 33 543 220 1697 954 224
+498 9 2 11 11 165 595 702 1698 1699 1700
+499 9 2 11 11 330 594 599 1701 1702 1557
+500 9 2 11 11 22 640 123 1703 1704 127
+501 9 2 11 11 378 379 542 398 1520 1423
+502 9 2 11 11 22 506 640 1705 1706 1703
+503 9 2 11 11 212 213 498 216 1091 1240
+504 9 2 11 11 499 670 810 1707 1708 1709
+505 9 2 11 11 170 171 513 174 1710 1594
+506 9 2 11 11 801 837 820 1711 883 1712
+507 9 2 11 11 149 623 544 1357 1494 1271
+508 9 2 11 11 206 680 583 974 1713 1714
+509 9 2 11 11 741 833 809 1715 1716 1717
+510 9 2 11 11 46 528 257 1718 1149 259
+511 9 2 11 11 534 756 670 1658 1719 1720
+512 9 2 11 11 64 831 316 1479 1299 319
+513 9 2 11 11 164 608 577 1721 1456 1204
+514 9 2 11 11 260 571 709 1539 1722 1723
+515 9 2 11 11 500 755 816 1339 1724 1660
+516 9 2 11 11 415 620 416 1531 1467 435
+517 9 2 11 11 377 378 540 397 1424 1450
+518 9 2 11 11 526 691 700 1599 1725 1482
+519 9 2 11 11 621 717 789 1391 1726 1727
+520 9 2 11 11 380 587 585 1728 1438 1729
+521 9 2 11 11 164 702 608 1730 1731 1721
+522 9 2 11 11 741 853 833 1732 1393 1715
+523 9 2 11 11 36 641 213 1733 1180 217
+524 9 2 11 11 36 500 641 1734 1662 1733
+525 9 2 11 11 29 639 192 1580 1216 196
+526 9 2 11 11 446 588 447 1550 1735 466
+527 9 2 11 11 508 738 798 1379 1736 1673
+528 9 2 11 11 219 598 682 1481 1737 1738
+529 9 2 11 11 25 721 562 1395 1640 1289
+530 9 2 11 11 642 765 698 1632 992 1739
+531 9 2 11 11 536 856 657 1535 1740 1677
+532 9 2 11 11 636 796 771 1350 1618 1741
+533 9 2 11 11 755 838 816 1742 1743 1724
+534 9 2 11 11 738 834 798 1744 1745 1736
+535 9 2 11 11 793 801 821 1746 1747 1748
+536 9 2 11 11 631 767 749 1749 1459 1572
+537 9 2 11 11 54 505 281 1750 1751 283
+538 9 2 11 11 28 722 160 1515 1025 163
+539 9 2 11 11 744 815 844 1517 1752 1753
+540 9 2 11 11 541 633 697 1754 1755 1756
+541 9 2 11 11 19 618 266 1757 1758 1361
+542 9 2 11 11 376 377 522 396 1451 1511
+543 9 2 11 11 450 538 451 1759 1551 470
+544 9 2 11 11 449 538 450 1458 1759 469
+545 9 2 11 11 28 720 592 1220 1670 1514
+546 9 2 11 11 637 668 830 1402 874 1760
+547 9 2 11 11 511 664 719 1310 1650 1761
+548 9 2 11 11 525 653 589 1484 1486 1366
+549 9 2 11 11 58 296 606 297 1762 1674
+550 9 2 11 11 104 105 656 107 1763 1137
+551 9 2 11 11 412 575 652 1483 1121 1764
+552 9 2 11 11 635 674 784 1626 1197 1765
+553 9 2 11 11 704 744 774 1766 1767 1768
+554 9 2 11 11 607 687 709 1404 1769 1770
+555 9 2 11 11 506 777 640 1664 1590 1706
+556 9 2 11 11 302 734 617 1771 1772 1592
+557 9 2 11 11 321 583 680 1298 1713 1160
+558 9 2 11 11 159 624 733 1773 1774 1775
+559 9 2 11 11 535 768 643 1669 1052 1687
+560 9 2 11 11 459 659 561 1776 1096 1777
+561 9 2 11 11 522 788 724 1119 1778 1014
+562 9 2 11 11 552 830 671 1779 873 1780
+563 9 2 11 11 37 612 95 1285 1781 1403
+564 9 2 11 11 404 560 596 1782 1598 1643
+565 9 2 11 11 65 609 688 1783 1507 1784
+566 9 2 11 11 454 666 484 1785 1647 1786
+567 9 2 11 11 793 837 801 1787 1711 1746
+568 9 2 11 11 320 321 615 323 1161 1788
+569 9 2 11 11 654 739 793 1665 1789 1243
+570 9 2 11 11 807 839 843 1385 1790 1791
+571 9 2 11 11 550 634 825 1792 1793 895
+572 9 2 11 11 136 137 564 140 1345 1132
+573 9 2 11 11 375 376 521 395 1512 1606
+574 9 2 11 11 457 663 558 1794 1252 1795
+575 9 2 11 11 240 731 495 1796 1797 1604
+576 9 2 11 11 407 597 408 1798 1415 427
+577 9 2 11 11 492 750 823 1799 1800 1801
+578 9 2 11 11 670 756 810 1719 1802 1708
+579 9 2 11 11 338 590 586 1803 1526 1804
+580 9 2 11 11 159 605 624 1377 1805 1773
+581 9 2 11 11 372 490 667 1806 1655 1807
+582 9 2 11 11 532 819 672 1808 1587 1809
+583 9 2 11 11 621 789 718 1727 1165 1696
+584 9 2 11 11 35 567 206 1529 972 210
+585 9 2 11 11 460 561 560 1810 1617 1811
+586 9 2 11 11 329 330 603 349 1558 1812
+587 9 2 11 11 30 643 171 1688 1813 175
+588 9 2 11 11 515 685 603 1814 1815 1816
+589 9 2 11 11 100 642 524 1817 1818 1581
+590 9 2 11 11 739 837 793 1414 1787 1789
+591 9 2 11 11 778 809 804 1819 1820 1821
+592 9 2 11 11 329 603 685 1812 1815 1822
+593 9 2 11 11 627 815 850 1823 1516 1824
+594 9 2 11 11 190 493 704 1609 1825 1505
+595 9 2 11 11 404 681 405 1645 1620 424
+596 9 2 11 11 380 692 587 1826 1316 1728
+597 9 2 11 11 516 655 769 1478 1085 1827
+598 9 2 11 11 48 266 618 267 1758 932
+599 9 2 11 11 320 615 714 1788 1442 1656
+600 9 2 11 11 19 574 618 1828 1829 1757
+601 9 2 11 11 27 159 733 161 1775 1830
+602 9 2 11 11 747 842 817 1831 1410 1832
+603 9 2 11 11 332 333 614 352 1833 1318
+604 9 2 11 11 54 696 505 1834 1835 1750
+605 9 2 11 11 406 602 407 1836 1280 426
+606 9 2 11 11 530 807 666 1523 1837 1838
+607 9 2 11 11 505 696 747 1835 1007 1839
+608 9 2 11 11 22 128 703 131 1840 1841
+609 9 2 11 11 334 335 638 354 1168 966
+610 9 2 11 11 481 759 625 1842 1843 935
+611 9 2 11 11 29 169 481 172 1844 869
+612 9 2 11 11 514 630 701 1845 1846 1847
+613 9 2 11 11 50 272 550 273 1848 1171
+614 9 2 11 11 405 705 406 1622 1849 425
+615 9 2 11 11 379 380 585 399 1729 1519
+616 9 2 11 11 445 674 446 1381 1548 465
+617 9 2 11 11 177 682 598 1850 1737 1851
+618 9 2 11 11 807 843 853 1791 1852 1853
+619 9 2 11 11 31 183 517 186 1258 887
+620 9 2 11 11 77 494 647 1854 1855 1856
+621 9 2 11 11 414 582 415 1857 1646 434
+622 9 2 11 11 836 853 843 1560 1852 1858
+623 9 2 11 11 33 686 543 1859 1860 1697
+624 9 2 11 11 493 851 744 1021 1510 1861
+625 9 2 11 11 567 693 775 1528 1862 1418
+626 9 2 11 11 272 539 550 1863 1864 1848
+627 9 2 11 11 492 826 750 1115 1303 1799
+628 9 2 11 11 484 741 809 1649 1717 1865
+629 9 2 11 11 537 708 707 1328 1866 1867
+630 9 2 11 11 503 635 710 1639 1868 1869
+631 9 2 11 11 118 728 573 1616 1564 1870
+632 9 2 11 11 374 375 654 394 1608 1433
+633 9 2 11 11 490 821 781 1871 1872 1653
+634 9 2 11 11 34 204 519 207 1873 1874
+635 9 2 11 11 505 747 628 1839 1875 1876
+636 9 2 11 11 630 775 770 1877 1878 1879
+637 9 2 11 11 44 727 591 1880 1881 1882
+638 9 2 11 11 520 679 726 881 1883 1884
+639 9 2 11 11 47 245 571 1155 1068 1538
+640 9 2 11 11 547 786 673 1296 1885 1886
+641 9 2 11 11 330 331 594 350 1390 1701
+642 9 2 11 11 154 155 655 157 1887 1477
+643 9 2 11 11 205 206 583 209 1714 1226
+644 9 2 11 11 33 197 686 200 1888 1859
+645 9 2 11 11 302 482 734 1889 1890 1771
+646 9 2 11 11 339 727 590 1891 1892 1893
+647 9 2 11 11 337 338 586 357 1804 1311
+648 9 2 11 11 413 582 414 1019 1857 433
+649 9 2 11 11 77 647 559 1856 964 1894
+650 9 2 11 11 627 850 808 1824 1465 1895
+651 9 2 11 11 756 852 810 1896 1340 1802
+652 9 2 11 11 26 154 730 156 953 1897
+653 9 2 11 11 367 552 671 1898 1780 1899
+654 9 2 11 11 412 652 413 1764 1017 432
+655 9 2 11 11 453 530 666 1900 1838 1901
+656 9 2 11 11 576 664 581 1077 1309 1902
+657 9 2 11 11 443 670 499 1903 1707 1904
+658 9 2 11 11 543 686 760 1860 1905 1103
+659 9 2 11 11 457 558 458 1795 1574 477
+660 9 2 11 11 333 334 614 353 968 1833
+661 9 2 11 11 169 699 481 1363 1906 1844
+662 9 2 11 11 513 765 758 1907 1631 1908
+663 9 2 11 11 738 797 834 1909 1432 1744
+664 9 2 11 11 326 532 672 1910 1809 1911
+665 9 2 11 11 451 657 452 1678 1521 471
+666 9 2 11 11 459 561 460 1777 1810 479
+667 9 2 11 11 801 820 825 1712 1443 1912
+668 9 2 11 11 34 519 683 1874 1570 1141
+669 9 2 11 11 458 659 459 1575 1776 478
+670 9 2 11 11 164 165 702 167 1700 1730
+671 9 2 11 11 548 667 779 1913 1914 1268
+672 9 2 11 11 55 723 483 1915 1916 1501
+673 9 2 11 11 46 713 528 1917 1918 1718
+674 9 2 11 11 420 589 421 1367 1919 440
+675 9 2 11 11 128 702 595 1537 1699 1920
+676 9 2 11 11 155 718 655 1493 1164 1887
+677 9 2 11 11 296 632 606 1685 1921 1762
+678 9 2 11 11 369 547 673 1922 1886 1923
+679 9 2 11 11 627 749 815 1554 1924 1823
+680 9 2 11 11 31 732 178 1513 1925 182
+681 9 2 11 11 537 707 720 1867 1671 975
+682 9 2 11 11 660 753 769 1926 1927 1928
+683 9 2 11 11 546 706 583 995 1227 1666
+684 9 2 11 11 373 374 490 393 1434 1929
+685 9 2 11 11 372 373 490 392 1929 1806
+686 9 2 11 11 371 667 548 1930 1913 1931
+687 9 2 11 11 634 781 821 1932 1872 1933
+688 9 2 11 11 2 589 382 1934 1935 402
+689 9 2 11 11 2 421 589 441 1919 1934
+690 9 2 11 11 380 381 692 400 1652 1826
+691 9 2 11 11 381 382 589 401 1935 1651
+692 9 2 11 11 666 807 741 1837 1936 1648
+693 9 2 11 11 484 809 778 1865 1819 1471
+694 9 2 11 11 456 663 457 1637 1794 476
+695 9 2 11 11 57 482 302 1937 1889 304
+696 9 2 11 11 26 619 150 1938 1229 153
+697 9 2 11 11 5 553 74 1939 1585 76
+698 9 2 11 11 625 803 836 1940 1561 1941
+699 9 2 11 11 403 560 404 1942 1782 423
+700 9 2 11 11 328 329 685 348 1822 1679
+701 9 2 11 11 3 560 403 1943 1942 422
+702 9 2 11 11 3 460 560 480 1811 1943
+703 9 2 11 11 516 769 828 1827 1944 1945
+704 9 2 11 11 753 828 769 1264 1944 1927
+705 9 2 11 11 485 636 771 1946 1741 1421
+706 9 2 11 11 517 730 646 1347 1947 884
+707 9 2 11 11 527 769 789 1948 1084 1949
+708 9 2 11 11 366 671 566 1950 1951 1952
+709 9 2 11 11 30 662 535 1953 1144 1686
+710 9 2 11 11 339 340 727 359 1954 1891
+711 9 2 11 11 566 671 794 1951 878 1633
+712 9 2 11 11 338 339 590 358 1893 1803
+713 9 2 11 11 761 822 847 1126 1955 1447
+714 9 2 11 11 741 807 853 1936 1853 1732
+715 9 2 11 11 340 341 591 360 1036 1956
+716 9 2 11 11 343 576 581 1957 1902 1958
+717 9 2 11 11 524 716 604 1959 1960 1961
+718 9 2 11 11 454 484 455 1786 1962 474
+719 9 2 11 11 452 530 453 1522 1900 472
+720 9 2 11 11 455 484 456 1962 1636 475
+721 9 2 11 11 552 673 792 1963 1964 1965
+722 9 2 11 11 798 834 846 1745 1354 892
+723 9 2 11 11 443 499 444 1904 1966 463
+724 9 2 11 11 453 666 454 1901 1785 473
+725 9 2 11 11 46 533 713 1967 1968 1917
+726 9 2 11 11 371 372 667 391 1807 1930
+727 9 2 11 11 105 507 656 1969 1970 1763
+728 9 2 11 11 444 499 445 1966 1380 464
+729 9 2 11 11 326 327 532 346 1971 1910
+730 9 2 11 11 327 328 532 347 1680 1971
+731 9 2 11 11 368 673 552 1972 1963 1973
+732 9 2 11 11 502 695 791 1207 1974 1975
+733 9 2 11 11 442 534 670 1976 1720 1977
+734 9 2 11 11 777 824 815 1663 1978 1979
+735 9 2 11 11 371 548 547 1931 1302 1980
+736 9 2 11 11 637 830 792 1760 1981 1982
+737 9 2 11 11 44 254 727 255 1983 1880
+738 9 2 11 11 325 672 534 1984 1657 1985
+739 9 2 11 11 552 792 830 1965 1981 1779
+740 9 2 11 11 625 759 803 1843 1376 1940
+741 9 2 11 11 21 121 636 124 1446 1986
+742 9 2 11 11 657 856 740 1740 1987 1374
+743 9 2 11 11 42 518 684 1988 1129 1259
+744 9 2 11 11 143 144 515 147 1237 1989
+745 9 2 11 11 177 178 682 181 1990 1850
+746 9 2 11 11 128 595 703 1920 1499 1840
+747 9 2 11 11 747 806 835 1006 1991 1992
+748 9 2 11 11 509 681 596 1061 1644 1993
+749 9 2 11 11 197 198 658 201 1994 1995
+750 9 2 11 11 495 768 760 1996 1668 1997
+751 9 2 11 11 281 505 628 1751 1876 1462
+752 9 2 11 11 341 342 581 361 1998 1056
+753 9 2 11 11 342 343 581 362 1958 1998
+754 9 2 11 11 365 366 566 385 1952 1058
+755 9 2 11 11 30 176 662 179 1999 1953
+756 9 2 11 11 513 758 699 1908 1047 1595
+757 9 2 11 11 442 670 443 1977 1903 462
+758 9 2 11 11 325 326 672 345 1911 1984
+759 9 2 11 11 366 367 671 386 1899 1950
+760 9 2 11 11 527 660 769 2000 1928 1948
+761 9 2 11 11 748 814 848 2001 2002 2003
+762 9 2 11 11 628 747 817 1875 1832 2004
+763 9 2 11 11 65 688 554 1784 2005 2006
+764 9 2 11 11 367 368 552 387 1973 1898
+765 9 2 11 11 54 488 696 2007 2008 1834
+766 9 2 11 11 23 135 690 138 2009 2010
+767 9 2 11 11 770 823 832 2011 2012 2013
+768 9 2 11 11 53 660 290 2014 2015 292
+769 9 2 11 11 740 840 839 2016 909 1384
+770 9 2 11 11 673 786 792 1885 2017 1964
+771 9 2 11 11 368 369 673 388 1923 1972
+772 9 2 11 11 364 365 576 384 1078 2018
+773 9 2 11 11 1 364 576 383 2018 2019
+774 9 2 11 11 1 576 343 2019 1957 363
+775 9 2 11 11 54 284 488 285 1435 2007
+776 9 2 11 11 370 371 547 390 1980 2020
+777 9 2 11 11 369 370 547 389 2020 1922
+778 9 2 11 11 4 534 442 2021 1976 461
+779 9 2 11 11 4 325 534 344 1985 2021
+780 9 2 11 11 99 524 604 1582 1961 1210
+781 9 2 11 11 490 793 821 1244 1748 1871
+782 9 2 11 11 514 584 630 1321 2022 1845
+783 9 2 11 11 524 698 716 2023 979 1959
+784 9 2 11 11 625 836 797 1941 2024 2025
+785 9 2 11 11 176 177 598 180 1851 2026
+786 9 2 11 11 18 678 531 1190 2027 2028
+787 9 2 11 11 178 732 682 1925 2029 1990
+788 9 2 11 11 499 810 784 1709 945 1196
+789 9 2 11 11 235 658 580 1573 2030 1416
+790 9 2 11 11 600 766 629 1612 2031 2032
+791 9 2 11 11 613 729 631 2033 2034 938
+792 9 2 11 11 515 650 780 1236 2035 2036
+793 9 2 11 11 804 809 833 1820 1716 1387
+794 9 2 11 11 63 315 526 317 1600 857
+795 9 2 11 11 340 591 727 1956 1881 1954
+796 9 2 11 11 515 780 685 2036 1546 1814
+797 9 2 11 11 748 848 806 2003 1601 2037
+798 9 2 11 11 539 634 550 2038 1792 1864
+799 9 2 11 11 40 495 648 1605 2039 2040
+800 9 2 11 11 90 602 705 1544 2041 2042
+801 9 2 11 11 52 578 275 2043 2044 277
+802 9 2 11 11 797 843 839 2045 1790 1431
+803 9 2 11 11 545 733 624 2046 1774 901
+804 9 2 11 11 677 737 829 1409 2047 1055
+805 9 2 11 11 254 590 727 1527 1892 1983
+806 9 2 11 11 17 502 118 2048 1614 120
+807 9 2 11 11 752 840 856 2049 2050 1534
+808 9 2 11 11 34 520 199 1143 2051 203
+809 9 2 11 11 36 218 644 221 2052 2053
+810 9 2 11 11 51 539 272 2054 1863 274
+811 9 2 11 11 629 766 802 2031 2055 2056
+812 9 2 11 11 51 676 539 2057 2058 2054
+813 9 2 11 11 704 774 721 1768 1641 2059
+814 9 2 11 11 776 800 846 2060 893 2061
+815 9 2 11 11 275 578 510 2044 2062 2063
+816 9 2 11 11 198 580 658 1694 2030 1994
+817 9 2 11 11 488 748 696 1344 2064 2008
+818 9 2 11 11 667 781 779 1654 2065 1914
+819 9 2 11 11 21 636 485 1986 1946 1676
+820 9 2 11 11 63 525 311 1485 2066 314
+821 9 2 11 11 625 797 738 2025 1909 1378
+822 9 2 11 11 497 745 805 2067 1372 1406
+823 9 2 11 11 512 719 794 2068 1634 2069
+824 9 2 11 11 510 578 637 2062 1212 2070
+825 9 2 11 11 806 845 835 1603 1365 1991
+826 9 2 11 11 495 760 648 1997 2071 2039
+827 9 2 11 11 510 786 676 2072 1295 2073
+828 9 2 11 11 512 794 668 2069 877 2074
+829 9 2 11 11 40 648 236 2040 1146 239
+830 9 2 11 11 630 714 775 2075 1441 1877
+831 9 2 11 11 43 719 512 2076 2068 2077
+832 9 2 11 11 743 813 852 1659 1341 2078
+833 9 2 11 11 696 748 806 2064 2037 1005
+834 9 2 11 11 240 616 731 2079 2080 1796
+835 9 2 11 11 13 89 509 91 1062 1562
+836 9 2 11 11 43 511 719 1489 1761 2076
+837 9 2 11 11 529 690 549 1342 2081 1070
+838 9 2 11 11 627 808 766 1895 2082 1611
+839 9 2 11 11 36 644 500 2053 1338 1734
+840 9 2 11 11 16 626 497 2083 2084 1524
+841 9 2 11 11 634 821 825 1933 2085 1793
+842 9 2 11 11 539 676 779 2058 1269 2086
+843 9 2 11 11 51 275 510 276 2063 2087
+844 9 2 11 11 42 248 518 249 2088 1988
+845 9 2 11 11 510 792 786 2089 2017 2072
+846 9 2 11 11 650 743 780 1131 2090 2035
+847 9 2 11 11 801 825 821 1912 2085 1747
+848 9 2 11 11 648 760 686 2071 1905 1147
+849 9 2 11 11 51 510 676 2087 2073 2057
+850 9 2 11 11 797 836 843 2024 1858 2045
+851 9 2 11 11 507 757 656 1279 2091 1970
+852 9 2 11 11 7 579 68 2092 1023 70
+853 9 2 11 11 218 219 682 222 1738 2093
+854 9 2 11 11 129 608 702 2094 1731 1536
+855 9 2 11 11 55 551 723 2095 2096 1915
+856 9 2 11 11 10 491 689 2097 2098 2099
+857 9 2 11 11 742 814 799 2100 2101 2102
+858 9 2 11 11 736 814 742 2103 2100 2104
+859 9 2 11 11 509 596 787 1993 1597 2105
+860 9 2 11 11 495 731 716 1797 2106 2107
+861 9 2 11 11 512 668 518 2074 1401 2108
+862 9 2 11 11 43 512 248 2077 2109 250
+863 9 2 11 11 811 848 814 1629 2002 2110
+864 9 2 11 11 812 847 829 1448 1081 2111
+865 9 2 11 11 493 744 704 1861 1766 1825
+866 9 2 11 11 776 846 818 2061 1353 2112
+867 9 2 11 11 13 507 105 950 1969 108
+868 9 2 11 11 524 642 698 1818 1739 2023
+869 9 2 11 11 770 775 823 1878 2113 2011
+870 9 2 11 11 510 637 792 2070 1982 2089
+871 9 2 11 11 176 711 662 2114 1043 1999
+872 9 2 11 11 497 626 745 2084 1225 2067
+873 9 2 11 11 53 753 660 1215 1926 2014
+874 9 2 11 11 248 512 518 2109 2108 2088
+875 9 2 11 11 656 757 804 2091 2115 1355
+876 9 2 11 11 46 260 533 261 2116 1967
+877 9 2 11 11 44 591 251 1882 1578 253
+878 9 2 11 11 16 104 626 106 1139 2083
+879 9 2 11 11 701 770 783 2117 2118 2119
+880 9 2 11 11 57 514 701 2120 1847 2121
+881 9 2 11 11 12 613 83 928 937 85
+882 9 2 11 11 495 716 768 2107 978 1996
+883 9 2 11 11 23 690 537 2010 1326 1667
+884 9 2 11 11 32 623 185 1495 930 189
+885 9 2 11 11 45 257 563 258 1262 1064
+886 9 2 11 11 743 852 819 2078 2122 2123
+887 9 2 11 11 6 609 65 962 1783 67
+888 9 2 11 11 240 241 616 243 1178 2079
+889 9 2 11 11 742 799 773 2102 980 2124
+890 9 2 11 11 10 80 491 81 2125 2097
+891 9 2 11 11 486 827 753 2126 1263 1214
+892 9 2 11 11 57 701 482 2121 2127 1937
+893 9 2 11 11 290 660 527 2015 2000 1156
+894 9 2 11 11 743 819 780 2123 2128 2090
+895 9 2 11 11 509 787 645 2105 1158 1563
+896 9 2 11 11 584 714 630 1469 2075 2022
+897 9 2 11 11 22 703 506 1841 1358 1705
+898 9 2 11 11 565 661 579 1046 2129 2130
+899 9 2 11 11 617 734 742 1772 2131 2132
+900 9 2 11 11 49 733 545 1691 2046 1455
+901 9 2 11 11 491 600 629 2133 2032 2134
+902 9 2 11 11 27 733 555 1830 1690 1576
+903 9 2 11 11 539 779 781 2086 2065 2135
+904 9 2 11 11 10 689 494 2099 2136 2137
+905 9 2 11 11 129 130 608 133 1457 2094
+906 9 2 11 11 176 598 711 2026 1642 2114
+907 9 2 11 11 629 802 800 2056 1329 2138
+908 9 2 11 11 482 736 734 2139 2140 1890
+909 9 2 11 11 19 115 574 116 2141 1828
+910 9 2 11 11 539 781 634 2135 1932 2038
+911 9 2 11 11 7 71 565 72 2142 2143
+912 9 2 11 11 606 632 691 1921 2144 1532
+913 9 2 11 11 531 678 592 2027 1496 2145
+914 9 2 11 11 766 808 802 2082 1201 2055
+915 9 2 11 11 502 791 728 1975 2146 1615
+916 9 2 11 11 629 800 776 2138 2060 2147
+917 9 2 11 11 752 772 840 2148 2149 2049
+918 9 2 11 11 24 142 599 145 1504 2150
+919 9 2 11 11 17 529 502 1308 1069 2048
+920 9 2 11 11 689 776 818 2151 2112 2152
+921 9 2 11 11 90 705 681 2042 1621 921
+922 9 2 11 11 486 628 827 1463 2153 2126
+923 9 2 11 11 71 712 565 2154 1306 2142
+924 9 2 11 11 633 788 697 2155 1613 1755
+925 9 2 11 11 815 824 844 1978 2156 1752
+926 9 2 11 11 204 706 519 1260 1001 1873
+927 9 2 11 11 18 531 109 2028 2157 111
+928 9 2 11 11 617 742 773 2132 2124 2158
+929 9 2 11 11 630 770 701 1879 2117 1846
+930 9 2 11 11 482 783 736 2159 2160 2139
+931 9 2 11 11 11 600 80 900 2161 82
+932 9 2 11 11 9 568 86 1288 986 88
+933 9 2 11 11 260 709 533 1723 2162 2116
+934 9 2 11 11 7 565 579 2143 2130 2092
+935 9 2 11 11 746 817 849 2163 2164 2165
+936 9 2 11 11 551 754 723 2166 2167 2096
+937 9 2 11 11 135 549 690 1176 2081 2009
+938 9 2 11 11 725 773 822 2168 2169 2170
+939 9 2 11 11 617 773 725 2158 2168 2171
+940 9 2 11 11 572 675 574 924 1383 2172
+941 9 2 11 11 749 777 815 1461 1979 1924
+942 9 2 11 11 26 730 619 1897 1346 1938
+943 9 2 11 11 737 812 829 2173 2111 2047
+944 9 2 11 11 544 704 721 1475 2059 1272
+945 9 2 11 11 579 661 729 2129 906 2174
+946 9 2 11 11 8 74 503 75 1586 2175
+947 9 2 11 11 14 94 601 96 2176 996
+948 9 2 11 11 533 709 687 2162 1769 2177
+949 9 2 11 11 740 856 840 1987 2050 2016
+950 9 2 11 11 491 776 689 2178 2151 2098
+951 9 2 11 11 494 689 772 2136 2179 2180
+952 9 2 11 11 10 494 77 2137 1854 79
+953 9 2 11 11 736 811 814 2181 2110 2103
+954 9 2 11 11 723 820 795 2182 882 2183
+955 9 2 11 11 197 658 686 1995 1398 1888
+956 9 2 11 11 199 520 726 2051 1884 1540
+957 9 2 11 11 494 752 647 2184 1238 1855
+958 9 2 11 11 757 778 804 1231 1821 2115
+959 9 2 11 11 628 817 746 2004 2163 2185
+960 9 2 11 11 734 736 742 2140 2104 2131
+961 9 2 11 11 747 835 842 1992 1491 1831
+962 9 2 11 11 8 523 71 2186 2187 73
+963 9 2 11 11 20 572 115 1509 2188 117
+964 9 2 11 11 527 789 717 1949 1726 1400
+965 9 2 11 11 55 287 551 288 2189 2095
+966 9 2 11 11 491 629 776 2134 2147 2178
+967 9 2 11 11 20 118 573 119 1870 1508
+968 9 2 11 11 571 790 709 1256 2190 1722
+969 9 2 11 11 218 682 644 2093 2191 2052
+970 9 2 11 11 494 772 752 2180 2148 2184
+971 9 2 11 11 533 687 713 2177 2192 1968
+972 9 2 11 11 9 77 559 78 1894 1286
+973 9 2 11 11 817 855 849 1412 2193 2164
+974 9 2 11 11 772 818 840 2194 910 2149
+975 9 2 11 11 60 489 299 2195 2196 301
+976 9 2 11 11 628 746 827 2185 2197 2153
+977 9 2 11 11 48 610 263 934 2198 265
+978 9 2 11 11 57 293 514 294 2199 2120
+979 9 2 11 11 723 754 820 2167 1444 2182
+980 9 2 11 11 736 783 811 2160 2200 2181
+981 9 2 11 11 551 556 694 2201 1102 2202
+982 9 2 11 11 756 819 852 1588 2122 1896
+983 9 2 11 11 59 735 496 2203 2204 2205
+984 9 2 11 11 80 600 491 2161 2133 2125
+985 9 2 11 11 689 818 772 2152 2194 2179
+986 9 2 11 11 8 710 523 2206 1193 2186
+987 9 2 11 11 59 541 735 2207 2208 2203
+988 9 2 11 11 532 780 819 1547 2128 1808
+989 9 2 11 11 635 751 710 2209 1417 1868
+990 9 2 11 11 746 838 827 2210 1182 2197
+991 9 2 11 11 24 599 594 2150 1702 1675
+992 9 2 11 11 607 790 684 2211 1255 2212
+993 9 2 11 11 531 592 707 2145 1672 2213
+994 9 2 11 11 604 716 731 1960 2106 2214
+995 9 2 11 11 109 531 708 2157 2215 1245
+996 9 2 11 11 523 796 712 1619 1454 2216
+997 9 2 11 11 56 556 287 1153 2217 289
+998 9 2 11 11 59 496 296 2205 1683 298
+999 9 2 11 11 59 299 541 300 2218 2207
+1000 9 2 11 11 496 735 763 2204 984 2219
+1001 9 2 11 11 725 822 762 2170 1125 2220
+1002 9 2 11 11 744 844 774 1753 2221 1767
+1003 9 2 11 11 5 65 554 66 2006 2222
+1004 9 2 11 11 783 832 811 2223 1623 2200
+1005 9 2 11 11 633 724 788 1430 1778 2155
+1006 9 2 11 11 693 823 775 2224 2113 1862
+1007 9 2 11 11 115 572 574 2188 2172 2141
+1008 9 2 11 11 94 95 612 97 1781 2225
+1009 9 2 11 11 58 557 293 1584 2226 295
+1010 9 2 11 11 489 633 541 2227 1754 2228
+1011 9 2 11 11 551 694 754 2202 2229 2166
+1012 9 2 11 11 94 612 601 2225 2230 2176
+1013 9 2 11 11 482 701 783 2127 2119 2159
+1014 9 2 11 11 770 832 783 2013 2223 2118
+1015 9 2 11 11 746 849 816 2165 1681 2231
+1016 9 2 11 11 481 699 759 1906 1054 1842
+1017 9 2 11 11 60 617 725 1593 2171 2232
+1018 9 2 11 11 773 847 822 1082 1955 2169
+1019 9 2 11 11 8 503 710 2175 1869 2206
+1020 9 2 11 11 638 728 791 1565 2146 2233
+1021 9 2 11 11 746 816 838 2231 1743 2210
+1022 9 2 11 11 528 713 605 1918 2234 2235
+1023 9 2 11 11 407 601 597 1281 2236 1798
+1024 9 2 11 11 607 709 790 1770 2190 2211
+1025 9 2 11 11 496 763 632 2219 2237 1684
+1026 9 2 11 11 579 729 613 2174 2033 1024
+1027 9 2 11 11 631 729 767 2034 905 1749
+1028 9 2 11 11 71 523 712 2187 2216 2154
+1029 9 2 11 11 60 725 489 2232 2238 2195
+1030 9 2 11 11 492 823 693 1801 2224 1426
+1031 9 2 11 11 483 795 737 2239 2240 1408
+1032 9 2 11 11 580 726 679 1693 1883 1249
+1033 9 2 11 11 489 762 633 2241 1429 2227
+1034 9 2 11 11 287 556 551 2217 2201 2189
+1035 9 2 11 11 764 774 844 1567 2221 2242
+1036 9 2 11 11 564 614 695 1175 2243 1322
+1037 9 2 11 11 641 849 855 1682 2193 1181
+1038 9 2 11 11 483 723 795 1916 2183 2239
+1039 9 2 11 11 614 791 695 2244 1974 2243
+1040 9 2 11 11 531 707 708 2213 1866 2215
+1041 9 2 11 11 299 489 541 2196 2228 2218
+1042 9 2 11 11 737 795 812 2240 941 2173
+1043 9 2 11 11 635 784 751 1765 2245 2209
+1044 9 2 11 11 489 725 762 2238 2220 2241
+1045 9 2 11 11 293 557 514 2226 1233 2199
+1046 9 2 11 11 406 705 602 1849 2041 1836
+1047 9 2 11 11 644 682 732 2191 2029 1075
+1048 9 2 11 11 5 554 553 2222 2246 1939
+1049 9 2 11 11 41 263 610 1413 2198 2247
+1050 9 2 11 11 541 697 735 1756 985 2208
+1051 9 2 11 11 750 832 823 1692 2012 1800
+1052 9 2 11 11 632 700 691 2248 1725 2144
+1053 9 2 11 11 41 610 569 2247 1162 1440
+1054 9 2 11 11 604 731 616 2214 2080 1209
+1055 9 2 11 11 498 842 826 1638 1490 1241
+1056 9 2 11 11 605 713 624 2234 2249 1805
+1057 9 2 11 11 597 601 612 2236 2230 1315
+1058 9 2 11 11 764 844 824 2242 2156 1396
+1059 9 2 11 11 226 38 409 229 2250 2251
+1060 9 2 11 11 38 410 409 920 429 2250
+1061 9 2 11 11 62 418 417 1099 437 1267
+1062 9 2 11 11 226 409 408 2251 428 875
+1063 9 2 11 11 448 554 688 1051 2005 1140
+1064 9 2 11 11 516 646 730 2252 1947 952
+1065 9 2 11 11 614 638 791 967 2233 2244
+1066 9 2 11 11 748 799 814 890 2101 2001
+1067 9 2 11 11 68 12 6 926 2253 69
+1068 9 2 11 11 6 12 86 2253 87 960
+1069 9 2 11 11 18 112 563 113 1065 1188
+1070 9 2 11 11 49 269 621 270 1392 2254
+1071 9 2 11 11 49 621 555 2254 1695 1689
+1072 9 2 11 11 52 684 578 2255 1128 2043
+1073 9 2 11 11 52 607 684 1352 2212 2255
+1074 9 2 11 11 100 497 642 1525 2256 1817
+1075 9 2 11 11 123 640 504 1704 2257 1571
+1076 9 2 11 11 142 143 603 146 2258 1502
+1077 9 2 11 11 143 515 603 1989 1816 2258
+1078 9 2 11 11 165 562 595 1290 1500 1698
+1079 9 2 11 11 171 643 513 1813 2259 1710
+1080 9 2 11 11 230 411 410 908 430 919
+1081 9 2 11 11 305 620 546 1088 969 1452
+1082 9 2 11 11 311 419 310 2260 2261 313
+1083 9 2 11 11 310 419 418 2261 438 1098
+1084 9 2 11 11 311 525 419 2066 1218 2260
+1085 9 2 11 11 447 553 554 2262 2246 1050
+1086 9 2 11 11 447 588 553 1735 1333 2262
+1087 9 2 11 11 487 627 600 1555 1610 899
+1088 9 2 11 11 497 758 642 1407 1630 2256
+1089 9 2 11 11 504 640 767 2257 1591 1027
+1090 9 2 11 11 513 643 765 2259 993 1907
+1091 9 2 11 11 516 828 646 1945 2263 2252
+1092 9 2 11 11 528 605 649 2235 1012 1150
+1093 9 2 11 11 550 754 694 897 2229 1172
+1094 9 2 11 11 559 622 568 1030 2264 1287
+1095 9 2 11 11 568 622 609 2264 1506 987
+1096 9 2 11 11 569 618 574 1163 1829 911
+1097 9 2 11 11 570 646 755 885 2265 1039
+1098 9 2 11 11 582 652 683 1018 1331 1569
+1099 9 2 11 11 624 713 687 2249 2192 902
+1100 9 2 11 11 632 763 700 2237 1123 2248
+1101 9 2 11 11 646 838 755 2266 1742 2265
+1102 9 2 11 11 646 828 838 2263 1183 2266
+1103 9 2 11 11 665 724 761 1015 1251 1185
+1104 9 2 11 11 751 784 813 2245 947 1323
+$EndElements
diff --git a/dG3D/benchmarks/J2plasticExtractCohesiveLaw/RVE1.py b/dG3D/benchmarks/J2plasticExtractCohesiveLaw/RVE1.py
new file mode 100644
index 0000000000000000000000000000000000000000..fe1bae1a359053311f6efea2d852b70348afa6e1
--- /dev/null
+++ b/dG3D/benchmarks/J2plasticExtractCohesiveLaw/RVE1.py
@@ -0,0 +1,109 @@
+#coding-Utf-8-*-
+
+from gmshpy import *
+from dG3Dpy import*
+
+#script to launch PBC problem with a python script
+
+# material law
+lawnum = 2 
+rho   = 1e-9
+young = 3e3
+nu    = 0.3
+sy0   = 100.
+h     = 20.
+
+law1 = J2LinearDG3DMaterialLaw(lawnum,rho,young,nu,sy0,h)
+law1.setStrainOrder(-1)
+
+
+meshfile="RVE1.msh" # name of mesh file
+
+
+# creation of part Domain
+myfield1 = dG3DDomain(11,11,0,lawnum,0,2)
+myfield1.stabilityParameters(10)
+
+
+# solver
+sol = 2  # Gmm=0 (default) Taucs=1 PETsc=2
+soltype = 1 # StaticLinear=0 (default) StaticNonLinear=1
+nstep = 100   # number of step (used only if soltype=1)
+ftime =1.   # Final time (used only if soltype=1)
+tol=1.e-5   # relative tolerance for NR scheme (used only if soltype=1)
+nstepArch=1 # Number of step between 2 archiving (used only if soltype=1)
+system = 3 # Displacement elimination =0 Multiplier elimination = 1 Displacement+ multiplier = 2
+control = 0 # load control = 0 arc length control euler = 1
+
+# creation of Solver
+mysolver = nonLinearMechSolver(1000)
+mysolver.loadModel(meshfile)
+mysolver.addDomain(myfield1)
+mysolver.addMaterialLaw(law1)
+mysolver.Scheme(soltype)
+mysolver.Solver(sol)
+mysolver.snlData(nstep,ftime,tol)
+mysolver.setSystemType(system)
+mysolver.setControlType(control)
+mysolver.stiffnessModification(True)
+mysolver.iterativeProcedure(True)
+mysolver.setMessageView(True)
+
+microBC = nonLinearPeriodicBC(10,2)
+microBC.setOrder(1)
+microBC.setBCPhysical(1,2,3,4)
+
+method =0	# Periodic mesh = 0, Langrange interpolation = 1, Cubic spline interpolation =2,  FE linear= 3, FE Quad = 4
+degree = 3	# Order used for polynomial interpolation 
+addvertex = False # Polynomial interpolation by mesh vertex = 0, Polynomial interpolation by virtual vertex 
+microBC.setPeriodicBCOptions(method, degree,bool(addvertex)) 
+
+ # Deformation gradient
+microBC.setDeformationGradient(1.1,0.0,0.0,0.,1.,0.,0.,0.,1.)
+
+mysolver.addMicroBC(microBC)
+
+mysolver.setExtractCohesiveLawFromMicroDamage(True)
+mysolver.setLocalizationNormal(1.,0.,0.)
+mysolver.setRVELengthInNormalDirection(0.3)
+
+#stress averaging flag and averaging method 0- VOLUME, 1- SURFACE
+mysolver.stressAveragingFlag(True) # set stress averaging ON- 0 , OFF-1
+mysolver.setStressAveragingMethod(0) # 0 -volume 1- surface
+#tangent averaging flag
+mysolver.tangentAveragingFlag(True) # set tangent averaging ON -0, OFF -1
+mysolver.setTangentAveragingMethod(2,1e-6) # 0- perturbation 1- condensation
+
+
+
+# build view
+mysolver.internalPointBuildView("Green-Lagrange_xx",IPField.STRAIN_XX, 1, 1);
+mysolver.internalPointBuildView("Green-Lagrange_yy",IPField.STRAIN_YY, 1, 1);
+mysolver.internalPointBuildView("Green-Lagrange_zz",IPField.STRAIN_ZZ, 1, 1);
+mysolver.internalPointBuildView("Green-Lagrange_xy",IPField.STRAIN_XY, 1, 1);
+mysolver.internalPointBuildView("Green-Lagrange_yz",IPField.STRAIN_YZ, 1, 1);
+mysolver.internalPointBuildView("Green-Lagrange_xz",IPField.STRAIN_XZ, 1, 1);
+
+mysolver.internalPointBuildView("svm",IPField.SVM, 1, 1)
+mysolver.internalPointBuildView("sig_xx",IPField.SIG_XX, 1, 1)
+mysolver.internalPointBuildView("sig_yy",IPField.SIG_YY, 1, 1)
+mysolver.internalPointBuildView("sig_zz",IPField.SIG_ZZ, 1, 1)
+mysolver.internalPointBuildView("sig_xy",IPField.SIG_XY, 1, 1)
+mysolver.internalPointBuildView("sig_yz",IPField.SIG_YZ, 1, 1)
+mysolver.internalPointBuildView("sig_xz",IPField.SIG_XZ, 1, 1)
+mysolver.internalPointBuildView("epl",IPField.PLASTICSTRAIN, 1, 1)
+mysolver.internalPointBuildView("Damage",IPField.DAMAGE, 1, 1)
+mysolver.internalPointBuildView("active Damage zone",IPField.ACTIVE_DAMAGING_ZONE, 1, 1)
+
+
+
+
+# solve
+mysolver.solve()
+
+# test check
+check = TestCheck()
+check.equal(2.244344e+01,mysolver.getHomogenizedStress(0,0),1.e-4)
+check.equal(-1.35792E+02,mysolver.getHomogenizedTangent(0,0,0,0),1.e-4)
+check.equal(5.802699e-03,mysolver.getHomogenizedCohesiveJump(0),1.e-4)
+
diff --git a/dG3D/benchmarks/PureThermoPBC/thermoMecPolycrystalCondensation.py b/dG3D/benchmarks/PureThermoPBC/thermoMecPolycrystalCondensation.py
index a44711efec13358e176ede6289e36e9b16c9046d..0e51f692e37e4cf4d6d9eff32d2f8bebfff6e3bf 100644
--- a/dG3D/benchmarks/PureThermoPBC/thermoMecPolycrystalCondensation.py
+++ b/dG3D/benchmarks/PureThermoPBC/thermoMecPolycrystalCondensation.py
@@ -104,9 +104,6 @@ mysolver.setSystemType(system)
 mysolver.setMicroProblemIndentification(0, 1000);
 mysolver.invertFlag(True)
 
-mysolver.setPeriodicity(h_x,0,0,"x")
-mysolver.setPeriodicity(0,h_y,0,"y")
-mysolver.setPeriodicity(0,0,h_z,"z")
 
 #boundary condition
 microBC = nonLinearPeriodicBC(1000,3)
diff --git a/dG3D/benchmarks/compRVE/RVE.py b/dG3D/benchmarks/compRVE/RVE.py
index 83690a53f27f728a4e75d5a266c64c58c11dc7b5..65c132d23b457902dcbb6afae67a611dabab8341 100644
--- a/dG3D/benchmarks/compRVE/RVE.py
+++ b/dG3D/benchmarks/compRVE/RVE.py
@@ -100,9 +100,6 @@ mysolver.stiffnessModification(bool(1))
 mysolver.iterativeProcedure(bool(1))
 mysolver.setMessageView(bool(1))
 
-mysolver.setPeriodicity(1.e-2,0,0,"x")
-mysolver.setPeriodicity(0,1.e-2,0,"y")
-mysolver.setPeriodicity(0,0,1.e-3,"z")
 
 #boundary condition
 runTest=1
diff --git a/dG3D/benchmarks/conden_ldbc/run.py b/dG3D/benchmarks/conden_ldbc/run.py
index 6f09efc8b877ebb11bdbf37daf531c7f7800c976..34a4e0ef92ffe98ac1acc0e8e246e9e1d84b1507 100644
--- a/dG3D/benchmarks/conden_ldbc/run.py
+++ b/dG3D/benchmarks/conden_ldbc/run.py
@@ -48,10 +48,6 @@ mysolver.iterativeProcedure(True)
 mysolver.setMessageView(True)
 
 
-#rve - periodicity
-mysolver.setPeriodicity(1.,0,0,"x")
-mysolver.setPeriodicity(0,1.,0,"y")
-mysolver.setPeriodicity(0,0,1.,"z")
 
 
 #boundary condition
diff --git a/dG3D/benchmarks/conden_ldbc_DG/run.py b/dG3D/benchmarks/conden_ldbc_DG/run.py
index 99dc3d229e5f77b32bb9afd170da2f2058ea3472..33f4fba696641b60c64b52e2f8a73ce5ebeeee58 100644
--- a/dG3D/benchmarks/conden_ldbc_DG/run.py
+++ b/dG3D/benchmarks/conden_ldbc_DG/run.py
@@ -59,10 +59,6 @@ mysolver.iterativeProcedure(True)
 mysolver.setMessageView(True)
 
 
-#rve - periodicity
-mysolver.setPeriodicity(0.03132,0,0,"x")
-mysolver.setPeriodicity(0,0.027123,0,"y")
-mysolver.setPeriodicity(0,0,0.0052,"z")
 
 #boundary condition
 microBC = nonLinearDisplacementBC(1000,3)
diff --git a/dG3D/benchmarks/conden_ldbc_SecondOrder/run.py b/dG3D/benchmarks/conden_ldbc_SecondOrder/run.py
index eed7f7632a0611ef148ee7431f51897c3cb7288c..89aad771050eb4b97d3764f74c252ee08ae586b8 100644
--- a/dG3D/benchmarks/conden_ldbc_SecondOrder/run.py
+++ b/dG3D/benchmarks/conden_ldbc_SecondOrder/run.py
@@ -48,10 +48,6 @@ mysolver.iterativeProcedure(bool(1))
 mysolver.setMessageView(bool(1))
 
 
-#rve - periodicity
-mysolver.setPeriodicity(1.,0,0,"x")
-mysolver.setPeriodicity(0,1.,0,"y")
-mysolver.setPeriodicity(0,0,1.,"z")
 
 #boundary condition
 microBC = nonLinearDisplacementBC(1000,3)
diff --git a/dG3D/benchmarks/conden_mixedBC_DG/run.py b/dG3D/benchmarks/conden_mixedBC_DG/run.py
index d8ce1c810381d868578e5ce57dbe6c16cf2f9257..beb27d66fc25fc95685d4f1bd4adf86c3065f593 100644
--- a/dG3D/benchmarks/conden_mixedBC_DG/run.py
+++ b/dG3D/benchmarks/conden_mixedBC_DG/run.py
@@ -58,12 +58,6 @@ mysolver.stiffnessModification(True)
 mysolver.iterativeProcedure(True)
 mysolver.setMessageView(True)
 
-
-#rve - periodicity
-mysolver.setPeriodicity(0.03132,0,0,"x")
-mysolver.setPeriodicity(0,0.027123,0,"y")
-mysolver.setPeriodicity(0,0,0.0052,"z")
-
 #boundary condition
 microBC = nonLinearMixedBC(1000,3)
 microBC.setOrder(1)
diff --git a/dG3D/benchmarks/conden_mkbc/run.py b/dG3D/benchmarks/conden_mkbc/run.py
index a00f31274096fa9a72f03dd909965e3f9bd26777..582011e1f3bd04a338bb7251b84be5c2a334df54 100644
--- a/dG3D/benchmarks/conden_mkbc/run.py
+++ b/dG3D/benchmarks/conden_mkbc/run.py
@@ -48,10 +48,6 @@ mysolver.iterativeProcedure(bool(1))
 mysolver.setMessageView(bool(1))
 
 
-#rve - periodicity
-mysolver.setPeriodicity(1.,0,0,"x")
-mysolver.setPeriodicity(0,1.,0,"y")
-mysolver.setPeriodicity(0,0,1.,"z")
 
 #boundary condition
 microBC = nonLinearMinimalKinematicBC(1000,3)
diff --git a/dG3D/benchmarks/conden_mkbc_DG/run.py b/dG3D/benchmarks/conden_mkbc_DG/run.py
index 3fb1b42db5404aecd4e9eefddb84dd0a87fd6218..729626c8b517398c4bd1a6948b934c5e316db1a3 100644
--- a/dG3D/benchmarks/conden_mkbc_DG/run.py
+++ b/dG3D/benchmarks/conden_mkbc_DG/run.py
@@ -59,10 +59,6 @@ mysolver.iterativeProcedure(True)
 mysolver.setMessageView(True)
 
 
-#rve - periodicity
-mysolver.setPeriodicity(0.03132,0,0,"x")
-mysolver.setPeriodicity(0,0.027123,0,"y")
-mysolver.setPeriodicity(0,0,0.0052,"z")
 
 #creat microBC
 microBC = nonLinearMinimalKinematicBC(1000,3)
diff --git a/dG3D/benchmarks/conden_mkbc_SecondOrder/run.py b/dG3D/benchmarks/conden_mkbc_SecondOrder/run.py
index edff30018c68fa7f478293df67e6dfbf8912460c..3079029c22f9473a186fb569c756eb6deae8f5d4 100644
--- a/dG3D/benchmarks/conden_mkbc_SecondOrder/run.py
+++ b/dG3D/benchmarks/conden_mkbc_SecondOrder/run.py
@@ -48,10 +48,6 @@ mysolver.iterativeProcedure(bool(1))
 mysolver.setMessageView(bool(1))
 
 
-#rve - periodicity
-mysolver.setPeriodicity(1.,0,0,"x")
-mysolver.setPeriodicity(0,1.,0,"y")
-mysolver.setPeriodicity(0,0,1.,"z")
 
 #boundary condition
 microBC = nonLinearMinimalKinematicBC(1000,3)
diff --git a/dG3D/benchmarks/conden_pbc/run.py b/dG3D/benchmarks/conden_pbc/run.py
index c6a443d159700f082906c5c3aca022e877214a43..8a72e1aeac3917c7009b77b7b1322069a4917c80 100644
--- a/dG3D/benchmarks/conden_pbc/run.py
+++ b/dG3D/benchmarks/conden_pbc/run.py
@@ -48,10 +48,6 @@ mysolver.iterativeProcedure(bool(1))
 mysolver.setMessageView(bool(1))
 
 
-#rve - periodicity
-mysolver.setPeriodicity(1.,0,0,"x")
-mysolver.setPeriodicity(0,1.,0,"y")
-mysolver.setPeriodicity(0,0,1.,"z")
 
 #boundary condition
 microBC = nonLinearPeriodicBC(1000,3)
diff --git a/dG3D/benchmarks/conden_pbc_SecondOrder/run.py b/dG3D/benchmarks/conden_pbc_SecondOrder/run.py
index 17db6dbfa504a05db92fa6b67fdab4cc3655212f..116bcaa3c1e5e632fd6a46ddd75027685e6db594 100644
--- a/dG3D/benchmarks/conden_pbc_SecondOrder/run.py
+++ b/dG3D/benchmarks/conden_pbc_SecondOrder/run.py
@@ -49,10 +49,6 @@ mysolver.iterativeProcedure(bool(1))
 mysolver.setMessageView(bool(1))
 
 
-#rve - periodicity
-mysolver.setPeriodicity(1.,0,0,"x")
-mysolver.setPeriodicity(0,1.,0,"y")
-mysolver.setPeriodicity(0,0,1.,"z")
 
 #boundary condition
 microBC = nonLinearPeriodicBC(1000,3)
diff --git a/dG3D/benchmarks/conden_pbc_project/run.py b/dG3D/benchmarks/conden_pbc_project/run.py
index d9c070fa71218443a5c7178398efc94f9977493a..c8b9f12cd2e51756f42fcd3d60f761432372a8f3 100644
--- a/dG3D/benchmarks/conden_pbc_project/run.py
+++ b/dG3D/benchmarks/conden_pbc_project/run.py
@@ -48,10 +48,6 @@ mysolver.iterativeProcedure(bool(1))
 mysolver.setMessageView(bool(1))
 
 
-#rve - periodicity
-mysolver.setPeriodicity(1.,0,0,"x")
-mysolver.setPeriodicity(0,1.,0,"y")
-mysolver.setPeriodicity(0,0,1.,"z")
 
 #boundary condition
 microBC = nonLinearPeriodicBC(1000,3)
diff --git a/dG3D/benchmarks/elasticFE2/macro.py b/dG3D/benchmarks/elasticFE2/macro.py
index e95e7196e214b819ea61730c70cec80599c88fb5..cbb45e859661143fc23377cba41b79f57bb09143 100644
--- a/dG3D/benchmarks/elasticFE2/macro.py
+++ b/dG3D/benchmarks/elasticFE2/macro.py
@@ -42,9 +42,6 @@ macromat1.loadModel(micromeshfile);
 macromat1.addDomain(myfield1)
 macromat1.addMaterialLaw(law1);
 
-macromat1.setPeriodicity(1.,0,0,"x")
-macromat1.setPeriodicity(0,1.,0,"y")
-macromat1.setPeriodicity(0,0,1.,"z")
 
 macromat1.addMicroBC(microBC)
 
diff --git a/dG3D/benchmarks/fullThermoMecaMicro/run.py b/dG3D/benchmarks/fullThermoMecaMicro/run.py
index a0d638077b36d07695b9e28c4f8bf96642c2381a..91c086ddea24f7c78771a5944bac9439391ba67d 100644
--- a/dG3D/benchmarks/fullThermoMecaMicro/run.py
+++ b/dG3D/benchmarks/fullThermoMecaMicro/run.py
@@ -90,10 +90,6 @@ mysolver.setMessageView(True)
 mysolver.initialBC("Volume","Position",11,3,Tr)
 mysolver.initialBC("Volume","Position",12,3,Tr)
 
-#rve - periodicity
-mysolver.setPeriodicity(165e-6,0,0,"x")
-mysolver.setPeriodicity(0,165e-6,0,"y")
-mysolver.setPeriodicity(0,0,165e-6,"z")
 
 #boundary condition
 microBC = nonLinearPeriodicBC(10,3)
diff --git a/dG3D/benchmarks/interpolationPBC/idealHole.py b/dG3D/benchmarks/interpolationPBC/idealHole.py
index 9a4a84da0502f69d350fa85fe4acb6ff1e869bd7..c1b30d474e223bb1976750535d20ffd022276bcb 100644
--- a/dG3D/benchmarks/interpolationPBC/idealHole.py
+++ b/dG3D/benchmarks/interpolationPBC/idealHole.py
@@ -57,12 +57,6 @@ mysolver.stiffnessModification(bool(1))
 mysolver.iterativeProcedure(bool(1))
 mysolver.setMessageView(bool(1))
 
-
-#rve - periodicity
-mysolver.setPeriodicity(1.,0,0,"x")
-mysolver.setPeriodicity(0,1.,0,"y")
-mysolver.setPeriodicity(0,0,1.,"z")
-
 #boundary condition
 microBC = nonLinearPeriodicBC(1000,3)
 microBC.setOrder(1)
diff --git a/dG3D/benchmarks/interpolationPBC_2DShifted/idealHole.py b/dG3D/benchmarks/interpolationPBC_2DShifted/idealHole.py
index 74b3bd15bd4adef6b580e93aace20a78253a7fe9..59db9c999360c952876e075198a5d2deb46a62f2 100644
--- a/dG3D/benchmarks/interpolationPBC_2DShifted/idealHole.py
+++ b/dG3D/benchmarks/interpolationPBC_2DShifted/idealHole.py
@@ -58,10 +58,6 @@ mysolver.iterativeProcedure(bool(1))
 mysolver.setMessageView(bool(1))
 
 
-#rve - periodicity
-mysolver.setPeriodicity(1.,0,0,"x")
-mysolver.setPeriodicity(0,1.,0,"y")
-mysolver.setPeriodicity(0,0,1.,"z")
 
 #boundary condition
 microBC = nonLinearShiftedPeriodicBC(100,2)
diff --git a/dG3D/benchmarks/interpolationPBC_FE1/idealHole.py b/dG3D/benchmarks/interpolationPBC_FE1/idealHole.py
index a36b3e2c279c5eb4e4fcac952f6acd0eee6dd460..d0ea28e7e2d399840b9bbe915b3cf6e7491c2771 100644
--- a/dG3D/benchmarks/interpolationPBC_FE1/idealHole.py
+++ b/dG3D/benchmarks/interpolationPBC_FE1/idealHole.py
@@ -58,10 +58,6 @@ mysolver.iterativeProcedure(bool(1))
 mysolver.setMessageView(bool(1))
 
 
-#rve - periodicity
-mysolver.setPeriodicity(1.,0,0,"x")
-mysolver.setPeriodicity(0,1.,0,"y")
-mysolver.setPeriodicity(0,0,1.,"z")
 
 #boundary condition
 
diff --git a/dG3D/benchmarks/interpolationPBC_FE2/idealHole.py b/dG3D/benchmarks/interpolationPBC_FE2/idealHole.py
index ffe6194c7927976768412657d31d6628f53d8425..96c95e8c872ae864f173999e25b6eb8b1e163acd 100644
--- a/dG3D/benchmarks/interpolationPBC_FE2/idealHole.py
+++ b/dG3D/benchmarks/interpolationPBC_FE2/idealHole.py
@@ -58,11 +58,6 @@ mysolver.iterativeProcedure(bool(1))
 mysolver.setMessageView(bool(1))
 
 
-#rve - periodicity
-mysolver.setPeriodicity(1.,0,0,"x")
-mysolver.setPeriodicity(0,1.,0,"y")
-mysolver.setPeriodicity(0,0,1.,"z")
-
 #boundary condition
 
 microBC = nonLinearPeriodicBC(1000,3)
diff --git a/dG3D/benchmarks/interpolationPBC_Lagrange/idealHole.py b/dG3D/benchmarks/interpolationPBC_Lagrange/idealHole.py
index db7eb8b9b881c6c4dc9e6f68299f462bc1fb6af8..3082f227c676adf3bc2840944d74d3c21819e7ca 100644
--- a/dG3D/benchmarks/interpolationPBC_Lagrange/idealHole.py
+++ b/dG3D/benchmarks/interpolationPBC_Lagrange/idealHole.py
@@ -58,10 +58,6 @@ mysolver.iterativeProcedure(bool(1))
 mysolver.setMessageView(bool(1))
 
 
-#rve - periodicity
-mysolver.setPeriodicity(1.,0,0,"x")
-mysolver.setPeriodicity(0,1.,0,"y")
-mysolver.setPeriodicity(0,0,1.,"z")
 
 #boundary condition
 microBC = nonLinearPeriodicBC(1000,3)
diff --git a/dG3D/benchmarks/interpolationPBC_SecondOrder/idealHole.py b/dG3D/benchmarks/interpolationPBC_SecondOrder/idealHole.py
index 52d33edd8afeadea8d3cd4c2d81e9810753e77f6..cf26e3e97c3ff4420a83bd8fb773a4f6936b4995 100644
--- a/dG3D/benchmarks/interpolationPBC_SecondOrder/idealHole.py
+++ b/dG3D/benchmarks/interpolationPBC_SecondOrder/idealHole.py
@@ -53,10 +53,6 @@ mysolver.iterativeProcedure(bool(1))
 mysolver.setMessageView(bool(1))
 
 
-#rve - periodicity
-mysolver.setPeriodicity(1.,0,0,"x")
-mysolver.setPeriodicity(0,1.,0,"y")
-mysolver.setPeriodicity(0,0,1.,"z")
 
 #boundary condition
 
diff --git a/dG3D/benchmarks/interpolationPBC_SecondOrder_insysElim/idealHole.py b/dG3D/benchmarks/interpolationPBC_SecondOrder_insysElim/idealHole.py
index 845f0864a5d3b8c54a899d1b6d7dca06e4bf7d21..76525178e0bd4a2236aff9e0ffbed257be4094f4 100644
--- a/dG3D/benchmarks/interpolationPBC_SecondOrder_insysElim/idealHole.py
+++ b/dG3D/benchmarks/interpolationPBC_SecondOrder_insysElim/idealHole.py
@@ -54,11 +54,6 @@ mysolver.iterativeProcedure(bool(1))
 mysolver.setMessageView(bool(1))
 mysolver.invertFlag(bool(1))
 
-#rve - periodicity
-mysolver.setPeriodicity(1.,0,0,"x")
-mysolver.setPeriodicity(0,1.,0,"y")
-mysolver.setPeriodicity(0,0,1.,"z")
-
 #boundary condition
 microBC = nonLinearPeriodicBC(1000,3)
 microBC.setOrder(2)
diff --git a/dG3D/benchmarks/microBC_reset/run.py b/dG3D/benchmarks/microBC_reset/run.py
index e4330699ccbacf9c93e7c052fe08046ae9392bbd..bf4ed24ac465fa33bddec25b2c2272c6bdaeaa81 100644
--- a/dG3D/benchmarks/microBC_reset/run.py
+++ b/dG3D/benchmarks/microBC_reset/run.py
@@ -48,10 +48,6 @@ mysolver.iterativeProcedure(bool(1))
 mysolver.setMessageView(bool(1))
 
 
-#rve - periodicity
-mysolver.setPeriodicity(1.,0,0,"x")
-mysolver.setPeriodicity(0,1.,0,"y")
-mysolver.setPeriodicity(0,0,1.,"z")
 
 #boundary condition
 microBC = nonLinearMinimalKinematicBC(1000,3)
diff --git a/dG3D/benchmarks/microNonLocalDamage/idealHole.py b/dG3D/benchmarks/microNonLocalDamage/idealHole.py
index dfb9b0cdd06ad213db588736b4fc249203a4ef1d..2a76271842abf390dae8e22cd6dc6cfc25f7751c 100644
--- a/dG3D/benchmarks/microNonLocalDamage/idealHole.py
+++ b/dG3D/benchmarks/microNonLocalDamage/idealHole.py
@@ -55,10 +55,6 @@ mysolver.stiffnessModification(True)
 mysolver.iterativeProcedure(True)
 mysolver.setMessageView(True)
 
-#rve - periodicity
-mysolver.setPeriodicity(1.,0,0,"x")
-mysolver.setPeriodicity(0,1.,0,"y")
-mysolver.setPeriodicity(0,0,1.,"z")
 
 #boundary condition
 microBC = nonLinearPeriodicBC(10,3)
diff --git a/dG3D/benchmarks/multiscale2DThermoMechanics/macro.py b/dG3D/benchmarks/multiscale2DThermoMechanics/macro.py
index acf89b89aae70c61ad04f7436fa99bbb0cd6046f..6530aaaa67169967c8d00ed2ec9824fb2e1882ed 100644
--- a/dG3D/benchmarks/multiscale2DThermoMechanics/macro.py
+++ b/dG3D/benchmarks/multiscale2DThermoMechanics/macro.py
@@ -85,10 +85,6 @@ macromat.addMaterialLaw(law1);
 macromat.addDomain(myfield2)
 macromat.addMaterialLaw(law2);
 
-macromat.setPeriodicity(165e-6,0,0,"x")
-macromat.setPeriodicity(0,165e-6,0,"y")
-macromat.setPeriodicity(0,0,1.,"z")
-
 macromat.addMicroBC(microBC)
 
 macromat.setNumStep(1)
diff --git a/dG3D/benchmarks/multiscaleAdhesiveTest2D/model.py b/dG3D/benchmarks/multiscaleAdhesiveTest2D/model.py
index 14a8f141f1b7412879c2c9e7cd74a5afe7d61f56..cb39d09756d6c8d6aa00ffba525c99a474f1da7c 100644
--- a/dG3D/benchmarks/multiscaleAdhesiveTest2D/model.py
+++ b/dG3D/benchmarks/multiscaleAdhesiveTest2D/model.py
@@ -45,9 +45,6 @@ macromat1 = dG3DMultiscaleMaterialLaw(matnum1, 1000)
 macromat1.loadModel(micromeshfile);
 macromat1.addDomain(myfield1)
 macromat1.addMaterialLaw(law1);
-macromat1.setPeriodicity(1.,0,0,"x")
-macromat1.setPeriodicity(0,1.,0,"y")
-macromat1.setPeriodicity(0,0,1.,"z")
 macromat1.addMicroBC(microBC)
 
 macromat1.setNumStep(3)
diff --git a/dG3D/benchmarks/multiscaleCohesiveTest2D/model.py b/dG3D/benchmarks/multiscaleCohesiveTest2D/model.py
index aa7f24be51abfff22a49fa87a9be74903aaa31de..623192280938ee91f3499a32f2e64dd7e149ece4 100644
--- a/dG3D/benchmarks/multiscaleCohesiveTest2D/model.py
+++ b/dG3D/benchmarks/multiscaleCohesiveTest2D/model.py
@@ -44,9 +44,6 @@ macromat1 = dG3DMultiscaleMaterialLaw(matnum1, 1000)
 macromat1.loadModel(micromeshfile);
 macromat1.addDomain(myfield1)
 macromat1.addMaterialLaw(law1);
-macromat1.setPeriodicity(1.,0,0,"x")
-macromat1.setPeriodicity(0,1.,0,"y")
-macromat1.setPeriodicity(0,0,1.,"z")
 macromat1.addMicroBC(microBC)
 
 macromat1.setNumStep(3)
@@ -141,6 +138,7 @@ interdomain1.averageStrainBased(averageStrainBased)
 interdomain1.setDistributedOtherRanks(True)
 interdomain1.distributeOnRootRank(False)
 interdomain1.fixInterfaceDofComponent(2)
+interdomain1.setBulkDamageBlockedMethod(1)
 
 # creation of Solver
 mysolver = nonLinearMechSolver(1000)
diff --git a/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG/model.py b/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG/model.py
index 5fcbf6b721ea7801e6dcaba4523bb6ad889184ec..8c12b58f120e6664123e2fb576b6f567970eb7af 100644
--- a/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG/model.py
+++ b/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG/model.py
@@ -70,9 +70,6 @@ macromat1 = dG3DMultiscaleMaterialLaw(matnum1, 1000)
 macromat1.loadModel(micromeshfile);
 macromat1.addDomain(myfield1)
 macromat1.addMaterialLaw(law1);
-macromat1.setPeriodicity(1.,0,0,"x")
-macromat1.setPeriodicity(0,1.,0,"y")
-macromat1.setPeriodicity(0,0,1.,"z")
 macromat1.addMicroBC(microBC)
 
 macromat1.setNumStep(3)
@@ -166,6 +163,7 @@ interdomain1.stabilityParameters(beta1)
 interdomain1.averageStrainBased(averageStrainBased)
 interdomain1.setDistributedOtherRanks(True)
 interdomain1.distributeOnRootRank(False)
+interdomain1.setBulkDamageBlockedMethod(1)
 
 # creation of Solver
 mysolver = nonLinearMechSolver(1000)
diff --git a/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_changeBCAfterFailure/model.py b/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_changeBCAfterFailure/model.py
index baee0521ae14f52f9b72bedc7b06c9a96845d2f1..d20bf1015739637ab4133c35bfb8e9880cf5f73e 100644
--- a/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_changeBCAfterFailure/model.py
+++ b/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_changeBCAfterFailure/model.py
@@ -44,9 +44,7 @@ macromat1 = dG3DMultiscaleMaterialLaw(matnum1, 1000)
 macromat1.loadModel(micromeshfile);
 macromat1.addDomain(myfield1)
 macromat1.addMaterialLaw(law1);
-macromat1.setPeriodicity(1.,0,0,"x")
-macromat1.setPeriodicity(0,1.,0,"y")
-macromat1.setPeriodicity(0,0,1.,"z")
+
 macromat1.addMicroBC(microBC)
 
 macromat1.setNumStep(3)
@@ -150,7 +148,7 @@ interdomain1.stabilityParameters(beta1)
 interdomain1.averageStrainBased(averageStrainBased)
 interdomain1.setDistributedOtherRanks(True)
 interdomain1.distributeOnRootRank(False)
-
+interdomain1.setBulkDamageBlockedMethod(1)
 # creation of Solver
 mysolver = nonLinearMechSolver(1000)
 mysolver.loadModel(macromeshfile)
diff --git a/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_microPathFollowing/model.py b/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_microPathFollowing/model.py
index 63eaded6997188c6be48acfce830d4bbf8ae349b..965bfa6f63f71e139ba2854a093efe704289f988 100644
--- a/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_microPathFollowing/model.py
+++ b/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_microPathFollowing/model.py
@@ -70,9 +70,6 @@ macromat1 = dG3DMultiscaleMaterialLaw(matnum1, 1000)
 macromat1.loadModel(micromeshfile);
 macromat1.addDomain(myfield1)
 macromat1.addMaterialLaw(law1);
-macromat1.setPeriodicity(1.,0,0,"x")
-macromat1.setPeriodicity(0,1.,0,"y")
-macromat1.setPeriodicity(0,0,1.,"z")
 macromat1.addMicroBC(microBC)
 
 macromat1.setNumStep(3)
@@ -167,6 +164,7 @@ interdomain1.stabilityParameters(beta1)
 interdomain1.averageStrainBased(averageStrainBased)
 interdomain1.setDistributedOtherRanks(True)
 interdomain1.distributeOnRootRank(False)
+interdomain1.setBulkDamageBlockedMethod(1)
 
 # creation of Solver
 mysolver = nonLinearMechSolver(1000)
diff --git a/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_rotateRVE/model.py b/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_rotateRVE/model.py
index a26653258a12ccaf1968f69ee84c258adbe789ad..1d4f0a51cedecbf442c827b78a62d62a720cc458 100644
--- a/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_rotateRVE/model.py
+++ b/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_rotateRVE/model.py
@@ -44,9 +44,6 @@ macromat1 = dG3DMultiscaleMaterialLaw(matnum1, 1000)
 macromat1.loadModel(micromeshfile);
 macromat1.addDomain(myfield1)
 macromat1.addMaterialLaw(law1);
-macromat1.setPeriodicity(1.,0,0,"x")
-macromat1.setPeriodicity(0,1.,0,"y")
-macromat1.setPeriodicity(0,0,1.,"z")
 macromat1.addMicroBC(microBC)
 
 macromat1.setNumStep(3)
@@ -140,6 +137,7 @@ interdomain1.stabilityParameters(beta1)
 interdomain1.averageStrainBased(averageStrainBased)
 interdomain1.setDistributedOtherRanks(True)
 interdomain1.distributeOnRootRank(False)
+interdomain1.setBulkDamageBlockedMethod(1)
 
 # creation of Solver
 mysolver = nonLinearMechSolver(1000)
diff --git a/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_shiftedBC/model.py b/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_shiftedBC/model.py
index 5cda30b84f825ca75c8c9d127f9b7abceaeda837..09358fd257cc6da2ee487694ee2a1be895814a86 100644
--- a/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_shiftedBC/model.py
+++ b/dG3D/benchmarks/multiscaleCohesiveTest2D_fullDG_shiftedBC/model.py
@@ -44,9 +44,6 @@ macromat1 = dG3DMultiscaleMaterialLaw(matnum1, 1000)
 macromat1.loadModel(micromeshfile);
 macromat1.addDomain(myfield1)
 macromat1.addMaterialLaw(law1);
-macromat1.setPeriodicity(1.,0,0,"x")
-macromat1.setPeriodicity(0,1.,0,"y")
-macromat1.setPeriodicity(0,0,1.,"z")
 macromat1.addMicroBC(microBC)
 
 macromat1.setNumStep(3)
@@ -140,6 +137,7 @@ interdomain1.stabilityParameters(beta1)
 interdomain1.averageStrainBased(averageStrainBased)
 interdomain1.setDistributedOtherRanks(True)
 interdomain1.distributeOnRootRank(False)
+interdomain1.setBulkDamageBlockedMethod(1)
 
 # creation of Solver
 mysolver = nonLinearMechSolver(1000)
diff --git a/dG3D/benchmarks/multiscaleCohesiveTest2D_mixedMode/model.py b/dG3D/benchmarks/multiscaleCohesiveTest2D_mixedMode/model.py
index 551e07969c7d00e057606e14e107fd31bba96372..42ed8b701e83fd135b757d09a1ffb1a4d53ac592 100644
--- a/dG3D/benchmarks/multiscaleCohesiveTest2D_mixedMode/model.py
+++ b/dG3D/benchmarks/multiscaleCohesiveTest2D_mixedMode/model.py
@@ -44,9 +44,6 @@ macromat1 = dG3DMultiscaleMaterialLaw(matnum1, 1000)
 macromat1.loadModel(micromeshfile);
 macromat1.addDomain(myfield1)
 macromat1.addMaterialLaw(law1);
-macromat1.setPeriodicity(1.,0,0,"x")
-macromat1.setPeriodicity(0,1.,0,"y")
-macromat1.setPeriodicity(0,0,1.,"z")
 macromat1.addMicroBC(microBC)
 
 macromat1.setNumStep(3)
@@ -142,6 +139,7 @@ interdomain1.averageStrainBased(averageStrainBased)
 interdomain1.setDistributedOtherRanks(True)
 interdomain1.distributeOnRootRank(False)
 interdomain1.fixInterfaceDofComponent(2)
+interdomain1.setBulkDamageBlockedMethod(1)
 
 # creation of Solver
 mysolver = nonLinearMechSolver(1000)
diff --git a/dG3D/benchmarks/multiscaleCohesiveTest2D_mixedMode_compression/CMakeLists.txt b/dG3D/benchmarks/multiscaleCohesiveTest2D_mixedMode_compression/CMakeLists.txt
index cbbd67f8dcae9f9a89fbe648697446d192383882..008e32a1fe87bec035b6a6623656ae320e859c30 100644
--- a/dG3D/benchmarks/multiscaleCohesiveTest2D_mixedMode_compression/CMakeLists.txt
+++ b/dG3D/benchmarks/multiscaleCohesiveTest2D_mixedMode_compression/CMakeLists.txt
@@ -4,7 +4,8 @@ set(PYFILE model.py)
 
 set(FILES2DELETE
 	E_*.msh
-	*.txt 
+	E*.txt
+	InterfaceElement_part0.txt 
   *.csv
   disp*
   stress*
diff --git a/dG3D/benchmarks/multiscaleCohesiveTest2D_mixedMode_compression/model.py b/dG3D/benchmarks/multiscaleCohesiveTest2D_mixedMode_compression/model.py
index 16e2663c6649262fbca9a735d194c5194cc783f6..403254a08d0688660cef36d7ad0ed978cc441422 100644
--- a/dG3D/benchmarks/multiscaleCohesiveTest2D_mixedMode_compression/model.py
+++ b/dG3D/benchmarks/multiscaleCohesiveTest2D_mixedMode_compression/model.py
@@ -70,9 +70,6 @@ macromat1 = dG3DMultiscaleMaterialLaw(matnum1, 1000)
 macromat1.loadModel(micromeshfile);
 macromat1.addDomain(myfield1)
 macromat1.addMaterialLaw(law1);
-macromat1.setPeriodicity(1.,0,0,"x")
-macromat1.setPeriodicity(0,1.,0,"y")
-macromat1.setPeriodicity(0,0,1.,"z")
 macromat1.addMicroBC(microBC)
 
 macromat1.setNumStep(3)
@@ -228,5 +225,5 @@ mysolver.archivingForceOnPhysicalGroup("Edge",4,0)
 mysolver.solve()
 
 check = TestCheck()
-check.equal(2.716654e+02,mysolver.getArchivedForceOnPhysicalGroup("Edge", 4, 0),1.e-3)
+check.equal(8.457724e+01,mysolver.getArchivedForceOnPhysicalGroup("Edge", 4, 0),1.e-3)
 
diff --git a/dG3D/benchmarks/multiscaleCohesiveTest2D_tangentByPert/model.py b/dG3D/benchmarks/multiscaleCohesiveTest2D_tangentByPert/model.py
index 8f4b277b580739c8a452713c28f553af69d6ff3e..ed5db4c3a1962b779ec4fd1048f5921f473404b5 100644
--- a/dG3D/benchmarks/multiscaleCohesiveTest2D_tangentByPert/model.py
+++ b/dG3D/benchmarks/multiscaleCohesiveTest2D_tangentByPert/model.py
@@ -44,9 +44,7 @@ macromat1 = dG3DMultiscaleMaterialLaw(matnum1, 1000)
 macromat1.loadModel(micromeshfile);
 macromat1.addDomain(myfield1)
 macromat1.addMaterialLaw(law1);
-macromat1.setPeriodicity(1.,0,0,"x")
-macromat1.setPeriodicity(0,1.,0,"y")
-macromat1.setPeriodicity(0,0,1.,"z")
+
 macromat1.addMicroBC(microBC)
 
 macromat1.setNumStep(3)
@@ -141,6 +139,7 @@ interdomain1.averageStrainBased(averageStrainBased)
 interdomain1.setDistributedOtherRanks(True)
 interdomain1.distributeOnRootRank(False)
 interdomain1.fixInterfaceDofComponent(2)
+interdomain1.setBulkDamageBlockedMethod(1)
 
 # creation of Solver
 mysolver = nonLinearMechSolver(1000)
diff --git a/dG3D/benchmarks/multiscaleCohesiveTest2D_unloading/model.py b/dG3D/benchmarks/multiscaleCohesiveTest2D_unloading/model.py
index 7aac33cea5dfcf383ccb24eb07f4362097e5bc4c..6faf6de9c781d56c4076d612fb9ef9247d1a4f22 100644
--- a/dG3D/benchmarks/multiscaleCohesiveTest2D_unloading/model.py
+++ b/dG3D/benchmarks/multiscaleCohesiveTest2D_unloading/model.py
@@ -44,9 +44,6 @@ macromat1 = dG3DMultiscaleMaterialLaw(matnum1, 1000)
 macromat1.loadModel(micromeshfile);
 macromat1.addDomain(myfield1)
 macromat1.addMaterialLaw(law1);
-macromat1.setPeriodicity(1.,0,0,"x")
-macromat1.setPeriodicity(0,1.,0,"y")
-macromat1.setPeriodicity(0,0,1.,"z")
 macromat1.addMicroBC(microBC)
 
 macromat1.setNumStep(3)
@@ -143,6 +140,7 @@ interdomain1.averageStrainBased(averageStrainBased)
 interdomain1.setDistributedOtherRanks(True)
 interdomain1.distributeOnRootRank(False)
 interdomain1.fixInterfaceDofComponent(2)
+interdomain1.setBulkDamageBlockedMethod(1)
 
 # creation of Solver
 mysolver = nonLinearMechSolver(1000)
diff --git a/dG3D/benchmarks/multiscaleCohesiveTest2D_unloadingElastic/model.py b/dG3D/benchmarks/multiscaleCohesiveTest2D_unloadingElastic/model.py
index 7be901a9eab9100dc18e8062ac03f07eb7958f68..596affe9203e154d2c3c8ec1bc03bf7edfa033de 100644
--- a/dG3D/benchmarks/multiscaleCohesiveTest2D_unloadingElastic/model.py
+++ b/dG3D/benchmarks/multiscaleCohesiveTest2D_unloadingElastic/model.py
@@ -48,9 +48,6 @@ macromat1 = dG3DMultiscaleMaterialLaw(matnum1, 1000)
 macromat1.loadModel(micromeshfile);
 macromat1.addDomain(myfield1)
 macromat1.addMaterialLaw(law1);
-macromat1.setPeriodicity(1.,0,0,"x")
-macromat1.setPeriodicity(0,1.,0,"y")
-macromat1.setPeriodicity(0,0,1.,"z")
 macromat1.addMicroBC(microBC)
 macromat1.setNumStep(3)
 macromat1.setTolerance(1e-6,1e-10)
@@ -100,9 +97,10 @@ macromat1.internalPointBuildView("active Damage zone",IPField.ACTIVE_DAMAGING_ZO
 macromat1.dirichletBC("Face",11,2,0.)
 
 lcohNum = 13
-lawCoh = TwoFieldMultiscaleCohesive3DLaw(lcohNum,0.7)
+lawCoh = dG3DMultiscaleCohesiveLaw(lcohNum,0.7)
 lawCoh.setCharacteristicLength(1.)
 lawCoh.setLostSolutionUniquenssTolerance(0.95)
+lawCoh.setPenaltyParameter(1e8)
 
 macromeshfile="model.msh" # name of mesh file
 
@@ -135,11 +133,10 @@ macrodomain2.distributeOnRootRank(False)
 beta1 = 100.
 interdomain1 =  interDomainBetween3D(10,macrodomain1,macrodomain2,lcohNum,matnum1)
 interdomain1.stabilityParameters(beta1)
-interdomain1.setMultipleFieldFormulation(True,2)
 interdomain1.averageStrainBased(averageStrainBased)
 interdomain1.setDistributedOtherRanks(True)
 interdomain1.distributeOnRootRank(False)
-interdomain1.fixInterfaceDofComponent(2)
+interdomain1.setBulkDamageBlockedMethod(1)
 
 # creation of Solver
 mysolver = nonLinearMechSolver(1000)
@@ -170,8 +167,8 @@ mysolver.displacementBC("Edge",4,0,0.0)
 
 fct = PiecewiseLinearFunction()
 fct.put(0.,0.)
-fct.put(0.5,0.0035*0.7)
-fct.put(0.75,0.0035*0.5)
+fct.put(0.4,0.0035*0.7)
+fct.put(0.5,-0.001)
 fct.put(1.,0.0035)
 
 mysolver.displacementBC("Edge",2,0,fct)
@@ -220,5 +217,5 @@ mysolver.archivingInterfaceElementIP(7,8,IPField.INCOMPATIBLE_STRAIN_Z,4,0,1)
 mysolver.solve()
 
 check = TestCheck()
-check.equal(-1.034975e+01 ,mysolver.getArchivedForceOnPhysicalGroup("Edge", 4, 0),1.e-4)
+check.equal(-1.164721e+01 ,mysolver.getArchivedForceOnPhysicalGroup("Edge", 4, 0),1.e-4)
 
diff --git a/dG3D/benchmarks/multiscaleDomNonMultiscaleDomInterface/model.py b/dG3D/benchmarks/multiscaleDomNonMultiscaleDomInterface/model.py
index 28f172810f1ca1fcb2ef841436ef57c5952c4332..59b64004fa691151a496975d385803e967db1671 100644
--- a/dG3D/benchmarks/multiscaleDomNonMultiscaleDomInterface/model.py
+++ b/dG3D/benchmarks/multiscaleDomNonMultiscaleDomInterface/model.py
@@ -41,9 +41,6 @@ macromat1 = dG3DMultiscaleMaterialLaw(matnum1, 1000)
 macromat1.loadModel(micromeshfile);
 macromat1.addDomain(myfield1)
 macromat1.addMaterialLaw(law1);
-macromat1.setPeriodicity(1.,0,0,"x")
-macromat1.setPeriodicity(0,1.,0,"y")
-macromat1.setPeriodicity(0,0,1.,"z")
 macromat1.addMicroBC(microBC)
 
 macromat1.setNumStep(3)
diff --git a/dG3D/benchmarks/multiscaleEnforceCrackPath/model.py b/dG3D/benchmarks/multiscaleEnforceCrackPath/model.py
index a6ba395b3dd4f1b7f7a21ce9f6d187a166ba80a8..43ab8b5d9da48531e00029765783f720ef25b028 100644
--- a/dG3D/benchmarks/multiscaleEnforceCrackPath/model.py
+++ b/dG3D/benchmarks/multiscaleEnforceCrackPath/model.py
@@ -46,9 +46,6 @@ macromat1.addDomain(myfield2)
 macromat1.addMaterialLaw(law1);
 macromat1.addMaterialLaw(law2);
 
-macromat1.setPeriodicity(1.,0,0,"x")
-macromat1.setPeriodicity(0,1.,0,"y")
-macromat1.setPeriodicity(0,0,1.,"z")
 macromat1.addMicroBC(microBC)
 
 macromat1.setNumStep(3)
diff --git a/dG3D/benchmarks/multiscaleEnhanceStrain/model.py b/dG3D/benchmarks/multiscaleEnhanceStrain/model.py
index 45f1903316f53e77aa7de33c4e2004a389a64d16..9565b80f9ebd30a4c6c708b0d966b56a5fc8388f 100644
--- a/dG3D/benchmarks/multiscaleEnhanceStrain/model.py
+++ b/dG3D/benchmarks/multiscaleEnhanceStrain/model.py
@@ -56,9 +56,6 @@ macromat1.setPerturbationMaterialLawIP(8,0);
 macromat1.addPerturbationMaterialLaw(law2);
 
 
-macromat1.setPeriodicity(1.,0,0,"x")
-macromat1.setPeriodicity(0,1.,0,"y")
-macromat1.setPeriodicity(0,0,1.,"z")
 macromat1.addMicroBC(microBC)
 
 macromat1.setNumStep(3)
diff --git a/dG3D/benchmarks/multiscale_1order_shearlayer/shearlayer.py b/dG3D/benchmarks/multiscale_1order_shearlayer/shearlayer.py
index 98e2ec4eb4cea0624cde973f39de0c3684740582..63a3e383421077e35f0b09f7331e246a8e7aae65 100644
--- a/dG3D/benchmarks/multiscale_1order_shearlayer/shearlayer.py
+++ b/dG3D/benchmarks/multiscale_1order_shearlayer/shearlayer.py
@@ -43,9 +43,6 @@ macromat = dG3DMultiscaleMaterialLaw(matnum, 1000)
 macromat.loadModel(micromeshfile);
 macromat.addDomain(myfield1)
 macromat.addMaterialLaw(law1);
-macromat.setPeriodicity(1.,0,0,"x")
-macromat.setPeriodicity(0,1.,0,"y")
-macromat.setPeriodicity(0,0,1.,"z")
 macromat.addMicroBC(microBC)
 
 macromat.setTolerance(1e-6,1e-10)
diff --git a/dG3D/benchmarks/multiscale_2order_3Dsimple/multiscale.py b/dG3D/benchmarks/multiscale_2order_3Dsimple/multiscale.py
index 9b330319dcdb2552761ab4473da23106048d9bd1..ea0e2c74bc982e6dd3cdee3b4301a403c31589fd 100644
--- a/dG3D/benchmarks/multiscale_2order_3Dsimple/multiscale.py
+++ b/dG3D/benchmarks/multiscale_2order_3Dsimple/multiscale.py
@@ -44,9 +44,6 @@ macromat.loadModel(micromeshfile);
 macromat.addDomain(myfield1)
 macromat.addMaterialLaw(law1);
 
-macromat.setPeriodicity(1.,0,0,"x")
-macromat.setPeriodicity(0,1.,0,"y")
-macromat.setPeriodicity(0,0,1.,"z")
 
 macromat.addMicroBC(microBC)
 
diff --git a/dG3D/benchmarks/multiscale_2order_shearlayer/shearlayer.py b/dG3D/benchmarks/multiscale_2order_shearlayer/shearlayer.py
index fe5edcb94f49524d97ffe31233a776bcf4551467..f9fedfea1774806ab90a6ffcc5cf03c6b78a315b 100644
--- a/dG3D/benchmarks/multiscale_2order_shearlayer/shearlayer.py
+++ b/dG3D/benchmarks/multiscale_2order_shearlayer/shearlayer.py
@@ -43,9 +43,6 @@ macromat = hoDGMultiscaleMaterialLaw(matnum, 1000)
 macromat.loadModel(micromeshfile);
 macromat.addDomain(myfield1)
 macromat.addMaterialLaw(law1);
-macromat.setPeriodicity(1.,0,0,"x")
-macromat.setPeriodicity(0,1.,0,"y")
-macromat.setPeriodicity(0,0,1.,"z")
 macromat.addMicroBC(microBC)
 
 macromat.setNumStep(1)
diff --git a/dG3D/benchmarks/multiscale_interface/model.py b/dG3D/benchmarks/multiscale_interface/model.py
index ca18e079fb539336c8d0edf432f79a8aa285e41b..b4dfbeb25011651910b453f9b82c2e31c61f2a08 100644
--- a/dG3D/benchmarks/multiscale_interface/model.py
+++ b/dG3D/benchmarks/multiscale_interface/model.py
@@ -43,9 +43,6 @@ macromat = dG3DMultiscaleMaterialLaw(matnum, 1000)
 macromat.loadModel(micromeshfile);
 macromat.addDomain(myfield1)
 macromat.addMaterialLaw(law1);
-macromat.setPeriodicity(1.,0,0,"x")
-macromat.setPeriodicity(0,1.,0,"y")
-macromat.setPeriodicity(0,0,1.,"z")
 macromat.addMicroBC(microBC)
 
 macromat.setNumStep(2)
diff --git a/dG3D/benchmarks/nonLinearMixedBC_2D/idealHole_mixBC.py b/dG3D/benchmarks/nonLinearMixedBC_2D/idealHole_mixBC.py
index 5283c4e853f7f8bfc064933d7cfd4e0b14b7ada5..3a83ec32bb1c5f19870ac938404b90b59563091f 100644
--- a/dG3D/benchmarks/nonLinearMixedBC_2D/idealHole_mixBC.py
+++ b/dG3D/benchmarks/nonLinearMixedBC_2D/idealHole_mixBC.py
@@ -57,10 +57,6 @@ mysolver.stiffnessModification(bool(1))
 mysolver.iterativeProcedure(bool(1))
 mysolver.setMessageView(bool(1))
 
-#rve - periodicity
-mysolver.setPeriodicity(0.5,0,0,"x")
-mysolver.setPeriodicity(0,0.5,0,"y")
-mysolver.setPeriodicity(0,0,1.,"z")
 
 #boundary condition
 microBC = nonLinearMixedBC(10,2)
diff --git a/dG3D/benchmarks/nonLinearMixedBC_2D_DirectionFollowing/idealHole_mixBC.py b/dG3D/benchmarks/nonLinearMixedBC_2D_DirectionFollowing/idealHole_mixBC.py
index 6839785f2a93668431cfd1d8dfc0bc83c60092ab..55f919f2b8be825993dc3e2d9aaed9b7ba26f4b7 100644
--- a/dG3D/benchmarks/nonLinearMixedBC_2D_DirectionFollowing/idealHole_mixBC.py
+++ b/dG3D/benchmarks/nonLinearMixedBC_2D_DirectionFollowing/idealHole_mixBC.py
@@ -57,10 +57,6 @@ mysolver.stiffnessModification(bool(1))
 mysolver.iterativeProcedure(bool(1))
 mysolver.setMessageView(bool(1))
 
-#rve - periodicity
-mysolver.setPeriodicity(0.5,0,0,"x")
-mysolver.setPeriodicity(0,0.5,0,"y")
-mysolver.setPeriodicity(0,0,1.,"z")
 
 #boundary condition
 microBC = nonLinearOrthogonalMixedBCDirectionFollowing(10,2)
diff --git a/dG3D/benchmarks/nonLinearMixedBC_2D_withPBC/idealHole_mixBC.py b/dG3D/benchmarks/nonLinearMixedBC_2D_withPBC/idealHole_mixBC.py
index 6028b469a519a9bb9396e58f24b343569a59ac3f..ab21149c2c5ab259225effb43353d08e778294fc 100644
--- a/dG3D/benchmarks/nonLinearMixedBC_2D_withPBC/idealHole_mixBC.py
+++ b/dG3D/benchmarks/nonLinearMixedBC_2D_withPBC/idealHole_mixBC.py
@@ -57,10 +57,6 @@ mysolver.stiffnessModification(bool(1))
 mysolver.iterativeProcedure(bool(1))
 mysolver.setMessageView(bool(1))
 
-#rve - periodicity
-mysolver.setPeriodicity(1.,0,0,"x")
-mysolver.setPeriodicity(0,1.,0,"y")
-mysolver.setPeriodicity(0,0,1.,"z")
 
 #boundary condition
 microBC = nonLinearMixedBC(10,2)
diff --git a/dG3D/benchmarks/nonLinearMixedBC_3D/idealHole_mixBC.py b/dG3D/benchmarks/nonLinearMixedBC_3D/idealHole_mixBC.py
index 292000b1c4b50bd587e940cf2f565460d075e5ec..05d5f2664b52c08e248ad44cf29dd2999bb09f08 100644
--- a/dG3D/benchmarks/nonLinearMixedBC_3D/idealHole_mixBC.py
+++ b/dG3D/benchmarks/nonLinearMixedBC_3D/idealHole_mixBC.py
@@ -57,10 +57,6 @@ mysolver.stiffnessModification(bool(1))
 mysolver.iterativeProcedure(bool(1))
 mysolver.setMessageView(bool(1))
 
-#rve - periodicity
-mysolver.setPeriodicity(1.,0,0,"x")
-mysolver.setPeriodicity(0,1.,0,"y")
-mysolver.setPeriodicity(0,0,0.2,"z")
 
 #boundary condition
 
diff --git a/dG3D/benchmarks/nonLinearMixedBC_3D_SecondOrder/rve.py b/dG3D/benchmarks/nonLinearMixedBC_3D_SecondOrder/rve.py
index eca08bfe42044d6fb8b759fddc1c1be5325f8128..adf2d2bf964226c2916d2b8d5dcca340cda73fb5 100644
--- a/dG3D/benchmarks/nonLinearMixedBC_3D_SecondOrder/rve.py
+++ b/dG3D/benchmarks/nonLinearMixedBC_3D_SecondOrder/rve.py
@@ -56,10 +56,6 @@ mysolver.stiffnessModification(bool(1))
 mysolver.iterativeProcedure(bool(1))
 mysolver.setMessageView(bool(1))
 
-#rve - periodicity
-mysolver.setPeriodicity(1.,0,0,"x")
-mysolver.setPeriodicity(0,1.,0,"y")
-mysolver.setPeriodicity(0,0,1,"z")
 
 #boundary condition
 microBC = nonLinearMixedBC(10,3)
diff --git a/dG3D/benchmarks/pathFollowingEnergyBased/arch3D.py b/dG3D/benchmarks/pathFollowingEnergyBased/arch3D.py
index 30bc6124fe0565f2e82765ed4f24c46cbdaf6b5b..92ee2c5362cecc6e541d6158b2e32582bc9aa41b 100644
--- a/dG3D/benchmarks/pathFollowingEnergyBased/arch3D.py
+++ b/dG3D/benchmarks/pathFollowingEnergyBased/arch3D.py
@@ -10,7 +10,7 @@ E = 70E3 #Young modulus
 nu = 0.3 #Poisson ratio
 K = E/3./(1.-2.*nu)
 mu = E/2./(1+nu)
-sy0 = 300e100 #Yield stress
+sy0 = 300. #Yield stress
 h = 300. # hardening modulus
 rho = 1.  #density
 # geometry
diff --git a/dG3D/benchmarks/pathFollowingMultiscale/model.py b/dG3D/benchmarks/pathFollowingMultiscale/model.py
index 50e72b1a28bd659040588208f192a6f7d8d53ca7..76eeeb0a372587b9b6324cd37c0edbba0774861a 100644
--- a/dG3D/benchmarks/pathFollowingMultiscale/model.py
+++ b/dG3D/benchmarks/pathFollowingMultiscale/model.py
@@ -42,9 +42,6 @@ macromat1 = dG3DMultiscaleMaterialLaw(matnum1, 1000)
 macromat1.loadModel(micromeshfile);
 macromat1.addDomain(myfield1)
 macromat1.addMaterialLaw(law1);
-macromat1.setPeriodicity(1.,0,0,"x")
-macromat1.setPeriodicity(0,1.,0,"y")
-macromat1.setPeriodicity(0,0,1.,"z")
 macromat1.addMicroBC(microBC)
 
 macromat1.setNumStep(3)
diff --git a/dG3D/benchmarks/pathFollowing_TrueSnapback/twoHole.py b/dG3D/benchmarks/pathFollowing_TrueSnapback/twoHole.py
index b2adab7c490325d3cdf32755b6492e327a61c62c..655b6439c001ed89384ef0bada88cd1a4aff6646 100644
--- a/dG3D/benchmarks/pathFollowing_TrueSnapback/twoHole.py
+++ b/dG3D/benchmarks/pathFollowing_TrueSnapback/twoHole.py
@@ -35,9 +35,9 @@ myfield1.stabilityParameters(beta1)
 # solver
 sol = 2  # Gmm=0 (default) Taucs=1 PETsc=2
 soltype =1 # StaticLinear=0 (default) StaticNonLinear=1
-nstep = 38  # number of step (used only if soltype=1)
+nstep = 30  # number of step (used only if soltype=1)
 ftime =1.   # Final time (used only if soltype=1)
-tol=1.e-4 # relative tolerance for NR scheme (used only if soltype=1)
+tol=1.e-5 # relative tolerance for NR scheme (used only if soltype=1)
 nstepArch=1 # Number of step between 2 archiving (used only if soltype=1)
 
 # creation of Solver
@@ -89,4 +89,4 @@ mysolver.archivingForceOnPhysicalGroup('Face',12,1)
 mysolver.solve()
 
 check = TestCheck()
-check.equal(-4.239069e+03,mysolver.getArchivedForceOnPhysicalGroup("Face", 12, 1),1.e-4)
+check.equal(-9.223652e+02,mysolver.getArchivedForceOnPhysicalGroup("Face", 12, 1),1.e-4)
diff --git a/dG3D/benchmarks/pathFollowing_snapback/twoHole.py b/dG3D/benchmarks/pathFollowing_snapback/twoHole.py
index 52e5fcb0c3a16ef3270403346c5e17d7d5db8790..9b4dfe0f4c912fe6446fe18ec3d39ba773e12f81 100644
--- a/dG3D/benchmarks/pathFollowing_snapback/twoHole.py
+++ b/dG3D/benchmarks/pathFollowing_snapback/twoHole.py
@@ -35,9 +35,9 @@ myfield1.stabilityParameters(beta1)
 # solver
 sol = 2  # Gmm=0 (default) Taucs=1 PETsc=2
 soltype =1 # StaticLinear=0 (default) StaticNonLinear=1
-nstep = 40  # number of step (used only if soltype=1)
+nstep = 35  # number of step (used only if soltype=1)
 ftime =1.   # Final time (used only if soltype=1)
-tol=1.e-3 # relative tolerance for NR scheme (used only if soltype=1)
+tol=1.e-5 # relative tolerance for NR scheme (used only if soltype=1)
 nstepArch=1 # Number of step between 2 archiving (used only if soltype=1)
 
 # creation of Solver
@@ -51,7 +51,7 @@ mysolver.snlData(nstep,ftime,tol)
 
 mysolver.pathFollowing(True,1)
 # time-step adaptation by number of NR iterations
-mysolver.setPathFollowingIncrementAdaptation(True,3)
+mysolver.setPathFollowingIncrementAdaptation(True,4)
 mysolver.setPathFollowingLocalSteps(1e-2,1e-6)
 mysolver.setPathFollowingLocalIncrementType(1); 
 
@@ -89,4 +89,4 @@ mysolver.archivingForceOnPhysicalGroup('Face',12,1)
 mysolver.solve()
 
 check = TestCheck()
-check.equal(-5.452552e+03,mysolver.getArchivedForceOnPhysicalGroup("Face", 12, 1),1.e-4)
+check.equal(-2.256506e+03,mysolver.getArchivedForceOnPhysicalGroup("Face", 12, 1),1.e-4)
diff --git a/dG3D/benchmarks/powerYieldViscoElastoPlastic/cylinder.py b/dG3D/benchmarks/powerYieldViscoElastoPlastic/cylinder.py
index f117e9db6d4f128fb00e009422d1f749e451342a..2e237130ebf15ef23202e7ada635686870ae4303 100644
--- a/dG3D/benchmarks/powerYieldViscoElastoPlastic/cylinder.py
+++ b/dG3D/benchmarks/powerYieldViscoElastoPlastic/cylinder.py
@@ -26,11 +26,13 @@ ht = 300.
 # creation of law
 hardenc = LinearExponentialJ2IsotropicHardening(1, sy0c, hc, 0., 10.)
 hardent = LinearExponentialJ2IsotropicHardening(2, sy0t, ht, 0., 10.)
-
+hardenk = PolynomialKinematicHardening(3,1)
+hardenk.setCoefficients(1,370.)
 
 law1   = HyperViscoElastoPlasticPowerYieldDG3DMaterialLaw(lawnum,rho,E,nu,1e-6,False,1e-8)
 law1.setCompressionHardening(hardenc)
 law1.setTractionHardening(hardent)
+law1.setKinematicHardening(hardenk)
 
 law1.setStrainOrder(5)
 
@@ -119,4 +121,4 @@ mysolver.archivingNodeDisplacement(5,2,1)
 mysolver.solve()
 
 check = TestCheck()
-check.equal(-4.755446e+03,mysolver.getArchivedForceOnPhysicalGroup("Face", 1, 2),1.e-3)
+check.equal(-5.609926e+03,mysolver.getArchivedForceOnPhysicalGroup("Face", 1, 2),1.e-3)
diff --git a/dG3D/benchmarks/powerYieldViscoElastoPlasticFullFailure/CMakeLists.txt b/dG3D/benchmarks/powerYieldViscoElastoPlasticFullFailure/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..740be5dcb29efaa6cfc2d59ec99f335e356db0bb
--- /dev/null
+++ b/dG3D/benchmarks/powerYieldViscoElastoPlasticFullFailure/CMakeLists.txt
@@ -0,0 +1,11 @@
+# test file
+
+set(PYFILE model.py)
+
+set(FILES2DELETE 
+  disp*.msh
+  stress*.msh
+  *.csv
+)
+
+add_cm3python_mpi_test(4 ${PYFILE} "${FILES2DELETE}")
diff --git a/dG3D/benchmarks/powerYieldViscoElastoPlasticFullFailure/model.geo b/dG3D/benchmarks/powerYieldViscoElastoPlasticFullFailure/model.geo
new file mode 100644
index 0000000000000000000000000000000000000000..8ed070c809778eb0e80edc661d9491f97f1a05b0
--- /dev/null
+++ b/dG3D/benchmarks/powerYieldViscoElastoPlasticFullFailure/model.geo
@@ -0,0 +1,53 @@
+mm = 1e-3;
+
+L = 10*mm;
+H = 20*mm;
+Z = 0.3*mm;
+
+H1 = 0.6*H;
+R1 = 2*mm;
+H2 = 0.4*H;
+R2 = 2*mm;
+
+lc1 =0.08*L;
+lc2 = 0.7*lc1;
+
+Point(1) = {0,0,0,lc1};
+Point(2) = {L,0,0,lc1};
+Point(3) = {L,H1-R1,0,lc2};
+Point(4) = {L-R1,H1,0,lc2};
+Point(5) = {L,H1+R1,0,lc2};
+Point(6) = {L,H,0,lc1};
+Point(7) = {0,H,0,lc1};
+Point(8) = {0,H2+R2,0,lc2};
+Point(9) = {R2,H2,0,lc2};
+Point(10) = {0,H2-R2,0,lc2};
+Point(11) = {L,H1,0};
+Point(12) = {0,H2,0};
+Line(1) = {1, 2};
+Line(2) = {2, 3};
+Line(3) = {5, 6};
+Line(4) = {6, 7};
+Line(5) = {7, 8};
+Line(6) = {10, 1};
+Circle(7) = {5, 11, 4};
+Circle(8) = {4, 11, 3};
+Circle(9) = {8, 12, 9};
+Circle(10) = {9, 12, 10};
+Line Loop(11) = {5, 9, 10, 6, 1, 2, -8, -7, 3, 4};
+Plane Surface(12) = {11};
+
+//Recombine Surface {12};
+//+
+Extrude {0, 0, 1*mm} {
+  Surface{12}; Layers{1}; Recombine;
+}
+//+
+Physical Volume(11) = {1};
+
+//+
+Physical Surface(111) = {43};
+//+
+Physical Surface(112) = {63};
+//+
+Physical Point(113) = {7};
diff --git a/dG3D/benchmarks/powerYieldViscoElastoPlasticFullFailure/model.msh b/dG3D/benchmarks/powerYieldViscoElastoPlasticFullFailure/model.msh
new file mode 100644
index 0000000000000000000000000000000000000000..f3222cddd2de2a5991906a9953a51bc49759467c
--- /dev/null
+++ b/dG3D/benchmarks/powerYieldViscoElastoPlasticFullFailure/model.msh
@@ -0,0 +1,2660 @@
+$MeshFormat
+2.2 0 8
+$EndMeshFormat
+$Nodes
+1362
+1 0 0 0
+2 0.01 0 0
+3 0.01 0.01 0
+4 0.008 0.012 0
+5 0.01 0.014 0
+6 0.01 0.02 0
+7 0 0.02 0
+8 0 0.01 0
+9 0.002 0.008 0
+10 0 0.006 0
+11 0 0.02 0.001
+12 0 0.01 0.001
+13 0.002 0.008 0.001
+14 0 0.006 0.001
+15 0 0 0.001
+16 0.01 0 0.001
+17 0.01 0.01 0.001
+18 0.008 0.012 0.001
+19 0.01 0.014 0.001
+20 0.01 0.02 0.001
+21 0.0007692307692293157 0 0
+22 0.001538461538458476 0 0
+23 0.002307692307686946 0 0
+24 0.003076923076915382 0 0
+25 0.003846153846144056 0 0
+26 0.004615384615372709 0 0
+27 0.005384615384603596 0 0
+28 0.006153846153836295 0 0
+29 0.006923076923068835 0 0
+30 0.007692307692301126 0 0
+31 0.008461538461534924 0 0
+32 0.009230769230766111 0 0
+33 0.01 0.0007832616660217521 0
+34 0.01 0.001548118520675843 0
+35 0.01 0.002295002826946092 0
+36 0.01 0.003024336856104212 0
+37 0.01 0.003736533205503329 0
+38 0.01 0.00443199443422169 0
+39 0.01 0.005111113846852168 0
+40 0.01 0.005774275370776503 0
+41 0.01 0.006421854086358755 0
+42 0.01 0.007054216032340136 0
+43 0.01 0.007671718884349008 0
+44 0.01 0.008274711674556342 0
+45 0.01 0.008863535484323101 0
+46 0.01 0.009438523271555095 0
+47 0.01 0.01456596848397074 0
+48 0.01 0.01515481694080088 0
+49 0.01 0.01576747039083141 0
+50 0.01 0.01640489112069451 0
+51 0.01 0.01706808046756423 0
+52 0.01 0.01775808027389689 0
+53 0.01 0.01847597389821959 0
+54 0.01 0.01922288959280712 0
+55 0.009230769230770377 0.02 0
+56 0.008461538461543124 0.02 0
+57 0.00769230769231281 0.02 0
+58 0.006923076923084892 0.02 0
+59 0.006153846153856377 0.02 0
+60 0.005384615384627482 0.02 0
+61 0.004615384615396567 0.02 0
+62 0.003846153846163841 0.02 0
+63 0.003076923076931273 0.02 0
+64 0.002307692307698957 0.02 0
+65 0.00153846153846513 0.02 0
+66 0.0007692307692339171 0.02 0
+67 0 0.01921673833397792 0
+68 0 0.01845188147932384 0
+69 0 0.01770499717305356 0
+70 0 0.01697566314389546 0
+71 0 0.01626346679449642 0
+72 0 0.01556800556577805 0
+73 0 0.01488888615314768 0
+74 0 0.01422572462922334 0
+75 0 0.0135781459136411 0
+76 0 0.01294578396765978 0
+77 0 0.01232828111565092 0
+78 0 0.01172528832544361 0
+79 0 0.01113646451567687 0
+80 0 0.01056147672844489 0
+81 0 0.005434031516029298 0
+82 0 0.004845183059199223 0
+83 0 0.004232529609168495 0
+84 0 0.003595108879305356 0
+85 0 0.002931919532435902 0
+86 0 0.002241919726103111 0
+87 0 0.001524026101780538 0
+88 0 0.0007771104071928334 0
+89 0.009482361909795976 0.01393185165257841 0
+90 0.009000000000001456 0.01373205080756972 0
+91 0.00858578643762827 0.01341421356237446 0
+92 0.008267949192432074 0.01300000000000165 0
+93 0.008068148347422241 0.01251763809020645 0
+94 0.008068148347421705 0.01148236190979555 0
+95 0.008267949192430263 0.01100000000000149 0
+96 0.008585786437624723 0.01058578643762909 0
+97 0.0089999999999981 0.01026794919243222 0
+98 0.009482361909793409 0.01006814834742228 0
+99 0.0005176380902043784 0.009931851652578315 0
+100 0.000999999999998691 0.009732050807569633 0
+101 0.001414213562371167 0.009414213562375023 0
+102 0.001732050807567577 0.009000000000002251 0
+103 0.00193185165257767 0.008517638090206782 0
+104 0.00193185165257839 0.007482361909795906 0
+105 0.001732050807570851 0.007000000000003418 0
+106 0.001414213562376495 0.006585786437630305 0
+107 0.001000000000002465 0.006267949192432546 0
+108 0.0005176380902061074 0.006068148347422149 0
+109 0 0.01921673833397792 0.001
+110 0 0.01845188147932384 0.001
+111 0 0.01770499717305356 0.001
+112 0 0.01697566314389546 0.001
+113 0 0.01626346679449642 0.001
+114 0 0.01556800556577805 0.001
+115 0 0.01488888615314768 0.001
+116 0 0.01422572462922334 0.001
+117 0 0.0135781459136411 0.001
+118 0 0.01294578396765978 0.001
+119 0 0.01232828111565092 0.001
+120 0 0.01172528832544361 0.001
+121 0 0.01113646451567687 0.001
+122 0 0.01056147672844489 0.001
+123 0.0005176380902043784 0.009931851652578315 0.001
+124 0.000999999999998691 0.009732050807569633 0.001
+125 0.001414213562371167 0.009414213562375023 0.001
+126 0.001732050807567577 0.009000000000002251 0.001
+127 0.00193185165257767 0.008517638090206782 0.001
+128 0.00193185165257839 0.007482361909795906 0.001
+129 0.001732050807570851 0.007000000000003418 0.001
+130 0.001414213562376495 0.006585786437630305 0.001
+131 0.001000000000002465 0.006267949192432546 0.001
+132 0.0005176380902061074 0.006068148347422149 0.001
+133 0 0.005434031516029298 0.001
+134 0 0.004845183059199223 0.001
+135 0 0.004232529609168495 0.001
+136 0 0.003595108879305356 0.001
+137 0 0.002931919532435902 0.001
+138 0 0.002241919726103111 0.001
+139 0 0.001524026101780538 0.001
+140 0 0.0007771104071928334 0.001
+141 0.0007692307692293157 0 0.001
+142 0.001538461538458476 0 0.001
+143 0.002307692307686946 0 0.001
+144 0.003076923076915382 0 0.001
+145 0.003846153846144056 0 0.001
+146 0.004615384615372709 0 0.001
+147 0.005384615384603596 0 0.001
+148 0.006153846153836295 0 0.001
+149 0.006923076923068835 0 0.001
+150 0.007692307692301126 0 0.001
+151 0.008461538461534924 0 0.001
+152 0.009230769230766111 0 0.001
+153 0.01 0.0007832616660217521 0.001
+154 0.01 0.001548118520675843 0.001
+155 0.01 0.002295002826946092 0.001
+156 0.01 0.003024336856104212 0.001
+157 0.01 0.003736533205503329 0.001
+158 0.01 0.00443199443422169 0.001
+159 0.01 0.005111113846852168 0.001
+160 0.01 0.005774275370776503 0.001
+161 0.01 0.006421854086358755 0.001
+162 0.01 0.007054216032340136 0.001
+163 0.01 0.007671718884349008 0.001
+164 0.01 0.008274711674556342 0.001
+165 0.01 0.008863535484323101 0.001
+166 0.01 0.009438523271555095 0.001
+167 0.009482361909793409 0.01006814834742228 0.001
+168 0.0089999999999981 0.01026794919243222 0.001
+169 0.008585786437624723 0.01058578643762909 0.001
+170 0.008267949192430263 0.01100000000000149 0.001
+171 0.008068148347421705 0.01148236190979555 0.001
+172 0.008068148347422241 0.01251763809020645 0.001
+173 0.008267949192432074 0.01300000000000165 0.001
+174 0.00858578643762827 0.01341421356237446 0.001
+175 0.009000000000001456 0.01373205080756972 0.001
+176 0.009482361909795976 0.01393185165257841 0.001
+177 0.01 0.01456596848397074 0.001
+178 0.01 0.01515481694080088 0.001
+179 0.01 0.01576747039083141 0.001
+180 0.01 0.01640489112069451 0.001
+181 0.01 0.01706808046756423 0.001
+182 0.01 0.01775808027389689 0.001
+183 0.01 0.01847597389821959 0.001
+184 0.01 0.01922288959280712 0.001
+185 0.009230769230770377 0.02 0.001
+186 0.008461538461543124 0.02 0.001
+187 0.00769230769231281 0.02 0.001
+188 0.006923076923084892 0.02 0.001
+189 0.006153846153856377 0.02 0.001
+190 0.005384615384627482 0.02 0.001
+191 0.004615384615396567 0.02 0.001
+192 0.003846153846163841 0.02 0.001
+193 0.003076923076931273 0.02 0.001
+194 0.002307692307698957 0.02 0.001
+195 0.00153846153846513 0.02 0.001
+196 0.0007692307692339171 0.02 0.001
+197 0.005766975162644091 0.005608887336095399 0
+198 0.004248077118464889 0.01438252446726165 0
+199 0.005029506963906446 0.009935913564007427 0
+200 0.003096610371383629 0.003932364002042545 0
+201 0.006915839066962655 0.01601935678186737 0
+202 0.002905332640977664 0.01185517464638687 0
+203 0.007163233750764962 0.008172598710082376 0
+204 0.005513251117104752 0.01229803573370197 0
+205 0.00438645239799246 0.007574029980623095 0
+206 0.007042631860774962 0.002955746531818826 0
+207 0.002957368139220492 0.01704425346818579 0
+208 0.002170302992132307 0.01384181160813659 0
+209 0.007861587523746088 0.006151135644503924 0
+210 0.006633441290947168 0.01396580472630164 0
+211 0.003435785797715521 0.005919888582929553 0
+212 0.003301356790703286 0.01006884865560731 0
+213 0.006868831397748882 0.009838195536034669 0
+214 0.005199590246723364 0.01764690364302633 0
+215 0.004783989949604642 0.002358152916116167 0
+216 0.007807514259169754 0.01790782684745735 0
+217 0.002192485740830083 0.002092173152544866 0
+218 0.005666395728725346 0.00851103579564003 0
+219 0.004386784466679969 0.01134293616419748 0
+220 0.001672495113686054 0.00483324237638226 0
+221 0.008323380753153399 0.01518922239524416 0
+222 0.001538874974795853 0.0111857952246823 0
+223 0.001821992318447187 0.01561837993550172 0
+224 0.004846108137519786 0.004112217496022417 0
+225 0.005157328524346251 0.01589301555159868 0
+226 0.004044708390896655 0.01285313342692956 0
+227 0.00847486597578264 0.008826878873655646 0
+228 0.006658955295481604 0.01125856525602694 0
+229 0.008226417411093014 0.004260474309729175 0
+230 0.00340745141570089 0.008739043512712256 0
+231 0.006046309243692864 0.007106915954952471 0
+232 0.008468620227404864 0.007371915636096046 0
+233 0.001537363173531516 0.01269701511968621 0
+234 0.008271585654428636 0.001727259561746664 0
+235 0.001728414345568797 0.0182727404382559 0
+236 0.006801327346091339 0.01279055923180628 0
+237 0.006724426421439735 0.004434268840488664 0
+238 0.003298158004336778 0.01554562097371983 0
+239 0.003150885940037207 0.007175144032692275 0
+240 0.005257670345073804 0.01359097061798502 0
+241 0.00459413856293509 0.006265633024387107 0
+242 0.003875395231648857 0.01828511676271327 0
+243 0.006124604768364885 0.001714883237282223 0
+244 0.004522309734849773 0.008857805039570715 0
+245 0.00856419062868417 0.01664142710836264 0
+246 0.001435809371314639 0.003358572891633361 0
+247 0.005532073249433843 0.01099347003780384 0
+248 0.00343509201796331 0.001566081949392111 0
+249 0.006564907982041865 0.01843391805060726 0
+250 0.007731488084145046 0.01424620284865816 0
+251 0.002301288917107234 0.01014578700124086 0
+252 0.002238989026952993 0.005749476654108586 0
+253 0.007936287024598551 0.009923288816409337 0
+254 0.005661669173046586 0.01463829007714001 0
+255 0.002897378219040341 0.01286199105497939 0
+256 0.001320000550836807 0.01700028819959511 0
+257 0.004255370017020295 0.005226172435161399 0
+258 0.008735295900264986 0.003067182315584342 0
+259 0.004358490861202908 0.01672397659502548 0
+260 0.005748905878435949 0.003160701368572784 0
+261 0.007136972035979865 0.007102229892281593 0
+262 0.001152967882650532 0.01465448380033565 0
+263 0.006486801484598484 0.01717150423812338 0
+264 0.003560353287678392 0.002762789798676867 0
+265 0.005941637849584528 0.009509898701510673 0
+266 0.004143579906135759 0.01038363866950023 0
+267 0.008740169600089637 0.005392355679651936 0
+268 0.003145651564109825 0.01452707195702222 0
+269 0.007342383893987578 0.01070016773245528 0
+270 0.002668677646533546 0.009248222091041456 0
+271 0.006848502967754438 0.005524955110634478 0
+272 0.003380613324611665 0.01096122535392513 0
+273 0.006681547336406435 0.00889737995390155 0
+274 0.008941724280942564 0.006410685835960441 0
+275 0.007025457799846698 0.01494314505407346 0
+276 0.008806920563585969 0.01882297028113596 0
+277 0.001193079436414186 0.001177029718863027 0
+278 0.002862181751392838 0.004998133262689108 0
+279 0.005347868058157454 0.007566099046590398 0
+280 0.004955455243664199 0.01880650666407762 0
+281 0.005044544756349792 0.001193493335917936 0
+282 0.0009512735776675153 0.01353635400941145 0
+283 0.003952668070226547 0.009526332698557242 0
+284 0.006126899840928149 0.01038532532089163 0
+285 0.00748127768662811 0.01341508581860486 0
+286 0.00898398215016963 0.008157021526222311 0
+287 0.004757549286850523 0.01210948955662117 0
+288 0.00762871468543678 0.008893095781306112 0
+289 0.002519917833985611 0.006593878848379692 0
+290 0.002451166965973898 0.003118361738786261 0
+291 0.007548833034026987 0.01688163826121585 0
+292 0.0008272356540773246 0.005210917743795731 0
+293 0.009170989132088468 0.01479093088953794 0
+294 0.003759356923604902 0.01203106752194908 0
+295 0.005712654773966353 0.004612202379408039 0
+296 0.002398440644942177 0.01108549351829146 0
+297 0.002001226509299512 0.01195327120572338 0
+298 0.007173258678898814 0.01197524339999152 0
+299 0.002719971819886555 0.01885658762625803 0
+300 0.007280028180120508 0.001143412373737395 0
+301 0.004337862502658474 0.01540622331333066 0
+302 0.000917490108779465 0.01177323162724565 0
+303 0.003531605522199343 0.01362972008284145 0
+304 0.008934764928313228 0.01766587468583981 0
+305 0.001065235071686375 0.002334125314155341 0
+306 0.002843499117963253 0.007942649234735274 0
+307 0.006274060941776503 0.007933039955671243 0
+308 0.00078850613045531 0.01082165844242667 0
+309 0.005966811094079103 0.01310089962729656 0
+310 0.003970299255444931 0.006859887219322645 0
+311 0.009212049772237347 0.009177010642702764 0
+312 0.0009386624244096229 0.004208563956027978 0
+313 0.009061337575594375 0.01579143604396686 0
+314 0.007712376461995641 0.005099755553228711 0
+315 0.002401834794973753 0.001097223206857409 0
+316 0.007598165205028772 0.01890277679314168 0
+317 0.006062431695232079 0.01559479255417854 0
+318 0.002216483168409753 0.01476451135113511 0
+319 0.006246647907718659 0.01199955286615993 0
+320 0.00802939859634059 0.00813898961160254 0
+321 0.004019539290064437 0.00366995471374027 0
+322 0.005493731715020181 0.006446833019494043 0
+323 0.003579819870568659 0.007855519387533419 0
+324 0.006502931764103641 0.006347812391772431 0
+325 0.007837895842261073 0.01597889783129435 0
+326 0.002147465425742864 0.004030621853559204 0
+327 0.004457811928002025 0.01360516466602536 0
+328 0.005217823562611983 0.009156861090299773 0
+329 0.005588194855958588 0.01674718535053479 0
+330 0.0009520840300791559 0.01590158985010916 0
+331 0.002590449006905483 0.01617145118013815 0
+332 0.007412477599845253 0.003819237746772281 0
+333 0.004837194549387218 0.01066402359862906 0
+334 0.005014618280069986 0.01291262048323323 0
+335 0.00906359031097482 0.003733555554411115 0
+336 0.008503397603849574 0.01433974538888144 0
+337 0.003725853536308338 0.004533611901838494 0
+338 0.008996218063371178 0.000999705993266154 0
+339 0.001003781936627461 0.01900029400673523 0
+340 0.001479779892789366 0.005671772869380312 0
+341 0.002066395860748317 0.01301063555562172 0
+342 0.005146946168705313 0.01172559829075392 0
+343 0.001376262509915517 0.01025475992594489 0
+344 0.004866067041169381 0.008198199398623641 0
+345 0.009244679695562922 0.007320407889421718 0
+346 0.004863424119444366 0.007190905250989277 0
+347 0.004739182521087426 0.003102486496371763 0
+348 0.007358664287617353 0.002015726236642763 0
+349 0.002650725500939507 0.0180061532742581 0
+350 0.005131569898028375 0.005636675865918521 0
+351 0.001012746461786011 0.01781356971821287 0
+352 0.008633361821619589 0.00972889174589933 0
+353 0.009039067958053294 0.002185272903509883 0
+354 0.004867421721661981 0.01441091946076166 0
+355 0.007421807823254663 0.01135977893595418 0
+356 0.003704661170165002 0.01751985283145772 0
+357 0.006365840498076971 0.002415328202119378 0
+358 0.002577375351038561 0.008622926785139611 0
+359 0.002061979417739715 0.009582212455893182 0
+360 0.006500555021833425 0.003609798800163349 0
+361 0.005972617683682266 0.01152497035555655 0
+362 0.007961328517290362 0.006744738162326991 0
+363 0.00320028590630641 0.009229958521560416 0
+364 0.004190474369932295 0.008255761118612993 0
+365 0.002688984855313018 0.01048361704408013 0
+366 0.003502023709709474 0.01640439631902841 0
+367 0.006703025925300107 0.01070227068799807 0
+368 0.004312102913522912 0.0008071200845208426 0
+369 0.00568789708648581 0.01919287991547818 0
+370 0.007951544250907069 0.01049200796559758 0
+371 0.002930864185970048 0.002155289479918259 0
+372 0.007069135814032096 0.01784471052008731 0
+373 0.000499888715133609 0.01264049669861551 0
+374 0.003733822830927385 0.01473657567451479 0
+375 0.007684586063743943 0.007562269918879485 0
+376 0.007419958567263538 0.01258906481038508 0
+377 0.004954275444536475 0.004760193355971208 0
+378 0.001880195756322092 0.01912494141464239 0
+379 0.00812025478875235 0.0008755073214749163 0
+380 0.005846000207179164 0.01402542783162418 0
+381 0.004064744342250251 0.005905878945097755 0
+382 0.00252915773929209 0.01236615878239367 0
+383 0.006187011463750417 0.005159320880964256 0
+384 0.006390814081643529 0.01483171825365947 0
+385 0.002532360712583719 0.007240969663207025 0
+386 0.007766464869272707 0.002735900766962055 0
+387 0.009282302016314858 0.004669464247928035 0
+388 0.00447961474298631 0.009534519802402785 0
+389 0.007717803611617315 0.01494377027135704 0
+390 0.002195790330335857 0.01725293195278214 0
+391 0.004934361510518762 0.01504006989007957 0
+392 0.006834395828960504 0.01341433496047769 0
+393 0.002712498539119074 0.01373526227475578 0
+394 0.005544890597559842 0.01035294715221323 0
+395 0.003235759653363434 0.01237620085062372 0
+396 0.00623745475054456 0.01635867927214151 0
+397 0.007223295830455401 0.009543196031342965 0
+398 0.00416597516813063 0.01914108444003285 0
+399 0.005834024831881803 0.0008589155599659657 0
+400 0.003853063300523235 0.008826205058057156 0
+401 0.0006038639561791506 0.01528816697485805 0
+402 0.002594918374392846 0.01541709308018267 0
+403 0.002595370244753938 0.009780679258684253 0
+404 0.004426975164765895 0.01791187744407259 0
+405 0.005559730291462136 0.002122198959542087 0
+406 0.002244706270219333 0.00507319804175779 0
+407 0.003141692774022748 0.006545937056212011 0
+408 0.007994932813744115 0.01373321628528727 0
+409 0.00684027945819523 0.007479255750813767 0
+410 0.009488248857082507 0.01672610283187557 0
+411 0.0005117511429168821 0.00327389716812346 0
+412 0.005939329688807135 0.01797328784720544 0
+413 0.004005536807172519 0.002116313545808954 0
+414 0.00941197647311879 0.008648233754661777 0
+415 0.004495555426954095 0.016020208592118 0
+416 0.007434981365519363 0.01003090237380697 0
+417 0.005539100724978158 0.004011208356486409 0
+418 0.003704193330472559 0.005401516684911936 0
+419 0.001972521553368494 0.006334086638148384 0
+420 0.006086294350915985 0.01107391008239561 0
+421 0.00807359174555443 0.003575243410282332 0
+422 0.001887622767408721 0.01635971458697086 0
+423 0.006106204455945681 0.008925852934510183 0
+424 0.0005572497273635993 0.01134221424439316 0
+425 0.007341232886668833 0.006222227559160753 0
+426 0.00718811112006634 0.01394908759955204 0
+427 0.003875385254858128 0.01146705503992032 0
+428 0.009190980459059618 0.005833701928546643 0
+429 0.000643153132975641 0.01652457963517852 0
+430 0.002773881071998203 0.006035745204528706 0
+431 0.008235689362241753 0.01728157638139997 0
+432 0.001764310637755932 0.002718423618601121 0
+433 0.007350134210108978 0.0155995183346896 0
+434 0.00737709088687938 0.004493283948384647 0
+435 0.0007645249109246824 0.01412371092510701 0
+436 0.001458063765197867 0.01389536512911836 0
+437 0.003456671706399164 0.0007422790501175339 0
+438 0.006543328293608636 0.01925772094988082 0
+439 0.009448004677750027 0.01536636670490961 0
+440 0.000566643809036608 0.004647906139256061 0
+441 0.004923602159658414 0.01700824679488357 0
+442 0.00436242574988092 0.004701839355509967 0
+443 0.005502712206101486 0.006998932922720281 0
+444 0.003617259065983162 0.01046891230781695 0
+445 0.008510962310463856 0.005955293780868281 0
+446 0.006478979176923682 0.009428928191889828 0
+447 0.008102404057913347 0.01932619164066675 0
+448 0.001897595942087433 0.0006738083593327899 0
+449 0.002593165067020627 0.004382303471514994 0
+450 0.00189169137761904 0.010910245563544 0
+451 0.003042715644962473 0.003250761911993415 0
+452 0.00682269205114924 0.0166966007874722 0
+453 0.003293421039716556 0.01935109381628067 0
+454 0.006706578960289178 0.0006489061837174127 0
+455 0.005991149887738344 0.006143565091234635 0
+456 0.004986944897525943 0.01118249299136675 0
+457 0.001450749643999507 0.0117371815166439 0
+458 0.008137095377279524 0.009096748193964199 0
+459 0.009210947370720909 0.01827632918354871 0
+460 0.0007890526292789462 0.001723670816449385 0
+461 0.006673828360462346 0.008370445825568184 0
+462 0.001540252879973951 0.004096757237198079 0
+463 0.008452095109275399 0.0159035999506863 0
+464 0.003505544593182246 0.01299017431851219 0
+465 0.009324153367234333 0.003225092803833725 0
+466 0.009488671609471897 0.006818598912280476 0
+467 0.004167213647843404 0.002815815725508426 0
+468 0.003999644019851118 0.0109221810146114 0
+469 0.001489311030995769 0.01326725748548071 0
+470 0.005072001315173878 0.008684394084254074 0
+471 0.003653144061966108 0.0141908674164225 0
+472 0.005433533704176243 0.009871451808245831 0
+473 0.006205296792426967 0.01362676111330658 0
+474 0.005436403980786462 0.01840235908533146 0
+475 0.004551670467938375 0.00161341724002547 0
+476 0.004590940884588461 0.0100049016136067 0
+477 0.002878367149789649 0.01134806907747952 0
+478 0.006199761399458917 0.004129100654155607 0
+479 0.005767916591801223 0.007966898915731616 0
+480 0.001718716709995618 0.01503322278403413 0
+481 0.002035998076206119 0.01250183665990315 0
+482 0.008313740735332439 0.004881201786401022 0
+483 0.00625485391569025 0.01263328560558016 0
+484 0.001940756367943461 0.001441579043155749 0
+485 0.008059243632057934 0.01855842095684397 0
+486 0.003736598619917437 0.006398382862347728 0
+487 0.002242011351710464 0.008944911231945206 0
+488 0.006599744331275739 0.01543036362662653 0
+489 0.005475250878889443 0.01541557996199588 0
+490 0.0004893653580024675 0.01323485732785345 0
+491 0.003777460616767009 0.007370269242424445 0
+492 0.006543012115488039 0.00696419241910557 0
+493 0.00779563511125655 0.01100721755642548 0
+494 0.008471772994283857 0.008375616230348184 0
+495 0.0009960316235909661 0.005749413429164746 0
+496 0.008998782104492621 0.01425336519558048 0
+497 0.003823663881101077 0.01586359773680058 0
+498 0.009323650111311806 0.01932359290754278 0
+499 0.0006763498886880082 0.0006764070924569585 0
+500 0.008401721972151178 0.002387287226046277 0
+501 0.005249784864223786 0.002788016817633143 0
+502 0.007739155372537947 0.01296692329029532 0
+503 0.008361624482483369 0.01013237645115801 0
+504 0.002544524567265844 0.01427104671439187 0
+505 0.007145791448985796 0.008637340961706187 0
+506 0.00164385985570683 0.009861568224025926 0
+507 0.004284703651445123 0.01185579499820118 0
+508 0.007420031093582267 0.005643593549138663 0
+509 0.008501498605954224 0.006835375619612074 0
+510 0.001607373884964989 0.01758884515471162 0
+511 0.006923671653480786 0.00499600703553199 0
+512 0.007286163894970249 0.01451646861273581 0
+513 0.006329837026729389 0.005703566024703536 0
+514 0.000903786643889499 0.01031794389387179 0
+515 0.002661129872902849 0.005467824933284546 0
+516 0.003142365263719144 0.01505269637701107 0
+517 0.003717461120599031 0.009963144878825934 0
+518 0.003297390170594239 0.01799720530927842 0
+519 0.006718588120770002 0.00199420679961671 0
+520 0.0006139984082834785 0.01839282418993133 0
+521 0.009395425663966811 0.005257530050917908 0
+522 0.002422211460167594 0.007728872337998446 0
+523 0.009083289678250814 0.009786865508471658 0
+524 0.004569400083965463 0.01265237974408343 0
+525 0.006326436381298624 0.009897120065344272 0
+526 0.006164170882973552 0.008408029626459739 0
+527 0.0005494939201277037 0.002663095173873288 0
+528 0.009450506079872677 0.0173369048261251 0
+529 0.005702872749119065 0.01606217505936252 0
+530 0.001954978036395303 0.01141039666313062 0
+531 0.002444583786782732 0.01166976064890092 0
+532 0.005391477148824524 0.005058469859549167 0
+533 0.004185685767216524 0.01233581690845414 0
+534 0.007029988334006139 0.01106979087590169 0
+535 0.009377726226736115 0.001598234975213327 0
+536 0.00559685900801089 0.01269612240173692 0
+537 0.007596767726277411 0.008412641267137238 0
+538 0.0004559111045180209 0.005595331462661075 0
+539 0.009542928647857305 0.01440543974701866 0
+540 0.002971010610754975 0.008885839031589739 0
+541 0.003998717310846897 0.01335735124310744 0
+542 0.008179073780005612 0.0145965563701271 0
+543 0.008056435892566799 0.008623994993002319 0
+544 0.001987880736633906 0.003482863298251491 0
+545 0.008013689907094251 0.01652813986128138 0
+546 0.003380149127264717 0.01168747286712334 0
+547 0.00809314462086832 0.005520555998965422 0
+548 0.001144334811953336 0.004713059384972375 0
+549 0.008853362743513983 0.01529601927453504 0
+550 0.001799679506371989 0.005413746835899703 0
+551 0.0005951800291196919 0.0172038195739871 0
+552 0.007618357875227287 0.01180746027059541 0
+553 0.00406888115626654 0.01388438460343605 0
+554 0.006771943940344064 0.01229482318845186 0
+555 0.005037674096206552 0.01640913465725384 0
+556 0.005059197392941416 0.006131342260049921 0
+557 0.006719615816675326 0.01178853553892036 0
+558 0.009456796264935084 0.007869029355060196 0
+559 0.0004623110453735734 0.01202284309369831 0
+560 0.0004474629848898617 0.01040897315953487 0
+561 0.005848055320418752 0.01730133267499799 0
+562 0.001254970408949018 0.01541648466695178 0
+563 0.007399055421800244 0.01631153254704081 0
+564 0.002571517979141489 0.003688194055919792 0
+565 0.005638624321318612 0.008987247266444667 0
+566 0.007049710103326405 0.01727598656145487 0
+567 0.002977096972160446 0.002685651628078564 0
+568 0.0004846081241910124 0.003928394091816238 0
+569 0.009517135743284387 0.01607330505629795 0
+570 0.005798344362359827 0.007473057710878112 0
+571 0.005328169600356722 0.008166393242912438 0
+572 0.004312677013224425 0.007146173818568152 0
+573 0.00955279716762608 0.009598458522026225 0
+574 0.004720228184573572 0.01166002150725588 0
+575 0.00301127200871353 0.009637410561610322 0
+576 0.008476368005781195 0.01807081612749719 0
+577 0.001523631994219945 0.001929183872500981 0
+578 0.002207478346366891 0.006924715925201764 0
+579 0.00265938170561098 0.00158335276329869 0
+580 0.007340618294391696 0.01841664723670132 0
+581 0.006999873127872259 0.01031495484813764 0
+582 0.003285594628990272 0.008155014935133625 0
+583 0.004863795968403078 0.007737672999914916 0
+584 0.005671297409948682 0.01190789043748652 0
+585 0.001087418563165415 0.01132356599530564 0
+586 0.00319604079662408 0.007654826185514713 0
+587 0.004464341908606614 0.01846919417775045 0
+588 0.005532999182649991 0.001537621102967984 0
+589 0.001876843180941987 0.01441007356452528 0
+590 0.003179600104888706 0.004489871194524749 0
+591 0.004961865499660938 0.01942809420391773 0
+592 0.005038134500346163 0.0005719057960809488 0
+593 0.002497391115974212 0.01669285778847543 0
+594 0.005108735825662524 0.01242940157556526 0
+595 0.002420069959245517 0.008165199625948168 0
+596 0.0005065739162422761 0.01465188282063577 0
+597 0.0009986324101386851 0.01294680390353973 0
+598 0.003626210666250067 0.004050257902371963 0
+599 0.001325239328155077 0.01075060101779122 0
+600 0.001285028256213123 0.01635638616872531 0
+601 0.004360821436183306 0.01488459838762903 0
+602 0.007220382621821069 0.01301123638668516 0
+603 0.0084742969700885 0.01388147937943371 0
+604 0.009468345976666232 0.002683213357048265 0
+605 0.006354029820507567 0.003128226740756826 0
+606 0.007490838639616483 0.00329320280662165 0
+607 0.003732549694476676 0.01251606649033564 0
+608 0.003793649769831429 0.008335888641301683 0
+609 0.001450655729362586 0.006080471797225235 0
+610 0.008278316554368783 0.006402031777680391 0
+611 0.001072679814882657 0.002931147064286835 0
+612 0.008927320185113885 0.01706885293570988 0
+613 0.003697063578659705 0.01687052211349963 0
+614 0.006426224086385342 0.0131106391367317 0
+615 0.0003586437685417542 0.01085415741809529 0
+616 0.008727757047774337 0.009244460799072545 0
+617 0.008886853868519128 0.007630269353847727 0
+618 0.009635364682596443 0.00914515233505379 0
+619 0.0088804007355611 0.008738203637777206 0
+620 0.004889871284567097 0.01338163527806235 0
+621 0.002281532942389011 0.01844064780120859 0
+622 0.00771820397196675 0.001561126786351432 0
+623 0.003530798796339115 0.006864232357986126 0
+624 0.004892877803425804 0.01384724177339616 0
+625 0.008769750536414966 0.004353140468049285 0
+626 0.007936261905283232 0.01552300175665429 0
+627 0.002655640800111086 0.01946652457143621 0
+628 0.007344449308906399 0.0005335651757859448 0
+629 0.006383064032937634 0.007452645083295828 0
+630 0.005028500217408175 0.006594683737022431 0
+631 0.002492320320264557 0.01328118050112874 0
+632 0.005772055095449933 0.01068351174200754 0
+633 0.007302676974338746 0.01942430516693347 0
+634 0.002697323025663178 0.0005756948330653507 0
+635 0.004233294294553375 0.009156554618833752 0
+636 0.006028743853193909 0.0151635754440046 0
+637 0.006785732656214028 0.01444375713246407 0
+638 0.001067118446920739 0.01228525242741079 0
+639 0.009632384491539159 0.01485670455324756 0
+640 0.0003699581135263906 0.005146673984188277 0
+641 0.006897822796847329 0.009346522723080217 0
+642 0.002798998721246649 0.00690755679655381 0
+643 0.005233550168780587 0.003502206573161849 0
+644 0.005991050973802997 0.006655985326420521 0
+645 0.004462654821183151 0.01732113885031051 0
+646 0.003159194393569317 0.005469298276973083 0
+647 0.003259194634871922 0.01860604280400996 0
+648 0.006722482138630599 0.001394491140830851 0
+649 0.004816845302022861 0.01553712109432324 0
+650 0.004482310155535028 0.0108658225220876 0
+651 0.009492520990068136 0.004165692842504942 0
+652 0.003188556953306489 0.01397783059465092 0
+653 0.002303115460462414 0.01065657558703221 0
+654 0.007651455656123553 0.01219158795760358 0
+655 0.008455148031269037 0.007886823840927652 0
+656 0.004527677286745815 0.003658161968364866 0
+657 0.007542176514559399 0.01743834771432307 0
+658 0.002406860388834803 0.002569956174984454 0
+659 0.005246016332469193 0.004414089066379509 0
+660 0.009429657116846384 0.0005740313164826189 0
+661 0.0005995596155369009 0.01942485579709612 0
+662 0.003110264168751157 0.01604010265490603 0
+663 0.004641142863258701 0.005730603777120325 0
+664 0.008671497686183943 0.01474430658565103 0
+665 0.0020372945125984 0.004470189674911804 0
+666 0.006902785580503969 0.003948468390765638 0
+667 0.008945308893017217 0.007017588562334223 0
+668 0.005796195578575148 0.002664003142419463 0
+669 0.005692547854774892 0.01356421554782246 0
+670 0.0009976413144244191 0.003647338433206436 0
+671 0.009002358685574795 0.01635266156679368 0
+672 0.004186305891404215 0.006433111890127307 0
+673 0.003124636193950323 0.01052819653167901 0
+674 0.001614177701847862 0.01221899242775141 0
+675 0.005547695794512234 0.0114294481820909 0
+676 0.008017241480885963 0.007253255758109441 0
+677 0.002084062842742541 0.01783749084854624 0
+678 0.005094586929600987 0.001764976710913929 0
+679 0.004896553308909308 0.01824736820285169 0
+680 0.007598952426145902 0.01383589813802558 0
+681 0.00856097897079253 0.003823528077080375 0
+682 0.004495854546391353 0.01312704747357356 0
+683 0.008771443718692243 0.01949165308234737 0
+684 0.001228556281308247 0.0005083469176524583 0
+685 0.002728788587579483 0.01480648389594859 0
+686 0.005369697850860371 0.01401284421812158 0
+687 0.006904840417165347 0.006011544040433257 0
+688 0.004034385675829964 0.007900256691916317 0
+689 0.001319926100411506 0.005265358773265854 0
+690 0.005994046795577933 0.00364960314406536 0
+691 0.003009631588134226 0.001135071720453804 0
+692 0.006990368411870411 0.01886492827954214 0
+693 0.00700072518966331 0.01149038280135894 0
+694 0.00402183644042834 0.00139304573854197 0
+695 0.005973275873329648 0.01861463485317741 0
+696 0.003639878232442061 0.003315130808188666 0
+697 0.003481901418370657 0.009609917173687022 0
+698 0.009514021865241149 0.01880290907517289 0
+699 0.0004859781347575767 0.00119709092482577 0
+700 0.008702185587097098 0.0005336407043567417 0
+701 0.001299976750910109 0.01946631088818676 0
+702 0.003450845787173795 0.002253350289432704 0
+703 0.006509557232915205 0.01774887160903199 0
+704 0.007905330104154912 0.002182863782989785 0
+705 0.004988353719513834 0.009536657536504322 0
+706 0.006605013334629604 0.01022757329168126 0
+707 0.002376327371576325 0.006178296836291341 0
+708 0.003986406778678207 0.0163515630403939 0
+709 0.009546491489843094 0.006259856635042309 0
+710 0.006121085033586376 0.01685003686797599 0
+711 0.004159990536491189 0.009886648171268501 0
+712 0.00190137179508272 0.01344064968039409 0
+713 0.006410344310257387 0.01590328056345594 0
+714 0.006305721467146209 0.004652091788902512 0
+715 0.005895566018629615 0.0123073977477369 0
+716 0.005894454712662237 0.009993122434366 0
+717 0.004806583453470519 0.009147850646761477 0
+718 0.0004124885952462244 0.01591238188623254 0
+719 0.0054649399550333 0.009425652412381564 0
+720 0.002935935453383858 0.008424247986079063 0
+721 0.000455396028001961 0.0137048527557537 0
+722 0.005069151227110971 0.01033846346547414 0
+723 0.006950553087180275 0.003459113502816428 0
+724 0.003095138059448469 0.01336818177911526 0
+725 0.00282899960547517 0.007548492290829546 0
+726 0.002404250043110285 0.01280436051080533 0
+727 0.003059093286536753 0.01653726392070557 0
+728 0.007869140195357291 0.004615410531871616 0
+729 0.006750897438130126 0.007923112238081559 0
+730 0.002137739753859237 0.01524619406675619 0
+731 0.008781315376660414 0.001510304423517415 0
+732 0.007210995195621482 0.009065959245250168 0
+733 0.004553913004701222 0.008443644760284108 0
+734 0.005234338162514431 0.01070952361173619 0
+735 0.001224361491255491 0.01849534965152835 0
+736 0.005488524811274482 0.005993460714558504 0
+737 0.006341561238950479 0.0115552447791535 0
+738 0.007027215604369705 0.002427181259408279 0
+739 0.002996974315345906 0.01756886087395304 0
+740 0.004570560683273593 0.0104201198760873 0
+741 0.004478457029887932 0.008010071781002279 0
+742 0.007745561797446234 0.00417690423881531 0
+743 0.002279988806575261 0.01579241949763954 0
+744 0.004539075510840528 0.006740377165244727 0
+745 0.007476431264155967 0.006665904969480282 0
+746 0.003797595210610323 0.01528214372395003 0
+747 0.007619494925911116 0.007949757865300599 0
+748 0.005403062977762628 0.01320774399268942 0
+749 0.008164456582846437 0.01414983936855721 0
+750 0.004158850768208498 0.004116261940454543 0
+751 0.008001521280437088 0.01328840428190029 0
+752 0.008829316760388971 0.00487678088047496 0
+753 0.007719010639080531 0.009400956822310919 0
+754 0.003425028503299003 0.004975132125708689 0
+755 0.0004431005600319085 0.01889085311073416 0
+756 0.004218698195636628 0.003312309942434798 0
+757 0.004507013945564247 0.01402604699417618 0
+758 0.006233064862701822 0.01432100617028373 0
+759 0.006976203225259285 0.006575840142270943 0
+760 0.009684244794334284 0.00736296745834457 0
+761 0.001440339556219441 0.01593051104165177 0
+762 0.00180348588527727 0.005856742746850355 0
+763 0.008045748220925917 0.00769383543848596 0
+764 0.004741836966376777 0.005217920132107246 0
+765 0.0004895212361456899 0.002149816574642328 0
+766 0.009510478763854467 0.01785018342535569 0
+767 0.007256687267674157 0.007618525542790043 0
+768 0.004194168537194069 0.008655637139640947 0
+769 0.003919147903162262 0.004958361433314767 0
+770 0.002780451790359389 0.01086093300867291 0
+771 0.00370098346229214 0.009214685108592255 0
+772 0.005373447646307649 0.01719144881654189 0
+773 0.009560720281390734 0.001100670494331938 0
+774 0.009511479424016879 0.003679820846974944 0
+775 0.007601347200993865 0.007140454424090918 0
+776 0.001803774852585683 0.01042443120325028 0
+777 0.008241753929399003 0.009560974276123188 0
+778 0.002837151501756888 0.01010742317548365 0
+779 0.005239555961654359 0.01209408311882577 0
+780 0.005766975162644091 0.005608887336095399 0.001
+781 0.004248077118464889 0.01438252446726165 0.001
+782 0.005029506963906446 0.009935913564007427 0.001
+783 0.003096610371383629 0.003932364002042545 0.001
+784 0.006915839066962655 0.01601935678186737 0.001
+785 0.002905332640977664 0.01185517464638687 0.001
+786 0.007163233750764962 0.008172598710082376 0.001
+787 0.005513251117104752 0.01229803573370197 0.001
+788 0.00438645239799246 0.007574029980623095 0.001
+789 0.007042631860774962 0.002955746531818826 0.001
+790 0.002957368139220492 0.01704425346818579 0.001
+791 0.002170302992132307 0.01384181160813659 0.001
+792 0.007861587523746088 0.006151135644503924 0.001
+793 0.006633441290947168 0.01396580472630164 0.001
+794 0.003435785797715521 0.005919888582929553 0.001
+795 0.003301356790703286 0.01006884865560731 0.001
+796 0.006868831397748882 0.009838195536034669 0.001
+797 0.005199590246723364 0.01764690364302633 0.001
+798 0.004783989949604642 0.002358152916116167 0.001
+799 0.007807514259169754 0.01790782684745735 0.001
+800 0.002192485740830083 0.002092173152544866 0.001
+801 0.005666395728725346 0.00851103579564003 0.001
+802 0.004386784466679969 0.01134293616419748 0.001
+803 0.001672495113686054 0.00483324237638226 0.001
+804 0.008323380753153399 0.01518922239524416 0.001
+805 0.001538874974795853 0.0111857952246823 0.001
+806 0.001821992318447187 0.01561837993550172 0.001
+807 0.004846108137519786 0.004112217496022417 0.001
+808 0.005157328524346251 0.01589301555159868 0.001
+809 0.004044708390896655 0.01285313342692956 0.001
+810 0.00847486597578264 0.008826878873655646 0.001
+811 0.006658955295481604 0.01125856525602694 0.001
+812 0.008226417411093014 0.004260474309729175 0.001
+813 0.00340745141570089 0.008739043512712256 0.001
+814 0.006046309243692864 0.007106915954952471 0.001
+815 0.008468620227404864 0.007371915636096046 0.001
+816 0.001537363173531516 0.01269701511968621 0.001
+817 0.008271585654428636 0.001727259561746664 0.001
+818 0.001728414345568797 0.0182727404382559 0.001
+819 0.006801327346091339 0.01279055923180628 0.001
+820 0.006724426421439735 0.004434268840488664 0.001
+821 0.003298158004336778 0.01554562097371983 0.001
+822 0.003150885940037207 0.007175144032692275 0.001
+823 0.005257670345073804 0.01359097061798502 0.001
+824 0.00459413856293509 0.006265633024387107 0.001
+825 0.003875395231648857 0.01828511676271327 0.001
+826 0.006124604768364885 0.001714883237282223 0.001
+827 0.004522309734849773 0.008857805039570715 0.001
+828 0.00856419062868417 0.01664142710836264 0.001
+829 0.001435809371314639 0.003358572891633361 0.001
+830 0.005532073249433843 0.01099347003780384 0.001
+831 0.00343509201796331 0.001566081949392111 0.001
+832 0.006564907982041865 0.01843391805060726 0.001
+833 0.007731488084145046 0.01424620284865816 0.001
+834 0.002301288917107234 0.01014578700124086 0.001
+835 0.002238989026952993 0.005749476654108586 0.001
+836 0.007936287024598551 0.009923288816409337 0.001
+837 0.005661669173046586 0.01463829007714001 0.001
+838 0.002897378219040341 0.01286199105497939 0.001
+839 0.001320000550836807 0.01700028819959511 0.001
+840 0.004255370017020295 0.005226172435161399 0.001
+841 0.008735295900264986 0.003067182315584342 0.001
+842 0.004358490861202908 0.01672397659502548 0.001
+843 0.005748905878435949 0.003160701368572784 0.001
+844 0.007136972035979865 0.007102229892281593 0.001
+845 0.001152967882650532 0.01465448380033565 0.001
+846 0.006486801484598484 0.01717150423812338 0.001
+847 0.003560353287678392 0.002762789798676867 0.001
+848 0.005941637849584528 0.009509898701510673 0.001
+849 0.004143579906135759 0.01038363866950023 0.001
+850 0.008740169600089637 0.005392355679651936 0.001
+851 0.003145651564109825 0.01452707195702222 0.001
+852 0.007342383893987578 0.01070016773245528 0.001
+853 0.002668677646533546 0.009248222091041456 0.001
+854 0.006848502967754438 0.005524955110634478 0.001
+855 0.003380613324611665 0.01096122535392513 0.001
+856 0.006681547336406435 0.00889737995390155 0.001
+857 0.008941724280942564 0.006410685835960441 0.001
+858 0.007025457799846698 0.01494314505407346 0.001
+859 0.008806920563585969 0.01882297028113596 0.001
+860 0.001193079436414186 0.001177029718863027 0.001
+861 0.002862181751392838 0.004998133262689108 0.001
+862 0.005347868058157454 0.007566099046590398 0.001
+863 0.004955455243664199 0.01880650666407762 0.001
+864 0.005044544756349792 0.001193493335917936 0.001
+865 0.0009512735776675153 0.01353635400941145 0.001
+866 0.003952668070226547 0.009526332698557242 0.001
+867 0.006126899840928149 0.01038532532089163 0.001
+868 0.00748127768662811 0.01341508581860486 0.001
+869 0.00898398215016963 0.008157021526222311 0.001
+870 0.004757549286850523 0.01210948955662117 0.001
+871 0.00762871468543678 0.008893095781306112 0.001
+872 0.002519917833985611 0.006593878848379692 0.001
+873 0.002451166965973898 0.003118361738786261 0.001
+874 0.007548833034026987 0.01688163826121585 0.001
+875 0.0008272356540773246 0.005210917743795731 0.001
+876 0.009170989132088468 0.01479093088953794 0.001
+877 0.003759356923604902 0.01203106752194908 0.001
+878 0.005712654773966353 0.004612202379408039 0.001
+879 0.002398440644942177 0.01108549351829146 0.001
+880 0.002001226509299512 0.01195327120572338 0.001
+881 0.007173258678898814 0.01197524339999152 0.001
+882 0.002719971819886555 0.01885658762625803 0.001
+883 0.007280028180120508 0.001143412373737395 0.001
+884 0.004337862502658474 0.01540622331333066 0.001
+885 0.000917490108779465 0.01177323162724565 0.001
+886 0.003531605522199343 0.01362972008284145 0.001
+887 0.008934764928313228 0.01766587468583981 0.001
+888 0.001065235071686375 0.002334125314155341 0.001
+889 0.002843499117963253 0.007942649234735274 0.001
+890 0.006274060941776503 0.007933039955671243 0.001
+891 0.00078850613045531 0.01082165844242667 0.001
+892 0.005966811094079103 0.01310089962729656 0.001
+893 0.003970299255444931 0.006859887219322645 0.001
+894 0.009212049772237347 0.009177010642702764 0.001
+895 0.0009386624244096229 0.004208563956027978 0.001
+896 0.009061337575594375 0.01579143604396686 0.001
+897 0.007712376461995641 0.005099755553228711 0.001
+898 0.002401834794973753 0.001097223206857409 0.001
+899 0.007598165205028772 0.01890277679314168 0.001
+900 0.006062431695232079 0.01559479255417854 0.001
+901 0.002216483168409753 0.01476451135113511 0.001
+902 0.006246647907718659 0.01199955286615993 0.001
+903 0.00802939859634059 0.00813898961160254 0.001
+904 0.004019539290064437 0.00366995471374027 0.001
+905 0.005493731715020181 0.006446833019494043 0.001
+906 0.003579819870568659 0.007855519387533419 0.001
+907 0.006502931764103641 0.006347812391772431 0.001
+908 0.007837895842261073 0.01597889783129435 0.001
+909 0.002147465425742864 0.004030621853559204 0.001
+910 0.004457811928002025 0.01360516466602536 0.001
+911 0.005217823562611983 0.009156861090299773 0.001
+912 0.005588194855958588 0.01674718535053479 0.001
+913 0.0009520840300791559 0.01590158985010916 0.001
+914 0.002590449006905483 0.01617145118013815 0.001
+915 0.007412477599845253 0.003819237746772281 0.001
+916 0.004837194549387218 0.01066402359862906 0.001
+917 0.005014618280069986 0.01291262048323323 0.001
+918 0.00906359031097482 0.003733555554411115 0.001
+919 0.008503397603849574 0.01433974538888144 0.001
+920 0.003725853536308338 0.004533611901838494 0.001
+921 0.008996218063371178 0.000999705993266154 0.001
+922 0.001003781936627461 0.01900029400673523 0.001
+923 0.001479779892789366 0.005671772869380312 0.001
+924 0.002066395860748317 0.01301063555562172 0.001
+925 0.005146946168705313 0.01172559829075392 0.001
+926 0.001376262509915517 0.01025475992594489 0.001
+927 0.004866067041169381 0.008198199398623641 0.001
+928 0.009244679695562922 0.007320407889421718 0.001
+929 0.004863424119444366 0.007190905250989277 0.001
+930 0.004739182521087426 0.003102486496371763 0.001
+931 0.007358664287617353 0.002015726236642763 0.001
+932 0.002650725500939507 0.0180061532742581 0.001
+933 0.005131569898028375 0.005636675865918521 0.001
+934 0.001012746461786011 0.01781356971821287 0.001
+935 0.008633361821619589 0.00972889174589933 0.001
+936 0.009039067958053294 0.002185272903509883 0.001
+937 0.004867421721661981 0.01441091946076166 0.001
+938 0.007421807823254663 0.01135977893595418 0.001
+939 0.003704661170165002 0.01751985283145772 0.001
+940 0.006365840498076971 0.002415328202119378 0.001
+941 0.002577375351038561 0.008622926785139611 0.001
+942 0.002061979417739715 0.009582212455893182 0.001
+943 0.006500555021833425 0.003609798800163349 0.001
+944 0.005972617683682266 0.01152497035555655 0.001
+945 0.007961328517290362 0.006744738162326991 0.001
+946 0.00320028590630641 0.009229958521560416 0.001
+947 0.004190474369932295 0.008255761118612993 0.001
+948 0.002688984855313018 0.01048361704408013 0.001
+949 0.003502023709709474 0.01640439631902841 0.001
+950 0.006703025925300107 0.01070227068799807 0.001
+951 0.004312102913522912 0.0008071200845208426 0.001
+952 0.00568789708648581 0.01919287991547818 0.001
+953 0.007951544250907069 0.01049200796559758 0.001
+954 0.002930864185970048 0.002155289479918259 0.001
+955 0.007069135814032096 0.01784471052008731 0.001
+956 0.000499888715133609 0.01264049669861551 0.001
+957 0.003733822830927385 0.01473657567451479 0.001
+958 0.007684586063743943 0.007562269918879485 0.001
+959 0.007419958567263538 0.01258906481038508 0.001
+960 0.004954275444536475 0.004760193355971208 0.001
+961 0.001880195756322092 0.01912494141464239 0.001
+962 0.00812025478875235 0.0008755073214749163 0.001
+963 0.005846000207179164 0.01402542783162418 0.001
+964 0.004064744342250251 0.005905878945097755 0.001
+965 0.00252915773929209 0.01236615878239367 0.001
+966 0.006187011463750417 0.005159320880964256 0.001
+967 0.006390814081643529 0.01483171825365947 0.001
+968 0.002532360712583719 0.007240969663207025 0.001
+969 0.007766464869272707 0.002735900766962055 0.001
+970 0.009282302016314858 0.004669464247928035 0.001
+971 0.00447961474298631 0.009534519802402785 0.001
+972 0.007717803611617315 0.01494377027135704 0.001
+973 0.002195790330335857 0.01725293195278214 0.001
+974 0.004934361510518762 0.01504006989007957 0.001
+975 0.006834395828960504 0.01341433496047769 0.001
+976 0.002712498539119074 0.01373526227475578 0.001
+977 0.005544890597559842 0.01035294715221323 0.001
+978 0.003235759653363434 0.01237620085062372 0.001
+979 0.00623745475054456 0.01635867927214151 0.001
+980 0.007223295830455401 0.009543196031342965 0.001
+981 0.00416597516813063 0.01914108444003285 0.001
+982 0.005834024831881803 0.0008589155599659657 0.001
+983 0.003853063300523235 0.008826205058057156 0.001
+984 0.0006038639561791506 0.01528816697485805 0.001
+985 0.002594918374392846 0.01541709308018267 0.001
+986 0.002595370244753938 0.009780679258684253 0.001
+987 0.004426975164765895 0.01791187744407259 0.001
+988 0.005559730291462136 0.002122198959542087 0.001
+989 0.002244706270219333 0.00507319804175779 0.001
+990 0.003141692774022748 0.006545937056212011 0.001
+991 0.007994932813744115 0.01373321628528727 0.001
+992 0.00684027945819523 0.007479255750813767 0.001
+993 0.009488248857082507 0.01672610283187557 0.001
+994 0.0005117511429168821 0.00327389716812346 0.001
+995 0.005939329688807135 0.01797328784720544 0.001
+996 0.004005536807172519 0.002116313545808954 0.001
+997 0.00941197647311879 0.008648233754661777 0.001
+998 0.004495555426954095 0.016020208592118 0.001
+999 0.007434981365519363 0.01003090237380697 0.001
+1000 0.005539100724978158 0.004011208356486409 0.001
+1001 0.003704193330472559 0.005401516684911936 0.001
+1002 0.001972521553368494 0.006334086638148384 0.001
+1003 0.006086294350915985 0.01107391008239561 0.001
+1004 0.00807359174555443 0.003575243410282332 0.001
+1005 0.001887622767408721 0.01635971458697086 0.001
+1006 0.006106204455945681 0.008925852934510183 0.001
+1007 0.0005572497273635993 0.01134221424439316 0.001
+1008 0.007341232886668833 0.006222227559160753 0.001
+1009 0.00718811112006634 0.01394908759955204 0.001
+1010 0.003875385254858128 0.01146705503992032 0.001
+1011 0.009190980459059618 0.005833701928546643 0.001
+1012 0.000643153132975641 0.01652457963517852 0.001
+1013 0.002773881071998203 0.006035745204528706 0.001
+1014 0.008235689362241753 0.01728157638139997 0.001
+1015 0.001764310637755932 0.002718423618601121 0.001
+1016 0.007350134210108978 0.0155995183346896 0.001
+1017 0.00737709088687938 0.004493283948384647 0.001
+1018 0.0007645249109246824 0.01412371092510701 0.001
+1019 0.001458063765197867 0.01389536512911836 0.001
+1020 0.003456671706399164 0.0007422790501175339 0.001
+1021 0.006543328293608636 0.01925772094988082 0.001
+1022 0.009448004677750027 0.01536636670490961 0.001
+1023 0.000566643809036608 0.004647906139256061 0.001
+1024 0.004923602159658414 0.01700824679488357 0.001
+1025 0.00436242574988092 0.004701839355509967 0.001
+1026 0.005502712206101486 0.006998932922720281 0.001
+1027 0.003617259065983162 0.01046891230781695 0.001
+1028 0.008510962310463856 0.005955293780868281 0.001
+1029 0.006478979176923682 0.009428928191889828 0.001
+1030 0.008102404057913347 0.01932619164066675 0.001
+1031 0.001897595942087433 0.0006738083593327899 0.001
+1032 0.002593165067020627 0.004382303471514994 0.001
+1033 0.00189169137761904 0.010910245563544 0.001
+1034 0.003042715644962473 0.003250761911993415 0.001
+1035 0.00682269205114924 0.0166966007874722 0.001
+1036 0.003293421039716556 0.01935109381628067 0.001
+1037 0.006706578960289178 0.0006489061837174127 0.001
+1038 0.005991149887738344 0.006143565091234635 0.001
+1039 0.004986944897525943 0.01118249299136675 0.001
+1040 0.001450749643999507 0.0117371815166439 0.001
+1041 0.008137095377279524 0.009096748193964199 0.001
+1042 0.009210947370720909 0.01827632918354871 0.001
+1043 0.0007890526292789462 0.001723670816449385 0.001
+1044 0.006673828360462346 0.008370445825568184 0.001
+1045 0.001540252879973951 0.004096757237198079 0.001
+1046 0.008452095109275399 0.0159035999506863 0.001
+1047 0.003505544593182246 0.01299017431851219 0.001
+1048 0.009324153367234333 0.003225092803833725 0.001
+1049 0.009488671609471897 0.006818598912280476 0.001
+1050 0.004167213647843404 0.002815815725508426 0.001
+1051 0.003999644019851118 0.0109221810146114 0.001
+1052 0.001489311030995769 0.01326725748548071 0.001
+1053 0.005072001315173878 0.008684394084254074 0.001
+1054 0.003653144061966108 0.0141908674164225 0.001
+1055 0.005433533704176243 0.009871451808245831 0.001
+1056 0.006205296792426967 0.01362676111330658 0.001
+1057 0.005436403980786462 0.01840235908533146 0.001
+1058 0.004551670467938375 0.00161341724002547 0.001
+1059 0.004590940884588461 0.0100049016136067 0.001
+1060 0.002878367149789649 0.01134806907747952 0.001
+1061 0.006199761399458917 0.004129100654155607 0.001
+1062 0.005767916591801223 0.007966898915731616 0.001
+1063 0.001718716709995618 0.01503322278403413 0.001
+1064 0.002035998076206119 0.01250183665990315 0.001
+1065 0.008313740735332439 0.004881201786401022 0.001
+1066 0.00625485391569025 0.01263328560558016 0.001
+1067 0.001940756367943461 0.001441579043155749 0.001
+1068 0.008059243632057934 0.01855842095684397 0.001
+1069 0.003736598619917437 0.006398382862347728 0.001
+1070 0.002242011351710464 0.008944911231945206 0.001
+1071 0.006599744331275739 0.01543036362662653 0.001
+1072 0.005475250878889443 0.01541557996199588 0.001
+1073 0.0004893653580024675 0.01323485732785345 0.001
+1074 0.003777460616767009 0.007370269242424445 0.001
+1075 0.006543012115488039 0.00696419241910557 0.001
+1076 0.00779563511125655 0.01100721755642548 0.001
+1077 0.008471772994283857 0.008375616230348184 0.001
+1078 0.0009960316235909661 0.005749413429164746 0.001
+1079 0.008998782104492621 0.01425336519558048 0.001
+1080 0.003823663881101077 0.01586359773680058 0.001
+1081 0.009323650111311806 0.01932359290754278 0.001
+1082 0.0006763498886880082 0.0006764070924569585 0.001
+1083 0.008401721972151178 0.002387287226046277 0.001
+1084 0.005249784864223786 0.002788016817633143 0.001
+1085 0.007739155372537947 0.01296692329029532 0.001
+1086 0.008361624482483369 0.01013237645115801 0.001
+1087 0.002544524567265844 0.01427104671439187 0.001
+1088 0.007145791448985796 0.008637340961706187 0.001
+1089 0.00164385985570683 0.009861568224025926 0.001
+1090 0.004284703651445123 0.01185579499820118 0.001
+1091 0.007420031093582267 0.005643593549138663 0.001
+1092 0.008501498605954224 0.006835375619612074 0.001
+1093 0.001607373884964989 0.01758884515471162 0.001
+1094 0.006923671653480786 0.00499600703553199 0.001
+1095 0.007286163894970249 0.01451646861273581 0.001
+1096 0.006329837026729389 0.005703566024703536 0.001
+1097 0.000903786643889499 0.01031794389387179 0.001
+1098 0.002661129872902849 0.005467824933284546 0.001
+1099 0.003142365263719144 0.01505269637701107 0.001
+1100 0.003717461120599031 0.009963144878825934 0.001
+1101 0.003297390170594239 0.01799720530927842 0.001
+1102 0.006718588120770002 0.00199420679961671 0.001
+1103 0.0006139984082834785 0.01839282418993133 0.001
+1104 0.009395425663966811 0.005257530050917908 0.001
+1105 0.002422211460167594 0.007728872337998446 0.001
+1106 0.009083289678250814 0.009786865508471658 0.001
+1107 0.004569400083965463 0.01265237974408343 0.001
+1108 0.006326436381298624 0.009897120065344272 0.001
+1109 0.006164170882973552 0.008408029626459739 0.001
+1110 0.0005494939201277037 0.002663095173873288 0.001
+1111 0.009450506079872677 0.0173369048261251 0.001
+1112 0.005702872749119065 0.01606217505936252 0.001
+1113 0.001954978036395303 0.01141039666313062 0.001
+1114 0.002444583786782732 0.01166976064890092 0.001
+1115 0.005391477148824524 0.005058469859549167 0.001
+1116 0.004185685767216524 0.01233581690845414 0.001
+1117 0.007029988334006139 0.01106979087590169 0.001
+1118 0.009377726226736115 0.001598234975213327 0.001
+1119 0.00559685900801089 0.01269612240173692 0.001
+1120 0.007596767726277411 0.008412641267137238 0.001
+1121 0.0004559111045180209 0.005595331462661075 0.001
+1122 0.009542928647857305 0.01440543974701866 0.001
+1123 0.002971010610754975 0.008885839031589739 0.001
+1124 0.003998717310846897 0.01335735124310744 0.001
+1125 0.008179073780005612 0.0145965563701271 0.001
+1126 0.008056435892566799 0.008623994993002319 0.001
+1127 0.001987880736633906 0.003482863298251491 0.001
+1128 0.008013689907094251 0.01652813986128138 0.001
+1129 0.003380149127264717 0.01168747286712334 0.001
+1130 0.00809314462086832 0.005520555998965422 0.001
+1131 0.001144334811953336 0.004713059384972375 0.001
+1132 0.008853362743513983 0.01529601927453504 0.001
+1133 0.001799679506371989 0.005413746835899703 0.001
+1134 0.0005951800291196919 0.0172038195739871 0.001
+1135 0.007618357875227287 0.01180746027059541 0.001
+1136 0.00406888115626654 0.01388438460343605 0.001
+1137 0.006771943940344064 0.01229482318845186 0.001
+1138 0.005037674096206552 0.01640913465725384 0.001
+1139 0.005059197392941416 0.006131342260049921 0.001
+1140 0.006719615816675326 0.01178853553892036 0.001
+1141 0.009456796264935084 0.007869029355060196 0.001
+1142 0.0004623110453735734 0.01202284309369831 0.001
+1143 0.0004474629848898617 0.01040897315953487 0.001
+1144 0.005848055320418752 0.01730133267499799 0.001
+1145 0.001254970408949018 0.01541648466695178 0.001
+1146 0.007399055421800244 0.01631153254704081 0.001
+1147 0.002571517979141489 0.003688194055919792 0.001
+1148 0.005638624321318612 0.008987247266444667 0.001
+1149 0.007049710103326405 0.01727598656145487 0.001
+1150 0.002977096972160446 0.002685651628078564 0.001
+1151 0.0004846081241910124 0.003928394091816238 0.001
+1152 0.009517135743284387 0.01607330505629795 0.001
+1153 0.005798344362359827 0.007473057710878112 0.001
+1154 0.005328169600356722 0.008166393242912438 0.001
+1155 0.004312677013224425 0.007146173818568152 0.001
+1156 0.00955279716762608 0.009598458522026225 0.001
+1157 0.004720228184573572 0.01166002150725588 0.001
+1158 0.00301127200871353 0.009637410561610322 0.001
+1159 0.008476368005781195 0.01807081612749719 0.001
+1160 0.001523631994219945 0.001929183872500981 0.001
+1161 0.002207478346366891 0.006924715925201764 0.001
+1162 0.00265938170561098 0.00158335276329869 0.001
+1163 0.007340618294391696 0.01841664723670132 0.001
+1164 0.006999873127872259 0.01031495484813764 0.001
+1165 0.003285594628990272 0.008155014935133625 0.001
+1166 0.004863795968403078 0.007737672999914916 0.001
+1167 0.005671297409948682 0.01190789043748652 0.001
+1168 0.001087418563165415 0.01132356599530564 0.001
+1169 0.00319604079662408 0.007654826185514713 0.001
+1170 0.004464341908606614 0.01846919417775045 0.001
+1171 0.005532999182649991 0.001537621102967984 0.001
+1172 0.001876843180941987 0.01441007356452528 0.001
+1173 0.003179600104888706 0.004489871194524749 0.001
+1174 0.004961865499660938 0.01942809420391773 0.001
+1175 0.005038134500346163 0.0005719057960809488 0.001
+1176 0.002497391115974212 0.01669285778847543 0.001
+1177 0.005108735825662524 0.01242940157556526 0.001
+1178 0.002420069959245517 0.008165199625948168 0.001
+1179 0.0005065739162422761 0.01465188282063577 0.001
+1180 0.0009986324101386851 0.01294680390353973 0.001
+1181 0.003626210666250067 0.004050257902371963 0.001
+1182 0.001325239328155077 0.01075060101779122 0.001
+1183 0.001285028256213123 0.01635638616872531 0.001
+1184 0.004360821436183306 0.01488459838762903 0.001
+1185 0.007220382621821069 0.01301123638668516 0.001
+1186 0.0084742969700885 0.01388147937943371 0.001
+1187 0.009468345976666232 0.002683213357048265 0.001
+1188 0.006354029820507567 0.003128226740756826 0.001
+1189 0.007490838639616483 0.00329320280662165 0.001
+1190 0.003732549694476676 0.01251606649033564 0.001
+1191 0.003793649769831429 0.008335888641301683 0.001
+1192 0.001450655729362586 0.006080471797225235 0.001
+1193 0.008278316554368783 0.006402031777680391 0.001
+1194 0.001072679814882657 0.002931147064286835 0.001
+1195 0.008927320185113885 0.01706885293570988 0.001
+1196 0.003697063578659705 0.01687052211349963 0.001
+1197 0.006426224086385342 0.0131106391367317 0.001
+1198 0.0003586437685417542 0.01085415741809529 0.001
+1199 0.008727757047774337 0.009244460799072545 0.001
+1200 0.008886853868519128 0.007630269353847727 0.001
+1201 0.009635364682596443 0.00914515233505379 0.001
+1202 0.0088804007355611 0.008738203637777206 0.001
+1203 0.004889871284567097 0.01338163527806235 0.001
+1204 0.002281532942389011 0.01844064780120859 0.001
+1205 0.00771820397196675 0.001561126786351432 0.001
+1206 0.003530798796339115 0.006864232357986126 0.001
+1207 0.004892877803425804 0.01384724177339616 0.001
+1208 0.008769750536414966 0.004353140468049285 0.001
+1209 0.007936261905283232 0.01552300175665429 0.001
+1210 0.002655640800111086 0.01946652457143621 0.001
+1211 0.007344449308906399 0.0005335651757859448 0.001
+1212 0.006383064032937634 0.007452645083295828 0.001
+1213 0.005028500217408175 0.006594683737022431 0.001
+1214 0.002492320320264557 0.01328118050112874 0.001
+1215 0.005772055095449933 0.01068351174200754 0.001
+1216 0.007302676974338746 0.01942430516693347 0.001
+1217 0.002697323025663178 0.0005756948330653507 0.001
+1218 0.004233294294553375 0.009156554618833752 0.001
+1219 0.006028743853193909 0.0151635754440046 0.001
+1220 0.006785732656214028 0.01444375713246407 0.001
+1221 0.001067118446920739 0.01228525242741079 0.001
+1222 0.009632384491539159 0.01485670455324756 0.001
+1223 0.0003699581135263906 0.005146673984188277 0.001
+1224 0.006897822796847329 0.009346522723080217 0.001
+1225 0.002798998721246649 0.00690755679655381 0.001
+1226 0.005233550168780587 0.003502206573161849 0.001
+1227 0.005991050973802997 0.006655985326420521 0.001
+1228 0.004462654821183151 0.01732113885031051 0.001
+1229 0.003159194393569317 0.005469298276973083 0.001
+1230 0.003259194634871922 0.01860604280400996 0.001
+1231 0.006722482138630599 0.001394491140830851 0.001
+1232 0.004816845302022861 0.01553712109432324 0.001
+1233 0.004482310155535028 0.0108658225220876 0.001
+1234 0.009492520990068136 0.004165692842504942 0.001
+1235 0.003188556953306489 0.01397783059465092 0.001
+1236 0.002303115460462414 0.01065657558703221 0.001
+1237 0.007651455656123553 0.01219158795760358 0.001
+1238 0.008455148031269037 0.007886823840927652 0.001
+1239 0.004527677286745815 0.003658161968364866 0.001
+1240 0.007542176514559399 0.01743834771432307 0.001
+1241 0.002406860388834803 0.002569956174984454 0.001
+1242 0.005246016332469193 0.004414089066379509 0.001
+1243 0.009429657116846384 0.0005740313164826189 0.001
+1244 0.0005995596155369009 0.01942485579709612 0.001
+1245 0.003110264168751157 0.01604010265490603 0.001
+1246 0.004641142863258701 0.005730603777120325 0.001
+1247 0.008671497686183943 0.01474430658565103 0.001
+1248 0.0020372945125984 0.004470189674911804 0.001
+1249 0.006902785580503969 0.003948468390765638 0.001
+1250 0.008945308893017217 0.007017588562334223 0.001
+1251 0.005796195578575148 0.002664003142419463 0.001
+1252 0.005692547854774892 0.01356421554782246 0.001
+1253 0.0009976413144244191 0.003647338433206436 0.001
+1254 0.009002358685574795 0.01635266156679368 0.001
+1255 0.004186305891404215 0.006433111890127307 0.001
+1256 0.003124636193950323 0.01052819653167901 0.001
+1257 0.001614177701847862 0.01221899242775141 0.001
+1258 0.005547695794512234 0.0114294481820909 0.001
+1259 0.008017241480885963 0.007253255758109441 0.001
+1260 0.002084062842742541 0.01783749084854624 0.001
+1261 0.005094586929600987 0.001764976710913929 0.001
+1262 0.004896553308909308 0.01824736820285169 0.001
+1263 0.007598952426145902 0.01383589813802558 0.001
+1264 0.00856097897079253 0.003823528077080375 0.001
+1265 0.004495854546391353 0.01312704747357356 0.001
+1266 0.008771443718692243 0.01949165308234737 0.001
+1267 0.001228556281308247 0.0005083469176524583 0.001
+1268 0.002728788587579483 0.01480648389594859 0.001
+1269 0.005369697850860371 0.01401284421812158 0.001
+1270 0.006904840417165347 0.006011544040433257 0.001
+1271 0.004034385675829964 0.007900256691916317 0.001
+1272 0.001319926100411506 0.005265358773265854 0.001
+1273 0.005994046795577933 0.00364960314406536 0.001
+1274 0.003009631588134226 0.001135071720453804 0.001
+1275 0.006990368411870411 0.01886492827954214 0.001
+1276 0.00700072518966331 0.01149038280135894 0.001
+1277 0.00402183644042834 0.00139304573854197 0.001
+1278 0.005973275873329648 0.01861463485317741 0.001
+1279 0.003639878232442061 0.003315130808188666 0.001
+1280 0.003481901418370657 0.009609917173687022 0.001
+1281 0.009514021865241149 0.01880290907517289 0.001
+1282 0.0004859781347575767 0.00119709092482577 0.001
+1283 0.008702185587097098 0.0005336407043567417 0.001
+1284 0.001299976750910109 0.01946631088818676 0.001
+1285 0.003450845787173795 0.002253350289432704 0.001
+1286 0.006509557232915205 0.01774887160903199 0.001
+1287 0.007905330104154912 0.002182863782989785 0.001
+1288 0.004988353719513834 0.009536657536504322 0.001
+1289 0.006605013334629604 0.01022757329168126 0.001
+1290 0.002376327371576325 0.006178296836291341 0.001
+1291 0.003986406778678207 0.0163515630403939 0.001
+1292 0.009546491489843094 0.006259856635042309 0.001
+1293 0.006121085033586376 0.01685003686797599 0.001
+1294 0.004159990536491189 0.009886648171268501 0.001
+1295 0.00190137179508272 0.01344064968039409 0.001
+1296 0.006410344310257387 0.01590328056345594 0.001
+1297 0.006305721467146209 0.004652091788902512 0.001
+1298 0.005895566018629615 0.0123073977477369 0.001
+1299 0.005894454712662237 0.009993122434366 0.001
+1300 0.004806583453470519 0.009147850646761477 0.001
+1301 0.0004124885952462244 0.01591238188623254 0.001
+1302 0.0054649399550333 0.009425652412381564 0.001
+1303 0.002935935453383858 0.008424247986079063 0.001
+1304 0.000455396028001961 0.0137048527557537 0.001
+1305 0.005069151227110971 0.01033846346547414 0.001
+1306 0.006950553087180275 0.003459113502816428 0.001
+1307 0.003095138059448469 0.01336818177911526 0.001
+1308 0.00282899960547517 0.007548492290829546 0.001
+1309 0.002404250043110285 0.01280436051080533 0.001
+1310 0.003059093286536753 0.01653726392070557 0.001
+1311 0.007869140195357291 0.004615410531871616 0.001
+1312 0.006750897438130126 0.007923112238081559 0.001
+1313 0.002137739753859237 0.01524619406675619 0.001
+1314 0.008781315376660414 0.001510304423517415 0.001
+1315 0.007210995195621482 0.009065959245250168 0.001
+1316 0.004553913004701222 0.008443644760284108 0.001
+1317 0.005234338162514431 0.01070952361173619 0.001
+1318 0.001224361491255491 0.01849534965152835 0.001
+1319 0.005488524811274482 0.005993460714558504 0.001
+1320 0.006341561238950479 0.0115552447791535 0.001
+1321 0.007027215604369705 0.002427181259408279 0.001
+1322 0.002996974315345906 0.01756886087395304 0.001
+1323 0.004570560683273593 0.0104201198760873 0.001
+1324 0.004478457029887932 0.008010071781002279 0.001
+1325 0.007745561797446234 0.00417690423881531 0.001
+1326 0.002279988806575261 0.01579241949763954 0.001
+1327 0.004539075510840528 0.006740377165244727 0.001
+1328 0.007476431264155967 0.006665904969480282 0.001
+1329 0.003797595210610323 0.01528214372395003 0.001
+1330 0.007619494925911116 0.007949757865300599 0.001
+1331 0.005403062977762628 0.01320774399268942 0.001
+1332 0.008164456582846437 0.01414983936855721 0.001
+1333 0.004158850768208498 0.004116261940454543 0.001
+1334 0.008001521280437088 0.01328840428190029 0.001
+1335 0.008829316760388971 0.00487678088047496 0.001
+1336 0.007719010639080531 0.009400956822310919 0.001
+1337 0.003425028503299003 0.004975132125708689 0.001
+1338 0.0004431005600319085 0.01889085311073416 0.001
+1339 0.004218698195636628 0.003312309942434798 0.001
+1340 0.004507013945564247 0.01402604699417618 0.001
+1341 0.006233064862701822 0.01432100617028373 0.001
+1342 0.006976203225259285 0.006575840142270943 0.001
+1343 0.009684244794334284 0.00736296745834457 0.001
+1344 0.001440339556219441 0.01593051104165177 0.001
+1345 0.00180348588527727 0.005856742746850355 0.001
+1346 0.008045748220925917 0.00769383543848596 0.001
+1347 0.004741836966376777 0.005217920132107246 0.001
+1348 0.0004895212361456899 0.002149816574642328 0.001
+1349 0.009510478763854467 0.01785018342535569 0.001
+1350 0.007256687267674157 0.007618525542790043 0.001
+1351 0.004194168537194069 0.008655637139640947 0.001
+1352 0.003919147903162262 0.004958361433314767 0.001
+1353 0.002780451790359389 0.01086093300867291 0.001
+1354 0.00370098346229214 0.009214685108592255 0.001
+1355 0.005373447646307649 0.01719144881654189 0.001
+1356 0.009560720281390734 0.001100670494331938 0.001
+1357 0.009511479424016879 0.003679820846974944 0.001
+1358 0.007601347200993865 0.007140454424090918 0.001
+1359 0.001803774852585683 0.01042443120325028 0.001
+1360 0.008241753929399003 0.009560974276123188 0.001
+1361 0.002837151501756888 0.01010742317548365 0.001
+1362 0.005239555961654359 0.01209408311882577 0.001
+$EndNodes
+$Elements
+1289
+1 15 2 113 7 7
+2 3 4 111 43 1 2 1 21 141 15
+3 3 4 111 43 1 2 21 22 142 141
+4 3 4 111 43 1 2 22 23 143 142
+5 3 4 111 43 1 2 23 24 144 143
+6 3 4 111 43 1 2 24 25 145 144
+7 3 4 111 43 1 2 25 26 146 145
+8 3 4 111 43 1 2 26 27 147 146
+9 3 4 111 43 1 2 27 28 148 147
+10 3 4 111 43 1 2 28 29 149 148
+11 3 4 111 43 1 1 29 30 150 149
+12 3 4 111 43 1 1 30 31 151 150
+13 3 4 111 43 1 1 31 32 152 151
+14 3 4 111 43 1 1 32 2 16 152
+15 3 4 112 63 1 3 6 55 185 20
+16 3 4 112 63 1 3 55 56 186 185
+17 3 4 112 63 1 3 56 57 187 186
+18 3 4 112 63 1 3 57 58 188 187
+19 3 4 112 63 1 3 58 59 189 188
+20 3 4 112 63 1 3 59 60 190 189
+21 3 4 112 63 1 3 60 61 191 190
+22 3 4 112 63 1 3 61 62 192 191
+23 3 4 112 63 1 3 62 63 193 192
+24 3 4 112 63 1 3 63 64 194 193
+25 3 4 112 63 1 3 64 65 195 194
+26 3 4 112 63 1 3 65 66 196 195
+27 3 4 112 63 1 3 66 7 11 196
+28 6 4 11 1 1 3 242 398 647 825 981 1230
+29 6 5 11 1 2 2 -1 243 399 648 826 982 1231
+30 6 6 11 1 3 4 -1 -3 361 675 420 944 1258 1003
+31 6 6 11 1 3 4 -1 -3 675 247 420 1258 830 1003
+32 6 4 11 1 1 3 647 398 453 1230 981 1036
+33 6 5 11 1 2 2 -1 648 399 454 1231 982 1037
+34 6 4 11 1 1 1 753 253 416 1336 836 999
+35 6 4 11 1 1 1 397 753 416 980 1336 999
+36 6 5 11 1 2 3 -4 256 422 390 839 1005 973
+37 6 4 11 1 1 4 202 382 531 785 965 1114
+38 6 4 11 1 1 4 270 403 359 853 986 942
+39 6 4 11 1 1 3 69 351 520 111 934 1103
+40 6 4 11 1 1 4 100 506 343 124 1089 926
+41 6 4 11 1 1 1 35 353 535 155 936 1118
+42 6 4 11 1 1 4 297 531 382 880 1114 965
+43 6 5 11 1 2 2 -1 205 491 572 788 1074 1155
+44 6 4 11 1 1 1 258 335 681 841 918 1264
+45 6 4 11 1 1 4 202 395 382 785 978 965
+46 6 5 11 1 2 4 -3 254 391 354 837 974 937
+47 6 4 11 1 1 2 105 106 419 129 130 1002
+48 6 4 11 1 1 1 253 370 416 836 953 999
+49 6 4 11 1 1 4 282 436 435 865 1019 1018
+50 6 4 11 1 1 2 211 418 381 794 1001 964
+51 6 4 11 1 1 4 251 359 403 834 942 986
+52 6 4 11 1 1 3 90 496 603 175 1079 1186
+53 6 4 11 1 1 4 101 102 359 125 126 942
+54 6 4 11 1 1 1 38 39 387 158 159 970
+55 6 5 11 1 2 4 -3 319 584 361 902 1167 944
+56 6 5 11 1 2 4 -3 483 536 715 1066 1119 1298
+57 6 4 11 1 1 1 258 353 604 841 936 1187
+58 6 4 11 1 1 1 273 423 526 856 1006 1109
+59 6 4 11 1 1 4 272 546 477 855 1129 1060
+60 6 4 11 1 1 4 251 778 365 834 1361 948
+61 6 4 11 1 1 4 208 504 589 791 1087 1172
+62 6 4 11 1 1 2 105 419 578 129 1002 1161
+63 6 4 11 1 1 1 97 503 352 168 1086 935
+64 6 4 11 1 1 3 249 372 580 832 955 1163
+65 6 4 11 1 1 2 248 371 579 831 954 1162
+66 6 4 11 1 1 4 270 359 487 853 942 1070
+67 6 4 11 1 1 4 251 403 778 834 986 1361
+68 6 4 11 1 1 1 269 416 370 852 999 953
+69 6 5 11 1 2 2 -1 714 237 511 1297 820 1094
+70 6 4 11 1 1 4 255 382 395 838 965 978
+71 6 4 11 1 1 2 200 449 564 783 1032 1147
+72 6 5 11 1 2 4 -1 230 771 363 813 1354 946
+73 6 4 11 1 1 1 258 465 335 841 1048 918
+74 6 4 11 1 1 4 102 487 359 126 1070 942
+75 6 4 11 1 1 3 256 351 551 839 934 1134
+76 6 4 11 1 1 4 262 435 436 845 1018 1019
+77 6 4 11 1 1 3 242 356 404 825 939 987
+78 6 4 11 1 1 2 243 357 405 826 940 988
+79 6 5 11 1 2 2 -1 383 714 511 966 1297 1094
+80 6 4 11 1 1 4 78 424 559 120 1007 1142
+81 6 5 11 1 2 1 -2 205 346 583 788 929 1166
+82 6 5 11 1 2 1 -2 324 492 644 907 1075 1227
+83 6 4 11 1 1 2 257 381 418 840 964 1001
+84 6 4 11 1 1 1 273 526 461 856 1109 1044
+85 6 5 11 1 2 3 -4 309 536 483 892 1119 1066
+86 6 4 11 1 1 4 233 481 341 816 1064 924
+87 6 4 11 1 1 2 305 577 432 888 1160 1015
+88 6 4 11 1 1 3 304 576 431 887 1159 1014
+89 6 4 11 1 1 2 200 696 598 783 1279 1181
+90 6 4 11 1 1 4 262 562 401 845 1145 984
+91 6 4 11 1 1 4 198 354 601 781 937 1184
+92 6 5 11 1 2 1 -2 279 583 346 862 1166 929
+93 6 4 11 1 1 3 298 376 554 881 959 1137
+94 6 4 11 1 1 3 299 349 647 882 932 1230
+95 6 5 11 1 2 1 -2 300 348 648 883 931 1231
+96 6 5 11 1 2 2 -1 205 572 346 788 1155 929
+97 6 4 11 1 1 1 95 370 96 170 953 169
+98 6 4 11 1 1 2 25 26 368 145 146 951
+99 6 4 11 1 1 3 59 60 369 189 190 952
+100 6 4 11 1 1 2 107 495 609 131 1078 1192
+101 6 5 11 1 2 1 -2 205 688 491 788 1271 1074
+102 6 4 11 1 1 2 197 532 383 780 1115 966
+103 6 4 11 1 1 4 272 444 468 855 1027 1051
+104 6 4 11 1 1 3 275 488 384 858 1071 967
+105 6 5 11 1 2 1 -4 230 400 771 813 983 1354
+106 6 4 11 1 1 4 233 341 469 816 924 1052
+107 6 5 11 1 2 1 -2 258 421 386 841 1004 969
+108 6 5 11 1 2 1 -2 279 346 443 862 929 1026
+109 6 4 11 1 1 4 100 343 514 124 926 1097
+110 6 4 11 1 1 4 262 480 562 845 1063 1145
+111 6 4 11 1 1 3 236 554 376 819 1137 959
+112 6 4 11 1 1 3 336 603 496 919 1186 1079
+113 6 6 11 1 3 1 -3 -4 284 367 420 867 950 1003
+114 6 4 11 1 1 3 280 474 369 863 1057 952
+115 6 4 11 1 1 2 281 475 368 864 1058 951
+116 6 4 11 1 1 2 326 564 449 909 1147 1032
+117 6 4 11 1 1 3 245 545 463 828 1128 1046
+118 6 4 11 1 1 2 246 544 462 829 1127 1045
+119 6 6 11 1 3 3 -1 -4 228 420 367 811 1003 950
+120 6 4 11 1 1 1 39 521 387 159 1104 970
+121 6 4 11 1 1 3 49 569 439 179 1152 1022
+122 6 4 11 1 1 2 83 568 440 135 1151 1023
+123 6 5 11 1 2 1 -2 314 508 511 897 1091 1094
+124 6 4 11 1 1 1 44 414 558 164 997 1141
+125 6 4 11 1 1 4 342 287 574 925 870 1157
+126 6 5 11 1 2 3 -4 390 422 593 973 1005 1176
+127 6 5 11 1 2 1 -2 300 622 348 883 1205 931
+128 6 4 11 1 1 3 299 621 349 882 1204 932
+129 6 4 11 1 1 1 345 558 617 928 1141 1200
+130 6 4 11 1 1 3 6 498 54 20 1081 184
+131 6 4 11 1 1 2 1 499 88 15 1082 140
+132 6 4 11 1 1 4 272 427 546 855 1010 1129
+133 6 4 11 1 1 1 274 445 428 857 1028 1011
+134 6 5 11 1 2 3 -4 329 555 529 912 1138 1112
+135 6 4 11 1 1 1 30 31 379 150 151 962
+136 6 4 11 1 1 3 64 65 378 194 195 961
+137 6 4 11 1 1 4 76 77 373 118 119 956
+138 6 4 11 1 1 2 200 451 696 783 1034 1279
+139 6 5 11 1 2 4 -3 319 715 584 902 1298 1167
+140 6 4 11 1 1 3 249 580 692 832 1163 1275
+141 6 4 11 1 1 2 248 579 691 831 1162 1274
+142 6 4 11 1 1 4 779 287 342 1362 870 925
+143 6 4 11 1 1 1 44 45 414 164 165 997
+144 6 4 11 1 1 2 197 350 532 780 933 1115
+145 6 4 11 1 1 2 295 383 532 878 966 1115
+146 6 4 11 1 1 1 311 616 619 894 1199 1202
+147 6 4 11 1 1 1 286 617 558 869 1200 1141
+148 6 5 11 1 2 1 -2 231 644 492 814 1227 1075
+149 6 4 11 1 1 1 232 667 617 815 1250 1200
+150 6 4 11 1 1 1 213 397 416 796 980 999
+151 6 5 11 1 2 2 -1 206 738 386 789 1321 969
+152 6 4 11 1 1 1 34 35 535 154 155 1118
+153 6 4 11 1 1 3 6 55 498 20 185 1081
+154 6 4 11 1 1 2 1 21 499 15 141 1082
+155 6 4 11 1 1 4 78 79 424 120 121 1007
+156 6 4 11 1 1 4 251 506 359 834 1089 942
+157 6 4 11 1 1 1 267 428 445 850 1011 1028
+158 6 4 11 1 1 2 197 736 350 780 1319 933
+159 6 4 11 1 1 2 257 442 764 840 1025 1347
+160 6 4 11 1 1 3 256 510 351 839 1093 934
+161 6 4 11 1 1 2 340 609 495 923 1192 1078
+162 6 4 11 1 1 4 282 469 436 865 1052 1019
+163 6 4 11 1 1 4 308 599 585 891 1182 1168
+164 6 4 11 1 1 4 354 391 601 937 974 1184
+165 6 4 11 1 1 1 258 604 465 841 1187 1048
+166 6 4 11 1 1 4 374 746 516 957 1329 1099
+167 6 4 11 1 1 1 311 619 414 894 1202 997
+168 6 4 11 1 1 3 384 488 636 967 1071 1219
+169 6 4 11 1 1 2 377 764 442 960 1347 1025
+170 6 4 11 1 1 3 68 69 520 110 111 1103
+171 6 4 11 1 1 3 285 426 392 868 1009 975
+172 6 5 11 1 2 4 -3 254 354 686 837 937 1269
+173 6 4 11 1 1 3 201 433 563 784 1016 1146
+174 6 4 11 1 1 3 207 739 390 790 1322 973
+175 6 4 11 1 1 1 97 352 523 168 935 1106
+176 6 5 11 1 2 1 -2 271 511 508 854 1094 1091
+177 6 4 11 1 1 1 95 493 370 170 1076 953
+178 6 4 11 1 1 4 72 73 401 114 115 984
+179 6 4 11 1 1 4 302 559 424 885 1142 1007
+180 6 4 11 1 1 2 312 462 548 895 1045 1131
+181 6 4 11 1 1 3 313 463 549 896 1046 1132
+182 6 4 11 1 1 4 255 395 464 838 978 1047
+183 6 5 11 1 2 1 -3 94 355 493 171 938 1076
+184 6 4 11 1 1 3 60 591 369 190 1174 952
+185 6 4 11 1 1 2 26 592 368 146 1175 951
+186 6 5 11 1 2 2 -1 348 386 738 931 969 1321
+187 6 4 11 1 1 1 253 503 370 836 1086 953
+188 6 4 11 1 1 2 215 347 467 798 930 1050
+189 6 4 11 1 1 2 224 377 442 807 960 1025
+190 6 6 11 1 3 3 -1 -4 228 737 420 811 1320 1003
+191 6 4 11 1 1 3 325 563 433 908 1146 1016
+192 6 4 11 1 1 3 235 351 510 818 934 1093
+193 6 4 11 1 1 1 258 500 353 841 1083 936
+194 6 4 11 1 1 2 25 368 437 145 951 1020
+195 6 4 11 1 1 3 59 369 438 189 952 1021
+196 6 4 11 1 1 1 234 379 731 817 962 1314
+197 6 4 11 1 1 1 269 370 493 852 953 1076
+198 6 6 11 1 3 3 -1 -4 361 420 737 944 1003 1320
+199 6 4 11 1 1 4 202 546 395 785 1129 978
+200 6 4 11 1 1 4 198 374 471 781 957 1054
+201 6 4 11 1 1 4 746 238 516 1329 821 1099
+202 6 4 11 1 1 4 294 395 546 877 978 1129
+203 6 4 11 1 1 2 27 28 399 147 148 982
+204 6 4 11 1 1 3 61 62 398 191 192 981
+205 6 5 11 1 2 3 -1 94 552 355 171 1135 938
+206 6 5 11 1 2 3 -4 319 361 737 902 944 1320
+207 6 4 11 1 1 1 35 604 353 155 1187 936
+208 6 5 11 1 2 3 -4 225 529 555 808 1112 1138
+209 6 4 11 1 1 3 280 369 591 863 952 1174
+210 6 4 11 1 1 2 281 368 592 864 951 1175
+211 6 4 11 1 1 3 69 551 351 111 1134 934
+212 6 5 11 1 2 1 -4 103 595 358 127 1178 941
+213 6 4 11 1 1 2 305 432 611 888 1015 1194
+214 6 4 11 1 1 3 304 431 612 887 1014 1195
+215 6 4 11 1 1 4 436 469 712 1019 1052 1295
+216 6 4 11 1 1 3 235 378 735 818 961 1318
+217 6 4 11 1 1 3 48 49 439 178 179 1022
+218 6 4 11 1 1 2 82 83 440 134 135 1023
+219 6 4 11 1 1 3 249 438 695 832 1021 1278
+220 6 4 11 1 1 2 248 437 694 831 1020 1277
+221 6 4 11 1 1 4 318 589 504 901 1172 1087
+222 6 4 11 1 1 3 349 518 647 932 1101 1230
+223 6 5 11 1 2 2 -1 348 519 648 931 1102 1231
+224 6 4 11 1 1 1 265 423 446 848 1006 1029
+225 6 4 11 1 1 3 349 390 739 932 973 1322
+226 6 5 11 1 2 3 -4 254 380 758 837 963 1341
+227 6 4 11 1 1 2 289 430 407 872 1013 990
+228 6 4 11 1 1 2 224 656 643 807 1239 1226
+229 6 4 11 1 1 4 308 585 424 891 1168 1007
+230 6 4 11 1 1 4 198 601 374 781 1184 957
+231 6 4 11 1 1 4 268 471 374 851 1054 957
+232 6 4 11 1 1 1 338 731 379 921 1314 962
+233 6 4 11 1 1 4 746 601 301 1329 1184 884
+234 6 5 11 1 2 4 -1 103 358 487 127 941 1070
+235 6 4 11 1 1 4 272 468 427 855 1051 1010
+236 6 5 11 1 2 3 -4 254 758 384 837 1341 967
+237 6 4 11 1 1 1 234 353 500 817 936 1083
+238 6 4 11 1 1 3 235 735 351 818 1318 934
+239 6 4 11 1 1 2 215 501 347 798 1084 930
+240 6 4 11 1 1 3 210 392 426 793 975 1009
+241 6 4 11 1 1 3 245 463 671 828 1046 1254
+242 6 4 11 1 1 2 246 462 670 829 1045 1253
+243 6 4 11 1 1 2 217 432 577 800 1015 1160
+244 6 4 11 1 1 3 216 431 576 799 1014 1159
+245 6 4 11 1 1 2 27 399 592 147 982 1175
+246 6 4 11 1 1 3 61 398 591 191 981 1174
+247 6 4 11 1 1 1 286 558 414 869 1141 997
+248 6 4 11 1 1 3 339 735 378 922 1318 961
+249 6 5 11 1 2 3 -4 207 613 356 790 1196 939
+250 6 4 11 1 1 3 369 695 438 952 1278 1021
+251 6 4 11 1 1 2 368 694 437 951 1277 1020
+252 6 4 11 1 1 2 206 605 357 789 1188 940
+253 6 4 11 1 1 4 238 662 402 821 1245 985
+254 6 5 11 1 2 4 -1 722 199 472 1305 782 1055
+255 6 5 11 1 2 3 -4 259 645 613 842 1228 1196
+256 6 4 11 1 1 3 250 542 389 833 1125 972
+257 6 4 11 1 1 1 273 446 423 856 1029 1006
+258 6 4 11 1 1 4 374 601 746 957 1184 1329
+259 6 4 11 1 1 3 201 452 396 784 1035 979
+260 6 4 11 1 1 3 313 439 569 896 1022 1152
+261 6 4 11 1 1 2 312 440 568 895 1023 1151
+262 6 4 11 1 1 1 345 617 667 928 1200 1250
+263 6 4 11 1 1 1 30 379 628 150 962 1211
+264 6 4 11 1 1 3 64 378 627 194 961 1210
+265 6 5 11 1 2 3 -4 254 686 380 837 1269 963
+266 6 4 11 1 1 4 266 468 444 849 1051 1027
+267 6 4 11 1 1 2 220 548 462 803 1131 1045
+268 6 4 11 1 1 3 221 549 463 804 1132 1046
+269 6 5 11 1 2 2 -1 271 383 511 854 966 1094
+270 6 4 11 1 1 3 201 488 433 784 1071 1016
+271 6 5 11 1 2 3 -4 256 551 429 839 1134 1012
+272 6 5 11 1 2 1 -3 269 493 355 852 1076 938
+273 6 5 11 1 2 3 -4 356 613 645 939 1196 1228
+274 6 5 11 1 2 4 -1 270 487 358 853 1070 941
+275 6 4 11 1 1 4 251 365 653 834 948 1236
+276 6 5 11 1 2 4 -1 394 722 472 977 1305 1055
+277 6 4 11 1 1 4 198 757 354 781 1340 937
+278 6 4 11 1 1 3 325 463 545 908 1046 1128
+279 6 4 11 1 1 2 326 462 544 909 1045 1127
+280 6 5 11 1 2 2 -1 310 572 491 893 1155 1074
+281 6 5 11 1 2 2 -1 104 578 385 128 1161 968
+282 6 4 11 1 1 3 275 433 488 858 1016 1071
+283 6 4 11 1 1 4 219 507 427 802 1090 1010
+284 6 4 11 1 1 3 50 51 410 180 181 993
+285 6 4 11 1 1 2 84 85 411 136 137 994
+286 6 4 11 1 1 1 234 731 353 817 1314 936
+287 6 4 11 1 1 2 277 577 460 860 1160 1043
+288 6 4 11 1 1 3 276 576 459 859 1159 1042
+289 6 4 11 1 1 4 101 359 506 125 942 1089
+290 6 5 11 1 2 4 -1 705 199 476 1288 782 1059
+291 6 5 11 1 2 4 -1 270 540 363 853 1123 946
+292 6 4 11 1 1 4 72 401 718 114 984 1301
+293 6 4 11 1 1 3 275 389 433 858 972 1016
+294 6 5 11 1 2 1 -2 258 681 421 841 1264 1004
+295 6 4 11 1 1 2 211 407 430 794 990 1013
+296 6 5 11 1 2 4 -3 331 402 662 914 985 1245
+297 6 5 11 1 2 2 -1 324 455 513 907 1038 1096
+298 6 4 11 1 1 2 257 663 381 840 1246 964
+299 6 4 11 1 1 3 207 356 739 790 939 1322
+300 6 4 11 1 1 2 206 357 738 789 940 1321
+301 6 4 11 1 1 2 281 592 399 864 1175 982
+302 6 4 11 1 1 3 280 591 398 863 1174 981
+303 6 4 11 1 1 4 100 101 506 124 125 1089
+304 6 5 11 1 2 3 -1 355 552 298 938 1135 881
+305 6 4 11 1 1 4 77 559 373 119 1142 956
+306 6 5 11 1 2 1 -3 269 534 367 852 1117 950
+307 6 5 11 1 2 1 -3 269 355 534 852 938 1117
+308 6 4 11 1 1 3 62 453 398 192 1036 981
+309 6 5 11 1 2 2 -1 28 454 399 148 1037 982
+310 6 4 11 1 1 3 250 389 512 833 972 1095
+311 6 4 11 1 1 3 93 502 376 172 1085 959
+312 6 4 11 1 1 4 270 363 575 853 946 1158
+313 6 4 11 1 1 4 294 427 507 877 1010 1090
+314 6 5 11 1 2 4 -1 388 705 476 971 1288 1059
+315 6 4 11 1 1 1 209 362 745 792 945 1328
+316 6 4 11 1 1 3 299 627 378 882 1210 961
+317 6 4 11 1 1 1 300 628 379 883 1211 962
+318 6 4 11 1 1 2 252 550 406 835 1133 989
+319 6 5 11 1 2 4 -1 230 363 540 813 946 1123
+320 6 4 11 1 1 2 224 643 417 807 1226 1000
+321 6 4 11 1 1 3 369 474 695 952 1057 1278
+322 6 4 11 1 1 2 368 475 694 951 1058 1277
+323 6 5 11 1 2 4 -1 270 358 540 853 941 1123
+324 6 4 11 1 1 1 96 503 97 169 1086 168
+325 6 5 11 1 2 2 -1 324 513 687 907 1096 1270
+326 6 4 11 1 1 3 57 633 447 187 1216 1030
+327 6 4 11 1 1 2 23 634 448 143 1217 1031
+328 6 5 11 1 2 3 -1 693 355 298 1276 938 881
+329 6 5 11 1 2 3 -1 228 367 534 811 950 1117
+330 6 5 11 1 2 1 -3 269 367 581 852 950 1164
+331 6 4 11 1 1 3 210 473 392 793 1056 975
+332 6 4 11 1 1 1 40 428 521 160 1011 1104
+333 6 4 11 1 1 4 247 675 456 830 1258 1039
+334 6 5 11 1 2 4 -3 366 613 727 949 1196 1310
+335 6 4 11 1 1 4 238 497 662 821 1080 1245
+336 6 4 11 1 1 3 214 404 645 797 987 1228
+337 6 4 11 1 1 4 268 374 516 851 957 1099
+338 6 4 11 1 1 1 267 547 482 850 1130 1065
+339 6 4 11 1 1 1 96 370 503 169 953 1086
+340 6 4 11 1 1 4 208 393 504 791 976 1087
+341 6 5 11 1 2 1 -3 284 706 367 867 1289 950
+342 6 4 11 1 1 4 208 589 436 791 1172 1019
+343 6 5 11 1 2 1 -4 230 608 400 813 1191 983
+344 6 4 11 1 1 3 235 621 378 818 1204 961
+345 6 4 11 1 1 1 234 622 379 817 1205 962
+346 6 4 11 1 1 1 244 733 470 827 1316 1053
+347 6 4 11 1 1 4 366 662 497 949 1245 1080
+348 6 5 11 1 2 4 -3 259 415 555 842 998 1138
+349 6 4 11 1 1 3 242 518 356 825 1101 939
+350 6 4 11 1 1 2 243 519 357 826 1102 940
+351 6 4 11 1 1 2 289 578 419 872 1161 1002
+352 6 4 11 1 1 4 302 457 638 885 1040 1221
+353 6 5 11 1 2 4 -3 204 715 536 787 1298 1119
+354 6 4 11 1 1 4 457 674 638 1040 1257 1221
+355 6 4 11 1 1 2 211 486 407 794 1069 990
+356 6 4 11 1 1 1 209 610 362 792 1193 945
+357 6 4 11 1 1 2 211 381 486 794 964 1069
+358 6 5 11 1 2 3 -4 207 727 613 790 1310 1196
+359 6 4 11 1 1 3 299 378 621 882 961 1204
+360 6 4 11 1 1 1 300 379 622 883 962 1205
+361 6 5 11 1 2 4 -1 283 388 711 866 971 1294
+362 6 4 11 1 1 1 261 767 409 844 1350 992
+363 6 4 11 1 1 4 330 718 401 913 1301 984
+364 6 5 11 1 2 1 -4 284 394 716 867 977 1299
+365 6 4 11 1 1 3 396 452 710 979 1035 1293
+366 6 4 11 1 1 3 275 512 389 858 1095 972
+367 6 5 11 1 2 2 -1 104 385 522 128 968 1105
+368 6 4 11 1 1 1 31 700 379 151 1283 962
+369 6 4 11 1 1 3 65 701 378 195 1284 961
+370 6 4 11 1 1 4 297 382 481 880 965 1064
+371 6 4 11 1 1 2 217 371 658 800 954 1241
+372 6 4 11 1 1 3 216 372 657 799 955 1240
+373 6 4 11 1 1 2 350 764 532 933 1347 1115
+374 6 4 11 1 1 3 316 447 633 899 1030 1216
+375 6 4 11 1 1 2 315 448 634 898 1031 1217
+376 6 4 11 1 1 2 241 672 381 824 1255 964
+377 6 4 11 1 1 2 305 460 577 888 1043 1160
+378 6 4 11 1 1 3 304 459 576 887 1042 1159
+379 6 4 11 1 1 1 261 775 767 844 1358 1350
+380 6 4 11 1 1 4 76 373 490 118 956 1073
+381 6 5 11 1 2 4 -3 254 489 391 837 1072 974
+382 6 4 11 1 1 1 267 445 547 850 1028 1130
+383 6 4 11 1 1 4 395 607 464 978 1190 1047
+384 6 4 11 1 1 2 264 413 467 847 996 1050
+385 6 5 11 1 2 3 -4 70 71 429 112 113 1012
+386 6 4 11 1 1 4 199 722 476 782 1305 1059
+387 6 4 11 1 1 2 278 406 449 861 989 1032
+388 6 5 11 1 2 1 -2 314 511 434 897 1094 1017
+389 6 4 11 1 1 2 252 406 515 835 989 1098
+390 6 5 11 1 2 4 -1 199 705 472 782 1288 1055
+391 6 4 11 1 1 3 93 376 654 172 959 1237
+392 6 6 11 1 3 4 -1 -3 247 632 420 830 1215 1003
+393 6 4 11 1 1 2 215 405 501 798 988 1084
+394 6 4 11 1 1 1 209 425 508 792 1008 1091
+395 6 4 11 1 1 2 200 590 449 783 1173 1032
+396 6 4 11 1 1 1 232 509 667 815 1092 1250
+397 6 4 11 1 1 2 360 605 723 943 1188 1306
+398 6 4 11 1 1 1 39 40 521 159 160 1104
+399 6 5 11 1 2 3 -4 380 686 669 963 1269 1252
+400 6 4 11 1 1 1 307 479 570 890 1062 1153
+401 6 4 11 1 1 2 248 702 371 831 1285 954
+402 6 4 11 1 1 3 249 703 372 832 1286 955
+403 6 4 11 1 1 3 56 57 447 186 187 1030
+404 6 4 11 1 1 2 22 23 448 142 143 1031
+405 6 4 11 1 1 4 476 722 740 1059 1305 1323
+406 6 4 11 1 1 3 298 654 376 881 1237 959
+407 6 5 11 1 2 2 -1 386 421 606 969 1004 1189
+408 6 4 11 1 1 2 197 383 513 780 966 1096
+409 6 4 11 1 1 1 261 409 492 844 992 1075
+410 6 5 11 1 2 4 -3 240 669 686 823 1252 1269
+411 6 4 11 1 1 2 215 467 413 798 1050 996
+412 6 4 11 1 1 2 206 723 605 789 1306 1188
+413 6 4 11 1 1 1 244 470 717 827 1053 1300
+414 6 4 11 1 1 3 236 602 392 819 1185 975
+415 6 5 11 1 2 1 -4 472 705 719 1055 1288 1302
+416 6 4 11 1 1 2 241 381 663 824 964 1246
+417 6 4 11 1 1 1 307 570 629 890 1153 1212
+418 6 4 11 1 1 3 214 645 441 797 1228 1024
+419 6 4 11 1 1 3 356 645 404 939 1228 987
+420 6 4 11 1 1 1 286 494 655 869 1077 1238
+421 6 4 11 1 1 3 285 392 602 868 975 1185
+422 6 4 11 1 1 4 342 456 675 925 1039 1258
+423 6 5 11 1 2 1 -2 258 386 500 841 969 1083
+424 6 4 11 1 1 1 345 760 558 928 1343 1141
+425 6 4 11 1 1 4 393 652 504 976 1235 1087
+426 6 5 11 1 2 3 -4 259 555 441 842 1138 1024
+427 6 4 11 1 1 3 250 749 542 833 1332 1125
+428 6 4 11 1 1 3 210 426 637 793 1009 1220
+429 6 4 11 1 1 2 217 579 371 800 1162 954
+430 6 4 11 1 1 3 216 580 372 799 1163 955
+431 6 4 11 1 1 4 208 631 393 791 1214 976
+432 6 5 11 1 2 2 -1 271 513 383 854 1096 966
+433 6 4 11 1 1 2 347 643 656 930 1226 1239
+434 6 4 11 1 1 3 50 410 569 180 993 1152
+435 6 4 11 1 1 2 84 411 568 136 994 1151
+436 6 4 11 1 1 3 214 412 474 797 995 1057
+437 6 4 11 1 1 2 215 413 475 798 996 1058
+438 6 4 11 1 1 3 91 408 751 174 991 1334
+439 6 4 11 1 1 2 257 764 663 840 1347 1246
+440 6 4 11 1 1 2 10 538 108 14 1121 132
+441 6 4 11 1 1 3 5 539 89 19 1122 176
+442 6 4 11 1 1 4 318 685 402 901 1268 985
+443 6 4 11 1 1 4 450 599 776 1033 1182 1359
+444 6 4 11 1 1 2 237 478 666 820 1061 1249
+445 6 4 11 1 1 2 252 762 550 835 1345 1133
+446 6 4 11 1 1 3 339 378 701 922 961 1284
+447 6 4 11 1 1 1 338 379 700 921 962 1283
+448 6 4 11 1 1 1 265 446 525 848 1029 1108
+449 6 5 11 1 2 2 -1 324 644 455 907 1227 1038
+450 6 4 11 1 1 4 262 401 596 845 984 1179
+451 6 4 11 1 1 1 286 655 617 869 1238 1200
+452 6 5 11 1 2 2 -1 206 386 606 789 969 1189
+453 6 4 11 1 1 1 400 608 768 983 1191 1351
+454 6 4 11 1 1 4 343 599 514 926 1182 1097
+455 6 4 11 1 1 2 278 515 406 861 1098 989
+456 6 4 11 1 1 2 295 417 478 878 1000 1061
+457 6 4 11 1 1 3 263 710 452 846 1293 1035
+458 6 4 11 1 1 2 211 430 646 794 1013 1229
+459 6 4 11 1 1 4 233 597 638 816 1180 1221
+460 6 4 11 1 1 4 334 620 682 917 1203 1265
+461 6 4 11 1 1 3 242 587 398 825 1170 981
+462 6 4 11 1 1 2 243 588 399 826 1171 982
+463 6 4 11 1 1 3 256 390 510 839 973 1093
+464 6 5 11 1 2 2 -1 28 29 454 148 149 1037
+465 6 4 11 1 1 3 62 63 453 192 193 1036
+466 6 4 11 1 1 3 58 59 438 188 189 1021
+467 6 4 11 1 1 2 24 25 437 144 145 1020
+468 6 4 11 1 1 4 255 726 382 838 1309 965
+469 6 4 11 1 1 1 458 616 777 1041 1199 1360
+470 6 4 11 1 1 1 227 616 458 810 1199 1041
+471 6 4 11 1 1 2 10 81 538 14 133 1121
+472 6 4 11 1 1 3 5 47 539 19 177 1122
+473 6 4 11 1 1 3 329 529 396 912 1112 979
+474 6 4 11 1 1 3 280 398 587 863 981 1170
+475 6 4 11 1 1 2 281 399 588 864 982 1171
+476 6 4 11 1 1 4 202 477 546 785 1060 1129
+477 6 4 11 1 1 4 266 444 517 849 1027 1100
+478 6 4 11 1 1 3 207 390 593 790 973 1176
+479 6 5 11 1 2 2 -1 104 105 578 128 129 1161
+480 6 4 11 1 1 1 213 641 397 796 1224 980
+481 6 4 11 1 1 3 275 384 637 858 967 1220
+482 6 4 11 1 1 4 334 682 524 917 1265 1107
+483 6 4 11 1 1 4 222 599 450 805 1182 1033
+484 6 5 11 1 2 1 -2 348 704 386 931 1287 969
+485 6 4 11 1 1 3 236 376 602 819 959 1185
+486 6 4 11 1 1 3 201 396 713 784 979 1296
+487 6 4 11 1 1 2 360 666 478 943 1249 1061
+488 6 4 11 1 1 2 246 611 432 829 1194 1015
+489 6 4 11 1 1 3 245 612 431 828 1195 1014
+490 6 4 11 1 1 4 308 514 599 891 1097 1182
+491 6 5 11 1 2 3 -4 317 529 489 900 1112 1072
+492 6 4 11 1 1 1 352 616 523 935 1199 1106
+493 6 4 11 1 1 2 377 532 764 960 1115 1347
+494 6 5 11 1 2 4 -3 71 718 429 113 1301 1012
+495 6 4 11 1 1 4 373 638 597 956 1221 1180
+496 6 5 11 1 2 1 -4 394 472 716 977 1055 1299
+497 6 4 11 1 1 3 313 671 463 896 1254 1046
+498 6 4 11 1 1 2 312 670 462 895 1253 1045
+499 6 4 11 1 1 4 266 650 468 849 1233 1051
+500 6 4 11 1 1 4 219 427 468 802 1010 1051
+501 6 4 11 1 1 4 238 402 516 821 985 1099
+502 6 5 11 1 2 2 -1 725 385 239 1308 968 822
+503 6 5 11 1 2 4 -3 330 429 718 913 1012 1301
+504 6 4 11 1 1 4 272 770 673 855 1353 1256
+505 6 4 11 1 1 4 373 559 638 956 1142 1221
+506 6 4 11 1 1 3 214 561 412 797 1144 995
+507 6 4 11 1 1 2 295 714 383 878 1297 966
+508 6 4 11 1 1 4 301 415 497 884 998 1080
+509 6 4 11 1 1 3 221 389 542 804 972 1125
+510 6 4 11 1 1 1 279 571 583 862 1154 1166
+511 6 4 11 1 1 2 377 659 532 960 1242 1115
+512 6 4 11 1 1 1 306 720 595 889 1303 1178
+513 6 4 11 1 1 2 264 467 696 847 1050 1279
+514 6 4 11 1 1 4 318 402 730 901 985 1313
+515 6 4 11 1 1 2 224 659 377 807 1242 960
+516 6 5 11 1 2 1 -2 425 687 508 1008 1270 1091
+517 6 4 11 1 1 1 311 523 616 894 1106 1199
+518 6 4 11 1 1 4 296 530 450 879 1113 1033
+519 6 5 11 1 2 3 -4 225 489 529 808 1072 1112
+520 6 4 11 1 1 4 251 776 506 834 1359 1089
+521 6 4 11 1 1 1 375 767 775 958 1350 1358
+522 6 4 11 1 1 2 467 756 696 1050 1339 1279
+523 6 4 11 1 1 4 8 99 560 12 123 1143
+524 6 4 11 1 1 3 210 758 473 793 1341 1056
+525 6 4 11 1 1 3 426 512 637 1009 1095 1220
+526 6 4 11 1 1 2 239 385 642 822 968 1225
+527 6 4 11 1 1 3 221 626 389 804 1209 972
+528 6 5 11 1 2 2 -1 237 666 434 820 1249 1017
+529 6 4 11 1 1 4 247 456 734 830 1039 1317
+530 6 4 11 1 1 4 301 649 415 884 1232 998
+531 6 4 11 1 1 1 344 583 571 927 1166 1154
+532 6 5 11 1 2 4 -1 283 635 388 866 1218 971
+533 6 4 11 1 1 3 317 713 529 900 1296 1112
+534 6 4 11 1 1 2 295 532 659 878 1115 1242
+535 6 4 11 1 1 3 317 636 488 900 1219 1071
+536 6 4 11 1 1 3 380 473 758 963 1056 1341
+537 6 4 11 1 1 4 222 450 530 805 1033 1113
+538 6 4 11 1 1 4 266 740 650 849 1323 1233
+539 6 4 11 1 1 2 220 665 406 803 1248 989
+540 6 4 11 1 1 2 350 736 556 933 1319 1139
+541 6 4 11 1 1 1 38 387 651 158 970 1234
+542 6 4 11 1 1 4 8 560 80 12 1143 122
+543 6 5 11 1 2 3 -4 329 441 555 912 1024 1138
+544 6 4 11 1 1 2 430 515 646 1013 1098 1229
+545 6 4 11 1 1 2 224 442 750 807 1025 1333
+546 6 5 11 1 2 1 -2 323 491 688 906 1074 1271
+547 6 5 11 1 2 3 -4 748 536 309 1331 1119 892
+548 6 5 11 1 2 1 -4 9 595 103 13 1178 127
+549 6 4 11 1 1 2 407 486 623 990 1069 1206
+550 6 4 11 1 1 1 265 565 423 848 1148 1006
+551 6 4 11 1 1 4 294 607 395 877 1190 978
+552 6 4 11 1 1 4 270 575 403 853 1158 986
+553 6 4 11 1 1 1 344 470 733 927 1053 1316
+554 6 4 11 1 1 2 385 578 642 968 1161 1225
+555 6 4 11 1 1 3 392 473 614 975 1056 1197
+556 6 4 11 1 1 3 236 392 614 819 975 1197
+557 6 5 11 1 2 4 -3 225 415 649 808 998 1232
+558 6 5 11 1 2 3 -4 254 384 636 837 967 1219
+559 6 4 11 1 1 4 222 530 457 805 1113 1040
+560 6 4 11 1 1 1 3 98 573 17 167 1156
+561 6 5 11 1 2 4 -3 391 489 649 974 1072 1232
+562 6 4 11 1 1 1 209 745 425 792 1328 1008
+563 6 5 11 1 2 4 -1 388 476 711 971 1059 1294
+564 6 4 11 1 1 4 272 477 770 855 1060 1353
+565 6 4 11 1 1 2 246 432 544 829 1015 1127
+566 6 4 11 1 1 3 245 431 545 828 1014 1128
+567 6 5 11 1 2 1 -3 94 493 95 171 1076 170
+568 6 5 11 1 2 3 -1 4 552 94 18 1135 171
+569 6 5 11 1 2 1 -4 358 595 720 941 1178 1303
+570 6 4 11 1 1 3 349 677 390 932 1260 973
+571 6 4 11 1 1 3 249 412 703 832 995 1286
+572 6 4 11 1 1 2 248 413 702 831 996 1285
+573 6 4 11 1 1 1 36 37 774 156 157 1357
+574 6 4 11 1 1 1 3 573 46 17 1156 166
+575 6 4 11 1 1 3 396 529 713 979 1112 1296
+576 6 5 11 1 2 2 -1 332 434 666 915 1017 1249
+577 6 4 11 1 1 2 357 668 405 940 1251 988
+578 6 5 11 1 2 3 -4 669 748 309 1252 1331 892
+579 6 4 11 1 1 3 336 496 664 919 1079 1247
+580 6 4 11 1 1 2 239 642 407 822 1225 990
+581 6 4 11 1 1 3 91 603 408 174 1186 991
+582 6 4 11 1 1 4 297 457 530 880 1040 1113
+583 6 4 11 1 1 2 289 407 642 872 990 1225
+584 6 4 11 1 1 2 289 642 578 872 1225 1161
+585 6 4 11 1 1 1 36 774 465 156 1357 1048
+586 6 4 11 1 1 3 52 53 766 182 183 1349
+587 6 4 11 1 1 2 86 87 765 138 139 1348
+588 6 4 11 1 1 1 328 470 565 911 1053 1148
+589 6 4 11 1 1 4 222 585 599 805 1168 1182
+590 6 4 11 1 1 1 269 581 416 852 1164 999
+591 6 4 11 1 1 2 290 544 432 873 1127 1015
+592 6 4 11 1 1 3 291 545 431 874 1128 1014
+593 6 5 11 1 2 3 -4 331 593 422 914 1176 1005
+594 6 4 11 1 1 1 274 610 445 857 1193 1028
+595 6 4 11 1 1 1 311 414 618 894 997 1201
+596 6 4 11 1 1 1 232 676 509 815 1259 1092
+597 6 5 11 1 2 1 -2 231 443 644 814 1026 1227
+598 6 5 11 1 2 2 -1 346 630 443 929 1213 1026
+599 6 4 11 1 1 4 73 596 401 115 1179 984
+600 6 4 11 1 1 2 321 598 696 904 1181 1279
+601 6 5 11 1 2 2 -1 229 742 421 812 1325 1004
+602 6 4 11 1 1 1 227 543 494 810 1126 1077
+603 6 4 11 1 1 3 285 751 408 868 1334 991
+604 6 5 11 1 2 1 -4 284 632 394 867 1215 977
+605 6 4 11 1 1 1 41 42 466 161 162 1049
+606 6 4 11 1 1 2 220 406 550 803 989 1133
+607 6 4 11 1 1 2 611 246 670 1194 829 1253
+608 6 4 11 1 1 3 612 245 671 1195 828 1254
+609 6 4 11 1 1 1 320 494 543 903 1077 1126
+610 6 4 11 1 1 2 411 611 670 994 1194 1253
+611 6 4 11 1 1 3 410 612 671 993 1195 1254
+612 6 4 11 1 1 4 268 504 652 851 1087 1235
+613 6 4 11 1 1 3 313 549 439 896 1132 1022
+614 6 4 11 1 1 2 312 548 440 895 1131 1023
+615 6 5 11 1 2 2 -1 332 421 742 915 1004 1325
+616 6 4 11 1 1 2 239 407 623 822 990 1206
+617 6 4 11 1 1 2 264 702 413 847 1285 996
+618 6 5 11 1 2 4 -3 331 743 402 914 1326 985
+619 6 4 11 1 1 2 224 750 656 807 1333 1239
+620 6 4 11 1 1 1 362 509 676 945 1092 1259
+621 6 4 11 1 1 3 51 528 410 181 1111 993
+622 6 4 11 1 1 2 85 527 411 137 1110 994
+623 6 4 11 1 1 1 227 619 616 810 1202 1199
+624 6 4 11 1 1 4 208 712 631 791 1295 1214
+625 6 4 11 1 1 3 92 502 93 173 1085 172
+626 6 4 11 1 1 3 214 679 404 797 1262 987
+627 6 4 11 1 1 2 215 678 405 798 1261 988
+628 6 4 11 1 1 3 263 703 561 846 1286 1144
+629 6 4 11 1 1 1 218 565 470 801 1148 1053
+630 6 4 11 1 1 3 53 459 766 183 1042 1349
+631 6 4 11 1 1 2 87 460 765 139 1043 1348
+632 6 4 11 1 1 4 301 601 391 884 1184 974
+633 6 4 11 1 1 4 74 721 435 116 1304 1018
+634 6 4 11 1 1 4 330 401 562 913 984 1145
+635 6 4 11 1 1 3 91 751 92 174 1334 173
+636 6 4 11 1 1 4 75 76 490 117 118 1073
+637 6 4 11 1 1 2 295 659 417 878 1242 1000
+638 6 4 11 1 1 3 66 661 701 196 1244 1284
+639 6 4 11 1 1 1 32 660 700 152 1243 1283
+640 6 4 11 1 1 2 257 418 769 840 1001 1352
+641 6 4 11 1 1 1 253 777 503 836 1360 1086
+642 6 5 11 1 2 4 -3 223 743 422 806 1326 1005
+643 6 4 11 1 1 3 276 447 485 859 1030 1068
+644 6 4 11 1 1 2 277 448 484 860 1031 1067
+645 6 5 11 1 2 2 -1 322 443 630 905 1026 1213
+646 6 4 11 1 1 2 211 646 418 794 1229 1001
+647 6 4 11 1 1 4 208 436 712 791 1019 1295
+648 6 4 11 1 1 1 265 525 716 848 1108 1299
+649 6 4 11 1 1 3 316 485 447 899 1068 1030
+650 6 4 11 1 1 2 315 484 448 898 1067 1031
+651 6 4 11 1 1 4 226 541 464 809 1124 1047
+652 6 4 11 1 1 2 106 609 419 130 1192 1002
+653 6 5 11 1 2 4 -3 331 422 743 914 1005 1326
+654 6 5 11 1 2 4 -3 225 555 415 808 1138 998
+655 6 4 11 1 1 1 45 618 414 165 1201 997
+656 6 4 11 1 1 3 250 512 426 833 1095 1009
+657 6 4 11 1 1 1 218 479 526 801 1062 1109
+658 6 4 11 1 1 4 262 596 435 845 1179 1018
+659 6 4 11 1 1 2 224 417 659 807 1000 1242
+660 6 4 11 1 1 1 286 414 619 869 997 1202
+661 6 5 11 1 2 4 -1 102 103 487 126 127 1070
+662 6 5 11 1 2 4 -3 225 649 489 808 1232 1072
+663 6 5 11 1 2 2 -1 332 606 421 915 1189 1004
+664 6 4 11 1 1 4 74 75 721 116 117 1304
+665 6 4 11 1 1 3 412 561 703 995 1144 1286
+666 6 4 11 1 1 3 242 404 587 825 987 1170
+667 6 4 11 1 1 2 243 405 588 826 988 1171
+668 6 4 11 1 1 3 329 396 710 912 979 1293
+669 6 5 11 1 2 4 -3 330 600 429 913 1183 1012
+670 6 4 11 1 1 4 301 391 649 884 974 1232
+671 6 4 11 1 1 1 274 428 709 857 1011 1292
+672 6 4 11 1 1 3 90 603 91 175 1186 174
+673 6 4 11 1 1 3 249 695 412 832 1278 995
+674 6 4 11 1 1 2 248 694 413 831 1277 996
+675 6 5 11 1 2 3 -4 319 554 483 902 1137 1066
+676 6 5 11 1 2 1 -2 323 586 491 906 1169 1074
+677 6 5 11 1 2 3 -4 380 669 473 963 1252 1056
+678 6 5 11 1 2 2 -1 322 644 443 905 1227 1026
+679 6 4 11 1 1 1 213 416 581 796 999 1164
+680 6 5 11 1 2 2 -1 239 491 586 822 1074 1169
+681 6 5 11 1 2 3 -4 236 483 554 819 1066 1137
+682 6 4 11 1 1 4 287 594 524 870 1177 1107
+683 6 4 11 1 1 4 296 477 531 879 1060 1114
+684 6 4 11 1 1 1 307 526 479 890 1109 1062
+685 6 4 11 1 1 2 252 515 430 835 1098 1013
+686 6 4 11 1 1 1 267 521 428 850 1104 1011
+687 6 4 11 1 1 1 218 526 423 801 1109 1006
+688 6 4 11 1 1 3 293 664 496 876 1247 1079
+689 6 4 11 1 1 2 85 86 527 137 138 1110
+690 6 4 11 1 1 3 51 52 528 181 182 1111
+691 6 5 11 1 2 1 -2 229 625 482 812 1208 1065
+692 6 5 11 1 2 2 -1 237 434 511 820 1017 1094
+693 6 4 11 1 1 1 40 709 428 160 1292 1011
+694 6 4 11 1 1 4 74 435 596 116 1018 1179
+695 6 4 11 1 1 4 303 464 541 886 1047 1124
+696 6 4 11 1 1 4 333 734 456 916 1317 1039
+697 6 4 11 1 1 2 417 643 690 1000 1226 1273
+698 6 4 11 1 1 1 328 717 470 911 1300 1053
+699 6 4 11 1 1 3 285 408 680 868 991 1263
+700 6 4 11 1 1 4 343 776 599 926 1359 1182
+701 6 4 11 1 1 4 302 638 559 885 1221 1142
+702 6 4 11 1 1 1 409 629 492 992 1212 1075
+703 6 4 11 1 1 4 202 531 477 785 1114 1060
+704 6 4 11 1 1 4 212 444 673 795 1027 1256
+705 6 4 11 1 1 1 273 461 505 856 1044 1088
+706 6 4 11 1 1 1 397 732 753 980 1315 1336
+707 6 5 11 1 2 3 -4 256 429 600 839 1012 1183
+708 6 4 11 1 1 2 340 495 689 923 1078 1272
+709 6 4 11 1 1 4 334 524 594 917 1107 1177
+710 6 4 11 1 1 3 276 485 576 859 1068 1159
+711 6 4 11 1 1 2 277 484 577 860 1067 1160
+712 6 4 11 1 1 1 345 466 760 928 1049 1343
+713 6 4 11 1 1 1 387 625 651 970 1208 1234
+714 6 4 11 1 1 1 288 753 732 871 1336 1315
+715 6 4 11 1 1 4 266 517 711 849 1100 1294
+716 6 4 11 1 1 2 264 567 702 847 1150 1285
+717 6 4 11 1 1 3 263 566 703 846 1149 1286
+718 6 5 11 1 2 1 -2 231 570 443 814 1153 1026
+719 6 4 11 1 1 2 406 665 449 989 1248 1032
+720 6 4 11 1 1 3 221 463 626 804 1046 1209
+721 6 5 11 1 2 4 -3 223 422 761 806 1005 1344
+722 6 4 11 1 1 1 213 446 641 796 1029 1224
+723 6 4 11 1 1 2 106 107 609 130 131 1192
+724 6 4 11 1 1 2 107 108 495 131 132 1078
+725 6 4 11 1 1 3 89 496 90 176 1079 175
+726 6 5 11 1 2 1 -2 9 104 522 13 128 1105
+727 6 4 11 1 1 1 288 543 458 871 1126 1041
+728 6 4 11 1 1 3 309 614 473 892 1197 1056
+729 6 4 11 1 1 1 42 760 466 162 1343 1049
+730 6 4 11 1 1 1 2 33 660 16 153 1243
+731 6 4 11 1 1 3 7 67 661 11 109 1244
+732 6 4 11 1 1 2 690 643 260 1273 1226 843
+733 6 4 11 1 1 4 212 517 444 795 1100 1027
+734 6 4 11 1 1 3 65 66 701 195 196 1284
+735 6 4 11 1 1 1 31 32 700 151 152 1283
+736 6 4 11 1 1 3 250 680 408 833 1263 991
+737 6 4 11 1 1 1 314 482 547 897 1065 1130
+738 6 4 11 1 1 3 250 408 749 833 991 1332
+739 6 4 11 1 1 1 203 505 461 786 1088 1044
+740 6 4 11 1 1 1 227 458 543 810 1041 1126
+741 6 5 11 1 2 2 -1 271 687 513 854 1270 1096
+742 6 4 11 1 1 3 389 626 433 972 1209 1016
+743 6 4 11 1 1 1 335 651 625 918 1234 1208
+744 6 4 11 1 1 2 278 449 590 861 1032 1173
+745 6 6 11 1 3 1 -3 -4 284 420 632 867 1003 1215
+746 6 4 11 1 1 1 218 423 565 801 1006 1148
+747 6 4 11 1 1 4 294 546 427 877 1129 1010
+748 6 4 11 1 1 2 310 623 486 893 1206 1069
+749 6 4 11 1 1 4 308 424 615 891 1007 1198
+750 6 4 11 1 1 1 274 509 610 857 1092 1193
+751 6 4 11 1 1 2 289 419 707 872 1002 1290
+752 6 4 11 1 1 3 69 70 551 111 112 1134
+753 6 4 11 1 1 2 381 672 486 964 1255 1069
+754 6 4 11 1 1 4 303 553 471 886 1136 1054
+755 6 4 11 1 1 1 267 752 521 850 1335 1104
+756 6 4 11 1 1 4 73 74 596 115 116 1179
+757 6 4 11 1 1 1 2 660 32 16 1243 152
+758 6 4 11 1 1 3 7 661 66 11 1244 196
+759 6 4 11 1 1 3 410 671 569 993 1254 1152
+760 6 4 11 1 1 2 411 670 568 994 1253 1151
+761 6 5 11 1 2 4 -3 204 536 594 787 1119 1177
+762 6 4 11 1 1 1 213 525 446 796 1108 1029
+763 6 5 11 1 2 1 -2 279 443 570 862 1026 1153
+764 6 4 11 1 1 1 364 768 608 947 1351 1191
+765 6 5 11 1 2 1 -2 229 421 681 812 1004 1264
+766 6 4 11 1 1 2 197 513 455 780 1096 1038
+767 6 4 11 1 1 2 24 437 634 144 1020 1217
+768 6 4 11 1 1 3 58 438 633 188 1021 1216
+769 6 5 11 1 2 3 -4 70 429 551 112 1012 1134
+770 6 5 11 1 2 4 -3 259 708 415 842 1291 998
+771 6 4 11 1 1 3 201 563 452 784 1146 1035
+772 6 4 11 1 1 2 200 564 451 783 1147 1034
+773 6 4 11 1 1 1 387 521 752 970 1104 1335
+774 6 4 11 1 1 4 402 685 516 985 1268 1099
+775 6 4 11 1 1 2 217 484 579 800 1067 1162
+776 6 4 11 1 1 3 216 485 580 799 1068 1163
+777 6 4 11 1 1 3 285 680 426 868 1263 1009
+778 6 4 11 1 1 4 226 464 607 809 1047 1190
+779 6 4 11 1 1 2 292 689 495 875 1272 1078
+780 6 4 11 1 1 3 325 626 463 908 1209 1046
+781 6 4 11 1 1 2 292 440 548 875 1023 1131
+782 6 4 11 1 1 3 293 439 549 876 1022 1132
+783 6 4 11 1 1 4 99 100 514 123 124 1097
+784 6 4 11 1 1 4 302 424 585 885 1007 1168
+785 6 4 11 1 1 1 482 625 752 1065 1208 1335
+786 6 4 11 1 1 3 276 459 698 859 1042 1281
+787 6 4 11 1 1 2 277 460 699 860 1043 1282
+788 6 4 11 1 1 1 40 41 709 160 161 1292
+789 6 4 11 1 1 4 287 779 594 870 1362 1177
+790 6 5 11 1 2 4 -3 334 594 536 917 1177 1119
+791 6 4 11 1 1 4 303 652 724 886 1235 1307
+792 6 4 11 1 1 3 299 453 627 882 1036 1210
+793 6 5 11 1 2 1 -2 300 454 628 883 1037 1211
+794 6 4 11 1 1 2 371 702 567 954 1285 1150
+795 6 4 11 1 1 3 372 703 566 955 1286 1149
+796 6 4 11 1 1 3 336 542 749 919 1125 1332
+797 6 4 11 1 1 2 220 689 548 803 1272 1131
+798 6 4 11 1 1 2 252 707 419 835 1290 1002
+799 6 4 11 1 1 1 209 508 547 792 1091 1130
+800 6 4 11 1 1 4 382 726 481 965 1309 1064
+801 6 5 11 1 2 3 -4 256 600 422 839 1183 1005
+802 6 4 11 1 1 2 252 419 762 835 1002 1345
+803 6 4 11 1 1 4 79 615 424 121 1198 1007
+804 6 4 11 1 1 2 264 451 567 847 1034 1150
+805 6 4 11 1 1 3 263 452 566 846 1035 1149
+806 6 4 11 1 1 3 376 502 602 959 1085 1185
+807 6 4 11 1 1 2 337 750 442 920 1333 1025
+808 6 4 11 1 1 1 274 709 466 857 1292 1049
+809 6 4 11 1 1 2 326 544 564 909 1127 1147
+810 6 4 11 1 1 3 325 545 563 908 1128 1146
+811 6 4 11 1 1 2 340 550 762 923 1133 1345
+812 6 4 11 1 1 1 209 547 445 792 1130 1028
+813 6 5 11 1 2 1 -2 271 508 687 854 1091 1270
+814 6 4 11 1 1 4 333 456 650 916 1039 1233
+815 6 4 11 1 1 3 250 426 680 833 1009 1263
+816 6 4 11 1 1 3 351 735 520 934 1318 1103
+817 6 4 11 1 1 4 262 436 589 845 1019 1172
+818 6 4 11 1 1 4 212 673 778 795 1256 1361
+819 6 4 11 1 1 3 291 452 563 874 1035 1146
+820 6 4 11 1 1 2 290 451 564 873 1034 1147
+821 6 4 11 1 1 1 97 523 98 168 1106 167
+822 6 4 11 1 1 1 352 503 777 935 1086 1360
+823 6 4 11 1 1 4 776 251 653 1359 834 1236
+824 6 4 11 1 1 4 222 457 585 805 1040 1168
+825 6 4 11 1 1 4 341 481 726 924 1064 1309
+826 6 4 11 1 1 4 393 724 652 976 1307 1235
+827 6 4 11 1 1 4 287 524 533 870 1107 1116
+828 6 4 11 1 1 4 233 469 597 816 1052 1180
+829 6 4 11 1 1 1 307 461 526 890 1044 1109
+830 6 4 11 1 1 2 289 707 430 872 1290 1013
+831 6 4 11 1 1 2 315 579 484 898 1162 1067
+832 6 4 11 1 1 3 316 580 485 899 1163 1068
+833 6 4 11 1 1 2 292 640 440 875 1223 1023
+834 6 4 11 1 1 3 293 639 439 876 1222 1022
+835 6 4 11 1 1 2 437 691 634 1020 1274 1217
+836 6 4 11 1 1 3 438 692 633 1021 1275 1216
+837 6 4 11 1 1 4 282 435 721 865 1018 1304
+838 6 4 11 1 1 1 314 547 508 897 1130 1091
+839 6 4 11 1 1 3 285 602 502 868 1185 1085
+840 6 4 11 1 1 3 63 627 453 193 1210 1036
+841 6 5 11 1 2 1 -2 29 628 454 149 1211 1037
+842 6 4 11 1 1 4 219 650 456 802 1233 1039
+843 6 4 11 1 1 4 219 456 574 802 1039 1157
+844 6 4 11 1 1 1 218 470 571 801 1053 1154
+845 6 4 11 1 1 1 344 571 470 927 1154 1053
+846 6 4 11 1 1 3 299 647 453 882 1230 1036
+847 6 5 11 1 2 1 -2 300 648 454 883 1231 1037
+848 6 4 11 1 1 2 257 769 442 840 1352 1025
+849 6 4 11 1 1 2 350 663 764 933 1246 1347
+850 6 4 11 1 1 4 450 776 653 1033 1359 1236
+851 6 4 11 1 1 4 287 533 507 870 1116 1090
+852 6 4 11 1 1 4 342 574 456 925 1157 1039
+853 6 4 11 1 1 2 337 590 598 920 1173 1181
+854 6 4 11 1 1 1 279 479 571 862 1062 1154
+855 6 4 11 1 1 3 291 431 657 874 1014 1240
+856 6 4 11 1 1 2 290 432 658 873 1015 1241
+857 6 4 11 1 1 1 231 492 629 814 1075 1212
+858 6 4 11 1 1 1 209 445 610 792 1028 1193
+859 6 4 11 1 1 2 277 699 499 860 1282 1082
+860 6 4 11 1 1 3 276 698 498 859 1281 1081
+861 6 4 11 1 1 3 276 683 447 859 1266 1030
+862 6 4 11 1 1 2 277 684 448 860 1267 1031
+863 6 4 11 1 1 3 4 93 654 18 172 1237
+864 6 4 11 1 1 1 37 38 651 157 158 1234
+865 6 4 11 1 1 2 220 462 665 803 1045 1248
+866 6 4 11 1 1 2 337 442 769 920 1025 1352
+867 6 4 11 1 1 2 290 564 544 873 1147 1127
+868 6 4 11 1 1 3 291 563 545 874 1146 1128
+869 6 4 11 1 1 2 252 430 707 835 1013 1290
+870 6 4 11 1 1 1 307 629 729 890 1212 1312
+871 6 4 11 1 1 3 221 664 549 804 1247 1132
+872 6 4 11 1 1 4 343 506 776 926 1089 1359
+873 6 4 11 1 1 3 412 695 474 995 1278 1057
+874 6 4 11 1 1 2 413 694 475 996 1277 1058
+875 6 4 11 1 1 3 291 566 452 874 1149 1035
+876 6 4 11 1 1 2 290 567 451 873 1150 1034
+877 6 4 11 1 1 4 302 585 457 885 1168 1040
+878 6 4 11 1 1 2 310 744 572 893 1327 1155
+879 6 4 11 1 1 1 265 719 565 848 1302 1148
+880 6 4 11 1 1 4 303 541 553 886 1124 1136
+881 6 4 11 1 1 2 200 598 590 783 1181 1173
+882 6 4 11 1 1 4 341 631 712 924 1214 1295
+883 6 4 11 1 1 4 223 562 480 806 1145 1063
+884 6 4 11 1 1 3 339 701 661 922 1284 1244
+885 6 4 11 1 1 1 338 700 660 921 1283 1243
+886 6 4 11 1 1 1 43 44 558 163 164 1141
+887 6 4 11 1 1 4 77 78 559 119 120 1142
+888 6 4 11 1 1 3 48 439 639 178 1022 1222
+889 6 4 11 1 1 2 82 440 640 134 1023 1223
+890 6 4 11 1 1 1 409 729 629 992 1312 1212
+891 6 4 11 1 1 2 83 84 568 135 136 1151
+892 6 4 11 1 1 3 49 50 569 179 180 1152
+893 6 4 11 1 1 2 248 691 437 831 1274 1020
+894 6 4 11 1 1 3 249 692 438 832 1275 1021
+895 6 5 11 1 2 1 -2 314 434 728 897 1017 1311
+896 6 5 11 1 2 3 -4 236 614 483 819 1197 1066
+897 6 4 11 1 1 3 216 657 431 799 1240 1014
+898 6 4 11 1 1 2 217 658 432 800 1241 1015
+899 6 4 11 1 1 2 310 672 744 893 1255 1327
+900 6 4 11 1 1 3 325 433 626 908 1016 1209
+901 6 4 11 1 1 2 220 550 689 803 1133 1272
+902 6 4 11 1 1 1 35 36 604 155 156 1187
+903 6 4 11 1 1 4 198 471 553 781 1054 1136
+904 6 4 11 1 1 4 262 589 480 845 1172 1063
+905 6 4 11 1 1 2 108 538 495 132 1121 1078
+906 6 4 11 1 1 3 89 539 496 176 1122 1079
+907 6 4 11 1 1 1 352 777 616 935 1360 1199
+908 6 4 11 1 1 2 326 665 462 909 1248 1045
+909 6 4 11 1 1 4 99 514 560 123 1097 1143
+910 6 4 11 1 1 4 212 778 575 795 1361 1158
+911 6 4 11 1 1 2 81 82 640 133 134 1223
+912 6 4 11 1 1 3 47 48 639 177 178 1222
+913 6 4 11 1 1 4 294 507 533 877 1090 1116
+914 6 4 11 1 1 2 405 668 501 988 1251 1084
+915 6 4 11 1 1 1 288 505 537 871 1088 1120
+916 6 5 11 1 2 3 -4 259 441 645 842 1024 1228
+917 6 4 11 1 1 4 287 507 574 870 1090 1157
+918 6 4 11 1 1 1 36 465 604 156 1048 1187
+919 6 4 11 1 1 4 403 575 778 986 1158 1361
+920 6 4 11 1 1 2 371 567 658 954 1150 1241
+921 6 4 11 1 1 3 372 566 657 955 1149 1240
+922 6 4 11 1 1 4 226 533 524 809 1116 1107
+923 6 5 11 1 2 4 -3 259 613 708 842 1196 1291
+924 6 4 11 1 1 3 285 502 751 868 1085 1334
+925 6 4 11 1 1 1 218 571 479 801 1154 1062
+926 6 4 11 1 1 2 292 495 538 875 1078 1121
+927 6 4 11 1 1 3 293 496 539 876 1079 1122
+928 6 4 11 1 1 1 98 523 573 167 1106 1156
+929 6 4 11 1 1 2 21 22 684 141 142 1267
+930 6 4 11 1 1 3 55 56 683 185 186 1266
+931 6 5 11 1 2 3 -4 309 483 614 892 1066 1197
+932 6 5 11 1 2 4 -1 394 632 734 977 1215 1317
+933 6 4 11 1 1 3 298 552 654 881 1135 1237
+934 6 5 11 1 2 3 -4 254 636 489 837 1219 1072
+935 6 4 11 1 1 4 79 80 615 121 122 1198
+936 6 4 11 1 1 1 353 731 535 936 1314 1118
+937 6 4 11 1 1 1 231 629 570 814 1212 1153
+938 6 4 11 1 1 1 203 537 505 786 1120 1088
+939 6 4 11 1 1 3 329 772 441 912 1355 1024
+940 6 4 11 1 1 4 296 531 530 879 1114 1113
+941 6 4 11 1 1 1 279 570 479 862 1153 1062
+942 6 4 11 1 1 2 241 663 556 824 1246 1139
+943 6 4 11 1 1 4 283 517 697 866 1100 1280
+944 6 4 11 1 1 3 216 576 485 799 1159 1068
+945 6 4 11 1 1 2 217 577 484 800 1160 1067
+946 6 5 11 1 2 4 -1 247 734 632 830 1317 1215
+947 6 4 11 1 1 3 356 518 739 939 1101 1322
+948 6 4 11 1 1 2 357 519 738 940 1102 1321
+949 6 5 11 1 2 4 -3 366 708 613 949 1291 1196
+950 6 4 11 1 1 4 297 674 457 880 1257 1040
+951 6 4 11 1 1 4 296 450 653 879 1033 1236
+952 6 4 11 1 1 1 286 619 494 869 1202 1077
+953 6 4 11 1 1 2 26 27 592 146 147 1175
+954 6 4 11 1 1 3 60 61 591 190 191 1174
+955 6 5 11 1 2 1 -4 388 635 717 971 1218 1300
+956 6 5 11 1 2 4 -1 283 697 771 866 1280 1354
+957 6 4 11 1 1 4 255 724 631 838 1307 1214
+958 6 4 11 1 1 4 303 471 652 886 1054 1235
+959 6 4 11 1 1 1 45 46 618 165 166 1201
+960 6 4 11 1 1 2 347 501 643 930 1084 1226
+961 6 4 11 1 1 1 273 641 446 856 1224 1029
+962 6 4 11 1 1 4 318 480 589 901 1063 1172
+963 6 4 11 1 1 3 221 542 664 804 1125 1247
+964 6 4 11 1 1 4 297 530 531 880 1113 1114
+965 6 4 11 1 1 4 204 584 715 787 1167 1298
+966 6 4 11 1 1 2 260 643 501 843 1226 1084
+967 6 4 11 1 1 4 366 497 708 949 1080 1291
+968 6 4 11 1 1 3 214 474 679 797 1057 1262
+969 6 4 11 1 1 2 215 475 678 798 1058 1261
+970 6 4 11 1 1 1 43 558 760 163 1141 1343
+971 6 4 11 1 1 1 311 573 523 894 1156 1106
+972 6 5 11 1 2 1 -4 244 717 635 827 1300 1218
+973 6 5 11 1 2 2 -1 322 455 644 905 1038 1227
+974 6 5 11 1 2 2 -1 332 742 434 915 1325 1017
+975 6 4 11 1 1 3 276 498 683 859 1081 1266
+976 6 4 11 1 1 2 277 499 684 860 1082 1267
+977 6 4 11 1 1 1 288 458 753 871 1041 1336
+978 6 5 11 1 2 3 -4 317 489 636 900 1072 1219
+979 6 4 11 1 1 4 272 673 444 855 1256 1027
+980 6 4 11 1 1 4 308 560 514 891 1143 1097
+981 6 4 11 1 1 4 282 597 469 865 1180 1052
+982 6 4 11 1 1 3 53 54 698 183 184 1281
+983 6 4 11 1 1 2 87 88 699 139 140 1282
+984 6 4 11 1 1 2 350 556 663 933 1139 1246
+985 6 4 11 1 1 2 322 736 455 905 1319 1038
+986 6 5 11 1 2 2 -1 239 623 491 822 1206 1074
+987 6 4 11 1 1 3 298 554 557 881 1137 1140
+988 6 4 11 1 1 3 304 766 459 887 1349 1042
+989 6 4 11 1 1 2 305 765 460 888 1348 1043
+990 6 4 11 1 1 4 373 597 490 956 1180 1073
+991 6 4 11 1 1 4 393 631 724 976 1214 1307
+992 6 4 11 1 1 3 214 441 772 797 1024 1355
+993 6 5 11 1 2 1 -4 265 716 472 848 1299 1055
+994 6 4 11 1 1 4 266 711 476 849 1294 1059
+995 6 4 11 1 1 2 260 668 605 843 1251 1188
+996 6 4 11 1 1 4 297 481 674 880 1064 1257
+997 6 5 11 1 2 1 -2 324 687 759 907 1270 1342
+998 6 4 11 1 1 4 268 652 471 851 1235 1054
+999 6 4 11 1 1 3 214 772 561 797 1355 1144
+1000 6 5 11 1 2 3 -4 319 557 554 902 1140 1137
+1001 6 4 11 1 1 4 219 574 507 802 1157 1090
+1002 6 4 11 1 1 3 63 64 627 193 194 1210
+1003 6 5 11 1 2 1 -2 29 30 628 149 150 1211
+1004 6 4 11 1 1 1 364 608 688 947 1191 1271
+1005 6 4 11 1 1 2 360 690 605 943 1273 1188
+1006 6 4 11 1 1 3 316 633 692 899 1216 1275
+1007 6 4 11 1 1 2 315 634 691 898 1217 1274
+1008 6 4 11 1 1 1 323 688 608 906 1271 1191
+1009 6 4 11 1 1 1 345 667 466 928 1250 1049
+1010 6 4 11 1 1 1 320 543 537 903 1126 1120
+1011 6 5 11 1 2 1 -4 400 768 635 983 1351 1218
+1012 6 4 11 1 1 3 57 58 633 187 188 1216
+1013 6 4 11 1 1 2 23 24 634 143 144 1217
+1014 6 4 11 1 1 2 197 455 736 780 1038 1319
+1015 6 4 11 1 1 2 260 605 690 843 1188 1273
+1016 6 4 11 1 1 2 315 691 579 898 1274 1162
+1017 6 4 11 1 1 3 316 692 580 899 1275 1163
+1018 6 4 11 1 1 4 294 533 607 877 1116 1190
+1019 6 5 11 1 2 1 -2 425 759 687 1008 1342 1270
+1020 6 4 11 1 1 3 55 683 498 185 1266 1081
+1021 6 4 11 1 1 2 21 684 499 141 1267 1082
+1022 6 5 11 1 2 2 -1 310 491 623 893 1074 1206
+1023 6 4 11 1 1 1 288 537 543 871 1120 1126
+1024 6 4 11 1 1 3 313 569 671 896 1152 1254
+1025 6 4 11 1 1 2 312 568 670 895 1151 1253
+1026 6 4 11 1 1 2 337 598 750 920 1181 1333
+1027 6 4 11 1 1 4 282 490 597 865 1073 1180
+1028 6 4 11 1 1 1 284 525 706 867 1108 1289
+1029 6 5 11 1 2 3 -4 309 473 669 892 1056 1252
+1030 6 4 11 1 1 2 326 449 665 909 1032 1248
+1031 6 4 11 1 1 4 233 638 674 816 1221 1257
+1032 6 4 11 1 1 3 298 557 693 881 1140 1276
+1033 6 4 11 1 1 4 75 490 721 117 1073 1304
+1034 6 4 11 1 1 4 282 721 490 865 1304 1073
+1035 6 4 11 1 1 2 357 605 668 940 1188 1251
+1036 6 4 11 1 1 4 219 468 650 802 1051 1233
+1037 6 4 11 1 1 2 278 754 646 861 1337 1229
+1038 6 4 11 1 1 3 280 679 474 863 1262 1057
+1039 6 4 11 1 1 2 281 678 475 864 1261 1058
+1040 6 4 11 1 1 4 354 757 624 937 1340 1207
+1041 6 5 11 1 2 1 -4 400 635 771 983 1218 1354
+1042 6 4 11 1 1 3 235 510 677 818 1093 1260
+1043 6 4 11 1 1 3 56 447 683 186 1030 1266
+1044 6 4 11 1 1 2 22 448 684 142 1031 1267
+1045 6 5 11 1 2 1 -4 244 635 768 827 1218 1351
+1046 6 4 11 1 1 4 303 724 464 886 1307 1047
+1047 6 4 11 1 1 1 274 466 667 857 1049 1250
+1048 6 4 11 1 1 4 318 730 480 901 1313 1063
+1049 6 4 11 1 1 1 234 704 622 817 1287 1205
+1050 6 4 11 1 1 1 273 505 732 856 1088 1315
+1051 6 4 11 1 1 2 264 696 451 847 1279 1034
+1052 6 4 11 1 1 4 327 553 541 910 1136 1124
+1053 6 4 11 1 1 1 227 494 619 810 1077 1202
+1054 6 4 11 1 1 3 67 68 755 109 110 1338
+1055 6 4 11 1 1 3 275 637 512 858 1220 1095
+1056 6 4 11 1 1 1 33 34 773 153 154 1356
+1057 6 4 11 1 1 2 292 538 640 875 1121 1223
+1058 6 4 11 1 1 3 293 539 639 876 1122 1222
+1059 6 5 11 1 2 4 -1 283 771 635 866 1354 1218
+1060 6 5 11 1 2 1 -2 306 595 522 889 1178 1105
+1061 6 4 11 1 1 2 278 646 515 861 1229 1098
+1062 6 4 11 1 1 1 203 461 729 786 1044 1312
+1063 6 5 11 1 2 1 -2 9 522 595 13 1105 1178
+1064 6 4 11 1 1 2 347 756 467 930 1339 1050
+1065 6 4 11 1 1 1 335 465 774 918 1048 1357
+1066 6 5 11 1 2 4 -3 71 72 718 113 114 1301
+1067 6 4 11 1 1 4 327 682 620 910 1265 1203
+1068 6 5 11 1 2 1 -2 314 728 482 897 1311 1065
+1069 6 4 11 1 1 3 53 698 459 183 1281 1042
+1070 6 4 11 1 1 2 87 699 460 139 1282 1043
+1071 6 4 11 1 1 2 237 714 478 820 1297 1061
+1072 6 4 11 1 1 4 365 673 770 948 1256 1353
+1073 6 4 11 1 1 4 255 464 724 838 1047 1307
+1074 6 5 11 1 2 1 -2 306 586 582 889 1169 1165
+1075 6 4 11 1 1 3 410 528 612 993 1111 1195
+1076 6 4 11 1 1 2 411 527 611 994 1110 1194
+1077 6 4 11 1 1 3 235 677 621 818 1260 1204
+1078 6 4 11 1 1 2 310 486 672 893 1069 1255
+1079 6 4 11 1 1 4 223 480 730 806 1063 1313
+1080 6 4 11 1 1 1 42 43 760 162 163 1343
+1081 6 4 11 1 1 1 362 610 509 945 1193 1092
+1082 6 4 11 1 1 1 307 729 461 890 1312 1044
+1083 6 4 11 1 1 4 341 712 469 924 1295 1052
+1084 6 4 11 1 1 2 321 696 756 904 1279 1339
+1085 6 5 11 1 2 1 -4 328 719 705 911 1302 1288
+1086 6 4 11 1 1 3 52 766 528 182 1349 1111
+1087 6 4 11 1 1 2 86 765 527 138 1348 1110
+1088 6 5 11 1 2 1 -2 323 582 586 906 1165 1169
+1089 6 5 11 1 2 1 -2 348 622 704 931 1205 1287
+1090 6 4 11 1 1 4 333 740 722 916 1323 1305
+1091 6 4 11 1 1 1 41 466 709 161 1049 1292
+1092 6 4 11 1 1 2 292 548 689 875 1131 1272
+1093 6 4 11 1 1 3 293 549 664 876 1132 1247
+1094 6 4 11 1 1 1 253 753 777 836 1336 1360
+1095 6 4 11 1 1 3 349 621 677 932 1204 1260
+1096 6 4 11 1 1 1 306 582 720 889 1165 1303
+1097 6 4 11 1 1 3 54 498 698 184 1081 1281
+1098 6 4 11 1 1 2 88 499 699 140 1082 1282
+1099 6 4 11 1 1 2 295 478 714 878 1061 1297
+1100 6 4 11 1 1 2 81 640 538 133 1223 1121
+1101 6 4 11 1 1 3 47 639 539 177 1222 1122
+1102 6 5 11 1 2 1 -2 229 482 728 812 1065 1311
+1103 6 5 11 1 2 4 -3 240 686 624 823 1269 1207
+1104 6 4 11 1 1 1 320 655 494 903 1238 1077
+1105 6 5 11 1 2 1 -4 265 472 719 848 1055 1302
+1106 6 5 11 1 2 4 -3 422 600 761 1005 1183 1344
+1107 6 4 11 1 1 4 233 674 481 816 1257 1064
+1108 6 4 11 1 1 1 458 777 753 1041 1360 1336
+1109 6 4 11 1 1 4 226 607 533 809 1190 1116
+1110 6 4 11 1 1 4 365 778 673 948 1361 1256
+1111 6 4 11 1 1 2 418 646 754 1001 1229 1337
+1112 6 5 11 1 2 1 -4 230 582 608 813 1165 1191
+1113 6 5 11 1 2 4 -3 319 483 715 902 1066 1298
+1114 6 4 11 1 1 3 304 612 528 887 1195 1111
+1115 6 4 11 1 1 2 305 611 527 888 1194 1110
+1116 6 4 11 1 1 4 238 746 497 821 1329 1080
+1117 6 4 11 1 1 4 296 770 477 879 1353 1060
+1118 6 4 11 1 1 2 417 690 478 1000 1273 1061
+1119 6 4 11 1 1 4 80 560 615 122 1143 1198
+1120 6 4 11 1 1 4 266 476 740 849 1059 1323
+1121 6 5 11 1 2 2 -1 239 586 725 822 1169 1308
+1122 6 4 11 1 1 4 333 650 740 916 1233 1323
+1123 6 4 11 1 1 1 234 500 704 817 1083 1287
+1124 6 4 11 1 1 1 323 608 582 906 1191 1165
+1125 6 4 11 1 1 2 260 501 668 843 1084 1251
+1126 6 4 11 1 1 2 360 478 690 943 1061 1273
+1127 6 5 11 1 2 4 -3 354 624 686 937 1207 1269
+1128 6 4 11 1 1 1 328 565 719 911 1148 1302
+1129 6 4 11 1 1 1 267 482 752 850 1065 1335
+1130 6 4 11 1 1 4 308 615 560 891 1198 1143
+1131 6 4 11 1 1 1 46 573 618 166 1156 1201
+1132 6 4 11 1 1 3 210 637 758 793 1220 1341
+1133 6 4 11 1 1 3 242 647 518 825 1230 1101
+1134 6 5 11 1 2 2 -1 243 648 519 826 1231 1102
+1135 6 4 11 1 1 4 268 685 504 851 1268 1087
+1136 6 4 11 1 1 3 317 488 713 900 1071 1296
+1137 6 4 11 1 1 2 241 556 630 824 1139 1213
+1138 6 5 11 1 2 1 -2 386 704 500 969 1287 1083
+1139 6 4 11 1 1 2 322 630 556 905 1213 1139
+1140 6 4 11 1 1 1 311 618 573 894 1201 1156
+1141 6 4 11 1 1 1 203 729 767 786 1312 1350
+1142 6 4 11 1 1 3 201 713 488 784 1296 1071
+1143 6 4 11 1 1 1 261 759 745 844 1342 1328
+1144 6 4 11 1 1 1 274 667 509 857 1250 1092
+1145 6 4 11 1 1 4 268 516 685 851 1099 1268
+1146 6 4 11 1 1 1 273 732 641 856 1315 1224
+1147 6 4 11 1 1 3 390 677 510 973 1260 1093
+1148 6 4 11 1 1 4 318 504 685 901 1087 1268
+1149 6 4 11 1 1 1 213 706 525 796 1289 1108
+1150 6 4 11 1 1 4 301 497 746 884 1080 1329
+1151 6 4 11 1 1 3 92 751 502 173 1334 1085
+1152 6 4 11 1 1 3 384 758 637 967 1341 1220
+1153 6 4 11 1 1 1 288 732 505 871 1315 1088
+1154 6 5 11 1 2 1 -2 306 522 725 889 1105 1308
+1155 6 4 11 1 1 1 37 651 774 157 1234 1357
+1156 6 5 11 1 2 2 -1 385 725 522 968 1308 1105
+1157 6 5 11 1 2 4 -1 363 771 697 946 1354 1280
+1158 6 5 11 1 2 1 -2 324 759 492 907 1342 1075
+1159 6 4 11 1 1 3 336 664 542 919 1247 1125
+1160 6 4 11 1 1 1 261 492 759 844 1075 1342
+1161 6 4 11 1 1 1 425 745 759 1008 1328 1342
+1162 6 4 11 1 1 3 68 520 755 110 1103 1338
+1163 6 4 11 1 1 4 415 708 497 998 1291 1080
+1164 6 5 11 1 2 1 -4 358 720 540 941 1303 1123
+1165 6 4 11 1 1 4 226 682 541 809 1265 1124
+1166 6 4 11 1 1 4 240 624 620 823 1207 1203
+1167 6 4 11 1 1 3 304 528 766 887 1111 1349
+1168 6 4 11 1 1 2 305 527 765 888 1110 1348
+1169 6 4 11 1 1 3 280 587 679 863 1170 1262
+1170 6 4 11 1 1 2 281 588 678 864 1171 1261
+1171 6 4 11 1 1 4 212 697 517 795 1280 1100
+1172 6 4 11 1 1 3 4 654 552 18 1237 1135
+1173 6 5 11 1 2 3 -1 355 693 534 938 1276 1117
+1174 6 4 11 1 1 1 232 617 655 815 1200 1238
+1175 6 5 11 1 2 1 -4 230 540 720 813 1123 1303
+1176 6 4 11 1 1 4 226 524 682 809 1107 1265
+1177 6 4 11 1 1 1 409 767 729 992 1350 1312
+1178 6 4 11 1 1 1 344 741 583 927 1324 1166
+1179 6 4 11 1 1 4 327 541 682 910 1124 1265
+1180 6 5 11 1 2 3 -1 228 534 693 811 1117 1276
+1181 6 4 11 1 1 4 283 711 517 866 1294 1100
+1182 6 4 11 1 1 4 327 620 624 910 1203 1207
+1183 6 5 11 1 2 1 -2 205 583 741 788 1166 1324
+1184 6 4 11 1 1 3 291 657 566 874 1240 1149
+1185 6 4 11 1 1 2 290 658 567 873 1241 1150
+1186 6 4 11 1 1 1 34 535 773 154 1118 1356
+1187 6 4 11 1 1 1 232 763 676 815 1346 1259
+1188 6 4 11 1 1 1 232 655 763 815 1238 1346
+1189 6 5 11 1 2 3 -4 319 737 557 902 1320 1140
+1190 6 4 11 1 1 1 284 716 525 867 1299 1108
+1191 6 4 11 1 1 2 321 656 750 904 1239 1333
+1192 6 4 11 1 1 1 320 537 747 903 1120 1330
+1193 6 4 11 1 1 2 340 689 550 923 1272 1133
+1194 6 5 11 1 2 4 -3 361 584 675 944 1167 1258
+1195 6 4 11 1 1 3 349 739 518 932 1322 1101
+1196 6 5 11 1 2 2 -1 348 738 519 931 1321 1102
+1197 6 4 11 1 1 3 339 520 735 922 1103 1318
+1198 6 4 11 1 1 3 339 755 520 922 1338 1103
+1199 6 4 11 1 1 4 342 675 584 925 1258 1167
+1200 6 4 11 1 1 1 213 581 706 796 1164 1289
+1201 6 4 11 1 1 4 223 761 562 806 1344 1145
+1202 6 4 11 1 1 4 212 575 697 795 1158 1280
+1203 6 4 11 1 1 4 296 653 770 879 1236 1353
+1204 6 4 11 1 1 4 363 697 575 946 1280 1158
+1205 6 4 11 1 1 3 408 603 749 991 1186 1332
+1206 6 5 11 1 2 2 -1 346 744 630 929 1327 1213
+1207 6 4 11 1 1 3 404 679 587 987 1262 1170
+1208 6 4 11 1 1 2 405 678 588 988 1261 1171
+1209 6 4 11 1 1 3 228 693 557 811 1276 1140
+1210 6 4 11 1 1 1 338 535 731 921 1118 1314
+1211 6 4 11 1 1 4 365 770 653 948 1353 1236
+1212 6 4 11 1 1 3 329 710 561 912 1293 1144
+1213 6 4 11 1 1 1 320 747 763 903 1330 1346
+1214 6 4 11 1 1 2 241 630 744 824 1213 1327
+1215 6 5 11 1 2 4 -3 366 727 662 949 1310 1245
+1216 6 4 11 1 1 1 203 747 537 786 1330 1120
+1217 6 4 11 1 1 1 338 773 535 921 1356 1118
+1218 6 4 11 1 1 3 263 561 710 846 1144 1293
+1219 6 4 11 1 1 2 332 723 606 915 1306 1189
+1220 6 4 11 1 1 2 419 609 762 1002 1192 1345
+1221 6 5 11 1 2 4 -3 334 536 748 917 1119 1331
+1222 6 4 11 1 1 2 418 754 769 1001 1337 1352
+1223 6 5 11 1 2 3 -4 331 727 593 914 1310 1176
+1224 6 5 11 1 2 1 -3 367 706 581 950 1289 1164
+1225 6 4 11 1 1 1 397 641 732 980 1224 1315
+1226 6 4 11 1 1 2 360 723 666 943 1306 1249
+1227 6 5 11 1 2 4 -3 240 748 669 823 1331 1252
+1228 6 4 11 1 1 2 322 556 736 905 1139 1319
+1229 6 4 11 1 1 4 327 757 553 910 1340 1136
+1230 6 4 11 1 1 3 228 557 737 811 1140 1320
+1231 6 4 11 1 1 2 206 606 723 789 1189 1306
+1232 6 5 11 1 2 1 -4 230 720 582 813 1303 1165
+1233 6 5 11 1 2 1 -2 229 681 625 812 1264 1208
+1234 6 5 11 1 2 1 -2 306 725 586 889 1308 1169
+1235 6 5 11 1 2 3 -4 207 593 727 790 1176 1310
+1236 6 4 11 1 1 2 337 769 754 920 1352 1337
+1237 6 4 11 1 1 1 335 625 681 918 1208 1264
+1238 6 4 11 1 1 4 330 562 761 913 1145 1344
+1239 6 4 11 1 1 4 402 743 730 985 1326 1313
+1240 6 5 11 1 2 2 -1 346 572 744 929 1155 1327
+1241 6 4 11 1 1 2 278 590 754 861 1173 1337
+1242 6 4 11 1 1 4 255 631 726 838 1214 1309
+1243 6 4 11 1 1 4 342 584 779 925 1167 1362
+1244 6 4 11 1 1 1 364 688 741 947 1271 1324
+1245 6 4 11 1 1 3 329 561 772 912 1144 1355
+1246 6 4 11 1 1 4 223 730 743 806 1313 1326
+1247 6 5 11 1 2 4 -3 334 748 620 917 1331 1203
+1248 6 4 11 1 1 4 198 553 757 781 1136 1340
+1249 6 4 11 1 1 4 204 779 584 787 1362 1167
+1250 6 5 11 1 2 4 -3 330 761 600 913 1344 1183
+1251 6 4 11 1 1 4 341 726 631 924 1309 1214
+1252 6 5 11 1 2 1 -2 205 741 688 788 1324 1271
+1253 6 4 11 1 1 1 375 763 747 958 1346 1330
+1254 6 4 11 1 1 2 337 754 590 920 1337 1173
+1255 6 4 11 1 1 1 387 752 625 970 1335 1208
+1256 6 5 11 1 2 4 -3 240 620 748 823 1203 1331
+1257 6 4 11 1 1 1 362 775 745 945 1358 1328
+1258 6 5 11 1 2 1 -4 388 717 705 971 1300 1288
+1259 6 4 11 1 1 4 327 624 757 910 1207 1340
+1260 6 5 11 1 2 1 -4 328 705 717 911 1288 1300
+1261 6 4 11 1 1 2 321 750 598 904 1333 1181
+1262 6 4 11 1 1 3 336 749 603 919 1332 1186
+1263 6 4 11 1 1 4 204 594 779 787 1177 1362
+1264 6 4 11 1 1 1 364 741 733 947 1324 1316
+1265 6 5 11 1 2 4 -3 331 662 727 914 1245 1310
+1266 6 4 11 1 1 2 332 666 723 915 1249 1306
+1267 6 4 11 1 1 1 344 733 741 927 1316 1324
+1268 6 4 11 1 1 1 362 676 775 945 1259 1358
+1269 6 4 11 1 1 3 339 661 755 922 1244 1338
+1270 6 4 11 1 1 2 340 762 609 923 1345 1192
+1271 6 4 11 1 1 2 241 744 672 824 1327 1255
+1272 6 4 11 1 1 1 338 660 773 921 1243 1356
+1273 6 5 11 1 2 4 -1 394 734 722 977 1317 1305
+1274 6 4 11 1 1 2 321 756 656 904 1339 1239
+1275 6 4 11 1 1 4 333 722 734 916 1305 1317
+1276 6 4 11 1 1 1 335 774 651 918 1357 1234
+1277 6 4 11 1 1 1 375 676 763 958 1259 1346
+1278 6 4 11 1 1 1 320 763 655 903 1346 1238
+1279 6 4 11 1 1 3 67 755 661 109 1338 1244
+1280 6 4 11 1 1 1 261 745 775 844 1328 1358
+1281 6 4 11 1 1 1 203 767 747 786 1350 1330
+1282 6 4 11 1 1 2 347 656 756 930 1239 1339
+1283 6 5 11 1 2 2 -1 434 742 728 1017 1325 1311
+1284 6 4 11 1 1 1 375 747 767 958 1330 1350
+1285 6 4 11 1 1 1 33 773 660 153 1356 1243
+1286 6 5 11 1 2 2 -1 229 728 742 812 1311 1325
+1287 6 4 11 1 1 1 375 775 676 958 1358 1259
+1288 6 4 11 1 1 1 244 768 733 827 1351 1316
+1289 6 4 11 1 1 1 364 733 768 947 1316 1351
+$EndElements
diff --git a/dG3D/benchmarks/powerYieldViscoElastoPlasticFullFailure/model.py b/dG3D/benchmarks/powerYieldViscoElastoPlasticFullFailure/model.py
new file mode 100644
index 0000000000000000000000000000000000000000..56555e49eb94e181907f97f2809d73c66ff8b2d2
--- /dev/null
+++ b/dG3D/benchmarks/powerYieldViscoElastoPlasticFullFailure/model.py
@@ -0,0 +1,145 @@
+#coding-Utf-8-*-
+
+from gmshpy import *
+from dG3Dpy import*
+
+from math import*
+
+#script to launch PBC problem with a python script
+
+# material law
+lawnumMatrix = 51 # unique number of law
+
+E = 2.45E9 #MPa
+nu = 0.39
+K = E/3./(1.-2.*nu)	# Bulk mudulus
+mu =E/2./(1.+nu)	  # Shear mudulus
+rho = 1.4e3   # Bulk mass ton/mm3
+sy0c = 48.e6
+fact = 0.8;
+sy0t = sy0c*fact;
+hardenc = ExponentialJ2IsotropicHardening(1,sy0c,55.e6,76.)
+hardent = ExponentialJ2IsotropicHardening(2,sy0t,55.e6*fact,76.)
+hardenk = PolynomialKinematicHardening(3,4)
+hardenk.setCoefficients(2,170.E6)
+hardenk.setCoefficients(3,-440.E6)
+hardenk.setCoefficients(4,1100.E6)
+
+damlaw1 = SimpleSaturateDamageLaw(1, 45, 0.2,0.,2.)
+cl1     = IsotropicCLengthLaw(1, 2.e-6)
+
+damlaw2 = PowerBrittleDamagelaw(2,0,5e-2,1.,0.3)
+damlaw2.setCriticalDamage(0.9)
+cl2     = IsotropicCLengthLaw(2, 16.e-6)
+
+lawMatrix   = NonLocalDamagePowerYieldHyperDG3DMaterialLawWithFailure(lawnumMatrix,rho,E,nu,hardenc,hardent,hardenk,cl1,cl2,damlaw1,damlaw2,1e-6,False,1e-8)
+lawMatrix.setYieldPowerFactor(3.5)
+lawMatrix.setNonAssociatedFlow(True)
+lawMatrix.nonAssociatedFlowRuleFactor(0.3)
+lawMatrix.setStrainOrder(3)
+lawMatrix.setViscoelasticMethod(0)
+N = 4;
+lawMatrix.setViscoElasticNumberOfElement(N)
+lawMatrix.setViscoElasticData(1,380e6,7202.)
+lawMatrix.setViscoElasticData(2,190e6,71.6)
+lawMatrix.setViscoElasticData(3,95e6,0.73)
+lawMatrix.setViscoElasticData(4,48e6,0.073)
+# failure
+#Xc = PowerFailureLaw(1,253.e6,38.e6,0.14)
+#Xt = PowerFailureLaw(2,92.e6,18.e6,0.14)
+Xc = ConstantFailureLaw(1,262.5e6)
+Xt = ConstantFailureLaw(2,100e6)
+
+lawMatrix.setCompressiveFailureModel(Xc)
+lawMatrix.setTractionFailureModel(Xt)
+lawMatrix.setFailurePower(2)
+eta = constantViscosityLaw(1,3e10)
+lawMatrix.setViscosityEffect(eta,0.21)
+
+# geometry
+meshfile="model.msh" # name of mesh file
+
+
+# creation of part Domain
+dim =3
+fullDg = 0 #O = CG, 1 = DG
+space1 = 0 # function space (Lagrange=0)
+beta1  = 100
+# creation of part Domain
+nfieldMatrix = 11 # number of the field (physical number of surface)
+myfieldMatrix = nonLocalDamageDG3DDomain(1000,nfieldMatrix,space1,lawnumMatrix,fullDg,1.e6,3,2)
+#myfieldMatrix.matrixByPerturbation(1,1,1,1e-6)
+myfieldMatrix.stabilityParameters(beta1)
+myfieldMatrix.nonLocalStabilityParameters(beta1,True)
+
+
+# solver
+sol = 2  # Gmm=0 (default) Taucs=1 PETsc=2
+soltype =1 # StaticLinear=0 (default) StaticNonLinear=1
+nstep = 150  # number of step (used only if soltype=1)
+ftime =1100.   # Final time (used only if soltype=1)
+tol=1.e-6 # relative tolerance for NR scheme (used only if soltype=1)
+nstepArch=1 # Number of step between 2 archiving (used only if soltype=1)
+
+# creation of Solver
+mysolver = nonLinearMechSolver(1000)
+mysolver.loadModel(meshfile)
+mysolver.addDomain(myfieldMatrix)
+mysolver.addMaterialLaw(lawMatrix)
+
+
+mysolver.Scheme(soltype)
+mysolver.Solver(sol)
+mysolver.snlData(nstep,ftime,tol)
+mysolver.stepBetweenArchiving(nstepArch)
+
+mysolver.displacementBC("Volume",11,2,0.)
+mysolver.displacementBC("Face",111,1,0.)
+mysolver.displacementBC("Face",111,0,0.)
+
+mysolver.displacementBC("Face",112,0,0.)
+mysolver.displacementBC("Face",112,1,1.e-6)
+
+
+
+
+# build view
+mysolver.internalPointBuildView("Green-Lagrange_xx",IPField.STRAIN_XX, 1, 1);
+mysolver.internalPointBuildView("Green-Lagrange_yy",IPField.STRAIN_YY, 1, 1);
+mysolver.internalPointBuildView("Green-Lagrange_zz",IPField.STRAIN_ZZ, 1, 1);
+mysolver.internalPointBuildView("Green-Lagrange_xy",IPField.STRAIN_XY, 1, 1);
+mysolver.internalPointBuildView("Green-Lagrange_yz",IPField.STRAIN_YZ, 1, 1);
+mysolver.internalPointBuildView("Green-Lagrange_xz",IPField.STRAIN_XZ, 1, 1);
+mysolver.internalPointBuildView("sig_xx",IPField.SIG_XX, 1, 1);
+mysolver.internalPointBuildView("sig_yy",IPField.SIG_YY, 1, 1);
+mysolver.internalPointBuildView("sig_zz",IPField.SIG_ZZ, 1, 1);
+mysolver.internalPointBuildView("sig_xy",IPField.SIG_XY, 1, 1);
+mysolver.internalPointBuildView("sig_yz",IPField.SIG_YZ, 1, 1);
+mysolver.internalPointBuildView("sig_xz",IPField.SIG_XZ, 1, 1);
+mysolver.internalPointBuildView("sig_VM",IPField.SVM, 1, 1);
+mysolver.internalPointBuildView("Equivalent plastic strain",IPField.PLASTICSTRAIN, 1, 1);
+mysolver.internalPointBuildView("pression",IPField.PRESSION,1,1)
+mysolver.internalPointBuildView("plastic possio ratio",IPField.PLASTIC_POISSON_RATIO,1,1)
+mysolver.internalPointBuildView("Damage",IPField.DAMAGE,1,1)
+mysolver.internalPointBuildView("failure onset",IPField.FAILURE_ONSET,1,1)
+mysolver.internalPointBuildView("nonlocal Plastic strain",IPField.NONLOCAL_PLASTICSTRAIN,1,1)
+
+mysolver.internalPointBuildView("Saturation Damage",IPField.DAMAGE0,1,1)
+mysolver.internalPointBuildView("Failure Damage",IPField.DAMAGE1,1,1) 
+mysolver.internalPointBuildView("Nonlocal Failure plasticity",IPField.NONLOCAL_FAILURE_PLASTICSTRAIN,1,1) 
+
+
+
+#archiving
+mysolver.archivingForceOnPhysicalGroup('Face',111,0)
+mysolver.archivingForceOnPhysicalGroup('Face',111,1)
+mysolver.archivingForceOnPhysicalGroup('Face',112,0)
+mysolver.archivingForceOnPhysicalGroup('Face',112,1)
+mysolver.archivingNodeDisplacement(113,1)
+
+# solve
+mysolver.solve()
+
+check = TestCheck()
+check.equal(-4.287653e+02,mysolver.getArchivedForceOnPhysicalGroup("Face", 111, 1),1.e-4)
+
diff --git a/dG3D/benchmarks/powerYieldViscoElastoPlasticSaturationDamage/CMakeLists.txt b/dG3D/benchmarks/powerYieldViscoElastoPlasticSaturationDamage/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..d6c9fae6b6839022571a1d9a21501dae3cd29380
--- /dev/null
+++ b/dG3D/benchmarks/powerYieldViscoElastoPlasticSaturationDamage/CMakeLists.txt
@@ -0,0 +1,11 @@
+# test file
+
+set(PYFILE cylinder.py)
+
+set(FILES2DELETE 
+  disp.msh
+  stress.msh
+  *.csv
+)
+
+add_cm3python_test(${PYFILE} "${FILES2DELETE}")
diff --git a/dG3D/benchmarks/powerYieldViscoElastoPlasticSaturationDamage/cylinder.geo b/dG3D/benchmarks/powerYieldViscoElastoPlasticSaturationDamage/cylinder.geo
new file mode 100644
index 0000000000000000000000000000000000000000..b7914ad13f66e2bf45173c552530ce3b3c7ba8a7
--- /dev/null
+++ b/dG3D/benchmarks/powerYieldViscoElastoPlasticSaturationDamage/cylinder.geo
@@ -0,0 +1,27 @@
+mm = 1;
+D = 12.*mm;
+H = 12.*mm;
+
+R = D/2.;
+lsca = 0.15*D;
+
+Point(1) = {0,0,0,lsca};
+Point(2) = {R,0,0,lsca};
+Point(3) = {0,R,0,lsca};
+
+Circle(1) = {3, 1, 2};
+Line(2) = {3, 1};
+Line(3) = {1, 2};
+Line Loop(4) = {1, -3, -2};
+Plane Surface(5) = {4};
+Extrude {0, 0, H/2} {
+  Surface{5}; Layers{5}; //Recombine;
+}
+Physical Volume(11) = {1};
+Physical Surface(1) = {5};
+Physical Surface(2) = {22};
+Physical Surface(3) = {17};
+Physical Surface(4) = {21};
+Physical Point(5) = {5};
+
+//Recombine Surface {5};
diff --git a/dG3D/benchmarks/powerYieldViscoElastoPlasticSaturationDamage/cylinder.msh b/dG3D/benchmarks/powerYieldViscoElastoPlasticSaturationDamage/cylinder.msh
new file mode 100644
index 0000000000000000000000000000000000000000..0f52bfc5a294857b8f304b1da6e258fb7505d374
--- /dev/null
+++ b/dG3D/benchmarks/powerYieldViscoElastoPlasticSaturationDamage/cylinder.msh
@@ -0,0 +1,698 @@
+$MeshFormat
+2.2 0 8
+$EndMeshFormat
+$Nodes
+132
+1 0 0 0
+2 6 0 0
+3 0 6 0
+4 0 6 6
+5 0 0 6
+6 6 0 6
+7 1.552914270611066 5.795554957735497 0
+8 2.999999999993018 5.196152422710663 0
+9 4.242640687111061 4.242640687127508 0
+10 5.196152422702976 3.000000000006332 0
+11 5.795554957733712 1.552914270617726 0
+12 0 4.500000000005166 0
+13 0 3.000000000008336 0
+14 0 1.500000000004214 0
+15 1.499999999993832 0 0
+16 2.999999999988567 0 0
+17 4.499999999994237 0 0
+18 1.552914270611066 5.795554957735497 6
+19 2.999999999993018 5.196152422710663 6
+20 4.242640687111061 4.242640687127508 6
+21 5.196152422702976 3.000000000006332 6
+22 5.795554957733712 1.552914270617726 6
+23 4.499999999994237 0 6
+24 2.999999999988567 0 6
+25 1.499999999993832 0 6
+26 0 1.500000000004214 6
+27 0 3.000000000008336 6
+28 0 4.500000000005166 6
+29 0 6 1.2
+30 0 6 2.4
+31 0 6 3.6
+32 0 6 4.800000000000001
+33 6 0 1.2
+34 6 0 2.4
+35 6 0 3.6
+36 6 0 4.800000000000001
+37 0 0 1.2
+38 0 0 2.4
+39 0 0 3.6
+40 0 0 4.800000000000001
+41 2.527448697695314 2.575668272009054 0
+42 1.627841394027458 3.980250003805291 0
+43 3.914833052601809 1.621430334871464 0
+44 1.441200958338174 1.441200958338581 0
+45 3.760905731444732 3.080330269885938 0
+46 2.682328465952599 1.220004215439306 0
+47 1.220004215434672 2.682328465952725 0
+48 3.000820586356653 3.856980823767017 0
+49 1.552914270611066 5.795554957735497 1.2
+50 1.552914270611066 5.795554957735497 2.4
+51 1.552914270611066 5.795554957735497 3.6
+52 1.552914270611066 5.795554957735497 4.800000000000001
+53 2.999999999993018 5.196152422710663 1.2
+54 2.999999999993018 5.196152422710663 2.4
+55 2.999999999993018 5.196152422710663 3.6
+56 2.999999999993018 5.196152422710663 4.800000000000001
+57 4.242640687111061 4.242640687127508 1.2
+58 4.242640687111061 4.242640687127508 2.4
+59 4.242640687111061 4.242640687127508 3.6
+60 4.242640687111061 4.242640687127508 4.800000000000001
+61 5.196152422702976 3.000000000006332 1.2
+62 5.196152422702976 3.000000000006332 2.4
+63 5.196152422702976 3.000000000006332 3.6
+64 5.196152422702976 3.000000000006332 4.800000000000001
+65 5.795554957733712 1.552914270617726 1.2
+66 5.795554957733712 1.552914270617726 2.4
+67 5.795554957733712 1.552914270617726 3.6
+68 5.795554957733712 1.552914270617726 4.800000000000001
+69 1.499999999993832 0 1.2
+70 1.499999999993832 0 2.4
+71 1.499999999993832 0 3.6
+72 1.499999999993832 0 4.800000000000001
+73 2.999999999988567 0 1.2
+74 2.999999999988567 0 2.4
+75 2.999999999988567 0 3.6
+76 2.999999999988567 0 4.800000000000001
+77 4.499999999994237 0 1.2
+78 4.499999999994237 0 2.4
+79 4.499999999994237 0 3.6
+80 4.499999999994237 0 4.800000000000001
+81 0 4.500000000005166 1.2
+82 0 4.500000000005166 2.4
+83 0 4.500000000005166 3.6
+84 0 4.500000000005166 4.800000000000001
+85 0 3.000000000008336 1.2
+86 0 3.000000000008336 2.4
+87 0 3.000000000008336 3.6
+88 0 3.000000000008336 4.800000000000001
+89 0 1.500000000004214 1.2
+90 0 1.500000000004214 2.4
+91 0 1.500000000004214 3.6
+92 0 1.500000000004214 4.800000000000001
+93 2.527448697695314 2.575668272009054 6
+94 1.627841394027458 3.980250003805291 6
+95 3.914833052601809 1.621430334871464 6
+96 1.441200958338174 1.441200958338581 6
+97 3.760905731444732 3.080330269885938 6
+98 2.682328465952599 1.220004215439306 6
+99 1.220004215434672 2.682328465952725 6
+100 3.000820586356653 3.856980823767017 6
+101 2.527448697695314 2.575668272009054 1.2
+102 2.527448697695314 2.575668272009054 2.4
+103 2.527448697695314 2.575668272009054 3.6
+104 2.527448697695314 2.575668272009054 4.800000000000001
+105 1.627841394027458 3.980250003805291 1.2
+106 1.627841394027458 3.980250003805291 2.4
+107 1.627841394027458 3.980250003805291 3.6
+108 1.627841394027458 3.980250003805291 4.800000000000001
+109 3.914833052601809 1.621430334871464 1.2
+110 3.914833052601809 1.621430334871464 2.4
+111 3.914833052601809 1.621430334871464 3.6
+112 3.914833052601809 1.621430334871464 4.800000000000001
+113 1.441200958338174 1.441200958338581 1.2
+114 1.441200958338174 1.441200958338581 2.4
+115 1.441200958338174 1.441200958338581 3.6
+116 1.441200958338174 1.441200958338581 4.800000000000001
+117 3.760905731444732 3.080330269885938 1.2
+118 3.760905731444732 3.080330269885938 2.4
+119 3.760905731444732 3.080330269885938 3.6
+120 3.760905731444732 3.080330269885938 4.800000000000001
+121 2.682328465952599 1.220004215439306 1.2
+122 2.682328465952599 1.220004215439306 2.4
+123 2.682328465952599 1.220004215439306 3.6
+124 2.682328465952599 1.220004215439306 4.800000000000001
+125 1.220004215434672 2.682328465952725 1.2
+126 1.220004215434672 2.682328465952725 2.4
+127 1.220004215434672 2.682328465952725 3.6
+128 1.220004215434672 2.682328465952725 4.800000000000001
+129 3.000820586356653 3.856980823767017 1.2
+130 3.000820586356653 3.856980823767017 2.4
+131 3.000820586356653 3.856980823767017 3.6
+132 3.000820586356653 3.856980823767017 4.800000000000001
+$EndNodes
+$Elements
+557
+1 15 2 5 5 5
+2 2 2 1 5 7 42 12
+3 2 2 1 5 11 17 43
+4 2 2 1 5 16 43 17
+5 2 2 1 5 12 42 13
+6 2 2 1 5 1 44 15
+7 2 2 1 5 1 14 44
+8 2 2 1 5 3 7 12
+9 2 2 1 5 11 2 17
+10 2 2 1 5 16 46 43
+11 2 2 1 5 13 42 47
+12 2 2 1 5 7 8 42
+13 2 2 1 5 10 11 43
+14 2 2 1 5 41 42 48
+15 2 2 1 5 10 43 45
+16 2 2 1 5 15 46 16
+17 2 2 1 5 13 47 14
+18 2 2 1 5 41 47 42
+19 2 2 1 5 41 43 46
+20 2 2 1 5 41 45 43
+21 2 2 1 5 15 44 46
+22 2 2 1 5 14 47 44
+23 2 2 1 5 8 48 42
+24 2 2 1 5 9 10 45
+25 2 2 1 5 41 48 45
+26 2 2 1 5 8 9 48
+27 2 2 1 5 41 46 44
+28 2 2 1 5 41 44 47
+29 2 2 1 5 9 45 48
+30 2 2 3 17 37 69 1
+31 2 2 3 17 1 69 15
+32 2 2 3 17 38 70 37
+33 2 2 3 17 37 70 69
+34 2 2 3 17 39 71 38
+35 2 2 3 17 38 71 70
+36 2 2 3 17 40 72 39
+37 2 2 3 17 39 72 71
+38 2 2 3 17 5 25 40
+39 2 2 3 17 40 25 72
+40 2 2 3 17 69 73 15
+41 2 2 3 17 15 73 16
+42 2 2 3 17 70 74 69
+43 2 2 3 17 69 74 73
+44 2 2 3 17 71 75 70
+45 2 2 3 17 70 75 74
+46 2 2 3 17 72 76 71
+47 2 2 3 17 71 76 75
+48 2 2 3 17 25 24 72
+49 2 2 3 17 72 24 76
+50 2 2 3 17 73 77 16
+51 2 2 3 17 16 77 17
+52 2 2 3 17 74 78 73
+53 2 2 3 17 73 78 77
+54 2 2 3 17 75 79 74
+55 2 2 3 17 74 79 78
+56 2 2 3 17 76 80 75
+57 2 2 3 17 75 80 79
+58 2 2 3 17 24 23 76
+59 2 2 3 17 76 23 80
+60 2 2 3 17 77 2 17
+61 2 2 3 17 77 33 2
+62 2 2 3 17 78 33 77
+63 2 2 3 17 78 34 33
+64 2 2 3 17 79 34 78
+65 2 2 3 17 79 35 34
+66 2 2 3 17 80 35 79
+67 2 2 3 17 80 36 35
+68 2 2 3 17 23 36 80
+69 2 2 3 17 23 6 36
+70 2 2 4 21 29 81 3
+71 2 2 4 21 3 81 12
+72 2 2 4 21 30 82 29
+73 2 2 4 21 29 82 81
+74 2 2 4 21 31 83 30
+75 2 2 4 21 30 83 82
+76 2 2 4 21 32 84 31
+77 2 2 4 21 31 84 83
+78 2 2 4 21 4 28 32
+79 2 2 4 21 32 28 84
+80 2 2 4 21 81 85 12
+81 2 2 4 21 12 85 13
+82 2 2 4 21 82 86 81
+83 2 2 4 21 81 86 85
+84 2 2 4 21 83 86 82
+85 2 2 4 21 83 87 86
+86 2 2 4 21 84 88 83
+87 2 2 4 21 83 88 87
+88 2 2 4 21 28 27 84
+89 2 2 4 21 84 27 88
+90 2 2 4 21 85 89 13
+91 2 2 4 21 13 89 14
+92 2 2 4 21 86 90 85
+93 2 2 4 21 85 90 89
+94 2 2 4 21 87 91 86
+95 2 2 4 21 86 91 90
+96 2 2 4 21 88 92 87
+97 2 2 4 21 87 92 91
+98 2 2 4 21 27 26 88
+99 2 2 4 21 88 26 92
+100 2 2 4 21 89 1 14
+101 2 2 4 21 89 37 1
+102 2 2 4 21 90 37 89
+103 2 2 4 21 90 38 37
+104 2 2 4 21 91 38 90
+105 2 2 4 21 91 39 38
+106 2 2 4 21 92 39 91
+107 2 2 4 21 92 40 39
+108 2 2 4 21 26 40 92
+109 2 2 4 21 26 5 40
+110 2 2 2 22 18 94 28
+111 2 2 2 22 22 23 95
+112 2 2 2 22 24 95 23
+113 2 2 2 22 28 94 27
+114 2 2 2 22 5 96 25
+115 2 2 2 22 5 26 96
+116 2 2 2 22 4 18 28
+117 2 2 2 22 22 6 23
+118 2 2 2 22 24 98 95
+119 2 2 2 22 27 94 99
+120 2 2 2 22 18 19 94
+121 2 2 2 22 21 22 95
+122 2 2 2 22 93 94 100
+123 2 2 2 22 21 95 97
+124 2 2 2 22 25 98 24
+125 2 2 2 22 27 99 26
+126 2 2 2 22 93 99 94
+127 2 2 2 22 93 95 98
+128 2 2 2 22 93 97 95
+129 2 2 2 22 25 96 98
+130 2 2 2 22 26 99 96
+131 2 2 2 22 19 100 94
+132 2 2 2 22 20 21 97
+133 2 2 2 22 93 100 97
+134 2 2 2 22 19 20 100
+135 2 2 2 22 93 98 96
+136 2 2 2 22 93 96 99
+137 2 2 2 22 20 97 100
+138 4 2 11 1 7 12 42 105
+139 4 2 11 1 81 49 105 12
+140 4 2 11 1 12 49 105 7
+141 4 2 11 1 49 81 105 106
+142 4 2 11 1 82 50 106 49
+143 4 2 11 1 81 49 82 106
+144 4 2 11 1 50 82 106 83
+145 4 2 11 1 83 51 107 50
+146 4 2 11 1 106 50 83 107
+147 4 2 11 1 51 83 107 84
+148 4 2 11 1 84 52 108 51
+149 4 2 11 1 107 51 84 108
+150 4 2 11 1 52 84 108 28
+151 4 2 11 1 28 18 94 52
+152 4 2 11 1 108 52 28 94
+153 4 2 11 1 11 43 17 109
+154 4 2 11 1 109 65 77 11
+155 4 2 11 1 17 11 109 77
+156 4 2 11 1 65 109 77 78
+157 4 2 11 1 110 66 78 65
+158 4 2 11 1 109 65 110 78
+159 4 2 11 1 66 110 78 79
+160 4 2 11 1 111 67 79 66
+161 4 2 11 1 110 66 111 79
+162 4 2 11 1 67 111 79 80
+163 4 2 11 1 112 68 80 67
+164 4 2 11 1 111 67 112 80
+165 4 2 11 1 68 112 80 23
+166 4 2 11 1 95 22 23 68
+167 4 2 11 1 112 68 95 23
+168 4 2 11 1 16 17 43 109
+169 4 2 11 1 77 73 109 16
+170 4 2 11 1 17 16 77 109
+171 4 2 11 1 73 77 109 78
+172 4 2 11 1 78 74 110 73
+173 4 2 11 1 109 73 78 110
+174 4 2 11 1 74 78 110 79
+175 4 2 11 1 79 75 111 74
+176 4 2 11 1 110 74 79 111
+177 4 2 11 1 75 79 111 80
+178 4 2 11 1 80 76 112 75
+179 4 2 11 1 111 75 80 112
+180 4 2 11 1 76 80 112 23
+181 4 2 11 1 23 24 95 76
+182 4 2 11 1 112 76 23 95
+183 4 2 11 1 12 13 42 105
+184 4 2 11 1 85 81 105 12
+185 4 2 11 1 13 12 85 105
+186 4 2 11 1 81 85 105 106
+187 4 2 11 1 86 82 106 81
+188 4 2 11 1 85 81 86 106
+189 4 2 11 1 82 86 106 83
+190 4 2 11 1 87 83 107 106
+191 4 2 11 1 86 83 87 106
+192 4 2 11 1 83 87 107 88
+193 4 2 11 1 88 84 108 107
+194 4 2 11 1 83 84 88 107
+195 4 2 11 1 84 88 108 27
+196 4 2 11 1 27 28 94 108
+197 4 2 11 1 84 28 27 108
+198 4 2 11 1 1 15 44 113
+199 4 2 11 1 69 37 113 1
+200 4 2 11 1 15 1 69 113
+201 4 2 11 1 37 69 113 114
+202 4 2 11 1 70 38 114 37
+203 4 2 11 1 69 37 70 114
+204 4 2 11 1 38 70 114 115
+205 4 2 11 1 71 39 115 38
+206 4 2 11 1 70 38 71 115
+207 4 2 11 1 39 71 115 116
+208 4 2 11 1 72 40 116 39
+209 4 2 11 1 71 39 72 116
+210 4 2 11 1 40 72 116 96
+211 4 2 11 1 25 5 96 40
+212 4 2 11 1 72 40 25 96
+213 4 2 11 1 1 44 14 113
+214 4 2 11 1 113 37 89 1
+215 4 2 11 1 14 1 113 89
+216 4 2 11 1 37 113 89 90
+217 4 2 11 1 114 38 90 37
+218 4 2 11 1 113 37 114 90
+219 4 2 11 1 38 114 90 91
+220 4 2 11 1 115 39 91 38
+221 4 2 11 1 114 38 115 91
+222 4 2 11 1 39 115 91 92
+223 4 2 11 1 116 40 92 39
+224 4 2 11 1 115 39 116 92
+225 4 2 11 1 40 116 92 26
+226 4 2 11 1 96 5 26 40
+227 4 2 11 1 116 40 96 26
+228 4 2 11 1 3 12 7 49
+229 4 2 11 1 81 29 49 3
+230 4 2 11 1 12 3 81 49
+231 4 2 11 1 29 81 49 82
+232 4 2 11 1 82 30 50 29
+233 4 2 11 1 49 29 82 50
+234 4 2 11 1 30 82 50 83
+235 4 2 11 1 83 31 51 30
+236 4 2 11 1 50 30 83 51
+237 4 2 11 1 31 83 51 84
+238 4 2 11 1 84 32 52 31
+239 4 2 11 1 51 31 84 52
+240 4 2 11 1 32 84 52 28
+241 4 2 11 1 28 4 18 32
+242 4 2 11 1 52 32 28 18
+243 4 2 11 1 11 17 2 77
+244 4 2 11 1 77 65 33 2
+245 4 2 11 1 11 65 77 2
+246 4 2 11 1 65 77 33 78
+247 4 2 11 1 78 66 34 33
+248 4 2 11 1 65 66 78 33
+249 4 2 11 1 66 78 34 79
+250 4 2 11 1 79 67 35 66
+251 4 2 11 1 34 66 79 35
+252 4 2 11 1 67 79 35 80
+253 4 2 11 1 80 68 36 35
+254 4 2 11 1 67 68 80 35
+255 4 2 11 1 68 80 36 23
+256 4 2 11 1 23 22 6 36
+257 4 2 11 1 68 22 23 36
+258 4 2 11 1 16 43 46 121
+259 4 2 11 1 109 73 121 16
+260 4 2 11 1 43 16 109 121
+261 4 2 11 1 73 109 121 122
+262 4 2 11 1 110 74 122 73
+263 4 2 11 1 109 73 110 122
+264 4 2 11 1 74 110 122 123
+265 4 2 11 1 111 75 123 74
+266 4 2 11 1 110 74 111 123
+267 4 2 11 1 75 111 123 124
+268 4 2 11 1 112 76 124 75
+269 4 2 11 1 111 75 112 124
+270 4 2 11 1 76 112 124 98
+271 4 2 11 1 95 24 98 76
+272 4 2 11 1 112 76 95 98
+273 4 2 11 1 13 47 42 105
+274 4 2 11 1 125 85 105 13
+275 4 2 11 1 47 13 125 105
+276 4 2 11 1 85 125 105 106
+277 4 2 11 1 126 86 106 125
+278 4 2 11 1 125 86 106 85
+279 4 2 11 1 86 126 106 87
+280 4 2 11 1 127 87 107 126
+281 4 2 11 1 126 87 107 106
+282 4 2 11 1 87 127 107 128
+283 4 2 11 1 128 88 108 107
+284 4 2 11 1 87 88 128 107
+285 4 2 11 1 88 128 108 99
+286 4 2 11 1 99 27 94 108
+287 4 2 11 1 88 27 99 108
+288 4 2 11 1 7 42 8 105
+289 4 2 11 1 105 49 53 8
+290 4 2 11 1 7 49 105 8
+291 4 2 11 1 49 105 53 106
+292 4 2 11 1 106 50 54 49
+293 4 2 11 1 53 49 106 54
+294 4 2 11 1 50 106 54 107
+295 4 2 11 1 107 51 55 50
+296 4 2 11 1 54 50 107 55
+297 4 2 11 1 51 107 55 108
+298 4 2 11 1 108 52 56 51
+299 4 2 11 1 55 51 108 56
+300 4 2 11 1 52 108 56 94
+301 4 2 11 1 94 18 19 52
+302 4 2 11 1 56 52 94 19
+303 4 2 11 1 10 43 11 109
+304 4 2 11 1 109 61 65 11
+305 4 2 11 1 10 61 109 11
+306 4 2 11 1 61 109 65 110
+307 4 2 11 1 110 62 66 65
+308 4 2 11 1 61 62 110 65
+309 4 2 11 1 62 110 66 111
+310 4 2 11 1 111 63 67 66
+311 4 2 11 1 62 63 111 66
+312 4 2 11 1 63 111 67 112
+313 4 2 11 1 112 64 68 63
+314 4 2 11 1 67 63 112 68
+315 4 2 11 1 64 112 68 95
+316 4 2 11 1 95 21 22 64
+317 4 2 11 1 68 64 95 22
+318 4 2 11 1 41 48 42 105
+319 4 2 11 1 129 101 105 48
+320 4 2 11 1 48 101 105 41
+321 4 2 11 1 101 129 105 102
+322 4 2 11 1 130 102 106 105
+323 4 2 11 1 129 102 130 105
+324 4 2 11 1 102 130 106 103
+325 4 2 11 1 131 103 107 130
+326 4 2 11 1 130 103 107 106
+327 4 2 11 1 103 131 107 104
+328 4 2 11 1 132 104 108 107
+329 4 2 11 1 131 104 132 107
+330 4 2 11 1 104 132 108 93
+331 4 2 11 1 100 93 94 108
+332 4 2 11 1 132 93 100 108
+333 4 2 11 1 10 45 43 117
+334 4 2 11 1 117 61 109 10
+335 4 2 11 1 43 10 117 109
+336 4 2 11 1 61 117 109 118
+337 4 2 11 1 118 62 110 61
+338 4 2 11 1 109 61 118 110
+339 4 2 11 1 62 118 110 119
+340 4 2 11 1 119 63 111 62
+341 4 2 11 1 110 62 119 111
+342 4 2 11 1 63 119 111 120
+343 4 2 11 1 120 64 112 63
+344 4 2 11 1 111 63 120 112
+345 4 2 11 1 64 120 112 97
+346 4 2 11 1 97 21 95 64
+347 4 2 11 1 112 64 97 95
+348 4 2 11 1 15 16 46 121
+349 4 2 11 1 73 69 121 15
+350 4 2 11 1 16 15 73 121
+351 4 2 11 1 69 73 121 122
+352 4 2 11 1 74 70 122 69
+353 4 2 11 1 73 69 74 122
+354 4 2 11 1 70 74 122 123
+355 4 2 11 1 75 71 123 70
+356 4 2 11 1 74 70 75 123
+357 4 2 11 1 71 75 123 124
+358 4 2 11 1 76 72 124 71
+359 4 2 11 1 75 71 76 124
+360 4 2 11 1 72 76 124 98
+361 4 2 11 1 24 25 98 72
+362 4 2 11 1 76 72 24 98
+363 4 2 11 1 13 14 47 125
+364 4 2 11 1 89 85 125 13
+365 4 2 11 1 14 13 89 125
+366 4 2 11 1 85 89 125 90
+367 4 2 11 1 90 86 126 125
+368 4 2 11 1 85 86 90 125
+369 4 2 11 1 86 90 126 91
+370 4 2 11 1 91 87 127 126
+371 4 2 11 1 86 87 91 126
+372 4 2 11 1 87 91 127 128
+373 4 2 11 1 92 88 128 87
+374 4 2 11 1 91 87 92 128
+375 4 2 11 1 88 92 128 99
+376 4 2 11 1 26 27 99 88
+377 4 2 11 1 92 88 26 99
+378 4 2 11 1 41 42 47 105
+379 4 2 11 1 105 101 125 47
+380 4 2 11 1 41 101 105 47
+381 4 2 11 1 101 105 125 102
+382 4 2 11 1 106 102 126 125
+383 4 2 11 1 105 102 106 125
+384 4 2 11 1 102 106 126 103
+385 4 2 11 1 107 103 127 126
+386 4 2 11 1 106 103 107 126
+387 4 2 11 1 103 107 127 128
+388 4 2 11 1 108 104 128 107
+389 4 2 11 1 107 104 128 103
+390 4 2 11 1 104 108 128 99
+391 4 2 11 1 94 93 99 108
+392 4 2 11 1 108 93 99 104
+393 4 2 11 1 41 46 43 101
+394 4 2 11 1 121 101 109 43
+395 4 2 11 1 46 101 121 43
+396 4 2 11 1 101 121 109 122
+397 4 2 11 1 122 102 110 109
+398 4 2 11 1 101 102 122 109
+399 4 2 11 1 102 122 110 103
+400 4 2 11 1 123 103 111 110
+401 4 2 11 1 122 103 123 110
+402 4 2 11 1 103 123 111 124
+403 4 2 11 1 124 104 112 111
+404 4 2 11 1 103 104 124 111
+405 4 2 11 1 104 124 112 93
+406 4 2 11 1 98 93 95 112
+407 4 2 11 1 124 93 98 112
+408 4 2 11 1 41 43 45 101
+409 4 2 11 1 109 101 117 43
+410 4 2 11 1 43 101 117 45
+411 4 2 11 1 101 109 117 102
+412 4 2 11 1 110 102 118 109
+413 4 2 11 1 109 102 118 117
+414 4 2 11 1 102 110 118 103
+415 4 2 11 1 111 103 119 110
+416 4 2 11 1 110 103 119 118
+417 4 2 11 1 103 111 119 120
+418 4 2 11 1 112 104 120 111
+419 4 2 11 1 111 104 120 103
+420 4 2 11 1 104 112 120 93
+421 4 2 11 1 95 93 97 112
+422 4 2 11 1 112 93 97 120
+423 4 2 11 1 15 46 44 113
+424 4 2 11 1 121 69 113 15
+425 4 2 11 1 46 15 121 113
+426 4 2 11 1 69 121 113 122
+427 4 2 11 1 122 70 114 69
+428 4 2 11 1 113 69 122 114
+429 4 2 11 1 70 122 114 123
+430 4 2 11 1 123 71 115 70
+431 4 2 11 1 114 70 123 115
+432 4 2 11 1 71 123 115 124
+433 4 2 11 1 124 72 116 71
+434 4 2 11 1 115 71 124 116
+435 4 2 11 1 72 124 116 98
+436 4 2 11 1 98 25 96 72
+437 4 2 11 1 116 72 98 96
+438 4 2 11 1 14 44 47 113
+439 4 2 11 1 113 89 125 14
+440 4 2 11 1 47 14 113 125
+441 4 2 11 1 89 113 125 90
+442 4 2 11 1 114 90 126 113
+443 4 2 11 1 113 90 126 125
+444 4 2 11 1 90 114 126 91
+445 4 2 11 1 115 91 127 114
+446 4 2 11 1 114 91 127 126
+447 4 2 11 1 91 115 127 128
+448 4 2 11 1 116 92 128 115
+449 4 2 11 1 115 92 128 91
+450 4 2 11 1 92 116 128 99
+451 4 2 11 1 96 26 99 116
+452 4 2 11 1 116 26 99 92
+453 4 2 11 1 8 42 48 105
+454 4 2 11 1 105 53 129 8
+455 4 2 11 1 48 8 105 129
+456 4 2 11 1 53 105 129 130
+457 4 2 11 1 106 54 130 53
+458 4 2 11 1 105 53 106 130
+459 4 2 11 1 54 106 130 107
+460 4 2 11 1 107 55 131 54
+461 4 2 11 1 130 54 107 131
+462 4 2 11 1 55 107 131 132
+463 4 2 11 1 108 56 132 55
+464 4 2 11 1 107 55 108 132
+465 4 2 11 1 56 108 132 100
+466 4 2 11 1 94 19 100 56
+467 4 2 11 1 108 56 94 100
+468 4 2 11 1 9 45 10 117
+469 4 2 11 1 117 57 61 9
+470 4 2 11 1 10 9 117 61
+471 4 2 11 1 57 117 61 118
+472 4 2 11 1 118 58 62 57
+473 4 2 11 1 61 57 118 62
+474 4 2 11 1 58 118 62 119
+475 4 2 11 1 119 59 63 58
+476 4 2 11 1 62 58 119 63
+477 4 2 11 1 59 119 63 120
+478 4 2 11 1 120 60 64 63
+479 4 2 11 1 59 60 120 63
+480 4 2 11 1 60 120 64 97
+481 4 2 11 1 97 20 21 64
+482 4 2 11 1 60 20 97 64
+483 4 2 11 1 41 45 48 101
+484 4 2 11 1 117 101 129 48
+485 4 2 11 1 45 101 117 48
+486 4 2 11 1 101 117 129 102
+487 4 2 11 1 118 102 130 117
+488 4 2 11 1 117 102 130 129
+489 4 2 11 1 102 118 130 103
+490 4 2 11 1 119 103 131 130
+491 4 2 11 1 118 103 119 130
+492 4 2 11 1 103 119 131 120
+493 4 2 11 1 120 104 132 131
+494 4 2 11 1 103 104 120 131
+495 4 2 11 1 104 120 132 93
+496 4 2 11 1 97 93 100 120
+497 4 2 11 1 120 93 100 132
+498 4 2 11 1 8 48 9 129
+499 4 2 11 1 129 53 57 8
+500 4 2 11 1 9 8 129 57
+501 4 2 11 1 53 129 57 130
+502 4 2 11 1 130 54 58 53
+503 4 2 11 1 57 53 130 58
+504 4 2 11 1 54 130 58 131
+505 4 2 11 1 131 55 59 54
+506 4 2 11 1 58 54 131 59
+507 4 2 11 1 55 131 59 132
+508 4 2 11 1 132 56 60 55
+509 4 2 11 1 59 55 132 60
+510 4 2 11 1 56 132 60 100
+511 4 2 11 1 100 19 20 56
+512 4 2 11 1 60 56 100 20
+513 4 2 11 1 41 44 46 113
+514 4 2 11 1 113 101 121 46
+515 4 2 11 1 41 101 113 46
+516 4 2 11 1 101 113 121 122
+517 4 2 11 1 114 102 122 113
+518 4 2 11 1 113 102 122 101
+519 4 2 11 1 102 114 122 103
+520 4 2 11 1 115 103 123 114
+521 4 2 11 1 114 103 123 122
+522 4 2 11 1 103 115 123 124
+523 4 2 11 1 116 104 124 115
+524 4 2 11 1 115 104 124 103
+525 4 2 11 1 104 116 124 93
+526 4 2 11 1 96 93 98 116
+527 4 2 11 1 116 93 98 124
+528 4 2 11 1 41 47 44 113
+529 4 2 11 1 125 101 113 47
+530 4 2 11 1 47 101 113 41
+531 4 2 11 1 101 125 113 102
+532 4 2 11 1 126 102 114 113
+533 4 2 11 1 125 102 126 113
+534 4 2 11 1 102 126 114 103
+535 4 2 11 1 127 103 115 114
+536 4 2 11 1 126 103 127 114
+537 4 2 11 1 103 127 115 128
+538 4 2 11 1 128 104 116 115
+539 4 2 11 1 103 104 128 115
+540 4 2 11 1 104 128 116 99
+541 4 2 11 1 99 93 96 116
+542 4 2 11 1 104 93 99 116
+543 4 2 11 1 9 48 45 117
+544 4 2 11 1 129 57 117 9
+545 4 2 11 1 48 9 129 117
+546 4 2 11 1 57 129 117 130
+547 4 2 11 1 130 58 118 57
+548 4 2 11 1 117 57 130 118
+549 4 2 11 1 58 130 118 119
+550 4 2 11 1 131 59 119 58
+551 4 2 11 1 130 58 131 119
+552 4 2 11 1 59 131 119 120
+553 4 2 11 1 132 60 120 59
+554 4 2 11 1 131 59 132 120
+555 4 2 11 1 60 132 120 100
+556 4 2 11 1 100 20 97 60
+557 4 2 11 1 120 60 100 97
+$EndElements
diff --git a/dG3D/benchmarks/powerYieldViscoElastoPlasticSaturationDamage/cylinder.py b/dG3D/benchmarks/powerYieldViscoElastoPlasticSaturationDamage/cylinder.py
new file mode 100644
index 0000000000000000000000000000000000000000..315ba33fc133d0365abe601e92b5f6b835ae116c
--- /dev/null
+++ b/dG3D/benchmarks/powerYieldViscoElastoPlasticSaturationDamage/cylinder.py
@@ -0,0 +1,133 @@
+#coding-Utf-8-*-
+
+from gmshpy import *
+from dG3Dpy import*
+
+from math import*
+
+#script to launch PBC problem with a python script
+
+# material law
+lawnum = 11 # unique number of law
+
+E = 2.7E3 #MPa
+nu = 0.3
+K = E/3./(1.-2.*nu)	# Bulk mudulus
+mu =E/2./(1.+nu)	  # Shear mudulus
+rho = 7850e-9 # Bulk mass
+
+sy0c = 100. #MPa
+hc = 300.
+
+sy0t = sy0c*0.78
+ht = 300.
+
+    
+# creation of law
+hardenc = LinearExponentialJ2IsotropicHardening(1, sy0c, hc, 0., 10.)
+hardent = LinearExponentialJ2IsotropicHardening(2, sy0t, ht, 0., 10.)
+hardenk = PolynomialKinematicHardening(3,1)
+hardenk.setCoefficients(1,370.)
+
+
+cl     = IsotropicCLengthLaw(1, 1.)
+#saturation law
+H = 50.
+Dinf = 0.3
+pi = 0.
+alpha = 1.
+damlaw = SimpleSaturateDamageLaw(1, H, Dinf,pi,alpha)
+
+law1   = NonLocalDamagePowerYieldHyperDG3DMaterialLaw(lawnum,rho,E,nu,hardenc,hardent,hardenk,cl,damlaw,1e-6,False,1e-8)
+
+law1.setStrainOrder(5)
+law1.setYieldPowerFactor(3.5)
+law1.setNonAssociatedFlow(True)
+law1.nonAssociatedFlowRuleFactor(0.5)
+law1.setViscoelasticMethod(0)
+N = 4;
+law1.setViscoElasticNumberOfElement(N)
+law1.setViscoElasticData(1,1380,7202.)
+law1.setViscoElasticData(2,1190,71.6)
+law1.setViscoElasticData(3,195,0.73)
+law1.setViscoElasticData(4,148,0.073)
+
+eta = constantViscosityLaw(1,3e4)
+law1.setViscosityEffect(eta,0.21)
+
+# geometry
+meshfile="cylinder.msh" # name of mesh file
+
+fullDg = 0 #O = CG, 1 = DG
+space1 = 0 # function space (Lagrange=0)
+beta1  = 100
+# creation of part Domain
+nfield = 11 # number of the field (physical number of surface)
+
+myfield1 = nonLocalDamageDG3DDomain(1000,nfield,space1,lawnum,fullDg,1.)
+#myfield1.matrixByPerturbation(1,1,1,1e-8)
+myfield1.stabilityParameters(beta1)
+myfield1.nonLocalStabilityParameters(beta1,True)
+
+# solver
+sol = 2  # Gmm=0 (default) Taucs=1 PETsc=2
+soltype =1 # StaticLinear=0 (default) StaticNonLinear=1
+nstep = 200  # number of step (used only if soltype=1)
+ftime =1.e-2  # Final time (used only if soltype=1)
+tol=1.e-8  # relative tolerance for NR scheme (used only if soltype=1)
+nstepArch=1 # Number of step between 2 archiving (used only if soltype=1)
+
+
+
+# creation of Solver
+mysolver = nonLinearMechSolver(1000)
+mysolver.loadModel(meshfile)
+mysolver.addDomain(myfield1)
+mysolver.addMaterialLaw(law1)
+mysolver.Scheme(soltype)
+mysolver.Solver(sol)
+mysolver.snlData(nstep,ftime,tol)
+
+mysolver.displacementBC('Face',1,2,0.)
+mysolver.displacementBC('Face',3,1,0.)
+mysolver.displacementBC('Face',4,0,0.)
+
+mysolver.displacementBC('Face',1,0,0)
+mysolver.displacementBC('Face',1,1,0)
+mysolver.displacementBC('Face',2,2,1.e2)
+
+# build view
+mysolver.internalPointBuildView("Strain_xx",IPField.STRAIN_XX, 1, 1);
+mysolver.internalPointBuildView("Strain_yy",IPField.STRAIN_YY, 1, 1);
+mysolver.internalPointBuildView("Strain_zz",IPField.STRAIN_ZZ, 1, 1);
+mysolver.internalPointBuildView("Strain_xy",IPField.STRAIN_XY, 1, 1);
+mysolver.internalPointBuildView("Strain_yz",IPField.STRAIN_YZ, 1, 1);
+mysolver.internalPointBuildView("Strain_xz",IPField.STRAIN_XZ, 1, 1);
+mysolver.internalPointBuildView("sig_xx",IPField.SIG_XX, 1, 1);
+mysolver.internalPointBuildView("sig_yy",IPField.SIG_YY, 1, 1);
+mysolver.internalPointBuildView("sig_zz",IPField.SIG_ZZ, 1, 1);
+mysolver.internalPointBuildView("sig_xy",IPField.SIG_XY, 1, 1);
+mysolver.internalPointBuildView("sig_yz",IPField.SIG_YZ, 1, 1);
+mysolver.internalPointBuildView("sig_xz",IPField.SIG_XZ, 1, 1);
+mysolver.internalPointBuildView("sig_VM",IPField.SVM, 1, 1);
+mysolver.internalPointBuildView("Equivalent plastic strain",IPField.PLASTICSTRAIN, 1, 1);
+mysolver.internalPointBuildView("pression",IPField.PRESSION,1,1)
+mysolver.internalPointBuildView("plastic possion ratio",IPField.PLASTIC_POISSON_RATIO,1,1)
+mysolver.internalPointBuildView("Compression plastic strain",IPField.PLASTICSTRAIN_COMPRESSION, 1, 1);
+mysolver.internalPointBuildView("Traction plastic strain",IPField.PLASTICSTRAIN_TRACTION, 1, 1);
+mysolver.internalPointBuildView("damage",IPField.DAMAGE,1,1)
+
+
+#archiving
+mysolver.archivingForceOnPhysicalGroup('Face',1,0)
+mysolver.archivingForceOnPhysicalGroup('Face',1,1)
+mysolver.archivingForceOnPhysicalGroup('Face',1,2)
+mysolver.archivingNodeDisplacement(5,0,1)
+mysolver.archivingNodeDisplacement(5,1,1)
+mysolver.archivingNodeDisplacement(5,2,1)
+# solve
+mysolver.solve()
+
+check = TestCheck()
+check.equal(-4.644401e+03,mysolver.getArchivedForceOnPhysicalGroup("Face", 1, 2),1.e-3)
+
diff --git a/dG3D/benchmarks/shiftedPBC_2D/idealHole_mixBC.py b/dG3D/benchmarks/shiftedPBC_2D/idealHole_mixBC.py
index 8fe297bf0d5fb7be0e197146e49fe66afcdfe5bd..5db7d2b299044ae34cf401bf7009601c767fd155 100644
--- a/dG3D/benchmarks/shiftedPBC_2D/idealHole_mixBC.py
+++ b/dG3D/benchmarks/shiftedPBC_2D/idealHole_mixBC.py
@@ -57,11 +57,6 @@ mysolver.stiffnessModification(bool(1))
 mysolver.iterativeProcedure(bool(1))
 mysolver.setMessageView(bool(1))
 
-#rve - periodicity
-mysolver.setPeriodicity(1.,0,0,"x")
-mysolver.setPeriodicity(0,1.,0,"y")
-mysolver.setPeriodicity(0,0,1.,"z")
-
 #boundary condition
 microBC = nonLinearShiftedPeriodicBC(10,2)
 microBC.setOrder(1)
diff --git a/dG3D/benchmarks/thermoMecPBC/thermoMecPolycrystal.py b/dG3D/benchmarks/thermoMecPBC/thermoMecPolycrystal.py
index 06bce21e007a29b4eb9db02979ff876cad5c6215..74c069bcffb4efc43f5d1e19b287c340af4a8b54 100644
--- a/dG3D/benchmarks/thermoMecPBC/thermoMecPolycrystal.py
+++ b/dG3D/benchmarks/thermoMecPBC/thermoMecPolycrystal.py
@@ -100,9 +100,6 @@ mysolver.setSystemType(system)
 #mysolver.setControlType(control)
 mysolver.setMicroProblemIndentification(0, 1000);
 
-mysolver.setPeriodicity(h_x,0,0,"x")
-mysolver.setPeriodicity(0,h_y,0,"y")
-mysolver.setPeriodicity(0,0,h_z,"z")
 
 #boundary condition
 microBC = nonLinearPeriodicBC(1000,3)
diff --git a/dG3D/benchmarks/thermoMecPBCCondensation/thermoMecPolycrystalCondensation.py b/dG3D/benchmarks/thermoMecPBCCondensation/thermoMecPolycrystalCondensation.py
index 7c9c5c321aed6ce7eca75b0d34ffd3faa50933e5..8dd04e62bd44b51d17eaec7e8e0ca1e81a1b5585 100644
--- a/dG3D/benchmarks/thermoMecPBCCondensation/thermoMecPolycrystalCondensation.py
+++ b/dG3D/benchmarks/thermoMecPBCCondensation/thermoMecPolycrystalCondensation.py
@@ -99,10 +99,6 @@ mysolver.setSystemType(system)
 #mysolver.setControlType(control)
 mysolver.setMicroProblemIndentification(0, 1000);
 
-mysolver.setPeriodicity(h_x,0,0,"x")
-mysolver.setPeriodicity(0,h_y,0,"y")
-mysolver.setPeriodicity(0,0,h_z,"z")
-
 #boundary condition
 microBC = nonLinearPeriodicBC(1000,3)
 microBC.setOrder(1)
diff --git a/dG3D/benchmarks/thermoMecPBCInSystemCondensation/thermoMecPolycrystalCondensation.py b/dG3D/benchmarks/thermoMecPBCInSystemCondensation/thermoMecPolycrystalCondensation.py
index ad55511bcda5801806d951e3334e902aa8740943..4e85300281be62eca963a21552ca9181b8c2b4a4 100644
--- a/dG3D/benchmarks/thermoMecPBCInSystemCondensation/thermoMecPolycrystalCondensation.py
+++ b/dG3D/benchmarks/thermoMecPBCInSystemCondensation/thermoMecPolycrystalCondensation.py
@@ -102,9 +102,6 @@ mysolver.setSystemType(system)
 mysolver.setMicroProblemIndentification(0, 1000);
 
 
-mysolver.setPeriodicity(h_x,0,0,"x")
-mysolver.setPeriodicity(0,h_y,0,"y")
-mysolver.setPeriodicity(0,0,h_z,"z")
 #boundary condition
 microBC = nonLinearPeriodicBC(1000,3)
 microBC.setOrder(1)
diff --git a/dG3D/benchmarks/thermoMecPBCInSystemCondensationElim/thermoMecPolycrystalCondensation.py b/dG3D/benchmarks/thermoMecPBCInSystemCondensationElim/thermoMecPolycrystalCondensation.py
index 0cdc38c258b41393dacdf7668cc92ee720bcaec1..106218afec266b71dab3b70fd490799e6981a3ff 100644
--- a/dG3D/benchmarks/thermoMecPBCInSystemCondensationElim/thermoMecPolycrystalCondensation.py
+++ b/dG3D/benchmarks/thermoMecPBCInSystemCondensationElim/thermoMecPolycrystalCondensation.py
@@ -100,9 +100,6 @@ mysolver.setSystemType(system)
 mysolver.setMicroProblemIndentification(0, 1000);
 mysolver.invertFlag(True)
 
-mysolver.setPeriodicity(h_x,0,0,"x")
-mysolver.setPeriodicity(0,h_y,0,"y")
-mysolver.setPeriodicity(0,0,h_z,"z")
 
 #boundary condition
 microBC = nonLinearPeriodicBC(1000,3)
diff --git a/dG3D/benchmarks/thermoMecPBCPertElim/thermoMecPolycrystal.py b/dG3D/benchmarks/thermoMecPBCPertElim/thermoMecPolycrystal.py
index 1be796cdc297397e86d72b3cdf83470ce4275fd5..e3dccd0f360e773b432dcddb512e9c7b4184f840 100644
--- a/dG3D/benchmarks/thermoMecPBCPertElim/thermoMecPolycrystal.py
+++ b/dG3D/benchmarks/thermoMecPBCPertElim/thermoMecPolycrystal.py
@@ -99,9 +99,6 @@ mysolver.setSystemType(system)
 #mysolver.setControlType(control)
 mysolver.setMicroProblemIndentification(0, 1000);
 
-mysolver.setPeriodicity(h_x,0,0,"x")
-mysolver.setPeriodicity(0,h_y,0,"y")
-mysolver.setPeriodicity(0,0,h_z,"z")
 #boundary condition
 
 microBC = nonLinearPeriodicBC(1000,3)
diff --git a/dG3D/src/FractureCohesiveDG3DIPVariable.h b/dG3D/src/FractureCohesiveDG3DIPVariable.h
index 36e9a9f063a24fda7a997db00277f946240fb52b..08b55f534f301f93ad68a9e4e119d149dadcbafc 100644
--- a/dG3D/src/FractureCohesiveDG3DIPVariable.h
+++ b/dG3D/src/FractureCohesiveDG3DIPVariable.h
@@ -39,15 +39,16 @@ class FractureCohesive3DIPVariable : public IPVariable2ForFracture<dG3DIPVariabl
   virtual double get(const int i) const;
   virtual double defoEnergy() const{return _ipvfrac->defoEnergy();}
   virtual double plasticEnergy() const{return _ipvfrac->plasticEnergy();}
+  virtual double damageEnergy() const {return _ipvfrac->damageEnergy();};
   virtual int fractureEnergy(double* arrayEnergy) const{return _ipvfrac->fractureEnergy(arrayEnergy);}
 
   virtual void getCauchyStress(STensor3 &cauchy) const { return _ipvbulk->getCauchyStress(cauchy); }
   virtual double getJ() const { return _ipvbulk->getJ(); };
 
-  virtual bool isActiveDamage() const {return _ipvbulk->isActiveDamage();};
+  virtual bool dissipationIsActive() const {return _ipvbulk->dissipationIsActive();};
 
-  virtual void blockDamage(const bool fl){_ipvbulk->blockDamage(fl);};
-  virtual bool damageIsBlocked() const {return _ipvbulk->damageIsBlocked();};
+  virtual void blockDissipation(const bool fl){_ipvbulk->blockDissipation(fl);};
+  virtual bool dissipationIsBlocked() const {return _ipvbulk->dissipationIsBlocked();};
 
   virtual const STensor3 &getConstRefToDeformationGradient() const {return _ipvbulk->getConstRefToDeformationGradient();}
   virtual STensor3 &getRefToDeformationGradient() {return _ipvbulk->getRefToDeformationGradient();}
diff --git a/dG3D/src/FractureCohesiveDG3DMaterialLaw.h b/dG3D/src/FractureCohesiveDG3DMaterialLaw.h
index e0eb08c91ab9419d5164060595a58dae64212615..6bc53e7b21c1e30c09759843235b45402d38cc8a 100644
--- a/dG3D/src/FractureCohesiveDG3DMaterialLaw.h
+++ b/dG3D/src/FractureCohesiveDG3DMaterialLaw.h
@@ -26,7 +26,6 @@ class FractureByCohesive3DLaw : public dG3DMaterialLaw, public  fractureBy2Laws<
   FractureByCohesive3DLaw(const FractureByCohesive3DLaw &source);
   virtual ~FractureByCohesive3DLaw(){}
   virtual matname getType() const{return materialLaw::fracture;}
-  virtual bool withDamage() const {return _mbulk->withDamage();};
 
   virtual void createIPState(IPStateBase* &ips,const bool* state_=NULL,const MElement *ele=NULL, const int nbFF_=0, const IntPt *GP=NULL, const int gpt = 0) const;
   virtual void createIPVariable(IPVariable* &ipv,const MElement *ele, const int nbFF_, const IntPt *GP, const int gpt) const;
diff --git a/dG3D/src/NonLocalDamageHyperelasticDG3DMaterialLaw.cpp b/dG3D/src/NonLocalDamageHyperelasticDG3DMaterialLaw.cpp
index 13c2ddb7569acfabcf52b1cdd75702ff9e3cb5cf..bb0a8ed10b53625bad76ddcc7f6a5571bfefff2b 100644
--- a/dG3D/src/NonLocalDamageHyperelasticDG3DMaterialLaw.cpp
+++ b/dG3D/src/NonLocalDamageHyperelasticDG3DMaterialLaw.cpp
@@ -1,5 +1,5 @@
 //
-// C++ Interface: NonLocalDamageQuadYieldHyperDG3DMaterialLaw
+// C++ Interface: NonLocalDamagePowerYieldHyperDG3DMaterialLaw
 //
 // Description:
 //
@@ -13,165 +13,6 @@
 #include "MInterfaceElement.h"
 #include "FractureCohesiveDG3DIPVariable.h"
 
-NonLocalDamageQuadYieldHyperDG3DMaterialLaw::NonLocalDamageQuadYieldHyperDG3DMaterialLaw(const int num,const double rho,
-                   double E,const double nu,const J2IsotropicHardening &comp,
-                   const J2IsotropicHardening &trac, const J2IsotropicHardening &shear,
-                   const CLengthLaw &_cLLaw,const DamageLaw &_damLaw,const double tol,
-                   const bool matrixbyPerturbation, const double pert):
-                                                              dG3DMaterialLaw(num,rho,true)
-{
-  _nldQuadYieldHyperlaw= new mlawNonLocalDamageQuadYieldHyper(num,E,nu,rho,comp,trac,shear,_cLLaw,_damLaw,tol,matrixbyPerturbation,pert);
-  fillElasticStiffness(E, nu, elasticStiffness);
-};
-
-void NonLocalDamageQuadYieldHyperDG3DMaterialLaw::setYieldSurfaceType(const int type){
-  _nldQuadYieldHyperlaw->setYieldSurfaceType(type);
-};
-
-void NonLocalDamageQuadYieldHyperDG3DMaterialLaw::nonAssociatedFlowRuleFactor(const double b2, const double b1){
-  _nldQuadYieldHyperlaw->nonAssociatedFlowRuleFactor(b2,b1);
-};
-
-void NonLocalDamageQuadYieldHyperDG3DMaterialLaw::setOrderForLogExp(const int o){
-  _nldQuadYieldHyperlaw->setStrainOrder(o);
-};
-
-void NonLocalDamageQuadYieldHyperDG3DMaterialLaw::setViscosityEffect(const viscosityLaw& v, const double p){
-  _nldQuadYieldHyperlaw->setViscosityEffect(v,p);
-};
-
-void NonLocalDamageQuadYieldHyperDG3DMaterialLaw::setViscoelasticMethod(const int method){
-  _nldQuadYieldHyperlaw->setViscoelasticMethod(method);
-};
-
-
-void NonLocalDamageQuadYieldHyperDG3DMaterialLaw::setViscoElasticNumberOfElement(const int N){
-  _nldQuadYieldHyperlaw->setViscoElasticNumberOfElement(N);
-};
-void NonLocalDamageQuadYieldHyperDG3DMaterialLaw::setViscoElasticData(const int i, const double Ei, const double taui){
-  _nldQuadYieldHyperlaw->setViscoElasticData(i,Ei,taui);
-};
-
-void NonLocalDamageQuadYieldHyperDG3DMaterialLaw::setViscoElasticData_Bulk(const int i, const double Ki, const double ki){
-  _nldQuadYieldHyperlaw->setViscoElasticData_Bulk(i,Ki,ki);
-};
-
-void NonLocalDamageQuadYieldHyperDG3DMaterialLaw::setViscoElasticData_Shear(const int i, const double Gi, const double gi){
-  _nldQuadYieldHyperlaw->setViscoElasticData_Shear(i,Gi,gi);
-};
-
-void NonLocalDamageQuadYieldHyperDG3DMaterialLaw::setViscoElasticData(const std::string filename){
-  _nldQuadYieldHyperlaw->setViscoElasticData(filename);
-}
-
-
-
-void NonLocalDamageQuadYieldHyperDG3DMaterialLaw::setFlowPotentialType(const int type){
-  _nldQuadYieldHyperlaw->setFlowPotentialType(type);
-};
-
-NonLocalDamageQuadYieldHyperDG3DMaterialLaw::~NonLocalDamageQuadYieldHyperDG3DMaterialLaw(){
-  if (_nldQuadYieldHyperlaw) delete _nldQuadYieldHyperlaw;
-	_nldQuadYieldHyperlaw = NULL;
-};
-
-NonLocalDamageQuadYieldHyperDG3DMaterialLaw::NonLocalDamageQuadYieldHyperDG3DMaterialLaw(const NonLocalDamageQuadYieldHyperDG3DMaterialLaw &source):
-
-    dG3DMaterialLaw(source)
-{
-	_nldQuadYieldHyperlaw = NULL;
-	if (source._nldQuadYieldHyperlaw != NULL){
-		_nldQuadYieldHyperlaw = new mlawNonLocalDamageQuadYieldHyper(*(source._nldQuadYieldHyperlaw));
-	}
-};
-
-void NonLocalDamageQuadYieldHyperDG3DMaterialLaw::setTime(const double t,const double dtime){
-  this->_timeStep = dtime;
-  this->_currentTime = t;
-  _nldQuadYieldHyperlaw->setTime(t,dtime);
-}
-
-materialLaw::matname NonLocalDamageQuadYieldHyperDG3DMaterialLaw::getType() const {return _nldQuadYieldHyperlaw->getType();}
-
-void NonLocalDamageQuadYieldHyperDG3DMaterialLaw::createIPState(IPStateBase* &ips,const bool* state_,const MElement *ele, const int nbFF_, const IntPt *GP, const int gpt) const
-{
-  // check interface element
-  bool inter=true;
-  const MInterfaceElement *iele = dynamic_cast<const MInterfaceElement*>(ele);
-  if(iele==NULL) inter=false;
-  IPVariable* ipvi = new  nonLocalDamageHyperelasticDG3DIPVariable(*_nldQuadYieldHyperlaw,inter);
-  IPVariable* ipv1 = new  nonLocalDamageHyperelasticDG3DIPVariable(*_nldQuadYieldHyperlaw,inter);
-  IPVariable* ipv2 = new  nonLocalDamageHyperelasticDG3DIPVariable(*_nldQuadYieldHyperlaw,inter);
-  if(ips != NULL) delete ips;
-  ips = new IP3State(state_,ipvi,ipv1,ipv2);
-  _nldQuadYieldHyperlaw->createIPState((dynamic_cast <nonLocalDamageHyperelasticDG3DIPVariable*> (ipvi))->getIPNonLocalDamageHyperelastic(),
-                         (dynamic_cast <nonLocalDamageHyperelasticDG3DIPVariable*> (ipv1))->getIPNonLocalDamageHyperelastic(),
-             			 (dynamic_cast <nonLocalDamageHyperelasticDG3DIPVariable*> (ipv2))->getIPNonLocalDamageHyperelastic());
-
-}
-
-void NonLocalDamageQuadYieldHyperDG3DMaterialLaw::createIPVariable(IPVariable* &ipv,const MElement *ele, const int nbFF_, const IntPt *GP, const int gpt) const
-{
-  if(ipv !=NULL) delete ipv;
-  bool inter=true;
-  const MInterfaceElement *iele = dynamic_cast<const MInterfaceElement*>(ele);
-  if(iele == NULL){
-    inter=false;
-  }
-  ipv = new  nonLocalDamageHyperelasticDG3DIPVariable(*_nldQuadYieldHyperlaw,inter);
-  IPNonLocalDamageHyperelasic * ipvnl = static_cast <nonLocalDamageHyperelasticDG3DIPVariable*>(ipv)->getIPNonLocalDamageHyperelastic();
-  _nldQuadYieldHyperlaw->createIPVariable(ipvnl,ele,nbFF_,GP,gpt);
-}
-
-double NonLocalDamageQuadYieldHyperDG3DMaterialLaw::soundSpeed() const{return _nldQuadYieldHyperlaw->soundSpeed();} // or change value ??
-
-void NonLocalDamageQuadYieldHyperDG3DMaterialLaw::stress(IPVariable* ipv, const IPVariable* ipvp, const bool stiff, const bool checkfrac)
-{
-  /* get ipvariable */
-  nonLocalDamageHyperelasticDG3DIPVariable* ipvcur; //= static_cast < nonLocalDamageDG3DIPVariable *> (ipv);
-  const nonLocalDamageHyperelasticDG3DIPVariable* ipvprev; //= static_cast <const  nonLocalDamageDG3DIPVariable *> (ipvp);
-
-  FractureCohesive3DIPVariable* ipvtmp = dynamic_cast<FractureCohesive3DIPVariable*>(ipv);
-  if(ipvtmp !=NULL)
-  {
-
-    ipvcur = static_cast<nonLocalDamageHyperelasticDG3DIPVariable*>(ipvtmp->getIPvBulk());
-    const FractureCohesive3DIPVariable *ipvtmp2 = static_cast<const FractureCohesive3DIPVariable*>(ipvp);
-    ipvprev = static_cast<const nonLocalDamageHyperelasticDG3DIPVariable*>(ipvtmp2->getIPvBulk());
-   }
-  else
-  {
-    ipvcur = static_cast<nonLocalDamageHyperelasticDG3DIPVariable*>(ipv);
-    ipvprev = static_cast<const nonLocalDamageHyperelasticDG3DIPVariable*>(ipvp);
-  }
-
-  /* strain xyz */
-  const STensor3& F1 = ipvcur->getConstRefToDeformationGradient();
-  const STensor3& F0 = ipvprev->getConstRefToDeformationGradient();
-
-  /* data for J2 law */
-  IPNonLocalDamageHyperelasic* q1 = ipvcur->getIPNonLocalDamageHyperelastic();
-  const IPNonLocalDamageHyperelasic* q0 = ipvprev->getIPNonLocalDamageHyperelastic();
-
-  /* compute stress */
-  _nldQuadYieldHyperlaw->constitutive(F0,F1,ipvcur->getRefToFirstPiolaKirchhoffStress(),q0,q1,ipvcur->getRefToTangentModuli(),
-                        ipvcur->getRefToDLocalVariableDStrain()[0],ipvcur->getRefToDStressDNonLocalVariable()[0],
-                        ipvcur->getRefToDLocalVariableDNonLocalVariable()(0,0),stiff);
-
-  ipvcur->setRefToElasticTangentModuli(this->elasticStiffness);
-
-}
-
-void NonLocalDamageQuadYieldHyperDG3DMaterialLaw::initialIPVariable(IPVariable* ipv) const{
-	dG3DIPVariableBase* dgIPV = dynamic_cast<dG3DIPVariableBase*>(ipv);
-	if (dgIPV!=NULL){
-		dgIPV->setRefToElasticTangentModuli(this->elasticStiffness);
-	}
-	else{
-		Msg::Fatal("dG3DIPVariableBase must be used dG3DLinearElasticMaterialLaw::initialIPVariable");
-	}
-};
-
 //
 NonLocalDamagePowerYieldHyperDG3DMaterialLaw::NonLocalDamagePowerYieldHyperDG3DMaterialLaw(const int num,const double rho,
                    double E,const double nu,const J2IsotropicHardening &comp,
@@ -180,7 +21,12 @@ NonLocalDamagePowerYieldHyperDG3DMaterialLaw::NonLocalDamagePowerYieldHyperDG3DM
                    const bool matrixbyPerturbation , const double pert):
                                                               dG3DMaterialLaw(num,rho,true)
 {
-  _nldPowerYieldHyperlaw= new mlawNonLocalDamagePowerYieldHyper(num,E,nu,rho,comp,trac,_cLLaw,_damLaw,tol,matrixbyPerturbation,pert);
+  _nldPowerYieldHyperlaw= new mlawNonLocalDamagePowerYieldHyper(num,E,nu,rho,tol,matrixbyPerturbation,pert);
+  _nldPowerYieldHyperlaw->setCompressionHardening(comp);
+  _nldPowerYieldHyperlaw->setTractionHardening(trac);
+  _nldPowerYieldHyperlaw->setCLengthLaw(_cLLaw);
+  _nldPowerYieldHyperlaw->setDamageLaw(_damLaw);
+  
   fillElasticStiffness(E, nu, elasticStiffness);
 };
 
@@ -192,7 +38,12 @@ NonLocalDamagePowerYieldHyperDG3DMaterialLaw::NonLocalDamagePowerYieldHyperDG3DM
                    const bool matrixbyPerturbation , const double pert):
                                                               dG3DMaterialLaw(num,rho,true)
 {
-  _nldPowerYieldHyperlaw= new mlawNonLocalDamagePowerYieldHyper(num,E,nu,rho,comp,trac,kin,_cLLaw,_damLaw,tol,matrixbyPerturbation,pert);
+  _nldPowerYieldHyperlaw= new mlawNonLocalDamagePowerYieldHyper(num,E,nu,rho,tol,matrixbyPerturbation,pert);
+  _nldPowerYieldHyperlaw->setCompressionHardening(comp);
+  _nldPowerYieldHyperlaw->setTractionHardening(trac);
+  _nldPowerYieldHyperlaw->setKinematicHardening(kin);
+  _nldPowerYieldHyperlaw->setCLengthLaw(_cLLaw);
+  _nldPowerYieldHyperlaw->setDamageLaw(_damLaw);
   fillElasticStiffness(E, nu, elasticStiffness);
 };
 
@@ -211,7 +62,7 @@ void NonLocalDamagePowerYieldHyperDG3DMaterialLaw::setPlasticPoissonRatio(const
   void NonLocalDamagePowerYieldHyperDG3DMaterialLaw::setNonAssociatedFlow(const bool flag){
     _nldPowerYieldHyperlaw->setNonAssociatedFlow(flag);
   };
-void NonLocalDamagePowerYieldHyperDG3DMaterialLaw::setOrderForLogExp(const int o){
+void NonLocalDamagePowerYieldHyperDG3DMaterialLaw::setStrainOrder(const int o){
   _nldPowerYieldHyperlaw->setStrainOrder(o);
 };
 
@@ -277,9 +128,9 @@ void NonLocalDamagePowerYieldHyperDG3DMaterialLaw::createIPState(IPStateBase* &i
   IPVariable* ipv2 = new  nonLocalDamageHyperelasticDG3DIPVariable(*_nldPowerYieldHyperlaw,inter);
   if(ips != NULL) delete ips;
   ips = new IP3State(state_,ipvi,ipv1,ipv2);
-  _nldPowerYieldHyperlaw->createIPState((dynamic_cast <nonLocalDamageHyperelasticDG3DIPVariable*> (ipvi))->getIPNonLocalDamageHyperelastic(),
-                         (dynamic_cast <nonLocalDamageHyperelasticDG3DIPVariable*> (ipv1))->getIPNonLocalDamageHyperelastic(),
-             			 (dynamic_cast <nonLocalDamageHyperelasticDG3DIPVariable*> (ipv2))->getIPNonLocalDamageHyperelastic());
+  _nldPowerYieldHyperlaw->createIPState((dynamic_cast <nonLocalDamageHyperelasticDG3DIPVariable*> (ipvi))->getIPHyperViscoElastoPlasticNonLocalDamage(),
+                         (dynamic_cast <nonLocalDamageHyperelasticDG3DIPVariable*> (ipv1))->getIPHyperViscoElastoPlasticNonLocalDamage(),
+             			 (dynamic_cast <nonLocalDamageHyperelasticDG3DIPVariable*> (ipv2))->getIPHyperViscoElastoPlasticNonLocalDamage());
 
 }
 
@@ -293,7 +144,7 @@ void NonLocalDamagePowerYieldHyperDG3DMaterialLaw::createIPVariable(IPVariable*
   }
 
   ipv = new  nonLocalDamageHyperelasticDG3DIPVariable(*_nldPowerYieldHyperlaw,inter);
-  IPNonLocalDamageHyperelasic * ipvnl = static_cast <nonLocalDamageHyperelasticDG3DIPVariable*>(ipv)->getIPNonLocalDamageHyperelastic();
+  IPHyperViscoElastoPlasticNonLocalDamage * ipvnl = static_cast <nonLocalDamageHyperelasticDG3DIPVariable*>(ipv)->getIPHyperViscoElastoPlasticNonLocalDamage();
   _nldPowerYieldHyperlaw->createIPVariable(ipvnl,ele,nbFF_,GP,gpt);
 }
 
@@ -324,8 +175,8 @@ void NonLocalDamagePowerYieldHyperDG3DMaterialLaw::stress(IPVariable* ipv, const
   const STensor3& F0 = ipvprev->getConstRefToDeformationGradient();
 
   /* data for J2 law */
-  IPNonLocalDamageHyperelasic* q1 = ipvcur->getIPNonLocalDamageHyperelastic();
-  const IPNonLocalDamageHyperelasic* q0 = ipvprev->getIPNonLocalDamageHyperelastic();
+  IPHyperViscoElastoPlasticNonLocalDamage* q1 = ipvcur->getIPHyperViscoElastoPlasticNonLocalDamage();
+  const IPHyperViscoElastoPlasticNonLocalDamage* q0 = ipvprev->getIPHyperViscoElastoPlasticNonLocalDamage();
 
   /* compute stress */
   _nldPowerYieldHyperlaw->constitutive(F0,F1,ipvcur->getRefToFirstPiolaKirchhoffStress(),q0,q1,ipvcur->getRefToTangentModuli(),
@@ -355,7 +206,16 @@ NonLocalDamagePowerYieldHyperDG3DMaterialLawWithFailure::NonLocalDamagePowerYiel
                    const bool matrixbyPerturbation , const double pert):
                                                               dG3DMaterialLaw(num,rho,true)
 {
-  _nldPowerYieldHyperlaw= new mlawNonLocalDamagePowerYieldHyperWithFailure(num,E,nu,rho,comp,trac,_cLLaw1,_cLLaw2,_damLaw1,_damLaw2,tol,matrixbyPerturbation,pert);
+  _nldPowerYieldHyperlaw= new mlawNonLocalDamagePowerYieldHyperWithFailure(num,E,nu,rho,tol,matrixbyPerturbation,pert);
+  _nldPowerYieldHyperlaw->setCompressionHardening(comp);
+  _nldPowerYieldHyperlaw->setTractionHardening(trac);
+  
+  _nldPowerYieldHyperlaw->setCLengthLaw(_cLLaw1);
+  _nldPowerYieldHyperlaw->setCLengthLaw(_cLLaw2);
+  
+  _nldPowerYieldHyperlaw->setDamageLaw(_damLaw1);
+  _nldPowerYieldHyperlaw->setDamageLaw(_damLaw2);
+  
   fillElasticStiffness(E, nu, elasticStiffness);
 };
 
@@ -368,7 +228,18 @@ NonLocalDamagePowerYieldHyperDG3DMaterialLawWithFailure::NonLocalDamagePowerYiel
                    const bool matrixbyPerturbation , const double pert):
                                                               dG3DMaterialLaw(num,rho,true)
 {
-  _nldPowerYieldHyperlaw= new mlawNonLocalDamagePowerYieldHyperWithFailure(num,E,nu,rho,comp,trac,kin,_cLLaw1,_cLLaw2,_damLaw1,_damLaw2,tol,matrixbyPerturbation,pert);
+  _nldPowerYieldHyperlaw= new mlawNonLocalDamagePowerYieldHyperWithFailure(num,E,nu,rho,tol,matrixbyPerturbation,pert);
+  _nldPowerYieldHyperlaw->setCompressionHardening(comp);
+  _nldPowerYieldHyperlaw->setTractionHardening(trac);
+  _nldPowerYieldHyperlaw->setKinematicHardening(kin);
+  
+  _nldPowerYieldHyperlaw->setCLengthLaw(_cLLaw1);
+  _nldPowerYieldHyperlaw->setCLengthLaw(_cLLaw2);
+  
+  _nldPowerYieldHyperlaw->setDamageLaw(_damLaw1);
+  _nldPowerYieldHyperlaw->setDamageLaw(_damLaw2);
+  
+  
   fillElasticStiffness(E, nu, elasticStiffness);
 };
 
@@ -391,7 +262,7 @@ void NonLocalDamagePowerYieldHyperDG3DMaterialLawWithFailure::setPlasticPoissonR
   void NonLocalDamagePowerYieldHyperDG3DMaterialLawWithFailure::setNonAssociatedFlow(const bool flag){
     _nldPowerYieldHyperlaw->setNonAssociatedFlow(flag);
   };
-void NonLocalDamagePowerYieldHyperDG3DMaterialLawWithFailure::setOrderForLogExp(const int o){
+void NonLocalDamagePowerYieldHyperDG3DMaterialLawWithFailure::setStrainOrder(const int o){
   _nldPowerYieldHyperlaw->setStrainOrder(o);
 };
 
@@ -467,9 +338,9 @@ void NonLocalDamagePowerYieldHyperDG3DMaterialLawWithFailure::createIPState(IPSt
   IPVariable* ipv2 = new  nonLocalDamageHyperelasticDG3DIPVariableWithFailure(*_nldPowerYieldHyperlaw,inter);
   if(ips != NULL) delete ips;
   ips = new IP3State(state_,ipvi,ipv1,ipv2);
-  _nldPowerYieldHyperlaw->createIPState((dynamic_cast <nonLocalDamageHyperelasticDG3DIPVariableWithFailure*> (ipvi))->getIPNonLocalDamageHyperelasticWithFailure(),
-                         (dynamic_cast <nonLocalDamageHyperelasticDG3DIPVariableWithFailure*> (ipv1))->getIPNonLocalDamageHyperelasticWithFailure(),
-             			 (dynamic_cast <nonLocalDamageHyperelasticDG3DIPVariableWithFailure*> (ipv2))->getIPNonLocalDamageHyperelasticWithFailure());
+  _nldPowerYieldHyperlaw->createIPState((dynamic_cast <nonLocalDamageHyperelasticDG3DIPVariableWithFailure*> (ipvi))->getIPHyperViscoElastoPlasticMultipleNonLocalDamage(),
+                         (dynamic_cast <nonLocalDamageHyperelasticDG3DIPVariableWithFailure*> (ipv1))->getIPHyperViscoElastoPlasticMultipleNonLocalDamage(),
+             			 (dynamic_cast <nonLocalDamageHyperelasticDG3DIPVariableWithFailure*> (ipv2))->getIPHyperViscoElastoPlasticMultipleNonLocalDamage());
 
 }
 
@@ -483,7 +354,7 @@ void NonLocalDamagePowerYieldHyperDG3DMaterialLawWithFailure::createIPVariable(I
   }
 
   ipv = new  nonLocalDamageHyperelasticDG3DIPVariableWithFailure(*_nldPowerYieldHyperlaw,inter);
-  IPNonLocalDamageHyperelasicWithFailure * ipvnl = static_cast <nonLocalDamageHyperelasticDG3DIPVariableWithFailure*>(ipv)->getIPNonLocalDamageHyperelasticWithFailure();
+  IPHyperViscoElastoPlasticMultipleNonLocalDamage * ipvnl = static_cast <nonLocalDamageHyperelasticDG3DIPVariableWithFailure*>(ipv)->getIPHyperViscoElastoPlasticMultipleNonLocalDamage();
   _nldPowerYieldHyperlaw->createIPVariable(ipvnl,ele,nbFF_,GP,gpt);
 }
 
@@ -514,8 +385,8 @@ void NonLocalDamagePowerYieldHyperDG3DMaterialLawWithFailure::stress(IPVariable*
   const STensor3& F0 = ipvprev->getConstRefToDeformationGradient();
 
   /* data for J2 law */
-  IPNonLocalDamageHyperelasicWithFailure* q1 = ipvcur->getIPNonLocalDamageHyperelasticWithFailure();
-  const IPNonLocalDamageHyperelasicWithFailure* q0 = ipvprev->getIPNonLocalDamageHyperelasticWithFailure();
+  IPHyperViscoElastoPlasticMultipleNonLocalDamage* q1 = ipvcur->getIPHyperViscoElastoPlasticMultipleNonLocalDamage();
+  const IPHyperViscoElastoPlasticMultipleNonLocalDamage* q0 = ipvprev->getIPHyperViscoElastoPlasticMultipleNonLocalDamage();
 
   /* compute stress */
   _nldPowerYieldHyperlaw->constitutive(F0,F1,ipvcur->getRefToFirstPiolaKirchhoffStress(),q0,q1,ipvcur->getRefToTangentModuli(),
diff --git a/dG3D/src/NonLocalDamageHyperelasticDG3DMaterialLaw.h b/dG3D/src/NonLocalDamageHyperelasticDG3DMaterialLaw.h
index a44052d69bc528d196c885f6e3e87b1d849efe85..d279b8a4f662677b80a5277396efba978eef4fe7 100644
--- a/dG3D/src/NonLocalDamageHyperelasticDG3DMaterialLaw.h
+++ b/dG3D/src/NonLocalDamageHyperelasticDG3DMaterialLaw.h
@@ -1,5 +1,5 @@
 //
-// C++ Interface: NonLocalDamageQuadYieldHyperDG3DMaterialLaw
+// C++ Interface: NonLocalDamagePowerYieldHyperDG3DMaterialLaw
 //
 // Description:
 //
@@ -13,48 +13,6 @@
 #include "dG3DMaterialLaw.h"
 #include "mlawNonLocalDamageHyperelastic.h"
 
-class NonLocalDamageQuadYieldHyperDG3DMaterialLaw : public dG3DMaterialLaw
-{
-
- protected:
-  mlawNonLocalDamageQuadYieldHyper *_nldQuadYieldHyperlaw; // pointer to allow to choose between LLN style or Gmsh Style. The choice is performed by the constructor (2 constructors with != arguments)
-
- public:
-  NonLocalDamageQuadYieldHyperDG3DMaterialLaw(const int num,const double rho,
-                   double E,const double nu,const J2IsotropicHardening &comp,
-                   const J2IsotropicHardening &trac, const J2IsotropicHardening &shear,
-                   const CLengthLaw &_cLLaw,const DamageLaw &_damLaw,const double tol=1.e-6,
-                   const bool matrixbyPerturbation = false, const double pert = 1e-8);
-  void setYieldSurfaceType(const int type);
-  void setFlowPotentialType(const int type);
-  void nonAssociatedFlowRuleFactor(const double b2, const double b1);
-  void setOrderForLogExp(const int o);
-  void setViscosityEffect(const viscosityLaw& v, const double p);
-  void setViscoelasticMethod(const int method);
-  void setViscoElasticNumberOfElement(const int N);
-  void setViscoElasticData(const int i, const double Ei, const double taui);
-  void setViscoElasticData_Bulk(const int i, const double Ki, const double ki);
-  void setViscoElasticData_Shear(const int i, const double Gi, const double gi);
-  void setViscoElasticData(const std::string filename);
-
-#ifndef SWIG
-  virtual ~NonLocalDamageQuadYieldHyperDG3DMaterialLaw();
-  NonLocalDamageQuadYieldHyperDG3DMaterialLaw(const NonLocalDamageQuadYieldHyperDG3DMaterialLaw &source);
-	virtual materialLaw* clone() const {return new NonLocalDamageQuadYieldHyperDG3DMaterialLaw(*this);};
-  virtual bool withEnergyDissipation() const {return _nldQuadYieldHyperlaw->withEnergyDissipation();};
-  // set the time of _nldlaw
-  virtual void setTime(const double t,const double dtime);
-  virtual materialLaw::matname getType() const;
-  virtual bool withDamage() const {return _nldQuadYieldHyperlaw->withDamage();};
-  virtual void createIPState(IPStateBase* &ips,const bool* state_=NULL,const MElement *ele=NULL, const int nbFF_=0, const IntPt *GP=NULL, const int gpt = 0) const;
-  virtual void createIPVariable(IPVariable* &ipv,const MElement *ele, const int nbFF_, const IntPt *GP, const int gpt) const;
-  virtual void initLaws(const std::map<int,materialLaw*> &maplaw){}
-  virtual double soundSpeed() const;
-  virtual void stress(IPVariable*ipv, const IPVariable*ipvprev, const bool stiff=true, const bool checkfrac=true);
-	virtual void initialIPVariable(IPVariable* ipv) const;
-#endif
-};
-
 class NonLocalDamagePowerYieldHyperDG3DMaterialLaw : public dG3DMaterialLaw
 {
 
@@ -78,7 +36,7 @@ class NonLocalDamagePowerYieldHyperDG3DMaterialLaw : public dG3DMaterialLaw
   void nonAssociatedFlowRuleFactor(const double b);
   void setPlasticPoissonRatio(const double nup);
   void setNonAssociatedFlow(const bool flag);
-  void setOrderForLogExp(const int o);
+  void setStrainOrder(const int o);
   void setViscosityEffect(const viscosityLaw& v, const double p);
   void setViscoelasticMethod(const int method);
   void setViscoElasticNumberOfElement(const int N);
@@ -95,7 +53,6 @@ class NonLocalDamagePowerYieldHyperDG3DMaterialLaw : public dG3DMaterialLaw
   // set the time of _nldlaw
   virtual void setTime(const double t,const double dtime);
   virtual materialLaw::matname getType() const;
-  virtual bool withDamage() const {return _nldPowerYieldHyperlaw->withDamage();};
   virtual void createIPState(IPStateBase* &ips,const bool* state_=NULL,const MElement *ele=NULL, const int nbFF_=0, const IntPt *GP=NULL, const int gpt = 0) const;
   virtual void createIPVariable(IPVariable* &ipv,const MElement *ele, const int nbFF_, const IntPt *GP, const int gpt) const;
   virtual void initLaws(const std::map<int,materialLaw*> &maplaw){}
@@ -132,7 +89,7 @@ class NonLocalDamagePowerYieldHyperDG3DMaterialLawWithFailure: public dG3DMateri
   void nonAssociatedFlowRuleFactor(const double b);
   void setPlasticPoissonRatio(const double nup);
   void setNonAssociatedFlow(const bool flag);
-  void setOrderForLogExp(const int o);
+  void setStrainOrder(const int o);
   void setViscosityEffect(const viscosityLaw& v, const double p);
   void setViscoelasticMethod(const int method);
   void setViscoElasticNumberOfElement(const int N);
@@ -153,7 +110,6 @@ class NonLocalDamagePowerYieldHyperDG3DMaterialLawWithFailure: public dG3DMateri
   // set the time of _nldlaw
   virtual void setTime(const double t,const double dtime);
   virtual materialLaw::matname getType() const;
-  virtual bool withDamage() const {return _nldPowerYieldHyperlaw->withDamage();};
   virtual void createIPState(IPStateBase* &ips,const bool* state_=NULL,const MElement *ele=NULL, const int nbFF_=0, const IntPt *GP=NULL, const int gpt = 0) const;
   virtual void createIPVariable(IPVariable* &ipv,const MElement *ele, const int nbFF_, const IntPt *GP, const int gpt) const;
   virtual void initLaws(const std::map<int,materialLaw*> &maplaw){}
diff --git a/dG3D/src/dG3DCohesiveBandIPVariable.h b/dG3D/src/dG3DCohesiveBandIPVariable.h
index d9ad87cd49a30e3de765578e947e4c76650fa777..76bd1e78cd71402bae999928c3482f18b46306bb 100644
--- a/dG3D/src/dG3DCohesiveBandIPVariable.h
+++ b/dG3D/src/dG3DCohesiveBandIPVariable.h
@@ -105,6 +105,10 @@ class CohesiveBand3DIPVariable : public Cohesive3DIPVariable{
             // partial band F / partial grad jump
     virtual const STensor43& getConstRefToDInterfaceDeformationGradientDJumpGradient() const {return _dFband_dGradjump;};
     virtual STensor43& getRefToDInterfaceDeformationGradientDJumpGradient() {return _dFband_dGradjump;};
+    
+    virtual double defoEnergy() const {return 0;};
+    virtual double plasticEnergy() const {return 0;};
+    virtual double damageEnergy() const {return 0;};
 
     virtual double irreversibleEnergy() const {return _irreversibleEnergy;};
     virtual double& getRefToIrreversibleEnergy() {return _irreversibleEnergy;};
diff --git a/dG3D/src/dG3DCohesiveIPVariable.h b/dG3D/src/dG3DCohesiveIPVariable.h
index 3ffd72f296fb4de94f72452703ca7230914974a1..d68405bfcf00935b9accaed32e7721a4f53cd3b0 100644
--- a/dG3D/src/dG3DCohesiveIPVariable.h
+++ b/dG3D/src/dG3DCohesiveIPVariable.h
@@ -131,6 +131,9 @@ class Cohesive3DIPVariable : public IPVariableMechanics{
     virtual const STensor33& getConstRefToDInterfaceDeformationGradientDIncompatibleStrainVector() const {};
     virtual STensor33& getRefToDInterfaceDeformationGradientDIncompatibleStrainVector() {};
 		
+    virtual double defoEnergy() const = 0;
+    virtual double plasticEnergy() const = 0;
+    virtual double damageEnergy() const = 0;
 		//
 		virtual double irreversibleEnergy() const = 0;
 		virtual double& getRefToIrreversibleEnergy() = 0;
@@ -231,6 +234,9 @@ class BaseCohesive3DIPVariable : public Cohesive3DIPVariable{
   virtual const STensor3& getConstRefToBulkDeformationGradientAtFailureOnset() const {Msg::Error("BaseCohesive3DIPVariable::getConstRefToBulkDeformationGradientAtFailureOnset is not defined");};
   virtual STensor3& getRefToBulkDeformationGradientAtFailureOnset() {Msg::Error("BaseCohesive3DIPVariable::getRefToBulkDeformationGradientAtFailureOnset is not defined");};
 	
+  virtual double defoEnergy() const {return _qBilinear->defoEnergy();};
+  virtual double plasticEnergy() const {return _qBilinear->plasticEnergy();};
+  virtual double damageEnergy() const {return _qBilinear->damageEnergy();};
 	
 	virtual double irreversibleEnergy() const {return _qBilinear->irreversibleEnergy();};
 	virtual double& getRefToIrreversibleEnergy() {return _qBilinear->getRefToIrreversibleEnergy();};
@@ -534,6 +540,10 @@ class BulkFollowedCohesive3DIPVariable : public Cohesive3DIPVariable{
 		//
 		virtual const STensor43& getConstRefToDInterfaceDeformationGradientDDeformationGradient() const {return _dFinterfacedF;};
     virtual STensor43& getRefToDInterfaceDeformationGradientDDeformationGradient() {return _dFinterfacedF;};
+    
+    virtual double defoEnergy() const {return 0.;};
+    virtual double plasticEnergy() const {return 0.;};
+    virtual double damageEnergy() const {return 0.;};
 
 		virtual double irreversibleEnergy() const {return _irreversibleEnergy;};
 		virtual double& getRefToIrreversibleEnergy() {return _irreversibleEnergy;};
diff --git a/dG3D/src/dG3DDomain.cpp b/dG3D/src/dG3DDomain.cpp
index 03fa6b582b10263a6839339de6cc37983a1022f8..1eb99b642252c512617909f34d44d8cd111e7eca 100644
--- a/dG3D/src/dG3DDomain.cpp
+++ b/dG3D/src/dG3DDomain.cpp
@@ -38,7 +38,7 @@ dG3DDomain::dG3DDomain (const int tag,const int phys, const int ws, const int ln
                                                             _beta1(10.),_sts(1.), _isHighOrder(false), _interQuad(NULL),
                                                             _space(NULL), _dim(dim),
                                                             _gqt(Gauss), _gaussorderbulk(-1), _gaussorderbound(-1), _evalStiff(false),
-                                                            _bulkDamageBlockMethod(1),_subSteppingMethod(0),
+                                                            _bulkDamageBlockMethod(-1),_subSteppingMethod(0),
                                                             _forceInterfaceElementBroken(false),_failureIPRatio(1.), _EqMultiFieldFactor(1.),
 																														_imposeCrackFlag(false)
 {
@@ -453,33 +453,37 @@ void dG3DDomain::createTerms(unknownField *uf,IPField*ip)
 	btermTangent = new dG3DHomogenizedTangent(this,ip);
 
 	// path following term
-	if (getMacroSolver()->getPathFollowingLocation() == nonLinearMechSolver::INTERFACE){
-		scalarTermPF = new nonLinearScalarTermVoid();
-		linearTermPF = new nonLinearTermVoid();
-	}
-	else{
-		if (this->getMacroSolver()->getPathFollowingLocalIncrementType() == nonLinearMechSolver::DISSIPATION_ENERGY){
-			scalarTermPF = new dG3DDissipationPathFollowingBulkScalarTerm(this,ip);
-			linearTermPF = new dG3DDissipationPathFollowingBulkLinearTerm(this,ip);
-		}
-		else if (this->getMacroSolver()->getPathFollowingLocalIncrementType() == nonLinearMechSolver::DEFO_ENERGY){
-			scalarTermPF = new dG3DElasticPathFollowingBulkScalarTerm(this,ip);
-			linearTermPF = new dG3DElasticPathFollowingBulkLinearTerm(this,ip);
-		}
-		else{
-			Msg::Fatal("this->getMacroSolver()->getPathFollowingLocalIncrementType() is not defined %d",this->getMacroSolver()->getPathFollowingLocalIncrementType());
-		}
-		
-	}
-	
-	if (this->IsMultipleFieldFormulation()){
-		scalarTermPFBound = new twoFieldDG3DDissipationPathFollowingBoundScalarTerm(this,ip);
-		linearTermPFBound = new twoFieldDG3DDissipationPathFollowingBoundLinearTerm(this,ip);
-	}
-	else{
-		scalarTermPFBound = new dG3DDissipationPathFollowingBoundScalarTerm(this,ip);
-		linearTermPFBound = new dG3DDissipationPathFollowingBoundLinearTerm(this,ip);
-	}
+  if (this->getMacroSolver()->withPathFollowing()){
+    if (getMacroSolver()->getPathFollowingLocation() == nonLinearMechSolver::INTERFACE){
+      scalarTermPF = new nonLinearScalarTermVoid();
+      linearTermPF = new nonLinearTermVoid();
+    }
+    else{
+      scalarTermPF = new dG3DDissipationPathFollowingBulkScalarTerm(this,ip);
+      linearTermPF = new dG3DDissipationPathFollowingBulkLinearTerm(this,ip);
+    }
+    
+    if (getMacroSolver()->getPathFollowingLocation() == nonLinearMechSolver::BULK){
+      scalarTermPFBound = new nonLinearScalarTermVoid();
+      linearTermPFBound = new nonLinearTermVoid();
+    }
+    else{
+      if (this->IsMultipleFieldFormulation()){
+        scalarTermPFBound = new twoFieldDG3DDissipationPathFollowingBoundScalarTerm(this,ip);
+        linearTermPFBound = new twoFieldDG3DDissipationPathFollowingBoundLinearTerm(this,ip);
+      }
+      else{
+        scalarTermPFBound = new dG3DDissipationPathFollowingBoundScalarTerm(this,ip);
+        linearTermPFBound = new dG3DDissipationPathFollowingBoundLinearTerm(this,ip);
+      }      
+    }
+  }
+  else{
+    scalarTermPF = new nonLinearScalarTermVoid();;
+    linearTermPF = new nonLinearTermVoid();;
+    scalarTermPFBound = new nonLinearScalarTermVoid();;
+    linearTermPFBound = new nonLinearTermVoid();
+  }
 }
 
 void dG3DDomain::initializeTerms(unknownField *uf,IPField*ip)
@@ -1345,7 +1349,7 @@ int dG3DDomain::getStressDimension() const{
 	// get data in order to send to other procs
 	// only new block and broken ips are filled in the group
 	if (mlawminus->isNumeric() or mlawplus->isNumeric()){
-		this->clearBlockDamageIPs();
+		this->clearBlockDissipationIPs();
 		this->clearBrokenIPs();
 	}
 	#endif //MPI
@@ -1499,7 +1503,7 @@ int dG3DDomain::getStressDimension() const{
 					// Block damage in bulk in Plus and Minus bulk elements when using
 					// bulk material with damage if needed
 					if (blockBulkDamage){
-						if (bulkLawMinus->withDamage())
+						if (bulkLawMinus->withEnergyDissipation())
 						{
 							// Get bulk element and check if it exists
 							const partDomain* dom = this->getMinusDomain();
@@ -1515,17 +1519,17 @@ int dG3DDomain::getStressDimension() const{
 									IPStateBase* ips_bulk = (*vips_bulk)[k];
 									dG3DIPVariableBase *ipv_bulk = static_cast<dG3DIPVariableBase*>(ips_bulk->getState(IPStateBase::current));
 									const dG3DIPVariableBase* ipv_bulkPrev = static_cast<const dG3DIPVariableBase*>(ips_bulk->getState(IPStateBase::previous));
-									if (ipv_bulkPrev->damageIsBlocked()){
-										ipv_bulk->blockDamage(true);
+									if (ipv_bulkPrev->dissipationIsBlocked()){
+										ipv_bulk->blockDissipation(true);
 									}
 									else{
-										if (!ipv_bulk->damageIsBlocked()){
+										if (!ipv_bulk->dissipationIsBlocked()){
 											ipv_bulk->setBulkCriticalDamage(ipv_bulk->getBulkCriticalDamage());
-											ipv_bulk->blockDamage(true);
+											ipv_bulk->blockDissipation(true);
 											
 											#if defined(HAVE_MPI)
 											if (bulkLawMinus->isNumeric()){
-												this->blockDamageIP(numericalMaterialBase::createTypeWithTwoInts(em->getNum(),k));
+												this->blockDissipationIP(numericalMaterialBase::createTypeWithTwoInts(em->getNum(),k));
 											}
 											#endif //HAVE_MPI
 										}
@@ -1534,7 +1538,7 @@ int dG3DDomain::getStressDimension() const{
 							}
 						}
 
-						if (bulkLawPlus->withDamage())
+						if (bulkLawPlus->withEnergyDissipation())
 						{
 							const partDomain* dom = this->getPlusDomain();
 							MElement* ep = ie->getElem(1);
@@ -1549,17 +1553,17 @@ int dG3DDomain::getStressDimension() const{
 									IPStateBase* ips_bulk = (*vips_bulk)[k];
 									dG3DIPVariableBase *ipv_bulk = static_cast<dG3DIPVariableBase*>(ips_bulk->getState(IPStateBase::current));
 									const dG3DIPVariableBase* ipv_bulkPrev = static_cast<const dG3DIPVariableBase*>(ips_bulk->getState(IPStateBase::previous));
-									if (ipv_bulkPrev->damageIsBlocked()){
-										ipv_bulk->blockDamage(true);
+									if (ipv_bulkPrev->dissipationIsBlocked()){
+										ipv_bulk->blockDissipation(true);
 									}
 									else{
-										if (!ipv_bulk->damageIsBlocked()){
+										if (!ipv_bulk->dissipationIsBlocked()){
 											ipv_bulk->setBulkCriticalDamage(ipv_bulk->getBulkCriticalDamage());
-											ipv_bulk->blockDamage(true);
+											ipv_bulk->blockDissipation(true);
 											
 											#if defined(HAVE_MPI)
 											if (bulkLawPlus->isNumeric()){
-												this->blockDamageIP(numericalMaterialBase::createTypeWithTwoInts(ep->getNum(),k));
+												this->blockDissipationIP(numericalMaterialBase::createTypeWithTwoInts(ep->getNum(),k));
 											}
 											#endif //HAVE_MPI
 										}
@@ -1620,7 +1624,7 @@ int dG3DDomain::getStressDimension() const{
 					IPStateBase* ips_bulk = (*vips_bulk)[k];
 					dG3DIPVariableBase *ipv_bulk = static_cast<dG3DIPVariableBase*>(ips_bulk->getState(IPStateBase::current));
 
-					if (ipv_bulk->damageIsBlocked()){
+					if (ipv_bulk->dissipationIsBlocked()){
 						numBlockedIP++;
 						numFailureIP++;
 					}
@@ -1645,10 +1649,10 @@ int dG3DDomain::getStressDimension() const{
 					for(int k=0;k<npts_bulk;k++){
 						IPStateBase* ips_bulk = (*vips_bulk)[k];
 						dG3DIPVariableBase *ipv_bulk = static_cast<dG3DIPVariableBase*>(ips_bulk->getState(IPStateBase::current));
-						if (!ipv_bulk->damageIsBlocked()){
-							ipv_bulk->blockDamage(true);
+						if (!ipv_bulk->dissipationIsBlocked()){
+							ipv_bulk->blockDissipation(true);
 							#if defined(HAVE_MPI)
-							this->blockDamageIP(numericalMaterialBase::createTypeWithTwoInts(ele->getNum(),k));
+							this->blockDissipationIP(numericalMaterialBase::createTypeWithTwoInts(ele->getNum(),k));
 							#endif 
 						}
 					}
@@ -3376,14 +3380,27 @@ void interDomainBetween3D::createTerms(unknownField *uf,IPField*ip)
 	
 	scalarTermPF = new nonLinearScalarTermVoid();
 	linearTermPF = new nonLinearTermVoid();
-	if (this->IsMultipleFieldFormulation()){
-		scalarTermPFBound = new twoFieldDG3DDissipationPathFollowingBoundScalarTerm(this,ip);
-		linearTermPFBound = new twoFieldDG3DDissipationPathFollowingBoundLinearTerm(this,ip);
-	}
-	else{
-		scalarTermPFBound = new dG3DDissipationPathFollowingBoundScalarTerm(this,ip);
-		linearTermPFBound = new dG3DDissipationPathFollowingBoundLinearTerm(this,ip);
-	}
+  if (this->getMacroSolver()->withPathFollowing()){
+    if (this->getMacroSolver()->getPathFollowingLocation() == nonLinearMechSolver::BULK){
+      scalarTermPFBound = new nonLinearScalarTermVoid();
+      linearTermPFBound = new nonLinearTermVoid();
+    }
+    else{
+      if (this->IsMultipleFieldFormulation()){
+        scalarTermPFBound = new twoFieldDG3DDissipationPathFollowingBoundScalarTerm(this,ip);
+        linearTermPFBound = new twoFieldDG3DDissipationPathFollowingBoundLinearTerm(this,ip);
+      }
+      else{
+        scalarTermPFBound = new dG3DDissipationPathFollowingBoundScalarTerm(this,ip);
+        linearTermPFBound = new dG3DDissipationPathFollowingBoundLinearTerm(this,ip);
+      }      
+    }
+  }
+  else{
+    scalarTermPFBound = new nonLinearScalarTermVoid();
+    linearTermPFBound = new nonLinearTermVoid();
+  }
+	
 
 }
 void interDomainBetween3D::initializeTerms(unknownField *uf,IPField*ip)
@@ -3755,6 +3772,13 @@ nonLocalDamageDG3DDomain::nonLocalDamageDG3DDomain(const nonLocalDamageDG3DDomai
      _nonLocalEqRatio = source._nonLocalEqRatio;
 }
 
+void nonLocalDamageDG3DDomain::setNewIdForComp(const int comp, const int newId){
+  g3DLagrangeFunctionSpace* gSpace = dynamic_cast<g3DLagrangeFunctionSpace*>(_space);
+  if (gSpace){
+    gSpace->setNewIdForComp(comp,newId);
+  };
+};
+
 void nonLocalDamageDG3DDomain::createTerms(unknownField *uf,IPField*ip)
 {
   FunctionSpace<double>* dgspace = static_cast<FunctionSpace<double>*>(_space);
@@ -3786,20 +3810,31 @@ void nonLocalDamageDG3DDomain::createTerms(unknownField *uf,IPField*ip)
 	btermTangent = new dG3DNonLocalHomogenizedTangent(this,ip);
 	
 	// path following term
-	if (this->getMacroSolver()->getPathFollowingLocalIncrementType() == nonLinearMechSolver::DISSIPATION_ENERGY){
-		scalarTermPF = new dG3DNonLocalDissipationPathFollowingBulkScalarTerm(this,ip);
-		linearTermPF = new dG3DNonLocalDissipationPathFollowingBulkLinearTerm(this,ip);
-	}
-	else if (this->getMacroSolver()->getPathFollowingLocalIncrementType() == nonLinearMechSolver::DEFO_ENERGY){
-		scalarTermPF = new dG3DElasticPathFollowingBulkScalarTerm(this,ip);
-		linearTermPF = new dG3DElasticPathFollowingBulkLinearTerm(this,ip);
-	}
-	else{
-		Msg::Fatal("this->getMacroSolver()->getPathFollowingLocalIncrementType() is not defined %d",this->getMacroSolver()->getPathFollowingLocalIncrementType());
-	}
-	
-	scalarTermPFBound = new dG3DDissipationPathFollowingBoundScalarTerm(this,ip);
-	linearTermPFBound = new dG3DDissipationPathFollowingBoundLinearTerm(this,ip);
+  if (this->getMacroSolver()->withPathFollowing()){
+    if (this->getMacroSolver()->getPathFollowingLocation() == nonLinearMechSolver::INTERFACE){
+      scalarTermPF = new nonLinearScalarTermVoid();;
+      linearTermPF = new nonLinearTermVoid();;
+    }
+    else{
+      scalarTermPF = new dG3DNonLocalDissipationPathFollowingBulkScalarTerm(this,ip);
+      linearTermPF = new dG3DNonLocalDissipationPathFollowingBulkLinearTerm(this,ip);
+    }
+    
+    if (this->getMacroSolver()->getPathFollowingLocation() == nonLinearMechSolver::BULK){
+      scalarTermPFBound = new nonLinearScalarTermVoid();;
+      linearTermPFBound = new nonLinearTermVoid();;
+    }
+    else{
+      scalarTermPFBound = new dG3DDissipationPathFollowingBoundScalarTerm(this,ip);
+      linearTermPFBound = new dG3DDissipationPathFollowingBoundLinearTerm(this,ip);    
+    }    
+  }
+  else{
+    scalarTermPF = new nonLinearScalarTermVoid();;
+    linearTermPF = new nonLinearTermVoid();;
+    scalarTermPFBound = new nonLinearScalarTermVoid();;
+    linearTermPFBound = new nonLinearTermVoid();;
+  }
 }
 
 LinearTermBase<double>* nonLocalDamageDG3DDomain::createNeumannTerm(FunctionSpace<double> *spneu,  const groupOfElements* g,
@@ -4094,8 +4129,22 @@ void nonLocalInterDomainBetween3D::createTerms(unknownField *uf,IPField*ip)
 
 	scalarTermPF = new nonLinearScalarTermVoid();
 	linearTermPF = new nonLinearTermVoid();
-	scalarTermPFBound = new dG3DDissipationPathFollowingBoundScalarTerm(this,ip);
-	linearTermPFBound = new dG3DDissipationPathFollowingBoundLinearTerm(this,ip);
+	
+  if (this->getMacroSolver()->withPathFollowing()){
+    if (this->getMacroSolver()->getPathFollowingLocation() == nonLinearMechSolver::BULK){
+      scalarTermPFBound = new nonLinearScalarTermVoid();;
+      linearTermPFBound = new nonLinearTermVoid();;
+    }
+    else{
+      scalarTermPFBound = new dG3DDissipationPathFollowingBoundScalarTerm(this,ip);
+      linearTermPFBound = new dG3DDissipationPathFollowingBoundLinearTerm(this,ip);    
+    }    
+  }
+  else{
+    scalarTermPFBound = new nonLinearScalarTermVoid();;
+    linearTermPFBound = new nonLinearTermVoid();;
+  }
+  
 }
 void nonLocalInterDomainBetween3D::initializeTerms(unknownField *uf,IPField*ip)
 {
diff --git a/dG3D/src/dG3DDomain.h b/dG3D/src/dG3DDomain.h
index 69636b69401e9d4dad05b4cac39a3363ca1902e9..9576825ce4386f6420b456f9e64bc31dd25447b0 100644
--- a/dG3D/src/dG3DDomain.h
+++ b/dG3D/src/dG3DDomain.h
@@ -175,6 +175,7 @@ class nonLocalDamageDG3DDomain : public dG3DDomain{
      _nonLocalBeta = b2;
      _continuity = continuity;
   }
+  void setNewIdForComp(const int comp, const int newId);
 #ifndef SWIG
 	nonLocalDamageDG3DDomain(const nonLocalDamageDG3DDomain &source);
   virtual ~nonLocalDamageDG3DDomain(){}
diff --git a/dG3D/src/dG3DEnhancedStrainIPVariable.h b/dG3D/src/dG3DEnhancedStrainIPVariable.h
index 7f45c0e71b683bc7c12543d31ddd3bdacc928a20..8241a400e6fae852144bde9514c4797e8be3a8df 100644
--- a/dG3D/src/dG3DEnhancedStrainIPVariable.h
+++ b/dG3D/src/dG3DEnhancedStrainIPVariable.h
@@ -133,15 +133,16 @@ class dG3DEnhancedStrainIPVariable : public IPVariable2Enhanced<dG3DIPVariableBa
 		virtual double vonMises() const{return _ipvbulk->vonMises();}
 		virtual double defoEnergy() const{return _ipvbulk->defoEnergy();}
 		virtual double plasticEnergy() const{return _ipvbulk->plasticEnergy();}
+    virtual double damageEnergy() const {return _ipvbulk->damageEnergy();};
 		virtual int fractureEnergy(double* arrayEnergy) const{return _ipvbulk->fractureEnergy(arrayEnergy);}
 
 		virtual void getCauchyStress(STensor3 &cauchy) const { return _ipvbulk->getCauchyStress(cauchy); }
 		virtual double getJ() const { return _ipvbulk->getJ(); };
 
-		virtual bool isActiveDamage() const {return _ipvbulk->isActiveDamage();};
+		virtual bool dissipationIsActive() const {return _ipvbulk->dissipationIsActive();};
 
-		virtual void blockDamage(const bool fl){_ipvbulk->blockDamage(fl);};
-		virtual bool damageIsBlocked() const {return _ipvbulk->damageIsBlocked();};
+		virtual void blockDissipation(const bool fl){_ipvbulk->blockDissipation(fl);};
+		virtual bool dissipationIsBlocked() const {return _ipvbulk->dissipationIsBlocked();};
 
 		virtual const STensor3 &getConstRefToDeformationGradient() const {return _ipvbulk->getConstRefToDeformationGradient();}
 		virtual STensor3 &getRefToDeformationGradient() {return _ipvbulk->getRefToDeformationGradient();}
diff --git a/dG3D/src/dG3DEnhancedStrainMaterialLaw.cpp b/dG3D/src/dG3DEnhancedStrainMaterialLaw.cpp
index 977af14210d8cdea4652d094cb22c6fe39526dd0..f5f7a97f9fed2eadfa761b70d5d7276b7124265f 100644
--- a/dG3D/src/dG3DEnhancedStrainMaterialLaw.cpp
+++ b/dG3D/src/dG3DEnhancedStrainMaterialLaw.cpp
@@ -213,7 +213,6 @@ void enhancedStraindG3DMultiscaleMaterialLaw::stress(IPVariable* ipv, const IPVa
 		mipv->getRefToDefoEnergy() = solver->getHomogenizationState(IPStateBase::current)->getDeformationEnergy();
 		mipv->getRefToPlasticEnergy() = solver->getHomogenizationState(IPStateBase::current)->getPlasticEnergy();
 		eipv->getRefToIrreversibleEnergy() = solver->getHomogenizationState(IPStateBase::current)->getIrreversibleEnergy();
-		mipv->getRefToFailureDamage() = solver->getHomogenizationState(IPStateBase::current)->getActiveDamage(); 
 	
 				
 		eipv->getRefToLocalEnhancedDeformationGradient() *= 0.;
@@ -229,7 +228,7 @@ void enhancedStraindG3DMultiscaleMaterialLaw::stress(IPVariable* ipv, const IPVa
 		};
 	}
 	else{
-		double beta = solver->getHomogenizationState(IPStateBase::previous)->getActiveDamageVolume()/solver->getRVEVolume();
+		double beta = solver->getHomogenizationState(IPStateBase::previous)->getActiveDissipationVolume()/solver->getRVEVolume();
 		
 		//printf("computing in failure state beta =  %e betE = %e  rve vomume = %e \n",beta,betaE,solver->getRVEVolume());
 		
@@ -264,9 +263,8 @@ void enhancedStraindG3DMultiscaleMaterialLaw::stress(IPVariable* ipv, const IPVa
 		mipv->getRefToDefoEnergy() = solver->getHomogenizationState(IPStateBase::current)->getDeformationEnergy();
 		mipv->getRefToPlasticEnergy() = solver->getHomogenizationState(IPStateBase::current)->getPlasticEnergy();
 		eipv->getRefToIrreversibleEnergy() = solver->getHomogenizationState(IPStateBase::current)->getIrreversibleEnergy();
-		mipv->getRefToFailureDamage() = solver->getHomogenizationState(IPStateBase::current)->getActiveDamage(); 
 		
-		eipv->getRefToLocalEnhancedDeformationGradient() = solver->getHomogenizationState(IPStateBase::current)->getHomogenizedActiveDamageDeformationGradient();
+		eipv->getRefToLocalEnhancedDeformationGradient() = solver->getHomogenizationState(IPStateBase::current)->getHomogenizedActiveDissipationDeformationGradient();
 		eipv->getRefToLocalEnhancedDeformationGradient() -= solver->getFdamOnset();
 		if (stiff){
 			eipv->getRefToTangentModuli() = solver->getHomogenizationState(IPStateBase::current)->getHomogenizedTangentOperator_F_F();
@@ -281,10 +279,10 @@ void enhancedStraindG3DMultiscaleMaterialLaw::stress(IPVariable* ipv, const IPVa
 			eipv->getRefToEnhancedTangentModuli() = solver->getHomogenizationState(IPStateBase::current)->getHomogenizedTangentOperator_F_F();
 			eipv->getRefToEnhancedTangentModuli() *= factEnhanceF;
 			
-			eipv->getRefToDLocalEnhancedDeformationGradientDDeformationGradient() = solver->getHomogenizationState(IPStateBase::current)->getHomogenizedTangentOperator_ActiveDamageDeformationGradient_F();
+			eipv->getRefToDLocalEnhancedDeformationGradientDDeformationGradient() = solver->getHomogenizationState(IPStateBase::current)->getHomogenizedTangentOperator_ActiveDissipationDeformationGradient_F();
 			eipv->getRefToDLocalEnhancedDeformationGradientDDeformationGradient() *= factF;
 			
-			eipv->getRefToDLocalEnhancedDeformationGradientDEnhancedDeformationGradient() =solver->getHomogenizationState(IPStateBase::current)->getHomogenizedTangentOperator_ActiveDamageDeformationGradient_F();
+			eipv->getRefToDLocalEnhancedDeformationGradientDEnhancedDeformationGradient() =solver->getHomogenizationState(IPStateBase::current)->getHomogenizedTangentOperator_ActiveDissipationDeformationGradient_F();
 			eipv->getRefToDLocalEnhancedDeformationGradientDEnhancedDeformationGradient() *= factEnhanceF;
 		};
 	}
diff --git a/dG3D/src/dG3DEnhancedStrainMaterialLaw.h b/dG3D/src/dG3DEnhancedStrainMaterialLaw.h
index e266fbdacf7cb7a6c16a438d36779493087b691a..aff7ee33a82a0d2642fa231b2de31a653d0bfbfc 100644
--- a/dG3D/src/dG3DEnhancedStrainMaterialLaw.h
+++ b/dG3D/src/dG3DEnhancedStrainMaterialLaw.h
@@ -56,14 +56,6 @@ class enhancedStraindG3DMultiscaleMaterialLaw : public dG3DMaterialLaw, public n
                             : dG3DMaterialLaw(src),numericalMaterial(src),_RVELength(src._RVELength),_surfaceReductionRatio(src._surfaceReductionRatio){};
     virtual ~enhancedStraindG3DMultiscaleMaterialLaw(){};
     virtual matname getType() const{return materialLaw::numeric;};
-    virtual bool withDamage() const  {
-      for (int i=0; i< _allMaterialLaw.size(); i++){
-        if (_allMaterialLaw[i]->withDamage()){
-          return true;
-        }
-      }
-      return false;
-    }
     virtual void createIPState(IPStateBase* &ips,const bool* state_=NULL,const MElement *ele=NULL, const int nbFF_=0, const IntPt *GP=NULL, const int gpt = 0) const;
 
     virtual void createIPState(const bool isSolve, IPStateBase* &ips,const bool* state =NULL,
diff --git a/dG3D/src/dG3DFunctionSpace.h b/dG3D/src/dG3DFunctionSpace.h
index ef74c686454bef0a440b95a261b3031131e365f1..98b8019ee747b874f78727998ae53cc061577bcc 100644
--- a/dG3D/src/dG3DFunctionSpace.h
+++ b/dG3D/src/dG3DFunctionSpace.h
@@ -40,18 +40,42 @@ class g3DLagrangeFunctionSpace : public ThreeDLagrangeFunctionSpace{
     #if defined(HAVE_MPI) // small duplication to avoid multiple if in a loop
     if( (ele->getPartition() != 0) and (ele->getPartition() != Msg::GetCommRank() +1))
     {
-      for (int j=0;j<_ncomp;++j)
-        for (int i=0;i<nk;++i)
-          keys.push_back(Dof(ele->getVertex(i)->getNum(),-dG3DDof3IntType::createTypeWithThreeInts(comp[j],_ifield,ele->getPartition())));
+      for (int j=0;j<_ncomp;++j){
+        std::map<int,int>::const_iterator itComp = _compWithNewType.find(comp[j]);
+        if (itComp ==_compWithNewType.end()){
+          for (int i=0;i<nk;++i){
+            keys.push_back(Dof(ele->getVertex(i)->getNum(),-dG3DDof3IntType::createTypeWithThreeInts(comp[j],_ifield,ele->getPartition())));
+          }          
+        }
+        else{
+          for (int i=0;i<nk;++i){
+            keys.push_back(Dof(ele->getVertex(i)->getNum(),-dG3DDof3IntType::createTypeWithThreeInts(comp[j],itComp->second,ele->getPartition())));
+          }          
+        }
+          
+      }
     }
     else
     #endif // HAVE_MPI
     {
-      for (int j=0;j<_ncomp;++j)
-        for (int i=0;i<nk;++i)
-          keys.push_back(Dof(ele->getVertex(i)->getNum(),dG3DDof3IntType::createTypeWithThreeInts(comp[j],_ifield,ele->getPartition())));
+      for (int j=0;j<_ncomp;++j){
+        std::map<int,int>::const_iterator itComp = _compWithNewType.find(comp[j]);
+        if (itComp ==_compWithNewType.end()){
+          for (int i=0;i<nk;++i){
+            keys.push_back(Dof(ele->getVertex(i)->getNum(),dG3DDof3IntType::createTypeWithThreeInts(comp[j],_ifield,ele->getPartition())));
+          }
+        }
+        else{
+          for (int i=0;i<nk;++i){
+            keys.push_back(Dof(ele->getVertex(i)->getNum(),dG3DDof3IntType::createTypeWithThreeInts(comp[j],itComp->second,ele->getPartition())));
+          }
+        }
+      }
     }
   }
+  
+  std::map<int,int> _compWithNewType;
+  
  public:
   // warning MPI used ??
   //virtual void getKeys(MVertex *ver, std::vector<Dof> &keys){
@@ -59,12 +83,23 @@ class g3DLagrangeFunctionSpace : public ThreeDLagrangeFunctionSpace{
   //    keys.push_back(Dof(ver->getNum(),dG3DDof3IntType::createTypeWithThreeInts(comp[j],_ifield)));
   //}
 	virtual FunctionSpaceBase* clone(const int id) const{
-		if (_ncomp ==1) return new g3DLagrangeFunctionSpace(id,_ncomp,comp[0]);
-		else if (_ncomp == 2) return new g3DLagrangeFunctionSpace(id,_ncomp,comp[0],comp[1]);
-		else if (_ncomp == 3) return new g3DLagrangeFunctionSpace(id,_ncomp,comp[0],comp[1],comp[2]);
-		else if (_ncomp == 4) return new g3DLagrangeFunctionSpace(id,_ncomp,comp[0],comp[1],comp[2],comp[3]);
-		else return new g3DLagrangeFunctionSpace(id,_ncomp);
+    g3DLagrangeFunctionSpace* sp = NULL;
+		if (_ncomp ==1) sp = new g3DLagrangeFunctionSpace(id,_ncomp,comp[0]);
+		else if (_ncomp == 2) sp = new g3DLagrangeFunctionSpace(id,_ncomp,comp[0],comp[1]);
+		else if (_ncomp == 3) sp = new g3DLagrangeFunctionSpace(id,_ncomp,comp[0],comp[1],comp[2]);
+		else if (_ncomp == 4) sp = new g3DLagrangeFunctionSpace(id,_ncomp,comp[0],comp[1],comp[2],comp[3]);
+		else sp = new g3DLagrangeFunctionSpace(id,_ncomp);
+    for (std::map<int,int>::const_iterator it =_compWithNewType.begin(); it != _compWithNewType.end(); it++){
+      sp->setNewIdForComp(it->first,it->second);
+    }
+    return dynamic_cast<FunctionSpaceBase*>(sp);
 	}
+  void setNewIdForComp(const int comp, const int type){
+    _compWithNewType[comp] = type;
+  };
+   void setNewIdForComp(const std::map<int,int>& compType){
+    _compWithNewType = compType;
+  };
 };
 
 class dG3DLagrangeFunctionSpace : public ThreeDLagrangeFunctionSpace{
diff --git a/dG3D/src/dG3DHomogenizedTangentTerms.cpp b/dG3D/src/dG3DHomogenizedTangentTerms.cpp
index dcc7ee5bb10dc3ea6147624675e61c15b52476f2..b6804fc335fae8f5bbae11cdac897f8464e84ed5 100644
--- a/dG3D/src/dG3DHomogenizedTangentTerms.cpp
+++ b/dG3D/src/dG3DHomogenizedTangentTerms.cpp
@@ -37,14 +37,14 @@ void dG3DHomogenizedTangent::get(MElement *ele,int npts,IntPt *GP,fullMatrix<dou
 		const STensor43& L = ipv->getConstRefToTangentModuli();
 		
 		bool estimatedP = true;
-    if (_ipf->getNumOfActiveDamageIPs() > 0){
+    if (_ipf->getNumOfActiveDissipationIPs() > 0){
 		  if (_dom->getMacroSolver()->getLocationForStressExtraction() == nonLinearMechSolver::WHOLE_VOLUME){
 			  estimatedP = true;
 		  }
 		  else if (_dom->getMacroSolver()->getLocationForStressExtraction()== nonLinearMechSolver::ACTIVE_DAMAGE_VOLUME){
         if (_dom->getMacroSolver()->getHomogenizationState(IPStateBase::previous)->getBrokenFlag()){
-          const dG3DIPVariableBase *ipvprev = static_cast<const dG3DIPVariableBase*>(ips->getState(IPStateBase::previousActiveDamage));
-				  if (ipvprev->isActiveDamage()){
+          const dG3DIPVariableBase *ipvprev = static_cast<const dG3DIPVariableBase*>(ips->getState(IPStateBase::activeDissipation));
+				  if (ipvprev->dissipationIsActive()){
 					  estimatedP = true;
 				  }
 				  else{
@@ -121,14 +121,14 @@ void dG3DNonLocalHomogenizedTangent::get(MElement *ele,int npts,IntPt *GP,fullMa
 
 
     bool estimatedP = true;
-    if (_ipf->getNumOfActiveDamageIPs() > 0){
+    if (_ipf->getNumOfActiveDissipationIPs() > 0){
 		  if (_dom->getMacroSolver()->getLocationForStressExtraction() == nonLinearMechSolver::WHOLE_VOLUME){
 			  estimatedP = true;
 		  }
 		  else if (_dom->getMacroSolver()->getLocationForStressExtraction()== nonLinearMechSolver::ACTIVE_DAMAGE_VOLUME){
         if (_dom->getMacroSolver()->getHomogenizationState(IPStateBase::previous)->getBrokenFlag()){
-          const nonLocalDamageDG3DIPVariableBase *ipvprev = static_cast<const nonLocalDamageDG3DIPVariableBase*>(ips->getState(IPStateBase::previousActiveDamage));
-          if (ipvprev->isActiveDamage()){
+          const nonLocalDamageDG3DIPVariableBase *ipvprev = static_cast<const nonLocalDamageDG3DIPVariableBase*>(ips->getState(IPStateBase::activeDissipation));
+          if (ipvprev->dissipationIsActive()){
 					  estimatedP = true;
 				  }
 				  else{
@@ -170,10 +170,10 @@ void dG3DNonLocalHomogenizedTangent::get(MElement *ele,int npts,IntPt *GP,fullMa
 		}
 		
 	
-		if (_dom->isExtractCohesiveLawFromMicroDamage() and (_ipf->getNumOfActiveDamageIPs() > 0)) {
-      const nonLocalDamageDG3DIPVariableBase *ipvprev = static_cast<const nonLocalDamageDG3DIPVariableBase*>(ips->getState(IPStateBase::previousActiveDamage));
+		if (_dom->isExtractCohesiveLawFromMicroDamage() and (_ipf->getNumOfActiveDissipationIPs() > 0)) {
+      const nonLocalDamageDG3DIPVariableBase *ipvprev = static_cast<const nonLocalDamageDG3DIPVariableBase*>(ips->getState(IPStateBase::activeDissipation));
 			static STensor43 I4(1.);
-			if (ipvprev->isActiveDamage()){
+			if (ipvprev->dissipationIsActive()){
 				for (int row=firstRowFD; row< lastRowFD; row++){
 					int p,q;
 					Tensor23::getIntsFromIndex(row-firstRowFD,p,q);
@@ -205,7 +205,7 @@ void dG3DExtraDofHomogenizedTangent::get(MElement *ele,int npts,IntPt *GP,fullMa
   for (int i = 0; i < npts; i++){
 		const IPStateBase *ips        = (*vips)[i];
 		const ExtraDofDiffusionDG3DIPVariableBase *ipv     = static_cast<const ExtraDofDiffusionDG3DIPVariableBase*>(ips->getState(IPStateBase::current));
-		const ExtraDofDiffusionDG3DIPVariableBase *ipvprev = static_cast<const ExtraDofDiffusionDG3DIPVariableBase*>(ips->getState(IPStateBase::previousActiveDamage));		
+		const ExtraDofDiffusionDG3DIPVariableBase *ipvprev = static_cast<const ExtraDofDiffusionDG3DIPVariableBase*>(ips->getState(IPStateBase::activeDissipation));		
 		
     const double weight = GP[i].weight;
     std::vector<TensorialTraits<double>::ValType> & Vals = ipv->f(space,ele,GP[i]);
diff --git a/dG3D/src/dG3DIPVariable.cpp b/dG3D/src/dG3DIPVariable.cpp
index 3e6037bf5763b20e667e80d131431138838117fc..dde649c49d55c9473ad699dcb5217601d1b94437 100644
--- a/dG3D/src/dG3DIPVariable.cpp
+++ b/dG3D/src/dG3DIPVariable.cpp
@@ -244,7 +244,7 @@ double dG3DIPVariable::get(const int comp) const
     return istrain(2);
   }
 	else if (comp == IPField::DAMAGE_IS_BLOCKED){
-		return damageIsBlocked();
+		return dissipationIsBlocked();
 	}
 	else if (comp == IPField::DEFO_ENERGY){
 		return this->defoEnergy();
@@ -484,9 +484,9 @@ void HyperViscoElasticdG3DIPVariable::restart()
   return;
 }
 
-HyperViscoElastoPlasticdG3DIPVariable::HyperViscoElastoPlasticdG3DIPVariable(const mlawHyperelastic& viscoEPLaw, const bool oninter):
+HyperViscoElastoPlasticdG3DIPVariable::HyperViscoElastoPlasticdG3DIPVariable(const mlawPowerYieldHyper& viscoEPLaw, const bool oninter):
       dG3DIPVariable(oninter){
-  _ipViscoElastoPlastic = new IPHyperelastic(viscoEPLaw.getConstRefToCompressionHardening(),
+  _ipViscoElastoPlastic = new IPHyperViscoElastoPlastic(viscoEPLaw.getConstRefToCompressionHardening(),
                                             viscoEPLaw.getConstRefToTractionHardening(),
                                             viscoEPLaw.getConstRefToShearHardening(),
                                             viscoEPLaw.getConstRefToKinematicHardening(),
@@ -495,7 +495,7 @@ HyperViscoElastoPlasticdG3DIPVariable::HyperViscoElastoPlasticdG3DIPVariable(con
 HyperViscoElastoPlasticdG3DIPVariable::HyperViscoElastoPlasticdG3DIPVariable(const HyperViscoElastoPlasticdG3DIPVariable& src):dG3DIPVariable(src){
   _ipViscoElastoPlastic = NULL;
   if (src._ipViscoElastoPlastic != NULL){
-    _ipViscoElastoPlastic = dynamic_cast<IPHyperelastic*>(src._ipViscoElastoPlastic->clone());
+    _ipViscoElastoPlastic = dynamic_cast<IPHyperViscoElastoPlastic*>(src._ipViscoElastoPlastic->clone());
   }
 };
 HyperViscoElastoPlasticdG3DIPVariable& HyperViscoElastoPlasticdG3DIPVariable::operator = (const IPVariable& src){
@@ -507,7 +507,7 @@ HyperViscoElastoPlasticdG3DIPVariable& HyperViscoElastoPlasticdG3DIPVariable::op
         _ipViscoElastoPlastic->operator=(*dynamic_cast<const IPVariable*>(psrc->_ipViscoElastoPlastic));
       }
       else{
-        _ipViscoElastoPlastic = dynamic_cast<IPHyperelastic*>(psrc->_ipViscoElastoPlastic->clone());
+        _ipViscoElastoPlastic = dynamic_cast<IPHyperViscoElastoPlastic*>(psrc->_ipViscoElastoPlastic->clone());
       }
     }
   }
@@ -523,6 +523,9 @@ double HyperViscoElastoPlasticdG3DIPVariable::get(const int comp) const
   {
     return _ipViscoElastoPlastic->getConstRefToEqPlasticStrain();
   }
+  else if (comp == IPField::PLASTIC_POISSON_RATIO){
+    return _ipViscoElastoPlastic->getConstRefToPlasticPoissonRatio();
+  }
   else
   {
     return dG3DIPVariable::get(comp);
@@ -577,7 +580,7 @@ double localDamageJ2HyperDG3DIPVariable::get(const int i) const
 {
   if(i == IPField::PLASTICSTRAIN)
   {
-    return getIPLocalDamageJ2Hyper()->getCurrentPlasticStrain();
+    return getIPLocalDamageJ2Hyper()->getConstRefToEquivalentPlasticStrain();
   }
   else if(i == IPField::DAMAGE)
   {
@@ -1002,7 +1005,7 @@ double nonLocalDamageIsotropicElasticityDG3DIPVariable::get(const int i) const
         return getIPNonLocalDamageIsotropicElasticity()->getNonLocalEffectiveStrains();
     }
 		else if (i == IPField::ACTIVE_DAMAGING_ZONE){
-			if (getIPNonLocalDamageIsotropicElasticity()->isActiveDamage()) return 1.;
+			if (getIPNonLocalDamageIsotropicElasticity()->dissipationIsActive()) return 1.;
 			else return 0.;
 		}
     else
@@ -1113,14 +1116,14 @@ double nonLocalDamageJ2HyperDG3DIPVariable::get(const int i) const
 {
   if(i == IPField::PLASTICSTRAIN)
   {
-    return getIPNonLocalDamageJ2Hyper()->getCurrentPlasticStrain();
+    return getIPNonLocalDamageJ2Hyper()->getConstRefToEquivalentPlasticStrain();
   }
   else if(i == IPField::DAMAGE)
   {
     return getIPNonLocalDamageJ2Hyper()->getDamage();
   }
 	else if (i == IPField::ACTIVE_DAMAGING_ZONE){
-		if (getIPNonLocalDamageJ2Hyper()->isActiveDamage()) return 1.;
+		if (getIPNonLocalDamageJ2Hyper()->dissipationIsActive()) return 1.;
 		else return 0.;
 	}
   else
@@ -1140,14 +1143,14 @@ double nonLocalDamageJ2HyperDG3DIPVariable::plasticEnergy() const
 
 double nonLocalDamageJ2HyperDG3DIPVariable::getConstRefToLocalVariable(const int idex) const {
   if (idex == 0)
-    return getIPNonLocalDamageJ2Hyper()->getCurrentPlasticStrain();
+    return getIPNonLocalDamageJ2Hyper()->getConstRefToEquivalentPlasticStrain();
   else{
     Msg::Fatal("the non-local variable %d is not defined",idex);
   }
 };
 double& nonLocalDamageJ2HyperDG3DIPVariable::getRefToLocalVariable(const int idex){
   if (idex == 0)
-    return getIPNonLocalDamageJ2Hyper()->getRefToCurrentPlasticStrain();
+    return getIPNonLocalDamageJ2Hyper()->getRefToEquivalentPlasticStrain();
   else{
     Msg::Fatal("the non-local variable %d is not defined",idex);
   }
diff --git a/dG3D/src/dG3DIPVariable.h b/dG3D/src/dG3DIPVariable.h
index a853589c78dd1ec408761e7eb9f661a22b5390b1..6efb78f47dd459a02c0bb58e80f5b0c5037b4859 100644
--- a/dG3D/src/dG3DIPVariable.h
+++ b/dG3D/src/dG3DIPVariable.h
@@ -69,6 +69,7 @@ class dG3DIPVariableBase : public ipFiniteStrain
   virtual double get(const int i) const=0;
   virtual double defoEnergy() const=0;
   virtual double plasticEnergy() const=0;
+  virtual double damageEnergy() const=0;
   virtual double vonMises() const=0;
   virtual void getCauchyStress(STensor3 &cauchy) const=0;
   virtual double getJ() const=0;
@@ -175,6 +176,7 @@ class dG3DIPVariable : public dG3DIPVariableBase
   virtual double get(const int i) const;
   virtual double defoEnergy() const;
   virtual double plasticEnergy() const;
+  virtual double damageEnergy() const{return 0.;};
   virtual double vonMises() const;
   virtual void getCauchyStress(STensor3 &cauchy) const;
   virtual double getJ() const;
@@ -298,6 +300,11 @@ class J2SmallStrainDG3DIPVariable : public dG3DIPVariable // or store data in a
   virtual double get(const int i) const;
   virtual double defoEnergy() const;
   virtual double plasticEnergy() const;
+  virtual double damageEnergy() const {return _j2ipv->damageEnergy();};
+  
+  virtual bool dissipationIsActive() const {return _j2ipv->dissipationIsActive();};
+  virtual void blockDissipation(const bool fl){   _j2ipv->blockDissipation(fl);}
+  virtual bool dissipationIsBlocked() const { return _j2ipv->dissipationIsBlocked();}
 	
 	// for path following based on  irreversibe energt
 	virtual double irreversibleEnergy() const {return _j2ipv->irreversibleEnergy();};
@@ -332,6 +339,11 @@ class J2LinearDG3DIPVariable : public dG3DIPVariable // or store data in a diffe
   virtual double get(const int i) const;
   virtual double defoEnergy() const;
   virtual double plasticEnergy() const;
+  virtual double damageEnergy() const {return _j2ipv->damageEnergy();};
+  
+  virtual bool dissipationIsActive() const {return _j2ipv->dissipationIsActive();};
+  virtual void blockDissipation(const bool fl){   _j2ipv->blockDissipation(fl);}
+  virtual bool dissipationIsBlocked() const { return _j2ipv->dissipationIsBlocked();}
 	
 	// for path following based on  irreversibe energt
 	virtual double irreversibleEnergy() const {return _j2ipv->irreversibleEnergy();};
@@ -362,6 +374,13 @@ public:
       if (_ipViscoElastic)
         _ipViscoElastic->setLocation(loc);
     };
+    
+    // for path following based on  irreversibe energt
+    virtual double irreversibleEnergy() const {return _ipViscoElastic->irreversibleEnergy();};
+    virtual double& getRefToIrreversibleEnergy() {return _ipViscoElastic->getRefToIrreversibleEnergy();};
+    
+    virtual const STensor3& getConstRefToDIrreversibleEnergyDDeformationGradient() const {return _ipViscoElastic->getConstRefToDIrreversibleEnergyDF();};
+    virtual STensor3& getRefToDIrreversibleEnergyDDeformationGradient() {return _ipViscoElastic->getRefToDIrreversibleEnergyDF();};
 
     virtual double defoEnergy() const;
     
@@ -371,16 +390,16 @@ public:
 
 class HyperViscoElastoPlasticdG3DIPVariable : public dG3DIPVariable{
   protected:
-    IPHyperelastic* _ipViscoElastoPlastic;
+    IPHyperViscoElastoPlastic* _ipViscoElastoPlastic;
     
   public:
-    HyperViscoElastoPlasticdG3DIPVariable(const mlawHyperelastic& viscoEPLaw, const bool oninter);
+    HyperViscoElastoPlasticdG3DIPVariable(const mlawPowerYieldHyper& viscoEPLaw, const bool oninter);
     HyperViscoElastoPlasticdG3DIPVariable(const HyperViscoElastoPlasticdG3DIPVariable& src);
     virtual HyperViscoElastoPlasticdG3DIPVariable& operator = (const IPVariable& src);
     virtual ~HyperViscoElastoPlasticdG3DIPVariable();
     
-    IPHyperelastic* getIPHyperelastic() {return _ipViscoElastoPlastic;}
-    const IPHyperelastic* getIPHyperelastic() const {return _ipViscoElastoPlastic;}
+    IPHyperViscoElastoPlastic* getIPHyperViscoElastoPlastic() {return _ipViscoElastoPlastic;}
+    const IPHyperViscoElastoPlastic* getIPHyperViscoElastoPlastic() const {return _ipViscoElastoPlastic;}
     
     virtual void setLocation(const IPVariable::LOCATION loc) {
       dG3DIPVariable::setLocation(loc);
@@ -390,11 +409,20 @@ class HyperViscoElastoPlasticdG3DIPVariable : public dG3DIPVariable{
     
     virtual double get(const int i) const;
     
-    virtual double defoEnergy() const {return _ipViscoElastoPlastic->defoEnergy();};
-    virtual double plasticEnergy() const {return _ipViscoElastoPlastic->plasticEnergy();};
+    virtual bool dissipationIsActive() const {return _ipViscoElastoPlastic->dissipationIsActive();};
+    virtual void blockDissipation(const bool fl){   _ipViscoElastoPlastic->blockDissipation(fl);}
+    virtual bool dissipationIsBlocked() const { return _ipViscoElastoPlastic->dissipationIsBlocked();}
     
     // for path following based on  irreversibe energt
     virtual double irreversibleEnergy() const {return _ipViscoElastoPlastic->irreversibleEnergy();};
+    virtual double& getRefToIrreversibleEnergy() {return _ipViscoElastoPlastic->getRefToIrreversibleEnergy();};
+    
+    virtual const STensor3& getConstRefToDIrreversibleEnergyDDeformationGradient() const {return _ipViscoElastoPlastic->getConstRefToDIrreversibleEnergyDF();};
+    virtual STensor3& getRefToDIrreversibleEnergyDDeformationGradient() {return _ipViscoElastoPlastic->getRefToDIrreversibleEnergyDF();};
+    
+    virtual double defoEnergy() const {return _ipViscoElastoPlastic->defoEnergy();};
+    virtual double plasticEnergy() const {return _ipViscoElastoPlastic->plasticEnergy();};
+    virtual double damageEnergy() const {return _ipViscoElastoPlastic->damageEnergy();};
     
     virtual IPVariable* clone() const {return new HyperViscoElastoPlasticdG3DIPVariable(*this);};
     virtual void restart();
@@ -425,15 +453,9 @@ class localDamageJ2HyperDG3DIPVariable : public dG3DIPVariable{
       _nldJ2Hyperipv->setLocation(loc);
   };
 
-  virtual bool isActiveDamage() const {return _nldJ2Hyperipv->isActiveDamage();};
-
-  virtual void blockDamage(const bool fl){
-    if (_nldJ2Hyperipv) _nldJ2Hyperipv->blockDamage(fl);
-  }
-  virtual bool damageIsBlocked() const {
-    if (_nldJ2Hyperipv) return _nldJ2Hyperipv->damageIsBlocked();
-    else return false;
-  }
+  virtual bool dissipationIsActive() const {return _nldJ2Hyperipv->dissipationIsActive();};
+  virtual void blockDissipation(const bool fl){   _nldJ2Hyperipv->blockDissipation(fl);}
+  virtual bool dissipationIsBlocked() const { return _nldJ2Hyperipv->dissipationIsBlocked();}
 
   virtual void setBulkCriticalDamage(const double DT){_nldJ2Hyperipv->setCriticalDamage(DT);}; // set critical damage value
   virtual double getBulkCriticalDamage() const {return _nldJ2Hyperipv->getCriticalDamage();};
@@ -441,6 +463,7 @@ class localDamageJ2HyperDG3DIPVariable : public dG3DIPVariable{
   virtual double get(const int i) const;
   virtual double defoEnergy() const;
   virtual double plasticEnergy() const;
+  virtual double damageEnergy() const {return _nldJ2Hyperipv->damageEnergy();};
 
 	// for path following based on  irreversibe energt
 	virtual double irreversibleEnergy() const {return _nldJ2Hyperipv->irreversibleEnergy();};
@@ -532,6 +555,7 @@ class VUMATinterfaceDG3DIPVariable : public dG3DIPVariable
   virtual double get(const int i) const;
   virtual double defoEnergy() const;
   virtual double plasticEnergy() const;
+  virtual double damageEnergy() const {return _vumatipv->damageEnergy();}
   virtual ~VUMATinterfaceDG3DIPVariable()
   {
      delete _vumatipv;
@@ -597,6 +621,7 @@ class nonLocalDamageDG3DIPVariableBase : public dG3DIPVariable
 
   virtual double defoEnergy() const=0;
   virtual double plasticEnergy() const=0;
+  virtual double damageEnergy() const = 0;
 
   virtual const STensor3 &getConstRefToCharacteristicLengthMatrix(const int idx) const =0;
   virtual IPVariable* clone() const =0;
@@ -634,11 +659,11 @@ class nonLocalDamageDG3DIPVariable : public nonLocalDamageDG3DIPVariableBase
       _nldipv->setLocation(loc);
   };
 
-  virtual bool isActiveDamage() const {return _nldipv->isActiveDamage();};
+  virtual bool dissipationIsActive() const {return _nldipv->dissipationIsActive();};
 
-  virtual void blockDamage(const bool fl){if (_nldipv) _nldipv->blockDamage(fl);};
-  virtual bool damageIsBlocked() const {
-    if (_nldipv) return _nldipv->damageIsBlocked();
+  virtual void blockDissipation(const bool fl){if (_nldipv) _nldipv->blockDissipation(fl);};
+  virtual bool dissipationIsBlocked() const {
+    if (_nldipv) return _nldipv->dissipationIsBlocked();
     else return false;
   }
 
@@ -651,6 +676,7 @@ class nonLocalDamageDG3DIPVariable : public nonLocalDamageDG3DIPVariableBase
   virtual double get(const int i) const;
   virtual double defoEnergy() const;
   virtual double plasticEnergy() const;
+  virtual double damageEnergy() const {return getIPNonLocalDamage()->damageEnergy();};
   virtual const STensor3 &getConstRefToCharacteristicLengthMatrix(const int idex) const
   {
     if (idex == 0)
@@ -695,13 +721,13 @@ class nonLocalDamageIsotropicElasticityDG3DIPVariable : public nonLocalDamageDG3
       _nldIsotropicElasticityipv->setLocation(loc);
   };
 
-  virtual bool isActiveDamage() const {return _nldIsotropicElasticityipv->isActiveDamage();};
+  virtual bool dissipationIsActive() const {return _nldIsotropicElasticityipv->dissipationIsActive();};
 
-  virtual void blockDamage(const bool fl){
-    if (_nldIsotropicElasticityipv) _nldIsotropicElasticityipv->blockDamage(fl);
+  virtual void blockDissipation(const bool fl){
+    if (_nldIsotropicElasticityipv) _nldIsotropicElasticityipv->blockDissipation(fl);
   }
-  virtual bool damageIsBlocked() const {
-    if (_nldIsotropicElasticityipv) return _nldIsotropicElasticityipv->damageIsBlocked();
+  virtual bool dissipationIsBlocked() const {
+    if (_nldIsotropicElasticityipv) return _nldIsotropicElasticityipv->dissipationIsBlocked();
     else return false;
   }
 
@@ -720,6 +746,7 @@ class nonLocalDamageIsotropicElasticityDG3DIPVariable : public nonLocalDamageDG3
   virtual double get(const int i) const;
   virtual double defoEnergy() const;
   virtual double plasticEnergy() const;
+  virtual double damageEnergy() const {return _nldIsotropicElasticityipv->damageEnergy();};
   virtual const STensor3 &getConstRefToCharacteristicLengthMatrix(const int idex) const
   {
     if (idex == 0)
@@ -778,11 +805,11 @@ class nonLocalDamageJ2HyperDG3DIPVariable : public nonLocalDamageDG3DIPVariableB
     _nldJ2Hyperipv = NULL;
   }
 
-  virtual void blockDamage(const bool fl){
-    if (_nldJ2Hyperipv) _nldJ2Hyperipv->blockDamage(fl);
+  virtual void blockDissipation(const bool fl){
+    if (_nldJ2Hyperipv) _nldJ2Hyperipv->blockDissipation(fl);
   }
-  virtual bool damageIsBlocked() const {
-    if (_nldJ2Hyperipv) return _nldJ2Hyperipv->damageIsBlocked();
+  virtual bool dissipationIsBlocked() const {
+    if (_nldJ2Hyperipv) return _nldJ2Hyperipv->dissipationIsBlocked();
     else return false;
   }
 
@@ -792,7 +819,7 @@ class nonLocalDamageJ2HyperDG3DIPVariable : public nonLocalDamageDG3DIPVariableB
       _nldJ2Hyperipv->setLocation(loc);
   };
 
-  virtual bool isActiveDamage() const {return _nldJ2Hyperipv->isActiveDamage();};
+  virtual bool dissipationIsActive() const {return _nldJ2Hyperipv->dissipationIsActive();};
 
   virtual void setBulkCriticalDamage(const double DT){_nldJ2Hyperipv->setCriticalDamage(DT);}; // set critical damage value
   virtual double getBulkCriticalDamage() const {return _nldJ2Hyperipv->getCriticalDamage();};
@@ -809,6 +836,7 @@ class nonLocalDamageJ2HyperDG3DIPVariable : public nonLocalDamageDG3DIPVariableB
   virtual double get(const int i) const;
   virtual double defoEnergy() const;
   virtual double plasticEnergy() const;
+  virtual double damageEnergy() const {return _nldJ2Hyperipv->damageEnergy();}
   virtual const STensor3 &getConstRefToCharacteristicLengthMatrix(const int idex) const
   {
     if (idex == 0)
@@ -872,13 +900,13 @@ class nonLocalDamageGursonDG3DIPVariable : public nonLocalDamageDG3DIPVariableBa
       _nldGursonipv->setLocation(loc);
   };
 
-  virtual bool isActiveDamage() const {return _nldGursonipv->isActiveDamage();};
+  virtual bool dissipationIsActive() const {return _nldGursonipv->dissipationIsActive();};
 
-  virtual void blockDamage(const bool fl){
-    if (_nldGursonipv) _nldGursonipv->blockDamage(fl);
+  virtual void blockDissipation(const bool fl){
+    if (_nldGursonipv) _nldGursonipv->blockDissipation(fl);
   }
-  virtual bool damageIsBlocked() const{
-    if (_nldGursonipv) return _nldGursonipv->damageIsBlocked();
+  virtual bool dissipationIsBlocked() const{
+    if (_nldGursonipv) return _nldGursonipv->dissipationIsBlocked();
     else return false;
   }
 
@@ -892,6 +920,7 @@ class nonLocalDamageGursonDG3DIPVariable : public nonLocalDamageDG3DIPVariableBa
   virtual double get(const int i) const;
   virtual double defoEnergy() const;
   virtual double plasticEnergy() const;
+  virtual double damageEnergy() const {return _nldGursonipv->damageEnergy();};
   virtual const STensor3 &getConstRefToCharacteristicLengthMatrix(const int idex) const
   {
     if (idex == 0)
@@ -923,6 +952,7 @@ class TransverseIsotropicDG3DIPVariable : public dG3DIPVariable // or store data
   virtual double get(const int i) const;
   virtual double defoEnergy() const;
   virtual double plasticEnergy() const;
+  virtual double damageEnergy() const {return _tiipv.damageEnergy();}
   virtual IPVariable* clone() const {return new TransverseIsotropicDG3DIPVariable(*this);};
   virtual void restart();
 };
@@ -950,6 +980,7 @@ class TransverseIsoCurvatureDG3DIPVariable : public dG3DIPVariable // or store d
   virtual double get(const int i) const;
   virtual double defoEnergy() const;
   virtual double plasticEnergy() const;
+  virtual double damageEnergy() const {return _tiipv.damageEnergy();};
   virtual IPVariable* clone() const {return new TransverseIsoCurvatureDG3DIPVariable(*this);};
   virtual void restart();
 };
@@ -1003,6 +1034,7 @@ class AnisotropicDG3DIPVariable : public dG3DIPVariable // or store data in a di
   virtual double get(const int i) const;
   virtual double defoEnergy() const;
   virtual double plasticEnergy() const;
+  virtual double damageEnergy() const {return _tiipv.damageEnergy();}
   virtual IPVariable* clone() const {return new AnisotropicDG3DIPVariable(*this);};
   virtual void restart();
 };
@@ -1033,6 +1065,7 @@ class AnisotropicStochDG3DIPVariable : public dG3DIPVariable // or store data in
   virtual double get(const int i) const;
   virtual double defoEnergy() const;
   virtual double plasticEnergy() const;
+  virtual double damageEnergy() const {return _tiipv.damageEnergy();};
   virtual IPVariable* clone() const {return new AnisotropicStochDG3DIPVariable(*this);};
   virtual void restart();
 };
@@ -1083,6 +1116,7 @@ class ExtraDofDiffusionDG3DIPVariableBase : public dG3DIPVariable
 	
   virtual double defoEnergy() const=0;
   virtual double plasticEnergy() const=0;
+  virtual double damageEnergy() const = 0;
 
   virtual double get(const int i) const=0;
   virtual double getInternalEnergyExtraDofDiffusion() const = 0;
@@ -1284,6 +1318,7 @@ class LinearThermoMechanicsDG3DIPVariable : public ThermoMechanicsDG3DIPVariable
   virtual double defoEnergy() const;
   virtual double getInternalEnergyExtraDofDiffusion() const {return _linearTMIP.getThermalEnergy();};
   virtual double plasticEnergy() const;
+  virtual double damageEnergy() const {return _linearTMIP.damageEnergy();};
   virtual IPVariable* clone() const {return new LinearThermoMechanicsDG3DIPVariable(*this);};
   virtual void restart();
   virtual int fractureEnergy(double* arrayEnergy) const{arrayEnergy[0]=_linearTMIP.getConstRefToFractureEnergy(); return 1;} //need it to get H1 norm in the interface  e.g. LinearThermoMech
@@ -1312,6 +1347,7 @@ class J2ThermoMechanicsDG3DIPVariable : public ThermoMechanicsDG3DIPVariableBase
   virtual double get(const int i) const;
   virtual double defoEnergy() const;
   virtual double plasticEnergy() const;
+  virtual double damageEnergy() const {return _j2ipv->damageEnergy();}
   virtual double getInternalEnergyExtraDofDiffusion() const {return _j2ipv->getThermalEnergy();};
   virtual IPVariable* clone() const {return new J2ThermoMechanicsDG3DIPVariable(*this);};
   virtual void restart();
@@ -1336,6 +1372,7 @@ class J2FullThermoMechanicsDG3DIPVariable : public ThermoMechanicsDG3DIPVariable
 		virtual double get(const int i) const;
 		virtual double defoEnergy() const {return _j2Thermo.defoEnergy();};
 		virtual double plasticEnergy() const {return _j2Thermo.plasticEnergy();};
+    virtual double damageEnergy() const {return _j2Thermo.damageEnergy();};
 		virtual double getInternalEnergyExtraDofDiffusion() const {return _j2Thermo.getThermalEnergy();};
 		virtual IPVariable* clone() const {return new J2FullThermoMechanicsDG3DIPVariable(*this);};
 		virtual void restart();
@@ -1369,8 +1406,8 @@ public:
   virtual double defoEnergy() const;
   virtual double getInternalEnergyExtraDofDiffusion() const {return _AnIsotropicTMIP.getThermalEnergy();};
   virtual double plasticEnergy() const;
-    virtual IPVariable* clone() const {return new AnIsotropicTherMechDG3DIPVariable(*this);};
- // virtual IPVariable* clone() const {return new AnIsotropicTherMechDG3DIPVariable(*this);};
+  virtual double damageEnergy() const {return _AnIsotropicTMIP.damageEnergy();};
+  virtual IPVariable* clone() const {return new AnIsotropicTherMechDG3DIPVariable(*this);};
   virtual void restart();
 
 };
@@ -1407,6 +1444,7 @@ class SMPDG3DIPVariable : public ThermoMechanicsDG3DIPVariableBase
   virtual double get(const int i) const;
   virtual double defoEnergy() const;
   virtual double plasticEnergy() const;
+  virtual double damageEnergy() const {return _TMIPSMP->damageEnergy();};
   virtual double getInternalEnergyExtraDofDiffusion() const {return _TMIPSMP->getThermalEnergy();};
   virtual double getRefToEquivalentPlasticDefo1() const {return _TMIPSMP->getConstRefToEquivalentPlasticDefo1();};
   virtual IPVariable* clone() const {return new SMPDG3DIPVariable(*this);};
@@ -1522,6 +1560,7 @@ class ElecTherMechDG3DIPVariableBase : public dG3DIPVariable
   }
   virtual double defoEnergy() const=0;
   virtual double plasticEnergy() const=0;
+  virtual double damageEnergy() const = 0;
   virtual double get(const int i) const;
 
   // Archiving data to be changed
@@ -1810,6 +1849,7 @@ public:
   virtual double get(const int i) const;
   virtual double defoEnergy() const;
   virtual double plasticEnergy() const;
+  virtual double damageEnergy() const {return _linearETMIP.damageEnergy();}
   virtual IPVariable* clone() const {return new LinearElecTherMechDG3DIPVariable(*this);};
   virtual void restart();
 };
@@ -1847,6 +1887,7 @@ public:
   virtual double get(const int i) const;
   virtual double defoEnergy() const;
   virtual double plasticEnergy() const;
+  virtual double damageEnergy() const {return _ETMIP->damageEnergy();};
   virtual IPVariable* clone() const {return new AnIsotropicElecTherMechDG3DIPVariable(*this);};
   virtual void restart();
 };
@@ -1884,6 +1925,7 @@ public:
   virtual double defoEnergy() const;
   virtual double getRefToEquivalentPlasticDefo1() const {return _ESMPIP->getConstRefToEquivalentPlasticDefo1();};
   virtual double plasticEnergy() const;
+  virtual double damageEnergy() const {return _ESMPIP->damageEnergy();};
   virtual IPVariable* clone() const {return new ElecSMPDG3DIPVariable(*this);};
   virtual void restart();
 };
diff --git a/dG3D/src/dG3DMaterialLaw.cpp b/dG3D/src/dG3DMaterialLaw.cpp
index 90e586909c3028900d6d7ce0ae25a66029e5eeb6..a6d19decc7427c44e8f8c5dfdd31f4c07e1d137e 100644
--- a/dG3D/src/dG3DMaterialLaw.cpp
+++ b/dG3D/src/dG3DMaterialLaw.cpp
@@ -507,8 +507,8 @@ void HyperViscoElastoPlasticPowerYieldDG3DMaterialLaw::stress(IPVariable* ipv, c
   const STensor3& F0 = ipvprev->getConstRefToDeformationGradient();
 
   /* data for J2 law */
-  IPHyperelastic* q1 = ipvcur->getIPHyperelastic();
-  const IPHyperelastic* q0 = ipvprev->getIPHyperelastic();
+  IPHyperViscoElastoPlastic* q1 = ipvcur->getIPHyperViscoElastoPlastic();
+  const IPHyperViscoElastoPlastic* q0 = ipvprev->getIPHyperViscoElastoPlastic();
 
   /* compute stress */
   _viscoLaw.constitutive(F0,F1,ipvcur->getRefToFirstPiolaKirchhoffStress(),q0,q1,ipvcur->getRefToTangentModuli(),stiff);
@@ -901,9 +901,6 @@ NonLocalDamageDG3DMaterialLaw::setTime(const double t,const double dtime){
 materialLaw::matname
 NonLocalDamageDG3DMaterialLaw::getType() const {return _nldlaw->getType();}
 
-bool NonLocalDamageDG3DMaterialLaw::withDamage() const{
-  return _nldlaw->withDamage();
-}
 
 bool NonLocalDamageDG3DMaterialLaw::withEnergyDissipation() const {return _nldlaw->withEnergyDissipation();};
 
@@ -983,7 +980,7 @@ void NonLocalDamageDG3DMaterialLaw::stress(IPVariable* ipv, const IPVariable* ip
 
 double NonLocalDamageDG3DMaterialLaw::scaleFactor() const{return _nldlaw->scaleFactor();};
 
-void NonLocalDamageDG3DMaterialLaw::setMacroSolver(nonLinearMechSolver* sv){
+void NonLocalDamageDG3DMaterialLaw::setMacroSolver(const nonLinearMechSolver* sv){
 	dG3DMaterialLaw::setMacroSolver(sv);
 	if (_nldlaw != NULL){
 		_nldlaw->setMacroSolver(sv);
@@ -1390,10 +1387,6 @@ NonLocalDamageJ2HyperDG3DMaterialLaw::NonLocalDamageJ2HyperDG3DMaterialLaw(const
 	}
 }
 
-void NonLocalDamageJ2HyperDG3DMaterialLaw::setPathFollowingApproximationMethod(const int i){
-	_nldJ2Hyperlaw->setPathFollowingApproximationMethod(i);
-};
-
 void NonLocalDamageJ2HyperDG3DMaterialLaw::setStrainOrder(const int order){
   _nldJ2Hyperlaw->setStrainOrder(order);
 };
diff --git a/dG3D/src/dG3DMaterialLaw.h b/dG3D/src/dG3DMaterialLaw.h
index b3b8e9e848ee37d8ee42a5d144f2c958c57614ad..df88f1e2187c549189c57822c56401b620f59ee8 100644
--- a/dG3D/src/dG3DMaterialLaw.h
+++ b/dG3D/src/dG3DMaterialLaw.h
@@ -161,7 +161,7 @@ class J2SmallStrainDG3DMaterialLaw : public dG3DMaterialLaw
 	virtual materialLaw* clone() const{return new J2SmallStrainDG3DMaterialLaw(*this);};
   virtual bool withEnergyDissipation() const {return _j2law.withEnergyDissipation();};
 	
-	virtual void setMacroSolver(nonLinearMechSolver* sv){
+	virtual void setMacroSolver(const nonLinearMechSolver* sv){
 		dG3DMaterialLaw::setMacroSolver(sv);
 		_j2law.setMacroSolver(sv);
 	}; 
@@ -208,7 +208,7 @@ class J2LinearDG3DMaterialLaw : public dG3DMaterialLaw
 	virtual double scaleFactor() const{return _j2law.scaleFactor();}
 	virtual materialLaw* clone() const{return new J2LinearDG3DMaterialLaw(*this);};
   virtual bool withEnergyDissipation() const {return _j2law.withEnergyDissipation();};
-	virtual void setMacroSolver(nonLinearMechSolver* sv){
+	virtual void setMacroSolver(const nonLinearMechSolver* sv){
 		dG3DMaterialLaw::setMacroSolver(sv);
 		_j2law.setMacroSolver(sv);
 	}; 
@@ -251,7 +251,7 @@ class HyperViscoElasticDG3DMaterialLaw : public dG3DMaterialLaw{
     virtual double scaleFactor() const{return _viscoLaw.scaleFactor();}
     virtual materialLaw* clone() const{return new HyperViscoElasticDG3DMaterialLaw(*this);};
     virtual bool withEnergyDissipation() const {return _viscoLaw.withEnergyDissipation();};
-    virtual void setMacroSolver(nonLinearMechSolver* sv){
+    virtual void setMacroSolver(const nonLinearMechSolver* sv){
       dG3DMaterialLaw::setMacroSolver(sv);
       _viscoLaw.setMacroSolver(sv);
     }; 
@@ -302,7 +302,7 @@ class HyperViscoElastoPlasticPowerYieldDG3DMaterialLaw  : public dG3DMaterialLaw
     virtual double scaleFactor() const{return _viscoLaw.scaleFactor();}
     virtual materialLaw* clone() const{return new HyperViscoElastoPlasticPowerYieldDG3DMaterialLaw(*this);};
     virtual bool withEnergyDissipation() const {return _viscoLaw.withEnergyDissipation();};
-    virtual void setMacroSolver(nonLinearMechSolver* sv){
+    virtual void setMacroSolver(const nonLinearMechSolver* sv){
       dG3DMaterialLaw::setMacroSolver(sv);
       _viscoLaw.setMacroSolver(sv);
     }; 
@@ -346,7 +346,7 @@ class ViscoelasticDG3DMaterialLaw : public dG3DMaterialLaw
   virtual std::vector<double> read_file(const char* file_name, int file_size); //read from files
 	virtual materialLaw* clone() const{return new ViscoelasticDG3DMaterialLaw(*this);};
   virtual bool withEnergyDissipation() const {return _Vislaw.withEnergyDissipation();};
-	virtual void setMacroSolver(nonLinearMechSolver* sv){
+	virtual void setMacroSolver(const nonLinearMechSolver* sv){
 		dG3DMaterialLaw::setMacroSolver(sv);
 		_Vislaw.setMacroSolver(sv);
 	}; 
@@ -401,7 +401,7 @@ class EOSDG3DMaterialLaw : public dG3DMaterialLaw
   virtual void stress(IPVariable*ipv, const IPVariable*ipvprev, const bool stiff=true, const bool checkfrac=true);
 	virtual materialLaw* clone() const{return new EOSDG3DMaterialLaw(*this);};
   virtual bool withEnergyDissipation() const {return _EOSlaw.withEnergyDissipation();};
-	virtual void setMacroSolver(nonLinearMechSolver* sv){
+	virtual void setMacroSolver(const nonLinearMechSolver* sv){
 		dG3DMaterialLaw::setMacroSolver(sv);
 		_EOSlaw.setMacroSolver(sv);
 		for (std::map<int,materialLaw*>::iterator it = maplaw.begin(); it != maplaw.end(); it++){
@@ -439,7 +439,7 @@ class VUMATinterfaceDG3DMaterialLaw : public dG3DMaterialLaw
   virtual void stress(IPVariable*ipv, const IPVariable*ipvprev, const bool stiff=true, const bool checkfrac=true);
 	virtual materialLaw* clone() const{return new VUMATinterfaceDG3DMaterialLaw(*this);};
   virtual bool withEnergyDissipation() const {return _vumatlaw.withEnergyDissipation();};
-	virtual void setMacroSolver(nonLinearMechSolver* sv){
+	virtual void setMacroSolver(const nonLinearMechSolver* sv){
 		dG3DMaterialLaw::setMacroSolver(sv);
 		_vumatlaw.setMacroSolver(sv);
 	};
@@ -475,7 +475,7 @@ class TransverseIsotropicDG3DMaterialLaw : public dG3DMaterialLaw
 	virtual double scaleFactor() const{return _tilaw.scaleFactor();};
 	virtual materialLaw* clone() const{return new TransverseIsotropicDG3DMaterialLaw(*this);};
   virtual bool withEnergyDissipation() const {return _tilaw.withEnergyDissipation();};
-	virtual void setMacroSolver(nonLinearMechSolver* sv){
+	virtual void setMacroSolver(const nonLinearMechSolver* sv){
 		dG3DMaterialLaw::setMacroSolver(sv);
 		_tilaw.setMacroSolver(sv);
 	};
@@ -516,7 +516,7 @@ class TransverseIsoCurvatureDG3DMaterialLaw : public dG3DMaterialLaw
 	virtual double scaleFactor() const{return _tilaw.scaleFactor();};
 	virtual materialLaw* clone() const{return new TransverseIsoCurvatureDG3DMaterialLaw(*this);};
   virtual bool withEnergyDissipation() const {return _tilaw.withEnergyDissipation();};
-	virtual void setMacroSolver(nonLinearMechSolver* sv){
+	virtual void setMacroSolver(const nonLinearMechSolver* sv){
 		dG3DMaterialLaw::setMacroSolver(sv);
 		_tilaw.setMacroSolver(sv);
 	};
@@ -626,7 +626,7 @@ class TransverseIsoYarnBDG3DMaterialLaw : public dG3DMaterialLaw
   virtual materialLaw* clone() const {return new TransverseIsoYarnBDG3DMaterialLaw(*this);};
   virtual bool withEnergyDissipation() const {return _tilaw.withEnergyDissipation();};
   TransverseIsoYarnBDG3DMaterialLaw(const TransverseIsoYarnBDG3DMaterialLaw &source);
-	virtual void setMacroSolver(nonLinearMechSolver* sv){
+	virtual void setMacroSolver(const nonLinearMechSolver* sv){
 		dG3DMaterialLaw::setMacroSolver(sv);
 		_tilaw.setMacroSolver(sv);
 	};
@@ -670,7 +670,7 @@ class AnisotropicDG3DMaterialLaw : public dG3DMaterialLaw
 	virtual double scaleFactor() const{return _tilaw.scaleFactor();}
 	virtual materialLaw* clone() const{return new AnisotropicDG3DMaterialLaw(*this);};
   virtual bool withEnergyDissipation() const {return _tilaw.withEnergyDissipation();};
-	virtual void setMacroSolver(nonLinearMechSolver* sv){
+	virtual void setMacroSolver(const nonLinearMechSolver* sv){
 		dG3DMaterialLaw::setMacroSolver(sv);
 		_tilaw.setMacroSolver(sv);
 	};
@@ -705,7 +705,7 @@ class AnisotropicStochDG3DMaterialLaw : public dG3DMaterialLaw
 	virtual double scaleFactor() const{return _tilaw.scaleFactor();}
 	virtual materialLaw* clone() const{return new AnisotropicStochDG3DMaterialLaw(*this);};
   virtual bool withEnergyDissipation() const {return _tilaw.withEnergyDissipation();};
-	virtual void setMacroSolver(nonLinearMechSolver* sv){
+	virtual void setMacroSolver(const nonLinearMechSolver* sv){
 		dG3DMaterialLaw::setMacroSolver(sv);
 		_tilaw.setMacroSolver(sv);
 	};
@@ -729,7 +729,6 @@ class NonLocalDamageDG3DMaterialLaw : public dG3DMaterialLaw
   // set the time of _nldlaw
   virtual void setTime(const double t,const double dtime);
   virtual materialLaw::matname getType() const;
-  virtual bool withDamage() const;
   virtual void createIPState(IPStateBase* &ips,const bool* state_=NULL,const MElement *ele=NULL, const int nbFF_=0, const IntPt *GP=NULL, const int gpt = 0) const;
   virtual void createIPVariable(IPVariable* &ipv,const MElement *ele, const int nbFF_, const IntPt *GP, const int gpt) const;
   virtual void initLaws(const std::map<int,materialLaw*> &maplaw){}
@@ -738,7 +737,7 @@ class NonLocalDamageDG3DMaterialLaw : public dG3DMaterialLaw
 	virtual double scaleFactor() const;
 	virtual materialLaw* clone() const{return new NonLocalDamageDG3DMaterialLaw(*this);};
   virtual bool withEnergyDissipation() const;
-	virtual void setMacroSolver(nonLinearMechSolver* sv);
+	virtual void setMacroSolver(const nonLinearMechSolver* sv);
 #endif
 };
 
@@ -778,7 +777,6 @@ protected:
     };
 		virtual void setTime(const double t,const double dtime);
     virtual materialLaw::matname getType() const {return _nlLaw->getType();};
-    virtual bool withDamage() const {return _nlLaw->withDamage();};
 
     virtual void createIPState(IPStateBase* &ips,const bool* state_=NULL,const MElement *ele=NULL, const int nbFF_=0, const IntPt *GP=NULL, const int gpt = 0) const;
     virtual void createIPVariable(IPVariable* &ipv,const MElement *ele, const int nbFF_, const IntPt *GP, const int gpt) const;
@@ -788,7 +786,7 @@ protected:
 		virtual double scaleFactor() const {return _nlLaw->scaleFactor();}
 		virtual materialLaw* clone() const{return new NonLocalDamageHyperelasticDG3DMaterialLaw(*this);};
     virtual bool withEnergyDissipation() const {return _nlLaw->withEnergyDissipation();};
-		virtual void setMacroSolver(nonLinearMechSolver* sv){
+		virtual void setMacroSolver(const nonLinearMechSolver* sv){
 			dG3DMaterialLaw::setMacroSolver(sv);
 			_nlLaw->setMacroSolver(sv);
 		};
@@ -827,7 +825,6 @@ public:
 
     virtual void setTime(const double t,const double dtime);
     virtual materialLaw::matname getType() const;
-    virtual bool withDamage() const {return _nldIsotropicElasticitylaw->withDamage();};
 
     virtual void createIPState(IPStateBase* &ips,const bool* state_=NULL,const MElement *ele=NULL, const int nbFF_=0, const IntPt *GP=NULL, const int gpt = 0) const;
     virtual void createIPVariable(IPVariable* &ipv,const MElement *ele, const int nbFF_, const IntPt *GP, const int gpt) const;
@@ -837,7 +834,7 @@ public:
 		virtual double scaleFactor() const {return _nldIsotropicElasticitylaw->scaleFactor();}
 		virtual materialLaw* clone() const{return new NonLocalDamageIsotropicElasticityDG3DMaterialLaw(*this);};
     virtual bool withEnergyDissipation() const {return _nldIsotropicElasticitylaw->withEnergyDissipation();};
-		virtual void setMacroSolver(nonLinearMechSolver* sv){
+		virtual void setMacroSolver(const nonLinearMechSolver* sv){
 			dG3DMaterialLaw::setMacroSolver(sv);
 			if (_nldIsotropicElasticitylaw != NULL){
 				_nldIsotropicElasticitylaw->setMacroSolver(sv);
@@ -864,7 +861,6 @@ class LocalDamageJ2HyperDG3DMaterialLaw : public dG3DMaterialLaw
   // set the time of _nldlaw
   virtual void setTime(const double t,const double dtime);
   virtual materialLaw::matname getType() const;
-  virtual bool withDamage() const {return _nldJ2Hyperlaw->withDamage();};
 
   virtual void createIPState(IPStateBase* &ips,const bool* state_=NULL,const MElement *ele=NULL, const int nbFF_=0, const IntPt *GP=NULL, const int gpt = 0) const;
   virtual void createIPVariable(IPVariable* &ipv,const MElement *ele, const int nbFF_, const IntPt *GP, const int gpt) const;
@@ -874,7 +870,7 @@ class LocalDamageJ2HyperDG3DMaterialLaw : public dG3DMaterialLaw
 	virtual double scaleFactor() const{return _nldJ2Hyperlaw->scaleFactor();}
 	virtual materialLaw* clone() const{ return new LocalDamageJ2HyperDG3DMaterialLaw(*this);};
   virtual bool withEnergyDissipation() const {return _nldJ2Hyperlaw->withEnergyDissipation();};
-	virtual void setMacroSolver(nonLinearMechSolver* sv){
+	virtual void setMacroSolver(const nonLinearMechSolver* sv){
 		dG3DMaterialLaw::setMacroSolver(sv);
 		if (_nldJ2Hyperlaw != NULL){
 			_nldJ2Hyperlaw->setMacroSolver(sv);
@@ -898,7 +894,6 @@ class NonLocalDamageJ2HyperDG3DMaterialLaw : public dG3DMaterialLaw
                    const bool matrixBypert = false, const double tolpert=1e-8);
   virtual ~NonLocalDamageJ2HyperDG3DMaterialLaw();
 	
-	void setPathFollowingApproximationMethod(const int i);
   void setStrainOrder(const int order);
 
 #ifndef SWIG
@@ -906,7 +901,6 @@ class NonLocalDamageJ2HyperDG3DMaterialLaw : public dG3DMaterialLaw
   // set the time of _nldlaw
   virtual void setTime(const double t,const double dtime);
   virtual materialLaw::matname getType() const;
-  virtual bool withDamage() const {return _nldJ2Hyperlaw->withDamage();};
 
   virtual void createIPState(IPStateBase* &ips,const bool* state_=NULL,const MElement *ele=NULL, const int nbFF_=0, const IntPt *GP=NULL, const int gpt = 0) const;
   virtual void createIPVariable(IPVariable* &ipv,const MElement *ele, const int nbFF_, const IntPt *GP, const int gpt) const;
@@ -916,7 +910,7 @@ class NonLocalDamageJ2HyperDG3DMaterialLaw : public dG3DMaterialLaw
 	virtual double scaleFactor() const{return _nldJ2Hyperlaw->scaleFactor();};
 	virtual materialLaw* clone() const{ return new NonLocalDamageJ2HyperDG3DMaterialLaw(*this);};
   virtual bool withEnergyDissipation() const {return _nldJ2Hyperlaw->withEnergyDissipation();};
-	virtual void setMacroSolver(nonLinearMechSolver* sv){
+	virtual void setMacroSolver(const nonLinearMechSolver* sv){
 		dG3DMaterialLaw::setMacroSolver(sv);
 		if (_nldJ2Hyperlaw != NULL){
 			_nldJ2Hyperlaw->setMacroSolver(sv);
@@ -960,7 +954,6 @@ class NonLocalDamageGursonDG3DMaterialLaw : public dG3DMaterialLaw
     _nldGursonlaw->setTime(t,dtime);
   }
   virtual materialLaw::matname getType() const {return _nldGursonlaw->getType();}
-  virtual bool withDamage() const {return _nldGursonlaw->withDamage();};
 
   virtual void createIPState(IPStateBase* &ips,const bool* state_=NULL,const MElement *ele=NULL, const int nbFF_=0, const IntPt *GP=NULL, const int gpt = 0) const;
   virtual void createIPVariable(IPVariable* &ipv,const MElement *ele, const int nbFF_, const IntPt *GP, const int gpt) const;
@@ -970,7 +963,7 @@ class NonLocalDamageGursonDG3DMaterialLaw : public dG3DMaterialLaw
 	virtual double scaleFactor() const {return _nldGursonlaw->scaleFactor();}
 	virtual materialLaw* clone() const{ return new NonLocalDamageGursonDG3DMaterialLaw(*this);};
   virtual bool withEnergyDissipation() const {return _nldGursonlaw->withEnergyDissipation();};
-	virtual void setMacroSolver(nonLinearMechSolver* sv){
+	virtual void setMacroSolver(const nonLinearMechSolver* sv){
 		dG3DMaterialLaw::setMacroSolver(sv);
 		if (_nldGursonlaw != NULL){
 			_nldGursonlaw->setMacroSolver(sv);
@@ -1020,7 +1013,7 @@ class LinearThermoMechanicsDG3DMaterialLaw : public dG3DMaterialLaw // public ma
   virtual double defoEnergy( const SVector3&ujump,const double &Tjump, const SVector3& N) const;
 	virtual materialLaw* clone() const{ return new LinearThermoMechanicsDG3DMaterialLaw(*this);};
   virtual bool withEnergyDissipation() const {return _lawLinearTM->withEnergyDissipation();};
-	virtual void setMacroSolver(nonLinearMechSolver* sv){
+	virtual void setMacroSolver(const nonLinearMechSolver* sv){
 		dG3DMaterialLaw::setMacroSolver(sv);
 		if (_lawLinearTM!=NULL){
 			_lawLinearTM->setMacroSolver(sv);
@@ -1065,7 +1058,7 @@ class J2ThermoMechanicsDG3DMaterialLaw : public dG3DMaterialLaw
 	virtual double getInitialExtraDofStoredEnergyPerUnitField() const;
 	virtual materialLaw* clone() const{ return new J2ThermoMechanicsDG3DMaterialLaw(*this);};
   virtual bool withEnergyDissipation() const {return _j2law.withEnergyDissipation();};
-	virtual void setMacroSolver(nonLinearMechSolver* sv){
+	virtual void setMacroSolver(const nonLinearMechSolver* sv){
 		dG3DMaterialLaw::setMacroSolver(sv);
 		_j2law.setMacroSolver(sv);
 	}
@@ -1123,7 +1116,7 @@ class FullJ2ThermoMechanicsDG3DMaterialLaw : public dG3DMaterialLaw{
     }
 		virtual materialLaw* clone() const{ return new FullJ2ThermoMechanicsDG3DMaterialLaw(*this);};
     virtual bool withEnergyDissipation() const {return _j2FullThermo.withEnergyDissipation();};
-		virtual void setMacroSolver(nonLinearMechSolver* sv){
+		virtual void setMacroSolver(const nonLinearMechSolver* sv){
 			dG3DMaterialLaw::setMacroSolver(sv);
 			_j2FullThermo.setMacroSolver(sv);
 		}
@@ -1174,7 +1167,7 @@ class mlawAnIsotropicTherMechDG3DMaterialLaw :public dG3DMaterialLaw
   }
 	virtual materialLaw* clone() const{ return new mlawAnIsotropicTherMechDG3DMaterialLaw(*this);};
   virtual bool withEnergyDissipation() const {return _lawAnTM->withEnergyDissipation();};
-	virtual void setMacroSolver(nonLinearMechSolver* sv){
+	virtual void setMacroSolver(const nonLinearMechSolver* sv){
 		dG3DMaterialLaw::setMacroSolver(sv);
 		if (_lawAnTM!=NULL)
 			_lawAnTM->setMacroSolver(sv);
@@ -1223,7 +1216,7 @@ class SMPDG3DMaterialLaw :public dG3DMaterialLaw // ,public mlawSMP
   double getExtraDofStoredEnergyPerUnitField(double T) const;
 	virtual materialLaw* clone() const{ return new SMPDG3DMaterialLaw(*this);};
   virtual bool withEnergyDissipation() const {return _lawTMSMP->withEnergyDissipation();};
-	virtual void setMacroSolver(nonLinearMechSolver* sv){
+	virtual void setMacroSolver(const nonLinearMechSolver* sv){
 		dG3DMaterialLaw::setMacroSolver(sv);
 		if (_lawTMSMP!=NULL)
 			_lawTMSMP->setMacroSolver(sv);
@@ -1273,7 +1266,7 @@ class LinearElecTherMechDG3DMaterialLaw : public dG3DMaterialLaw // public mater
   }
 	virtual materialLaw* clone() const{ return new LinearElecTherMechDG3DMaterialLaw(*this);};
   virtual bool withEnergyDissipation() const {return _lawLinearETM->withEnergyDissipation();};
-	virtual void setMacroSolver(nonLinearMechSolver* sv){
+	virtual void setMacroSolver(const nonLinearMechSolver* sv){
 		dG3DMaterialLaw::setMacroSolver(sv);
 		if (_lawLinearETM!=NULL)
 			_lawLinearETM->setMacroSolver(sv);
@@ -1329,7 +1322,7 @@ class mlawAnIsotropicElecTherMechDG3DMaterialLaw :public dG3DMaterialLaw
   }
 	virtual materialLaw* clone() const{ return new mlawAnIsotropicElecTherMechDG3DMaterialLaw(*this);};
   virtual bool withEnergyDissipation() const {return  _lawETM->withEnergyDissipation();};
-	virtual void setMacroSolver(nonLinearMechSolver* sv){
+	virtual void setMacroSolver(const nonLinearMechSolver* sv){
 		dG3DMaterialLaw::setMacroSolver(sv);
 		if (_lawETM!=NULL)
 			_lawETM->setMacroSolver(sv);
@@ -1388,7 +1381,7 @@ class mlawElecSMPDG3DMaterialLaw :public dG3DMaterialLaw
   }
 	virtual materialLaw* clone() const{ return new mlawElecSMPDG3DMaterialLaw(*this);};
   virtual bool withEnergyDissipation() const {return _lawETMSMP->withEnergyDissipation();};
-	virtual void setMacroSolver(nonLinearMechSolver* sv){
+	virtual void setMacroSolver(const nonLinearMechSolver* sv){
 		dG3DMaterialLaw::setMacroSolver(sv);
 		if (_lawETMSMP!=NULL)
 			_lawETMSMP->setMacroSolver(sv);
diff --git a/dG3D/src/dG3DMultiscaleIPVariable.cpp b/dG3D/src/dG3DMultiscaleIPVariable.cpp
index 00e08af6110aa4236d34df4a0f7963b31dd15e95..3c090ec9ea71d81de828c1c3bd3091c38b79a1ab 100644
--- a/dG3D/src/dG3DMultiscaleIPVariable.cpp
+++ b/dG3D/src/dG3DMultiscaleIPVariable.cpp
@@ -7,21 +7,16 @@
 #include "dG3DMultiscaleIPVariable.h"
 #include "nonLinearMechSolver.h"
 
-void dG3DMultiscaleIPVariable::blockDamage(const bool bl){
-	dG3DIPVariable::blockDamage(bl);
-	_damageBlocked = bl;
+void dG3DMultiscaleIPVariable::blockDissipation(const bool bl){
+	dG3DIPVariable::blockDissipation(bl);
+	_dissipationBlocked = bl;
 	if (this->getSolver()!= NULL) {
-		this->getSolver()->blockDamage(IPStateBase::current,_damageBlocked);
+		this->getSolver()->blockDissipation(IPStateBase::current,_dissipationBlocked);
 	}
 }
 
 double dG3DMultiscaleIPVariable::get(const int comp) const{
-  if (comp == IPField::DAMAGE){
-		return this->getFailureDamage();
-  }
-  else{
-    return dG3DIPVariable::get(comp);
-  }
+  return dG3DIPVariable::get(comp);
 };
 
 #if defined(HAVE_MPI)
@@ -34,9 +29,9 @@ int dG3DMultiscaleIPVariable::getMacroNumberElementDataSendToMicroProblem() cons
 };
   // get number of values obtained by microscopic analysis to send to macroscopic analysis
 int dG3DMultiscaleIPVariable::getMicroNumberElementDataSendToMacroProblem() const{
-	// we send P, L , failureDamage, broken
-	// elastic energy + plastic energy+irreversible energy+DirreversibleEnergyDF
-  return 9+81+4+1+9;
+	// we send P, L , broken +elastic energy + plastic energy+
+	// irreversible energy+DirreversibleEnergyDF
+  return 9+81+3+1+9;
 
 };
   // get macroscopic kinematic data to send to microscopic problem
@@ -105,8 +100,6 @@ void dG3DMultiscaleIPVariable::getMicroDataToMacroProblem(double* val) const{
 	}
 	row+= 81;
 
-  val[row] = this->getFailureDamage();
-  row += 1;
 	//
 	double solverIsBroken = -1.;
   if (_solverBroken) solverIsBroken = 1.;
@@ -196,9 +189,6 @@ void dG3DMultiscaleIPVariable::setReceivedMicroDataToMacroProblem(const double*
 	}
 	row+= 81;
 
-  _failureDamage = val[row];
-  row += 1;
-
 	if (val[row] > 0) {
 		_solverBroken = true;
 	}
diff --git a/dG3D/src/dG3DMultiscaleIPVariable.h b/dG3D/src/dG3DMultiscaleIPVariable.h
index 6d4610c8ffff2decb2d433d00bf6097bf3797233..7493a5c19cf2e4ab2aa11cf6bed4f4fb4410a2ca 100644
--- a/dG3D/src/dG3DMultiscaleIPVariable.h
+++ b/dG3D/src/dG3DMultiscaleIPVariable.h
@@ -15,8 +15,7 @@
 class dG3DMultiscaleIPVariable : public dG3DIPVariable{
 	protected:
 		bool _solverBroken;
-    bool _damageBlocked;
-    double _failureDamage;
+    bool _dissipationBlocked;
 		double _elasticEnergy;
 		double _plasticEnergy;
 		double _irreversibleEnergy;
@@ -24,19 +23,18 @@ class dG3DMultiscaleIPVariable : public dG3DIPVariable{
 
   public:
     dG3DMultiscaleIPVariable(bool oninter) : dG3DIPVariable(oninter),
-		_solverBroken(false),_damageBlocked(false),_failureDamage(0.),
+		_solverBroken(false),_dissipationBlocked(false),
 		_elasticEnergy(0.),_plasticEnergy(0.),_irreversibleEnergy(0.),_DirreversibleEnergyDF(0.){}
     dG3DMultiscaleIPVariable(const dG3DMultiscaleIPVariable& src) : dG3DIPVariable(src),
-		_solverBroken(src._solverBroken),_damageBlocked(src._damageBlocked),
-    _failureDamage(src._failureDamage),_elasticEnergy(src._elasticEnergy),
+		_solverBroken(src._solverBroken),_dissipationBlocked(src._dissipationBlocked),
+    _elasticEnergy(src._elasticEnergy),
 		_plasticEnergy(src._plasticEnergy),_irreversibleEnergy(src._irreversibleEnergy),_DirreversibleEnergyDF(src._DirreversibleEnergyDF){};
     virtual dG3DMultiscaleIPVariable& operator=(const IPVariable& src){
       dG3DIPVariable::operator=(src);
       const dG3DMultiscaleIPVariable* psrc = dynamic_cast<const dG3DMultiscaleIPVariable*>(&src);
       if (psrc != NULL){
 				_solverBroken = psrc->_solverBroken;
-        _damageBlocked = psrc->_damageBlocked;
-        _failureDamage = psrc->_failureDamage;
+        _dissipationBlocked = psrc->_dissipationBlocked;
 				_elasticEnergy = psrc->_elasticEnergy;
 				_plasticEnergy = psrc->_plasticEnergy;
 				_irreversibleEnergy = psrc->_irreversibleEnergy;
@@ -46,15 +44,12 @@ class dG3DMultiscaleIPVariable : public dG3DIPVariable{
     };
     virtual ~dG3DMultiscaleIPVariable(){}
 
-    virtual bool damageIsBlocked() const { return _damageBlocked;};
-    virtual void blockDamage(const bool bl);
+    virtual bool dissipationIsBlocked() const { return _dissipationBlocked;};
+    virtual void blockDissipation(const bool bl);
 
 		virtual bool solverIsBroken() const {return _solverBroken;};
 		virtual bool& getRefToSolverBrokenFlag() {return _solverBroken;};
 
-    virtual double getFailureDamage() const {return _failureDamage;};
-		virtual double& getRefToFailureDamage(){return _failureDamage;};
-
 		virtual double defoEnergy() const { return _elasticEnergy;};
 		virtual double& getRefToDefoEnergy() { return _elasticEnergy;};
 
@@ -74,8 +69,7 @@ class dG3DMultiscaleIPVariable : public dG3DIPVariable{
     virtual void restart(){
       dG3DIPVariable::restart();
 			restartManager::restart(_solverBroken);
-      restartManager::restart(_damageBlocked);
-      restartManager::restart(_failureDamage);
+      restartManager::restart(_dissipationBlocked);
 			restartManager::restart(_elasticEnergy);
 			restartManager::restart(_plasticEnergy);
 			restartManager::restart(_irreversibleEnergy);
@@ -145,6 +139,7 @@ class MultiscaleThermoMechanicsDG3DIPVariable : public ThermoMechanicsDG3DIPVari
 		virtual double defoEnergy() const;
 		virtual double getInternalEnergyExtraDofDiffusion() const;
 		virtual double plasticEnergy() const;
+    virtual double damageEnergy() const {return 0.;};
 
 		virtual IPVariable* clone() const {return new MultiscaleThermoMechanicsDG3DIPVariable(*this);};
 		virtual void restart(){
diff --git a/dG3D/src/dG3DMultiscaleMaterialLaw.cpp b/dG3D/src/dG3DMultiscaleMaterialLaw.cpp
index 352d89ad8dbf6c3770f175fb653bedf560f14ef0..e0149b67308caeeb31475cbd1b8ec0b6764e5144 100644
--- a/dG3D/src/dG3DMultiscaleMaterialLaw.cpp
+++ b/dG3D/src/dG3DMultiscaleMaterialLaw.cpp
@@ -206,7 +206,6 @@ void dG3DMultiscaleMaterialLaw::stress(IPVariable* ipv, const IPVariable* ipvpre
 	mipv->getRefToDefoEnergy() = solver->getHomogenizationState(IPStateBase::current)->getDeformationEnergy();
 	mipv->getRefToPlasticEnergy() = solver->getHomogenizationState(IPStateBase::current)->getPlasticEnergy();
 	mipv->getRefToIrreversibleEnergy() = solver->getHomogenizationState(IPStateBase::current)->getIrreversibleEnergy();
-  mipv->getRefToFailureDamage() = solver->getHomogenizationState(IPStateBase::current)->getActiveDamage();
 	
 	if (solver->checkFailureOnset()){
 		if (mipv->isInterface()){
@@ -482,13 +481,13 @@ void dG3DMultiscaleCohesiveLaw::createIPVariable(IPVariable* &ipv,const MElement
   ipv = new BulkFollowedCohesive3DIPVariable();
 }
 
-dG3DMultiscaleCohesiveLaw::dG3DMultiscaleCohesiveLaw(const int num, const double surfaceRatio):
-			GeneralMultiscaleBulkFollwedCohesive3DLaw(num,true)
+dG3DMultiscaleCohesiveLaw::dG3DMultiscaleCohesiveLaw(const int num, const double surfaceRatio, const bool normPart):
+			GeneralMultiscaleBulkFollwedCohesive3DLaw(num,true),_withNormalPart(normPart)
 			{
 	_surfaceReductionRatio = surfaceRatio;
 };
 dG3DMultiscaleCohesiveLaw::dG3DMultiscaleCohesiveLaw(const dG3DMultiscaleCohesiveLaw& src):
-  GeneralMultiscaleBulkFollwedCohesive3DLaw(src){}
+  GeneralMultiscaleBulkFollwedCohesive3DLaw(src),_withNormalPart(src._withNormalPart){}
 
 bool dG3DMultiscaleCohesiveLaw::brokenCheck(IPVariable* ipv) const{
 	dG3DMultiscaleIPVariable* mipv = dynamic_cast<dG3DMultiscaleIPVariable*>(ipv);
@@ -568,60 +567,63 @@ void dG3DMultiscaleCohesiveLaw::transferInterfaceDataToBulk(IPVariable* ipv, con
  		else {
       Msg::Fatal("solver is not available MultiscaleDGCohesive3DLaw::transferInterfaceDataToBulk");
     }
-
-		const homogenizedData* homoData = solver->getHomogenizationState(IPStateBase::current);
+    
+    SVector3& ujumpDG = cohIpv->getRefToDGJump();
+    ujumpDG = cohIpvprev->getConstRefToDGJump();
+    
+    // update bulk part
+    const STensor3& Fb0 = fipvprev->getBulkDeformationGradient();
+		const STensor3& Fb = fipv->getBulkDeformationGradient();
+    
+    STensor3& F = fipv->getRefToDeformationGradient();
+		F = fipvprev->getConstRefToDeformationGradient();
+    for (int i=0; i<3; i++){
+			for (int j=0; j<3; j++){
+        F(i,j) += Fb(i,j) - Fb0(i,j);
+			}
+		}
+    
+    const homogenizedData* homoData = solver->getHomogenizationState(IPStateBase::current);
     const homogenizedData* homoDataPrev = solver->getHomogenizationState(IPStateBase::previous);
-
-		SVector3 refN = fipv->getConstRefToReferenceOutwardNormal();
+    
+    SVector3 refN = fipv->getConstRefToReferenceOutwardNormal();
     refN.normalize();
     SVector3 curN = fipvprev->getConstRefToCurrentOutwardNormal();
     curN.normalize();
-
-
-		const STensor3& Fb0 = fipvprev->getBulkDeformationGradient();
-		const STensor3& Fb = fipv->getBulkDeformationGradient();
-
-		const SVector3& ujump = fipv->getConstRefToJump();
-		const SVector3& ujump0 = fipvprev->getConstRefToJump();
-
-    SVector3 dJump = ujump;
-    dJump -= ujump0;
-
-    STensor3 DdJumpDujump(1.);
-
-    double dJumpNormal = dot(dJump,curN);
-    if (dJumpNormal < 0){
-			cohIpv->setTensionFlag(false);
-      // eliminate nonphysical normal jump
+    
+    double beta = (homoData->getActiveDissipationVolume() + _voidPartInLocalizationBand)/(_surfaceReductionRatio*solver->getRVEVolume());
+    if (!_withNormalPart){
+      
+      SVector3 normdF(0.);
       for (int i=0; i<3; i++){
-        dJump(i) -= dJumpNormal*curN(i);
         for (int j=0; j<3; j++){
-          DdJumpDujump(i,j) -= curN(i)*curN(j);
+          normdF(i) += (Fb(i,j) - Fb0(i,j))*refN(j);
         }
       }
-    }
-		else{
-			cohIpv->setTensionFlag(true);
-		}
+      
+      for (int i=0; i<3; i++){
+        for (int j=0; j<3; j++){
+          F(i,j) -= beta*normdF(i)*refN(j);
+        };
+      };
+  
+    };
+    
 
 
+		const SVector3& ujump = fipv->getConstRefToJump();
+		const SVector3& ujump0 = fipvprev->getConstRefToJump();
 
-		//double beta = (homoData->getActiveDamageVolume() + _voidPartInLocalizationBand)/(_surfaceReductionRatio*solver->getRVEVolume());
-		//double lM = homoData->getAverageLocalizationBandWidth();
 		double GammaM = solver->getHomogenizedCrackFace();
 		double V0 = solver->getRVEVolume();
 		double fact = GammaM/V0;
 		
-
-		STensor3& F = fipv->getRefToDeformationGradient();
-		F = fipvprev->getConstRefToDeformationGradient();
-
 		for (int i=0; i<3; i++){
 			for (int j=0; j<3; j++){
-        F(i,j) += Fb(i,j) - Fb0(i,j) + fact*dJump(i)*refN(j);
+        F(i,j) +=  fact*(ujump(i) - ujump0(i))*refN(j);
 			}
 		}
-
+    
 		if (stiff){
 			STensor43& dFinterfacedF = fipv->getRefToDInterfaceDeformationGradientDDeformationGradient();
       STensor33& dFinterfacedJump = fipv->getRefToDInterfaceDeformationGradientDJump();
@@ -632,9 +634,12 @@ void dG3DMultiscaleCohesiveLaw::transferInterfaceDataToBulk(IPVariable* ipv, con
 			for (int i=0; i<3; i++){
         for (int j=0; j<3; j++){
           for (int k=0; k<3; k++){
-            dFinterfacedJump(i,j,k) += DdJumpDujump(i,k)*refN(j)*fact;
+            dFinterfacedJump(i,j,k) += I(i,k)*refN(j)*fact;
             for (int l=0; l<3; l++){
-              dFinterfacedF(i,j,k,l) += I(i,k)*I(j,l); // - beta*I(i,k)*refN(j)*refN(l);
+              dFinterfacedF(i,j,k,l) += I(i,k)*I(j,l); 
+              if (!_withNormalPart){
+                dFinterfacedF(i,j,k,l) -= beta*I(i,k)*refN(j)*refN(l);
+              }
             }
           }
 
@@ -668,8 +673,6 @@ void dG3DMultiscaleCohesiveLaw::stress(IPVariable* ipv, const IPVariable* ipvpre
     SVector3 curN = fipvprev->getConstRefToCurrentOutwardNormal();
     curN.normalize();
 
-
-
     const STensor3& P = fipv->getConstRefToFirstPiolaKirchhoffStress();
     SVector3& T = fipv->getRefToInterfaceForce();
     T *= 0.;
@@ -680,18 +683,15 @@ void dG3DMultiscaleCohesiveLaw::stress(IPVariable* ipv, const IPVariable* ipvpre
     }
     
     const SVector3& ujump = fipv->getConstRefToJump();
-		const SVector3& ujump0 = fipvprev->getConstRefToJump();
-
-    SVector3 dJump = ujump;
-    dJump -= ujump0;
-
-    STensor3 DdJumpDujump(1.);
+		const SVector3& ujumpDG = fipv->getConstRefToDGJump();
 
+    SVector3 realUJump(ujump);
+    realUJump -= ujumpDG;
     // add penalty to avoid penetration
-    double dJumpNormal = dot(dJump,curN);
-    if (dJumpNormal < 0){
+    double realUJumpNormal = dot(realUJump,curN);
+    if (realUJumpNormal < 0){
       for (int i=0; i<3; i++){
-				T(i) += _Kp*dJumpNormal*curN(i);
+				T(i) += _Kp*realUJumpNormal*curN(i);
 			}
     }
 		
@@ -727,7 +727,7 @@ void dG3DMultiscaleCohesiveLaw::stress(IPVariable* ipv, const IPVariable* ipvpre
 				}
 			}
 
-			if (dJumpNormal < 0){
+			if (realUJumpNormal < 0){
 				for (int i=0; i<3; i++){
 					for (int j=0; j<3; j++){
 						dTdjump(i,j) += _Kp*curN(i)*curN(j);
@@ -842,7 +842,7 @@ void gradientEnhanceddG3DMultiscaleCohesiveLaw::transferInterfaceDataToBulk(IPVa
 
 
 
-		//double beta = (homoData->getActiveDamageVolume() + _voidPartInLocalizationBand)/(_surfaceReductionRatio*solver->getRVEVolume());
+		//double beta = (homoData->getActiveDissipationVolume() + _voidPartInLocalizationBand)/(_surfaceReductionRatio*solver->getRVEVolume());
 		//double lM = homoData->getAverageLocalizationBandWidth();
 		double GammaM = solver->getHomogenizedCrackFace();
 		double V0 = solver->getRVEVolume();
diff --git a/dG3D/src/dG3DMultiscaleMaterialLaw.h b/dG3D/src/dG3DMultiscaleMaterialLaw.h
index 35060d5215a667d175ec959082d15d08d89a4001..d5449f53a9dfdbba3ecfbcddc6b7c31d50dcda0c 100644
--- a/dG3D/src/dG3DMultiscaleMaterialLaw.h
+++ b/dG3D/src/dG3DMultiscaleMaterialLaw.h
@@ -24,15 +24,6 @@ class dG3DMultiscaleMaterialLawBase : public dG3DMaterialLaw, public numericalMa
 		dG3DMultiscaleMaterialLawBase(const dG3DMultiscaleMaterialLawBase& src)
                             : dG3DMaterialLaw(src),numericalMaterial(src){};
                             
-    virtual bool withDamage() const  {
-      for (int i=0; i< _allMaterialLaw.size(); i++){
-        if (_allMaterialLaw[i]->withDamage()){
-          return true;
-        }
-      }
-      return false;
-    }
-    
     virtual bool withEnergyDissipation() const  {
       for (int i=0; i< _allMaterialLaw.size(); i++){
         if (_allMaterialLaw[i]->withEnergyDissipation()){
@@ -226,10 +217,11 @@ class GeneralMultiscaleBulkFollwedCohesive3DLaw : public GeneralBulkFollwedCohes
 };
 
 class dG3DMultiscaleCohesiveLaw : public GeneralMultiscaleBulkFollwedCohesive3DLaw {
-	protected:
+  protected:
+    bool _withNormalPart;
 		
   public:
-    dG3DMultiscaleCohesiveLaw(const int num, const double surfaceRatio=1.);
+    dG3DMultiscaleCohesiveLaw(const int num, const double surfaceRatio=1., const bool normPart = true);
     #ifndef SWIG
     dG3DMultiscaleCohesiveLaw(const dG3DMultiscaleCohesiveLaw& src);
     virtual ~dG3DMultiscaleCohesiveLaw(){}
@@ -324,14 +316,7 @@ class MultiscaleThermoMechanicsDG3DMaterialLaw : public dG3DMaterialLaw, public
 		MultiscaleThermoMechanicsDG3DMaterialLaw(const MultiscaleThermoMechanicsDG3DMaterialLaw&  src);
 		virtual ~MultiscaleThermoMechanicsDG3DMaterialLaw(){}
 		virtual matname getType() const{return materialLaw::numeric;};
-    virtual bool withDamage() const  {
-      for (int i=0; i< _allMaterialLaw.size(); i++){
-        if (_allMaterialLaw[i]->withDamage()){
-          return true;
-        }
-      }
-      return false;
-    }
+
     virtual bool withEnergyDissipation() const  {
       for (int i=0; i< _allMaterialLaw.size(); i++){
         if (_allMaterialLaw[i]->withEnergyDissipation()){
diff --git a/dG3D/src/nonLocalDamageHyperelasticDG3DIPVariable.cpp b/dG3D/src/nonLocalDamageHyperelasticDG3DIPVariable.cpp
index 15a21d3a62ec8f6541c76b775264adecddc5d1e5..f8ad3da3952efd499d18b54a1a15f0852fedef3c 100644
--- a/dG3D/src/nonLocalDamageHyperelasticDG3DIPVariable.cpp
+++ b/dG3D/src/nonLocalDamageHyperelasticDG3DIPVariable.cpp
@@ -11,21 +11,10 @@
 #include "nonLocalDamageHyperelasticDG3DIPVariable.h"
 #include "ipField.h"
 #include "restartManager.h"
-nonLocalDamageHyperelasticDG3DIPVariable::nonLocalDamageHyperelasticDG3DIPVariable(const mlawNonLocalDamageQuadYieldHyper &mlaw, const bool oninter)
-          :nonLocalDamageDG3DIPVariableBase(oninter,1)
-{
-  _nldHyperipv = new IPNonLocalDamageHyperelasic(mlaw.getConstRefToCompressionHardening(),
-                                                            mlaw.getConstRefToTractionHardening(),
-                                                            mlaw.getConstRefToShearHardening(),
-                                                            mlaw.getConstRefToKinematicHardening(),
-                                                            mlaw.getViscoElasticNumberOfElement(),
-                                                            mlaw.getCLengthLaw(),mlaw.getDamageLaw());
-}
-
 nonLocalDamageHyperelasticDG3DIPVariable::nonLocalDamageHyperelasticDG3DIPVariable(const mlawNonLocalDamagePowerYieldHyper &mlaw, const bool oninter)
           :nonLocalDamageDG3DIPVariableBase(oninter,1)
 {
-  _nldHyperipv = new IPNonLocalDamageHyperelasic(mlaw.getConstRefToCompressionHardening(),
+  _nldHyperipv = new IPHyperViscoElastoPlasticNonLocalDamage(mlaw.getConstRefToCompressionHardening(),
                                                             mlaw.getConstRefToTractionHardening(),
                                                             mlaw.getConstRefToShearHardening(),
                                                             mlaw.getConstRefToKinematicHardening(),
@@ -36,7 +25,7 @@ nonLocalDamageHyperelasticDG3DIPVariable::nonLocalDamageHyperelasticDG3DIPVariab
   nonLocalDamageHyperelasticDG3DIPVariable::nonLocalDamageHyperelasticDG3DIPVariable(const nonLocalDamageHyperelasticDG3DIPVariable &source):
           nonLocalDamageDG3DIPVariableBase(source)
 {
-  _nldHyperipv = new IPNonLocalDamageHyperelasic(*source._nldHyperipv);
+  _nldHyperipv = new IPHyperViscoElastoPlasticNonLocalDamage(*source._nldHyperipv);
 }
 
 nonLocalDamageHyperelasticDG3DIPVariable& nonLocalDamageHyperelasticDG3DIPVariable::operator=(const IPVariable &source){
@@ -53,80 +42,61 @@ double nonLocalDamageHyperelasticDG3DIPVariable::get(const int i) const
 {
   if(i == IPField::PLASTICSTRAIN)
   {
-    return getIPNonLocalDamageHyperelastic()->getCurrentPlasticStrain();
+    return getIPHyperViscoElastoPlasticNonLocalDamage()->getCurrentPlasticStrain();
   }
   else if (i == IPField::NONLOCAL_PLASTICSTRAIN){
-    return getIPNonLocalDamageHyperelastic()->getEffectivePlasticStrain();
+    return getIPHyperViscoElastoPlasticNonLocalDamage()->getEffectivePlasticStrain();
   }
   else if(i == IPField::DAMAGE)
   {
-    return getIPNonLocalDamageHyperelastic()->getDamage();
+    return getIPHyperViscoElastoPlasticNonLocalDamage()->getDamage();
   }
   else if (i == IPField::DAMAGE0){
-    return getIPNonLocalDamageHyperelastic()->getDamage();
+    return getIPHyperViscoElastoPlasticNonLocalDamage()->getDamage();
   }
   else if (i == IPField::PLASTIC_POISSON_RATIO){
-    return getIPNonLocalDamageHyperelastic()->_nup;
+    return getIPHyperViscoElastoPlasticNonLocalDamage()->_nup;
   }
   else if (i == IPField::PLASTICSTRAIN_COMPRESSION){
-    return getIPNonLocalDamageHyperelastic()->getConstRefToCompressionPlasticStrain();
+    return getIPHyperViscoElastoPlasticNonLocalDamage()->getConstRefToCompressionPlasticStrain();
   }
   else if (i == IPField::PLASTICSTRAIN_TRACTION){
-    return getIPNonLocalDamageHyperelastic()->getConstRefToTractionPlasticStrain();
+    return getIPHyperViscoElastoPlasticNonLocalDamage()->getConstRefToTractionPlasticStrain();
   }
   else if (i == IPField::PLASTICSTRAIN_SHEAR){
-    return getIPNonLocalDamageHyperelastic()->getConstRefToShearPlasticStrain();
+    return getIPHyperViscoElastoPlasticNonLocalDamage()->getConstRefToShearPlasticStrain();
   }
   else if (i == IPField::BACKSTRESS){
-   if (getIPNonLocalDamageHyperelastic()->_ipKinematic!= NULL)
-      return getIPNonLocalDamageHyperelastic()->_ipKinematic->getR();
+   if (getIPHyperViscoElastoPlasticNonLocalDamage()->_ipKinematic!= NULL)
+      return getIPHyperViscoElastoPlasticNonLocalDamage()->_ipKinematic->getR();
     else
       return 0.;
   }
-  else if (i == IPField::ELASTIC_JACOBIAN){
-    return getIPNonLocalDamageHyperelastic()->getConstRefToElasticJacobian();
-  }
-  else if (i == IPField::PLASTIC_JACOBIAN){
-    return getIPNonLocalDamageHyperelastic()->getConstRefToPlasticJacobian();
-  }
   else if (i == IPField::PLASTIC_RATE){
-    return getIPNonLocalDamageHyperelastic()->getConstRefToPlasticDeformationRate();
-  }
-  else if (i == IPField::FLOW_FACTOR_RATE){
-    return getIPNonLocalDamageHyperelastic()->getConstRefToFlowFactorRate();
-  }
-  else if (i == IPField::OCTAHEDRAL_NORM_STRAIN_RATE){
-    const STensor3& D = getIPNonLocalDamageHyperelastic()->_strainRate;
-    return (D(0,0)+D(1,1)+D(2,2))/3.;
-  }
-  else if (i == IPField::OCTAHEDRAL_SHEAR_STRAIN_RATE){
-    const STensor3& D = getIPNonLocalDamageHyperelastic()->_strainRate;
-    STensor3 Ddev = D.dev();
-    double J2  = 0.5*Ddev.dotprod();
-    return 2.*sqrt(6.*J2)/3.;
+    return getIPHyperViscoElastoPlasticNonLocalDamage()->getConstRefToPlasticDeformationRate();
   }
   else if (i == IPField::K_XX){
-    const STensor3& K = getIPNonLocalDamageHyperelastic()->_kirchhoff;
+    const STensor3& K = getIPHyperViscoElastoPlasticNonLocalDamage()->_kirchhoff;
     return K(0,0);
   }
   else if (i == IPField::K_YY){
-    const STensor3& K = getIPNonLocalDamageHyperelastic()->_kirchhoff;
+    const STensor3& K = getIPHyperViscoElastoPlasticNonLocalDamage()->_kirchhoff;
     return K(1,1);
   }
   else if (i == IPField::K_ZZ){
-    const STensor3& K = getIPNonLocalDamageHyperelastic()->_kirchhoff;
+    const STensor3& K = getIPHyperViscoElastoPlasticNonLocalDamage()->_kirchhoff;
     return K(2,2);
   }
   else if (i == IPField::K_XY){
-    const STensor3& K = getIPNonLocalDamageHyperelastic()->_kirchhoff;
+    const STensor3& K = getIPHyperViscoElastoPlasticNonLocalDamage()->_kirchhoff;
     return K(0,1);
   }
   else if (i == IPField::K_YZ){
-    const STensor3& K = getIPNonLocalDamageHyperelastic()->_kirchhoff;
+    const STensor3& K = getIPHyperViscoElastoPlasticNonLocalDamage()->_kirchhoff;
     return K(1,2);
   }
   else if (i == IPField::K_XZ){
-    const STensor3& K = getIPNonLocalDamageHyperelastic()->_kirchhoff;
+    const STensor3& K = getIPHyperViscoElastoPlasticNonLocalDamage()->_kirchhoff;
     return K(0,2);
   }
   else
@@ -136,16 +106,16 @@ double nonLocalDamageHyperelasticDG3DIPVariable::get(const int i) const
 }
 double nonLocalDamageHyperelasticDG3DIPVariable::defoEnergy() const
 {
-  return getIPNonLocalDamageHyperelastic()->defoEnergy();
+  return getIPHyperViscoElastoPlasticNonLocalDamage()->defoEnergy();
 }
 double nonLocalDamageHyperelasticDG3DIPVariable::plasticEnergy() const
 {
-  return getIPNonLocalDamageHyperelastic()->plasticEnergy();
+  return getIPHyperViscoElastoPlasticNonLocalDamage()->plasticEnergy();
 }
 
 double nonLocalDamageHyperelasticDG3DIPVariable::getConstRefToLocalVariable(const int idex) const{
   if (idex == 0){
-    return getIPNonLocalDamageHyperelastic()->getCurrentPlasticStrain();
+    return getIPHyperViscoElastoPlasticNonLocalDamage()->getCurrentPlasticStrain();
   }
   else{
     Msg::Fatal("the non-local variable %d is not defined",idex);
@@ -153,7 +123,7 @@ double nonLocalDamageHyperelasticDG3DIPVariable::getConstRefToLocalVariable(cons
 };
 double& nonLocalDamageHyperelasticDG3DIPVariable::getRefToLocalVariable(const int idex){
   if (idex == 0){
-    return getIPNonLocalDamageHyperelastic()->getRefToCurrentPlasticStrain();
+    return getIPHyperViscoElastoPlasticNonLocalDamage()->getRefToCurrentPlasticStrain();
   }
   else{
     Msg::Fatal("the non-local variable %d is not defined",idex);
@@ -162,7 +132,7 @@ double& nonLocalDamageHyperelasticDG3DIPVariable::getRefToLocalVariable(const in
 
 double nonLocalDamageHyperelasticDG3DIPVariable::getConstRefToNonLocalVariable(const int idex) const{
   if (idex == 0){
-    return getIPNonLocalDamageHyperelastic()->getEffectivePlasticStrain();
+    return getIPHyperViscoElastoPlasticNonLocalDamage()->getEffectivePlasticStrain();
   }
   else{
     Msg::Fatal("the non-local variable %d is not defined",idex);
@@ -170,7 +140,7 @@ double nonLocalDamageHyperelasticDG3DIPVariable::getConstRefToNonLocalVariable(c
 };
 double& nonLocalDamageHyperelasticDG3DIPVariable::getRefToNonLocalVariable(const int idex){
   if (idex == 0){
-    return getIPNonLocalDamageHyperelastic()->getRefToEffectivePlasticStrain();
+    return getIPHyperViscoElastoPlasticNonLocalDamage()->getRefToEffectivePlasticStrain();
   }
   else{
     Msg::Fatal("the non-local variable %d is not defined",idex);
@@ -189,7 +159,7 @@ void nonLocalDamageHyperelasticDG3DIPVariable::restart()
 nonLocalDamageHyperelasticDG3DIPVariableWithFailure::nonLocalDamageHyperelasticDG3DIPVariableWithFailure(const mlawNonLocalDamagePowerYieldHyperWithFailure &mlaw, const bool oninter)
           :nonLocalDamageDG3DIPVariableBase(oninter,2)
 {
-  _nldHyperipv = new IPNonLocalDamageHyperelasicWithFailure(mlaw.getConstRefToCompressionHardening(),
+  _nldHyperipv = new IPHyperViscoElastoPlasticMultipleNonLocalDamage(mlaw.getConstRefToCompressionHardening(),
                                                             mlaw.getConstRefToTractionHardening(),
                                                             mlaw.getConstRefToShearHardening(),
                                                             mlaw.getConstRefToKinematicHardening(),
@@ -200,7 +170,7 @@ nonLocalDamageHyperelasticDG3DIPVariableWithFailure::nonLocalDamageHyperelasticD
   nonLocalDamageHyperelasticDG3DIPVariableWithFailure::nonLocalDamageHyperelasticDG3DIPVariableWithFailure(const nonLocalDamageHyperelasticDG3DIPVariableWithFailure &source):
           nonLocalDamageDG3DIPVariableBase(source)
 {
-  _nldHyperipv = new IPNonLocalDamageHyperelasicWithFailure(*source._nldHyperipv);
+  _nldHyperipv = new IPHyperViscoElastoPlasticMultipleNonLocalDamage(*source._nldHyperipv);
 }
 
 nonLocalDamageHyperelasticDG3DIPVariableWithFailure& nonLocalDamageHyperelasticDG3DIPVariableWithFailure::operator=(const IPVariable &source){
@@ -217,95 +187,76 @@ double nonLocalDamageHyperelasticDG3DIPVariableWithFailure::get(const int i) con
 {
   if(i == IPField::PLASTICSTRAIN)
   {
-    return getIPNonLocalDamageHyperelasticWithFailure()->getCurrentPlasticStrain();
+    return getIPHyperViscoElastoPlasticMultipleNonLocalDamage()->getCurrentPlasticStrain();
   }
   else if (i == IPField::NONLOCAL_PLASTICSTRAIN){
-    return getIPNonLocalDamageHyperelasticWithFailure()->getEffectivePlasticStrain();
+    return getIPHyperViscoElastoPlasticMultipleNonLocalDamage()->getEffectivePlasticStrain();
   }
   else if (i == IPField::FAILURE_ONSET){
-    return getIPNonLocalDamageHyperelasticWithFailure()->getFailureOnset();
+    return getIPHyperViscoElastoPlasticMultipleNonLocalDamage()->getFailureOnset();
   }
   else if (i == IPField::NONLOCAL_FAILURE_PLASTICSTRAIN){
-    return getIPNonLocalDamageHyperelasticWithFailure()->getNonLocalFailurePlasticity();
+    return getIPHyperViscoElastoPlasticMultipleNonLocalDamage()->getNonLocalFailurePlasticity();
   }
   else if(i == IPField::DAMAGE)
   {
     double OneminusD = 1;
-    int n =  this->getIPNonLocalDamageHyperelasticWithFailure()->getNumNonLocalVariable();
+    int n =  this->getIPHyperViscoElastoPlasticMultipleNonLocalDamage()->getNumNonLocalVariable();
     for (int iter =0; iter < n; iter ++){
-      double Diter = this->getIPNonLocalDamageHyperelasticWithFailure()->getDamage(iter);
+      double Diter = this->getIPHyperViscoElastoPlasticMultipleNonLocalDamage()->getDamage(iter);
       OneminusD *= (1.- Diter);
     }
     return (1.- OneminusD);
   }
   else if (i == IPField::DAMAGE0){
-    return getIPNonLocalDamageHyperelasticWithFailure()->getDamage(0);
+    return getIPHyperViscoElastoPlasticMultipleNonLocalDamage()->getDamage(0);
   }
   else if (i == IPField::DAMAGE1){
-    return getIPNonLocalDamageHyperelasticWithFailure()->getDamage(1);
+    return getIPHyperViscoElastoPlasticMultipleNonLocalDamage()->getDamage(1);
   }
   else if (i == IPField::PLASTIC_POISSON_RATIO){
-    return getIPNonLocalDamageHyperelasticWithFailure()->_nup;
+    return getIPHyperViscoElastoPlasticMultipleNonLocalDamage()->_nup;
   }
   else if (i == IPField::PLASTICSTRAIN_COMPRESSION){
-    return getIPNonLocalDamageHyperelasticWithFailure()->getConstRefToCompressionPlasticStrain();
+    return getIPHyperViscoElastoPlasticMultipleNonLocalDamage()->getConstRefToCompressionPlasticStrain();
   }
   else if (i == IPField::PLASTICSTRAIN_TRACTION){
-    return getIPNonLocalDamageHyperelasticWithFailure()->getConstRefToTractionPlasticStrain();
+    return getIPHyperViscoElastoPlasticMultipleNonLocalDamage()->getConstRefToTractionPlasticStrain();
   }
   else if (i == IPField::PLASTICSTRAIN_SHEAR){
-    return getIPNonLocalDamageHyperelasticWithFailure()->getConstRefToShearPlasticStrain();
+    return getIPHyperViscoElastoPlasticMultipleNonLocalDamage()->getConstRefToShearPlasticStrain();
   }
   else if (i == IPField::BACKSTRESS){
-   if (getIPNonLocalDamageHyperelasticWithFailure()->_ipKinematic!= NULL)
-      return getIPNonLocalDamageHyperelasticWithFailure()->_ipKinematic->getR();
+   if (getIPHyperViscoElastoPlasticMultipleNonLocalDamage()->_ipKinematic!= NULL)
+      return getIPHyperViscoElastoPlasticMultipleNonLocalDamage()->_ipKinematic->getR();
     else
       return 0.;
   }
-  else if (i == IPField::ELASTIC_JACOBIAN){
-    return getIPNonLocalDamageHyperelasticWithFailure()->getConstRefToElasticJacobian();
-  }
-  else if (i == IPField::PLASTIC_JACOBIAN){
-    return getIPNonLocalDamageHyperelasticWithFailure()->getConstRefToPlasticJacobian();
-  }
   else if (i == IPField::PLASTIC_RATE){
-    return getIPNonLocalDamageHyperelasticWithFailure()->getConstRefToPlasticDeformationRate();
-  }
-  else if (i == IPField::FLOW_FACTOR_RATE){
-    return getIPNonLocalDamageHyperelasticWithFailure()->getConstRefToFlowFactorRate();
-  }
-  else if (i == IPField::OCTAHEDRAL_NORM_STRAIN_RATE){
-    const STensor3& D = getIPNonLocalDamageHyperelasticWithFailure()->_strainRate;
-    return (D(0,0)+D(1,1)+D(2,2))/3.;
-  }
-  else if (i == IPField::OCTAHEDRAL_SHEAR_STRAIN_RATE){
-    const STensor3& D = getIPNonLocalDamageHyperelasticWithFailure()->_strainRate;
-    STensor3 Ddev = D.dev();
-    double J2  = 0.5*Ddev.dotprod();
-    return 2.*sqrt(6.*J2)/3.;
+    return getIPHyperViscoElastoPlasticMultipleNonLocalDamage()->getConstRefToPlasticDeformationRate();
   }
   else if (i == IPField::K_XX){
-    const STensor3& K = getIPNonLocalDamageHyperelasticWithFailure()->_kirchhoff;
+    const STensor3& K = getIPHyperViscoElastoPlasticMultipleNonLocalDamage()->_kirchhoff;
     return K(0,0);
   }
   else if (i == IPField::K_YY){
-    const STensor3& K = getIPNonLocalDamageHyperelasticWithFailure()->_kirchhoff;
+    const STensor3& K = getIPHyperViscoElastoPlasticMultipleNonLocalDamage()->_kirchhoff;
     return K(1,1);
   }
   else if (i == IPField::K_ZZ){
-    const STensor3& K = getIPNonLocalDamageHyperelasticWithFailure()->_kirchhoff;
+    const STensor3& K = getIPHyperViscoElastoPlasticMultipleNonLocalDamage()->_kirchhoff;
     return K(2,2);
   }
   else if (i == IPField::K_XY){
-    const STensor3& K = getIPNonLocalDamageHyperelasticWithFailure()->_kirchhoff;
+    const STensor3& K = getIPHyperViscoElastoPlasticMultipleNonLocalDamage()->_kirchhoff;
     return K(0,1);
   }
   else if (i == IPField::K_YZ){
-    const STensor3& K = getIPNonLocalDamageHyperelasticWithFailure()->_kirchhoff;
+    const STensor3& K = getIPHyperViscoElastoPlasticMultipleNonLocalDamage()->_kirchhoff;
     return K(1,2);
   }
   else if (i == IPField::K_XZ){
-    const STensor3& K = getIPNonLocalDamageHyperelasticWithFailure()->_kirchhoff;
+    const STensor3& K = getIPHyperViscoElastoPlasticMultipleNonLocalDamage()->_kirchhoff;
     return K(0,2);
   }
   else
@@ -315,19 +266,19 @@ double nonLocalDamageHyperelasticDG3DIPVariableWithFailure::get(const int i) con
 }
 double nonLocalDamageHyperelasticDG3DIPVariableWithFailure::defoEnergy() const
 {
-  return getIPNonLocalDamageHyperelasticWithFailure()->defoEnergy();
+  return getIPHyperViscoElastoPlasticMultipleNonLocalDamage()->defoEnergy();
 }
 double nonLocalDamageHyperelasticDG3DIPVariableWithFailure::plasticEnergy() const
 {
-  return getIPNonLocalDamageHyperelasticWithFailure()->plasticEnergy();
+  return getIPHyperViscoElastoPlasticMultipleNonLocalDamage()->plasticEnergy();
 }
 
 double nonLocalDamageHyperelasticDG3DIPVariableWithFailure::getConstRefToLocalVariable(const int idex) const{
   if (idex == 0){
-    return getIPNonLocalDamageHyperelasticWithFailure()->getCurrentPlasticStrain();
+    return getIPHyperViscoElastoPlasticMultipleNonLocalDamage()->getCurrentPlasticStrain();
   }
   else if (idex == 1){
-    return getIPNonLocalDamageHyperelasticWithFailure()->getFailurePlasticity();
+    return getIPHyperViscoElastoPlasticMultipleNonLocalDamage()->getFailurePlasticity();
   }
   else{
     Msg::Fatal("the non-local variable %d is not defined",idex);
@@ -335,10 +286,10 @@ double nonLocalDamageHyperelasticDG3DIPVariableWithFailure::getConstRefToLocalVa
 };
 double& nonLocalDamageHyperelasticDG3DIPVariableWithFailure::getRefToLocalVariable(const int idex){
   if (idex == 0){
-    return getIPNonLocalDamageHyperelasticWithFailure()->getRefToCurrentPlasticStrain();
+    return getIPHyperViscoElastoPlasticMultipleNonLocalDamage()->getRefToCurrentPlasticStrain();
   }
   else if (idex == 1){
-    return getIPNonLocalDamageHyperelasticWithFailure()->getRefToFailurePlasticity();
+    return getIPHyperViscoElastoPlasticMultipleNonLocalDamage()->getRefToFailurePlasticity();
   }
   else{
     Msg::Fatal("the non-local variable %d is not defined",idex);
@@ -347,10 +298,10 @@ double& nonLocalDamageHyperelasticDG3DIPVariableWithFailure::getRefToLocalVariab
 
 double nonLocalDamageHyperelasticDG3DIPVariableWithFailure::getConstRefToNonLocalVariable(const int idex) const{
   if (idex == 0){
-    return getIPNonLocalDamageHyperelasticWithFailure()->getEffectivePlasticStrain();
+    return getIPHyperViscoElastoPlasticMultipleNonLocalDamage()->getEffectivePlasticStrain();
   }
   else if (idex == 1){
-    return getIPNonLocalDamageHyperelasticWithFailure()->getNonLocalFailurePlasticity();
+    return getIPHyperViscoElastoPlasticMultipleNonLocalDamage()->getNonLocalFailurePlasticity();
   }
   else{
     Msg::Fatal("the non-local variable %d is not defined",idex);
@@ -358,10 +309,10 @@ double nonLocalDamageHyperelasticDG3DIPVariableWithFailure::getConstRefToNonLoca
 };
 double& nonLocalDamageHyperelasticDG3DIPVariableWithFailure::getRefToNonLocalVariable(const int idex){
   if (idex == 0){
-    return getIPNonLocalDamageHyperelasticWithFailure()->getRefToEffectivePlasticStrain();
+    return getIPHyperViscoElastoPlasticMultipleNonLocalDamage()->getRefToEffectivePlasticStrain();
   }
   else if (idex == 1){
-    return getIPNonLocalDamageHyperelasticWithFailure()->getRefToNonLocalFailurePlasticity();
+    return getIPHyperViscoElastoPlasticMultipleNonLocalDamage()->getRefToNonLocalFailurePlasticity();
   }
   else{
     Msg::Fatal("the non-local variable %d is not defined",idex);
diff --git a/dG3D/src/nonLocalDamageHyperelasticDG3DIPVariable.h b/dG3D/src/nonLocalDamageHyperelasticDG3DIPVariable.h
index 267f1af158b0cd3469610543c712a283ef339e3f..202e3e104632cea8eee6d30c910843098a40778f 100644
--- a/dG3D/src/nonLocalDamageHyperelasticDG3DIPVariable.h
+++ b/dG3D/src/nonLocalDamageHyperelasticDG3DIPVariable.h
@@ -16,17 +16,16 @@
 
 class nonLocalDamageHyperelasticDG3DIPVariable: public nonLocalDamageDG3DIPVariableBase{
   protected:
-    IPNonLocalDamageHyperelasic *_nldHyperipv;
+    IPHyperViscoElastoPlasticNonLocalDamage *_nldHyperipv;
 
   public:
-    nonLocalDamageHyperelasticDG3DIPVariable(const mlawNonLocalDamageQuadYieldHyper &mlaw, const bool oninter=false);
     nonLocalDamageHyperelasticDG3DIPVariable(const mlawNonLocalDamagePowerYieldHyper &mlaw, const bool oninter=false);
     nonLocalDamageHyperelasticDG3DIPVariable(const nonLocalDamageHyperelasticDG3DIPVariable &source);
     virtual nonLocalDamageHyperelasticDG3DIPVariable& operator=(const IPVariable &source);
 
    /* specific function */
-    IPNonLocalDamageHyperelasic* getIPNonLocalDamageHyperelastic(){return _nldHyperipv;}
-    const IPNonLocalDamageHyperelasic* getIPNonLocalDamageHyperelastic() const{return _nldHyperipv;}
+    IPHyperViscoElastoPlasticNonLocalDamage* getIPHyperViscoElastoPlasticNonLocalDamage(){return _nldHyperipv;}
+    const IPHyperViscoElastoPlasticNonLocalDamage* getIPHyperViscoElastoPlasticNonLocalDamage() const{return _nldHyperipv;}
     virtual ~nonLocalDamageHyperelasticDG3DIPVariable()
     {
       if (_nldHyperipv)
@@ -38,13 +37,6 @@ class nonLocalDamageHyperelasticDG3DIPVariable: public nonLocalDamageDG3DIPVaria
     virtual void setBulkCriticalDamage(const double DT){_nldHyperipv->setCriticalDamage(DT);};
     virtual double getBulkCriticalDamage() const {return _nldHyperipv->getCriticalDamage();};
 
-    virtual const STensor3& getConstRefToEffectiveFirstPiolaKirchhoffStress() const {return _nldHyperipv->getConstRefToEffectiveFirstPKStress();};
-    virtual STensor3 &getRefToEffectiveFirstPiolaKirchhoffStress() {return _nldHyperipv->getRefToEffectiveFirstPKStress();};
-
-    virtual const STensor43 &getConstRefToEffectiveTangentModuli() const {return _nldHyperipv->getConstRefToEffectiveTangentModuli();};
-    virtual STensor43 &getRefToEffectiveTangentModuli() {return _nldHyperipv->getRefToEffectiveTangentModuli();};
-
-
     virtual double getConstRefToLocalVariable(const int idex) const;
     virtual double& getRefToLocalVariable(const int idex);
 
@@ -55,6 +47,7 @@ class nonLocalDamageHyperelasticDG3DIPVariable: public nonLocalDamageDG3DIPVaria
     virtual double get(const int i) const;
     virtual double defoEnergy() const;
     virtual double plasticEnergy() const;
+    virtual double damageEnergy() const {return _nldHyperipv->damageEnergy();};
     virtual const STensor3 &getConstRefToCharacteristicLengthMatrix(const int idex) const
     {
       if (idex == 0)
@@ -62,6 +55,32 @@ class nonLocalDamageHyperelasticDG3DIPVariable: public nonLocalDamageDG3DIPVaria
       else
         Msg::Fatal("the non-local damge id = %d is not defined",idex);
     }
+    
+    // for path following based on irreversibe energt
+    virtual double irreversibleEnergy() const {return _nldHyperipv->irreversibleEnergy();};
+    virtual double& getRefToIrreversibleEnergy() {return _nldHyperipv->getRefToIrreversibleEnergy();};
+
+    virtual const STensor3& getConstRefToDIrreversibleEnergyDDeformationGradient() const 
+      {return _nldHyperipv->getConstRefToDIrreversibleEnergyDF();};
+    virtual STensor3& getRefToDIrreversibleEnergyDDeformationGradient() 
+      {return _nldHyperipv->getRefToDIrreversibleEnergyDF();};
+      
+    virtual const double& getConstRefToDIrreversibleEnergyDNonLocalVariable(const int index) const 
+    {
+      if (index == 0)
+        {
+        return _nldHyperipv->getDIrreversibleEnergyDNonLocalVariable();
+        }
+      else{Msg::Fatal("the non-local variable %d is not defined",index);}
+    };
+    virtual double& getRefToDIrreversibleEnergyDDNonLocalVariable(const int index) 
+    {
+      if (index == 0)
+      {
+        return _nldHyperipv->getRefToDIrreversibleEnergyDNonLocalVariable();
+      }
+      else{Msg::Fatal("the non-local variable %d is not defined",index);}
+    };  
 
     virtual IPVariable* clone() const {return new nonLocalDamageHyperelasticDG3DIPVariable(*this);};
     virtual void restart();
@@ -69,7 +88,7 @@ class nonLocalDamageHyperelasticDG3DIPVariable: public nonLocalDamageDG3DIPVaria
 
 class nonLocalDamageHyperelasticDG3DIPVariableWithFailure: public nonLocalDamageDG3DIPVariableBase{
   protected:
-    IPNonLocalDamageHyperelasicWithFailure *_nldHyperipv;
+    IPHyperViscoElastoPlasticMultipleNonLocalDamage *_nldHyperipv;
 
   public:
     nonLocalDamageHyperelasticDG3DIPVariableWithFailure(const mlawNonLocalDamagePowerYieldHyperWithFailure &mlaw, const bool oninter=false);
@@ -77,8 +96,8 @@ class nonLocalDamageHyperelasticDG3DIPVariableWithFailure: public nonLocalDamage
     virtual nonLocalDamageHyperelasticDG3DIPVariableWithFailure& operator=(const IPVariable &source);
 
    /* specific function */
-    IPNonLocalDamageHyperelasicWithFailure* getIPNonLocalDamageHyperelasticWithFailure(){return _nldHyperipv;}
-    const IPNonLocalDamageHyperelasicWithFailure* getIPNonLocalDamageHyperelasticWithFailure() const{return _nldHyperipv;}
+    IPHyperViscoElastoPlasticMultipleNonLocalDamage* getIPHyperViscoElastoPlasticMultipleNonLocalDamage(){return _nldHyperipv;}
+    const IPHyperViscoElastoPlasticMultipleNonLocalDamage* getIPHyperViscoElastoPlasticMultipleNonLocalDamage() const{return _nldHyperipv;}
     virtual ~nonLocalDamageHyperelasticDG3DIPVariableWithFailure()
     {
       if (_nldHyperipv)
@@ -90,13 +109,6 @@ class nonLocalDamageHyperelasticDG3DIPVariableWithFailure: public nonLocalDamage
     virtual void setBulkCriticalDamage(const double DT){_nldHyperipv->setCriticalDamage(DT);};
     virtual double getBulkCriticalDamage() const {return _nldHyperipv->getCriticalDamage();};
 
-    virtual const STensor3& getConstRefToEffectiveFirstPiolaKirchhoffStress() const {return _nldHyperipv->getConstRefToEffectiveFirstPKStress();};
-    virtual STensor3 &getRefToEffectiveFirstPiolaKirchhoffStress() {return _nldHyperipv->getRefToEffectiveFirstPKStress();};
-
-    virtual const STensor43 &getConstRefToEffectiveTangentModuli() const {return _nldHyperipv->getConstRefToEffectiveTangentModuli();};
-    virtual STensor43 &getRefToEffectiveTangentModuli() {return _nldHyperipv->getRefToEffectiveTangentModuli();};
-
-
     virtual double getConstRefToLocalVariable(const int idex) const;
     virtual double& getRefToLocalVariable(const int idex);
 
@@ -107,11 +119,32 @@ class nonLocalDamageHyperelasticDG3DIPVariableWithFailure: public nonLocalDamage
     virtual double get(const int i) const;
     virtual double defoEnergy() const;
     virtual double plasticEnergy() const;
+    virtual double damageEnergy() const {return _nldHyperipv->damageEnergy();};
 
     virtual const STensor3 &getConstRefToCharacteristicLengthMatrix(const int idex) const
     {
       return _nldHyperipv->getConstRefToCharacteristicLength(idex);
     }
+    
+    // for path following based on irreversibe energt
+    virtual double irreversibleEnergy() const {return _nldHyperipv->irreversibleEnergy();};
+    virtual double& getRefToIrreversibleEnergy() {return _nldHyperipv->getRefToIrreversibleEnergy();};
+
+    virtual const STensor3& getConstRefToDIrreversibleEnergyDDeformationGradient() const {
+      return _nldHyperipv->getConstRefToDIrreversibleEnergyDF();
+    };
+    virtual STensor3& getRefToDIrreversibleEnergyDDeformationGradient(){
+      return _nldHyperipv->getRefToDIrreversibleEnergyDF();
+    };
+      
+    virtual const double& getConstRefToDIrreversibleEnergyDNonLocalVariable(const int index) const 
+    {
+      return _nldHyperipv->getDIrreversibleEnergyDNonLocalVariable(index);
+    };
+    virtual double& getRefToDIrreversibleEnergyDDNonLocalVariable(const int index) 
+    {
+      return _nldHyperipv->getRefToDIrreversibleEnergyDNonLocalVariable(index);
+    };  
 
     virtual IPVariable* clone() const {return new nonLocalDamageHyperelasticDG3DIPVariableWithFailure(*this);};
     virtual void restart();
diff --git a/dG3D/src/pathFollowingTerms.cpp b/dG3D/src/pathFollowingTerms.cpp
index deeee14673719822ae7ca4aefc5636cdc8de59c6..17ee48375bdb705f7571c5d4d50c99f7fc3095fd 100644
--- a/dG3D/src/pathFollowingTerms.cpp
+++ b/dG3D/src/pathFollowingTerms.cpp
@@ -441,7 +441,6 @@ void dG3DNonLocalDissipationPathFollowingBulkLinearTerm::get(MElement *ele,int n
 		int numNonLocalVar = ipv->getNumberNonLocalVariable();
 		for (int inl =0; inl < numNonLocalVar; inl++){
 			const double & DdamEnergyDNonLocalVar = ipv->getConstRefToDIrreversibleEnergyDNonLocalVariable(inl);
-			
 			for (int k=0; k< nbFF; k++){
 				m(k+inl*nbFF+3*nbFF) += DdamEnergyDNonLocalVar*Vals[k+ inl*nbFF+3*nbFF]*detJ*weight;
 			}
diff --git a/dgshell/benchmarks/nlbeam/beam.py b/dgshell/benchmarks/nlbeam/beam.py
index 3f45c211951ab4b9112dfcbe5505d489676665a4..fc2876b847b3608f75d3e8c5874de0898ba8dccc 100644
--- a/dgshell/benchmarks/nlbeam/beam.py
+++ b/dgshell/benchmarks/nlbeam/beam.py
@@ -76,7 +76,7 @@ try:
     import linecache
     lineforce = linecache.getline('force41comp2.csv',7)
     linedisp = linecache.getline('NodalDisplacement2comp2.csv',3)
-    lineener = linecache.getline('energy.csv',8)
+    lineener = linecache.getline('energy.csv',7)
 except:
     print('Cannot get the results in the files')
     import os
diff --git a/dgshell/src/dgNonLinearShellMaterial.h b/dgshell/src/dgNonLinearShellMaterial.h
index c1554b2d1cdf5c5d9c2875bfbbb53f9566df4a67..1c5c8028d5d3cb4b2ef115f6de771dd820aaf3a2 100644
--- a/dgshell/src/dgNonLinearShellMaterial.h
+++ b/dgshell/src/dgNonLinearShellMaterial.h
@@ -118,7 +118,7 @@ class J2linearShellLaw : public dgNonLinearShellMaterialLaw
   virtual void stresst33(const IPStateBase *ips,const int npoint, double &t33, double &t33rel) const; //t33rel is the relative value divided by a material constant used to check convergence
 	virtual materialLaw* clone() const {return new J2linearShellLaw(*this);};
 	virtual bool withEnergyDissipation() const {return _j2law.withEnergyDissipation();}
-	virtual void setMacroSolver(nonLinearMechSolver* sv){
+	virtual void setMacroSolver(const nonLinearMechSolver* sv){
 		dgNonLinearShellMaterialLaw::setMacroSolver(sv);
 		_j2law.setMacroSolver(sv);
 	}