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); }