diff --git a/NonLinearSolver/internalPoints/ipNonLinearTVE.cpp b/NonLinearSolver/internalPoints/ipNonLinearTVE.cpp index 3b9e0ae670bb61dc0824d24e4a26401cff828c15..ea98eac368ec0303d9001656c24239b4033daad3 100644 --- a/NonLinearSolver/internalPoints/ipNonLinearTVE.cpp +++ b/NonLinearSolver/internalPoints/ipNonLinearTVE.cpp @@ -15,10 +15,14 @@ IPNonLinearTVE::IPNonLinearTVE(const J2IsotropicHardening* comp, const J2IsotropicHardening* trac, - const kinematicHardening* kin, const int N): IPHyperViscoElastoPlastic(comp,trac,kin,N), // IPHyperViscoElastic(N), + const kinematicHardening* kin, const int N, const mullinsEffect* mullins): IPHyperViscoElastoPlastic(comp,trac,kin,N), // IPHyperViscoElastic(N), _T(298.15),_devDE(0.),_trDE(0.),_DE(0.),_DcorKirDT(0.),_DDcorKirDTT(0.), _mechSrcTVE(0.),_DmechSrcTVEdT(0.),_DmechSrcTVEdF(0.), _thermalEnergy(0.),_dtShift(0.),_DdtShiftDT(0.),_DDdtShiftDDT(0.){ + + _ipMullinsEffect = NULL; + if (mullins!= NULL) mullins->createIPVariable(_ipMullinsEffect); + _devOGammai.clear(); _trOGammai.clear(); _devDOGammaiDT.clear(); @@ -63,7 +67,15 @@ IPNonLinearTVE::IPNonLinearTVE(const IPNonLinearTVE& src): IPHyperViscoElastoPla _mechSrcTVE(src._mechSrcTVE),_DmechSrcTVEdT(src._DmechSrcTVEdT),_DmechSrcTVEdF(src._DmechSrcTVEdF), _C(src._C),_D(src._D), _E(src._E), _F(src._F), _G(src._G), _thermalEnergy(src._thermalEnergy), - _dtShift(src._dtShift),_DdtShiftDT(src._DdtShiftDT),_DDdtShiftDDT(src._DDdtShiftDDT){}; + _dtShift(src._dtShift),_DdtShiftDT(src._DdtShiftDT),_DDdtShiftDDT(src._DDdtShiftDDT){ + + + if (src._ipMullinsEffect != NULL) + _ipMullinsEffect = dynamic_cast<IPMullinsEffect*>(src._ipMullinsEffect->clone()); + else + _ipMullinsEffect = NULL; + +}; IPNonLinearTVE& IPNonLinearTVE::operator=(const IPVariable& src) { @@ -100,10 +112,25 @@ IPNonLinearTVE& IPNonLinearTVE::operator=(const IPVariable& src) _dtShift = psrc->_dtShift; _DdtShiftDT = psrc->_DdtShiftDT; _DDdtShiftDDT = psrc->_DDdtShiftDDT; + + if ( psrc->_ipMullinsEffect != NULL) { + if (_ipMullinsEffect == NULL){ + _ipMullinsEffect = dynamic_cast<IPMullinsEffect*>(psrc->_ipMullinsEffect->clone()); + } + else{ + _ipMullinsEffect->operator=(*dynamic_cast<const IPMullinsEffect*>(psrc->_ipMullinsEffect)); + } + } + } return *this; } +IPNonLinearTVE::~IPNonLinearTVE(){ + if (_ipMullinsEffect != NULL) delete _ipMullinsEffect; + _ipMullinsEffect = NULL; +}; + double IPNonLinearTVE::defoEnergy() const { return IPHyperViscoElastic::defoEnergy(); @@ -148,4 +175,18 @@ void IPNonLinearTVE::restart(){ restartManager::restart(_dtShift); restartManager::restart(_DdtShiftDT); restartManager::restart(_DDdtShiftDDT); -} \ No newline at end of file + + if (_ipMullinsEffect != NULL) + restartManager::restart(_ipMullinsEffect); +} + +const IPMullinsEffect& IPNonLinearTVE::getConstRefToIPMullinsEffect() const{ + if(_ipMullinsEffect==NULL) + Msg::Error("IPHyperViscoElastoPlastic: _ipMullinsEffect not initialized"); + return *_ipMullinsEffect; +}; +IPMullinsEffect& IPNonLinearTVE::getRefToIPMullinsEffect(){ + if(_ipMullinsEffect==NULL) + Msg::Error("IPHyperViscoElastoPlastic: _ipMullinsEffect not initialized"); + return *_ipMullinsEffect; +}; \ No newline at end of file diff --git a/NonLinearSolver/internalPoints/ipNonLinearTVE.h b/NonLinearSolver/internalPoints/ipNonLinearTVE.h index c6e6d68223f0ba862d0b726fac748d0acc7af394..c2e331df6e6fbc4b5cf6c817b70464d757bb20c5 100644 --- a/NonLinearSolver/internalPoints/ipNonLinearTVE.h +++ b/NonLinearSolver/internalPoints/ipNonLinearTVE.h @@ -16,7 +16,7 @@ #include "kinematicHardening.h" #include "STensor3.h" #include "STensor43.h" - +#include "mullinsEffect.h" // class IPNonLinearTVE : public IPHyperViscoElastic{ class IPNonLinearTVE : public IPHyperViscoElastoPlastic{ @@ -60,13 +60,16 @@ class IPNonLinearTVE : public IPHyperViscoElastoPlastic{ double _DdtShiftDT; double _DDdtShiftDDT; + // Mullins Effect IP + IPMullinsEffect* _ipMullinsEffect; + public: IPNonLinearTVE(const J2IsotropicHardening* comp, const J2IsotropicHardening* trac, - const kinematicHardening* kin, const int N); + const kinematicHardening* kin, const int N, const mullinsEffect* mullins); IPNonLinearTVE(const IPNonLinearTVE& src); virtual IPNonLinearTVE& operator=(const IPVariable& src); - virtual ~IPNonLinearTVE(){}; + virtual ~IPNonLinearTVE(); virtual std::vector<STensor3>& getRefToDevViscoElasticOverStrain() {return _devOGammai;}; virtual const std::vector<STensor3>& getConstRefToDevViscoElasticOverStrain() const {return _devOGammai;}; @@ -126,6 +129,9 @@ class IPNonLinearTVE : public IPHyperViscoElastoPlastic{ virtual double& getShiftedTimeStepTempDoubleDerivative() {return _DDdtShiftDDT;}; virtual const double& getConstShiftedTimeStepTempDoubleDerivative() const {return _DDdtShiftDDT;}; + virtual const IPMullinsEffect& getConstRefToIPMullinsEffect() const; + virtual IPMullinsEffect& getRefToIPMullinsEffect(); + virtual double defoEnergy() const; virtual double getThermalEnergy() const {return _thermalEnergy;}; // Added _thermalEnergy // virtual double getConstRefToFractureEnergy() const {return _fracEnergy;}; // Added - Unused (edit this because its neither "const" nor "ref" here) diff --git a/NonLinearSolver/internalPoints/ipNonLinearTVP.cpp b/NonLinearSolver/internalPoints/ipNonLinearTVP.cpp index 3806a37177e51636a5d13e5a81f0ffc04a67efb8..43c98ae52bac099b08ec2ec20d4f5bd17ce0ec0f 100644 --- a/NonLinearSolver/internalPoints/ipNonLinearTVP.cpp +++ b/NonLinearSolver/internalPoints/ipNonLinearTVP.cpp @@ -12,7 +12,7 @@ #include "ipNonLinearTVP.h" IPNonLinearTVP::IPNonLinearTVP(const J2IsotropicHardening* comp, const J2IsotropicHardening* trac, - const kinematicHardening* kin, const int N):IPNonLinearTVE(comp,trac,kin,N), + const kinematicHardening* kin, const int N, const mullinsEffect* mullins):IPNonLinearTVE(comp,trac,kin,N,mullins), _DgammaDT(0.),_DGammaDT(0.), _DGammaDF(0.), _DirreversibleEnergyDT(0.), _psiTVM(0.), _DpsiTVMdT(0.), _DDpsiTVMdTT(0.), _ModMandel(0.),_DModMandelDT(0.), _DbackSigDT(0.), _DModMandelDF(0.), _DbackSigDF(0.), _DphiPDF(0.), _GammaN(0.), _dGammaNdT(0.), _dGammaNdF(0.), diff --git a/NonLinearSolver/internalPoints/ipNonLinearTVP.h b/NonLinearSolver/internalPoints/ipNonLinearTVP.h index 2389f05c3b77497ced36d597cdf561a3ce186942..56e806bb0bc739facd0cfa1bd2e86f77ef8b3b16 100644 --- a/NonLinearSolver/internalPoints/ipNonLinearTVP.h +++ b/NonLinearSolver/internalPoints/ipNonLinearTVP.h @@ -57,7 +57,7 @@ class IPNonLinearTVP : public IPNonLinearTVE{ public: IPNonLinearTVP(const J2IsotropicHardening* comp, const J2IsotropicHardening* trac, - const kinematicHardening* kin, const int N); + const kinematicHardening* kin, const int N, const mullinsEffect* mullins); IPNonLinearTVP(const IPNonLinearTVP& src); virtual IPNonLinearTVP& operator =(const IPVariable &source); virtual ~IPNonLinearTVP(); diff --git a/NonLinearSolver/materialLaw/mlawNonLinearTVE.cpp b/NonLinearSolver/materialLaw/mlawNonLinearTVE.cpp index ca9ba845f2927e5a77f3762ad2110c97756ac202..0de0bd8dae1b751e3ffebf8d76352273b86649cf 100644 --- a/NonLinearSolver/materialLaw/mlawNonLinearTVE.cpp +++ b/NonLinearSolver/materialLaw/mlawNonLinearTVE.cpp @@ -1024,10 +1024,11 @@ void mlawNonLinearTVE::ThermoViscoElasticPredictor(const STensor3& Ee, const STe DKe = DKDT; DGe = DGDT; DKDTsum = DKDT; DGDTsum = DGDT; // Kelvin-Voight + /* double invGe = 1./GT; double invKe = 1./KT; STensor3 D(0.); - double V= 0.; + double V= 0.;*/ // Main Loop for Maxwell Branches if ((_Ki.size() > 0) or (_Gi.size() > 0)){ diff --git a/NonLinearSolver/materialLaw/mlawNonLinearTVE.h b/NonLinearSolver/materialLaw/mlawNonLinearTVE.h index c8eed1b2bd409aed251beddcdc1018920e736bc3..c009c283110e24201207cd411fcd75bd9513aaaa 100644 --- a/NonLinearSolver/materialLaw/mlawNonLinearTVE.h +++ b/NonLinearSolver/materialLaw/mlawNonLinearTVE.h @@ -81,6 +81,9 @@ class mlawNonLinearTVE : public mlawPowerYieldHyper{ // Shift factor - Everything related to it double _C1; // WLF Universal Constant 1 - set in .py file double _C2; // WLF Universal Constant 2 - set in .py file + + // Mullins Effect + mullinsEffect* _mullinsEffect; #ifndef SWIG protected: @@ -93,6 +96,7 @@ class mlawNonLinearTVE : public mlawPowerYieldHyper{ virtual double freeEnergyMechanical(const IPNonLinearTVE& q, const double T) const ; virtual double setTemp(const double T0, const double T1, const int para) const ; + void corKirInfinity(const IPNonLinearTVE *q1, const STensor3& devEe, const double& trEe, const double T, STensor3& CorKirDevInf, double& CorKirTrInf) const; void ThermoViscoElasticPredictor(const STensor3& Ee, const STensor3& Ee0, const IPNonLinearTVE *q0, IPNonLinearTVE *q1, @@ -164,6 +168,11 @@ class mlawNonLinearTVE : public mlawPowerYieldHyper{ // Virtual Destructor virtual ~mlawNonLinearTVE(); + void setMullinsEffect(const mullinsEffect& mullins){ + if (_mullinsEffect) delete _mullinsEffect; + _mullinsEffect = mullins.clone(); + }; + // Non-Const Functions for strain_order and VE data that are called from .py file. ---- These WILL change the values of the variables defined in the class object. virtual void setViscoElasticNumberOfElement(const int N); virtual void setViscoElasticData(const int i, const double Ei, const double taui); @@ -222,6 +231,8 @@ class mlawNonLinearTVE : public mlawPowerYieldHyper{ // Const Functions to get temp-updated values of material properties - Args by reference, or return the variable. + virtual mullinsEffect* getConstRefToMullinsEffect() const {return _mullinsEffect;}; + virtual std::vector<double> getBetai(const double _K, const std::vector<double> _Ki) const{ std::vector<double> Beta_i; Beta_i.resize(_N,0.); diff --git a/dG3D/src/dG3DIPVariable.cpp b/dG3D/src/dG3DIPVariable.cpp index 8ce50726a688ff37116e673383591de6f96ec008..88095add61d8a9d8d6859662ac0db7bf1bac5dc8 100644 --- a/dG3D/src/dG3DIPVariable.cpp +++ b/dG3D/src/dG3DIPVariable.cpp @@ -5112,7 +5112,8 @@ NonLinearTVEDG3DIPVariable::NonLinearTVEDG3DIPVariable(const mlawNonLinearTVE& v _ipViscoElastic = new IPNonLinearTVE(viscoLaw.getConstRefToCompressionHardening(), viscoLaw.getConstRefToTractionHardening(), viscoLaw.getConstRefToKinematicHardening(), - viscoLaw.getViscoElasticNumberOfElement()); + viscoLaw.getViscoElasticNumberOfElement(), + viscoLaw.getConstRefToMullinsEffect()); this->getRefToTemperature()=Tinitial; }; @@ -5286,7 +5287,8 @@ NonLinearTVPDG3DIPVariable::NonLinearTVPDG3DIPVariable(const mlawNonLinearTVP& v _ipViscoElastoPlastic = new IPNonLinearTVP(viscoEPLaw.getConstRefToCompressionHardening(), viscoEPLaw.getConstRefToTractionHardening(), viscoEPLaw.getConstRefToKinematicHardening(), - viscoEPLaw.getViscoElasticNumberOfElement()); + viscoEPLaw.getViscoElasticNumberOfElement(), + viscoEPLaw.getConstRefToMullinsEffect()); this->getRefToTemperature()=Tinitial; }; diff --git a/dG3D/src/dG3DMaterialLaw.cpp b/dG3D/src/dG3DMaterialLaw.cpp index 83a36302c2311349833ab4f8a8f54d45b6a1b92b..e169513e4920b4a204a98a59b76581e1aa733a36 100644 --- a/dG3D/src/dG3DMaterialLaw.cpp +++ b/dG3D/src/dG3DMaterialLaw.cpp @@ -246,7 +246,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 @@ -8324,6 +8324,10 @@ void NonLinearTVEDG3DMaterialLaw::setViscoElasticData(const std::string filename _viscoLaw.setViscoElasticData(filename); }; +void NonLinearTVEDG3DMaterialLaw::setMullinsEffect(const mullinsEffect& mullins){ + _viscoLaw.setMullinsEffect(mullins); +}; + void NonLinearTVEDG3DMaterialLaw::setReferenceTemperature(const double Tref){ _viscoLaw.setReferenceTemperature(Tref); }; @@ -8598,6 +8602,9 @@ void NonLinearTVPDG3DMaterialLaw::setKinematicHardening(const kinematicHardening void NonLinearTVPDG3DMaterialLaw::setViscosityEffect(const viscosityLaw& v, const double p){ _viscoLaw.setViscosityEffect(v,p); }; +void NonLinearTVPDG3DMaterialLaw::setMullinsEffect(const mullinsEffect& mullins){ + _viscoLaw.setMullinsEffect(mullins); +}; void NonLinearTVPDG3DMaterialLaw::setYieldPowerFactor(const double n){ _viscoLaw.setPowerFactor(n); diff --git a/dG3D/src/dG3DMaterialLaw.h b/dG3D/src/dG3DMaterialLaw.h index 0f7b100ab0319f6772afdfc776949952f5c4c202..bfbee81b40323c9cf913860568bdeede4c4a13f8 100644 --- a/dG3D/src/dG3DMaterialLaw.h +++ b/dG3D/src/dG3DMaterialLaw.h @@ -2917,6 +2917,8 @@ class NonLinearTVEDG3DMaterialLaw : public dG3DMaterialLaw{ // public Material void setTemperatureFunction_BranchBulkModuli(const scalarFunction& Tfunc,int i); void setTemperatureFunction_BranchShearModuli(const scalarFunction& Tfunc,int i); void setTemperatureFunction_BranchThermalDilationCoefficient(const scalarFunction& Tfunc,int i); + + void setMullinsEffect(const mullinsEffect& mullins); // For now use these Scalars - Fix by directly adding to constructor /* void setThermalExpansionCoefficient(const double Alpha); // Fix this - for both scalar and tensor @@ -3012,7 +3014,8 @@ class NonLinearTVPDG3DMaterialLaw : public dG3DMaterialLaw{ // public Material void setTractionHardening(const J2IsotropicHardening& trac); void setKinematicHardening(const kinematicHardening& kin); void setViscosityEffect(const viscosityLaw& v, const double p); - + void setMullinsEffect(const mullinsEffect& mullins); + void setYieldPowerFactor(const double n); void nonAssociatedFlowRuleFactor(const double b); void setPlasticPoissonRatio(const double nup);