diff --git a/NonLinearSolver/internalPoints/ipMullinsEffect.cpp b/NonLinearSolver/internalPoints/ipMullinsEffect.cpp index 99537d3102cd264b3588efe24307825c24f6ad8b..a8044ed2a3ec3b7a636b416bf31dafad014d55f6 100644 --- a/NonLinearSolver/internalPoints/ipMullinsEffect.cpp +++ b/NonLinearSolver/internalPoints/ipMullinsEffect.cpp @@ -11,7 +11,7 @@ #include "ipMullinsEffect.h" IPMullinsEffect::IPMullinsEffect(): eta(1.0), DetaDpsi(0.), DDetaDpsipsi(0.), DetaDT(0.), DDetaDTT(0.), psiMax(0.), - DpsiNew_DpsiMax(0.), DDpsiNew_DpsiMaxDpsi(0.), DDpsiNew_DpsiMaxDT(0.) + DpsiNew_DpsiMax(0.), DDpsiNew_DpsiMaxDpsi(0.), DDpsiNew_DpsiMaxDT(0.), DpsiMax_Dpsi(0.) { } @@ -26,6 +26,7 @@ IPMullinsEffect::IPMullinsEffect(const IPMullinsEffect &source) DpsiNew_DpsiMax = source.DpsiNew_DpsiMax; DDpsiNew_DpsiMaxDpsi = source.DDpsiNew_DpsiMaxDpsi; DDpsiNew_DpsiMaxDT = source.DDpsiNew_DpsiMaxDT; + DpsiMax_Dpsi = source.DpsiMax_Dpsi; } IPMullinsEffect &IPMullinsEffect::operator=(const IPMullinsEffect &source) @@ -39,6 +40,7 @@ IPMullinsEffect &IPMullinsEffect::operator=(const IPMullinsEffect &source) DpsiNew_DpsiMax = source.DpsiNew_DpsiMax; DDpsiNew_DpsiMaxDpsi = source.DDpsiNew_DpsiMaxDpsi; DDpsiNew_DpsiMaxDT = source.DDpsiNew_DpsiMaxDT; + DpsiMax_Dpsi = source.DpsiMax_Dpsi; return *this; } @@ -53,5 +55,6 @@ void IPMullinsEffect::restart() restartManager::restart(DpsiNew_DpsiMax); restartManager::restart(DDpsiNew_DpsiMaxDpsi); restartManager::restart(DDpsiNew_DpsiMaxDT); + restartManager::restart(DpsiMax_Dpsi); return; } diff --git a/NonLinearSolver/internalPoints/ipMullinsEffect.h b/NonLinearSolver/internalPoints/ipMullinsEffect.h index 460699d19c96d16b2b92ddb95baa3ba5de859995..cbd10de2be8f724bf69a8a96d7a5d1867a7ce692 100644 --- a/NonLinearSolver/internalPoints/ipMullinsEffect.h +++ b/NonLinearSolver/internalPoints/ipMullinsEffect.h @@ -25,6 +25,7 @@ class IPMullinsEffect{ double DpsiNew_DpsiMax; double DDpsiNew_DpsiMaxDpsi; double DDpsiNew_DpsiMaxDT; + double DpsiMax_Dpsi; public: IPMullinsEffect(); @@ -44,6 +45,7 @@ class IPMullinsEffect{ virtual double getDpsiNew_DpsiMax() const{ return DpsiNew_DpsiMax;}; virtual double getDDpsiNew_DpsiMaxDpsi() const{ return DDpsiNew_DpsiMaxDpsi;}; virtual double getDDpsiNew_DpsiMaxDT() const{ return DDpsiNew_DpsiMaxDT;}; + virtual double getDpsiMax_Dpsi() const{ return DpsiMax_Dpsi;}; virtual void set(const double &_eta, const double &_DetaDpsi, const double& _DDetaDpsipsi, const double& _DetaDT, const double& _DDetaDTT, const double& _DpsiNew_DpsiMax, const double& _DDpsiNew_DpsiMaxDpsi, const double& _DDpsiNew_DpsiMaxDT) @@ -60,6 +62,9 @@ class IPMullinsEffect{ virtual void setPsiMax(const double &_psiMax){ psiMax = _psiMax; } + virtual void setDpsiMax_Dpsi(const double &_DpsiMax_Dpsi){ + DpsiMax_Dpsi = _DpsiMax_Dpsi; + } }; diff --git a/NonLinearSolver/internalPoints/ipNonLinearTVM.cpp b/NonLinearSolver/internalPoints/ipNonLinearTVM.cpp index 9a2db9172fee0a70a0281008f9a03b75261b46f8..cd70e403b1808d18a74c9a01e4e2b51df52b7586 100644 --- a/NonLinearSolver/internalPoints/ipNonLinearTVM.cpp +++ b/NonLinearSolver/internalPoints/ipNonLinearTVM.cpp @@ -21,7 +21,7 @@ IPNonLinearTVM::IPNonLinearTVM(const J2IsotropicHardening* comp, _psiMax(0.), _mullinsDamage(0.), _DpsiDT(0.), _DpsiDE(0.), _DmullinsDamage_Dpsi_cap(0.), _DmullinsDamage_DT(0.), _P_cap(0.), _pressure(0.), _Av_TVE(1.), _Bd_TVE(1.), _dAv_dTrEe(0.), _dBd_dTrEe(0.), _dAv_dTrEe_TVE(0.), _intAv_TVE(0.), _intBd_TVE(0.), _intAv_1_TVE(0.), _intBd_1_TVE(0.), _intAv_2_TVE(0.), _intBd_2_TVE(0.), _dBd_dDevEe(0.), _dBd_dDevEe_TVE(0.), - _viscousDissipatedEnergy(0.), _mullinsDissipatedEnergy(0.){ + _viscousDissipatedEnergy(0.), _mullinsDissipatedEnergy(0.), _psiInfCorrector(0.){ _DA_DT.clear(); _DDA_DTT.clear(); _DA_DtrE.clear(); _DDA_DTDtrE.clear(); @@ -76,7 +76,7 @@ IPNonLinearTVM::IPNonLinearTVM(const IPNonLinearTVM& src): IPHyperViscoElastoPla _dBd_dDevEe(src._dBd_dDevEe), _dBd_dDevEe_TVE(src._dBd_dDevEe_TVE), _Av_TVE_vector(src._Av_TVE_vector), _Bd_TVE_vector(src._Bd_TVE_vector), _dAv_dTrEe_TVE_vector(src._dAv_dTrEe_TVE_vector), _dBd_dTrEe_TVE_vector(src._dBd_dTrEe_TVE_vector), _intAv_TVE_vector(src._intAv_TVE_vector), _intBd_TVE_vector(src._intBd_TVE_vector), _dBd_dDevEe_TVE_vector(src._dBd_dDevEe_TVE_vector), - _viscousDissipatedEnergy(src._viscousDissipatedEnergy), _mullinsDissipatedEnergy(src._mullinsDissipatedEnergy){ + _viscousDissipatedEnergy(src._viscousDissipatedEnergy), _mullinsDissipatedEnergy(src._mullinsDissipatedEnergy), _psiInfCorrector(src._psiInfCorrector){ if (src._ipMullinsEffect != NULL) _ipMullinsEffect = dynamic_cast<IPMullinsEffect*>(src._ipMullinsEffect->clone()); @@ -146,6 +146,7 @@ IPNonLinearTVM& IPNonLinearTVM::operator=(const IPVariable& src) _dBd_dDevEe_TVE_vector = psrc->_dBd_dDevEe_TVE_vector; _viscousDissipatedEnergy = psrc->_viscousDissipatedEnergy; _mullinsDissipatedEnergy = psrc->_mullinsDissipatedEnergy; + _psiInfCorrector = psrc->_psiInfCorrector; if ( psrc->_ipMullinsEffect != NULL) { if (_ipMullinsEffect == NULL){ @@ -229,6 +230,7 @@ void IPNonLinearTVM::restart(){ restartManager::restart(_dBd_dDevEe_TVE_vector); restartManager::restart(_viscousDissipatedEnergy); restartManager::restart(_mullinsDissipatedEnergy); + restartManager::restart(_psiInfCorrector); if (_ipMullinsEffect != NULL) restartManager::restart(_ipMullinsEffect); diff --git a/NonLinearSolver/internalPoints/ipNonLinearTVM.h b/NonLinearSolver/internalPoints/ipNonLinearTVM.h index feaafe8519e6b5765b624d7f7767e7d8e3fcc844..9b7ada89f44c0d0f634509549357e0531b1899e5 100644 --- a/NonLinearSolver/internalPoints/ipNonLinearTVM.h +++ b/NonLinearSolver/internalPoints/ipNonLinearTVM.h @@ -34,6 +34,7 @@ class IPNonLinearTVM : public IPHyperViscoElastoPlastic{ double _trCorKirinf_TVE; STensor3 _devCorKirinf_TVE; STensor3 _corKirExtra; + double _psiInfCorrector; double _pressure; double _dAv_dTrEe, _dBd_dTrEe; double _Av_TVE, _Bd_TVE, _dAv_dTrEe_TVE; diff --git a/NonLinearSolver/materialLaw/j2IsotropicHardening.cpp b/NonLinearSolver/materialLaw/j2IsotropicHardening.cpp index 527b927e285b178e9e8951b80c4b08eb2c56bb90..3626c2fa8a6e1f6eb7897f71e9784e506474b472 100644 --- a/NonLinearSolver/materialLaw/j2IsotropicHardening.cpp +++ b/NonLinearSolver/materialLaw/j2IsotropicHardening.cpp @@ -2773,7 +2773,296 @@ J2IsotropicHardening* LinearFollowedByExponentialFollowedByMultiplePowerLawJ2Iso return new LinearFollowedByExponentialFollowedByMultiplePowerLawJ2IsotropicHardening(*this); } +LinearFollowedByMultipleSwiftJ2IsotropicHardening::LinearFollowedByMultipleSwiftJ2IsotropicHardening(const int num, double yield0, double h0, double p1, double h1, double n1, double p2, double h2, double n2, bool init): + J2IsotropicHardening(num,yield0,init), _h0(h0), _h1(h1), _h2(h2), _n1(n1), _n2(n2), _p1(p1), _p2(p2) +{ + if(h0 < 0. or h1 < 0. or h2 < 0. or n1 < 0. or n2 < 0. or p1 <= 0. or p2 < p1) Msg::Error("LinearFollowedByMultipleSwiftJ2IsotropicHardening :: negative or unsuitable hardening parameters"); + _temFunc_h0 = new constantScalarFunction(1.); + _temFunc_h1 = new constantScalarFunction(1.); + _temFunc_h2 = new constantScalarFunction(1.); + _temFunc_n1 = new constantScalarFunction(1.); + _temFunc_n2 = new constantScalarFunction(1.); +} + +LinearFollowedByMultipleSwiftJ2IsotropicHardening::LinearFollowedByMultipleSwiftJ2IsotropicHardening(const LinearFollowedByMultipleSwiftJ2IsotropicHardening &source) : + J2IsotropicHardening(source) +{ + _h0 = source._h0; + _h1 = source._h1; + _h2 = source._h2; + _n1 = source._n1; + _n2 = source._n2; + _p1 = source._p1; + _p2 = source._p2; + + _temFunc_h0 = NULL; + if (source._temFunc_h0 != NULL){ + _temFunc_h0 = source._temFunc_h0->clone(); + } + _temFunc_h1 = NULL; + if (source._temFunc_h1 != NULL){ + _temFunc_h1 = source._temFunc_h1->clone(); + } + _temFunc_h2 = NULL; + if (source._temFunc_h2 != NULL){ + _temFunc_h2 = source._temFunc_h2->clone(); + } + _temFunc_n1 = NULL; + if (source._temFunc_n1 != NULL){ + _temFunc_n1 = source._temFunc_n1->clone(); + } + _temFunc_n2 = NULL; + if (source._temFunc_n2 != NULL){ + _temFunc_n2 = source._temFunc_n2->clone(); + } +} + +LinearFollowedByMultipleSwiftJ2IsotropicHardening& LinearFollowedByMultipleSwiftJ2IsotropicHardening::operator=(const J2IsotropicHardening &source) +{ + J2IsotropicHardening::operator=(source); + const LinearFollowedByMultipleSwiftJ2IsotropicHardening* src = dynamic_cast<const LinearFollowedByMultipleSwiftJ2IsotropicHardening*>(&source); + if(src != NULL) + { + _h0 = src->_h0; + _h1 = src->_h1; + _h2 = src->_h2; + _n1 = src->_n1; + _n2 = src->_n2; + _p1 = src->_p1; + _p2 = src->_p2; + + if (src->_temFunc_h0 != NULL){ + if (_temFunc_h0 != NULL){ + _temFunc_h0->operator=(*src->_temFunc_h0); + } + else{ + _temFunc_h0 = src->_temFunc_h0->clone(); + } + } + + if (src->_temFunc_h1 != NULL){ + if (_temFunc_h1 != NULL){ + _temFunc_h1->operator=(*src->_temFunc_h1); + } + else{ + _temFunc_h1 = src->_temFunc_h1->clone(); + } + } + + if (src->_temFunc_h2 != NULL){ + if (_temFunc_h2 != NULL){ + _temFunc_h2->operator=(*src->_temFunc_h2); + } + else{ + _temFunc_h2 = src->_temFunc_h2->clone(); + } + } + + if (src->_temFunc_n1 != NULL){ + if (_temFunc_n1 != NULL){ + _temFunc_n1->operator=(*src->_temFunc_n1); + } + else{ + _temFunc_n1 = src->_temFunc_n1->clone(); + } + } + if (src->_temFunc_n2 != NULL){ + if (_temFunc_n2 != NULL){ + _temFunc_n2->operator=(*src->_temFunc_n2); + } + else{ + _temFunc_n2 = src->_temFunc_n2->clone(); + } + } + } + return *this; +} + +LinearFollowedByMultipleSwiftJ2IsotropicHardening::~LinearFollowedByMultipleSwiftJ2IsotropicHardening(){ + if (_temFunc_h0 != NULL) {delete _temFunc_h0; _temFunc_h0 = NULL;}; + if (_temFunc_h1 != NULL) {delete _temFunc_h1; _temFunc_h1 = NULL;}; + if (_temFunc_h2 != NULL) {delete _temFunc_h2; _temFunc_h2 = NULL;}; + if (_temFunc_n1 != NULL) {delete _temFunc_n1; _temFunc_n1 = NULL;}; + if (_temFunc_n2 != NULL) {delete _temFunc_n2; _temFunc_n2 = NULL;}; +}; + +void LinearFollowedByMultipleSwiftJ2IsotropicHardening::setTemperatureFunction_h0(const scalarFunction& Tfunc){ + if (_temFunc_h0 != NULL) delete _temFunc_h0; + _temFunc_h0 = Tfunc.clone(); +} +void LinearFollowedByMultipleSwiftJ2IsotropicHardening::setTemperatureFunction_h1(const scalarFunction& Tfunc){ + if (_temFunc_h1 != NULL) delete _temFunc_h1; + _temFunc_h1 = Tfunc.clone(); +} +void LinearFollowedByMultipleSwiftJ2IsotropicHardening::setTemperatureFunction_h2(const scalarFunction& Tfunc){ + if (_temFunc_h2 != NULL) delete _temFunc_h2; + _temFunc_h2 = Tfunc.clone(); +} +void LinearFollowedByMultipleSwiftJ2IsotropicHardening::setTemperatureFunction_n1(const scalarFunction& Tfunc){ + if (_temFunc_n1 != NULL) delete _temFunc_n1; + _temFunc_n1 = Tfunc.clone(); +} +void LinearFollowedByMultipleSwiftJ2IsotropicHardening::setTemperatureFunction_n2(const scalarFunction& Tfunc){ + if (_temFunc_n2 != NULL) delete _temFunc_n2; + _temFunc_n2 = Tfunc.clone(); +} + + +void LinearFollowedByMultipleSwiftJ2IsotropicHardening::createIPVariable(IPJ2IsotropicHardening* &ipv) const +{ + if(ipv != NULL) delete ipv; + ipv = new IPLinearFollowedByExponentialJ2IsotropicHardening(getYield0()); +} + +void LinearFollowedByMultipleSwiftJ2IsotropicHardening::hardening(double p0, const IPJ2IsotropicHardening &ipvprev, double p, IPJ2IsotropicHardening &ipv) const +{ + double R0 = getYield0(); + double R = R0; + double dR(0.), ddR(0.), intR(0.), dRdT(0.), ddRdTT(0.),ddRdT(0.); + if (ipvprev.isSaturated()){ + R = ipvprev.getR(); + dR = 0.; + ddR = 0.; + intR = ipvprev.getIntegR()+ R*(p-p0); + } + else { + + if(p < 1.e-16) // Elastic case + { + R = getYield0(); + dR = _h0; + ddR = 0.; + } + else if (p <= _p1) // Plastic case: linear part + { + R += _h0*p; + dR = _h0; + ddR = 0.; + intR = R0*p + 0.5*_h0*p*p; + } + else if (_p1 < p and p <= _p2)// Plastic case: Swift1 + { + double temp0 = R0 + _h0*p; + double pp = 1.+ _h1*(p-_p1); + R = temp0*pow(pp,_n1); + dR = _h0*pow(pp,_n1) + temp0*_h1*_n1*pow(pp,_n1-1); + ddR = 2*_h0*_h1*_n1*pow(pp,_n1-1) + _h1*_h1*(_n1-1)*_n1*temp0*pow(pp,_n1-2); + intR = ( pow(pp,_n1+1) * (_h1*(_h0*((_n1+1)*p+_p1)+R0*(_n1+2))-_h0) ) / (_h1*_h1*(_n1+1)*(_n1+2)); + } + else{ + double temp0 = R0 + _h0*p; + double temp1 = temp0*pow(1.+_h1*(p-_p1), _n1); + double pp = 1.+_h2*(p-_p2); + R = temp1*pow(pp,_n2); + + double Dtemp0 = _h0; + double Dtemp1 = Dtemp0*pow(1.+_h1*(p-_p1), _n1) + temp0*_h1*_n1*pow(1.+_h1*(p-_p1), _n1-1); + double DDtemp1 = 2*Dtemp0*_h1*_n1*pow(1.+_h1*(p-_p1), _n1-1) + temp0*_h1*_h1*_n1*(_n1-1)*pow(1.+_h1*(p-_p1), _n1-2); + dR = Dtemp1*pow(pp,_n2) + temp1*_h2*_n2*pow(pp,_n2-1); + ddR = DDtemp1*pow(pp,_n2) + 2*Dtemp1*_h2*_n2*pow(pp,_n2-1) + temp1*_h2*_h2*_n2*(_n2-1)*pow(pp,_n2-2); + intR = ipvprev.getIntegR()+ 0.5*(R+ipvprev.getR())*(p-p0); // approximation + } + } + ipv.set(R0,R,dR,ddR,intR,dRdT,ddRdTT,ddRdT); +} +//-----------------------------added +void LinearFollowedByMultipleSwiftJ2IsotropicHardening::hardening(double p0, const IPJ2IsotropicHardening &ipvprev, double p,double T, IPJ2IsotropicHardening &ipv) const +{ + double R0 = getYield0(T); + double R = R0; + double dR(0.), ddR(0.), intR(0.),dRdT(0.),ddRdTT(0.),ddRdT(0.); + if (ipvprev.isSaturated()){ + R = ipvprev.getR(); + dR = 0.; + ddR = 0.; + intR = ipvprev.getIntegR()+ R*(p-p0); + } + else { + double h0 = _h0*_temFunc_h0->getVal(T); + double h1 = _h1*_temFunc_h1->getVal(T); + double h2 = _h2*_temFunc_h2->getVal(T); + double n1 = _n1*_temFunc_n1->getVal(T); + double n2 = _n2*_temFunc_n2->getVal(T); + double dh0dT=_h0*_temFunc_h0->getDiff(T); + double ddh0dTT=_h0*_temFunc_h0->getDoubleDiff(T); + double dh1dT=_h1*_temFunc_h1->getDiff(T); + double ddh1dTT=_h1*_temFunc_h1->getDoubleDiff(T); + double dh2dT=_h2*_temFunc_h2->getDiff(T); + double ddh2dTT=_h2*_temFunc_h2->getDoubleDiff(T); + double dn1dT=_n1*_temFunc_n1->getDiff(T); + double ddn1dTT=_n1*_temFunc_n1->getDoubleDiff(T); + double dn2dT=_n2*_temFunc_n2->getDiff(T); + double ddn2dTT=_n2*_temFunc_n2->getDoubleDiff(T); + if(p < 1.e-16) // Elastic case + { + R = getYield0(T); + dR = h0; + ddR = 0.; + dRdT = getDYield0DT(T); + ddRdTT = getDDYield0DTT(T); + } + else if (p <= _p1) // Plastic case: linear part + { + R = R0 + h0*p; + dR = h0; + ddR = 0.; + intR = R0*p + 0.5*h0*p*p; + + dRdT=getDYield0DT(T)+dh0dT*p; + ddRdTT=getDDYield0DTT(T)+ddh0dTT*p; + } + else if (_p1 < p and p <= _p2)// Plastic case: Swift1 + { + // _n1 and _n2 are assumed to be independent of T + double temp0 = R0 + h0*p; + double pp = 1.+ h1*(p-_p1); + R = temp0*pow(pp,n1); + dR = h0*pow(pp,n1) + temp0*h1*n1*pow(pp,n1-1); + ddR = 2*h0*h1*n1*pow(pp,n1-1) + h1*h1*(n1-1)*n1*temp0*pow(pp,n1-2); + intR = ( pow(pp,n1+1) * (h1*(h0*((n1+1)*p+_p1)+R0*(n1+2))-h0) ) / (h1*h1*(n1+1)*(n1+2)); + + double Dtemp0DT = getDYield0DT(T) + dh0dT*p; + double DDtemp0DTT = getDDYield0DTT(T) + ddh0dTT*p; + double DppDT = dh1dT*(p-_p1); + double DDppDTT = ddh1dTT*(p-_p1); + dRdT = Dtemp0DT*pow(pp,n1) + temp0*DppDT*n1*pow(pp,n1-1); + ddRdTT = DDtemp0DTT*pow(pp,n1) + 2*Dtemp0DT*DppDT*n1*pow(pp,n1-1) + temp0*(DDppDTT*n1*pow(pp,n1-1)+DppDT*DppDT*n1*(n1-1)*pow(pp,n1-2)); + } + else{ + double temp0 = R0 + h0*p; + double temp1 = temp0*pow(1.+h1*(p-_p1), n1); + double pp0 = 1.+h1*(p-_p1); + double pp = 1.+h2*(p-_p2); + R = temp1*pow(pp,n2); + + double Dtemp0 = h0; + double Dtemp1 = Dtemp0*pow(1.+h1*(p-_p1), n1) + temp0*h1*n1*pow(1.+h1*(p-_p1), n1-1); + double DDtemp1 = 2*Dtemp0*h1*n1*pow(1.+h1*(p-_p1), n1-1) + temp0*h1*h1*n1*(n1-1)*pow(1.+h1*(p-_p1), n1-2); + dR = Dtemp1*pow(pp,n2) + temp1*h2*n2*pow(pp, n2-1); + ddR = DDtemp1*pow(pp,n2) + 2*Dtemp1*h2*n2*pow(pp, n2-1) + temp1*h2*h2*n2*(n2-1)*pow(pp,n2-2); + intR = ipvprev.getIntegR()+ 0.5*(R+ipvprev.getR())*(p-p0); // approximation + + double Dtemp0DT = getDYield0DT(T) + dh0dT*p; + double DDtemp0DTT = getDDYield0DTT(T) + ddh0dTT*p; + double Dpp0DT = dh1dT*(p-_p1); + double DDpp0DTT = ddh1dTT*(p-_p1); + double DppDT = dh2dT*(p-_p2); + double DDppDTT = ddh2dTT*(p-_p2); + double Dtemp1DT = Dtemp0DT*pow(pp0, n1) + temp0*Dpp0DT*n1*pow(pp0,n1-1); + double DDtemp1DTT = DDtemp0DTT*pow(pp0,n1) + 2*Dtemp0DT*Dpp0DT*n1*pow(pp0,n1-1) + temp0*(DDpp0DTT*n1*pow(pp0,n1-1)+Dpp0DT*Dpp0DT*n1*(n1-1)*pow(pp0,n1-2)); + dRdT = Dtemp1DT*pow(pp,n2) + temp1*DppDT*n2*pow(pp,n2-1); + ddRdTT = DDtemp1DTT*pow(pp,n2) + 2*Dtemp1DT*DppDT*n2*pow(pp,n2-1) + temp1*(DDppDTT*n2*pow(pp,n2-1)+DppDT*DppDT*n2*(n2-1)*pow(pp,n2-2)); + } + } + ipv.set(R0,R,dR,ddR,intR,dRdT,ddRdTT,ddRdT); +} + +//----------------------------end +J2IsotropicHardening* LinearFollowedByMultipleSwiftJ2IsotropicHardening::clone() const +{ + return new LinearFollowedByMultipleSwiftJ2IsotropicHardening(*this); +} diff --git a/NonLinearSolver/materialLaw/j2IsotropicHardening.h b/NonLinearSolver/materialLaw/j2IsotropicHardening.h index 4448a1c24fb85230b4e51a2df454362b39aa8a02..b09afc3ccf896ad71920c817fa634a8deb649eba 100644 --- a/NonLinearSolver/materialLaw/j2IsotropicHardening.h +++ b/NonLinearSolver/materialLaw/j2IsotropicHardening.h @@ -26,7 +26,7 @@ class J2IsotropicHardening{ linearFollowedByExponentialJ2IsotropicHardening, linearFollowedByPowerLawJ2IsotropicHardening, polynomialJ2IsotropicHardening, twoExpJ2IsotropicHaderning, tanhJ2IsotropicHaderning,gursonJ2IsotropicHardening, multipleSwiftJ2IsotropicHardening, - linearExponentialFollowedBySwiftLawJ2IsotropicHardening,LinearFollowedByExponentialFollowedByMultiplePowerLawJ2IsotropicHardening, + linearExponentialFollowedBySwiftLawJ2IsotropicHardening,LinearFollowedByExponentialFollowedByMultiplePowerLawJ2IsotropicHardening,LinearFollowedByMultipleSwiftJ2IsotropicHardening, UserIsoLaw}; protected : int _num; // number of law (must be unique !) @@ -559,4 +559,38 @@ class LinearFollowedByExponentialFollowedByMultiplePowerLawJ2IsotropicHardening: virtual void hardening(double p0, const IPJ2IsotropicHardening &ipvprev, double p, double T, IPJ2IsotropicHardening &ipv) const; #endif //SWIG }; + +class LinearFollowedByMultipleSwiftJ2IsotropicHardening: public J2IsotropicHardening{ + // R = yield0 + h0*p if p < p1 + // R = syp1*(1+h1*(p-p1))^n1 if p1 < p < p2 + // R = syp2*(1+h2*(p-p2))^n2 p2 < p + protected: + double _h0, _h1, _h2, _p1, _p2, _n1, _n2; + scalarFunction* _temFunc_h0; + scalarFunction* _temFunc_h1; + scalarFunction* _temFunc_h2; + scalarFunction* _temFunc_n1; + scalarFunction* _temFunc_n2; + + + public: + LinearFollowedByMultipleSwiftJ2IsotropicHardening(const int num, double yield0, double h0, double p1, double h1, double n1, double p2, double h2, double n2, bool init=true); + void setTemperatureFunction_h0(const scalarFunction& Tfunc); + void setTemperatureFunction_h1(const scalarFunction& Tfunc); + void setTemperatureFunction_h2(const scalarFunction& Tfunc); + void setTemperatureFunction_n1(const scalarFunction& Tfunc); + void setTemperatureFunction_n2(const scalarFunction& Tfunc); + #ifndef SWIG + virtual ~LinearFollowedByMultipleSwiftJ2IsotropicHardening(); + LinearFollowedByMultipleSwiftJ2IsotropicHardening(const LinearFollowedByMultipleSwiftJ2IsotropicHardening &source); + LinearFollowedByMultipleSwiftJ2IsotropicHardening& operator=(const J2IsotropicHardening &source); + virtual int getNum() const{return _num;} + virtual hardeningname getType() const{return J2IsotropicHardening::LinearFollowedByMultipleSwiftJ2IsotropicHardening; }; + virtual void createIPVariable(IPJ2IsotropicHardening* &ipv) const; + virtual void initLaws(const std::map<int,J2IsotropicHardening*> &maplaw) {}; //nothing now, we will see if we use the mapping + virtual void hardening(double p0, const IPJ2IsotropicHardening &ipvprev, double p, IPJ2IsotropicHardening &ipv) const; + virtual J2IsotropicHardening * clone() const; + virtual void hardening(double p0, const IPJ2IsotropicHardening &ipvprev, double p, double T, IPJ2IsotropicHardening &ipv) const; + #endif //SWIG +}; #endif //J2ISOTROPICHARDENING_H_ diff --git a/NonLinearSolver/materialLaw/mlawHyperelastic.cpp b/NonLinearSolver/materialLaw/mlawHyperelastic.cpp index 7b2aed65b54050d24c305eea06c3a23186d5ce78..048f868c610d773c3a88ce77c850fd155069a4a9 100644 --- a/NonLinearSolver/materialLaw/mlawHyperelastic.cpp +++ b/NonLinearSolver/materialLaw/mlawHyperelastic.cpp @@ -14,8 +14,9 @@ mlawHyperViscoElastic::mlawHyperViscoElastic(const int num,const double E,const const bool matrixbyPerturbation, const double pert): materialLaw(num,true), _rho(rho),_tangentByPerturbation(matrixbyPerturbation),_perturbationfactor(pert), _viscoMethod(Maxwell),_N(0.),_order(1),_Ki(0),_ki(0),_Gi(0),_gi(0), _I4(1.,1.), _I(1.), - _volCorrection(0.), _xivolCorrection(1.), _zetavolCorrection(1.), _devCorrection(0.), _thetadevCorrection(1.), _pidevCorrection(1.), - _compCorrection(1.), _compCorrection_2(0.), _compCorrection_3(0.), _tensionCompressionRegularisation(5.), + _volCorrection(1.), _xivolCorrection(1.), _zetavolCorrection(1.), _devCorrection(1.), _thetadevCorrection(1.), _pidevCorrection(1.), + _compCorrection(1.), _compCorrection_2(0.), _compCorrection_3(0.), _tensionCompressionRegularisation(10.), + _volCorrection2(1.), _xivolCorrection2(1.), _zetavolCorrection2(1.), _devCorrection2(1.), _thetadevCorrection2(1.), _pidevCorrection2(1.), _extraBranchType(Bilogarithmic), _extraBranchNLType(tanhType){ _Idev = _I4; @@ -63,7 +64,9 @@ mlawHyperViscoElastic::mlawHyperViscoElastic(const mlawHyperViscoElastic& src): _I4(src._I4), _I(src._I), _Idev(src._Idev), _volCorrection(src._volCorrection), _xivolCorrection(src._xivolCorrection), _zetavolCorrection(src._zetavolCorrection), _devCorrection(src._devCorrection), _thetadevCorrection(src._thetadevCorrection), _pidevCorrection(src._pidevCorrection), _compCorrection(src._compCorrection), _compCorrection_2(src._compCorrection_2), _compCorrection_3(src._compCorrection_3), - _tensionCompressionRegularisation(src._tensionCompressionRegularisation), _extraBranchType(src._extraBranchType), _extraBranchNLType(src._extraBranchNLType) + _tensionCompressionRegularisation(src._tensionCompressionRegularisation), _extraBranchType(src._extraBranchType), _extraBranchNLType(src._extraBranchNLType), + _volCorrection2(src._volCorrection2), _xivolCorrection2(src._xivolCorrection2), + _zetavolCorrection2(src._zetavolCorrection2), _devCorrection2(src._devCorrection2), _thetadevCorrection2(src._thetadevCorrection2) { }; @@ -79,14 +82,14 @@ mlawHyperViscoElastic& mlawHyperViscoElastic::operator=(const materialLaw &sourc _order = src->_order; _tangentByPerturbation = src->_tangentByPerturbation; _perturbationfactor = src->_perturbationfactor; _N = src->_N; _viscoMethod = src->_viscoMethod; _Ki = src->_Ki; _ki = src->_ki; _Gi = src->_Gi; _gi = src->_gi; - _zetavolCorrection=src->_zetavolCorrection; _devCorrection=src->_devCorrection; - _thetadevCorrection=src->_thetadevCorrection; _pidevCorrection=src->_pidevCorrection; + _volCorrection=src->_volCorrection; _xivolCorrection=src->_xivolCorrection; + _zetavolCorrection=src->_zetavolCorrection; _devCorrection=src->_devCorrection; _thetadevCorrection=src->_thetadevCorrection; _pidevCorrection=src->_pidevCorrection; _extraBranchType = src->_extraBranchType; - _compCorrection = src->_compCorrection; - _compCorrection_2 = src->_compCorrection_2; - _compCorrection_3 = src->_compCorrection_3; + _compCorrection = src->_compCorrection; _compCorrection_2 = src->_compCorrection_2; _compCorrection_3 = src->_compCorrection_3; _extraBranchNLType = src->_extraBranchNLType; _tensionCompressionRegularisation = src->_tensionCompressionRegularisation; + _volCorrection2=src->_volCorrection2; _xivolCorrection2=src->_xivolCorrection2; + _zetavolCorrection2=src->_zetavolCorrection2; _devCorrection2=src->_devCorrection2; _thetadevCorrection2=src->_thetadevCorrection2; _pidevCorrection2=src->_pidevCorrection2; } return *this; } @@ -190,7 +193,7 @@ void mlawHyperViscoElastic::setViscoElasticData(const std::string filename){ }; void mlawHyperViscoElastic::evaluatePhiPCorrection(double tr, const STensor3 &dev, double &A_v, double &dA_vdE, double &intA, double &B_d, STensor3 &dB_vddev, double &intB, - double* dB_dTrEe) const{ + double* dB_dTrEe, double* psiInfCorrector) const{ if(_extraBranchNLType == expType) { A_v = getVolumeCorrection()*pow(exp(getXiVolumeCorrection()/3.*tr*tr)-1.,getZetaVolumeCorrection()); @@ -278,7 +281,7 @@ void mlawHyperViscoElastic::evaluatePhiPCorrection(double tr, const STensor3 &de double x = getXiVolumeCorrection()*tr*tr + getZetaVolumeCorrection(); A_v = -1. + getVolumeCorrection()* 1/sqrt(x) ; if (tr < 0.){ - A_v = -1. + getVolumeCorrection()* 1/sqrt(x) * (1. + _compCorrection/getVolumeCorrection()) ; + A_v = -1. + getVolumeCorrection()* 1/sqrt(x); // * (1. + _compCorrection/getVolumeCorrection()) ; // A_v += (_compCorrection*tanh(_compCorrection_2*tr*tr+_compCorrection_3)) ; } if(A_v > -1.){ @@ -287,9 +290,9 @@ void mlawHyperViscoElastic::evaluatePhiPCorrection(double tr, const STensor3 &de intA -= getVolumeCorrection()*sqrt(getZetaVolumeCorrection())/getXiVolumeCorrection(); // value at trEe = 0. if (tr < 0.){ - dA_vdE = - getVolumeCorrection()*getXiVolumeCorrection()*tr/pow(x,1.5) * (1. + _compCorrection/getVolumeCorrection()); - intA = - tr*tr/2. + getVolumeCorrection()*sqrt(x)/getXiVolumeCorrection() * (1. + _compCorrection/getVolumeCorrection()); // integral of A_v * trEe - intA -= getVolumeCorrection()*sqrt(getZetaVolumeCorrection())/getXiVolumeCorrection() * (1. + _compCorrection/getVolumeCorrection()); // value at trEe = 0. + dA_vdE = - getVolumeCorrection()*getXiVolumeCorrection()*tr/pow(x,1.5); // * (1. + _compCorrection/getVolumeCorrection()); + intA = - tr*tr/2. + getVolumeCorrection()*sqrt(x)/getXiVolumeCorrection(); // * (1. + _compCorrection/getVolumeCorrection()); // integral of A_v * trEe + intA -= getVolumeCorrection()*sqrt(getZetaVolumeCorrection())/getXiVolumeCorrection(); // * (1. + _compCorrection/getVolumeCorrection()); // value at trEe = 0. } } else{ @@ -301,6 +304,7 @@ void mlawHyperViscoElastic::evaluatePhiPCorrection(double tr, const STensor3 &de double y = getThetaDevCorrection()*dev.dotprod() + getPiDevCorrection(); B_d = -1. + getDevCorrection()*1/sqrt(y); if (tr < 0.){ + B_d = -1. + getDevCorrection()*1/sqrt(y); // B_d += (_compCorrection*tanh(_compCorrection_2*tr*tr+_compCorrection_3)) ; } @@ -316,51 +320,186 @@ void mlawHyperViscoElastic::evaluatePhiPCorrection(double tr, const STensor3 &de STensorOperation::zero(dB_vddev); intB = 0.; } + + if (psiInfCorrector != NULL){ + *psiInfCorrector = getVolumeCorrection()/sqrt(getXiVolumeCorrection()) * asinh(sqrt(getXiVolumeCorrection()/getZetaVolumeCorrection())*tr); + } } else if(_extraBranchNLType == TensionCompressionRegularisedType){ // Regularising function double m = _tensionCompressionRegularisation; - double expmtr(0.); - if (exp(-m*tr)<1.e+10){ expmtr = exp(-m*tr);} + double expmtr = exp(-m*tr); + // if (exp(-m*tr)<1.e+10){ expmtr = exp(-m*tr);} double sigmoid = 1/(1.+expmtr); double x = getXiVolumeCorrection()*tr*tr + getZetaVolumeCorrection(); - A_v = -1. + sigmoid*1./sqrt(x) + (1.-sigmoid)*(_compCorrection/sqrt(x)); + A_v = -1. + getVolumeCorrection()/sqrt(x)*(sigmoid + _compCorrection*(1.-sigmoid)); - dA_vdE = - sigmoid*getXiVolumeCorrection()*tr/pow(x,1.5) - (1.-sigmoid)*(getXiVolumeCorrection()*_compCorrection*tr/pow(x,1.5)) - + (m*expmtr/pow((1.+expmtr),2.))*1./sqrt(x) - (_compCorrection*m*expmtr/pow((1.+expmtr),2.))*1./sqrt(x); + dA_vdE = - getXiVolumeCorrection()*tr/pow(x,1.5) *(sigmoid + _compCorrection*(1.-sigmoid)) + + 1./sqrt(x)* (m*expmtr/pow((1.+expmtr),2.)) *(1.-_compCorrection); + dA_vdE *= getVolumeCorrection(); if(getXiVolumeCorrection()>0.){ double integrand = 1./getXiVolumeCorrection()*sqrt(x); // integral of A_v * trEe integrand -= ( 1./getXiVolumeCorrection()*sqrt(getZetaVolumeCorrection()) ); // value at trEe = 0. - intA = - tr*tr/2. + sigmoid*integrand + (1.-sigmoid)*integrand; + intA = - tr*tr/2. + getVolumeCorrection()*integrand*(sigmoid + _compCorrection*(1.-sigmoid)); } else{ intA = - tr*tr/2.; } double y = getThetaDevCorrection()*dev.dotprod() + getPiDevCorrection(); - B_d = -1. + sigmoid*1./sqrt(y) + (1.-sigmoid)*(_compCorrection/sqrt(y)); + B_d = -1. + getDevCorrection()/sqrt(y)*(sigmoid + _compCorrection*(1.-sigmoid)); STensorOperation::zero(dB_vddev); dB_vddev = dev; - dB_vddev *= (-sigmoid*getThetaDevCorrection()/pow(y,1.5) - (1.-sigmoid)*(getThetaDevCorrection()*_compCorrection/pow(y,1.5))); + dB_vddev *= -getThetaDevCorrection()/pow(y,1.5)*(sigmoid + _compCorrection*(1.-sigmoid)); + dB_vddev *= getDevCorrection(); if(dB_dTrEe!=NULL){ - *dB_dTrEe = (m*expmtr/pow((1.+expmtr),2.))*1./sqrt(y) - (_compCorrection*m*expmtr/pow((1.+expmtr),2.))*1./sqrt(y); + *dB_dTrEe = getDevCorrection()/sqrt(y)* (m*expmtr/pow((1.+expmtr),2.)) *( 1.-_compCorrection); } if(getThetaDevCorrection()>0.){ double integrand = 1./getThetaDevCorrection()*sqrt(y); // integral of B_d * devEe integrand -= (1./getThetaDevCorrection()*sqrt(getPiDevCorrection()) ); // value at devEe = 0. - intB = -dev.dotprod()/2. + sigmoid*integrand + (1.-sigmoid)*integrand; + intB = -dev.dotprod()/2. + getDevCorrection()*integrand*(sigmoid + _compCorrection*(1.-sigmoid)); } else{ intB = -dev.dotprod()/2.; } - - // Msg::Error(" Inside evaluatePhiPCorrection, A_v = %e, B_d = %e !!", A_v, B_d); + } + /*else if(_extraBranchNLType == hyper_exp_TCasymm_Type){ + + // Msg::Error(" Inside evaluatePhiPCorrection, A_v = %e, B_d = %e !!", A_v, B_d); + // Regularising function + double m = _tensionCompressionRegularisation; + double expmtr = exp(-m*tr); + // if (exp(-m*tr)<1.e+10){ expmtr = exp(-m*tr);} + double sigmoid = 1/(1.+expmtr); + + double x1 = getXiVolumeCorrection()*tr*tr + getZetaVolumeCorrection(); + double x2 = _xivolCorrection2*tr*tr + _zetavolCorrection2; + + A_v = -1. + sigmoid*(getVolumeCorrection()/sqrt(x1)) + (1-sigmoid)*_compCorrection*(getVolumeCorrection()/sqrt(x1) + _volCorrection2*exp(x2)); + + dA_vdE = sigmoid*(-getVolumeCorrection()*getXiVolumeCorrection()*tr/pow(x1,1.5)) + + (1.-sigmoid)*_compCorrection*( -getVolumeCorrection()*getXiVolumeCorrection()*tr/pow(x1,1.5) + 2*_volCorrection2*_xivolCorrection2*tr*exp(x2)) + + (m*expmtr/pow((1.+expmtr),2.))*getVolumeCorrection()*1./sqrt(x1) - (m*expmtr/pow((1.+expmtr),2.))*_compCorrection*(getVolumeCorrection()/sqrt(x1) + _volCorrection2*exp(x2)) ; + + if(getXiVolumeCorrection()>0. && _xivolCorrection2>0.){ + double integrand1 = 1./getXiVolumeCorrection()*sqrt(x1); // integral of A_v * trEe + integrand1 -= ( 1./getXiVolumeCorrection()*sqrt(getZetaVolumeCorrection()) ); // value at trEe = 0. + integrand1 *= getVolumeCorrection(); + + double integrand2 = exp(x2)/(2*_xivolCorrection2); + integrand2 -= exp(_zetavolCorrection2)/(2*_xivolCorrection2); + integrand2 *= _volCorrection2; + + intA = - tr*tr/2. + sigmoid*integrand1 + (1.-sigmoid)*_compCorrection*(integrand1 + integrand2); + } + else{ + intA = - tr*tr/2.; + } + + double y1 = getThetaDevCorrection()*dev.dotprod() + getPiDevCorrection(); + double y2 = _thetadevCorrection2*dev.dotprod() + _pidevCorrection2; + B_d = -1. + sigmoid*(getDevCorrection()/sqrt(y1)) + (1-sigmoid)*_compCorrection*(getDevCorrection()/sqrt(y1) + _devCorrection2*exp(y2)); + + STensorOperation::zero(dB_vddev); + dB_vddev = dev; + dB_vddev *= ( sigmoid*(-getDevCorrection()*getThetaDevCorrection()/pow(y1,1.5)) + + (1.-sigmoid)*_compCorrection*( -getDevCorrection()*getThetaDevCorrection()/pow(y1,1.5) + 2*_devCorrection2*_thetadevCorrection2*exp(y2)) ); + if(dB_dTrEe!=NULL){ + *dB_dTrEe = (m*expmtr/pow((1.+expmtr),2.))*getDevCorrection()*1./sqrt(y1) - (m*expmtr/pow((1.+expmtr),2.))*_compCorrection*(getDevCorrection()/sqrt(y1) + _devCorrection2*exp(y2)); + } + if(getThetaDevCorrection()>0. && _thetadevCorrection2>0.){ + + double integrand1 = 1./getThetaDevCorrection()*sqrt(y1); // integral of B_d * devEe + integrand1 -= (1./getThetaDevCorrection()*sqrt(getPiDevCorrection()) ); // value at devEe = 0. + integrand1 *= getDevCorrection(); + + double integrand2 = exp(y2)/(2*_thetadevCorrection2); + integrand2 -= exp(_pidevCorrection2)/(2*_thetadevCorrection2); + integrand2 *= _devCorrection2; + + intB = -dev.dotprod()/2. + sigmoid*integrand1 + (1.-sigmoid)*_compCorrection*(integrand1 + integrand2); + } + else{ + intB = -dev.dotprod()/2.; + } + }*/ + else if(_extraBranchNLType == hyper_exp_TCasymm_Type){ // hyper_TCasymm_Type2 + + // To make it simpler for the sake of it + double V0 = getVolumeCorrection(); // This code doesnt use it + double V1 = getXiVolumeCorrection(); + double V2 = getZetaVolumeCorrection(); + double V3 = _volCorrection2; + double V4 = _xivolCorrection2; + double V5 = _zetavolCorrection2; + double D0 = getDevCorrection(); // This code doesnt use it + double D1 = getThetaDevCorrection(); + double D2 = getPiDevCorrection(); + double D3 = _devCorrection2; + double D4 = _thetadevCorrection2; + double D5 = _pidevCorrection2; + + // Regularising function + double m = _tensionCompressionRegularisation; + double expmtr = exp(-m*tr); + // if (exp(-m*tr)<1.e+10){ expmtr = exp(-m*tr);} + double sigmoid = 1/(1.+expmtr); + + double x1 = V1*tr*tr + V2; + double x2 = V4*tr*tr + V5; + A_v = -1. + sigmoid*( (1./sqrt(x1)+V3*(1+tanh(x2))) ) + (1-sigmoid)*_compCorrection*( 1./sqrt(x1)+V3 ); + + dA_vdE = -sigmoid*(V1*tr/pow(x1,1.5) - V3*(2*V4*tr*pow(1/cosh(x2),2))) - (1.-sigmoid)*(V1*_compCorrection*tr/pow(x1,1.5)) + + (m*expmtr/pow((1.+expmtr),2.))*(1./sqrt(x1)+ V3*(1+tanh(x2)))- (_compCorrection*m*expmtr/pow((1.+expmtr),2.))*(1./sqrt(x1) + V3); + + if(V1>0.){ + double integrand1 = 1./V1*sqrt(x1) + V3*tr*tr/2.; // integral of A_v * trEe + double integrand2 = 0.; + if(V4 != 0.){ + integrand2 = V3/(2.*V4)*log(cosh(x2)); + } + integrand1 -= ( 1./V1*sqrt(V2) ); // value at trEe = 0. + intA = - tr*tr/2. + sigmoid*(integrand1 + integrand2) + _compCorrection*(1.-sigmoid)*integrand1; + // intA *= getVolumeCorrection(); + } + else{ + intA = - tr*tr/2.; + } + + double y1 = D1*dev.dotprod() + D2; + double y2 = D4*dev.dotprod() + D5; + + B_d = -1. + sigmoid*(1./sqrt(y1) + D3*(1+tanh(y2))) + (1.-sigmoid)*(_compCorrection*(1./sqrt(y1) + D3)) ; + + STensorOperation::zero(dB_vddev); + dB_vddev = dev; + dB_vddev *= (-sigmoid*(D1/pow(y1,1.5) - D3*(2*D4*pow(1/cosh(y2),2))) - (1.-sigmoid)*(D1*_compCorrection/pow(y1,1.5))); + + if(dB_dTrEe!=NULL){ + *dB_dTrEe = (m*expmtr/pow((1.+expmtr),2.))*(1./sqrt(y1) + D3*(1+tanh(y2))) - (m*expmtr/pow((1.+expmtr),2.))*(_compCorrection*(1./sqrt(y1) + D3)); + // *dB_dTrEe *= getDevCorrection(); + } + + if(D1>0.){ + double integrand1 = 1./D1*sqrt(y1) + D3*dev.dotprod()/2.; // integral of B_d * devEe + double integrand2 = 0.; + if(D4 != 0.){ + integrand2 = D3/(2.*D4)*log(cosh(y2)); + } + integrand1 -= (1./D1*sqrt(D2) ); // value at devEe = 0. + intB = -dev.dotprod()/2. + sigmoid*(integrand1 + integrand2) + _compCorrection*(1.-sigmoid)*integrand1; + // intB *= getDevCorrection(); + } + else{ + intB = -dev.dotprod()/2.; + } } else{ Msg::Error("_extraBranchNLType %d has not been defined",_extraBranchNLType); diff --git a/NonLinearSolver/materialLaw/mlawHyperelastic.h b/NonLinearSolver/materialLaw/mlawHyperelastic.h index c0fe1a8a337dd8a3c7b7ea74188c7ba3cd48eee0..853e17338dbd0c728adcd270f1b3cee4351159c5 100644 --- a/NonLinearSolver/materialLaw/mlawHyperelastic.h +++ b/NonLinearSolver/materialLaw/mlawHyperelastic.h @@ -22,7 +22,7 @@ class mlawHyperViscoElastic : public materialLaw{ public: enum viscoelasticType{Maxwell=0,KelvinVoight=1}; enum extraBranchType{Bilogarithmic=0}; - enum extraBranchNLType{expType=0,tanhType=1,sigmoidType=2,hyperType=3,TensionCompressionRegularisedType=4}; + enum extraBranchNLType{expType=0,tanhType=1,sigmoidType=2,hyperType=3,TensionCompressionRegularisedType=4,hyper_exp_TCasymm_Type=5,hyper_TCasymm_Type2=6}; #ifndef SWIG protected: STensor43 _I4; // symetric 4th order unit tensor @@ -61,6 +61,14 @@ class mlawHyperViscoElastic : public materialLaw{ extraBranchType _extraBranchType; extraBranchNLType _extraBranchNLType; + double _volCorrection2; //Vc correction on volume potential + double _xivolCorrection2; //Xi correction on volume potential + double _zetavolCorrection2; //Zeta correction on volume potential + double _devCorrection2; //Dc correction on volume potential + double _thetadevCorrection2; //Theta correction on volume potential + double _pidevCorrection2; //pi correction on volume potential + + protected: virtual double deformationEnergy(const IPHyperViscoElastic& q) const ; virtual void dDeformationEnergydF(const IPHyperViscoElastic& q, const STensor3 &P, STensor3 &dElasticEnergydF) const ; @@ -80,7 +88,7 @@ class mlawHyperViscoElastic : public materialLaw{ const bool stiff, STensor43& Tangent) const; void evaluatePhiPCorrection(double trEe, const STensor3 &devEpr, double &A_v, double &dAprdEepr, double &intA, double &B_d, STensor3 &dB_vddevEe, double &intB, - double* dB_dTrEe = NULL) const; + double* dB_dTrEe = NULL, double* psiInfCorrector = NULL) const; //void evaluateA_dA(double trEe, double &A_v, double &dAprdEepr) const; #endif // SWIG @@ -104,8 +112,11 @@ class mlawHyperViscoElastic : public materialLaw{ virtual double getDevCorrection() const {return _devCorrection;}; virtual double getThetaDevCorrection() const {return _thetadevCorrection;}; virtual double getPiDevCorrection() const {return _pidevCorrection;}; - virtual void setExtraBranch_CompressionParameter(double compCorrection, double compCorrection_2, double compCorrection_3) { + virtual void setExtraBranch_CompressionParameter(const double compCorrection, const double compCorrection_2, const double compCorrection_3) { _compCorrection = compCorrection; _compCorrection_2 = compCorrection_2; _compCorrection_3 = compCorrection_3;}; + + virtual void setAdditionalVolumeCorrections(const double V3, const double V4, const double V5, const double D3, const double D4, const double D5) { + _volCorrection2 = V3; _xivolCorrection2 = V4; _zetavolCorrection2 = V5; _devCorrection2 = D3; _thetadevCorrection2 = D4; _pidevCorrection2 = D5;}; virtual void setTensionCompressionRegularisation(double tensionCompressionRegularisation) {_tensionCompressionRegularisation = tensionCompressionRegularisation;}; virtual void setExtraBranchType(const int type); virtual void setExtraBranchNLType(const int type); diff --git a/NonLinearSolver/materialLaw/mlawNonLinearTVENonLinearTVP.cpp b/NonLinearSolver/materialLaw/mlawNonLinearTVENonLinearTVP.cpp index b94b227aba7ab73a8ff2bedd5cfc2ad9712c3ce0..d76a3995f44178fab8202dc165efbe061610dd29 100644 --- a/NonLinearSolver/materialLaw/mlawNonLinearTVENonLinearTVP.cpp +++ b/NonLinearSolver/materialLaw/mlawNonLinearTVENonLinearTVP.cpp @@ -34,6 +34,38 @@ mlawNonLinearTVENonLinearTVP& mlawNonLinearTVENonLinearTVP::operator=(const mate mlawNonLinearTVENonLinearTVP::~mlawNonLinearTVENonLinearTVP(){ }; +double mlawNonLinearTVENonLinearTVP::freeEnergyPlasticity(const IPNonLinearTVP *q0, IPNonLinearTVP *q1, const double T0, const double T) const{ + + double Psy_TVP(0.); + + // 1. Kinematic Hardening + double Hb(0.); + if (q1->_ipKinematic != NULL){ + Hb = q1->_ipKinematic->getDR(); // kinematic hardening parameter + } + + double kk = 1./sqrt(1.+2.*q1->_nup*q1->_nup); + static STensor3 alpha; + alpha = q1->_backsig; + alpha *= 1/(pow(kk,2)*Hb); + + STensorOperation::doubleContractionSTensor3(q1->_backsig,alpha,Psy_TVP); + + // 2. Isotropic Hardening + double intR = q1->_ipCompression->getIntegR(); + double sigc0 = q1->_ipCompression->getR0(); + intR -= sigc0*q1->_epspbarre; + + Psy_TVP += intR; + + // If mullins, then calculate psi_VE derivatives + // if (_mullinsEffect != NULL && q._ipMullinsEffect != NULL){ + // *DpsiDT = 0.; + // STensorOperation::zero(*DpsiDE); + // } + return Psy_TVP; +} + void mlawNonLinearTVENonLinearTVP::constitutive( // This function is just a placeholder, defined in the pure virtual class -> does nothing, its never called. const STensor3& F0, // previous deformation gradient (input @ time n) const STensor3& F1, // current deformation gradient (input @ time n+1) @@ -334,7 +366,7 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL // Get hardening parameters this->mlawNonLinearTVP::hardening(q0,q1,T); - static fullVector<double> a(3), Da(3); // yield coefficients and derivatives in respect to plastic deformation + static fullVector<double> a(3), Da(3); // yield coefficients and derivatives with respect to plastic deformation this->mlawNonLinearTVP::getYieldCoefficients(q1,a); //a.print("a init"); @@ -342,7 +374,7 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL if (q1->_ipKinematic != NULL){ Hb = q1->_ipKinematic->getDR(); // kinematic hardening parameter dHb = q1->_ipKinematic->getDDR(); // kinematic hardening parameter derivative (dHb/dgamma) - dHbdT = Hb * q1->_ipKinematic->getDRDT(); // make sure to normalise DRDT while defining in python file //NEW + dHbdT = Hb * q1->_ipKinematic->getDRDT(); // make sure to normalise DRDT while defining in python file ddHbddT = Hb * q1->_ipKinematic->getDDRDTT(); } @@ -371,28 +403,36 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL static STensor3 expGN, GammaN; static STensor43 dexpAdA; // estimation of dexpA/dA expGN = _I; // if Gamma = 0, expGN = _I - dexpAdA = _I4; + // dexpAdA = _I4; + STensorOperation::zero(dexpAdA); // CHECKERS STensor3& Ee = q1->_Ee; - STensorOperation::logSTensor3(Ce,_order,Ee,&DlnDCepr,&DDlnDDCe); + // STensorOperation::logSTensor3(Ce,_order,Ee,&DlnDCepr,&DDlnDDCe); + bool ok=STensorOperation::logSTensor3(Ce,_order,Ee,&DlnDCepr,&DDlnDDCe); + if(!ok) + { + P(0,0) = P(1,1) = P(2,2) = sqrt(-1.); + return; + } Ee *= 0.5; Eepr = Ee; DlnDCe = DlnDCepr; // update A, B -> ExtraBranch calculations are within - double Ke(0.), Ge(0.), Ke_pr(0.), Ge_pr(0.); + double Ke(0.), Ge(0.), Ke_pr(0.), Ge_pr(0.), DKDTsum(0.), DGDTsum(0.); static STensor43 Ge_Tensor_pr, Ge_Tensor, Bd_stiffnessTerm, Ge_TrEeTensor_pr, Ge_TrEeTensor; STensorOperation::zero(Ge_Tensor_pr); STensorOperation::zero(Ge_Tensor); STensorOperation::zero(Ge_TrEeTensor_pr); STensorOperation::zero(Ge_TrEeTensor); - if (_extraBranchNLType != TensionCompressionRegularisedType && _ExtraBranch_TVE_option != 3){ - mlawNonLinearTVM::ThermoViscoElasticPredictor_forTVP(Ee,q0->_Ee,q0,q1,Ke,Ge,T0,T,stiff,Bd_stiffnessTerm); + if (_extraBranchNLType == TensionCompressionRegularisedType || _extraBranchNLType == hyper_exp_TCasymm_Type || _ExtraBranch_TVE_option == 3 || _ExtraBranch_TVE_option == 4 || _ExtraBranch_TVE_option == 5){ + // TC asymmetry -> for either case of TensionCompressionRegularisedType and _ExtraBranch_TVE_option == 3,',( + mlawNonLinearTVM::ThermoViscoElasticPredictor(Ee,q0->_Ee,q0,q1,Ke,Ge,DKDTsum,DGDTsum,T0,T,stiff,Bd_stiffnessTerm,&Ge_TrEeTensor); + Ge_TrEeTensor_pr = Ge_TrEeTensor; } - else{ // TC asymmetry -> for either case of TensionCompressionRegularisedType and _ExtraBranch_TVE_option == 3 - mlawNonLinearTVM::ThermoViscoElasticPredictor_forTVP(Ee,q0->_Ee,q0,q1,Ke,Ge,T0,T,stiff,Bd_stiffnessTerm,&Ge_TrEeTensor); - Ge_TrEeTensor_pr = Ge_TrEeTensor; + else{ + mlawNonLinearTVM::ThermoViscoElasticPredictor(Ee,q0->_Ee,q0,q1,Ke,Ge,DKDTsum,DGDTsum,T0,T,stiff,Bd_stiffnessTerm); } - + Ge_Tensor = _I4; Ge_Tensor *= Ge*2; // Because the function does not do it Ge_Tensor += Bd_stiffnessTerm; @@ -406,10 +446,10 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL // get predictor - dKeprDT mlawNonLinearTVM::getTVEdCorKirDT(q0,q1,T0,T); - const STensor3& dKeprDT = q1->_DcorKirDT; + const STensor3& dKeprDT = q1->_DcorKirDT; // This has all extrabranches now // Initialise Dho - static STensor43 Dho, Dho2inv, Dho2_u_inv; // This will be the final important tensor. + static STensor43 Dho, Dho2inv, Dho2_u_inv; // These will be important tensors. double Dho2_v_inv(0.); // Get Mepr @@ -426,21 +466,20 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL pXn = 1./3.*trXn; // 1st invariant of Xn eXn = sqrt(1.5*devXn.dotprod()); // J2 invariant of Xn - // Initialise Phipr + // Initialise Phipr static STensor3 PhiPr, Phi; PhiPr = q1->_ModMandel; PhiPr -= q1->_backsig; Phi = PhiPr; static STensor3 devPhipr, devPhi; // effective dev stress predictor - static double ptildepr, ptilde; + double ptildepr(0.), ptilde(0.); STensorOperation::decomposeDevTr(PhiPr,devPhipr,ptildepr); ptildepr/= 3.; // Initialise Normal - static STensor3 devN; // dev part of yield normal + static STensor3 devN, N; // dev part of yield normal double trN = 0.; // trace part of yield normal - static STensor3 N; // yield normal STensorOperation::zero(devN); STensorOperation::zero(N); @@ -449,11 +488,10 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL double kk = (1./sqrt(1.+2.*q1->_nup*q1->_nup)); // Initialise variables - // double Gamma = 0.; double& Gamma = q1->_Gamma; // flow rule parameter Gamma = 0.; double dDgammaDGamma = 0.; - double Dgamma = 0.; // eqplastic strain + double Dgamma = 0.; // eqplastic strain increment static fullVector<double> m(2); mlawNonLinearTVP::getChabocheCoeffs(m,0,q1); @@ -473,12 +511,13 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL devPhi = devPhipr; // Initialise the rest - if (_extraBranchNLType != TensionCompressionRegularisedType && _ExtraBranch_TVE_option != 3){ - getDho(Gamma,Cepr,Ceinvpr,Kepr,Ke,Ge_Tensor,kk,Hb,Cxtr,Cxdev,expGN,dexpAdA,Dho,Dho2inv,Dho2_u_inv,Dho2_v_inv); - } - else{ // TC asymmetry -> for either case of TensionCompressionRegularisedType and _ExtraBranch_TVE_option == 3 + if (_extraBranchNLType == TensionCompressionRegularisedType || _extraBranchNLType == hyper_exp_TCasymm_Type || _ExtraBranch_TVE_option == 3 || _ExtraBranch_TVE_option == 4 || _ExtraBranch_TVE_option == 5){ + // TC asymmetry -> for either case of TensionCompressionRegularisedType and _ExtraBranch_TVE_option == 3 getDho(Gamma,Cepr,Ceinvpr,Kepr,Ke,Ge_Tensor,kk,Hb,Cxtr,Cxdev,expGN,dexpAdA,Dho,Dho2inv,Dho2_u_inv,Dho2_v_inv,&Ge_TrEeTensor); } + else{ + getDho(Gamma,Cepr,Ceinvpr,Kepr,Ke,Ge_Tensor,kk,Hb,Cxtr,Cxdev,expGN,dexpAdA,Dho,Dho2inv,Dho2_u_inv,Dho2_v_inv); + } double PhiEqpr2 = 1.5*devPhi.dotprod(); double PhiEqpr = sqrt(PhiEqpr2); // -> second invariant @@ -498,6 +537,7 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL } else{ if (f>_tol){ + // Msg::Error("Plasticity"); q1->getRefToDissipationActive() = true; // plasticity @@ -521,7 +561,7 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL dCxtrdDgamma += (2.*_b/3.)*m(1)*pow(kk,1)*dHb; // pow(kk,2) DEBUG // Get Hp = dPhiPdDgamma, dPhiPdGamma - double Hp = 2*_b*pow(kk,1)*Gamma/3.*ptilde*( Hb/pow(Cxtr,2)*dCxtrdDgamma - 1./Cxtr*dHb ) * Dho2_v_inv; // pow(kk,2) DEBUG + double Hp = ( 2*_b*pow(kk,1)*Gamma/3.*ptilde*(Hb/pow(Cxtr,2)*dCxtrdDgamma-1./Cxtr*dHb) + 1./3.*trXn/pow(Cxtr,2)*dCxtrdDgamma ) * Dho2_v_inv; // pow(kk,2) DEBUG double dPhiPdGamma = -2*_b*ptilde*(Ke + pow(kk,1)*Hb/(3.*Cxtr)) * Dho2_v_inv; // pow(kk,2) DEBUG // Get He = dPhiEdGamma @@ -533,8 +573,10 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL for (int i=0; i<3; i++) for (int j=0; j<3; j++){ - DdevPhidDgamma_RHS(i,j) += ( 0.5*2*_b*Gamma*Ke*Hp*_I(i,j) + 3*Gamma*pow(kk,1)*( Hb/pow(Cxdev,2.)*dCxdevdDgamma - dHb/Cxdev ) * devPhi(i,j) ); // pow(kk,2) DEBUG - DdevPhidGamma_RHS(i,j) += ( -0.5*2*_b*Ke*(-ptilde-Gamma*dPhiPdGamma)*_I(i,j) - 3*pow(kk,1)*Hb/Cxdev*devPhi(i,j) ); // pow(kk,2) DEBUG + DdevPhidDgamma_RHS(i,j) += ( 0.5*2*_b*Gamma*Ke*Hp*_I(i,j) + + 3*Gamma*pow(kk,1)*( Hb/pow(Cxdev,2.)*dCxdevdDgamma - dHb/Cxdev ) * devPhi(i,j) + + devXn(i,j)/pow(Cxdev,2.)*dCxdevdDgamma ); // pow(kk,2) DEBUG + DdevPhidGamma_RHS(i,j) += ( 0.5*2*_b*Ke*(ptilde+Gamma*dPhiPdGamma)*_I(i,j) - 3*pow(kk,1)*Hb/Cxdev*devPhi(i,j) ); // pow(kk,2) DEBUG for (int k=0; k<3; k++) for (int l=0; l<3; l++){ DdevPhidDgamma_RHS(i,j) += 0.5* 2.*_b/3.*Gamma*(-Ge_TrEeTensor(i,j,k,l) + Dho(i,j,k,l))*_I(k,l)*Hp; @@ -574,7 +616,7 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL if (Gamma>0 and etaOverDt>0) dfdGamma -= pow(etaOverDt,_p)*_p*pow(Gamma,(_p-1.)); - DfDGamma = dfdDgamma*dDgammaDGamma + dfdGamma; + DfDGamma = dfdDgamma*dDgammaDGamma + dfdGamma; // unused dgdDgamma = 1. - kk*Gamma*dAdDgamma; dgdGamma = - dDgammaDGamma; @@ -623,13 +665,14 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL } // Update Phi - if (_extraBranchNLType != TensionCompressionRegularisedType && _ExtraBranch_TVE_option != 3){ + if (_extraBranchNLType == TensionCompressionRegularisedType || _extraBranchNLType == hyper_exp_TCasymm_Type || _ExtraBranch_TVE_option == 3 || _ExtraBranch_TVE_option == 4 || _ExtraBranch_TVE_option == 5){ + // TC asymmetry -> for either case of TensionCompressionRegularisedType and _ExtraBranch_TVE_option == 3 getIterated_DPhi(T0,T,q0,q1,Gamma,Cxtr,Cxdev,Cepr,Eepr,trXn,devXn,Ke,Ge,Ge_Tensor,ptilde,devPhi,Phi,N,expGN,dexpAdA, - Dho,Dho2inv,Dho2_u_inv,Dho2_v_inv); + Dho,Dho2inv,Dho2_u_inv,Dho2_v_inv,&Ge_TrEeTensor); } - else{ // TC asymmetry -> for either case of TensionCompressionRegularisedType and _ExtraBranch_TVE_option == 3 + else{ getIterated_DPhi(T0,T,q0,q1,Gamma,Cxtr,Cxdev,Cepr,Eepr,trXn,devXn,Ke,Ge,Ge_Tensor,ptilde,devPhi,Phi,N,expGN,dexpAdA, - Dho,Dho2inv,Dho2_u_inv,Dho2_v_inv,&Ge_TrEeTensor); + Dho,Dho2inv,Dho2_u_inv,Dho2_v_inv); } PhiEq = sqrt(1.5*devPhi.dotprod()); @@ -657,7 +700,7 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL if (fabs(f) <_tol) break; if(ite > maxite){ - Msg::Error("No convergence for plastic correction in mlawNonLinearTVP nonAssociatedFlow Maxwell iter = %d, f = %e!!",ite,f); + Msg::Error("No convergence for plastic correction in mlawNonLinearTVENonLinearTVP nonAssociatedFlow iter = %d, f = %e!!",ite,f); P(0,0) = P(1,1) = P(2,2) = sqrt(-1.); return; } @@ -675,13 +718,14 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL } // Correct Phi - if (_extraBranchNLType != TensionCompressionRegularisedType && _ExtraBranch_TVE_option != 3){ + if (_extraBranchNLType == TensionCompressionRegularisedType || _extraBranchNLType == hyper_exp_TCasymm_Type || _ExtraBranch_TVE_option == 3 || _ExtraBranch_TVE_option == 4 || _ExtraBranch_TVE_option == 5){ + // TC asymmetry -> for either case of TensionCompressionRegularisedType and _ExtraBranch_TVE_option == 3 getIterated_DPhi(T0,T,q0,q1,Gamma,Cxtr,Cxdev,Cepr,Eepr,trXn,devXn,Ke,Ge,Ge_Tensor,ptilde,devPhi,Phi,N,expGN,dexpAdA, - Dho,Dho2inv,Dho2_u_inv,Dho2_v_inv); + Dho,Dho2inv,Dho2_u_inv,Dho2_v_inv,&Ge_TrEeTensor); } - else{ // TC asymmetry -> for either case of TensionCompressionRegularisedType and _ExtraBranch_TVE_option == 3 + else{ getIterated_DPhi(T0,T,q0,q1,Gamma,Cxtr,Cxdev,Cepr,Eepr,trXn,devXn,Ke,Ge,Ge_Tensor,ptilde,devPhi,Phi,N,expGN,dexpAdA, - Dho,Dho2inv,Dho2_u_inv,Dho2_v_inv,&Ge_TrEeTensor); + Dho,Dho2inv,Dho2_u_inv,Dho2_v_inv); } PhiEq = sqrt(1.5*devPhi.dotprod()); @@ -705,7 +749,13 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL STensorOperation::inverseSTensor3(Fp1,Fpinv); STensorOperation::multSTensor3(F,Fpinv,Fe); STensorOperation::multSTensor3FirstTranspose(Fe,Fe,Ce); - STensorOperation::logSTensor3(Ce,_order,Ee,&DlnDCe,&DDlnDDCe); + + bool ok=STensorOperation::logSTensor3(Ce,_order,Ee,&DlnDCe,&DDlnDDCe); + if(!ok) + { + P(0,0) = P(1,1) = P(2,2) = sqrt(-1.); + return; + } Ee *= 0.5; // Corrected corKir, mandel, backStress are already in the IP due to getIterated_DPhi @@ -735,12 +785,13 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL } // 2nd if else{ q1->getRefToDissipationActive() = false; + // Msg::Error("Elasticity"); } } // 1st if const STensor3& KS = q1->_kirchhoff; + mlawNonLinearTVP::getModifiedMandel(Ce, q0, q1); // update Mandel - const STensor3& MS = q1->_ModMandel; Me = MS; // second Piola Kirchhoff stress @@ -762,6 +813,10 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL STensor3& Dpsi_DE = q1->getRefTo_Dpsi_DE(); q1->_elasticEnergy = mlawNonLinearTVM::freeEnergyMechanical(*q0,*q1,T0,T,&Dpsi_DT,&Dpsi_DE); + // TVP energy + double psi_TVP = freeEnergyPlasticity(q0,q1,T0,T); + // q1->_elasticEnergy += psi_TVP; + // Mullins Effect if (_mullinsEffect != NULL && q1->_ipMullinsEffect != NULL){ mlawNonLinearTVM::calculateMullinsEffectScaler(q0, q1, T, &Dpsi_DT); @@ -1010,7 +1065,8 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL for (int i=0; i<3; i++) for (int j=0; j<3; j++){ DphiPDCepr(i,j) += ( - Ke* 2.*_b*ptilde*DGDCepr(i,j) - - 2.*_b*pow(kk,1)/3. * ( (dHb/Cxtr - Hb/pow(Cxtr,2)*dCxtrdDgamma)*DgammaDCepr(i,j)*Gamma*ptilde + Hb/Cxtr*DGDCepr(i,j)*ptilde ) ); + - 2.*_b*pow(kk,1)/3. * ( (dHb/Cxtr - Hb/pow(Cxtr,2)*dCxtrdDgamma)*DgammaDCepr(i,j)*Gamma*ptilde + Hb/Cxtr*DGDCepr(i,j)*ptilde ) + + 1./3.*trXn/pow(Cxtr,2)*dCxtrdDgamma*DgammaDCepr(i,j)); // DEBUG pow(kk,2) } DphiPDCepr *= Dho2_v_inv; @@ -1039,7 +1095,8 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL for (int l=0; l<3; l++){ DdevphiDCepr_RHS(i,j,k,l) += ( 0.5*( G1(i,j,k,l) - _I(i,j)*DpDCepr(k,l) ) - - 3.*pow(kk,1)*( ( dHb/Cxdev - Hb/pow(Cxdev,2)*dCxdevdDgamma )*Gamma*devPhi(i,j)*DgammaDCepr(k,l) + Hb/Cxdev*devPhi(i,j)*DGDCepr(k,l) ) ); // DEBUG pow(kk,2) + - 3.*pow(kk,1)*( ( dHb/Cxdev - Hb/pow(Cxdev,2)*dCxdevdDgamma )*Gamma*devPhi(i,j)*DgammaDCepr(k,l) + Hb/Cxdev*devPhi(i,j)*DGDCepr(k,l) ) + + 1./pow(Cxdev,2)*dCxdevdDgamma*devXn(i,j)*DgammaDCepr(k,l)); // DEBUG pow(kk,2) for (int p=0; p<3; p++) for (int q=0; q<3; q++){ @@ -1126,11 +1183,13 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL for (int i=0; i<3; i++) for (int j=0; j<3; j++){ dTrXdCepr(i,j) = pow(kk,1.)*( (dHb/Cxtr - Hb/pow(Cxtr,2)*dCxtrdDgamma)*Gamma*trN*DgammaDCepr(i,j) + - Hb/Cxtr*( trN*DGDCepr(i,j) + Gamma*DtrNDCepr(i,j) ) ); // pow(kk,2.) DEBUG + Hb/Cxtr*( trN*DGDCepr(i,j) + Gamma*DtrNDCepr(i,j) ) ) + - trXn/pow(Cxtr,2)*dCxtrdDgamma*DgammaDCepr(i,j); // pow(kk,2.) DEBUG for (int k=0; k<3; k++) for (int l=0; l<3; l++){ - dDevXdCepr(i,j,k,l) = pow(kk,1.)*( (dHb/Cxdev - Hb/pow(Cxdev,2)*dCxtrdDgamma)*Gamma*devN(i,j)*DgammaDCepr(k,l) + - Hb/Cxdev*( devN(i,j)*DGDCepr(k,l) + Gamma*DdevNDCepr(i,j,k,l) ) ); // pow(kk,2.) DEBUG + dDevXdCepr(i,j,k,l) = pow(kk,1.)*( (dHb/Cxdev - Hb/pow(Cxdev,2)*dCxdevdDgamma)*Gamma*devN(i,j)*DgammaDCepr(k,l) + + Hb/Cxdev*( devN(i,j)*DGDCepr(k,l) + Gamma*DdevNDCepr(i,j,k,l) ) ) + - 1./pow(Cxdev,2)*dCxdevdDgamma*devXn(i,j)*DgammaDCepr(k,l); // pow(kk,2.) DEBUG } } @@ -1347,7 +1406,9 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL DpDT = DcorKirDT.trace()/3.; // 5.2 update dPhiPdT, dDevPhiDT to get dAdT, dfdT, dgdT - dPhiPdT = DpDT + Ke*(-2*_b*ptilde*dGammaDT) - 2.*_b*pow(kk,1)/3.*( (dHbdT/Cxtr - Hb/pow(Cxtr,2)*dCxtrdT ) *Gamma*ptilde + Hb/Cxtr*dGammaDT*ptilde ); // pow(kk,2.) DEBUG + dPhiPdT = DpDT + Ke*(-2*_b*ptilde*dGammaDT) + - 2.*_b*pow(kk,1)/3.*( (dHbdT/Cxtr - Hb/pow(Cxtr,2)*dCxtrdT ) *Gamma*ptilde + Hb/Cxtr*dGammaDT*ptilde ) + + 1./3.*trXn/pow(Cxtr,2)*dCxtrdT ; // pow(kk,2.) DEBUG dPhiPdT *= Dho2_v_inv; // 5.3 update DpDT @@ -1358,7 +1419,8 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL for (int i=0; i<3; i++) for (int j=0; j<3; j++){ DdevphiDT_RHS(i,j) = 0.5*( dDevCorKirDT(i,j) - DpDT*_I(i,j)) - - 3*pow(kk,1)*( (dHbdT/Cxdev - Hb/pow(Cxdev,2)*dCxdevdT)*Gamma*devPhi(i,j) + Hb/Cxdev*dGammaDT*devPhi(i,j) ) ;// pow(kk,2.) DEBUG + - 3*pow(kk,1)*( (dHbdT/Cxdev - Hb/pow(Cxdev,2)*dCxdevdT)*Gamma*devPhi(i,j) + Hb/Cxdev*dGammaDT*devPhi(i,j) ) + + 1./pow(Cxdev,2)*dCxdevdT*devXn(i,j); // pow(kk,2.) DEBUG for (int k=0; k<3; k++) for (int l=0; l<3; l++){ DdevphiDT_RHS(i,j) += 0.5*( -3*dGammaDT*Ge_Tensor(i,j,k,l)*devPhi(k,l) @@ -1403,7 +1465,9 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL DpDT = DcorKirDT.trace()/3.; // 10. update dPhiPdT - dPhiPdT = DpDT + Ke*(-2*_b*ptilde*dGammaDT) - 2.*_b*pow(kk,1)/3.*( (dHbdT/Cxtr - Hb/pow(Cxtr,2)*dCxtrdT ) *Gamma*ptilde + Hb/Cxtr*dGammaDT*ptilde ); // pow(kk,2.) DEBUG + dPhiPdT = DpDT + Ke*(-2*_b*ptilde*dGammaDT) + - 2.*_b*pow(kk,1)/3.*( (dHbdT/Cxtr - Hb/pow(Cxtr,2)*dCxtrdT ) *Gamma*ptilde + Hb/Cxtr*dGammaDT*ptilde ) + + 1./3.*trXn/pow(Cxtr,2)*dCxtrdT ; // pow(kk,2.) DEBUG dPhiPdT *= Dho2_v_inv; // 10.1 update DpDT 2 @@ -1414,7 +1478,8 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL for (int i=0; i<3; i++) for (int j=0; j<3; j++){ DdevphiDT_RHS(i,j) = 0.5*( dDevCorKirDT(i,j) - DpDT*_I(i,j)) - - 3*pow(kk,1)*( (dHbdT/Cxdev - Hb/pow(Cxdev,2)*dCxdevdT)*Gamma*devPhi(i,j) + Hb/Cxdev*dGammaDT*devPhi(i,j) ) ;// pow(kk,2.) DEBUG + - 3*pow(kk,1)*( (dHbdT/Cxdev - Hb/pow(Cxdev,2)*dCxdevdT)*Gamma*devPhi(i,j) + Hb/Cxdev*dGammaDT*devPhi(i,j) ) + + 1./pow(Cxdev,2)*dCxdevdT*devXn(i,j); // pow(kk,2.) DEBUG for (int k=0; k<3; k++) for (int l=0; l<3; l++){ DdevphiDT_RHS(i,j) += 0.5*( -3*dGammaDT*Ge_Tensor(i,j,k,l)*devPhi(k,l) @@ -1459,10 +1524,11 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL } // 14. dXdT - backstress temperature derivative -> correction - CHECK!!! - DtrXdT = pow(kk,1.)*( (dHbdT/Cxtr - Hb/pow(Cxtr,2)*dCxtrdT ) *Gamma*trN + Hb/Cxtr*(dGammaDT*trN + Gamma*DtrNdT) ); // pow(kk,2.) DEBUG + DtrXdT = pow(kk,1.)*( (dHbdT/Cxtr - Hb/pow(Cxtr,2)*dCxtrdT ) *Gamma*trN + Hb/Cxtr*(dGammaDT*trN + Gamma*DtrNdT) ) - trXn/pow(Cxtr,2)*dCxtrdT; // pow(kk,2.) DEBUG for (int i=0; i<3; i++) for (int j=0; j<3; j++) - DdevXdT(i,j) = pow(kk,1.)*( (dHbdT/Cxdev - Hb/pow(Cxdev,2)*dCxdevdT)*Gamma*devN(i,j) + Hb/Cxdev*( dGammaDT*devN(i,j) + Gamma*DdevNdT(i,j) ) ) ; // pow(kk,2.) DEBUG + DdevXdT(i,j) = pow(kk,1.)*( (dHbdT/Cxdev - Hb/pow(Cxdev,2)*dCxdevdT)*Gamma*devN(i,j) + Hb/Cxdev*( dGammaDT*devN(i,j) + Gamma*DdevNdT(i,j) ) ) + - 1./pow(Cxdev,2)*dCxdevdT * devXn(i,j); // pow(kk,2.) DEBUG STensorOperation::zero(dXdT); dXdT = DdevXdT; @@ -1681,13 +1747,22 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL double& dWmdT_TVE = q1->getRefTodMechSrcTVEdT(); STensor3& dWmdF_TVE = q1->getRefTodMechSrcTVEdF(); static STensor3 dWmdE_TVE; - getMechSource_nonLinearTVE_term(q0,q1,T0,T,Wm_TVE,stiff,dWmdE_TVE,dWmdT_TVE); + mlawNonLinearTVM::getMechSource_nonLinearTVE_term(q0,q1,T0,T,Wm_TVE,stiff,dWmdE_TVE,dWmdT_TVE); mechanicalSource += Wm_TVE; // 3) Viscoplastic Contribution to mechSrc getMechSourceTVP(F0,F,q0,q1,T0,T,Fepr,Cepr,DphiPDF,&Wm_TVP); mechanicalSource += Wm_TVP; + // Compute mechanicalSource for Mullin's Effect + if (_mullinsEffect != NULL && q1->_ipMullinsEffect != NULL){ + + mechanicalSource *= q1->_ipMullinsEffect->getEta(); + if (this->getTimeStep() > 0){ + mechanicalSource -= q1->_ipMullinsEffect->getDpsiNew_DpsiMax()*(q1->_ipMullinsEffect->getpsiMax() - q0->_ipMullinsEffect->getpsiMax())/this->getTimeStep(); + } + } + // freeEnergy and elastic energy double& psiTVM = q1->getRefToFreeEnergyTVM(); // getFreeEnergyTVM(q0,q1,T0,T,&psiTVM,NULL); @@ -1866,9 +1941,8 @@ void mlawNonLinearTVENonLinearTVP::getDho(const double& Gamma, const STensor3& C for (int p=0; p<3; p++) for (int q=0; q<3; q++) for (int r=0; r<3; r++) - for (int s=0; s<3; s++) - dDhoHdH(i,j,k,l) += 0.5*(dHinvHinvdH(i,p,k,l)*CeprKSCeinvpr(p,q)*expGN(r,s)*expGN(s,j) + - Hinv(i,p)*Hinv(p,q)*CeprKSCeinvpr(q,r)*dHHdH(s,j,k,l)); + dDhoHdH(i,j,k,l) += (dHinvHinvdH(i,p,k,l)*CeprKSCeinvpr(p,q)*expGN(q,r)*expGN(r,j) + + Hinv(i,p)*Hinv(p,q)*CeprKSCeinvpr(q,r)*dHHdH(r,j,k,l)); // 0.5* - CHECKERS } // Dho -> 1st term @@ -1963,7 +2037,7 @@ void mlawNonLinearTVENonLinearTVP::getDho(const double& Gamma, const STensor3& C Dho2_u(i,j,k,l) += 3*Gamma*pow(kk,1)*Hb/Cxdev * _I4(i,j,k,l); // DEBUG pow(kk,2) for (int p=0; p<3; p++) for (int q=0; q<3; q++){ - Dho2_u(i,j,k,l) += 1.5*Gamma*(Ge_Tensor(i,j,p,q)*_I4(p,q,k,l) - Dho(i,j,p,q)*_I4(p,q,k,l)); + Dho2_u(i,j,k,l) += 1.5*Gamma*(Ge_Tensor(i,j,p,q)*_Idev(p,q,k,l) - Dho(i,j,p,q)*_I4(p,q,k,l)); // Ge_Tensor(i,j,p,q)*_I4(p,q,k,l) - CHECKERS } } if (Ge_TrEeTensor!= NULL){ @@ -2015,18 +2089,29 @@ void mlawNonLinearTVENonLinearTVP::getIterated_DPhi(const double& T0, const doub // Initialise Ee static STensor3 Ee; + /* for (int i=0; i<3; i++) for (int j=0; j<3; j++) - Ee(i,j) = Eepr(i,j) - Gamma*N(i,j); - + Ee(i,j) = Eepr(i,j) - Gamma*N(i,j);*/ + bool ok=STensorOperation::logSTensor3(Ce,_order,Ee); + if(!ok) + { + Phi(0,0) = Phi(1,1) = Phi(2,2) = sqrt(-1.); + return; + } + Ee *= 0.5; + // Initialise corKir static STensor3 KS; static STensor43 Bd_stiffnessTerm; + double DKDTsum, DGDTsum; if (Ge_TrEeTensor == NULL){ - mlawNonLinearTVM::ThermoViscoElasticPredictor_forTVP(Ee,q0->_Ee,q0,q1,Ke,Ge,T0,T,true,Bd_stiffnessTerm); + // mlawNonLinearTVM::ThermoViscoElasticPredictor_forTVP(Ee,q0->_Ee,q0,q1,Ke,Ge,T0,T,true,Bd_stiffnessTerm); + mlawNonLinearTVM::ThermoViscoElasticPredictor(Ee,q0->_Ee,q0,q1,Ke,Ge,DKDTsum,DGDTsum,T0,T,true,Bd_stiffnessTerm); } else{ // TC asymmetry - mlawNonLinearTVM::ThermoViscoElasticPredictor_forTVP(Ee,q0->_Ee,q0,q1,Ke,Ge,T0,T,true,Bd_stiffnessTerm,Ge_TrEeTensor); + // mlawNonLinearTVM::ThermoViscoElasticPredictor_forTVP(Ee,q0->_Ee,q0,q1,Ke,Ge,T0,T,true,Bd_stiffnessTerm,Ge_TrEeTensor); + mlawNonLinearTVM::ThermoViscoElasticPredictor(Ee,q0->_Ee,q0,q1,Ke,Ge,DKDTsum,DGDTsum,T0,T,true,Bd_stiffnessTerm,Ge_TrEeTensor); } Ge_Tensor = _I4; Ge_Tensor *= Ge*2; // *2 because the function doesnt do it @@ -2065,11 +2150,11 @@ void mlawNonLinearTVENonLinearTVP::getIterated_DPhi(const double& T0, const doub // Initialise J_tol double J_tol = 0.; - for (int i=0; i<3; i++){ - for (int j=0; j<3; j++){ - J_tol += abs(J(i,j)) ; - } - } + J_tol = J.norm0(); + J_tol/=(_K+_G); + for (int i=0; i<3; i++) + for (int j=0; j<3; j++) + // J_tol += abs(J(i,j)) ; // Initialise Dho, Dho2, Dho2inv if (Ge_TrEeTensor == NULL){ @@ -2083,17 +2168,81 @@ void mlawNonLinearTVENonLinearTVP::getIterated_DPhi(const double& T0, const doub static STensor3 DPhi; // Initialise numerical quantities - /* - static STensor3 Phi_plus, J_plus, devPhi_plus, N_plus, Ee_plus,sigExtra_plus; - double pPhi_plus, perturbation_factor; - static STensor43 dJdPhi_plus, dJdPhi_plus_inv;*/ + static STensor3 Phi_plus, J_plus, devPhi_plus, N_plus, GammaN_plus, Ee_plus, Ce_plus, KS_plus, MS_plus, expGN_plus, Hinv_plus, devN_plus, devX_plus; + double pPhi_plus,Ke_plus,Ge_plus, trN_plus, trX_plus; + static STensor43 dJdPhi_plus, dJdPhi_plus_inv, dexpAdA_plus, Bd_stiffnessTerm_plus,Ge_Tensor_plus; + STensor43* Ge_TrEeTensor_plus = NULL; + static IPNonLinearTVP q1_plus(*q0); int ite = 0; - int maxite = 1000; + int maxite = 100; double tol = 1e-9; while (fabs(J_tol) > tol or ite <1){ + // numerical Dho4inv (Jacobian dJ/dPhi) + // _perturbationfactor = DPhi_numerical + /* + for (int i=0; i<3; i++){ + for (int j=0; j<3; j++){ + Phi_plus = Phi; + Phi_plus(i,j) += 0.5*_perturbationfactor; + Phi_plus(j,i) += 0.5*_perturbationfactor; + STensorOperation::decomposeDevTr(Phi_plus,devPhi_plus,pPhi_plus); + pPhi_plus = Phi_plus.trace()/3; + N_plus = _I; + N_plus *= 2.*_b/3; + N_plus += 3*devPhi_plus; + GammaN_plus = N_plus; + GammaN_plus *= Gamma; + STensorOperation::expSTensor3(GammaN_plus,_order,expGN_plus,&dexpAdA_plus); + STensorOperation::inverseSTensor3(expGN_plus,Hinv_plus); + + // update Ce, Ceinv + for (int ii=0; ii<3; ii++) + for (int jj=0; jj<3; jj++){ + Ce_plus(ii,jj) = 0.; + for (int kk=0; kk<3; kk++) + for (int ll=0; ll<3; ll++) + Ce_plus(ii,jj) += Hinv_plus(ii,kk)*Hinv_plus(kk,ll)*Cepr(ll,jj); + } + + Ee_plus = - Gamma*N_plus; + Ee_plus += Eepr(i,j); + if (Ge_TrEeTensor_plus == NULL){ + mlawNonLinearTVM::ThermoViscoElasticPredictor(Ee_plus,q0->_Ee,q0,&q1_plus,Ke_plus,Ge_plus,DKDTsum,DGDTsum,T0,T,true,Bd_stiffnessTerm_plus); + } + else{ // TC asymmetry + mlawNonLinearTVM::ThermoViscoElasticPredictor(Ee_plus,q0->_Ee,q0,&q1_plus,Ke_plus,Ge_plus,DKDTsum,DGDTsum,T0,T,true,Bd_stiffnessTerm_plus,Ge_TrEeTensor_plus); + } + Ge_Tensor_plus = _I4; + Ge_Tensor_plus *= Ge_plus*2; // *2 because the function doesnt do it + Ge_Tensor_plus += Bd_stiffnessTerm_plus; + KS_plus = q1_plus._kirchhoff; + + // update mandel + mlawNonLinearTVP::getModifiedMandel(Ce_plus, q0, &q1_plus); + MS_plus = q1_plus._ModMandel; + + STensorOperation::decomposeDevTr(N_plus,devN_plus,trN_plus); + devX_plus = pow(kk,1)*Hb*Gamma*devN_plus + devXn; // pow(kk,2) DEBUG + devX_plus *= 1./Cxdev; + trX_plus = (pow(kk,1)*Hb*Gamma*trN_plus + trXn)*1./Cxtr; // pow(kk,2) DEBUG + q1_plus._backsig = devX_plus; + q1_plus._backsig(0,0) += trX_plus/3.; + q1_plus._backsig(1,1) += trX_plus/3.; + q1_plus._backsig(2,2) += trX_plus/3.; + + for (int k=0; k<3; k++){ + for (int l=0; l<3; l++){ + J_plus(k,l) = Phi_plus(k,l) - MS_plus(k,l) + q1_plus._backsig(k,l); + dJdPhi_plus(k,l,i,j) = (J_plus(k,l) - J(k,l))/(_perturbationfactor); + } + } + } + } + STensorOperation::inverseSTensor43(dJdPhi_plus,dJdPhi_plus_inv);*/ + // update DPhi for (int i=0; i<3; i++) for (int j=0; j<3; j++){ @@ -2140,16 +2289,26 @@ void mlawNonLinearTVENonLinearTVP::getIterated_DPhi(const double& T0, const doub } // update Ee + /* for (int i=0; i<3; i++) for (int j=0; j<3; j++) - Ee(i,j) = Eepr(i,j) - Gamma*N(i,j); + Ee(i,j) = Eepr(i,j) - Gamma*N(i,j);*/ + bool ok=STensorOperation::logSTensor3(Ce,_order,Ee); + if(!ok) + { + Phi(0,0) = Phi(1,1) = Phi(2,2) = sqrt(-1.); + return; + } + Ee *= 0.5; // update corKir if (Ge_TrEeTensor == NULL){ - mlawNonLinearTVM::ThermoViscoElasticPredictor_forTVP(Ee,q0->_Ee,q0,q1,Ke,Ge,T0,T,true,Bd_stiffnessTerm); + // mlawNonLinearTVM::ThermoViscoElasticPredictor_forTVP(Ee,q0->_Ee,q0,q1,Ke,Ge,T0,T,true,Bd_stiffnessTerm); + mlawNonLinearTVM::ThermoViscoElasticPredictor(Ee,q0->_Ee,q0,q1,Ke,Ge,DKDTsum,DGDTsum,T0,T,true,Bd_stiffnessTerm); } else{ // TC asymmetry - mlawNonLinearTVM::ThermoViscoElasticPredictor_forTVP(Ee,q0->_Ee,q0,q1,Ke,Ge,T0,T,true,Bd_stiffnessTerm,Ge_TrEeTensor); + // mlawNonLinearTVM::ThermoViscoElasticPredictor_forTVP(Ee,q0->_Ee,q0,q1,Ke,Ge,T0,T,true,Bd_stiffnessTerm,Ge_TrEeTensor); + mlawNonLinearTVM::ThermoViscoElasticPredictor(Ee,q0->_Ee,q0,q1,Ke,Ge,DKDTsum,DGDTsum,T0,T,true,Bd_stiffnessTerm, Ge_TrEeTensor); } Ge_Tensor = _I4; Ge_Tensor *= Ge*2; // *2 because the function doesnt do it @@ -2195,16 +2354,17 @@ void mlawNonLinearTVENonLinearTVP::getIterated_DPhi(const double& T0, const doub J_tol = J.norm0(); J_tol/=(_K+_G); + // J_tol/=(1.e+10); ite++; - //if (ite> maxite-5) - // Msg::Info("it = %d, tol %e, J_tol = %e, Gamma = %e",ite,tol,J_tol,Gamma); + // if (ite> maxite-5) + // Msg::Info("ite = %d, tol %e, J_tol = %e, Gamma = %e",ite,tol,J_tol,Gamma); if (fabs(J_tol) <_tol) break; if(ite > maxite){ - Msg::Error("No convergence for iterated Phi mlawNonLinearTVENonLinearTVP nonAssociatedFlow Maxwell iter = %d, J_tol = %e!!",ite,J_tol); + Msg::Error("No convergence for iterated Phi mlawNonLinearTVENonLinearTVP nonAssociatedFlow iter = %d, J_tol = %e!!",ite,J_tol); Phi(0,0) = Phi(1,1) = Phi(2,2) = sqrt(-1.); return; } @@ -2679,4 +2839,4 @@ void mlawNonLinearTVENonLinearTVP::TEST_predictorCorrector_TVP_nonAssociatedFlow dHHdH_plus(k,l,i,j) = (HH_plus(k,l) - HH(k,l))/(_perturbationfactor); dHinvHinvdH_plus(k,l,i,j) = (HinvHinv_plus(k,l) - HinvHinv(k,l))/(_perturbationfactor); } -*/ \ No newline at end of file +*/ diff --git a/NonLinearSolver/materialLaw/mlawNonLinearTVENonLinearTVP.h b/NonLinearSolver/materialLaw/mlawNonLinearTVENonLinearTVP.h index 0b2fc4f1b25d887cb9f0beb8e7232f9b44c36473..981f958f0050801dd03f7826850831f351619b60 100644 --- a/NonLinearSolver/materialLaw/mlawNonLinearTVENonLinearTVP.h +++ b/NonLinearSolver/materialLaw/mlawNonLinearTVENonLinearTVP.h @@ -19,6 +19,7 @@ class mlawNonLinearTVENonLinearTVP : public mlawNonLinearTVP{ protected: protected: + virtual double freeEnergyPlasticity(const IPNonLinearTVP *q0, IPNonLinearTVP *q1, const double T0, const double T) const; virtual void getIterated_DPhi(const double& T0, const double& T, const IPNonLinearTVP *q0, IPNonLinearTVP *q1, const double& Gamma, const double& Cxtr, const double& Cxdev, diff --git a/NonLinearSolver/materialLaw/mlawNonLinearTVM.cpp b/NonLinearSolver/materialLaw/mlawNonLinearTVM.cpp index 800287d6854a190e786bc69cdc71b2a18b336bfe..e235103549c8c13c2e9b3a05870bfc8ab9d4b9e4 100644 --- a/NonLinearSolver/materialLaw/mlawNonLinearTVM.cpp +++ b/NonLinearSolver/materialLaw/mlawNonLinearTVM.cpp @@ -21,7 +21,9 @@ mlawNonLinearTVM::mlawNonLinearTVM(const int num,const double E,const double nu, mlawPowerYieldHyper(num, E, nu, rho, tol, matrixbyPerturbation, pert), _Tinitial(Tinitial),_scalarAlpha(Alpha),_scalarK(KThCon),_Cp(Cp), _thermalEstimationPreviousConfig(thermalEstimationPreviousConfig), _mullinsEffect(NULL), _elasticPotential(NULL), - _useExtraBranch(false), _useExtraBranch_TVE(false), _ExtraBranch_TVE_option(2){ + _useExtraBranch(false), _useExtraBranch_TVE(false), _ExtraBranch_TVE_option(2), _V0(0.),_V1(0.),_V2(0.),_D0(0.),_D1(0.),_D2(0.),_Ci(0.), + _V3(0.),_V4(0.),_V5(0.),_D3(0.),_D4(0.),_D5(0.){ + _G = _mu; @@ -61,7 +63,9 @@ mlawNonLinearTVM::mlawNonLinearTVM(const mlawNonLinearTVM& src): mlawPowerYieldH _useExtraBranch = src._useExtraBranch; _useExtraBranch_TVE = src._useExtraBranch_TVE; _ExtraBranch_TVE_option = src._ExtraBranch_TVE_option; - + _V0 = src._V0; _V1 = src._V1; _V2 = src._V2; _D0 = src._D0; _D1 = src._D1; _D2 = src._D2; _Ci = src._Ci; + _V3 = src._V3; _V4 = src._V4; _V5 = src._V5; _D3 = src._D3; _D4 = src._D4; _D5 = src._D5; + _temFunc_K = NULL; // bulk modulus if (src._temFunc_K != NULL){ _temFunc_K = src._temFunc_K->clone();} @@ -110,6 +114,9 @@ mlawNonLinearTVM& mlawNonLinearTVM::operator=(const materialLaw &source){ _useExtraBranch = src->_useExtraBranch; _useExtraBranch_TVE = src->_useExtraBranch_TVE; _ExtraBranch_TVE_option = src->_ExtraBranch_TVE_option; + _V0 = src->_V0; _V1 = src->_V1; _V2 = src->_V2; _D0 = src->_D0; _D1 = src->_D1; _D2 = src->_D2; _Ci = src->_Ci; + _V3 = src->_V3; _V4 = src->_V4; _V5 = src->_V5; _D3 = src->_D3; _D4 = src->_D4; _D5 = src->_D5; + if(_temFunc_K != NULL) delete _temFunc_K; // bulk modulus if (src->_temFunc_K != NULL){ _temFunc_K = src->_temFunc_K->clone();} @@ -159,10 +166,11 @@ void mlawNonLinearTVM::setViscoElasticNumberOfElement(const int N){ Msg::Info("Numer of Spring/Dashpot for viscoelastic model: %d",_N); _Ki.clear(); _ki.clear(); _Gi.clear(); _gi.clear(); - _Ki.resize(_N,0.); - _ki.resize(_N,0.); - _Gi.resize(_N,0.); - _gi.resize(_N,0.); + _Ki.resize(_N,0.); _ki.resize(_N,0.); + _Gi.resize(_N,0.); _gi.resize(_N,0.); + _V0.clear(); _V1.clear(); _V2.clear(); _D0.clear(); _D1.clear(); _D2.clear(); _Ci.clear(); _V3.clear(); _V4.clear(); _V5.clear(); _D3.clear(); _D4.clear(); _D5.clear(); + _V0.resize(_N,0.); _V1.resize(_N,0.); _V2.resize(_N,0.); _D0.resize(_N,0.); _D1.resize(_N,0.); _D2.resize(_N,0.); _Ci.resize(_N,0.); + _V3.resize(_N,0.); _V4.resize(_N,0.); _V5.resize(_N,0.); _D3.resize(_N,0.); _D4.resize(_N,0.); _D5.resize(_N,0.); }; void mlawNonLinearTVM::setViscoElasticData(const int i, const double Ei, const double taui){ @@ -182,6 +190,46 @@ void mlawNonLinearTVM::setViscoElasticData(const int i, const double Ei, const d } }; +void mlawNonLinearTVM::setCorrectionsAllBranchesTVE(const int i, const double V1, const double V2, const double D1, const double D2){ + if (i> _N or i<1) + Msg::Error("This setting is invalid %d > %d",i,_N); + else{ + _V1[i-1] = V1; _V2[i-1] = V2; _D1[i-1] = D1; _D2[i-1] = D2; + + Msg::Info("setting: element=%d, V1 = %e, V2 = %e, D1 = %e, D2 = %e",i-1,V1,V2,D1,D2); + } +}; + +void mlawNonLinearTVM::setAdditionalCorrectionsAllBranchesTVE(const int i, const double V3, const double D3){ + if (i> _N or i<1) + Msg::Error("This setting is invalid %d > %d",i,_N); + else{ + _V3[i-1] = V3; _D3[i-1] = D3; + + Msg::Info("setting: element=%d, V3 = %e, D3 = %e",i-1,V3,D3); + } +}; + +void mlawNonLinearTVM::setAdditionalCorrectionsAllBranchesTVE(const int i, const double V3, const double V4, const double V5, const double D3, const double D4, const double D5){ + if (i> _N or i<1) + Msg::Error("This setting is invalid %d > %d",i,_N); + else{ + _V3[i-1] = V3; _V4[i-1] = V4; _V5[i-1] = V5; _D3[i-1] = D3; _D4[i-1] = D4; _D5[i-1] = D5; + + Msg::Info("setting: element=%d, V3 = %e, V4 = %e, V5 = %e, D3 = %e, D4 = %e, D5 = %e",i-1,V3,V4,V5,D3,D4,D5); + } +}; + +void mlawNonLinearTVM::setCompressionCorrectionsAllBranchesTVE(const int i, const double Ci){ + if (i> _N or i<1) + Msg::Error("This setting is invalid %d > %d",i,_N); + else{ + _Ci[i-1] = Ci; + + Msg::Info("setting: element=%d, Ci = %e",i-1,Ci); + } +}; + void mlawNonLinearTVM::setViscoElasticData_Bulk(const int i, const double Ki, const double ki){ if (i> _N or i<1) Msg::Error("This setting is invalid %d > %d",i,_N); @@ -354,8 +402,8 @@ double mlawNonLinearTVM::setTemp(const double T0, const double T1, const int par double mlawNonLinearTVM::freeEnergyMechanical(const IPNonLinearTVM& q0, IPNonLinearTVM& q, const double T0, const double T, double* DpsiDT, STensor3* DpsiDE) const{ // Update the Properties to the current temperature (see below which ones are being used) - double KT, GT, AlphaT, dKdT, dGdT, dAlphaTdT; - getK(&q,KT,T,&dKdT); getG(&q,GT,T,&dGdT); getAlpha(AlphaT,T,&dAlphaTdT); + double KT, GT, AlphaT0, AlphaT, dKdT, dGdT, dAlphaTdT; + getK(&q,KT,T,&dKdT); getG(&q,GT,T,&dGdT); getAlpha(AlphaT,T,&dAlphaTdT); getAlpha(AlphaT0,T); double Psy_mech = 0.; @@ -369,7 +417,9 @@ double mlawNonLinearTVM::freeEnergyMechanical(const IPNonLinearTVM& q0, IPNonLin // Get thermal strain double Eth = 3.*AlphaT*(T-_Tinitial); - + double eff_trDE = q._trDE - 3.*(AlphaT*(T-_Tinitial) - AlphaT0*(T0-_Tinitial)); + double Deff_trDE_DT = -3.*(dAlphaTdT*(T-_Tinitial) + AlphaT); + // Get Equilibrium freeEnergy_mech Psy_mech = KT*0.5*(trEe-Eth)*(trEe-Eth) + GT*STensorOperation::doubledot(devEe,devEe); @@ -408,7 +458,7 @@ double mlawNonLinearTVM::freeEnergyMechanical(const IPNonLinearTVM& q0, IPNonLin // Psy_mech += q._psi_branch[i];*/ Msg::Info("setting: _ExtraBranch_TVE_option=%d integrates the viscoelastic stress and currently has no definition for deformation energy. Don't use it with mullin's effect",_ExtraBranch_TVE_option); } - else if (_ExtraBranch_TVE_option == 2 || _ExtraBranch_TVE_option == 3){ + else if (_ExtraBranch_TVE_option == 2 || _ExtraBranch_TVE_option == 3 || _ExtraBranch_TVE_option == 4 || _ExtraBranch_TVE_option == 5){ Psy_mech += _Ki[i]*q._intAv_TVE_vector[i] + 2*_Gi[i]*q._intBd_TVE_vector[i]; } } @@ -428,25 +478,30 @@ double mlawNonLinearTVM::freeEnergyMechanical(const IPNonLinearTVM& q0, IPNonLin // extraBranch terms if (_useExtraBranch){ - if(_extraBranchNLType != TensionCompressionRegularisedType){ - *DpsiDT += KT*q._intA*_temFunc_elasticCorrection_Bulk->getDiff(T) + dKdT*q._intA + - 2.*GT*q._intB*_temFunc_elasticCorrection_Shear->getDiff(T) + 2.*dGdT*q._intB; + // q._elasticBulkPropertyScaleFactor = -1 + Av // Same applies to intA, etc + + if(_extraBranchNLType != TensionCompressionRegularisedType && _extraBranchNLType != hyper_exp_TCasymm_Type){ + (*DpsiDT) += dKdT*q._intA + KT* (q._elasticBulkPropertyScaleFactor) *(trEe-Eth)* (-3*dAlphaTdT*(T-_Tinitial)-3*AlphaT) + + 2.*dGdT*q._intB; (*DpsiDE) += q._corKirExtra; } else{ + // _intA, _intB have CTasymm + // Regularising function double m = _tensionCompressionRegularisation; - double expmtr(0.); - if (exp(-m*trEe)<1.e+10){ expmtr = exp(-m*trEe);} + double expmtr = exp(-m*(trEe-Eth)); double sigmoid = 1/(1.+expmtr); double CTasymm = sigmoid + _compCorrection*(1.-sigmoid); - double dCTasymmDtrE = m*expmtr/pow((1.+expmtr),2.) - _compCorrection*m*expmtr/pow((1.+expmtr),2.); + double dCTasymmDtrE = m*expmtr/pow((1.+expmtr),2.)*(1.-_compCorrection); + double psy_inf = (KT*0.5*(trEe-Eth)*(trEe-Eth) + GT*STensorOperation::doubledot(devEe,devEe) + KT*q._intA + 2.*GT*q._intB)/CTasymm; - *DpsiDT += (KT*q._intA*_temFunc_elasticCorrection_Bulk->getDiff(T) + dKdT*q._intA + - 2.*GT*q._intB*_temFunc_elasticCorrection_Shear->getDiff(T) + 2.*dGdT*q._intB)*CTasymm; - (*DpsiDE) += q._corKirExtra; + (*DpsiDT) += dKdT*q._intA + (KT*(q._elasticBulkPropertyScaleFactor) *(trEe-Eth) * (-3*dAlphaTdT*(T-_Tinitial)-3*AlphaT)) + + 2.*dGdT*q._intB; + + (*DpsiDT) += psy_inf*dCTasymmDtrE*(-3*dAlphaTdT*(T-_Tinitial)-3*AlphaT); - double psy_inf = (KT*0.5*(trEe-Eth)*(trEe-Eth) + GT*STensorOperation::doubledot(devEe,devEe) + KT*q._intA + 2.*GT*q._intB); + (*DpsiDE) += q._corKirExtra; // already has CTasymm for (int j=0; j<3; j++) for (int k=0; k<3; k++) (*DpsiDE)(j,k) += psy_inf*dCTasymmDtrE*_I(j,k); @@ -467,7 +522,7 @@ double mlawNonLinearTVM::freeEnergyMechanical(const IPNonLinearTVM& q0, IPNonLin double Dexp_rec_g_DT(0.), Dexp_mid_g_DT(0.); double dtk(0.), dtk2(0.), exp_rec_k(0.), exp_mid_k(0.); double dtg(0.), dtg2(0.), exp_rec_g(0.), exp_mid_g(0.); - + static STensor43 temp; if ((_Ki.size() > 0) or (_Gi.size() > 0)){ @@ -519,21 +574,19 @@ double mlawNonLinearTVM::freeEnergyMechanical(const IPNonLinearTVM& q0, IPNonLin } } }*/ - Msg::Info("setting: _ExtraBranch_TVE_option=%d integrates the viscoelastic stress and currently has no definition for deformation energy. Don't use it with mullin's effect",_ExtraBranch_TVE_option); - + Msg::Info("setting: _ExtraBranch_TVE_option=%d integrates the viscoelastic stress and currently has no definition for deformation energy. Don't use it with mullin's effect",_ExtraBranch_TVE_option); } - else if (_ExtraBranch_TVE_option == 2 || _ExtraBranch_TVE_option == 3){ + else if (_ExtraBranch_TVE_option == 2 || _ExtraBranch_TVE_option == 3 || _ExtraBranch_TVE_option == 4 || _ExtraBranch_TVE_option == 5){ double dTrEei_DT(0.); // branchElasticStrain trace static STensor3 dDevEei_DT; - dTrEei_DT = q0._B[i] * Dexp_rec_k_DT + Dexp_mid_k_DT*q._trDE; + dTrEei_DT = q0._B[i] * Dexp_rec_k_DT + Dexp_mid_k_DT*eff_trDE + exp_mid_k*Deff_trDE_DT; // trDE; //NEW for (int k=0; k<3; k++) for (int l=0; l<3; l++) dDevEei_DT(k,l) = q0._A[i](k,l) * Dexp_rec_g_DT + Dexp_mid_g_DT*q._devDE(k,l); if (_ExtraBranch_TVE_option == 2){ - *DpsiDT += _Ki[i]*q._Av_TVE_vector[i]*q._B[i]*dTrEei_DT + _Gi[i]*2.*q._Bd_TVE_vector[i]*STensorOperation::doubledot(q._A[i],dDevEei_DT); - // STensorOperation::multSTensor43(q._DA_DdevE[i],_Idev,temp); + *DpsiDT += _Ki[i]*q._Av_TVE_vector[i]*q._B[i]*dTrEei_DT + 2.*_Gi[i]*q._Bd_TVE_vector[i]*STensorOperation::doubledot(q._A[i],dDevEei_DT); for (int j=0; j<3; j++) for (int k=0; k<3; k++){ (*DpsiDE)(j,k) += _Ki[i]*q._Av_TVE_vector[i]*q._B[i]*exp_mid_k*_I(j,k); @@ -542,28 +595,30 @@ double mlawNonLinearTVM::freeEnergyMechanical(const IPNonLinearTVM& q0, IPNonLin (*DpsiDE)(j,k) += 2*_Gi[i]*q._Bd_TVE_vector[i]*q._A[i](p,r)*exp_mid_g*_Idev(p,r,j,k); } } - else { // _ExtraBranch_TVE_option == 3 + else { // _ExtraBranch_TVE_option == 3 || _ExtraBranch_TVE_option == 4 || _ExtraBranch_TVE_option == 5 + + // NOTE : _Av_TVE_vector, _Bd_TVE_vector, _intAv_TVE_vector, _intBd_TVE_vector have CTasymm already + // Therefore, to derive CTasymm, first divide to remove it and then derive. // Regularising function double m = _tensionCompressionRegularisation; - double expmtr(0.); - if (exp(-m*q._B[i])<1.e+10){ expmtr = exp(-m*q._B[i]);} + double expmtr = exp(-m*q._B[i]); double sigmoid = 1/(1.+expmtr); double CTasymm = sigmoid + _compCorrection*(1.-sigmoid); - double dCTasymmDtrE = m*expmtr/pow((1.+expmtr),2.) - _compCorrection*m*expmtr/pow((1.+expmtr),2.); + double dCTasymmDtrE = m*expmtr/pow((1.+expmtr),2.)*(1.-_compCorrection); (*DpsiDT) += (_Ki[i]*q._Av_TVE_vector[i]*q._B[i]*dTrEei_DT + - _Gi[i]*2.*q._Bd_TVE_vector[i]*STensorOperation::doubledot(q._A[i],dDevEei_DT)) * CTasymm; + 2.*_Gi[i]*q._Bd_TVE_vector[i]*STensorOperation::doubledot(q._A[i],dDevEei_DT)); // * CTasymm; - (*DpsiDT) += (_Ki[i]*q._intAv_TVE_vector[i] + 2*_Gi[i]*q._intBd_TVE_vector[i]) * dCTasymmDtrE * dTrEei_DT; + (*DpsiDT) += (_Ki[i]*q._intAv_TVE_vector[i] + 2*_Gi[i]*q._intBd_TVE_vector[i])/CTasymm * dCTasymmDtrE * dTrEei_DT; for (int j=0; j<3; j++) for (int k=0; k<3; k++){ - (*DpsiDE)(j,k) += _Ki[i]*q._Av_TVE_vector[i]*q._B[i]*exp_mid_k*_I(j,k) * CTasymm; - (*DpsiDE)(j,k) += (_Ki[i]*q._intAv_TVE_vector[i] + 2*_Gi[i]*q._intBd_TVE_vector[i]) * dCTasymmDtrE * exp_mid_k*_I(j,k); + (*DpsiDE)(j,k) += _Ki[i]*q._Av_TVE_vector[i]*q._B[i]*exp_mid_k*_I(j,k); // * CTasymm; + (*DpsiDE)(j,k) += (_Ki[i]*q._intAv_TVE_vector[i] + 2.*_Gi[i]*q._intBd_TVE_vector[i])/CTasymm * dCTasymmDtrE * exp_mid_k*_I(j,k); for (int p=0; p<3; p++) for (int r=0; r<3; r++) - (*DpsiDE)(j,k) += 2*_Gi[i]*q._Bd_TVE_vector[i]*q._A[i](p,r)*exp_mid_g*_Idev(p,r,j,k) * CTasymm; + (*DpsiDE)(j,k) += 2.*_Gi[i]*q._Bd_TVE_vector[i]*q._A[i](p,r)*exp_mid_g*_Idev(p,r,j,k); // * CTasymm; } } @@ -572,8 +627,12 @@ double mlawNonLinearTVM::freeEnergyMechanical(const IPNonLinearTVM& q0, IPNonLin } } + + // *DpsiDE *= 1/_rho; + // *DpsiDT *= 1/_rho; } - + + // Psy_mech *= 1/_rho; return Psy_mech; } @@ -617,22 +676,27 @@ void mlawNonLinearTVM::evaluateElasticCorrection(const double trE, const STensor double &A_v, double &dA_vdE, double &intA, double &dAdT, double &B_d, STensor3 &dB_vddev, double &intB, double &dBdT, double *ddAdTT, double *ddBdTT, double *ddA_vdTdE, STensor3 *ddB_vdTdevE, - double *dB_dTrEe, double *dB_dTdTrEe) const{ + double *dB_dTrEe, double *dB_dTdTrEe, double* psiInfCorrector) const{ - if (_extraBranchNLType != TensionCompressionRegularisedType){ - mlawHyperViscoElastic::evaluatePhiPCorrection(trE,devE,A_v,dA_vdE,intA,B_d,dB_vddev,intB); + if (_extraBranchNLType != TensionCompressionRegularisedType && _extraBranchNLType != hyper_exp_TCasymm_Type){ + mlawHyperViscoElastic::evaluatePhiPCorrection(trE,devE,A_v,dA_vdE,intA,B_d,dB_vddev,intB,NULL,psiInfCorrector); } else{ - mlawHyperViscoElastic::evaluatePhiPCorrection(trE,devE,A_v,dA_vdE,intA,B_d,dB_vddev,intB,dB_dTrEe); - *dB_dTrEe *= _temFunc_elasticCorrection_Shear->getVal(T); - if(dB_dTdTrEe!=NULL){ - *dB_dTdTrEe = (*dB_dTrEe)*_temFunc_elasticCorrection_Bulk->getDiff(T); - } + mlawHyperViscoElastic::evaluatePhiPCorrection(trE,devE,A_v,dA_vdE,intA,B_d,dB_vddev,intB,dB_dTrEe,psiInfCorrector); + // *dB_dTrEe *= _temFunc_elasticCorrection_Shear->getVal(T); + // if(dB_dTdTrEe!=NULL){ + // *dB_dTdTrEe = (*dB_dTrEe)*_temFunc_elasticCorrection_Bulk->getDiff(T); + // } } + // TBD - tempfuncs for extraBranch + /* A_v *= _temFunc_elasticCorrection_Bulk->getVal(T); dA_vdE *= _temFunc_elasticCorrection_Bulk->getVal(T); intA *= _temFunc_elasticCorrection_Bulk->getVal(T); + if (psiInfCorrector != NULL){ + (*psiInfCorrector) *= _temFunc_elasticCorrection_Bulk->getVal(T); + } dAdT = A_v*_temFunc_elasticCorrection_Bulk->getDiff(T); if(ddAdTT!=NULL){ @@ -653,6 +717,7 @@ void mlawNonLinearTVM::evaluateElasticCorrection(const double trE, const STensor *ddB_vdTdevE = dB_vddev*_temFunc_elasticCorrection_Shear->getDiff(T); *ddB_vdTdevE *= 1/_temFunc_elasticCorrection_Shear->getVal(T); } + */ } void mlawNonLinearTVM::extraBranchLaw(const STensor3& Ee, const double& T, const IPNonLinearTVM *q0, IPNonLinearTVM *q1, @@ -665,6 +730,12 @@ void mlawNonLinearTVM::extraBranchLaw(const STensor3& Ee, const double& T, const { // DsigDEe = DcorKirDE + // NOTE: Ee = eff_trEe = trEe - 3*AlphaT*(T1-_Tinitial) + double AlphaT, DAlphaDT, DDAlphaDT; + getAlpha(AlphaT,T,&DAlphaDT,&DDAlphaDT); + double DtrEeDT = -3*(AlphaT + DAlphaDT*(T-_Tinitial)); + double DDtrEeDTT = -3*(2*DAlphaDT + DDAlphaDT*(T-_Tinitial)); + if (_extraBranchType == Bilogarithmic) { static STensor3 devEe; @@ -672,15 +743,17 @@ void mlawNonLinearTVM::extraBranchLaw(const STensor3& Ee, const double& T, const STensorOperation::decomposeDevTr(Ee,devEe,trEe); double A(0.), B(0.); - double dA_dTrEe(0.), dA_dTdTrEe(0.), dB_dTrEe(0.), dB_dTdTrEe(0.); + double dA_dTrEe(0.), dA_dTdTrEe(0.), dB_dTrEe(0.), dB_dTdTrEe(0.), psiInfCorrector(0.); STensor3 dB_dDevEe, ddB_dTdDevEe; double intA(0.), intB(0.), dA_dT(0.), dB_dT(0.), ddA_dTT(0.), ddB_dTT(0.); - if (_extraBranchNLType != TensionCompressionRegularisedType){ - evaluateElasticCorrection(trEe, devEe, T, A, dA_dTrEe, intA, dA_dT, B, dB_dDevEe, intB, dB_dT, &ddA_dTT, &ddB_dTT, &dA_dTdTrEe, &ddB_dTdDevEe); + if (_extraBranchNLType != TensionCompressionRegularisedType && _extraBranchNLType != hyper_exp_TCasymm_Type){ + evaluateElasticCorrection(trEe, devEe, T, A, dA_dTrEe, intA, dA_dT, B, dB_dDevEe, intB, dB_dT, &ddA_dTT, &ddB_dTT, &dA_dTdTrEe, &ddB_dTdDevEe, + NULL, NULL, &psiInfCorrector); } else { - evaluateElasticCorrection(trEe, devEe, T, A, dA_dTrEe, intA, dA_dT, B, dB_dDevEe, intB, dB_dT, &ddA_dTT, &ddB_dTT, &dA_dTdTrEe, &ddB_dTdDevEe, &dB_dTrEe, &dB_dTdTrEe); + evaluateElasticCorrection(trEe, devEe, T, A, dA_dTrEe, intA, dA_dT, B, dB_dDevEe, intB, dB_dT, &ddA_dTT, &ddB_dTT, &dA_dTdTrEe, &ddB_dTdDevEe, + &dB_dTrEe, &dB_dTdTrEe, &psiInfCorrector); } if (A <= -1. + 1.e-5){ // saturated @@ -699,6 +772,8 @@ void mlawNonLinearTVM::extraBranchLaw(const STensor3& Ee, const double& T, const } q1->_intB = intB; + q1->_psiInfCorrector = psiInfCorrector; // Additional term to correct thermal expansion term in free energy + // double check_1 = (1+A)*_K; // double check_2 = (1+B)*_G; // Msg::Error(" Inside extraBranchLaw, Kinf = %e, Ginf = %e !!", _K, _G); @@ -729,7 +804,7 @@ void mlawNonLinearTVM::extraBranchLaw(const STensor3& Ee, const double& T, const STensorOperation::prodAdd(devEe, dB_dDevEe, 2.*Gextra, *DsigDEe); STensorOperation::prodAdd(_I,_I,Kextra*(A+trEe*dA_dTrEe),*DsigDEe); - if (_extraBranchNLType == TensionCompressionRegularisedType){ + if (_extraBranchNLType == TensionCompressionRegularisedType || _extraBranchNLType == hyper_exp_TCasymm_Type){ STensorOperation::prodAdd(devEe, _I, 2.*Gextra*dB_dTrEe, *DsigDEe); } } @@ -751,31 +826,46 @@ void mlawNonLinearTVM::extraBranchLaw(const STensor3& Ee, const double& T, const } if(DsigV_dT!=NULL){ - *DsigV_dT = dKex_dT*A*trEe + Kextra*dA_dT*trEe; + dA_dT = dA_dTrEe*DtrEeDT; + *DsigV_dT = dKex_dT*A*trEe + Kextra*(dA_dT*trEe + A*DtrEeDT); } if(DsigD_dT!=NULL){ STensorOperation::zero(*DsigD_dT); + double temp = 2*dGex_dT*B; + if (_extraBranchNLType == TensionCompressionRegularisedType || _extraBranchNLType == hyper_exp_TCasymm_Type){ + temp += 2*Gextra*dB_dTrEe*DtrEeDT; + } *DsigD_dT = devEe; - *DsigD_dT *= (2*dGex_dT*B + 2*Gextra*dB_dT); + *DsigD_dT *= temp; } if(DDsigV_dTT!=NULL){ - *DDsigV_dTT = ddKex_dTT*A*trEe + 2*dKex_dT*dA_dT*trEe + Kextra*ddA_dTT*trEe; + dA_dT = dA_dTrEe*DtrEeDT; + ddA_dTT = dA_dTdTrEe*DtrEeDT + dA_dTrEe*DDtrEeDTT; + *DDsigV_dTT = ddKex_dTT*A*trEe + 2*dKex_dT*(dA_dT*trEe + A*DtrEeDT) + Kextra*(ddA_dTT*trEe + dA_dT*DtrEeDT + A*DDtrEeDTT); // ddA_dTdTrEe = 0. } if(DDsigD_dTT!=NULL){ STensorOperation::zero(*DDsigD_dTT); + double temp = 2*ddGex_dTT*B; + if (_extraBranchNLType == TensionCompressionRegularisedType || _extraBranchNLType == hyper_exp_TCasymm_Type){ + temp += 2*dGex_dT*(2*dB_dTrEe*DtrEeDT) + 2*Gextra*dB_dTrEe*DDtrEeDTT; // Assuming ddB_ddTrEe, ddB_dTdTrEe = 0. + } *DDsigD_dTT = devEe; - *DDsigD_dTT *= 2*(ddGex_dTT*B + 2*dGex_dT*dB_dT + Gextra*ddB_dTT); + *DDsigD_dTT *= temp; } if(DDsigV_dTdTrEe!=NULL){ - *DDsigV_dTdTrEe = dKex_dT*(A + trEe*dA_dTrEe) + Kextra*(dA_dT + trEe*dA_dTdTrEe); + dA_dT = dA_dTrEe*DtrEeDT; + *DDsigV_dTdTrEe = dKex_dT*(A + trEe*dA_dTrEe) + Kextra*(dA_dT + dA_dTrEe*DtrEeDT); // ddA_dTrEedTrEe = 0. } if(DDsigD_dTdDevEe!=NULL){ STensorOperation::zero(*DDsigD_dTdDevEe); *DDsigD_dTdDevEe = _I4; - *DDsigD_dTdDevEe *= (2.*dGex_dT*B); + double temp = (2.*dGex_dT*B); + if (_extraBranchNLType == TensionCompressionRegularisedType || _extraBranchNLType == hyper_exp_TCasymm_Type){ + temp += 2*Gextra*dB_dTrEe*DtrEeDT; + } + *DDsigD_dTdDevEe *= temp; STensorOperation::prodAdd(devEe, dB_dDevEe, 2.*dGex_dT, *DDsigD_dTdDevEe); - STensorOperation::prodAdd(devEe, ddB_dTdDevEe, 2.*Gextra, *DDsigD_dTdDevEe); } if(DsigD_dTrEe!=NULL){ STensorOperation::zero(*DsigD_dTrEe); @@ -785,7 +875,7 @@ void mlawNonLinearTVM::extraBranchLaw(const STensor3& Ee, const double& T, const if(DsigD_dTdTrEe!=NULL){ STensorOperation::zero(*DsigD_dTdTrEe); *DsigD_dTdTrEe = devEe; - *DsigD_dTdTrEe *= (2.*dGex_dT*dB_dTrEe + 2*Gextra*dB_dTdTrEe); + *DsigD_dTdTrEe *= (2.*dGex_dT*dB_dTrEe); // Assuming ddB_ddTrEe = 0. } }; } @@ -795,7 +885,7 @@ void mlawNonLinearTVM::extraBranchLaw(const STensor3& Ee, const double& T, const } }; -void mlawNonLinearTVM::extraBranch_nonLinearTVE(const STensor3& Ee, const double& T, +void mlawNonLinearTVM::extraBranch_nonLinearTVE(const int i, const STensor3& Ee, const double& T, double& Av, double& dA_dTrEe, double& intA, double& intA1, double& intA2, double& dA_dT, double& ddA_dTT, double& ddA_dTdTrEe, double& Bd, STensor3& dB_dDevEe, double &intB, STensor3 &intB1, STensor3 &intB2, double &dB_dT, double &ddB_dTT, STensor3& ddB_dTdDevEe, double* dB_dTrEe) const{ @@ -879,7 +969,7 @@ void mlawNonLinearTVM::extraBranch_nonLinearTVE(const STensor3& Ee, const doubl double x = getXiVolumeCorrection()*tr*tr + getZetaVolumeCorrection(); Av = getVolumeCorrection()* 1/sqrt(x) ; if (tr < 0.){ - Av = getVolumeCorrection()* 1/sqrt(x) * (1. + _compCorrection/getVolumeCorrection()); + Av = getVolumeCorrection()* 1/sqrt(x); // * (1. + _compCorrection/getVolumeCorrection()); // Av += (_compCorrection*tanh(_compCorrection_2*tr*tr+_compCorrection_3)) ; } @@ -892,10 +982,10 @@ void mlawNonLinearTVM::extraBranch_nonLinearTVE(const STensor3& Ee, const doubl intA = 1.; } if (tr < 0.){ - dA_dTrEe = - getVolumeCorrection()*getXiVolumeCorrection()*tr/pow(x,1.5) * (1. + _compCorrection/getVolumeCorrection()); + dA_dTrEe = - getVolumeCorrection()*getXiVolumeCorrection()*tr/pow(x,1.5); // * (1. + _compCorrection/getVolumeCorrection()); if(getXiVolumeCorrection()>0.){ - intA = getVolumeCorrection()/getXiVolumeCorrection()*sqrt(x) * (1. + _compCorrection/getVolumeCorrection()); - intA -= ( getVolumeCorrection()/getXiVolumeCorrection()*sqrt(getZetaVolumeCorrection()) ) * (1. + _compCorrection/getVolumeCorrection()); + intA = getVolumeCorrection()/getXiVolumeCorrection()*sqrt(x); // * (1. + _compCorrection/getVolumeCorrection()); + intA -= ( getVolumeCorrection()/getXiVolumeCorrection()*sqrt(getZetaVolumeCorrection()) ); // * (1. + _compCorrection/getVolumeCorrection()); } else{ intA = 1.; @@ -924,20 +1014,24 @@ void mlawNonLinearTVM::extraBranch_nonLinearTVE(const STensor3& Ee, const doubl // Regularising function double m = _tensionCompressionRegularisation; - double expmtr(0.); - if (exp(-m*tr)<1.e+10){ expmtr = exp(-m*tr);} + double expmtr = exp(-m*tr); + // if (exp(-m*tr)<1.e+10){ expmtr = exp(-m*tr);} double sigmoid = 1/(1.+expmtr); // Av double x = getXiVolumeCorrection()*tr*tr + getZetaVolumeCorrection(); Av = sigmoid*1./sqrt(x) + (1.-sigmoid)*(_compCorrection/sqrt(x)); + Av *= getVolumeCorrection(); dA_dTrEe = - sigmoid*getXiVolumeCorrection()*tr/pow(x,1.5) - (1.-sigmoid)*(getXiVolumeCorrection()*_compCorrection*tr/pow(x,1.5)) + (m*expmtr/pow((1.+expmtr),2.))*1./sqrt(x) - (_compCorrection*m*expmtr/pow((1.+expmtr),2.))*1./sqrt(x); + dA_dTrEe *= getVolumeCorrection(); + if(getXiVolumeCorrection()>0.){ double integrand = 1./getXiVolumeCorrection()*sqrt(x); // integral of A_v * trEe integrand -= ( 1./getXiVolumeCorrection()*sqrt(getZetaVolumeCorrection()) ); // value at trEe = 0. - intA = sigmoid*integrand + (1.-sigmoid)*integrand; + intA = sigmoid*integrand + _compCorrection*(1.-sigmoid)*integrand; + intA *= getVolumeCorrection(); } else{ intA = 1.; @@ -946,61 +1040,222 @@ void mlawNonLinearTVM::extraBranch_nonLinearTVE(const STensor3& Ee, const doubl // Bd double y = getThetaDevCorrection()*dev.dotprod() + getPiDevCorrection(); Bd = sigmoid*1./sqrt(y) + (1.-sigmoid)*(_compCorrection/sqrt(y)); - + Bd *= getDevCorrection(); + STensorOperation::zero(dB_dDevEe); dB_dDevEe = dev; dB_dDevEe *= (-sigmoid*getThetaDevCorrection()/pow(y,1.5) - (1.-sigmoid)*(getThetaDevCorrection()*_compCorrection/pow(y,1.5))); + dB_dDevEe *= getDevCorrection(); if(dB_dTrEe!=NULL){ *dB_dTrEe = (m*expmtr/pow((1.+expmtr),2.))*1./sqrt(y) - (_compCorrection*m*expmtr/pow((1.+expmtr),2.))*1./sqrt(y); + *dB_dTrEe *= getDevCorrection(); } if(getThetaDevCorrection()>0.){ double integrand = 1./getThetaDevCorrection()*sqrt(y); // integral of B_d * devEe integrand -= (1./getThetaDevCorrection()*sqrt(getPiDevCorrection()) ); // value at devEe = 0. - intB = sigmoid*integrand + (1.-sigmoid)*integrand; + intB = sigmoid*integrand + _compCorrection*(1.-sigmoid)*integrand; + intB *= getDevCorrection(); } else{ intB = 1.; } } - else{ // Test - // Av = 1.; - // intA1 = tr; - double x = getXiVolumeCorrection()*tr*tr + getZetaVolumeCorrection(); - Av = 1000*tr*tr + 1.; - if (tr < 0.){ - Av += _compCorrection*(tr*tr+1.); + else if (_ExtraBranch_TVE_option == 4){ + + // Tension-Compression Asymmetry + // Standard form => A_v = a/(sqrt(b*tr*tr+c)) + + // Regularising function + double m = _tensionCompressionRegularisation; + double expmtr = exp(-m*tr); + // if (exp(-m*tr)<1.e+10){ expmtr = exp(-m*tr);} + double sigmoid = 1/(1.+expmtr); + + // Av + double x = _V1[i]*tr*tr + _V2[i]; + Av = sigmoid*1./sqrt(x) + (1.-sigmoid)*(_Ci[i]/sqrt(x)); + Av *= getVolumeCorrection(); + + dA_dTrEe = - sigmoid*_V1[i]*tr/pow(x,1.5) - (1.-sigmoid)*(_V1[i]*_Ci[i]*tr/pow(x,1.5)) + + (m*expmtr/pow((1.+expmtr),2.))*1./sqrt(x) - (_Ci[i]*m*expmtr/pow((1.+expmtr),2.))*1./sqrt(x); + dA_dTrEe *= getVolumeCorrection(); + + if(_V1[i]>0.){ + double integrand = 1./_V1[i]*sqrt(x); // integral of A_v * trEe + integrand -= ( 1./_V1[i]*sqrt(_V2[i]) ); // value at trEe = 0. + intA = sigmoid*integrand + _Ci[i]*(1.-sigmoid)*integrand; + intA *= getVolumeCorrection(); + } + else{ + intA = 1.; + } + + // Bd + double y = _D1[i]*dev.dotprod() + _D2[i]; + Bd = sigmoid*1./sqrt(y) + (1.-sigmoid)*(_Ci[i]/sqrt(y)); + Bd *= getDevCorrection(); + + STensorOperation::zero(dB_dDevEe); + dB_dDevEe = dev; + dB_dDevEe *= (-sigmoid*_D1[i]/pow(y,1.5) - (1.-sigmoid)*(_D1[i]*_Ci[i]/pow(y,1.5))); + dB_dDevEe *= getDevCorrection(); + + if(dB_dTrEe!=NULL){ + *dB_dTrEe = (m*expmtr/pow((1.+expmtr),2.))*1./sqrt(y) - (_Ci[i]*m*expmtr/pow((1.+expmtr),2.))*1./sqrt(y); + *dB_dTrEe *= getDevCorrection(); + } + if(_D1[i]>0.){ + double integrand = 1./_D1[i]*sqrt(y); // integral of B_d * devEe + integrand -= (1./_D1[i]*sqrt(_D2[i]) ); // value at devEe = 0. + intB = sigmoid*integrand + _Ci[i]*(1.-sigmoid)*integrand; + intB *= getDevCorrection(); + } + else{ + intB = 1.; + } } - dA_dTrEe = 1000*2*tr; //- getVolumeCorrection()*getXiVolumeCorrection()*tr/pow(x,1.5); - intA = getVolumeCorrection()*sqrt(x)/getXiVolumeCorrection(); // integral of A_v * trEe - intA -= getVolumeCorrection()*sqrt(getZetaVolumeCorrection())/getXiVolumeCorrection(); // value at trEe = 0. - - intA1 = 1000*tr*tr*tr/3. + tr; // integral of A_v - intA2 = log(1000*tr*tr + 1); // integral of 1/A_v*dA_dTrEe - - if (tr < 0.){ - - dA_dTrEe = 2*tr*(1.+_compCorrection); //- getVolumeCorrection()*getXiVolumeCorrection()*tr/pow(x,1.5); - intA = getVolumeCorrection()*sqrt(x)/getXiVolumeCorrection(); // integral of A_v * trEe - intA -= getVolumeCorrection()*sqrt(getZetaVolumeCorrection())/getXiVolumeCorrection(); // value at trEe = 0. - - intA1 = (tr*tr*tr/3. + tr)*(1.+_compCorrection); // integral of A_v - intA2 = log(tr*tr + 1)*(1.+_compCorrection); // integral of 1/A_v*dA_dTrEe + /*else if (_ExtraBranch_TVE_option == 5){ - } - Bd = 1.; - double y = getThetaDevCorrection()*dev.dotprod() + getPiDevCorrection(); - Bd = dev.dotprod() + 1.; - dB_dDevEe = 2*dev; + // Sigmoid + Exponential + Tension-Compression Asymmetry + // Standard form => A_v = sigmoid*a/(sqrt(b*tr*tr+c)) + (1-sigmoid)* Comp* (a/(sqrt(b*tr*tr+c)) + d*exp(f*tr*tr+g)) - intB = getDevCorrection()*sqrt(y)/getThetaDevCorrection(); // integral of B_d * devEe - intB -= getDevCorrection()*sqrt(getPiDevCorrection())/getThetaDevCorrection(); // value at devEe = 0. - - intB1 = 0.; // integral of B_d -> cannot be done - intB2 = 0.; // integral of 1/B_d*dB_dDevEe -> cannot be done - + // Regularising function + double m = _tensionCompressionRegularisation; + double expmtr = exp(-m*tr); + // if (exp(-m*tr)<1.e+10){ expmtr = exp(-m*tr);} + double sigmoid = 1/(1.+expmtr); + + // Av + double x1 = _V1[i]*tr*tr + _V2[i]; + double x2 = _V4[i]*tr*tr + _V5[i]; + Av = sigmoid*(getVolumeCorrection()/sqrt(x1)) + (1-sigmoid)*_Ci[i]*(getVolumeCorrection()/sqrt(x1) + _V3[i]*exp(x2)); + + dA_dTrEe = sigmoid*(-getVolumeCorrection()*_V1[i]*tr/pow(x1,1.5)) + (1.-sigmoid)*_Ci[i]*( -getVolumeCorrection()*_V1[i]*tr/pow(x1,1.5) + 2*_V3[i]*_V4[i]*tr*exp(x2)) + + (m*expmtr/pow((1.+expmtr),2.))*getVolumeCorrection()*1./sqrt(x1) - (m*expmtr/pow((1.+expmtr),2.))*_Ci[i]*(getVolumeCorrection()/sqrt(x1) + _V3[i]*exp(x2)) ; + + if(_V1[i]>0. && _V4[i]>0.){ + double integrand1 = 1./_V1[i]*sqrt(x1); // integral of A_v * trEe + integrand1 -= ( 1./_V1[i]*sqrt(_V2[i]) ); // value at trEe = 0. + integrand1 *= getVolumeCorrection(); + + double integrand2 = exp(x2)/(2*_V4[i]); + integrand2 -= exp(_V5[i])/(2*_V4[i]); + integrand2 *= _V3[i]; + + intA = sigmoid*integrand1 + (1.-sigmoid)*_Ci[i]*(integrand1 + integrand2); + } + else{ + intA = 1.; + } + + // Bd + double y1 = _D1[i]*dev.dotprod() + _D2[i]; + double y2 = _D4[i]*dev.dotprod() + _D5[i]; + Bd = sigmoid*(getDevCorrection()/sqrt(y1)) + (1-sigmoid)*_Ci[i]*(getDevCorrection()/sqrt(y1) + _D3[i]*exp(y2)); + + STensorOperation::zero(dB_dDevEe); + dB_dDevEe = dev; + dB_dDevEe *= ( sigmoid*(-getDevCorrection()*_D1[i]/pow(y1,1.5)) + (1.-sigmoid)*_Ci[i]*( -getDevCorrection()*_D1[i]/pow(y1,1.5) + 2*_D3[i]*_D4[i]*exp(y2)) ); + + if(dB_dTrEe!=NULL){ + *dB_dTrEe = (m*expmtr/pow((1.+expmtr),2.))*getDevCorrection()*1./sqrt(y1) - (m*expmtr/pow((1.+expmtr),2.))*_Ci[i]*(getDevCorrection()/sqrt(y1) + _D3[i]*exp(y2)); + } + if(_D1[i]>0. && _D4[i]>0.){ + double integrand1 = 1./_D1[i]*sqrt(y1); // integral of B_d * devEe + integrand1 -= (1./_D1[i]*sqrt(_D2[i]) ); // value at devEe = 0. + integrand1 *= getDevCorrection(); + + double integrand2 = exp(y2)/(2*_D4[i]); + integrand2 -= exp(_D5[i])/(2*_D4[i]); + integrand2 *= _D3[i]; + + intB = sigmoid*integrand1 + (1.-sigmoid)*_Ci[i]*(integrand1 + integrand2); + } + else{ + intB = 1.; + } + }*/ + else if (_ExtraBranch_TVE_option == 5){ + + // Tension-Compression Asymmetry + // Standard form => A_v = a/(sqrt(b*tr*tr+c)) + d + + // Msg::Error("_extraBran_ExtraBranch_TVE_optionchNLType = %d need a 3rd Parameter. Define _V3 and _D3",_extraBranchNLType); + + // Regularising function + double m = _tensionCompressionRegularisation; + double expmtr = exp(-m*tr); + // if (exp(-m*tr)<1.e+10){ expmtr = exp(-m*tr);} + double sigmoid = 1/(1.+expmtr); + + // Av + double x1 = _V1[i]*tr*tr + _V2[i]; + double x2 = _V4[i]*tr*tr + _V5[i]; + Av = sigmoid*(1./sqrt(x1)+ _V3[i]*(1+tanh(x2))) + (1.-sigmoid)*(_Ci[i]*(1./sqrt(x1) + _V3[i])); + // Av *= getVolumeCorrection(); + + dA_dTrEe = -sigmoid*(_V1[i]*tr/pow(x1,1.5) - _V3[i]*(2*_V4[i]*tr*pow(1/cosh(x2),2))) - (1.-sigmoid)*(_V1[i]*_Ci[i]*tr/pow(x1,1.5)) + + (m*expmtr/pow((1.+expmtr),2.))*(1./sqrt(x1) + _V3[i]*(1+tanh(x2)))- (_Ci[i]*m*expmtr/pow((1.+expmtr),2.))*(1./sqrt(x1) + _V3[i]); + // dA_dTrEe *= getVolumeCorrection(); + + if(_V1[i]>0.){ + double integrand1 = 1./_V1[i]*sqrt(x1) + _V3[i]*tr*tr/2.; // integral of A_v * trEe + double integrand2 = 0.; + if(_V4[i] != 0.){ + integrand2 = _V3[i]/(2.*_V4[i])*log(cosh(x2)); + } + integrand1 -= ( 1./_V1[i]*sqrt(_V2[i]) ); // value at trEe = 0. + intA = sigmoid*(integrand1 + integrand2) + _Ci[i]*(1.-sigmoid)*integrand1; + // intA *= getVolumeCorrection(); + } + else{ + intA = 1.; + } + + // Bd + double y1 = _D1[i]*dev.dotprod() + _D2[i]; + double y2 = _D4[i]*dev.dotprod() + _D5[i]; + Bd = sigmoid* (1./sqrt(y1) + _D3[i]*(1+tanh(y2))) + (1.-sigmoid)*(_Ci[i]*(1./sqrt(y1) + _D3[i])) ; + // Bd *= getDevCorrection(); + + STensorOperation::zero(dB_dDevEe); + dB_dDevEe = dev; + dB_dDevEe *= (-sigmoid*(_D1[i]/pow(y1,1.5) - _D3[i]*(2*_D4[i]*pow(1/cosh(x2),2))) - (1.-sigmoid)*(_D1[i]*_Ci[i]/pow(y1,1.5))); + // dB_dDevEe *= getDevCorrection(); + + if(dB_dTrEe!=NULL){ + *dB_dTrEe = (m*expmtr/pow((1.+expmtr),2.))*(1./sqrt(y1) + _D3[i]*(1+tanh(y2))) - (m*expmtr/pow((1.+expmtr),2.))*(_Ci[i]*(1./sqrt(y1) + _D3[i])); + // *dB_dTrEe *= getDevCorrection(); + } + if(_D1[i]>0.){ + double integrand1 = 1./_D1[i]*sqrt(y1) + _D3[i]*dev.dotprod()/2.; // integral of B_d * devEe + double integrand2 = 0.; + if(_D4[i] != 0.){ + integrand2 = _D3[i]/(2.*_D4[i])*log(cosh(y2)); + } + integrand1 -= (1./_D1[i]*sqrt(_D2[i]) ); // value at devEe = 0. + intB = sigmoid*(integrand1 + integrand2) + _Ci[i]*(1.-sigmoid)*integrand1; + // intB *= getDevCorrection(); + } + else{ + intB = 1.; + } + } + else{ // Test + double x = getXiVolumeCorrection()*tr*tr + getZetaVolumeCorrection(); + Av = getVolumeCorrection()*(tanh(getXiVolumeCorrection()/3.*tr*tr-getZetaVolumeCorrection())+tanh(getZetaVolumeCorrection())); + dA_dTrEe = getVolumeCorrection()*getXiVolumeCorrection()*2./3.*(1.-tanh(getXiVolumeCorrection()/3.*tr*tr-getZetaVolumeCorrection())*tanh(getXiVolumeCorrection()/3.*tr*tr-getZetaVolumeCorrection())); + intA = 1.; + + Bd = getDevCorrection()*(tanh(getThetaDevCorrection()*dev.dotprod()-getPiDevCorrection())+tanh(getPiDevCorrection())); + STensorOperation::zero(dB_dDevEe); + dB_dDevEe=dev; + dB_dDevEe*=2.*getPiDevCorrection()*getDevCorrection()*(1.-tanh(getThetaDevCorrection()*dev.dotprod()-getPiDevCorrection())*tanh(getThetaDevCorrection()*dev.dotprod()-getPiDevCorrection()) ); + intB = 1.; } - + // TBD - tempfuncs + /* Av *= (_temFunc_elasticCorrection_Bulk->getVal(T)); dA_dTrEe *= (_temFunc_elasticCorrection_Bulk->getVal(T)); intA *= (_temFunc_elasticCorrection_Bulk->getVal(T)); @@ -1018,7 +1273,7 @@ void mlawNonLinearTVM::extraBranch_nonLinearTVE(const STensor3& Ee, const doubl dB_dT = (Bd*_temFunc_elasticCorrection_Shear->getDiff(T)); ddB_dTT = (Bd*_temFunc_elasticCorrection_Shear->getDoubleDiff(T)); ddB_dTdDevEe = (dB_dDevEe*_temFunc_elasticCorrection_Shear->getDiff(T)); - ddB_dTdDevEe *= (1/_temFunc_elasticCorrection_Shear->getVal(T)); + ddB_dTdDevEe *= (1/_temFunc_elasticCorrection_Shear->getVal(T));*/ // Msg::Error(" Inside evaluatePhiPCorrection, A_v = %e, B_d = %e !!", A_v, B_d); @@ -1029,23 +1284,35 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor(const STensor3& Ee, const STe double& Ke, double& Ge, double& DKDTsum, double& DGDTsum, const double T0, const double T1, const bool stiff, STensor43& Bd_stiffnessTerm, STensor43* Bd_stiffnessTerm2) const{ + // NEW + STensorOperation::zero(Bd_stiffnessTerm); + // if(_extraBranchNLType == TensionCompressionRegularisedType && Bd_stiffnessTerm2!= NULL){ + if(Bd_stiffnessTerm2!= NULL){ + STensorOperation::zero(*Bd_stiffnessTerm2); + } + // Set Temperature to calculate temperature updated properties double T_set = setTemp(T0,T1,1); // 1->T1, 2->T_mid, 3->T_midshift // Update the Properties to the current temperature (see below which ones are being used) - double KT, GT, AlphaT_0, AlphaT, DKDT, DGDT, DAlphaDT; - getK(q1,KT,T_set,&DKDT); getG(q1,GT,T_set,&DGDT); getAlpha(AlphaT_0,T0); getAlpha(AlphaT,T_set,&DAlphaDT); + double KT, GT, AlphaT0, AlphaT, DKDT, DGDT, DAlpha0DT, DAlphaDT, DDAlphaDTT; + getK(q1,KT,T_set,&DKDT); getG(q1,GT,T_set,&DGDT); getAlpha(AlphaT,T_set,&DAlphaDT,&DDAlphaDTT); getAlpha(AlphaT0,T0); - // Get LogStrain (E) andput DEe in IP + // Get LogStrain (E) and put DEe in IP STensor3& DE = q1->getRefToDE(); STensor3& devDE = q1->getRefToDevDE(); double& trDE = q1->getRefToTrDE(); static STensor3 devEe; - static double trEe; + double trEe(0.); DE = Ee; DE -= Ee0; STensorOperation::decomposeDevTr(DE,devDE,trDE); STensorOperation::decomposeDevTr(Ee,devEe,trEe); + + // Initialise effective trEe - include thermal expansion + double eff_trEe(0.), eff_trDE(0.); + eff_trEe = trEe - 3*AlphaT*(T1-_Tinitial); + eff_trDE = trDE - 3*(AlphaT*(T1-_Tinitial) - AlphaT0*(T0-_Tinitial)); // Initialise CorKirStress - Dev static STensor3 devK; @@ -1053,13 +1320,64 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor(const STensor3& Ee, const STe devK = 2*GT*devEe; // Initialise CorKirStress - Tr - static double p; - p = KT*(trEe - 3*AlphaT*(T1-_Tinitial)); + double p(0.); + p = KT*eff_trEe; // Initialise Moduli Ke = KT; Ge = GT; DKDTsum = DKDT; DGDTsum = DGDT; + if(_useExtraBranch){ + + double A(0.), B(0.), dA_dTrEe(0.), psiInfCorrector(0.); + static STensor3 dB_dDevEe; + double intA(0.), intB(0.), dA_dT(0.), dB_dT(0.); + + // Here, A, B and related terms first calculated as (1+A) and (1+B) + if(_extraBranchNLType != TensionCompressionRegularisedType && _extraBranchNLType != hyper_exp_TCasymm_Type){ + evaluateElasticCorrection(eff_trEe, devEe, T1, A, dA_dTrEe, intA, dA_dT, B, dB_dDevEe, intB, dB_dT, NULL ,NULL, NULL, NULL, NULL, &psiInfCorrector); + } + else{ + double dB_dTrEe(0.); + evaluateElasticCorrection(eff_trEe, devEe, T1, A, dA_dTrEe, intA, dA_dT, B, dB_dDevEe, intB, dB_dT, NULL ,NULL, NULL, NULL, &dB_dTrEe, &psiInfCorrector); + q1->_dBd_dTrEe = dB_dTrEe; + } + + q1->_intA = intA; + q1->_intB = intB; + q1->_psiInfCorrector = psiInfCorrector; // Additional term to correct thermal expansion term in free energy + q1->_elasticBulkPropertyScaleFactor = A; + q1->_elasticShearPropertyScaleFactor = B; + q1->_dAv_dTrEe = dA_dTrEe; + q1->_dBd_dDevEe = dB_dDevEe; + + + // Add to stress + static STensor3 sigExtra; + sigExtra = devEe; + sigExtra *= 2.*GT*B; + devK += sigExtra; + sigExtra += _I*(eff_trEe*KT*A); + p += eff_trEe*KT*A; + q1->_corKirExtra = sigExtra; + + // Add to Ke + Ke += KT*A + KT*dA_dTrEe*eff_trEe; + + // Add to Ge (1st term) and Bd_stiffnessTerm (2nd term) + Ge += GT*B; // don't multiply 2 + 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++){ + Bd_stiffnessTerm(k,l,p,q) += 2*GT*devEe(k,l)*dB_dDevEe(p,q); + if(_extraBranchNLType == TensionCompressionRegularisedType || _extraBranchNLType == hyper_exp_TCasymm_Type){ + (*Bd_stiffnessTerm2)(k,l,p,q) += 2*GT*devEe(k,l)*_I(p,q)*q1->_dBd_dTrEe; + } + } + + } + // Main Loop for Maxwell Branches if ((_Ki.size() > 0) or (_Gi.size() > 0)){ @@ -1074,23 +1392,30 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor(const STensor3& Ee, const STe // Do non-linear TVE extraBranch here double Av(1.), Bd(1.); double dA_dTrEe(0.),intA(0.),intA1(0.),intA2(0.),dA_dT(0.),ddA_dTT(0.),ddA_dTdTrEe(0.),intB(0.),dB_dT(0.),ddB_dTT(0.); - static STensor3 intB1,intB2,dB_dDevEe,ddB_dTdDevEe,temp100; + static STensor3 intB1,intB2,dB_dDevEe,ddB_dTdDevEe; STensorOperation::zero(intB1); STensorOperation::zero(intB2); STensorOperation::zero(dB_dDevEe); STensorOperation::zero(ddB_dTdDevEe); if (_useExtraBranch_TVE){ - STensorOperation::zero(Bd_stiffnessTerm); //This term is for the additional term in Ge that is a tensor + + // NEW + // STensorOperation::zero(Bd_stiffnessTerm); //This term is for the additional term in Ge that is a tensor + // NEW + if(_ExtraBranch_TVE_option == 1){ - mlawNonLinearTVM::extraBranch_nonLinearTVE(Ee,T1,Av,dA_dTrEe,intA,intA1,intA2,dA_dT,ddA_dTT,ddA_dTdTrEe,Bd,dB_dDevEe,intB,intB1,intB2,dB_dT,ddB_dTT,ddB_dTdDevEe); + mlawNonLinearTVM::extraBranch_nonLinearTVE(0,Ee,T1,Av,dA_dTrEe,intA,intA1,intA2,dA_dT,ddA_dTT,ddA_dTdTrEe,Bd,dB_dDevEe,intB,intB1,intB2,dB_dT,ddB_dTT,ddB_dTdDevEe); q1->_Av_TVE = Av; q1->_Bd_TVE = Bd; q1->_dAv_dTrEe_TVE = dA_dTrEe; q1->_dBd_dDevEe_TVE = dB_dDevEe; q1->_intAv_TVE = intA; q1->_intBd_TVE = intB; q1->_intAv_1_TVE = intA1; q1->_intBd_1_TVE = intB1; // this is zero q1->_intAv_2_TVE = intA2; q1->_intBd_2_TVE = intB2; // this is zero } - if(_ExtraBranch_TVE_option == 3){ + + // NEW + /*if(_ExtraBranch_TVE_option == 3){ STensorOperation::zero(*Bd_stiffnessTerm2); //This term is for the additional term in Ge because Bd is a function of trEe - } + }*/ + // NEW } for (int i=0; i<_Gi.size(); i++){ @@ -1122,7 +1447,7 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor(const STensor3& Ee, const STe q1->_A[i](k,l) = exp_rec_g*q0->_A[i](k,l) + exp_mid_g*devDE(k,l); } - q1->_B[i] = exp_rec_k*q0->_B[i] + exp_mid_k*trDE; + q1->_B[i] = exp_rec_k*q0->_B[i] + exp_mid_k*eff_trDE ; //*trDE; NEW // Add to deviatoric stress devK += 2*_Gi[i]*q1->_A[i]; @@ -1168,14 +1493,14 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor(const STensor3& Ee, const STe p += ( _Ki[i]*q1->_B[i] ); } - else if (_ExtraBranch_TVE_option == 2 || _ExtraBranch_TVE_option == 3){ + else if (_ExtraBranch_TVE_option == 2 || _ExtraBranch_TVE_option == 3 || _ExtraBranch_TVE_option == 4 || _ExtraBranch_TVE_option == 5){ // Single Convolution - get branchElasticStrain for (int k=0; k<3; k++) for (int l=0; l<3; l++) q1->_A[i](k,l) = exp_rec_g*q0->_A[i](k,l) + exp_mid_g*devDE(k,l); - q1->_B[i] = exp_rec_k*q0->_B[i] + exp_mid_k*trDE; + q1->_B[i] = exp_rec_k*q0->_B[i] + exp_mid_k*eff_trDE; // trDE; // NEW static STensor3 branchElasticStrain; branchElasticStrain = q1->_A[i]; @@ -1183,12 +1508,12 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor(const STensor3& Ee, const STe branchElasticStrain(1,1) += 1./3.*q1->_B[i]; branchElasticStrain(2,2) += 1./3.*q1->_B[i]; if (_ExtraBranch_TVE_option == 2){ - mlawNonLinearTVM::extraBranch_nonLinearTVE(branchElasticStrain,T1,Av,dA_dTrEe,intA,intA1,intA2,dA_dT,ddA_dTT,ddA_dTdTrEe, + mlawNonLinearTVM::extraBranch_nonLinearTVE(i,branchElasticStrain,T1,Av,dA_dTrEe,intA,intA1,intA2,dA_dT,ddA_dTT,ddA_dTdTrEe, Bd,dB_dDevEe,intB,intB1,intB2,dB_dT,ddB_dTT,ddB_dTdDevEe); } else{ double dB_dTrEe(0.); - mlawNonLinearTVM::extraBranch_nonLinearTVE(branchElasticStrain,T1,Av,dA_dTrEe,intA,intA1,intA2,dA_dT,ddA_dTT,ddA_dTdTrEe, + mlawNonLinearTVM::extraBranch_nonLinearTVE(i,branchElasticStrain,T1,Av,dA_dTrEe,intA,intA1,intA2,dA_dT,ddA_dTT,ddA_dTdTrEe, Bd,dB_dDevEe,intB,intB1,intB2,dB_dT,ddB_dTT,ddB_dTdDevEe,&dB_dTrEe); q1->_dBd_dTrEe_TVE_vector[i] = dB_dTrEe; } @@ -1206,7 +1531,7 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor(const STensor3& Ee, const STe for (int p=0; p<3; p++) for (int q=0; q<3; q++){ Bd_stiffnessTerm(k,l,p,q) += 2*_Gi[i]*q1->_A[i](k,l)*dB_dDevEe(p,q) * exp_mid_g; - if (_ExtraBranch_TVE_option == 3){ + if (_ExtraBranch_TVE_option == 3 || _ExtraBranch_TVE_option == 4 || _ExtraBranch_TVE_option == 5){ (*Bd_stiffnessTerm2)(k,l,p,q) += 2*_Gi[i]*q1->_dBd_dTrEe_TVE_vector[i]*q1->_A[i](k,l)*_I(p,q) * exp_mid_k; // exp_mid_k = d(tr branchElasticStrain)_d(trEe) } @@ -1248,6 +1573,11 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor(const STensor3& Ee, const STe double dtk(0.), dtk2(0.), exp_rec_k(0.), exp_mid_k(0.); double dtg(0.), dtg2(0.), exp_rec_g(0.), exp_mid_g(0.); + // NEW + double Deff_trDE_DT = -3.*(DAlphaDT*(T1-_Tinitial) + AlphaT); + double DDeff_trDE_DTT = -3.*(DDAlphaDTT*(T1-_Tinitial) + 2*DAlphaDT); + // NEW + for (int i=0; i<_Gi.size(); i++){ dtk = dt_shift_rec/(_ki[i]); @@ -1272,8 +1602,8 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor(const STensor3& Ee, const STe if (!_useExtraBranch_TVE){ DB_DtrE[i] = exp_mid_k; - DB_DT[i] = q0->_B[i] * Dexp_rec_k_DT + Dexp_mid_k_DT*trDE; - DDB_DTT[i] = q0->_B[i] * DDexp_rec_k_DTT + DDexp_mid_k_DTT*trDE; + DB_DT[i] = q0->_B[i] * Dexp_rec_k_DT + Dexp_mid_k_DT*eff_trDE + exp_rec_k*Deff_trDE_DT; // trDE; // NEW + DDB_DTT[i] = q0->_B[i] * DDexp_rec_k_DTT + DDexp_mid_k_DTT*eff_trDE + 2*Dexp_mid_k_DT*Deff_trDE_DT + exp_mid_k*DDeff_trDE_DTT; // trDE; //NEW DDB_DTDtrE[i] = Dexp_mid_k_DT; for (int k=0; k<3; k++) for (int l=0; l<3; l++){ @@ -1315,13 +1645,14 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor(const STensor3& Ee, const STe } } } - else if (_ExtraBranch_TVE_option == 2 || _ExtraBranch_TVE_option == 3){ - // Here the derivative are made as: B[i] = Av[i]*B[i]; A[i] = Bd[i]*A[i]; Above, BranchElasticStrain = A[i] + 1/3*B[i]*_I + else if (_ExtraBranch_TVE_option == 2 || _ExtraBranch_TVE_option == 3 || _ExtraBranch_TVE_option == 4 || _ExtraBranch_TVE_option == 5){ + // Here the derivatives are made as: B[i] = Av[i]*B[i]; A[i] = Bd[i]*A[i]; Above, BranchElasticStrain = A[i] + 1/3*B[i]*_I + // 2nd order derivatives of _Av_TVE_vector and _Bd_TVE_vector are ignored double dTrEei_DT(0.), ddTrEei_DTT(0.); // branchElasticStrain trace static STensor3 dDevEei_DT, ddDevEei_DTT; // branchElasticStrain deviator - dTrEei_DT = q0->_B[i] * Dexp_rec_k_DT + Dexp_mid_k_DT*trDE; - ddTrEei_DTT = q0->_B[i] * DDexp_rec_k_DTT + DDexp_mid_k_DTT*trDE; + dTrEei_DT = q0->_B[i] * Dexp_rec_k_DT + Dexp_mid_k_DT*eff_trDE + exp_mid_k*Deff_trDE_DT; // trDE; //NEW + ddTrEei_DTT = q0->_B[i] * DDexp_rec_k_DTT + DDexp_mid_k_DTT*eff_trDE + 2.*Dexp_mid_k_DT*Deff_trDE_DT + exp_mid_k*DDeff_trDE_DTT; // trDE; //NEW for (int k=0; k<3; k++) for (int l=0; l<3; l++){ dDevEei_DT(k,l) = q0->_A[i](k,l) * Dexp_rec_g_DT + Dexp_mid_g_DT*devDE(k,l); @@ -1339,7 +1670,7 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor(const STensor3& Ee, const STe DA_DT[i](k,l) = q1->_Bd_TVE_vector[i]*dDevEei_DT(k,l); DDA_DTT[i](k,l) = q1->_Bd_TVE_vector[i]*ddDevEei_DTT(k,l); - if (_ExtraBranch_TVE_option == 3){ + if (_ExtraBranch_TVE_option == 3 || _ExtraBranch_TVE_option == 4 || _ExtraBranch_TVE_option == 5){ DA_DT[i](k,l) += q1->_A[i](k,l)*q1->_dBd_dTrEe_TVE_vector[i]*dTrEei_DT; DDA_DTT[i](k,l) += q1->_A[i](k,l)*q1->_dBd_dTrEe_TVE_vector[i]*ddTrEei_DTT + 2*q1->_dBd_dTrEe_TVE_vector[i]*dTrEei_DT*dDevEei_DT(k,l); @@ -1358,7 +1689,11 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor(const STensor3& Ee, const STe // _Idev is not pre-multiplied !! DA_DdevE[i](k,l,r,s) = exp_mid_g * ( q1->_A[i](k,l)*q1->_dBd_dDevEe_TVE_vector[i](r,s) + q1->_Bd_TVE_vector[i] * _I4(k,l,r,s) ); DDA_DTDdevE[i](k,l,r,s) = Dexp_mid_g_DT * ( q1->_A[i](k,l)*q1->_dBd_dDevEe_TVE_vector[i](r,s) + q1->_Bd_TVE_vector[i] * _I4(k,l,r,s) ) - + exp_mid_g * ( 2.* dDevEei_DT(k,l)* q1->_dBd_dDevEe_TVE_vector[i](r,s)); + + exp_mid_g * ( dDevEei_DT(k,l)* q1->_dBd_dDevEe_TVE_vector[i](r,s)); + for (int p=0; p<3; p++) + for (int q=0; q<3; q++){ + DDA_DTDdevE[i](k,l,r,s) += exp_mid_g * q1->_dBd_dDevEe_TVE_vector[i](p,q)*dDevEei_DT(p,q)*_I4(k,l,r,s); + } } } } // if - extraBranchTVE_option @@ -1375,6 +1710,10 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor(const STensor3& Ee, const STe double dtk(0.), dtk2(0.), exp_rec_k(0.), exp_mid_k(0.); double dtg(0.), dtg2(0.), exp_rec_g(0.), exp_mid_g(0.); + // NEW + double Deff_trDE_DT = -3.*(DAlphaDT*(T1-_Tinitial) + AlphaT); + // NEW + for (int i=0; i<_Gi.size(); i++){ dtk = dt_shift_rec/(_ki[i]); @@ -1393,7 +1732,7 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor(const STensor3& Ee, const STe Dexp_mid_g_DT = -1/(_gi[i]) * Ddt_shiftDT_mid*exp_mid_g; if (!_useExtraBranch_TVE){ - DB_DT[i] = q0->_B[i] * Dexp_rec_k_DT + Dexp_mid_k_DT*trDE; + DB_DT[i] = q0->_B[i] * Dexp_rec_k_DT + Dexp_mid_k_DT*eff_trDE + exp_rec_k*Deff_trDE_DT; // trDE; // NEW for (int k=0; k<3; k++) for (int l=0; l<3; l++){ DA_DT[i](k,l) = q0->_A[i](k,l) * Dexp_rec_g_DT + Dexp_mid_g_DT*devDE(k,l); @@ -1413,12 +1752,13 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor(const STensor3& Ee, const STe q0->_A[i](k,l) * 1/q0->_Bd_TVE * temp2); } } - else if (_ExtraBranch_TVE_option == 2 || _ExtraBranch_TVE_option == 3){ + else if (_ExtraBranch_TVE_option == 2 || _ExtraBranch_TVE_option == 3 || _ExtraBranch_TVE_option == 4 || _ExtraBranch_TVE_option == 5){ // Here the derivative are made as: B[i] = Av[i]*B[i]; A[i] = Bd[i]*A[i]; Above, BranchElasticStrain = A[i] + 1/3*B[i]*_I - + // 2nd order derivatives of _Av_TVE_vector and _Bd_TVE_vector are ignored + double dTrEei_DT(0.); // branchElasticStrain trace static STensor3 dDevEei_DT; - dTrEei_DT = q0->_B[i] * Dexp_rec_k_DT + Dexp_mid_k_DT*trDE; + dTrEei_DT = q0->_B[i] * Dexp_rec_k_DT + Dexp_mid_k_DT*eff_trDE + exp_mid_k*Deff_trDE_DT; // trDE; //NEW for (int k=0; k<3; k++) for (int l=0; l<3; l++) dDevEei_DT(k,l) = q0->_A[i](k,l) * Dexp_rec_g_DT + Dexp_mid_g_DT*devDE(k,l); @@ -1428,7 +1768,7 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor(const STensor3& Ee, const STe for (int l=0; l<3; l++){ DA_DT[i](k,l) = q1->_Bd_TVE_vector[i]*dDevEei_DT(k,l); - if (_ExtraBranch_TVE_option == 3){ + if (_ExtraBranch_TVE_option == 3 || _ExtraBranch_TVE_option == 4 || _ExtraBranch_TVE_option == 5){ DA_DT[i](k,l) += q1->_A[i](k,l)*q1->_dBd_dTrEe_TVE_vector[i]*dTrEei_DT; } @@ -1608,6 +1948,14 @@ void mlawNonLinearTVM::getMechSource_nonLinearTVE_term(const IPNonLinearTVM *q0, const STensor3& devDE = q1->getConstRefToDevDE(); const double& trDE = q1->getConstRefToTrDE(); + // NEW + double T_set = setTemp(T0,T,1); // 1->T1, 2->T_mid, 3->T_midshift + double AlphaT0, AlphaT, DAlphaDT; + getAlpha(AlphaT,T_set,&DAlphaDT); getAlpha(AlphaT0,T0); + double eff_trDE = q1->_trDE - 3.*(AlphaT*(T-_Tinitial) - AlphaT0*(T0-_Tinitial)); + double Deff_trDE_DT = -3.*(DAlphaDT*(T-_Tinitial) + AlphaT); + // NEW + // Initialize if needed // Get ShiftFactor and shifted time increment double dt = this->getTimeStep(); @@ -1624,7 +1972,7 @@ void mlawNonLinearTVM::getMechSource_nonLinearTVE_term(const IPNonLinearTVM *q0, // Add visco terms if ((_Ki.size() > 0) or (_Gi.size() > 0)){ - if (_ExtraBranch_TVE_option == 2){ + if (_ExtraBranch_TVE_option != 1){ // TVE Mechanical Source Term @@ -1690,7 +2038,7 @@ void mlawNonLinearTVM::getMechSource_nonLinearTVE_term(const IPNonLinearTVM *q0, double dTrEei_DT(0.); // branchElasticStrain static STensor3 dDevEei_DT; - dTrEei_DT = q0->_B[i] * Dexp_rec_k_DT + Dexp_mid_k_DT*trDE; + dTrEei_DT = q0->_B[i] * Dexp_rec_k_DT + Dexp_mid_k_DT*eff_trDE + exp_mid_k*Deff_trDE_DT; // trDE; //NEW for (int k=0; k<3; k++) for (int l=0; l<3; l++) dDevEei_DT(k,l) = q0->_A[i](k,l) * Dexp_rec_g_DT + Dexp_mid_g_DT*devDE(k,l); @@ -1710,7 +2058,7 @@ void mlawNonLinearTVM::getMechSource_nonLinearTVE_term(const IPNonLinearTVM *q0, DDQiDTDEe[i](k,l,r,s) = _Ki[i]*q1->_DDB_DTDtrE[i]*_I(k,l)*_I(r,s); dot_DGammaiDEe[i](k,l,r,s) = 1/3*(1.- exp_mid_k)*_I(k,l)*_I(r,s) + _Idev(k,l,r,s); - if (_ExtraBranch_TVE_option == 3){ + if (_ExtraBranch_TVE_option == 3 || _ExtraBranch_TVE_option == 4 || _ExtraBranch_TVE_option == 5){ DQiDEe[i](k,l,r,s) += 2*_Gi[i]*q1->_DA_DtrE[i](k,l)*_I(r,s); DDQiDTDEe[i](k,l,r,s) += 2*_Gi[i]*q1->_DDA_DTDtrE[i](k,l)*_I(r,s); } @@ -1766,7 +2114,7 @@ void mlawNonLinearTVM::getTVEdCorKirDT(const IPNonLinearTVM *q0, IPNonLinearTVM // Ee static STensor3 devEe, devEe0; - static double trEe, trEe0; + double trEe, trEe0; STensorOperation::decomposeDevTr(q0->_Ee,devEe0,trEe0); STensorOperation::decomposeDevTr(q1->_Ee,devEe,trEe); @@ -1779,22 +2127,62 @@ void mlawNonLinearTVM::getTVEdCorKirDT(const IPNonLinearTVM *q0, IPNonLinearTVM double KT, GT, AlphaT, DKDT, DGDT, DAlphaDT, DDKDT, DDGDT, DDAlphaDT; getK(q1,KT,T,&DKDT,&DDKDT); getG(q1,GT,T,&DGDT,&DDGDT); getAlpha(AlphaT,T,&DAlphaDT,&DDAlphaDT); - // Add corKirinf terms to DcorKirDT - STensor3 corKirDevInf; - double corKirTrInf; - STensorOperation::decomposeDevTr(q1->_Ee,devEe,trEe); - // Add Infinity terms - corKirInfinity(q1, devEe, trEe, T, corKirDevInf, corKirTrInf); for (int i=0; i<3; i++){ - DcorKirDT(i,i) += corKirTrInf*DKDT/KT - 3*KT*(DAlphaDT*(T-_Tinitial) + AlphaT); - DDcorKirDT(i,i) += corKirTrInf*DDKDT/KT - 6*DKDT*(DAlphaDT*(T-_Tinitial) + AlphaT)- 3*KT*(DDAlphaDT*(T-_Tinitial) + 2*DAlphaDT); + DcorKirDT(i,i) += DKDT*(trEe - 3*AlphaT*(T-_Tinitial))- 3*KT*(DAlphaDT*(T-_Tinitial) + AlphaT); + DDcorKirDT(i,i) += DDKDT*(trEe - 3*AlphaT*(T-_Tinitial)) - 6*DKDT*(DAlphaDT*(T-_Tinitial) + AlphaT)- 3*KT*(DDAlphaDT*(T-_Tinitial) + 2*DAlphaDT); for (int j=0; j<3; j++){ - DcorKirDT(i,j) += corKirDevInf(i,j)*DGDT/GT; - DDcorKirDT(i,j) += corKirDevInf(i,j)*DDGDT/GT; + DcorKirDT(i,j) += 2*DGDT*devEe(i,j); + DDcorKirDT(i,j) += 2*DDGDT*devEe(i,j); + for (int k=0; k<3; k++) + for (int l=0; l<3; l++) + DDcorKirDTDEe(i,j,k,l) += DKDT*_I(i,j)*_I(k,l) + 2*DGDT*_Idev(i,j,k,l); } } + // Add hyperelastic extrabranch terms + if (_useExtraBranch){ + double DsigV_dT(0.), DDsigV_dTT(0.), DDsigV_dTdTrEe(0.); + static STensor3 sigExtra, DsigD_dT, DDsigD_dTT, DDsigD_dTdTrEe; + static STensor43 DDsigD_dTdDevEe; + STensorOperation::zero(sigExtra); STensorOperation::zero(DsigD_dT); STensorOperation::zero(DDsigD_dTT); + STensorOperation::zero(DDsigD_dTdDevEe); + STensorOperation::zero(DDsigD_dTdTrEe); + + static STensor3 eff_Ee; + STensorOperation::zero(eff_Ee); + eff_Ee = -1.*_I; + eff_Ee *= 3.*AlphaT*(T-_Tinitial); + eff_Ee += q1->_Ee; + + if (_extraBranchNLType != TensionCompressionRegularisedType && _extraBranchNLType != hyper_exp_TCasymm_Type){ + extraBranchLaw(eff_Ee,T,q0,q1,sigExtra,true,NULL,NULL,NULL,NULL, + &DsigV_dT, &DsigD_dT, &DDsigV_dTT, &DDsigD_dTT, &DDsigV_dTdTrEe, &DDsigD_dTdDevEe); + } + else{ + extraBranchLaw(eff_Ee,T,q0,q1,sigExtra,true,NULL,NULL,NULL,NULL, + &DsigV_dT, &DsigD_dT, &DDsigV_dTT, &DDsigD_dTT, &DDsigV_dTdTrEe, &DDsigD_dTdDevEe, NULL, &DDsigD_dTdTrEe); + } + DcorKirDT += DsigV_dT*_I; + DcorKirDT += DsigD_dT; + DDcorKirDT += DDsigV_dTT*_I; + DDcorKirDT += DDsigD_dTT; + 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++){ + DDcorKirDTDEe(i,j,k,l) += DDsigV_dTdTrEe*_I(i,j)*_I(k,l); + + if (_extraBranchNLType == TensionCompressionRegularisedType || _extraBranchNLType == hyper_exp_TCasymm_Type){ + DDcorKirDTDEe(i,j,k,l) += DDsigD_dTdTrEe(i,j)*_I(k,l); + } + for (int r=0; r<3; r++) + for (int s=0; s<3; s++){ + DDcorKirDTDEe(i,j,k,l) += DDsigD_dTdDevEe(i,j,r,s)*_Idev(r,s,k,l); + } + } + } + // Add visco terms if ((_Ki.size() > 0) or (_Gi.size() > 0)){ for (int i=0; i<_Gi.size(); i++){ @@ -1809,9 +2197,11 @@ void mlawNonLinearTVM::getTVEdCorKirDT(const IPNonLinearTVM *q0, IPNonLinearTVM } else{ // all extraBranches, because _Idev was not multiplied to _DDA_DTDdevE in the predictorCorrector function DDcorKirDTDEe(j,k,r,s) += _Ki[i]*q1->_DDB_DTDtrE[i]*_I(j,k)*_I(r,s); - if (_ExtraBranch_TVE_option == 3){ + + if (_ExtraBranch_TVE_option == 3 || _ExtraBranch_TVE_option == 4 || _ExtraBranch_TVE_option == 5){ DDcorKirDTDEe(j,k,r,s) += 2*_Gi[i]*q1->_DDA_DTDtrE[i](j,k)*_I(r,s); } + for (int p=0; p<3; p++) for (int q=0; q<3; q++){ DDcorKirDTDEe(j,k,r,s) += 2*_Gi[i]*q1->_DDA_DTDdevE[i](j,k,p,q)*_Idev(p,q,r,s); @@ -1997,8 +2387,8 @@ void mlawNonLinearTVM::predictorCorrector_ThermoViscoElastic( double T_set = setTemp(T0,T,1); // 1->T1, 2->T_mid, 3->T_midshift // Make Identity Tensors - static const STensor3 I3(1.); - static const STensor43 I4(1.,1.); + // static const STensor3 I3(1.); + // static const STensor43 I4(1.,1.); // Update the Properties to the current temperature (see below which ones are being used) double KT, GT, AlphaT, KThConT, CpT, DKDT, DGDT, DAlphaDT, DKThConDT, DCpDT, DDKDT, DDGDT, DDAlphaDT; @@ -2028,6 +2418,7 @@ void mlawNonLinearTVM::predictorCorrector_ThermoViscoElastic( return; } } + // STensorOperation::logSTensor3(C,_order,E,&dlnCdC,&ddlnCddC); E *= 0.5; // strain // Stresses and Effective Moduli @@ -2035,46 +2426,42 @@ void mlawNonLinearTVM::predictorCorrector_ThermoViscoElastic( static STensor43 Bd_stiffnessTerm, Bd_stiffnessTerm2; STensorOperation::zero(Bd_stiffnessTerm); STensorOperation::zero(Bd_stiffnessTerm2); - if(_ExtraBranch_TVE_option != 3){ - ThermoViscoElasticPredictor(E,q0->_Ee,q0,q1,Ke,Ge,DKDTsum,DGDTsum,T0,T,stiff,Bd_stiffnessTerm); + if(_extraBranchNLType == TensionCompressionRegularisedType || _extraBranchNLType == hyper_exp_TCasymm_Type || _ExtraBranch_TVE_option == 3 || _ExtraBranch_TVE_option == 4 || _ExtraBranch_TVE_option == 5){ + ThermoViscoElasticPredictor(E,q0->_Ee,q0,q1,Ke,Ge,DKDTsum,DGDTsum,T0,T,stiff,Bd_stiffnessTerm,&Bd_stiffnessTerm2); // Updates the values of moduli to the current temperatures and calculate stresses. } else{ - ThermoViscoElasticPredictor(E,q0->_Ee,q0,q1,Ke,Ge,DKDTsum,DGDTsum,T0,T,stiff,Bd_stiffnessTerm,&Bd_stiffnessTerm2); + ThermoViscoElasticPredictor(E,q0->_Ee,q0,q1,Ke,Ge,DKDTsum,DGDTsum,T0,T,stiff,Bd_stiffnessTerm); } - // additional hyperelastic branch - static double DsigV_dT(0.), DDsigV_dTT(0.), DDsigV_dTdTrEe(0.); - static STensor3 sigExtra, DsigExtraDT, DsigD_dT, DDsigD_dTT, DDsigD_dTdTrEe; - static STensor43 DsigExtraDE, DDsigD_dTdDevEe; + // additional hyperelastic branch - NOt necessary anymore + // NEW + /* + static STensor3 sigExtra; + static STensor43 DsigExtraDE; STensorOperation::zero(sigExtra); STensorOperation::zero(DsigExtraDE); - STensorOperation::zero(DsigExtraDT); - STensorOperation::zero(DsigD_dT); - STensorOperation::zero(DDsigD_dTT); - STensorOperation::zero(DDsigD_dTdDevEe); - STensorOperation::zero(DDsigD_dTdTrEe); if (_useExtraBranch){ - if (_extraBranchNLType != TensionCompressionRegularisedType){ - mlawNonLinearTVM::extraBranchLaw(E,T,q0,q1,sigExtra,stiff,&DsigExtraDE,&DsigExtraDT,NULL,NULL, - &DsigV_dT, &DsigD_dT, &DDsigV_dTT, &DDsigD_dTT, &DDsigV_dTdTrEe, &DDsigD_dTdDevEe); - } - else{ - mlawNonLinearTVM::extraBranchLaw(E,T,q0,q1,sigExtra,stiff,&DsigExtraDE,&DsigExtraDT,NULL,NULL, - &DsigV_dT, &DsigD_dT, &DDsigV_dTT, &DDsigD_dTT, &DDsigV_dTdTrEe, &DDsigD_dTdDevEe, NULL, &DDsigD_dTdTrEe); - } + mlawNonLinearTVM::extraBranchLaw(E,T,q0,q1,sigExtra,stiff,&DsigExtraDE); q1->_corKirExtra = sigExtra; } - q1->_kirchhoff += sigExtra; + q1->_kirchhoff += sigExtra; */ const STensor3& corKir = q1->getConstRefToCorotationalKirchhoffStress(); static STensor3 devT; - double pT; + double pT(0.); STensorOperation::decomposeDevTr(corKir,devT,pT); q1->_pressure = pT/3.; - static STensor3 secondPK; - STensorOperation::multSTensor3STensor43(corKir,dlnCdC,secondPK); + static STensor3 secondPK; // , Ceinv, Me, temp1_Me, temp2_Me; + /* + STensorOperation::inverseSTensor3(C,Ceinv); + STensorOperation::multSTensor3(C, q1->_kirchhoff, temp1_Me); + STensorOperation::multSTensor3(temp1_Me, Ceinv, temp2_Me); + Me = 0.5*(q1->_kirchhoff + temp2_Me); + STensorOperation::multSTensor3(Ceinv,Me,secondPK);*/ + + STensorOperation::multSTensor3STensor43(q1->_kirchhoff,dlnCdC,secondPK); STensorOperation::multSTensor3(F,secondPK,P); // 1st PK // elastic energy and derivatives @@ -2127,28 +2514,14 @@ void mlawNonLinearTVM::predictorCorrector_ThermoViscoElastic( // CorKir derivatives wrt T getTVEdCorKirDT(q0,q1,T0,T); - STensor3& DcorKirDT = q1->getRefToDcorKirDT(); - STensor3& DDcorKirDT = q1->getRefToDDcorKirDTT(); // for mech source derivatives - STensor43& DDcorKirDTDEe = q1->getRefToDDcorKirDTDE(); - if (_useExtraBranch){ - DcorKirDT += DsigV_dT*_I; - DcorKirDT += DsigD_dT; - DDcorKirDT += DDsigV_dTT*_I; - DDcorKirDT += DDsigD_dTT; - 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++){ - DDcorKirDTDEe(i,j,k,l) += DDsigV_dTdTrEe*_I(i,j)*_I(k,l) + DDsigD_dTdDevEe(i,j,k,l); - if (_extraBranchNLType == TensionCompressionRegularisedType){ - DDcorKirDTDEe(i,j,k,l) += DDsigD_dTdTrEe(i,j)*_I(k,l); - } - } - } + const STensor3& DcorKirDT = q1->getRefToDcorKirDT(); + const STensor3& DDcorKirDT = q1->getRefToDDcorKirDTT(); // for mech source derivatives + const STensor43& DDcorKirDTDEe = q1->getRefToDDcorKirDTDE(); // Add corKirinf terms in IP + /* static STensor3 corKirDevInf, devEe; - static double corKirTrInf, trEe; + double corKirTrInf, trEe; STensorOperation::decomposeDevTr(E,devEe,trEe); const STensor3& DEe = q1->getConstRefToDE(); @@ -2165,7 +2538,9 @@ void mlawNonLinearTVM::predictorCorrector_ThermoViscoElastic( corKirTrInf += 1/3*tr_sigExtra; // LHS is pressure // q1->_trCorKirinf_TVE = 3*corKirTrInf; //CHANGE - // q1->_devCorKirinf_TVE = corKirDevInf; //CHANGE + // q1->_devCorKirinf_TVE = corKirDevInf; //CHANGE + */ + const STensor3& DEe = q1->getConstRefToDE(); // mechanicalSource mechanicalSource = 0.; @@ -2209,8 +2584,8 @@ void mlawNonLinearTVM::predictorCorrector_ThermoViscoElastic( static STensor43 DcorKDE; isotropicHookTensor(Ke,Ge,DcorKDE); - DcorKDE += DsigExtraDE; - if (_useExtraBranch_TVE){ + // DcorKDE += DsigExtraDE; // NEW + if (_useExtraBranch || _useExtraBranch_TVE){ for (int i=0; i<3; i++) for (int j=0; j<3; j++) for (int k=0; k<3; k++) @@ -2219,7 +2594,7 @@ void mlawNonLinearTVM::predictorCorrector_ThermoViscoElastic( for (int q=0; q<3; q++){ DcorKDE(i,j,k,l) += Bd_stiffnessTerm(i,j,p,q)*_Idev(p,q,k,l); } - DcorKDE += Bd_stiffnessTerm2; // for _ExtraBranch_TVE_option == 3 + DcorKDE += Bd_stiffnessTerm2; // for _ExtraBranch_TVE_option == 3 || _extraBranchNLType = TensionCompression } @@ -2239,21 +2614,6 @@ void mlawNonLinearTVM::predictorCorrector_ThermoViscoElastic( } } } - /* - for (int i=0; i<3; i++){ - for (int j=0; j<3; j++){ - for (int q=0; q<3; q++){ - DCeDFe(i,j,j,q) += F(i,q); - } - } - } - for (int q=0; q<3; q++){ - for (int j=0; j<3; j++){ - for (int p=0; p<3; p++){ - DCeDFe(q,j,p,j) += F(q,p); - } - } - }*/ STensorOperation::multSTensor43(dlnCdC,DCeDFe,DEeDFe); DEeDFe *= 0.5; @@ -2421,19 +2781,23 @@ void mlawNonLinearTVM::predictorCorrector_ThermoViscoElastic( Tangent(i,j,k,l) += q1->_P_cap(i,j) * Deta_mullins_DF(k,l); } - static STensor3 DDpsiNew_DpsiMaxDF; + static STensor3 DDpsiNew_DpsiMaxDF, DpsiMax_DF; STensorOperation::multSTensor3STensor43(q1->_DpsiDE,DEeDFe,DDpsiNew_DpsiMaxDF); + STensorOperation::multSTensor3STensor43(q1->_DpsiDE,DEeDFe,DpsiMax_DF); DDpsiNew_DpsiMaxDF *= q1->_ipMullinsEffect->getDDpsiNew_DpsiMaxDpsi(); + DpsiMax_DF *= q1->_ipMullinsEffect->getDpsiMax_Dpsi(); dmechanicalSourcedT += q1->_DmullinsDamage_DT*mechanicalSource; if (this->getTimeStep() > 0){ - dmechanicalSourcedT -= q1->_ipMullinsEffect->getDDpsiNew_DpsiMaxDT()*(q1->_ipMullinsEffect->getpsiMax() - q0->_ipMullinsEffect->getpsiMax())/this->getTimeStep(); + dmechanicalSourcedT -= (q1->_ipMullinsEffect->getDDpsiNew_DpsiMaxDT()*(q1->_ipMullinsEffect->getpsiMax() - q0->_ipMullinsEffect->getpsiMax())/this->getTimeStep() + + q1->_ipMullinsEffect->getDpsiNew_DpsiMax()*q1->_ipMullinsEffect->getDpsiMax_Dpsi()*q1->_DpsiDT/this->getTimeStep()); for (int i=0; i<3; i++) for (int j=0; j<3; j++){ dmechanicalSourceF(i,j) -= DDpsiNew_DpsiMaxDF(i,j)*(q1->_ipMullinsEffect->getpsiMax() - q0->_ipMullinsEffect->getpsiMax())/this->getTimeStep(); + dmechanicalSourceF(i,j) -= q1->_ipMullinsEffect->getDpsiNew_DpsiMax()*DpsiMax_DF(i,j)/this->getTimeStep(); } } - + } } }; @@ -2445,7 +2809,8 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor_forTVP(const STensor3& Ee, co // STensorOperation::zero(Bd_stiffnessTerm); - if(_extraBranchNLType == TensionCompressionRegularisedType && Bd_stiffnessTerm2!= NULL){ + // if(_extraBranchNLType == TensionCompressionRegularisedType && Bd_stiffnessTerm2!= NULL){ + if(Bd_stiffnessTerm2!= NULL){ STensorOperation::zero(*Bd_stiffnessTerm2); } @@ -2453,62 +2818,55 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor_forTVP(const STensor3& Ee, co double T_set = setTemp(T0,T1,1); // 1->T1, 2->T_mid, 3->T_midshift // Update the Properties to the current temperature (see below which ones are being used) - double KT, GT, AlphaT, DKDT, DGDT, DAlphaDT; - getK(q1,KT,T_set,&DKDT); getG(q1,GT,T_set,&DGDT); getAlpha(AlphaT,T_set,&DAlphaDT); + double KT, GT, AlphaT0, AlphaT, DKDT, DGDT, DAlpha0DT, DAlphaDT, DDAlphaDTT; + getK(q1,KT,T_set,&DKDT); getG(q1,GT,T_set,&DGDT); getAlpha(AlphaT,T_set,&DAlphaDT,&DDAlphaDTT); getAlpha(AlphaT0,T0); // Get LogStrain (E) andput DEe in IP STensor3& DE = q1->getRefToDE(); STensor3& devDE = q1->getRefToDevDE(); double& trDE = q1->getRefToTrDE(); static STensor3 devEe; - static double trEe; + double trEe(0.); DE = Ee; DE -= Ee0; STensorOperation::decomposeDevTr(DE,devDE,trDE); STensorOperation::decomposeDevTr(Ee,devEe,trEe); + // Initialise effective trEe - include thermal expansion + double eff_trEe(0.), eff_trDE(0.); + eff_trEe = trEe - 3*AlphaT*(T1-_Tinitial); + eff_trDE = trDE - 3.*(AlphaT*(T1-_Tinitial) - AlphaT0*(T0-_Tinitial)); + // Initialise CorKirStress - Dev static STensor3 devK; STensorOperation::zero(devK); devK = 2*GT*devEe; // Initialise CorKirStress - Tr - static double p; - p = KT*(trEe - 3*AlphaT*(T1-_Tinitial)); + double p(0.); + p = KT*eff_trEe; // Initialise Moduli Ke = KT; Ge = GT; if(_useExtraBranch){ - double A(0.), B(0.), dA_dTrEe(0.); - STensor3 dB_dDevEe; + double A(0.), B(0.), dA_dTrEe(0.), psiInfCorrector(0.); + static STensor3 dB_dDevEe; double intA(0.), intB(0.), dA_dT(0.), dB_dT(0.); - if(_extraBranchNLType != TensionCompressionRegularisedType){ - evaluateElasticCorrection(trEe, devEe, T1, A, dA_dTrEe, intA, dA_dT, B, dB_dDevEe, intB, dB_dT); + + if(_extraBranchNLType != TensionCompressionRegularisedType && _extraBranchNLType != hyper_exp_TCasymm_Type){ + evaluateElasticCorrection(eff_trEe, devEe, T1, A, dA_dTrEe, intA, dA_dT, B, dB_dDevEe, intB, dB_dT, NULL ,NULL, NULL, NULL, NULL, &psiInfCorrector); } else{ double dB_dTrEe(0.); - evaluateElasticCorrection(trEe, devEe, T1, A, dA_dTrEe, intA, dA_dT, B, dB_dDevEe, intB, dB_dT, NULL ,NULL, NULL, NULL, &dB_dTrEe); + evaluateElasticCorrection(eff_trEe, devEe, T1, A, dA_dTrEe, intA, dA_dT, B, dB_dDevEe, intB, dB_dT, NULL ,NULL, NULL, NULL, &dB_dTrEe, &psiInfCorrector); q1->_dBd_dTrEe = dB_dTrEe; } - if (A <= -1. + 1.e-5){ // saturated - double trEe_0 = q0->_Ee.trace(); - intA = q0->_intA; - intA += A*0.5 *(trEe*trEe-trEe_0*trEe_0); - } q1->_intA = intA; - - if (B <= -1. + 1.e-5){ // saturated - static STensor3 devEe_0; - double trEe_0; - STensorOperation::decomposeDevTr(q0->_Ee,devEe_0,trEe_0); - intA = q0->_intB; - intA += B*0.5 *(devEe.dotprod()-devEe_0.dotprod()); - } q1->_intB = intB; - + q1->_psiInfCorrector = psiInfCorrector; // Additional term to correct thermal expansion term in free energy q1->_elasticBulkPropertyScaleFactor = A; q1->_elasticShearPropertyScaleFactor = B; q1->_dAv_dTrEe = dA_dTrEe; @@ -2516,15 +2874,16 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor_forTVP(const STensor3& Ee, co // Add to stress - static STensor3 temp; - temp = devEe; - temp *= 2.*GT*B; - devK += temp; - p += trEe*KT*A; - // p += (trEe - 3*AlphaT*(T1-_Tinitial))*KT*A; // CHECK + static STensor3 sigExtra; + sigExtra = devEe; + sigExtra *= 2.*GT*B; + devK += sigExtra; + sigExtra += _I*(eff_trEe*KT*A); + p += eff_trEe*KT*A; + q1->_corKirExtra = sigExtra; // Add to Ke - Ke += KT*A + trEe*KT*dA_dTrEe; + Ke += KT*A + KT*dA_dTrEe*eff_trEe; // Add to Ge (1st term) and Bd_stiffnessTerm (2nd term) Ge += GT*B; // don't multiply 2 @@ -2533,7 +2892,7 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor_forTVP(const STensor3& Ee, co for (int p=0; p<3; p++) for (int q=0; q<3; q++){ Bd_stiffnessTerm(k,l,p,q) += 2*GT*devEe(k,l)*dB_dDevEe(p,q); - if(_extraBranchNLType == TensionCompressionRegularisedType){ + if(_extraBranchNLType == TensionCompressionRegularisedType || _extraBranchNLType == hyper_exp_TCasymm_Type){ (*Bd_stiffnessTerm2)(k,l,p,q) += 2*GT*devEe(k,l)*_I(p,q)*q1->_dBd_dTrEe; } } @@ -2562,7 +2921,7 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor_forTVP(const STensor3& Ee, co if (_useExtraBranch_TVE){ if(_ExtraBranch_TVE_option == 1){ - mlawNonLinearTVM::extraBranch_nonLinearTVE(Ee,T1,Av,dA_dTrEe,intA,intA1,intA2,dA_dT,ddA_dTT,ddA_dTdTrEe,Bd,dB_dDevEe,intB,intB1,intB2,dB_dT,ddB_dTT,ddB_dTdDevEe); + mlawNonLinearTVM::extraBranch_nonLinearTVE(0,Ee,T1,Av,dA_dTrEe,intA,intA1,intA2,dA_dT,ddA_dTT,ddA_dTdTrEe,Bd,dB_dDevEe,intB,intB1,intB2,dB_dT,ddB_dTT,ddB_dTdDevEe); q1->_Av_TVE = Av; q1->_Bd_TVE = Bd; q1->_dAv_dTrEe_TVE = dA_dTrEe; q1->_dBd_dDevEe_TVE = dB_dDevEe; q1->_intAv_TVE = intA; q1->_intBd_TVE = intB; q1->_intAv_1_TVE = intA1; q1->_intBd_1_TVE = intB1; // this is zero @@ -2597,7 +2956,7 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor_forTVP(const STensor3& Ee, co q1->_A[i](k,l) = exp_rec_g*q0->_A[i](k,l) + exp_mid_g*devDE(k,l); } - q1->_B[i] = exp_rec_k*q0->_B[i] + exp_mid_k*trDE; + q1->_B[i] = exp_rec_k*q0->_B[i] + exp_mid_k*eff_trDE ; //*trDE; NEW // Add to deviatoric stress devK += 2*_Gi[i]*q1->_A[i]; @@ -2639,14 +2998,14 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor_forTVP(const STensor3& Ee, co // Add to volumetric stress p += ( _Ki[i]*q1->_B[i] ); } - else if (_ExtraBranch_TVE_option == 2 || _ExtraBranch_TVE_option == 3){ + else if (_ExtraBranch_TVE_option == 2 || _ExtraBranch_TVE_option == 3 || _ExtraBranch_TVE_option == 4 || _ExtraBranch_TVE_option == 5){ // Single Convolution - get branchElasticStrain for (int k=0; k<3; k++) for (int l=0; l<3; l++) q1->_A[i](k,l) = exp_rec_g*q0->_A[i](k,l) + exp_mid_g*devDE(k,l); - q1->_B[i] = exp_rec_k*q0->_B[i] + exp_mid_k*trDE; + q1->_B[i] = exp_rec_k*q0->_B[i] + exp_mid_k*eff_trDE; // trDE; // NEW static STensor3 branchElasticStrain; branchElasticStrain = q1->_A[i]; @@ -2654,12 +3013,12 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor_forTVP(const STensor3& Ee, co branchElasticStrain(1,1) += 1./3.*q1->_B[i]; branchElasticStrain(2,2) += 1./3.*q1->_B[i]; if (_ExtraBranch_TVE_option == 2){ - mlawNonLinearTVM::extraBranch_nonLinearTVE(branchElasticStrain,T1,Av,dA_dTrEe,intA,intA1,intA2,dA_dT,ddA_dTT,ddA_dTdTrEe, + mlawNonLinearTVM::extraBranch_nonLinearTVE(i,branchElasticStrain,T1,Av,dA_dTrEe,intA,intA1,intA2,dA_dT,ddA_dTT,ddA_dTdTrEe, Bd,dB_dDevEe,intB,intB1,intB2,dB_dT,ddB_dTT,ddB_dTdDevEe); } else{ double dB_dTrEe(0.); - mlawNonLinearTVM::extraBranch_nonLinearTVE(branchElasticStrain,T1,Av,dA_dTrEe,intA,intA1,intA2,dA_dT,ddA_dTT,ddA_dTdTrEe, + mlawNonLinearTVM::extraBranch_nonLinearTVE(i,branchElasticStrain,T1,Av,dA_dTrEe,intA,intA1,intA2,dA_dT,ddA_dTT,ddA_dTdTrEe, Bd,dB_dDevEe,intB,intB1,intB2,dB_dT,ddB_dTT,ddB_dTdDevEe,&dB_dTrEe); q1->_dBd_dTrEe_TVE_vector[i] = dB_dTrEe; } @@ -2677,7 +3036,7 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor_forTVP(const STensor3& Ee, co for (int p=0; p<3; p++) for (int q=0; q<3; q++){ Bd_stiffnessTerm(k,l,p,q) += 2*_Gi[i]*q1->_A[i](k,l)*dB_dDevEe(p,q) * exp_mid_g; - if (_ExtraBranch_TVE_option == 3){ + if (_ExtraBranch_TVE_option == 3 || _ExtraBranch_TVE_option == 4 || _ExtraBranch_TVE_option == 5){ (*Bd_stiffnessTerm2)(k,l,p,q) += 2*_Gi[i]*q1->_dBd_dTrEe_TVE_vector[i]*q1->_A[i](k,l)*_I(p,q) * exp_mid_k; } } @@ -2717,6 +3076,11 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor_forTVP(const STensor3& Ee, co double dtk(0.), dtk2(0.), exp_rec_k(0.), exp_mid_k(0.); double dtg(0.), dtg2(0.), exp_rec_g(0.), exp_mid_g(0.); + // NEW + double Deff_trDE_DT = -3.*(DAlphaDT*(T1-_Tinitial) + AlphaT); + double DDeff_trDE_DTT = -3.*(DDAlphaDTT*(T1-_Tinitial) + 2*DAlphaDT); + // NEW + for (int i=0; i<_Gi.size(); i++){ dtk = dt_shift_rec/(_ki[i]); @@ -2741,8 +3105,8 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor_forTVP(const STensor3& Ee, co if (!_useExtraBranch_TVE){ DB_DtrE[i] = exp_mid_k; - DB_DT[i] = q0->_B[i] * Dexp_rec_k_DT + Dexp_mid_k_DT*trDE; - DDB_DTT[i] = q0->_B[i] * DDexp_rec_k_DTT + DDexp_mid_k_DTT*trDE; + DB_DT[i] = q0->_B[i] * Dexp_rec_k_DT + Dexp_mid_k_DT*eff_trDE + exp_rec_k*Deff_trDE_DT; // trDE; // NEW + DDB_DTT[i] = q0->_B[i] * DDexp_rec_k_DTT + DDexp_mid_k_DTT*eff_trDE + 2*Dexp_mid_k_DT*Deff_trDE_DT + exp_mid_k*DDeff_trDE_DTT; // trDE; //NEW DDB_DTDtrE[i] = Dexp_mid_k_DT; for (int k=0; k<3; k++) for (int l=0; l<3; l++){ @@ -2782,13 +3146,13 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor_forTVP(const STensor3& Ee, co } } } - else if (_ExtraBranch_TVE_option == 2 || _ExtraBranch_TVE_option == 3){ + else if (_ExtraBranch_TVE_option == 2 || _ExtraBranch_TVE_option == 3 || _ExtraBranch_TVE_option == 4 || _ExtraBranch_TVE_option == 5){ // Here the derivative are made as: B[i] = Av[i]*B[i]; A[i] = Bd[i]*A[i]; Above, BranchElasticStrain = A[i] + 1/3*B[i]*_I double dTrEei_DT(0.), ddTrEei_DTT(0.); // branchElasticStrain trace static STensor3 dDevEei_DT, ddDevEei_DTT; - dTrEei_DT = q0->_B[i] * Dexp_rec_k_DT + Dexp_mid_k_DT*trDE; - ddTrEei_DTT = q0->_B[i] * DDexp_rec_k_DTT + DDexp_mid_k_DTT*trDE; + dTrEei_DT = q0->_B[i] * Dexp_rec_k_DT + Dexp_mid_k_DT*eff_trDE + exp_mid_k*Deff_trDE_DT; // trDE; //NEW + ddTrEei_DTT = q0->_B[i] * DDexp_rec_k_DTT + DDexp_mid_k_DTT*eff_trDE + 2.*Dexp_mid_k_DT*Deff_trDE_DT + exp_mid_k*DDeff_trDE_DTT; // trDE; //NEW for (int k=0; k<3; k++) for (int l=0; l<3; l++){ dDevEei_DT(k,l) = q0->_A[i](k,l) * Dexp_rec_g_DT + Dexp_mid_g_DT*devDE(k,l); @@ -2806,7 +3170,7 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor_forTVP(const STensor3& Ee, co DA_DT[i](k,l) = q1->_Bd_TVE_vector[i]*dDevEei_DT(k,l); DDA_DTT[i](k,l) = q1->_Bd_TVE_vector[i]*ddDevEei_DTT(k,l); - if (_ExtraBranch_TVE_option == 3){ + if (_ExtraBranch_TVE_option == 3 || _ExtraBranch_TVE_option == 4 || _ExtraBranch_TVE_option == 5){ DA_DT[i](k,l) += q1->_A[i](k,l)*q1->_dBd_dTrEe_TVE_vector[i]*dTrEei_DT; DDA_DTT[i](k,l) += q1->_A[i](k,l)*q1->_dBd_dTrEe_TVE_vector[i]*ddTrEei_DTT + 2*q1->_dBd_dTrEe_TVE_vector[i]*dTrEei_DT*dDevEei_DT(k,l); @@ -2825,7 +3189,11 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor_forTVP(const STensor3& Ee, co // _Idev is not pre-multiplied !! DA_DdevE[i](k,l,r,s) = exp_mid_g * ( q1->_A[i](k,l)*q1->_dBd_dDevEe_TVE_vector[i](r,s) + q1->_Bd_TVE_vector[i] * _I4(k,l,r,s) ); DDA_DTDdevE[i](k,l,r,s) = Dexp_mid_g_DT * ( q1->_A[i](k,l)*q1->_dBd_dDevEe_TVE_vector[i](r,s) + q1->_Bd_TVE_vector[i] * _I4(k,l,r,s) ) - + exp_mid_g * ( 2.* dDevEei_DT(k,l)* q1->_dBd_dDevEe_TVE_vector[i](r,s)); + + exp_mid_g * ( dDevEei_DT(k,l)* q1->_dBd_dDevEe_TVE_vector[i](r,s)); + for (int p=0; p<3; p++) + for (int q=0; q<3; q++){ + DDA_DTDdevE[i](k,l,r,s) += exp_mid_g * q1->_dBd_dDevEe_TVE_vector[i](p,q)*dDevEei_DT(p,q)*_I4(k,l,r,s); + } } } } // if - extraBranchTVE_option @@ -2842,6 +3210,10 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor_forTVP(const STensor3& Ee, co double dtk(0.), dtk2(0.), exp_rec_k(0.), exp_mid_k(0.); double dtg(0.), dtg2(0.), exp_rec_g(0.), exp_mid_g(0.); + // NEW + double Deff_trDE_DT = -3.*(DAlphaDT*(T1-_Tinitial) + AlphaT); + // NEW + for (int i=0; i<_Gi.size(); i++){ dtk = dt_shift_rec/(_ki[i]); @@ -2860,7 +3232,7 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor_forTVP(const STensor3& Ee, co Dexp_mid_g_DT = -1/(_gi[i]) * Ddt_shiftDT_mid*exp_mid_g; if (!_useExtraBranch_TVE){ - DB_DT[i] = q0->_B[i] * Dexp_rec_k_DT + Dexp_mid_k_DT*trDE; + DB_DT[i] = q0->_B[i] * Dexp_rec_k_DT + Dexp_mid_k_DT*eff_trDE + exp_rec_k*Deff_trDE_DT; // trDE; // NEW for (int k=0; k<3; k++) for (int l=0; l<3; l++){ DA_DT[i](k,l) = q0->_A[i](k,l) * Dexp_rec_g_DT + Dexp_mid_g_DT*devDE(k,l); @@ -2880,12 +3252,12 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor_forTVP(const STensor3& Ee, co q0->_A[i](k,l) * 1/q0->_Bd_TVE * temp2); } } - else if (_ExtraBranch_TVE_option == 2 || _ExtraBranch_TVE_option == 3){ + else if (_ExtraBranch_TVE_option == 2 || _ExtraBranch_TVE_option == 3 || _ExtraBranch_TVE_option == 4 || _ExtraBranch_TVE_option == 5){ // Here the derivative are made as: B[i] = Av[i]*B[i]; A[i] = Bd[i]*A[i]; Above, BranchElasticStrain = A[i] + 1/3*B[i]*_I double dTrEei_DT(0.); // branchElasticStrain trace static STensor3 dDevEei_DT; - dTrEei_DT = q0->_B[i] * Dexp_rec_k_DT + Dexp_mid_k_DT*trDE; + dTrEei_DT = q0->_B[i] * Dexp_rec_k_DT + Dexp_mid_k_DT*eff_trDE + exp_mid_k*Deff_trDE_DT; // trDE; //NEW for (int k=0; k<3; k++) for (int l=0; l<3; l++) dDevEei_DT(k,l) = q0->_A[i](k,l) * Dexp_rec_g_DT + Dexp_mid_g_DT*devDE(k,l); @@ -2895,7 +3267,7 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor_forTVP(const STensor3& Ee, co for (int l=0; l<3; l++){ DA_DT[i](k,l) = q1->_Bd_TVE_vector[i]*dDevEei_DT(k,l); - if (_ExtraBranch_TVE_option == 3){ + if (_ExtraBranch_TVE_option == 3 || _ExtraBranch_TVE_option == 4 || _ExtraBranch_TVE_option == 5){ DA_DT[i](k,l) += q1->_A[i](k,l)*q1->_dBd_dTrEe_TVE_vector[i]*dTrEei_DT; } @@ -3059,4 +3431,4 @@ void mlawNonLinearTVM::getMechSource_nonLinearTVE_term(const IPNonLinearTVM *q0, } } -}; */ \ No newline at end of file +}; */ diff --git a/NonLinearSolver/materialLaw/mlawNonLinearTVM.h b/NonLinearSolver/materialLaw/mlawNonLinearTVM.h index 55e6bc3d7e5b3b7d93b52a3c11e4d2472ad0ff5c..75ab05a0bba921e48a93c3c33b59abbf9d176b3c 100644 --- a/NonLinearSolver/materialLaw/mlawNonLinearTVM.h +++ b/NonLinearSolver/materialLaw/mlawNonLinearTVM.h @@ -66,6 +66,22 @@ class mlawNonLinearTVM : public mlawPowerYieldHyper{ scalarFunction* _temFunc_elasticCorrection_Bulk; scalarFunction* _temFunc_elasticCorrection_Shear; + // Extrabranch Corrector parameters + std::vector<double> _V0; + std::vector<double> _V1; + std::vector<double> _V2; + std::vector<double> _V3; + std::vector<double> _V4; + std::vector<double> _V5; + std::vector<double> _D0; + std::vector<double> _D1; + std::vector<double> _D2; + std::vector<double> _D3; + std::vector<double> _D4; + std::vector<double> _D5; + std::vector<double> _Ci; + + #ifndef SWIG protected: // Const Functions for constitutive function - To update any variable, pass it as an argument by reference. @@ -84,7 +100,7 @@ class mlawNonLinearTVM : public mlawPowerYieldHyper{ double &B_d, STensor3 &dB_vddev, double &intB, double &dBdT, double *ddAdTT = NULL, double *ddBdTT = NULL, double *ddA_vdTdE = NULL, STensor3 *ddB_vdTdevE = NULL, - double *dB_dTrEe = NULL, double *dB_dTdTrEe = NULL) const; + double *dB_dTrEe = NULL, double *dB_dTdTrEe = NULL, double *psiInfCorrector = NULL) const; virtual void extraBranchLaw(const STensor3& Ee, const double& T, const IPNonLinearTVM *q0, IPNonLinearTVM *q1, STensor3& sig, const bool stiff = false, STensor43* DsigDEe = NULL, STensor3* DsigDT = NULL, @@ -94,7 +110,7 @@ class mlawNonLinearTVM : public mlawPowerYieldHyper{ double* DDsigV_dTdTrEe = NULL, STensor43* DDsigD_dTdDevEe = NULL, STensor3* DsigD_dTrEe = NULL, STensor3* DsigD_dTdTrEe = NULL) const; - virtual void extraBranch_nonLinearTVE(const STensor3& Ee, const double& T, + virtual void extraBranch_nonLinearTVE(const int i, const STensor3& Ee, const double& T, double& Av, double& dA_dTrEe, double& intA, double& intA1, double& intA2, double& dA_dT, double& ddA_dTT, double& ddA_dTdTrEe, double& Bd, STensor3& dB_dDevEe, double &intB, STensor3 &intB1, STensor3 &intB2, double &dB_dT, double &ddB_dTT, STensor3& ddB_dTdDevEe, double* dB_dTrEe = NULL) const; @@ -186,6 +202,10 @@ class mlawNonLinearTVM : public mlawPowerYieldHyper{ 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 setCorrectionsAllBranchesTVE(const int i, const double V1, const double V2, const double D1, const double D2); + virtual void setAdditionalCorrectionsAllBranchesTVE(const int i, const double V3, const double D3); + virtual void setAdditionalCorrectionsAllBranchesTVE(const int i, const double V3, const double V4, const double V5, const double D3, const double D4, const double D5); + virtual void setCompressionCorrectionsAllBranchesTVE(const int i, const double Ci); virtual void setViscoElasticData(const std::string filename); // Non-Const Functions for temp and temp_functions that are called from .py file. ---- These WILL change the values of the variables defined in the class object. @@ -339,4 +359,4 @@ class mlawNonLinearTVM : public mlawPowerYieldHyper{ virtual void checkInternalState(IPVariable* ipv, const IPVariable* ipvprev) const{}; // do nothing #endif // SWIG }; -#endif //mlawNonLinearTVM \ No newline at end of file +#endif //mlawNonLinearTVM diff --git a/NonLinearSolver/materialLaw/mlawNonLinearTVP.cpp b/NonLinearSolver/materialLaw/mlawNonLinearTVP.cpp index c01fd8e62d4229a4936230545a4ec29703116016..e45d224a9fd182848c587a32018f2a3480410fba 100644 --- a/NonLinearSolver/materialLaw/mlawNonLinearTVP.cpp +++ b/NonLinearSolver/materialLaw/mlawNonLinearTVP.cpp @@ -1046,7 +1046,7 @@ void mlawNonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow(const STensor3& sigExtra = sigExtra_pr; DsigV_dTrEe = DsigV_dTrEe_pr; DsigD_dDevEe = DsigD_dDevEe_pr; - const STensor3& dKeprDT = q1->_DcorKirDT; // Get the predicted value - dont add extra branch here + const STensor3& dKeprDT = q1->_DcorKirDT; // Get the predicted value - Has extraBranch inside // Initialise Dho static STensor43 Dho3, Dho4inv, Dho4_u_inv; // This will be the final important tensor. @@ -1793,45 +1793,6 @@ void mlawNonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow(const STensor3& STensorOperation::multSTensor3STensor43(DphiEDdevPhi,DdevphiDCepr,DphiEDCepr); - - // Numerical Derivatives - /* - double Dgamma_plus(0.), Gamma_plus(0.), u_plus(0.), v_plus(0.), ptilde_plus(0.), ptildepr_plus(0.); - static STensor3 F_plus, Ee_plus, Kepr_plus, Mepr_plus, Ke_plus, Me_plus, N_plus, P_plus, DphiPDF_plus, sigExtra_plus, devPhipr_plus, devPhi_plus; - static STensor3 Cepr_plus, Eepr_plus; - static STensor43 DEeDCepr_plus, dlnCdC_pr_plus; - - static IPNonLinearTVP q_Plus(*q0); - - // Deformation Derivatives - for (int i=0; i<3; i++){ - for (int j=0; j<3; j++){ - F_plus = (F); - F_plus(i,j) += _perturbationfactor; - Cepr_plus = Cepr; - Cepr_plus(i,j) += 0.5*_perturbationfactor; - Cepr_plus(j,i) += 0.5*_perturbationfactor; - - bool ok1 = STensorOperation::logSTensor3(Cepr_plus,_order,Eepr_plus,&dlnCdC_pr_plus); - Ee_plus = -Gamma*N; - Ee_plus += Eepr_plus; - - - for (int k=0; k<3; k++){ - for (int l=0; l<3; l++){ - DEeDCepr_plus(k,l,i,j) = (Ee_plus(k,l) - Ee(k,l))/(_perturbationfactor); - } - } - - plasticCorrector_TVP(F0,F,q0,&q_Plus,T0,T,Kepr_plus,Mepr_plus,u_plus,v_plus, - Ke_plus,Me_plus,N_plus,P_plus, - Dgamma_plus, Gamma_plus, - ptildepr_plus, ptilde_plus, devPhipr_plus, devPhi_plus, - true, &DphiPDF_plus); - - } - }*/ - //9. get DtrNDCepr DdevNdCepr DtrNDCepr = DphiPDCepr; DtrNDCepr *= (2.*_b); @@ -1839,7 +1800,6 @@ void mlawNonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow(const STensor3& DdevNDCepr = DdevphiDCepr; DdevNDCepr *= 3.; - // DEBUG for (int i=0; i<3; i++) for (int j=0; j<3; j++) for (int k=0; k<3; k++) @@ -2117,7 +2077,9 @@ void mlawNonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow(const STensor3& DcorKirDT = dKeprDT; // update later - // 1.1 add extraBranch DsigV_DT, DsigD_DT (these do not need to be corrected) + // Not required anymore -> dKeprDT has extrabranch inside + // 1.1 add extraBranch DsigV_DT, DsigD_DT (these do not need to be corrected) + /* if (_useExtraBranch){ DcorKirDT += DsigD_dT; @@ -2130,7 +2092,7 @@ void mlawNonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow(const STensor3& dDevMeprDT += DsigD_dT; // goes to dDevPhiprDT // dMedT, dSdT come from DcorKirDT directly - } + }*/ // 2. get dPhipprDT and dDevPhiprDT static double dPhipprDT; @@ -2558,26 +2520,6 @@ void mlawNonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow(const STensor3& STensor3& temp_DcorKirDT = q1->getRefToDcorKirDT(); STensor3& DDcorKirDTT = q1->getRefToDDcorKirDTT(); STensor43& DDcorKirDTDEe = q1->getRefToDDcorKirDTDE(); - - // Recall extraBranch - double DDsigV_dTdTrEe(0.), DDsigV_dTT(0.); - static STensor3 sigExtra_Temp, DDsigD_dTT; - static STensor43 DDsigD_dTdDevEe; - STensorOperation::zero(sigExtra_Temp); - STensorOperation::zero(DDsigD_dTdDevEe); - STensorOperation::zero(DDsigD_dTT); - if (_useExtraBranch){ - mlawNonLinearTVM::extraBranchLaw(Ee,T,q0,q1,sigExtra_Temp,stiff,NULL,NULL,NULL,NULL,NULL,NULL,&DDsigV_dTT,&DDsigD_dTT,&DDsigV_dTdTrEe,&DDsigD_dTdDevEe); - temp_DcorKirDT += DsigV_dT*_I; - temp_DcorKirDT += DsigD_dT; - DDcorKirDTT += DDsigV_dTT*_I; - DDcorKirDTT += DDsigD_dTT; - 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++) - DDcorKirDTDEe(i,j,k,l) += DDsigV_dTdTrEe*_I(i,j)*_I(k,l) + DDsigD_dTdDevEe(i,j,k,l); - } static STensor3 DcorKirDT_I; STensorOperation::multSTensor3STensor43(Correct_DcorKirDT,_I4,DcorKirDT_I); diff --git a/NonLinearSolver/materialLaw/mullinsEffect.cpp b/NonLinearSolver/materialLaw/mullinsEffect.cpp index 6d2182ca5ae3af335c326b46700a4c1da54f44a7..492a802249ea7e1f2653eb083b252ac57653f965 100644 --- a/NonLinearSolver/materialLaw/mullinsEffect.cpp +++ b/NonLinearSolver/materialLaw/mullinsEffect.cpp @@ -175,7 +175,7 @@ void negativeExponentialScaler::mullinsEffectScaling(double _psi0, double _psi, // Msg::Error(" Inside mullinsEffectScaling, _psi = %e, _psi_max = %e !!", _psi, _psi_max); double Dpsi_maxDpsi_cap = 1.; // Dpsi_maxDpsi_cap = 1. if _psi_max = _psi - double Term = sqrt(_m*(_psi_max-eta*psi_cap)); // Term = 0. if _psi_max = _psi + double Term = sqrt(m*(_psi_max-eta*psi_cap)); // Term = 0. if _psi_max = _psi if (Term!=0){ @@ -183,11 +183,11 @@ void negativeExponentialScaler::mullinsEffectScaling(double _psi0, double _psi, int maxite = 100; double _tol = 1e-8; double DfDeta(0.), Deta(0.); - double f = eta + _r*(1-exp(-Term)) - 1.; + double f = eta + r*(1-exp(-Term)) - 1.; while (fabs(f) >_tol or ite <1){ - DfDeta = 1 + _r*(-_m*psi_cap*exp(-Term)/(2*Term)); + DfDeta = 1 + r*(-m*psi_cap*exp(-Term)/(2*Term)); Deta = - f/DfDeta; if (eta + Deta > 1.){ @@ -199,8 +199,8 @@ void negativeExponentialScaler::mullinsEffectScaling(double _psi0, double _psi, // eta += Deta; // Msg::Error(" Inside iterator, ite = %d, f = %e, DfDeta = %e, Deta = %e, eta = %e !!", ite, f, DfDeta, Deta, eta); - Term = sqrt(_m*(_psi_max-eta*psi_cap)); - f = eta + _r*(1-exp(-Term)) - 1.; + Term = sqrt(m*(_psi_max-eta*psi_cap)); + f = eta + r*(1-exp(-Term)) - 1.; ite++; if (fabs(f) <_tol) break; @@ -214,7 +214,7 @@ void negativeExponentialScaler::mullinsEffectScaling(double _psi0, double _psi, Dpsi_maxDpsi_cap = 0.; - DetaDpsi_cap = (-_r*_m*exp(-Term)/(2*Term)) * (Dpsi_maxDpsi_cap - eta) / (1 - _r*_m*exp(-Term)/(2*Term)*psi_cap); + DetaDpsi_cap = (-r*m*exp(-Term)/(2*Term)) * (Dpsi_maxDpsi_cap - eta) / (1 - r*m*exp(-Term)/(2*Term)*psi_cap); } else{ eta = 1.; @@ -301,6 +301,7 @@ void hyperbolicScaler::mullinsEffectScaling(double _psi0, double _psi, const IPM double psi_cap = _psi; double eta = 1., DetaDpsi_cap = 0., DDetaDpsipsi = 0., DetaDT = 0., DDetaDTT = 0.; double DpsiNew_DpsiMax(0.), DDpsiNew_DpsiMaxDpsi(0.), DDpsiNew_DpsiMaxDT(0.); + double Dpsi_max_Dpsi_cap(0.); double _psi_max = std::max(_psi,_psi_max0); // Msg::Error(" Inside mullinsEffectScaling, _psi = %e, _psi_max = %e !!", _psi, _psi_max); @@ -310,13 +311,13 @@ void hyperbolicScaler::mullinsEffectScaling(double _psi0, double _psi, const IPM eta = (1-_r)/(1-_r*psi_cap/_psi_max); // derivatives - double Dpsi_max_Dpsi_cap(0.); if (psi_cap >= _psi_max) Dpsi_max_Dpsi_cap = 1.; DetaDpsi_cap = -pow(eta,2)/(1-_r) * (-_r/_psi_max + _r*psi_cap/pow(_psi_max,2)*Dpsi_max_Dpsi_cap); } ipv.set(eta,DetaDpsi_cap,DDetaDpsipsi,DetaDT,DDetaDTT,DpsiNew_DpsiMax, DDpsiNew_DpsiMaxDpsi, DDpsiNew_DpsiMaxDT); ipv.setPsiMax(_psi_max); + ipv.setDpsiMax_Dpsi(Dpsi_max_Dpsi_cap); } void hyperbolicScaler::mullinsEffectScaling(double _psi0, double _psi, const IPMullinsEffect &ipvprev, IPMullinsEffect &ipv, const double T, const double& dPsi_capDT) const{ @@ -329,16 +330,16 @@ void hyperbolicScaler::mullinsEffectScaling(double _psi0, double _psi, const IPM double psi_cap = _psi; double eta = 1., DetaDpsi_cap = 0., DDetaDpsipsi = 0., DetaDT = 0., DDetaDTT = 0.; double DpsiNew_DpsiMax(0.), DDpsiNew_DpsiMaxDpsi(0.), DDpsiNew_DpsiMaxDT(0.); + double Dpsi_max_Dpsi_cap(0.), Dpsi_max_DT(0.); double _psi_max = std::max(_psi,_psi_max0); // Msg::Error(" Inside mullinsEffectScaling, _psi = %e, _psi_max = %e !!", _psi, _psi_max); if (_psi_max>0.){ // eta - eta = (1-_r)/(1-_r*psi_cap/_psi_max); + eta = (1-r)/(1-r*psi_cap/_psi_max); // derivatives - double Dpsi_max_Dpsi_cap(0.), Dpsi_max_DT(0.); if (psi_cap >= _psi_max){ Dpsi_max_Dpsi_cap = 1.; Dpsi_max_DT = dPsi_capDT; @@ -349,6 +350,7 @@ void hyperbolicScaler::mullinsEffectScaling(double _psi0, double _psi, const IPM ipv.set(eta,DetaDpsi_cap,DDetaDpsipsi,DetaDT,DDetaDTT,DpsiNew_DpsiMax, DDpsiNew_DpsiMaxDpsi, DDpsiNew_DpsiMaxDT); ipv.setPsiMax(_psi_max); + ipv.setDpsiMax_Dpsi(Dpsi_max_Dpsi_cap); } mullinsEffect *hyperbolicScaler::clone() const @@ -416,6 +418,7 @@ void linearScaler::mullinsEffectScaling(double _psi0, double _psi, const IPMulli double psi_cap = _psi; double eta = 1., DetaDpsi_cap = 0., DDetaDpsipsi = 0., DetaDT = 0., DDetaDTT = 0.; double DpsiNew_DpsiMax(0.), DDpsiNew_DpsiMaxDpsi(0.), DDpsiNew_DpsiMaxDT(0.); + double Dpsi_max_Dpsi_cap(0.); double _psi_max = std::max(_psi,_psi_max0); // Msg::Error(" Inside mullinsEffectScaling, _psi = %e, _psi_max = %e !!", _psi, _psi_max); @@ -425,7 +428,6 @@ void linearScaler::mullinsEffectScaling(double _psi0, double _psi, const IPMulli eta = (1-_r*(1-psi_cap/_psi_max)); // derivatives - double Dpsi_max_Dpsi_cap(0.); if (psi_cap >= _psi_max) Dpsi_max_Dpsi_cap = 1.; DetaDpsi_cap = _r/_psi_max + _r*psi_cap/pow(_psi_max,2) * (-Dpsi_max_Dpsi_cap); @@ -437,6 +439,7 @@ void linearScaler::mullinsEffectScaling(double _psi0, double _psi, const IPMulli ipv.set(eta,DetaDpsi_cap,DDetaDpsipsi,DetaDT,DDetaDTT,DpsiNew_DpsiMax, DDpsiNew_DpsiMaxDpsi, DDpsiNew_DpsiMaxDT); ipv.setPsiMax(_psi_max); + ipv.setDpsiMax_Dpsi(Dpsi_max_Dpsi_cap); } void linearScaler::mullinsEffectScaling(double _psi0, double _psi, const IPMullinsEffect &ipvprev, IPMullinsEffect &ipv, const double T, const double& dPsi_capDT) const{ @@ -449,32 +452,33 @@ void linearScaler::mullinsEffectScaling(double _psi0, double _psi, const IPMulli double psi_cap = _psi; double eta = 1., DetaDpsi_cap = 0., DDetaDpsipsi = 0., DetaDT = 0., DDetaDTT = 0.; double DpsiNew_DpsiMax(0.), DDpsiNew_DpsiMaxDpsi(0.), DDpsiNew_DpsiMaxDT(0.); + double Dpsi_max_Dpsi_cap(0.), Dpsi_max_DT(0.); double _psi_max = std::max(_psi,_psi_max0); // Msg::Error(" Inside mullinsEffectScaling, _psi = %e, _psi_max = %e !!", _psi, _psi_max); if (_psi_max>0.){ // eta - eta = (1-_r*(1-psi_cap/_psi_max)); + eta = (1-r*(1-psi_cap/_psi_max)); // derivatives - double Dpsi_max_Dpsi_cap(0.), Dpsi_max_DT(0.); if (psi_cap >= _psi_max){ Dpsi_max_Dpsi_cap = 1.; Dpsi_max_DT = dPsi_capDT; } DetaDpsi_cap = r/_psi_max + r*psi_cap/pow(_psi_max,2) * (-Dpsi_max_Dpsi_cap); - DetaDT = -drdT*(1.-psi_cap/_psi_max) + r*(dPsi_capDT*1/_psi_max - psi_cap/pow(_psi_max,2)*Dpsi_max_DT); + DetaDT = -drdT*(1.-psi_cap/_psi_max) + r*(dPsi_capDT*1/_psi_max - psi_cap/pow(_psi_max,2)*Dpsi_max_DT); double DetaDpsi_max = -r*psi_cap/pow(_psi_max,2); DpsiNew_DpsiMax = -r*pow(psi_cap,2)/(2.*pow(_psi_max,2)); - DDpsiNew_DpsiMaxDpsi = DetaDpsi_max; - DDpsiNew_DpsiMaxDT = -drdT*(pow(psi_cap,2)/(2.*pow(_psi_max,2))) - r*psi_cap/pow(_psi_max,2)*dPsi_capDT + r*pow(psi_cap,2)/pow(_psi_max,3)*Dpsi_max_DT; + DDpsiNew_DpsiMaxDpsi = DetaDpsi_max + r*pow(psi_cap,2)/pow(_psi_max,3)*Dpsi_max_Dpsi_cap; + DDpsiNew_DpsiMaxDT = DDpsiNew_DpsiMaxDpsi*dPsi_capDT - drdT*(pow(psi_cap,2)/(2.*pow(_psi_max,2))); } ipv.set(eta,DetaDpsi_cap,DDetaDpsipsi,DetaDT,DDetaDTT,DpsiNew_DpsiMax, DDpsiNew_DpsiMaxDpsi, DDpsiNew_DpsiMaxDT); ipv.setPsiMax(_psi_max); + ipv.setDpsiMax_Dpsi(Dpsi_max_Dpsi_cap); } mullinsEffect *linearScaler::clone() const @@ -635,7 +639,7 @@ void positiveExponentialScaler::mullinsEffectScaling(double _psi0, double _psi, // Msg::Error(" Inside mullinsEffectScaling, _psi = %e, _psi_max = %e !!", _psi, _psi_max); double Dpsi_maxDpsi_cap = 1.; // Dpsi_maxDpsi_cap = 1. if _psi_max = _psi - double Term = sqrt(_m*(_psi_max-eta*psi_cap)); // Term = 0. if _psi_max = _psi + double Term = sqrt(m*(_psi_max-eta*psi_cap)); // Term = 0. if _psi_max = _psi if (Term!=0){ @@ -643,11 +647,11 @@ void positiveExponentialScaler::mullinsEffectScaling(double _psi0, double _psi, int maxite = 100; double _tol = 1e-8; double DfDeta(0.), Deta(0.); - double f = eta + _r*(1-exp(-Term)) - 1.; + double f = eta + r*(1-exp(-Term)) - 1.; while (fabs(f) >_tol or ite <1){ - DfDeta = 1 + _r*(-_m*psi_cap*exp(-Term)/(2*Term)); + DfDeta = 1 + r*(-m*psi_cap*exp(-Term)/(2*Term)); Deta = - f/DfDeta; if (eta + Deta > 1.){ @@ -658,8 +662,8 @@ void positiveExponentialScaler::mullinsEffectScaling(double _psi0, double _psi, // Msg::Error(" Inside iterator, ite = %d, f = %e, DfDeta = %e, Deta = %e, eta = %e !!", ite, f, DfDeta, Deta, eta); - Term = sqrt(_m*(_psi_max-eta*psi_cap)); - f = eta + _r*(1-exp(-Term)) - 1.; + Term = sqrt(m*(_psi_max-eta*psi_cap)); + f = eta + r*(1-exp(-Term)) - 1.; ite++; if (fabs(f) <_tol) break; @@ -673,7 +677,7 @@ void positiveExponentialScaler::mullinsEffectScaling(double _psi0, double _psi, // eta = 1+_r*(1-exp(_m*(1 - psi_cap/_psi_max))); Dpsi_maxDpsi_cap = 0.; - DetaDpsi_cap = (-_r*_m*exp(-Term)/(2*Term)) * (Dpsi_maxDpsi_cap - eta) / (1 - _r*_m*exp(-Term)/(2*Term)*psi_cap); + DetaDpsi_cap = (-r*m*exp(-Term)/(2*Term)) * (Dpsi_maxDpsi_cap - eta) / (1 - r*m*exp(-Term)/(2*Term)*psi_cap); } else{ eta = 1.; @@ -689,4 +693,4 @@ mullinsEffect *positiveExponentialScaler::clone() const return new positiveExponentialScaler(*this); } -// ############# \ No newline at end of file +// ############# diff --git a/dG3D/benchmarks/hyperViscoElastic/cylinder.py b/dG3D/benchmarks/hyperViscoElastic/cylinder.py index 6d1fccd8a7e6d81e17831a3cd632af3079520e7a..4e3857f76f3051b66878f79f5b1b92002bab09d8 100644 --- a/dG3D/benchmarks/hyperViscoElastic/cylinder.py +++ b/dG3D/benchmarks/hyperViscoElastic/cylinder.py @@ -18,11 +18,11 @@ rho = 7850e-9 # Bulk mass law1 = HyperViscoElasticDG3DMaterialLaw(lawnum,rho, E,nu) -law1.setStrainOrder(11) # approx log exp opertor -law1.setViscoelasticMethod(1) # 0- maxwell, 1- Kevin-voigt +law1.setStrainOrder(-1) # approx log exp opertor +law1.setViscoelasticMethod(0) # 0- maxwell, 1- Kevin-voigt N = 4; # number of branch -law1.setViscoElasticNumberOfElement(N) # +law1.setViscoElasticNumberOfElement(N) # law1.setViscoElasticData(1,100,10) law1.setViscoElasticData(2,100,5) law1.setViscoElasticData(3,100,1) @@ -43,9 +43,9 @@ myfield1.stabilityParameters(beta1) # solver sol = 2 # Gmm=0 (default) Taucs=1 PETsc=2 soltype =1 # StaticLinear=0 (default) StaticNonLinear=1 -nstep = 50 # number of step (used only if soltype=1) -ftime = 1. # Final time (used only if soltype=1) -tol=1.e-10 # relative tolerance for NR scheme (used only if soltype=1) +nstep = 100 # number of step (used only if soltype=1) +ftime = 12*2/1.e-2 # Final time (used only if soltype=1) +tol=1.e-7 # relative tolerance for NR scheme (used only if soltype=1) nstepArch=1 # Number of step between 2 archiving (used only if soltype=1) @@ -71,7 +71,11 @@ fu.put(0.4*ftime,umax) fu.put(0.7*ftime,-0.1*umax) fu.put(ftime,umax) -mysolver.displacementBC('Face',2,2,fu) +fu_L = PiecewiseLinearFunction() +fu_L.put(0,0) +fu_L.put(ftime,12*2) + +mysolver.displacementBC('Face',2,2,fu_L) # build view mysolver.internalPointBuildView("Strain_xx",IPField.STRAIN_XX, 1, 1); @@ -110,4 +114,3 @@ mysolver.solve() check = TestCheck() check.equal(2.346497e+01,mysolver.getArchivedForceOnPhysicalGroup("Face", 1, 2),1.e-3) - diff --git a/dG3D/benchmarks/nonLinearTVP_allExtraBranches_cube/TPU_relaxationSpectrum_Et_N64_28_03_24_Trefm30.txt b/dG3D/benchmarks/nonLinearTVP_allExtraBranches_cube/TPU_relaxationSpectrum_Et_N64_28_03_24_Trefm30.txt new file mode 100644 index 0000000000000000000000000000000000000000..d4accf6574d6d3d2dc931deb6eb7c1f1da212709 --- /dev/null +++ b/dG3D/benchmarks/nonLinearTVP_allExtraBranches_cube/TPU_relaxationSpectrum_Et_N64_28_03_24_Trefm30.txt @@ -0,0 +1,129 @@ +1.625007916375748813e+07 +1.000000000000000000e+09 +1.283978418874915987e+08 +1.223717869196788222e+08 +1.181005705711700767e+08 +1.089380579688416123e+08 +1.031232320638373345e+08 +9.922607590394645929e+07 +9.729797632821390033e+07 +9.665399292950335145e+07 +9.642740849198748171e+07 +9.564441566156442463e+07 +9.315953031193923950e+07 +8.833409580494977534e+07 +8.111496619828665257e+07 +7.296521446255537868e+07 +6.497025556169453263e+07 +5.764062135514917225e+07 +5.184229060733832419e+07 +4.753783082364760339e+07 +4.481067484846460819e+07 +4.416358270341629535e+07 +4.536899884176179767e+07 +5.064046090451937169e+07 +6.174407825567868352e+07 +8.147240035397948325e+07 +1.117819095519595891e+08 +1.438796963477450311e+08 +1.670027986239266098e+08 +1.742009136088265181e+08 +1.639430935898946822e+08 +1.434145951149095595e+08 +1.191703702685215026e+08 +9.520917302248769999e+07 +7.433779650344344974e+07 +5.728844982043570280e+07 +4.400571735897961259e+07 +3.399161600600884110e+07 +2.654683819484577700e+07 +2.110234496821391210e+07 +1.710013009479070827e+07 +1.414172178642180189e+07 +1.193027334877739102e+07 +1.016771323258111253e+07 +8.779543124922089279e+06 +7.745365369133623317e+06 +6.840953185689423233e+06 +5.994072543483622372e+06 +5.321047145454889163e+06 +4.731067289288544096e+06 +4.239008481816987507e+06 +3.858405493953337893e+06 +3.490876921252443455e+06 +3.200590970116929617e+06 +2.997600436458109878e+06 +2.813855739644110203e+06 +2.683142899888558779e+06 +2.590574290467962623e+06 +2.490485693044999614e+06 +2.380686491815341637e+06 +2.285846273252721876e+06 +2.218988508806935977e+06 +2.068374527020663023e+06 +1.940737277603511000e+06 +2.847223143023391720e+06 +1.000000000000000056e-32 +1.000000000000000083e-31 +1.000000000000000083e-30 +9.999999999999999432e-30 +9.999999999999999712e-29 +1.000000000000000038e-27 +1.000000000000000038e-26 +1.000000000000000038e-25 +9.999999999999999237e-25 +9.999999999999999604e-24 +1.000000000000000049e-22 +9.999999999999999075e-22 +9.999999999999999452e-21 +9.999999999999999752e-20 +1.000000000000000072e-18 +1.000000000000000072e-17 +9.999999999999999791e-17 +1.000000000000000078e-15 +9.999999999999999988e-15 +1.000000000000000030e-13 +9.999999999999999799e-13 +9.999999999999999395e-12 +1.000000000000000036e-10 +1.000000000000000062e-09 +1.000000000000000021e-08 +9.999999999999999547e-08 +9.999999999999999547e-07 +1.000000000000000082e-05 +1.000000000000000048e-04 +1.000000000000000021e-03 +1.000000000000000021e-02 +1.000000000000000056e-01 +1.000000000000000000e+00 +1.000000000000000000e+01 +1.000000000000000000e+02 +1.000000000000000000e+03 +1.000000000000000000e+04 +1.000000000000000000e+05 +1.000000000000000000e+06 +1.000000000000000000e+07 +1.000000000000000000e+08 +1.000000000000000000e+09 +1.000000000000000000e+10 +1.000000000000000000e+11 +1.000000000000000000e+12 +1.000000000000000000e+13 +1.000000000000000000e+14 +1.000000000000000000e+15 +1.000000000000000000e+16 +1.000000000000000000e+17 +1.000000000000000000e+18 +1.000000000000000000e+19 +1.000000000000000000e+20 +1.000000000000000000e+21 +1.000000000000000000e+22 +1.000000000000000084e+23 +9.999999999999999832e+23 +1.000000000000000091e+25 +1.000000000000000048e+26 +1.000000000000000013e+27 +9.999999999999999583e+27 +9.999999999999999143e+28 +1.000000000000000020e+30 +9.999999999999999636e+30 diff --git a/dG3D/benchmarks/nonLinearTVP_allExtraBranches_cube/cubeTVP.py b/dG3D/benchmarks/nonLinearTVP_allExtraBranches_cube/cubeTVP.py index caf8ca522facba0151c80366d46a80b4b754d112..4dd43edd0d721ba0766191d0b4a42b1c0fa9e7f0 100644 --- a/dG3D/benchmarks/nonLinearTVP_allExtraBranches_cube/cubeTVP.py +++ b/dG3D/benchmarks/nonLinearTVP_allExtraBranches_cube/cubeTVP.py @@ -9,7 +9,8 @@ import numpy as np import os # Load the csv data for relaxation spectrum -with open('relaxationSpectrum_Einf_N27_05_12_23_Tref20.csv', newline='') as csvfile: +# with open('relaxationSpectrum_Einf_N27_05_12_23_Tref20.csv', newline='') as csvfile: +with open('../TPU_relaxationSpectrum_Et_N64_28_03_24_Trefm30.txt', newline='') as csvfile: reader = csv.reader(csvfile, delimiter=';') relSpec = np.zeros((1,)) i = 0 @@ -35,12 +36,13 @@ Cp = rho*1900e+6 # 1900 J/kg/K -> 1900e+6 Nmm/tonne/K KThCon = 0.14 # 0.14 W/m/K -> 0.14 Nmm/s/mm/K Alpha = 0.6e-6 # 1/K -Tinitial = 273.15 - 10 # K -C1 = 112.94742152 -C2 = 176.44294359 +Tinitial = 273.15 + 23 # - 10 # K +C1 = 524.39721767 # 112.94742152 +C2 = 699.76815543 # 176.44294359 # Temp Settings -Tref = 273.15+20. +Tref = 273.15-30. +# Tref = 273.15+20. # Default tempfuncs Alpha_G = 0.2e-6 @@ -61,13 +63,22 @@ a = -0.9/(90.) x0 = 273.15-20 linear_tempfunc = linearScalarFunction(x0,0.9,a) +""" sy0c = 20./0.78 #MPa hc = 10. sy0t = sy0c*0.78 ht = 10. - hardenc = LinearExponentialJ2IsotropicHardening(1, sy0c, hc, 2., 10.) hardent = LinearExponentialJ2IsotropicHardening(2, sy0t, ht, 2., 10.) +""" +m = 1.0 +sy0c = 3.5/m #MPa +hc = 0. +sy0t = sy0c*m +ht = 0. +hardenc = LinearExponentialJ2IsotropicHardening(1, sy0c, hc, 5., 20.) +hardent = LinearExponentialJ2IsotropicHardening(2, sy0t, ht, 5., 20.) + # hardenc.setTemperatureFunction_h1(negExp_tempfunc) # hardenc.setTemperatureFunction_h2(negExp_tempfunc) # hardenc.setTemperatureFunction_hexp(ShiftFactor_tempfunc) @@ -75,33 +86,47 @@ hardent = LinearExponentialJ2IsotropicHardening(2, sy0t, ht, 2., 10.) # hardent.setTemperatureFunction_h2(negExp_tempfunc) # hardent.setTemperatureFunction_hexp(ShiftFactor_tempfunc) +hardenk = PolynomialKinematicHardening(3,3) # 1 -> PP +hardenk.setCoefficients(1,0.5) # 300.) +hardenk.setCoefficients(2,1.) # 200.) +hardenk.setCoefficients(3,2.5) + law1 = NonLinearTVENonLinearTVPDG3DMaterialLaw(lawnum,rho,E,nu,1e-6,Tinitial,Alpha,KThCon,Cp,False,1e-8) law1.setCompressionHardening(hardenc) law1.setTractionHardening(hardent) +law1.setTractionHardening(hardenk) -law1.setYieldPowerFactor(3.5) +law1.setYieldPowerFactor(3) # 3.5) law1.setNonAssociatedFlow(True) -law1.nonAssociatedFlowRuleFactor(0.5) +law1.nonAssociatedFlowRuleFactor(0.64) # 0.5 law1.setStrainOrder(11) law1.setViscoelasticMethod(0) law1.setShiftFactorConstantsWLF(C1,C2) law1.setReferenceTemperature(Tref) -law1.setExtraBranchNLType(3) +law1.setExtraBranchNLType(5) # 3 law1.useExtraBranchBool(True) -law1.useExtraBranchBool_TVE(True,2) -law1.setVolumeCorrection(1.48385807e-02, 4.86512658e+00, 2.03662889e-04, 5.47347064e-02, 6.57278720e+00, 2.77066402e-03) +law1.useExtraBranchBool_TVE(True,5) # 5 +# law1.setVolumeCorrection(1.48385807e-02, 4.86512658e+00, 2.03662889e-04, 5.47347064e-02, 6.57278720e+00, 2.77066402e-03) +law1.setVolumeCorrection(1., 2000., 1.686, 1., 200., 1.686) # at 23°C -> TPU +law1.setAdditionalVolumeCorrections(0.22,0.,0.,0.22,0.,0.) +law1.setExtraBranch_CompressionParameter(1.,0.,0.) # 1.5 +law1.setTensionCompressionRegularisation(1000.) + law1.setViscoElasticNumberOfElement(N) if N > 0: for i in range(1, N+1): law1.setViscoElasticData(i, relSpec[i], relSpec[i+N]) + law1.setCorrectionsAllBranchesTVE(i, 2000., 1.686, 200., 1.686) # at 23°C -> TPU + law1.setAdditionalCorrectionsAllBranchesTVE(i,0.22,0.,0.,0.22,0.,0.) + law1.setCompressionCorrectionsAllBranchesTVE(i, 1.) # 1.5) law1.setTemperatureFunction_ThermalDilationCoefficient(Alpha_tempfunc) law1.setTemperatureFunction_ThermalConductivity(KThCon_tempfunc) -eta = constantViscosityLaw(1,3e4) #(1,3e4) -law1.setViscosityEffect(eta,0.21) +eta = constantViscosityLaw(1,1000.) #(1,3e4) +law1.setViscosityEffect(eta,0.1) # eta.setTemperatureFunction(negExp_tempfunc) law1.setIsotropicHardeningCoefficients(1.,1.,1.) @@ -109,8 +134,8 @@ law1.setIsotropicHardeningCoefficients(1.,1.,1.) # 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 = 4. # Final time (used only if soltype=1) +nstep = 1000 # 100 # number of step (used only if soltype=1) +ftime = 0.65/2.78e-3 # 4. # 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) fullDg = 0 #O = CG, 1 = DG @@ -146,7 +171,7 @@ mysolver.stepBetweenArchiving(nstepArch) # BCs length = 1.e-3 -umax = 0.04*length +umax = -0.65*length # 0.04*length fu_L = LinearFunctionTime(0,0,ftime,umax); # Linear Displacement with time mysolver.displacementBC("Face",30,0,0.) # face x = 0 - Left Face fixed @@ -192,4 +217,5 @@ mysolver.solve() # Check check = TestCheck() -check.equal(-2.917493481719865e-05,mysolver.getArchivedForceOnPhysicalGroup("Face", 30, 0),1.e-4) +# check.equal(-2.917493481719865e-05,mysolver.getArchivedForceOnPhysicalGroup("Face", 30, 0),1.e-4) +check.equal(-2.911073148114768e-05,mysolver.getArchivedForceOnPhysicalGroup("Face", 30, 0),1.e-4) diff --git a/dG3D/benchmarks/powerYieldViscoElastoPlastic/cylinder.msh b/dG3D/benchmarks/powerYieldViscoElastoPlastic/cylinder.msh index 0f52bfc5a294857b8f304b1da6e258fb7505d374..915802d5a64acb84a2dad6e7d15e69c98b26c778 100644 --- a/dG3D/benchmarks/powerYieldViscoElastoPlastic/cylinder.msh +++ b/dG3D/benchmarks/powerYieldViscoElastoPlastic/cylinder.msh @@ -1,698 +1,762 @@ $MeshFormat -2.2 0 8 +3 0 8 $EndMeshFormat +$Entities +6 9 5 1 +1 0 +2 0 +3 0 +4 0 +5 1 5 +6 0 +1 2 3 2 0 +2 2 3 1 0 +3 2 1 2 0 +7 2 4 6 0 +8 2 6 5 0 +9 2 5 4 0 +11 2 3 4 0 +12 2 2 6 0 +16 2 1 5 0 +5 3 1 -3 -2 1 1 +13 4 1 12 -7 -11 0 +17 4 -3 16 -8 -12 1 3 +21 4 -2 11 -9 -16 1 4 +22 3 7 8 9 1 2 +1 5 -5 22 13 -17 -21 1 11 +$EndEntities $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 +138 +1 0 0 0 0 +2 6 0 0 0 +3 0 6 0 0 +4 0 6 6 0 +5 0 0 6 0 +6 6 0 6 0 +7 1.552914274817992 5.795554956608255 0 0 +8 3.000000007764873 5.19615241822358 0 0 +9 4.24264069709897 4.242640677139599 0 0 +10 5.196152427581315 2.999999991556801 0 0 +11 5.795554958944408 1.552914266099346 0 0 +12 0 4.500000000005166 0 0 +13 0 3.000000000008336 0 0 +14 0 1.500000000004214 0 0 +15 1.499999999993832 0 0 0 +16 2.999999999988567 0 0 0 +17 4.499999999994237 0 0 0 +18 1.552914274817992 5.795554956608255 6 0 +19 3.000000007764873 5.19615241822358 6 0 +20 4.24264069709897 4.242640677139599 6 0 +21 5.196152427581315 2.999999991556801 6 0 +22 5.795554958944408 1.552914266099346 6 0 +23 4.499999999994237 0 6 0 +24 2.999999999988567 0 6 0 +25 1.499999999993832 0 6 0 +26 0 1.500000000004214 6 0 +27 0 3.000000000008336 6 0 +28 0 4.500000000005166 6 0 +29 0 6 1.2 0 +30 0 6 2.4 0 +31 0 6 3.6 0 +32 0 6 4.800000000000001 0 +33 6 0 1.2 0 +34 6 0 2.4 0 +35 6 0 3.6 0 +36 6 0 4.800000000000001 0 +37 0 0 1.2 0 +38 0 0 2.4 0 +39 0 0 3.6 0 +40 0 0 4.800000000000001 0 +41 1.2751455569532 2.281385761327586 0 0 +42 3.662835601102697 2.682832773324031 0 0 +43 1.627029380077184 4.128240815140635 0 0 +44 3.638826376124202 1.177882403829226 0 0 +45 2.350310484823683 1.407389902703416 0 0 +46 2.352198961932545 3.033848287512865 0 0 +47 1.098076211355039 1.098076211357821 0 0 +48 3.002832333019222 3.89702302606582 0 0 +49 4.558673872749371 1.682725886961881 0 0 +50 1.552914274817992 5.795554956608255 1.2 0 +51 1.552914274817992 5.795554956608255 2.4 0 +52 1.552914274817992 5.795554956608255 3.6 0 +53 1.552914274817992 5.795554956608255 4.800000000000001 0 +54 3.000000007764873 5.19615241822358 1.2 0 +55 3.000000007764873 5.19615241822358 2.4 0 +56 3.000000007764873 5.19615241822358 3.6 0 +57 3.000000007764873 5.19615241822358 4.800000000000001 0 +58 4.24264069709897 4.242640677139599 1.2 0 +59 4.24264069709897 4.242640677139599 2.4 0 +60 4.24264069709897 4.242640677139599 3.6 0 +61 4.24264069709897 4.242640677139599 4.800000000000001 0 +62 5.196152427581315 2.999999991556801 1.2 0 +63 5.196152427581315 2.999999991556801 2.4 0 +64 5.196152427581315 2.999999991556801 3.6 0 +65 5.196152427581315 2.999999991556801 4.800000000000001 0 +66 5.795554958944408 1.552914266099346 1.2 0 +67 5.795554958944408 1.552914266099346 2.4 0 +68 5.795554958944408 1.552914266099346 3.6 0 +69 5.795554958944408 1.552914266099346 4.800000000000001 0 +70 1.499999999993832 0 1.2 0 +71 1.499999999993832 0 2.4 0 +72 1.499999999993832 0 3.6 0 +73 1.499999999993832 0 4.800000000000001 0 +74 2.999999999988567 0 1.2 0 +75 2.999999999988567 0 2.4 0 +76 2.999999999988567 0 3.6 0 +77 2.999999999988567 0 4.800000000000001 0 +78 4.499999999994237 0 1.2 0 +79 4.499999999994237 0 2.4 0 +80 4.499999999994237 0 3.6 0 +81 4.499999999994237 0 4.800000000000001 0 +82 0 4.500000000005166 1.2 0 +83 0 4.500000000005166 2.4 0 +84 0 4.500000000005166 3.6 0 +85 0 4.500000000005166 4.800000000000001 0 +86 0 3.000000000008336 1.2 0 +87 0 3.000000000008336 2.4 0 +88 0 3.000000000008336 3.6 0 +89 0 3.000000000008336 4.800000000000001 0 +90 0 1.500000000004214 1.2 0 +91 0 1.500000000004214 2.4 0 +92 0 1.500000000004214 3.6 0 +93 0 1.500000000004214 4.800000000000001 0 +94 1.2751455569532 2.281385761327586 6 0 +95 3.662835601102697 2.682832773324031 6 0 +96 1.627029380077184 4.128240815140635 6 0 +97 3.638826376124202 1.177882403829226 6 0 +98 2.350310484823683 1.407389902703416 6 0 +99 2.352198961932545 3.033848287512865 6 0 +100 1.098076211355039 1.098076211357821 6 0 +101 3.002832333019222 3.89702302606582 6 0 +102 4.558673872749371 1.682725886961881 6 0 +103 1.2751455569532 2.281385761327586 1.2 0 +104 1.2751455569532 2.281385761327586 2.4 0 +105 1.2751455569532 2.281385761327586 3.6 0 +106 1.2751455569532 2.281385761327586 4.800000000000001 0 +107 3.662835601102697 2.682832773324031 1.2 0 +108 3.662835601102697 2.682832773324031 2.4 0 +109 3.662835601102697 2.682832773324031 3.6 0 +110 3.662835601102697 2.682832773324031 4.800000000000001 0 +111 1.627029380077184 4.128240815140635 1.2 0 +112 1.627029380077184 4.128240815140635 2.4 0 +113 1.627029380077184 4.128240815140635 3.6 0 +114 1.627029380077184 4.128240815140635 4.800000000000001 0 +115 3.638826376124202 1.177882403829226 1.2 0 +116 3.638826376124202 1.177882403829226 2.4 0 +117 3.638826376124202 1.177882403829226 3.6 0 +118 3.638826376124202 1.177882403829226 4.800000000000001 0 +119 2.350310484823683 1.407389902703416 1.2 0 +120 2.350310484823683 1.407389902703416 2.4 0 +121 2.350310484823683 1.407389902703416 3.6 0 +122 2.350310484823683 1.407389902703416 4.800000000000001 0 +123 2.352198961932545 3.033848287512865 1.2 0 +124 2.352198961932545 3.033848287512865 2.4 0 +125 2.352198961932545 3.033848287512865 3.6 0 +126 2.352198961932545 3.033848287512865 4.800000000000001 0 +127 1.098076211355039 1.098076211357821 1.2 0 +128 1.098076211355039 1.098076211357821 2.4 0 +129 1.098076211355039 1.098076211357821 3.6 0 +130 1.098076211355039 1.098076211357821 4.800000000000001 0 +131 3.002832333019222 3.89702302606582 1.2 0 +132 3.002832333019222 3.89702302606582 2.4 0 +133 3.002832333019222 3.89702302606582 3.6 0 +134 3.002832333019222 3.89702302606582 4.800000000000001 0 +135 4.558673872749371 1.682725886961881 1.2 0 +136 4.558673872749371 1.682725886961881 2.4 0 +137 4.558673872749371 1.682725886961881 3.6 0 +138 4.558673872749371 1.682725886961881 4.800000000000001 0 $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 +591 +142 4 1 4 13 41 43 111 +143 4 1 4 103 86 111 13 +144 4 1 4 103 13 111 41 +145 4 1 4 86 103 111 112 +146 4 1 4 104 87 112 86 +147 4 1 4 104 86 112 103 +148 4 1 4 87 104 112 113 +149 4 1 4 105 88 113 87 +150 4 1 4 105 87 113 104 +151 4 1 4 88 105 113 114 +152 4 1 4 106 89 114 88 +153 4 1 4 106 88 114 105 +154 4 1 4 89 106 114 96 +155 4 1 4 94 27 96 89 +156 4 1 4 94 89 96 106 +157 4 1 4 7 12 43 111 +158 4 1 4 82 50 111 7 +159 4 1 4 82 7 111 12 +160 4 1 4 50 82 111 112 +161 4 1 4 83 51 112 50 +162 4 1 4 83 50 112 82 +163 4 1 4 51 83 112 113 +164 4 1 4 84 52 113 51 +165 4 1 4 84 51 113 83 +166 4 1 4 52 84 113 114 +167 4 1 4 85 53 114 52 +168 4 1 4 85 52 114 84 +169 4 1 4 53 85 114 96 +170 4 1 4 28 18 96 53 +171 4 1 4 28 53 96 85 +172 4 1 4 17 11 49 135 +173 4 1 4 66 78 135 17 +174 4 1 4 66 17 135 11 +175 4 1 4 78 66 135 136 +176 4 1 4 67 79 136 78 +177 4 1 4 67 78 136 66 +178 4 1 4 79 67 136 137 +179 4 1 4 68 80 137 79 +180 4 1 4 68 79 137 67 +181 4 1 4 80 68 137 138 +182 4 1 4 69 81 138 80 +183 4 1 4 69 80 138 68 +184 4 1 4 81 69 138 102 +185 4 1 4 22 23 102 81 +186 4 1 4 22 81 102 69 +187 4 1 4 45 42 46 123 +188 4 1 4 107 119 123 45 +189 4 1 4 107 45 123 42 +190 4 1 4 119 107 123 124 +191 4 1 4 108 120 124 119 +192 4 1 4 108 119 124 107 +193 4 1 4 120 108 124 125 +194 4 1 4 109 121 125 120 +195 4 1 4 109 120 125 108 +196 4 1 4 121 109 125 126 +197 4 1 4 110 122 126 121 +198 4 1 4 110 121 126 109 +199 4 1 4 122 110 126 99 +200 4 1 4 95 98 99 122 +201 4 1 4 95 122 99 110 +202 4 1 4 12 13 43 111 +203 4 1 4 86 82 111 12 +204 4 1 4 86 12 111 13 +205 4 1 4 82 86 111 112 +206 4 1 4 87 83 112 82 +207 4 1 4 87 82 112 86 +208 4 1 4 83 87 112 113 +209 4 1 4 88 84 113 83 +210 4 1 4 88 83 113 87 +211 4 1 4 84 88 113 114 +212 4 1 4 89 85 114 84 +213 4 1 4 89 84 114 88 +214 4 1 4 85 89 114 96 +215 4 1 4 27 28 96 85 +216 4 1 4 27 85 96 89 +217 4 1 4 7 3 12 82 +218 4 1 4 29 50 82 7 +219 4 1 4 29 7 82 3 +220 4 1 4 50 29 82 83 +221 4 1 4 30 51 83 50 +222 4 1 4 30 50 83 29 +223 4 1 4 51 30 83 84 +224 4 1 4 31 52 84 51 +225 4 1 4 31 51 84 30 +226 4 1 4 52 31 84 85 +227 4 1 4 32 53 85 52 +228 4 1 4 32 52 85 31 +229 4 1 4 53 32 85 28 +230 4 1 4 4 18 28 53 +231 4 1 4 4 53 28 32 +232 4 1 4 2 11 17 66 +233 4 1 4 66 33 78 2 +234 4 1 4 66 2 78 17 +235 4 1 4 33 66 78 67 +236 4 1 4 67 34 79 33 +237 4 1 4 67 33 79 78 +238 4 1 4 34 67 79 68 +239 4 1 4 68 35 80 34 +240 4 1 4 68 34 80 79 +241 4 1 4 35 68 80 69 +242 4 1 4 69 36 81 35 +243 4 1 4 69 35 81 80 +244 4 1 4 36 69 81 22 +245 4 1 4 22 6 23 36 +246 4 1 4 22 36 23 81 +247 4 1 4 44 42 45 107 +248 4 1 4 107 115 119 44 +249 4 1 4 107 44 119 45 +250 4 1 4 115 107 119 108 +251 4 1 4 108 116 120 115 +252 4 1 4 108 115 120 119 +253 4 1 4 116 108 120 109 +254 4 1 4 109 117 121 116 +255 4 1 4 109 116 121 120 +256 4 1 4 117 109 121 110 +257 4 1 4 110 118 122 117 +258 4 1 4 110 117 122 121 +259 4 1 4 118 110 122 95 +260 4 1 4 95 97 98 118 +261 4 1 4 95 118 98 122 +262 4 1 4 44 17 49 135 +263 4 1 4 78 115 135 44 +264 4 1 4 78 44 135 17 +265 4 1 4 115 78 135 136 +266 4 1 4 79 116 136 115 +267 4 1 4 79 115 136 78 +268 4 1 4 116 79 136 137 +269 4 1 4 80 117 137 116 +270 4 1 4 80 116 137 79 +271 4 1 4 117 80 137 138 +272 4 1 4 81 118 138 117 +273 4 1 4 81 117 138 80 +274 4 1 4 118 81 138 102 +275 4 1 4 23 97 102 118 +276 4 1 4 23 118 102 81 +277 4 1 4 43 41 46 123 +278 4 1 4 103 111 123 41 +279 4 1 4 41 43 111 123 +280 4 1 4 111 103 123 124 +281 4 1 4 104 112 124 103 +282 4 1 4 103 111 112 124 +283 4 1 4 112 104 124 125 +284 4 1 4 105 113 125 104 +285 4 1 4 104 112 113 125 +286 4 1 4 113 105 125 126 +287 4 1 4 106 114 126 105 +288 4 1 4 105 113 114 126 +289 4 1 4 114 106 126 99 +290 4 1 4 94 96 99 106 +291 4 1 4 106 114 96 99 +292 4 1 4 8 7 43 111 +293 4 1 4 50 54 111 8 +294 4 1 4 50 8 111 7 +295 4 1 4 54 50 111 112 +296 4 1 4 51 55 112 54 +297 4 1 4 51 54 112 50 +298 4 1 4 55 51 112 113 +299 4 1 4 52 56 113 55 +300 4 1 4 52 55 113 51 +301 4 1 4 56 52 113 114 +302 4 1 4 53 57 114 56 +303 4 1 4 53 56 114 52 +304 4 1 4 57 53 114 96 +305 4 1 4 18 19 96 57 +306 4 1 4 18 57 96 53 +307 4 1 4 41 45 46 123 +308 4 1 4 119 103 123 41 +309 4 1 4 119 41 123 45 +310 4 1 4 103 119 123 124 +311 4 1 4 120 104 124 103 +312 4 1 4 120 103 124 119 +313 4 1 4 104 120 124 125 +314 4 1 4 121 105 125 104 +315 4 1 4 121 104 125 120 +316 4 1 4 105 121 125 126 +317 4 1 4 122 106 126 105 +318 4 1 4 122 105 126 121 +319 4 1 4 106 122 126 99 +320 4 1 4 98 94 99 106 +321 4 1 4 98 106 99 122 +322 4 1 4 10 9 42 107 +323 4 1 4 58 62 107 10 +324 4 1 4 58 10 107 9 +325 4 1 4 62 58 107 108 +326 4 1 4 59 63 108 62 +327 4 1 4 59 62 108 58 +328 4 1 4 63 59 108 109 +329 4 1 4 60 64 109 63 +330 4 1 4 60 63 109 59 +331 4 1 4 64 60 109 110 +332 4 1 4 61 65 110 64 +333 4 1 4 61 64 110 60 +334 4 1 4 65 61 110 95 +335 4 1 4 20 21 95 65 +336 4 1 4 20 65 95 61 +337 4 1 4 13 14 41 103 +338 4 1 4 90 86 103 13 +339 4 1 4 90 13 103 14 +340 4 1 4 86 90 103 104 +341 4 1 4 91 87 104 86 +342 4 1 4 91 86 104 90 +343 4 1 4 87 91 104 105 +344 4 1 4 92 88 105 87 +345 4 1 4 92 87 105 91 +346 4 1 4 88 92 105 106 +347 4 1 4 93 89 106 88 +348 4 1 4 93 88 106 92 +349 4 1 4 89 93 106 94 +350 4 1 4 26 27 94 89 +351 4 1 4 26 89 94 93 +352 4 1 4 16 17 44 78 +353 4 1 4 78 74 115 16 +354 4 1 4 78 16 115 44 +355 4 1 4 74 78 115 79 +356 4 1 4 79 75 116 74 +357 4 1 4 79 74 116 115 +358 4 1 4 75 79 116 80 +359 4 1 4 80 76 117 75 +360 4 1 4 80 75 117 116 +361 4 1 4 76 80 117 81 +362 4 1 4 81 77 118 76 +363 4 1 4 81 76 118 117 +364 4 1 4 77 81 118 23 +365 4 1 4 23 24 97 77 +366 4 1 4 23 77 97 118 +367 4 1 4 15 16 45 119 +368 4 1 4 74 70 119 15 +369 4 1 4 74 15 119 16 +370 4 1 4 70 74 119 120 +371 4 1 4 75 71 120 70 +372 4 1 4 75 70 120 74 +373 4 1 4 71 75 120 121 +374 4 1 4 76 72 121 71 +375 4 1 4 76 71 121 75 +376 4 1 4 72 76 121 122 +377 4 1 4 77 73 122 72 +378 4 1 4 77 72 122 76 +379 4 1 4 73 77 122 98 +380 4 1 4 24 25 98 73 +381 4 1 4 24 73 98 77 +382 4 1 4 8 43 48 131 +383 4 1 4 111 54 131 8 +384 4 1 4 111 8 131 43 +385 4 1 4 54 111 131 132 +386 4 1 4 112 55 132 54 +387 4 1 4 112 54 132 111 +388 4 1 4 55 112 132 133 +389 4 1 4 113 56 133 55 +390 4 1 4 113 55 133 112 +391 4 1 4 56 113 133 134 +392 4 1 4 114 57 134 56 +393 4 1 4 114 56 134 113 +394 4 1 4 57 114 134 101 +395 4 1 4 96 19 101 57 +396 4 1 4 96 57 101 114 +397 4 1 4 16 44 45 119 +398 4 1 4 115 74 119 16 +399 4 1 4 115 16 119 44 +400 4 1 4 74 115 119 120 +401 4 1 4 116 75 120 74 +402 4 1 4 116 74 120 115 +403 4 1 4 75 116 120 121 +404 4 1 4 117 76 121 75 +405 4 1 4 117 75 121 116 +406 4 1 4 76 117 121 122 +407 4 1 4 118 77 122 76 +408 4 1 4 118 76 122 117 +409 4 1 4 77 118 122 98 +410 4 1 4 97 24 98 77 +411 4 1 4 97 77 98 118 +412 4 1 4 14 1 47 127 +413 4 1 4 37 90 127 14 +414 4 1 4 37 14 127 1 +415 4 1 4 90 37 127 128 +416 4 1 4 38 91 128 90 +417 4 1 4 38 90 128 37 +418 4 1 4 91 38 128 129 +419 4 1 4 39 92 129 91 +420 4 1 4 39 91 129 38 +421 4 1 4 92 39 129 130 +422 4 1 4 40 93 130 92 +423 4 1 4 40 92 130 39 +424 4 1 4 93 40 130 100 +425 4 1 4 5 26 100 93 +426 4 1 4 5 93 100 40 +427 4 1 4 1 15 47 127 +428 4 1 4 70 37 127 1 +429 4 1 4 70 1 127 15 +430 4 1 4 37 70 127 128 +431 4 1 4 71 38 128 37 +432 4 1 4 71 37 128 70 +433 4 1 4 38 71 128 129 +434 4 1 4 72 39 129 38 +435 4 1 4 72 38 129 71 +436 4 1 4 39 72 129 130 +437 4 1 4 73 40 130 39 +438 4 1 4 73 39 130 72 +439 4 1 4 40 73 130 100 +440 4 1 4 25 5 100 40 +441 4 1 4 25 40 100 73 +442 4 1 4 42 9 48 131 +443 4 1 4 58 107 131 9 +444 4 1 4 9 42 107 131 +445 4 1 4 107 58 131 132 +446 4 1 4 59 108 132 58 +447 4 1 4 58 107 108 132 +448 4 1 4 108 59 132 133 +449 4 1 4 60 109 133 59 +450 4 1 4 59 108 109 133 +451 4 1 4 109 60 133 134 +452 4 1 4 61 110 134 60 +453 4 1 4 60 109 110 134 +454 4 1 4 110 61 134 101 +455 4 1 4 20 95 101 61 +456 4 1 4 61 110 95 101 +457 4 1 4 10 42 49 135 +458 4 1 4 107 62 135 10 +459 4 1 4 107 10 135 42 +460 4 1 4 62 107 135 136 +461 4 1 4 108 63 136 62 +462 4 1 4 108 62 136 107 +463 4 1 4 63 108 136 137 +464 4 1 4 109 64 137 63 +465 4 1 4 109 63 137 108 +466 4 1 4 64 109 137 138 +467 4 1 4 110 65 138 64 +468 4 1 4 110 64 138 109 +469 4 1 4 65 110 138 102 +470 4 1 4 95 21 102 65 +471 4 1 4 95 65 102 110 +472 4 1 4 15 45 47 127 +473 4 1 4 119 70 127 15 +474 4 1 4 119 15 127 45 +475 4 1 4 70 119 127 128 +476 4 1 4 120 71 128 70 +477 4 1 4 120 70 128 119 +478 4 1 4 71 120 128 129 +479 4 1 4 121 72 129 71 +480 4 1 4 121 71 129 120 +481 4 1 4 72 121 129 130 +482 4 1 4 122 73 130 72 +483 4 1 4 122 72 130 121 +484 4 1 4 73 122 130 100 +485 4 1 4 98 25 100 73 +486 4 1 4 98 73 100 122 +487 4 1 4 42 44 49 135 +488 4 1 4 115 107 135 44 +489 4 1 4 44 42 107 135 +490 4 1 4 107 115 135 136 +491 4 1 4 116 108 136 115 +492 4 1 4 115 107 108 136 +493 4 1 4 108 116 136 137 +494 4 1 4 117 109 137 116 +495 4 1 4 116 108 109 137 +496 4 1 4 109 117 137 138 +497 4 1 4 118 110 138 117 +498 4 1 4 117 109 110 138 +499 4 1 4 110 118 138 102 +500 4 1 4 97 95 102 118 +501 4 1 4 118 110 95 102 +502 4 1 4 9 8 48 131 +503 4 1 4 54 58 131 9 +504 4 1 4 54 9 131 8 +505 4 1 4 58 54 131 132 +506 4 1 4 55 59 132 58 +507 4 1 4 55 58 132 54 +508 4 1 4 59 55 132 133 +509 4 1 4 56 60 133 59 +510 4 1 4 56 59 133 55 +511 4 1 4 60 56 133 134 +512 4 1 4 57 61 134 60 +513 4 1 4 57 60 134 56 +514 4 1 4 61 57 134 101 +515 4 1 4 19 20 101 61 +516 4 1 4 19 61 101 57 +517 4 1 4 41 14 47 127 +518 4 1 4 90 103 127 14 +519 4 1 4 14 41 103 127 +520 4 1 4 103 90 127 128 +521 4 1 4 91 104 128 90 +522 4 1 4 90 103 104 128 +523 4 1 4 104 91 128 129 +524 4 1 4 92 105 129 91 +525 4 1 4 91 104 105 129 +526 4 1 4 105 92 129 130 +527 4 1 4 93 106 130 92 +528 4 1 4 92 105 106 130 +529 4 1 4 106 93 130 100 +530 4 1 4 26 94 100 93 +531 4 1 4 93 106 94 100 +532 4 1 4 11 10 49 135 +533 4 1 4 62 66 135 11 +534 4 1 4 62 11 135 10 +535 4 1 4 66 62 135 136 +536 4 1 4 63 67 136 66 +537 4 1 4 63 66 136 62 +538 4 1 4 67 63 136 137 +539 4 1 4 64 68 137 67 +540 4 1 4 64 67 137 63 +541 4 1 4 68 64 137 138 +542 4 1 4 65 69 138 68 +543 4 1 4 65 68 138 64 +544 4 1 4 69 65 138 102 +545 4 1 4 21 22 102 69 +546 4 1 4 21 69 102 65 +547 4 1 4 43 46 48 131 +548 4 1 4 123 111 131 43 +549 4 1 4 123 43 131 46 +550 4 1 4 111 123 131 132 +551 4 1 4 124 112 132 111 +552 4 1 4 124 111 132 123 +553 4 1 4 112 124 132 133 +554 4 1 4 125 113 133 112 +555 4 1 4 125 112 133 124 +556 4 1 4 113 125 133 134 +557 4 1 4 126 114 134 113 +558 4 1 4 126 113 134 125 +559 4 1 4 114 126 134 101 +560 4 1 4 99 96 101 114 +561 4 1 4 99 114 101 126 +562 4 1 4 45 41 47 127 +563 4 1 4 103 119 127 41 +564 4 1 4 41 45 119 127 +565 4 1 4 119 103 127 128 +566 4 1 4 104 120 128 103 +567 4 1 4 103 119 120 128 +568 4 1 4 120 104 128 129 +569 4 1 4 105 121 129 104 +570 4 1 4 104 120 121 129 +571 4 1 4 121 105 129 130 +572 4 1 4 106 122 130 105 +573 4 1 4 105 121 122 130 +574 4 1 4 122 106 130 100 +575 4 1 4 94 98 100 106 +576 4 1 4 106 122 98 100 +577 4 1 4 46 42 48 131 +578 4 1 4 107 123 131 42 +579 4 1 4 42 46 123 131 +580 4 1 4 123 107 131 132 +581 4 1 4 108 124 132 107 +582 4 1 4 107 123 124 132 +583 4 1 4 124 108 132 133 +584 4 1 4 109 125 133 108 +585 4 1 4 108 124 125 133 +586 4 1 4 125 109 133 134 +587 4 1 4 110 126 134 109 +588 4 1 4 109 125 126 134 +589 4 1 4 126 110 134 101 +590 4 1 4 95 99 101 110 +591 4 1 4 110 126 99 101 +2 2 5 3 41 13 43 +3 2 5 3 12 7 43 +4 2 5 3 11 17 49 +5 2 5 3 42 45 46 +6 2 5 3 13 12 43 +7 2 5 3 3 7 12 +8 2 5 3 11 2 17 +9 2 5 3 42 44 45 +10 2 5 3 17 44 49 +11 2 5 3 41 43 46 +12 2 5 3 7 8 43 +13 2 5 3 45 41 46 +14 2 5 3 9 10 42 +15 2 5 3 14 13 41 +16 2 5 3 17 16 44 +17 2 5 3 16 15 45 +18 2 5 3 43 8 48 +19 2 5 3 44 16 45 +20 2 5 3 1 14 47 +21 2 5 3 15 1 47 +22 2 5 3 9 42 48 +23 2 5 3 42 10 49 +24 2 5 3 45 15 47 +25 2 5 3 44 42 49 +26 2 5 3 8 9 48 +27 2 5 3 14 41 47 +28 2 5 3 10 11 49 +29 2 5 3 46 43 48 +30 2 5 3 41 45 47 +31 2 5 3 42 46 48 +32 2 17 3 37 70 1 +33 2 17 3 1 70 15 +34 2 17 3 38 71 37 +35 2 17 3 37 71 70 +36 2 17 3 39 72 38 +37 2 17 3 38 72 71 +38 2 17 3 40 73 39 +39 2 17 3 39 73 72 +40 2 17 3 5 25 40 +41 2 17 3 40 25 73 +42 2 17 3 70 74 15 +43 2 17 3 15 74 16 +44 2 17 3 71 75 70 +45 2 17 3 70 75 74 +46 2 17 3 72 76 71 +47 2 17 3 71 76 75 +48 2 17 3 73 77 72 +49 2 17 3 72 77 76 +50 2 17 3 25 24 73 +51 2 17 3 73 24 77 +52 2 17 3 74 78 16 +53 2 17 3 16 78 17 +54 2 17 3 75 79 74 +55 2 17 3 74 79 78 +56 2 17 3 76 80 75 +57 2 17 3 75 80 79 +58 2 17 3 77 81 76 +59 2 17 3 76 81 80 +60 2 17 3 24 23 77 +61 2 17 3 77 23 81 +62 2 17 3 78 2 17 +63 2 17 3 78 33 2 +64 2 17 3 79 33 78 +65 2 17 3 79 34 33 +66 2 17 3 80 34 79 +67 2 17 3 80 35 34 +68 2 17 3 81 35 80 +69 2 17 3 81 36 35 +70 2 17 3 23 36 81 +71 2 17 3 23 6 36 +72 2 21 3 29 82 3 +73 2 21 3 3 82 12 +74 2 21 3 30 83 29 +75 2 21 3 29 83 82 +76 2 21 3 31 84 30 +77 2 21 3 30 84 83 +78 2 21 3 32 85 31 +79 2 21 3 31 85 84 +80 2 21 3 4 28 32 +81 2 21 3 32 28 85 +82 2 21 3 82 86 12 +83 2 21 3 12 86 13 +84 2 21 3 83 87 82 +85 2 21 3 82 87 86 +86 2 21 3 84 88 83 +87 2 21 3 83 88 87 +88 2 21 3 85 89 84 +89 2 21 3 84 89 88 +90 2 21 3 28 27 85 +91 2 21 3 85 27 89 +92 2 21 3 86 90 13 +93 2 21 3 13 90 14 +94 2 21 3 87 91 86 +95 2 21 3 86 91 90 +96 2 21 3 88 92 87 +97 2 21 3 87 92 91 +98 2 21 3 89 93 88 +99 2 21 3 88 93 92 +100 2 21 3 27 26 89 +101 2 21 3 89 26 93 +102 2 21 3 90 37 14 +103 2 21 3 14 37 1 +104 2 21 3 91 38 90 +105 2 21 3 90 38 37 +106 2 21 3 92 39 91 +107 2 21 3 91 39 38 +108 2 21 3 93 40 92 +109 2 21 3 92 40 39 +110 2 21 3 26 5 93 +111 2 21 3 93 5 40 +112 2 22 3 94 27 96 +113 2 22 3 28 18 96 +114 2 22 3 22 23 102 +115 2 22 3 95 98 99 +116 2 22 3 27 28 96 +117 2 22 3 4 18 28 +118 2 22 3 22 6 23 +119 2 22 3 95 97 98 +120 2 22 3 23 97 102 +121 2 22 3 94 96 99 +122 2 22 3 18 19 96 +123 2 22 3 98 94 99 +124 2 22 3 20 21 95 +125 2 22 3 26 27 94 +126 2 22 3 23 24 97 +127 2 22 3 24 25 98 +128 2 22 3 96 19 101 +129 2 22 3 97 24 98 +130 2 22 3 5 26 100 +131 2 22 3 25 5 100 +132 2 22 3 20 95 101 +133 2 22 3 95 21 102 +134 2 22 3 98 25 100 +135 2 22 3 97 95 102 +136 2 22 3 19 20 101 +137 2 22 3 26 94 100 +138 2 22 3 21 22 102 +139 2 22 3 99 96 101 +140 2 22 3 94 98 100 +141 2 22 3 95 99 101 +1 15 5 1 5 $EndElements diff --git a/dG3D/benchmarks/powerYieldViscoElastoPlastic/cylinder.py b/dG3D/benchmarks/powerYieldViscoElastoPlastic/cylinder.py index a1b15c2a5cd3f995d46b42b0b6064bee54012b56..9243e6743eeba01c9de19e2395996abd555bb92e 100644 --- a/dG3D/benchmarks/powerYieldViscoElastoPlastic/cylinder.py +++ b/dG3D/benchmarks/powerYieldViscoElastoPlastic/cylinder.py @@ -17,7 +17,7 @@ mu =E/2./(1.+nu) # Shear mudulus print(f"K={K} mu={mu}") rho = 7850e-9 # Bulk mass -sy0c = 100. #MPa +sy0c = 1. #MPa hc = 300. sy0t = sy0c*0.78 @@ -38,7 +38,7 @@ law1.setCompressionHardening(hardenc) law1.setTractionHardening(hardent) law1.setKinematicHardening(hardenk) -law1.setStrainOrder(11) +law1.setStrainOrder(-1) law1.setYieldPowerFactor(3.5) law1.setNonAssociatedFlow(True) @@ -59,7 +59,8 @@ law1.setViscosityEffect(eta,0.21) # geometry -meshfile="cylinder.msh" # name of mesh file +geofile = "cylinder.geo" # "line.geo" +meshfile= "cylinder.msh" # name of mesh file fullDg = 0 #O = CG, 1 = DG space1 = 0 # function space (Lagrange=0) @@ -75,14 +76,15 @@ myfield1.stabilityParameters(beta1) 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-8 # relative tolerance for NR scheme (used only if soltype=1) +ftime = 1. # 2.4/1.e-0 # 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) # creation of Solver mysolver = nonLinearMechSolver(1000) +mysolver.createModel(geofile,meshfile,3,1) mysolver.loadModel(meshfile) mysolver.addDomain(myfield1) mysolver.addMaterialLaw(law1) diff --git a/dG3D/src/dG3DMaterialLaw.cpp b/dG3D/src/dG3DMaterialLaw.cpp index 10a77500ac5584a65c94a828d098accc54e76135..aeef5633a43a274ae99c71afe1ac1fda546e72f3 100644 --- a/dG3D/src/dG3DMaterialLaw.cpp +++ b/dG3D/src/dG3DMaterialLaw.cpp @@ -247,7 +247,7 @@ void dG3DMaterialLawWithTangentByPerturbation::stress(IPVariable* ipv, const IPV _stressLaw->stress(ipvcur,ipvprev,false,checkfrac,dTangent); -#if 0 +#if 1 _stressLaw->stress(ipvcur,ipvprev,true,checkfrac,dTangent); ipvcur->getConstRefToDeformationGradient().print("F Analytique"); // FLE ipvcur->getConstRefToFirstPiolaKirchhoffStress().print("P Analytique"); // FLE @@ -622,7 +622,7 @@ void dG3DMaterialLawWithTangentByPerturbation::stress(IPVariable* ipv, const IPV } } -#if 0 +#if 1 ipvcur->getConstRefToDeformationGradient().print("F Numerique"); // FLE ipvcur->getConstRefToFirstPiolaKirchhoffStress().print("P Numerique"); // FLE ipvcur->getConstRefToTangentModuli().print("dPdE Numerique"); @@ -3981,7 +3981,10 @@ void HyperViscoElasticDG3DMaterialLaw::setViscoElasticData(const std::string fil void HyperViscoElasticDG3DMaterialLaw::setVolumeCorrection(double _vc, double _xivc, double _zetavc ,double _dc, double _thetadc, double _pidc){ _viscoLaw.setVolumeCorrection(_vc, _xivc, _zetavc, _dc, _thetadc, _pidc); }; -void HyperViscoElasticDG3DMaterialLaw::setExtraBranch_CompressionParameter(double compCorrection, double compCorrection_2, double compCorrection_3){ +void HyperViscoElasticDG3DMaterialLaw::setAdditionalVolumeCorrections(const double V3, const double V4, const double V5, const double D3, const double D4, const double D5){ + _viscoLaw.setAdditionalVolumeCorrections(V3,V4,V5,D3,D4,D5); +}; +void HyperViscoElasticDG3DMaterialLaw::setExtraBranch_CompressionParameter(const double compCorrection, const double compCorrection_2, const double compCorrection_3){ _viscoLaw.setExtraBranch_CompressionParameter(compCorrection,compCorrection_2,compCorrection_3); }; void HyperViscoElasticDG3DMaterialLaw::setTensionCompressionRegularisation(double tensionCompressionRegularisation){ @@ -4101,7 +4104,10 @@ void HyperViscoElastoPlasticPowerYieldDG3DMaterialLaw::setViscoElasticData(const void HyperViscoElastoPlasticPowerYieldDG3DMaterialLaw::setVolumeCorrection(double _vc, double _xivc, double _zetavc ,double _dc, double _thetadc, double _pidc){ _viscoLaw.setVolumeCorrection(_vc, _xivc, _zetavc, _dc, _thetadc, _pidc); }; -void HyperViscoElastoPlasticPowerYieldDG3DMaterialLaw::setExtraBranch_CompressionParameter(double compCorrection, double compCorrection_2, double compCorrection_3){ +void HyperViscoElastoPlasticPowerYieldDG3DMaterialLaw::setAdditionalVolumeCorrections(const double V3, const double V4, const double V5, const double D3, const double D4, const double D5){ + _viscoLaw.setAdditionalVolumeCorrections(V3,V4,V5,D3,D4,D5); +}; +void HyperViscoElastoPlasticPowerYieldDG3DMaterialLaw::setExtraBranch_CompressionParameter(const double compCorrection, const double compCorrection_2, const double compCorrection_3){ _viscoLaw.setExtraBranch_CompressionParameter(compCorrection,compCorrection_2,compCorrection_3); }; void HyperViscoElastoPlasticPowerYieldDG3DMaterialLaw::setExtraBranchNLType(const int method){ @@ -10525,18 +10531,30 @@ void NonLinearTVMDG3DMaterialLaw::useExtraBranchBool(const bool useExtraBranch){ void NonLinearTVMDG3DMaterialLaw::useExtraBranchBool_TVE(const bool useExtraBranch_TVE, const int ExtraBranch_TVE_option){ _viscoLaw.useExtraBranchBool_TVE(useExtraBranch_TVE, ExtraBranch_TVE_option); }; -void NonLinearTVMDG3DMaterialLaw::setVolumeCorrection(double _vc, double _xivc, double _zetavc, double _dc, double _thetadc, double _pidc){ +void NonLinearTVMDG3DMaterialLaw::setVolumeCorrection(const double _vc, const double _xivc, const double _zetavc, const double _dc, const double _thetadc, const double _pidc){ _viscoLaw.setVolumeCorrection(_vc,_xivc,_zetavc,_dc,_thetadc,_pidc); }; -void NonLinearTVMDG3DMaterialLaw::setExtraBranch_CompressionParameter(double compCorrection, double compCorrection_2, double compCorrection_3){ +void NonLinearTVMDG3DMaterialLaw::setAdditionalVolumeCorrections(const double V3, const double V4, const double V5, const double D3, const double D4, const double D5){ + _viscoLaw.setAdditionalVolumeCorrections(V3,V4,V5,D3,D4,D5); +}; +void NonLinearTVMDG3DMaterialLaw::setExtraBranch_CompressionParameter(const double compCorrection, const double compCorrection_2, const double compCorrection_3){ _viscoLaw.setExtraBranch_CompressionParameter(compCorrection,compCorrection_2,compCorrection_3); }; -void NonLinearTVMDG3DMaterialLaw::setTensionCompressionRegularisation(double tensionCompressionRegularisation){ +void NonLinearTVMDG3DMaterialLaw::setTensionCompressionRegularisation(const double tensionCompressionRegularisation){ _viscoLaw.setTensionCompressionRegularisation(tensionCompressionRegularisation); }; void NonLinearTVMDG3DMaterialLaw::setExtraBranchNLType(const int method){ _viscoLaw.setExtraBranchNLType(method); }; +void NonLinearTVMDG3DMaterialLaw::setCorrectionsAllBranchesTVE(const int i, const double V1, const double V2, const double D1, const double D2){ + _viscoLaw.setCorrectionsAllBranchesTVE(i,V1,V2,D1,D2); +}; +void NonLinearTVMDG3DMaterialLaw::setAdditionalCorrectionsAllBranchesTVE(const int i, const double V3, const double V4, const double V5, const double D3, const double D4, const double D5){ + _viscoLaw.setAdditionalCorrectionsAllBranchesTVE(i,V3,V4,V5,D3,D4,D5); +}; +void NonLinearTVMDG3DMaterialLaw::setCompressionCorrectionsAllBranchesTVE(const int i, const double Ci){ + _viscoLaw.setCompressionCorrectionsAllBranchesTVE(i,Ci); +}; void NonLinearTVMDG3DMaterialLaw::setMullinsEffect(const mullinsEffect& mullins){ _viscoLaw.setMullinsEffect(mullins); }; @@ -10770,7 +10788,10 @@ void NonLinearTVEDG3DMaterialLaw::useExtraBranchBool(const bool useExtraBranch){ void NonLinearTVEDG3DMaterialLaw::setVolumeCorrection(double _vc, double _xivc, double _zetavc, double _dc, double _thetadc, double _pidc){ _viscoLaw.setVolumeCorrection(_vc,_xivc,_zetavc,_dc,_thetadc,_pidc); }; -void NonLinearTVEDG3DMaterialLaw::setExtraBranch_CompressionParameter(double compCorrection, double compCorrection_2, double compCorrection_3){ +void NonLinearTVEDG3DMaterialLaw::setAdditionalVolumeCorrections(const double V3, const double V4, const double V5, const double D3, const double D4, const double D5){ + _viscoLaw.setAdditionalVolumeCorrections(V3,V4,V5,D3,D4,D5); +}; +void NonLinearTVEDG3DMaterialLaw::setExtraBranch_CompressionParameter(const double compCorrection, const double compCorrection_2, const double compCorrection_3){ _viscoLaw.setExtraBranch_CompressionParameter(compCorrection,compCorrection_2,compCorrection_3); }; void NonLinearTVEDG3DMaterialLaw::setExtraBranchNLType(const int method){ @@ -11059,16 +11080,19 @@ void NonLinearTVPDG3DMaterialLaw::setTemperatureFunction_Viscosity(const scalarF void NonLinearTVPDG3DMaterialLaw::useExtraBranchBool(const bool useExtraBranch){ _viscoLaw.useExtraBranchBool(useExtraBranch); }; -void NonLinearTVPDG3DMaterialLaw::setVolumeCorrection(double _vc, double _xivc, double _zetavc, double _dc, double _thetadc, double _pidc){ +void NonLinearTVPDG3DMaterialLaw::setVolumeCorrection(const double _vc, const double _xivc, const double _zetavc, const double _dc, const double _thetadc, const double _pidc){ _viscoLaw.setVolumeCorrection(_vc,_xivc,_zetavc,_dc,_thetadc,_pidc); }; -void NonLinearTVPDG3DMaterialLaw::setExtraBranch_CompressionParameter(double compCorrection, double compCorrection_2, double compCorrection_3){ +void NonLinearTVPDG3DMaterialLaw::setAdditionalVolumeCorrections(const double V3, const double V4, const double V5, const double D3, const double D4, const double D5){ + _viscoLaw.setAdditionalVolumeCorrections(V3,V4,V5,D3,D4,D5); +}; +void NonLinearTVPDG3DMaterialLaw::setExtraBranch_CompressionParameter(const double compCorrection, const double compCorrection_2, const double compCorrection_3){ _viscoLaw.setExtraBranch_CompressionParameter(compCorrection,compCorrection_2,compCorrection_3); }; void NonLinearTVPDG3DMaterialLaw::setExtraBranchNLType(const int method){ _viscoLaw.setExtraBranchNLType(method); }; -void NonLinearTVPDG3DMaterialLaw::setTensionCompressionRegularisation(double tensionCompressionRegularisation){ +void NonLinearTVPDG3DMaterialLaw::setTensionCompressionRegularisation(const double tensionCompressionRegularisation){ _viscoLaw.setTensionCompressionRegularisation(tensionCompressionRegularisation); }; // Added extra argument in the NonLinearTVEDG3DIPVariable contructor - Tinitial (added from LinearThermoMech) @@ -11338,18 +11362,31 @@ void NonLinearTVENonLinearTVPDG3DMaterialLaw::useExtraBranchBool(const bool useE void NonLinearTVENonLinearTVPDG3DMaterialLaw::useExtraBranchBool_TVE(const bool useExtraBranch_TVE, const int ExtraBranch_TVE_option){ _viscoLaw.useExtraBranchBool_TVE(useExtraBranch_TVE, ExtraBranch_TVE_option); }; -void NonLinearTVENonLinearTVPDG3DMaterialLaw::setVolumeCorrection(double _vc, double _xivc, double _zetavc, double _dc, double _thetadc, double _pidc){ +void NonLinearTVENonLinearTVPDG3DMaterialLaw::setVolumeCorrection(const double _vc, const double _xivc, const double _zetavc, const double _dc, const double _thetadc, const double _pidc){ _viscoLaw.setVolumeCorrection(_vc,_xivc,_zetavc,_dc,_thetadc,_pidc); }; -void NonLinearTVENonLinearTVPDG3DMaterialLaw::setExtraBranch_CompressionParameter(double compCorrection, double compCorrection_2, double compCorrection_3){ +void NonLinearTVENonLinearTVPDG3DMaterialLaw::setAdditionalVolumeCorrections(const double V3, const double V4, const double V5, const double D3, const double D4, const double D5){ + _viscoLaw.setAdditionalVolumeCorrections(V3,V4,V5,D3,D4,D5); +}; +void NonLinearTVENonLinearTVPDG3DMaterialLaw::setExtraBranch_CompressionParameter(const double compCorrection, const double compCorrection_2, const double compCorrection_3){ _viscoLaw.setExtraBranch_CompressionParameter(compCorrection,compCorrection_2,compCorrection_3); }; void NonLinearTVENonLinearTVPDG3DMaterialLaw::setExtraBranchNLType(const int method){ _viscoLaw.setExtraBranchNLType(method); }; -void NonLinearTVENonLinearTVPDG3DMaterialLaw::setTensionCompressionRegularisation(double tensionCompressionRegularisation){ +void NonLinearTVENonLinearTVPDG3DMaterialLaw::setTensionCompressionRegularisation(const double tensionCompressionRegularisation){ _viscoLaw.setTensionCompressionRegularisation(tensionCompressionRegularisation); }; +void NonLinearTVENonLinearTVPDG3DMaterialLaw::setCorrectionsAllBranchesTVE(const int i, const double V1, const double V2, const double D1, const double D2){ + _viscoLaw.setCorrectionsAllBranchesTVE(i,V1,V2,D1,D2); +}; +void NonLinearTVENonLinearTVPDG3DMaterialLaw::setAdditionalCorrectionsAllBranchesTVE(const int i, const double V3, const double V4, const double V5, const double D3, const double D4, const double D5){ + _viscoLaw.setAdditionalCorrectionsAllBranchesTVE(i,V3,V4,V5,D3,D4,D5); +}; +void NonLinearTVENonLinearTVPDG3DMaterialLaw::setCompressionCorrectionsAllBranchesTVE(const int i, const double Ci){ + _viscoLaw.setCompressionCorrectionsAllBranchesTVE(i,Ci); +}; + // Added extra argument in the NonLinearTVEDG3DIPVariable contructor - Tinitial (added from LinearThermoMech) void NonLinearTVENonLinearTVPDG3DMaterialLaw::createIPState(IPStateBase* &ips, bool hasBodyForce, const bool* state_,const MElement *ele, const int nbFF_, const IntPt *GP, const int gpt) const { diff --git a/dG3D/src/dG3DMaterialLaw.h b/dG3D/src/dG3DMaterialLaw.h index e92e79bdd724fd4ce93d9e490079a8b1afdc3fe7..14fd1b5e6f126aff95cdb3e02837b7318d1ae121 100644 --- a/dG3D/src/dG3DMaterialLaw.h +++ b/dG3D/src/dG3DMaterialLaw.h @@ -936,7 +936,8 @@ class HyperViscoElasticDG3DMaterialLaw : public dG3DMaterialLaw{ void setViscoElasticData_Shear(const int i, const double Gi, const double gi); void setViscoElasticData(const std::string filename); void setVolumeCorrection(double _vc, double _xivc, double _zetavc, double _dc, double _thetadc, double _pidc); - void setExtraBranch_CompressionParameter(double compCorrection, double compCorrection_2, double compCorrection_3); + void setAdditionalVolumeCorrections(const double V3, const double V4, const double V5, const double D3, const double D4, const double D5); + void setExtraBranch_CompressionParameter(const double compCorrection, const double compCorrection_2, const double compCorrection_3); void setExtraBranchNLType(int type); void setTensionCompressionRegularisation(double tensionCompressionRegularisation); #ifndef SWIG @@ -990,7 +991,8 @@ class HyperViscoElastoPlasticPowerYieldDG3DMaterialLaw : public dG3DMaterialLaw void setViscoElasticData_Shear(const int i, const double Gi, const double gi); void setViscoElasticData(const std::string filename); void setVolumeCorrection(double _vc, double _xivc, double _zetavc, double _dc, double _thetadc, double _pidc); - void setExtraBranch_CompressionParameter(double compCorrection, double compCorrection_2, double compCorrection_3); + void setAdditionalVolumeCorrections(const double V3, const double V4, const double V5, const double D3, const double D4, const double D5); + void setExtraBranch_CompressionParameter(const double compCorrection, const double compCorrection_2, const double compCorrection_3); void setExtraBranchNLType(int type); void setTensionCompressionRegularisation(double tensionCompressionRegularisation); @@ -3319,10 +3321,14 @@ class NonLinearTVMDG3DMaterialLaw : public dG3DMaterialLaw{ // public Material 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); - void setVolumeCorrection(double _vc, double _xivc, double _zetavc, double _dc, double _thetadc, double _pidc); - void setExtraBranch_CompressionParameter(double compCorrection, double compCorrection_2, double compCorrection_3); - void setExtraBranchNLType(int type); - void setTensionCompressionRegularisation(double tensionCompressionRegularisation); + void setVolumeCorrection(const double _vc, const double _xivc, const double _zetavc, const double _dc, const double _thetadc, const double _pidc); + void setAdditionalVolumeCorrections(const double V3, const double V4, const double V5, const double D3, const double D4, const double D5); + void setExtraBranch_CompressionParameter(const double compCorrection, const double compCorrection_2, const double compCorrection_3); + void setExtraBranchNLType(const int type); + void setTensionCompressionRegularisation(const double tensionCompressionRegularisation); + void setCorrectionsAllBranchesTVE(const int i, const double V1, const double V2, const double D1, const double D2); + void setAdditionalCorrectionsAllBranchesTVE(const int i, const double V3, const double V4, const double V5, const double D3, const double D4, const double D5); + void setCompressionCorrectionsAllBranchesTVE(const int i, const double Ci); void setReferenceTemperature(const double Tref); void setShiftFactorConstantsWLF(const double C1, const double C2); @@ -3400,10 +3406,11 @@ class NonLinearTVEDG3DMaterialLaw : public dG3DMaterialLaw{ // public Material void setViscoElasticData_Shear(const int i, const double Gi, const double gi); void setViscoElasticData_Alpha(const int i, const double Alphai); void setViscoElasticData(const std::string filename); - void setVolumeCorrection(double _vc, double _xivc, double _zetavc, double _dc, double _thetadc, double _pidc); - void setExtraBranch_CompressionParameter(double compCorrection, double compCorrection_2, double compCorrection_3); - void setExtraBranchNLType(int type); - void setTensionCompressionRegularisation(double tensionCompressionRegularisation); + void setVolumeCorrection(const double _vc, const double _xivc, const double _zetavc, const double _dc, const double _thetadc, const double _pidc); + void setAdditionalVolumeCorrections(const double V3, const double V4, const double V5, const double D3, const double D4, const double D5); + void setExtraBranch_CompressionParameter(const double compCorrection, const double compCorrection_2, const double compCorrection_3); + void setExtraBranchNLType(const int type); + void setTensionCompressionRegularisation(const double tensionCompressionRegularisation); void setReferenceTemperature(const double Tref); void setTempFuncOption(const double TemFuncOpt); @@ -3516,10 +3523,11 @@ class NonLinearTVPDG3DMaterialLaw : public dG3DMaterialLaw{ // public Material // void setTemperatureFunction_BranchShearModuli(const scalarFunction& Tfunc,int i); // void setTemperatureFunction_BranchThermalDilationCoefficient(const scalarFunction& Tfunc,int i); void useExtraBranchBool(const bool useExtraBranch); - void setVolumeCorrection(double _vc, double _xivc, double _zetavc, double _dc, double _thetadc, double _pidc); - void setExtraBranch_CompressionParameter(double compCorrection, double compCorrection_2, double compCorrection_3); - void setExtraBranchNLType(int type); - void setTensionCompressionRegularisation(double tensionCompressionRegularisation); + void setVolumeCorrection(const double _vc, const double _xivc, const double _zetavc, const double _dc, const double _thetadc, const double _pidc); + void setAdditionalVolumeCorrections(const double V3, const double V4, const double V5, const double D3, const double D4, const double D5); + void setExtraBranch_CompressionParameter(const double compCorrection, const double compCorrection_2, const double compCorrection_3); + void setExtraBranchNLType(const int type); + void setTensionCompressionRegularisation(const double tensionCompressionRegularisation); void setCompressionHardening(const J2IsotropicHardening& comp); void setTractionHardening(const J2IsotropicHardening& trac); @@ -3623,10 +3631,14 @@ class NonLinearTVENonLinearTVPDG3DMaterialLaw : public dG3DMaterialLaw{ // pub // void setTemperatureFunction_BranchThermalDilationCoefficient(const scalarFunction& Tfunc,int i); void useExtraBranchBool(const bool useExtraBranch); void useExtraBranchBool_TVE(const bool useExtraBranch_TVE, const int ExtraBranch_TVE_option); - void setVolumeCorrection(double _vc, double _xivc, double _zetavc, double _dc, double _thetadc, double _pidc); - void setExtraBranch_CompressionParameter(double compCorrection, double compCorrection_2, double compCorrection_3); - void setExtraBranchNLType(int type); - void setTensionCompressionRegularisation(double tensionCompressionRegularisation); + void setVolumeCorrection(const double _vc, const double _xivc, const double _zetavc, const double _dc, const double _thetadc, const double _pidc); + void setAdditionalVolumeCorrections(const double V3, const double V4, const double V5, const double D3, const double D4, const double D5); + void setExtraBranch_CompressionParameter(const double compCorrection, const double compCorrection_2, const double compCorrection_3); + void setExtraBranchNLType(const int type); + void setTensionCompressionRegularisation(const double tensionCompressionRegularisation); + void setCorrectionsAllBranchesTVE(const int i, const double V1, const double V2, const double D1, const double D2); + void setAdditionalCorrectionsAllBranchesTVE(const int i, const double V3, const double V4, const double V5, const double D3, const double D4, const double D5); + void setCompressionCorrectionsAllBranchesTVE(const int i, const double Ci); void setCompressionHardening(const J2IsotropicHardening& comp); void setTractionHardening(const J2IsotropicHardening& trac);