Skip to content
Snippets Groups Projects
Commit f4b92ca8 authored by Julien Leclerc's avatar Julien Leclerc
Browse files

introduce yield offset in ipCoalescence and delete tauMax variable

parent bbbcd809
No related branches found
No related tags found
1 merge request!156Coal jl8
......@@ -141,7 +141,7 @@ IPThomasonCoalescence::IPThomasonCoalescence(): IPCoalescence(),
W(1.), DWDyieldfV(0.), DWDhatD(0.), DWDhatQ(0.), DWDhatP(0.),
lambda(1.), gamma(0.5), DgammaDChi(0),
ChiOnset(0.),WOnset(0.),gammaOnset(0.),
Cft(1000.), DCftDChi(0.), DCftDW(0.), crackOffsetOnCft(1.), tauMax(0.)
Cft(1000.), DCftDChi(0.), DCftDW(0.), crackOffsetOnCft(1.), yieldOffset(0.)
{
};
......@@ -152,7 +152,7 @@ IPThomasonCoalescence::IPThomasonCoalescence(const IPThomasonCoalescence& src):
W(src.W), DWDyieldfV(src.DWDyieldfV), DWDhatD(src.DWDhatD), DWDhatQ(src.DWDhatQ), DWDhatP(src.DWDhatP),
lambda(src.lambda), gamma(src.gamma), DgammaDChi(src.DgammaDChi),
ChiOnset(src.ChiOnset), WOnset(src.WOnset), gammaOnset(src.gammaOnset),
Cft(src.Cft), DCftDChi(src.DCftDChi), DCftDW(src.DCftDW), crackOffsetOnCft(src.crackOffsetOnCft), tauMax(src.tauMax)
Cft(src.Cft), DCftDChi(src.DCftDChi), DCftDW(src.DCftDW), crackOffsetOnCft(src.crackOffsetOnCft), yieldOffset(src.yieldOffset)
{
};
......@@ -188,7 +188,7 @@ IPThomasonCoalescence& IPThomasonCoalescence::operator = (const IPCoalescence& s
DCftDW = psrc->DCftDW;
crackOffsetOnCft = psrc->crackOffsetOnCft;
tauMax = psrc->tauMax;
yieldOffset = psrc->yieldOffset;
}
return *this;
......@@ -222,7 +222,7 @@ void IPThomasonCoalescence::restart(){
restartManager::restart(DCftDChi);
restartManager::restart(DCftDW);
restartManager::restart(crackOffsetOnCft);
restartManager::restart(tauMax);
restartManager::restart(yieldOffset);
};
......
......@@ -168,9 +168,10 @@ protected:
double Cft;
double DCftDChi;
double DCftDW;
// Offset at crack insertion on Cft
double crackOffsetOnCft;
double tauMax;
// Offset and coupling management
double crackOffsetOnCft; // Offset applied on Cft to obtain fT = 0
double yieldOffset; // Yield surface value for the unused plastic mode
public:
......@@ -240,8 +241,8 @@ protected:
virtual double getCrackOffsetOnCft() const {return crackOffsetOnCft;};
virtual double& getRefToCrackOffsetOnCft() {return crackOffsetOnCft;};
virtual double getMaximalTractionStress() const {return tauMax;};
virtual double& getRefToMaximalTractionStress() {return tauMax;};
virtual double getYieldOffset() const {return yieldOffset;};
virtual double& getRefToYieldOffset() {return yieldOffset;};
};
......
......@@ -411,11 +411,6 @@ void mlawNonLocalPorousCoupledLaw::checkCoalescence(IPNonLocalPorosity* q1, cons
sigmax += Norm(i)*kCor(i,j)*Norm(j);
}
}
// update maximal stress -- will be removed soon
//q1Thom->getRefToMaximalTractionStress()= q0Thom->getMaximalTractionStress();
//if (sigmax > q1Thom->getMaximalTractionStress()){
// q1Thom->getRefToMaximalTractionStress() = sigmax;
//}
}
else{
Msg::Fatal("mlawNonLocalPorousCoupledLaw::updatePlasticState: zero normal");
......@@ -432,6 +427,7 @@ void mlawNonLocalPorousCoupledLaw::checkCoalescence(IPNonLocalPorosity* q1, cons
// NB: if _CfTOffsetMethod > 1: fT>0,
// Compute Thomason yield surface
double yieldThomason = _mlawCoales->yieldFunction(kcorEq,pcor,R,yieldfV,q0,q1,T);
q1Thom->getRefToYieldOffset() = yieldThomason;
// Offset management
if(_CfTOffsetMethod == 2 or _CfTOffsetMethod == 3){
......@@ -502,16 +498,18 @@ void mlawNonLocalPorousCoupledLaw::checkCoalescence(IPNonLocalPorosity* q1, cons
// Determine which mode should be used for the next time step.
if(!q0Thom->getCoalescenceOnsetFlag()){
// First time that coalescence is detected: Thomason == ON
// This case is only appearing with with selective update
q1Thom->getRefToCoalescenceActiveFlag() = true;
q1Thom->getRefToAccelerateRate() = 1.0;
q1Thom->getRefToYieldOffset() = _mlawGrowth->yieldFunction(kcorEq,pcor,R,yieldfV,q0,q1,T);
}
else{
// Not the first time that coalescence appears
if (q0Thom->getCoalescenceActiveFlag()){
// If Thomason is/was used for this time step : check if Gurson is more restrictive
double yieldGurson = _mlawGrowth->yieldFunction(kcorEq,pcor,R,yieldfV,q0,q1,T);
if(yieldGurson > _tol){
Msg::Info("Change yield surface to Gurson fG =%e",yieldGurson);
q1Thom->getRefToYieldOffset() = _mlawGrowth->yieldFunction(kcorEq,pcor,R,yieldfV,q0,q1,T);
if(q1Thom->getYieldOffset() > _tol){
Msg::Info("Change yield surface to Gurson fG =%e",q1Thom->getYieldOffset());
q1Thom->getRefToCoalescenceActiveFlag() = false; // Gurson will be used at the next time step
q1Thom->getRefToAccelerateRate() = 1.0;
}
......@@ -522,14 +520,14 @@ void mlawNonLocalPorousCoupledLaw::checkCoalescence(IPNonLocalPorosity* q1, cons
}
else{
// If Gurson was/is used for this time step : check if Thomason is more restrictive
double yieldThomason = _mlawCoales->yieldFunction(kcorEq,pcor,R,yieldfV,q0,q1,T);
if(yieldThomason > _tol ){
Msg::Info("Change yield surface to Thomason fT = %e",yieldThomason);
q1Thom->getRefToYieldOffset() = _mlawCoales->yieldFunction(kcorEq,pcor,R,yieldfV,q0,q1,T);
if(q1Thom->getYieldOffset() > _tol ){
Msg::Info("Change yield surface to Thomason fT = %e",q1Thom->getYieldOffset());
q1Thom->getRefToCoalescenceActiveFlag() = true; // Thomason will be used at the next time step
q1Thom->getRefToAccelerateRate() = 1.0;
if (_CfTOffsetMethod == 3){
q1Thom->getRefToCrackOffsetOnCft() = q0Thom->getCrackOffsetOnCft() + yieldThomason*R0/(Cft*R);
q1Thom->getRefToCrackOffsetOnCft() = q0Thom->getCrackOffsetOnCft() + q1Thom->getYieldOffset()*R0/(Cft*R);
if (q1Thom->getRefToCrackOffsetOnCft() > 2.){Msg::Error("High predicted value of Cft Offset = %e",q1Thom->getRefToCrackOffsetOnCft());};
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment