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