diff --git a/NonLinearSolver/internalPoints/ipNucleation.h b/NonLinearSolver/internalPoints/ipNucleation.h index cc3273b5a0f70de4e4a4bc80beb531169603fe24..7382f614e945067c19d6f2446e9806eebb3bfd56 100644 --- a/NonLinearSolver/internalPoints/ipNucleation.h +++ b/NonLinearSolver/internalPoints/ipNucleation.h @@ -39,6 +39,12 @@ class IPNucleation{ virtual double& getRefToNucleatedPorosity() {return nucleatedfV;}; virtual double& getRefToNucleatedPorosityIncrement() {return DeltafV;}; virtual double& getRefToDNucleatedPorosityDMatrixPlasticDeformation() {return DDeltafVDHatP;}; + + virtual void resetNucleation(const IPNucleation& ipv) { + nucleatedfV = ipv.nucleatedfV; + DeltafV = 0.; + DDeltafVDHatP = 0.; + }; }; class IPLinearNucleationRate : public IPNucleation{ diff --git a/NonLinearSolver/internalPoints/ipVoidState.cpp b/NonLinearSolver/internalPoints/ipVoidState.cpp index 49020c96a7f99a1b2031bb37d4895e8af0b6b58a..c3cfce6975e39a903180f8fa5b28c9938ed7d56e 100644 --- a/NonLinearSolver/internalPoints/ipVoidState.cpp +++ b/NonLinearSolver/internalPoints/ipVoidState.cpp @@ -15,16 +15,21 @@ #include <math.h> IPSphericalVoidState::IPSphericalVoidState(const double fV0, const double lambda0): - Chi(pow(1.5*fV0*lambda0,1./3.)),DChiDyieldfV(0.),DChiDhatQ(0.),DChiDhatD(0.),DChiDhatP(0.),lambda(lambda0){ + Chi(pow(1.5*fV0*lambda0,1./3.)),DChiDyieldfV(0.),DChiDhatQ(0.),DChiDhatD(0.),DChiDhatP(0.),lambda(lambda0) +{ + roughChi = Chi; } IPSphericalVoidState::IPSphericalVoidState(const IPSphericalVoidState& src): IPVoidState(src), - Chi(src.Chi),DChiDyieldfV(src.DChiDyieldfV),DChiDhatQ(src.DChiDhatQ),DChiDhatD(src.DChiDhatD),DChiDhatP(src.DChiDhatP),lambda(src.lambda){} + Chi(src.Chi),DChiDyieldfV(src.DChiDyieldfV),DChiDhatQ(src.DChiDhatQ),DChiDhatD(src.DChiDhatD),DChiDhatP(src.DChiDhatP),lambda(src.lambda), + roughChi(src.roughChi){} IPSphericalVoidState& IPSphericalVoidState::operator =(const IPVoidState& src){ IPVoidState::operator =(src); const IPSphericalVoidState* psrc = dynamic_cast<const IPSphericalVoidState*>(&src); - if (psrc != NULL){ + if (psrc != NULL) + { + roughChi = psrc->roughChi; Chi = psrc->Chi; DChiDyieldfV = psrc->DChiDyieldfV; DChiDhatQ = psrc->DChiDhatQ; @@ -36,6 +41,7 @@ IPSphericalVoidState& IPSphericalVoidState::operator =(const IPVoidState& src){ }; void IPSphericalVoidState::restart(){ + restartManager::restart(roughChi); restartManager::restart(Chi); restartManager::restart(DChiDyieldfV); restartManager::restart(DChiDhatD); @@ -49,16 +55,20 @@ IPSpheroidalVoidState::IPSpheroidalVoidState(const double fV0, const double lamb Chi(pow(3.*gamma0*fV0*lambda0/W0,1./3.)),DChiDyieldfV(0.),DChiDhatQ(0.),DChiDhatD(0.),DChiDhatP(0.), W(W0),DWDyieldfV(0.),DWDhatQ(0.),DWDhatD(0.),DWDhatP(0.), gamma(gamma0),DgammaDyieldfV(0.),DgammaDhatQ(0.),DgammaDhatD(0.),DgammaDhatP(0.), - lambda(lambda0){} + lambda(lambda0) +{ + roughChi = Chi; +} IPSpheroidalVoidState::IPSpheroidalVoidState(const IPSpheroidalVoidState& src):IPVoidState(src), Chi(src.Chi),DChiDyieldfV(src.DChiDyieldfV),DChiDhatQ(src.DChiDhatQ),DChiDhatD(src.DChiDhatD),DChiDhatP(src.DChiDhatP), W(src.W),DWDyieldfV(src.DWDyieldfV),DWDhatQ(src.DWDhatQ),DWDhatD(src.DWDhatD),DWDhatP(src.DWDhatP), gamma(src.gamma),DgammaDyieldfV(src.DgammaDyieldfV),DgammaDhatQ(src.DgammaDhatQ),DgammaDhatD(src.DgammaDhatD),DgammaDhatP(src.DgammaDhatP), - lambda(src.lambda){}; + lambda(src.lambda),roughChi(src.roughChi){}; IPSpheroidalVoidState& IPSpheroidalVoidState::operator =(const IPVoidState& src){ IPVoidState::operator =(src); const IPSpheroidalVoidState* psrc = dynamic_cast<const IPSpheroidalVoidState*>(&src); if (psrc != NULL){ + roughChi = psrc->roughChi; Chi = psrc->Chi; DChiDyieldfV = psrc->DChiDyieldfV; DChiDhatQ = psrc->DChiDhatQ; @@ -80,7 +90,7 @@ IPSpheroidalVoidState& IPSpheroidalVoidState::operator =(const IPVoidState& src) }; void IPSpheroidalVoidState::restart(){ - + restartManager::restart(roughChi); restartManager::restart(Chi); restartManager::restart(DChiDyieldfV); restartManager::restart(DChiDhatD); diff --git a/NonLinearSolver/internalPoints/ipVoidState.h b/NonLinearSolver/internalPoints/ipVoidState.h index aed88ceaebee31ef5b6005f4ce81d904ac2e010d..bbeac3264220b54b68f6ace6b6a368cef260ab4e 100644 --- a/NonLinearSolver/internalPoints/ipVoidState.h +++ b/NonLinearSolver/internalPoints/ipVoidState.h @@ -27,18 +27,21 @@ class IPVoidState{ virtual void restart() = 0; // Geometrical parameters and their derivatives + virtual double getRoughVoidLigamentRatio() const =0; + virtual double& getRefToRoughVoidLigamentRatio() =0; + virtual double getVoidLigamentRatio() const = 0; virtual double getDVoidLigamentRatioDYieldPorosity() const = 0; virtual double getDVoidLigamentRatioDVolumetricPlasticDeformation() const =0; virtual double getDVoidLigamentRatioDDeviatoricPlasticDeformation() const =0; virtual double getDVoidLigamentRatioDMatrixPlasticDeformation() const =0; - + virtual double& getRefToVoidLigamentRatio() =0; virtual double& getRefToDVoidLigamentRatioDYieldPorosity() =0; virtual double& getRefToDVoidLigamentRatioDVolumetricPlasticDeformation() =0; virtual double& getRefToDVoidLigamentRatioDDeviatoricPlasticDeformation() =0; virtual double& getRefToDVoidLigamentRatioDMatrixPlasticDeformation() =0; - + virtual double getVoidAspectRatio() const =0; virtual double getDVoidAspectRatioDYieldPorosity() const =0; virtual double getDVoidAspectRatioDVolumetricPlasticDeformation() const =0; @@ -81,12 +84,16 @@ class IPNoVoidState : public IPVoidState{ virtual void restart() {}; // Geometrical parameters and their derivatives + virtual double getRoughVoidLigamentRatio() const {return 0.;}; + virtual double& getRefToRoughVoidLigamentRatio() {Msg::Error("IPNoVoidState::getRefToRoughVoidLigamentRatio cannot be used");}; + virtual double getVoidLigamentRatio() const {return 0.;}; virtual double getDVoidLigamentRatioDYieldPorosity() const {return 0.;}; virtual double getDVoidLigamentRatioDVolumetricPlasticDeformation() const {return 0.;};; virtual double getDVoidLigamentRatioDDeviatoricPlasticDeformation() const {return 0.;};; virtual double getDVoidLigamentRatioDMatrixPlasticDeformation() const {return 0.;};; - + + virtual double& getRefToVoidLigamentRatio() {Msg::Error("IPNoVoidState::getRefToVoidLigamentRatio cannot be used");}; virtual double& getRefToDVoidLigamentRatioDYieldPorosity() {Msg::Error("IPNoVoidState::getRefToDVoidLigamentRatioDYieldPorosity cannot be used");}; virtual double& getRefToDVoidLigamentRatioDVolumetricPlasticDeformation() {Msg::Error("IPNoVoidState::getRefToDVoidLigamentRatioDVolumetricPlasticDeformation cannot be used");}; @@ -127,6 +134,7 @@ class IPSphericalVoidState : public IPVoidState{ protected: // Geometrical parameters and their derivatives // Ligament ratio + double roughChi; double Chi; double DChiDyieldfV; double DChiDhatD; @@ -145,6 +153,9 @@ class IPSphericalVoidState : public IPVoidState{ virtual IPVoidState* clone() const {return new IPSphericalVoidState(*this);}; virtual void restart(); + virtual double getRoughVoidLigamentRatio() const {return roughChi;}; + virtual double& getRefToRoughVoidLigamentRatio() {return roughChi;}; + // Geometrical parameters and their derivatives virtual double getVoidLigamentRatio() const {return Chi;}; virtual double getDVoidLigamentRatioDYieldPorosity() const {return DChiDyieldfV;}; @@ -190,6 +201,7 @@ class IPSpheroidalVoidState : public IPVoidState{ protected: // Geometrical parameters and their derivatives // Ligament ratio + double roughChi; double Chi; double DChiDyieldfV; double DChiDhatD; @@ -221,6 +233,9 @@ class IPSpheroidalVoidState : public IPVoidState{ virtual IPVoidState* clone() const {return new IPSpheroidalVoidState(*this);}; virtual void restart(); + virtual double getRoughVoidLigamentRatio() const {return roughChi;}; + virtual double& getRefToRoughVoidLigamentRatio() {return roughChi;}; + // Geometrical parameters and their derivatives virtual double getVoidLigamentRatio() const {return Chi;}; virtual double getDVoidLigamentRatioDYieldPorosity() const {return DChiDyieldfV;}; diff --git a/NonLinearSolver/materialLaw/mlawNonLocalDamageGurson.cpp b/NonLinearSolver/materialLaw/mlawNonLocalDamageGurson.cpp index 4c2ef3395046814be0c5fa210bb49f87555824b9..b280d93b88eade0c8915aee0ccd193d9b75da73d 100644 --- a/NonLinearSolver/materialLaw/mlawNonLocalDamageGurson.cpp +++ b/NonLinearSolver/materialLaw/mlawNonLocalDamageGurson.cpp @@ -29,9 +29,6 @@ mlawNonLocalDamageGurson::mlawNonLocalDamageGurson(const int num,const double E, if (_correctedRegularizedFunction != NULL) delete _correctedRegularizedFunction; _correctedRegularizedFunction = new fourVariableExponentialSaturationScalarFunction(1.e-6, 1.e-8, 0.98*_fV_failure,0.999*_fV_failure); - if (_localRegularizedFunction != NULL) delete _localRegularizedFunction; - _localRegularizedFunction = new fourVariableExponentialSaturationScalarFunction(1.e-6, 1.e-8, 0.9*_localfVFailure,0.999*_localfVFailure); - _failedTol = 0.995; _temFunc_q1 = new constantScalarFunction(1.); @@ -249,15 +246,13 @@ void mlawNonLocalDamageGurson::plasticFlowDerivatives( fullVector<double>& gradN }; -void mlawNonLocalDamageGurson::computeResidual(SVector3& res, STensor3& J, +void mlawNonLocalDamageGurson::computeResidual_NonLocalPorosity(SVector3& res, STensor3& J, const double kcorEqpr, const double pcorpr, const double R, const double H, - const double yieldfV, const double DyieldfVDfV, + const double yieldfV, const IPNonLocalPorosity *q0, const IPNonLocalPorosity* q1, const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, // 3 unknonwn - const double DeltafV, const double DDeltafVDDeltaHatD, const double DDeltafVDDeltaHatQ, const double DDeltafVDDeltaHatP, - const double* T - ) const{ - + const double* T) const +{ double f0 = q1->getInitialPorosity(); double R0 = _j2IH->getYield0(); // reference value @@ -291,44 +286,41 @@ void mlawNonLocalDamageGurson::computeResidual(SVector3& res, STensor3& J, computeYieldDerivatives(gradf,kcorEq,pcor,R,yieldfV,T); plasticFlowDerivatives(gradNs,gradNv,kcorEq,pcor,R,yieldfV,T); - double Dres0DfV = gradf(3)*DyieldfVDfV; - double Dres1DfV = R0*(DeltaHatD*gradNv(3)- DeltaHatQ*gradNs(3))*DyieldfVDfV; - double Dres2DfV = 0.; - // Dres0DDeltaHatD - J(0,0) = gradf(0)*DkcorEqDDeltaHatD + Dres0DfV*DDeltafVDDeltaHatD; + J(0,0) = gradf(0)*DkcorEqDDeltaHatD; // Dres0DDeltaHatQ - J(0,1) = gradf(1)*DpcorDDeltaHatQ + Dres0DfV*DDeltafVDDeltaHatQ; + J(0,1) = gradf(1)*DpcorDDeltaHatQ; // Dres0DDeltaHatP - J(0,2) = gradf(2)*H + Dres0DfV*DDeltafVDDeltaHatP; + J(0,2) = gradf(2)*H; // Dres1DDeltaHatD - J(1,0) = R0*(Nv + DeltaHatD*gradNv(0)*DkcorEqDDeltaHatD - DeltaHatQ*gradNs(0)*DkcorEqDDeltaHatD) + Dres1DfV*DDeltafVDDeltaHatD; + J(1,0) = R0*(Nv + DeltaHatD*gradNv(0)*DkcorEqDDeltaHatD - DeltaHatQ*gradNs(0)*DkcorEqDDeltaHatD); // Dres1DDeltaHatQ - J(1,1) = R0*(DeltaHatD*gradNv(1)*DpcorDDeltaHatQ- Ns - DeltaHatQ*gradNs(1)*DpcorDDeltaHatQ) + Dres1DfV*DDeltafVDDeltaHatQ; + J(1,1) = R0*(DeltaHatD*gradNv(1)*DpcorDDeltaHatQ- Ns - DeltaHatQ*gradNs(1)*DpcorDDeltaHatQ); // Dres1DDeltaHatP - J(1,2) = R0*(DeltaHatD*gradNv(2) - DeltaHatQ*gradNs(2))*H + Dres1DfV*DDeltafVDDeltaHatP; + J(1,2) = R0*(DeltaHatD*gradNv(2) - DeltaHatQ*gradNs(2))*H; // Dres2DDeltaHatd - J(2,0) = (-kcorEq - DkcorEqDDeltaHatD*DeltaHatD)/R0 + Dres2DfV*DDeltafVDDeltaHatD; + J(2,0) = (-kcorEq - DkcorEqDDeltaHatD*DeltaHatD)/R0; // Dres2DDeltaHatq - J(2,1) = (-pcor - DpcorDDeltaHatQ*DeltaHatQ)/R0 + Dres2DfV*DDeltafVDDeltaHatQ; + J(2,1) = (-pcor - DpcorDDeltaHatQ*DeltaHatQ)/R0; // Dres2DDeltaHatp - J(2,2) = (1-f0)*(R + H*DeltaHatP)/R0+ Dres2DfV*DDeltafVDDeltaHatP; + J(2,2) = (1-f0)*(R + H*DeltaHatP)/R0; }; -void mlawNonLocalDamageGurson::computeDResidual(STensor3 &dres0dEpr, STensor3 &dres1dEpr, STensor3 &dres2dEpr, - double &dres0dtildefV, double &dres1dtildefV, double &dres2dtildefV, - const STensor3& devKcorpr, const double kcorEqpr, const double pcorpr, const double R, - const double yieldfV, const double DyieldfVDfV, const double DyieldfVDtildefV, - const STensor3& DDeltafVDEpr, const STensor43& DdevKcorprDEpr, const STensor3& DpcorprDEpr, - const IPNonLocalPorosity *q0, const IPNonLocalPorosity* q1, - const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, - const double* T, const double* DRDT, - const STensor3* DdevKcorprDT , const double* DpcorprDT, const double* DDeltafVDT, - double *dres0dT, double *dres1dT, double *dres2dT - ) const{ +void mlawNonLocalDamageGurson::computeDResidual_NonLocalPorosity(STensor3 &dres0dEpr, STensor3 &dres1dEpr, STensor3 &dres2dEpr, + double &dres0dtildefV, double &dres1dtildefV, double &dres2dtildefV, + const STensor3& devKcorpr, const double kcorEqpr, const double pcorpr, const double R, + const double yieldfV, const STensor3& DyieldfVDKcorpr, const double DyieldfVDtildefV, + const STensor43& DKcorprDEpr, const STensor43& DdevKcorprDEpr, const STensor3& DpcorprDEpr, + const IPNonLocalPorosity *q0, const IPNonLocalPorosity* q1, + const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, + const double* T , const double* DRDT, + const STensor3* DdevKcorprDT , const double* DpcorprDT, const STensor3* DKcorprDT, + double *dres0dT, double *dres1dT, double *dres2dT + ) const +{ double f0 = q1->getInitialPorosity(); double R0 = _j2IH->getYield0(); // reference value @@ -339,6 +331,9 @@ void mlawNonLocalDamageGurson::computeDResidual(STensor3 &dres0dEpr, STensor3 &d KT=bulkModulus(*T); muT=shearModulus(*T); } + + static STensor3 DyieldfVDEpr; + STensorOperation::multSTensor3STensor43(DyieldfVDKcorpr,DKcorprDEpr,DyieldfVDEpr); static STensor3 DkcorEqprDEpr; STensorOperation::multSTensor3STensor43(devKcorpr,DdevKcorprDEpr,DkcorEqprDEpr); @@ -359,21 +354,21 @@ void mlawNonLocalDamageGurson::computeDResidual(STensor3 &dres0dEpr, STensor3 &d // compute Dres0DEpr double Dres0DkcorEq = gradf(0); double Dres0Dpcor = gradf(1); - double Dres0DDeltafV = gradf(3)*DyieldfVDfV; + double Dres0DyieldfV = gradf(3); dres0dEpr = DkcorEqDEpr; dres0dEpr*= Dres0DkcorEq; dres0dEpr.daxpy(DpcorDEpr,Dres0Dpcor); - dres0dEpr.daxpy(DDeltafVDEpr,Dres0DDeltafV); + dres0dEpr.daxpy(DyieldfVDEpr,Dres0DyieldfV); // compute Dres1DEpr double Dres1DkcorEq = R0*(DeltaHatD*gradNv(0)- DeltaHatQ*gradNs(0)); double Dres1Dpcor = R0*(DeltaHatD*gradNv(1)- DeltaHatQ*gradNs(1)); - double Dres1DDeltafV = R0*(DeltaHatD*gradNv(3)- DeltaHatQ*gradNs(3))*DyieldfVDfV; + double Dres1DyieldfV = R0*(DeltaHatD*gradNv(3)- DeltaHatQ*gradNs(3)); dres1dEpr = DkcorEqDEpr; dres1dEpr *= Dres1DkcorEq; dres1dEpr.daxpy(DpcorDEpr,Dres1Dpcor); - dres1dEpr.daxpy(DDeltafVDEpr,Dres1DDeltafV); + dres1dEpr.daxpy(DyieldfVDEpr,Dres1DyieldfV); // compute Dres2DEpr double Dres2DkcorEq = (-DeltaHatD)/R0; @@ -392,31 +387,41 @@ void mlawNonLocalDamageGurson::computeDResidual(STensor3 &dres0dEpr, STensor3 &d double dKdT=bulkModulusDerivative(*T); double dmudT=shearModulusDerivative(*T); - static double DkcorEqDT, DpcorDT; + static double DkcorEqDT, DpcorDT, DyieldfVDT; DkcorEqDT = STensorOperation::doubledot(devKcorpr,*DdevKcorprDT)*1.5/kcorEqpr - 3.*dmudT*DeltaHatD; DpcorDT = *DpcorprDT -dKdT* DeltaHatQ; - - + DyieldfVDT = STensorOperation::doubledot(DyieldfVDKcorpr,*DKcorprDT); + double partDres0DT = gradf(2)*(*DRDT) + gradf(4); // yield temperature-dependent - *dres0dT = Dres0DkcorEq*DkcorEqDT + Dres0Dpcor*DpcorDT + partDres0DT; + *dres0dT = Dres0DkcorEq*DkcorEqDT + Dres0Dpcor*DpcorDT + Dres0DyieldfV*DyieldfVDT + partDres0DT; double partDres1DT = R0*(DeltaHatD*gradNv(2)- DeltaHatQ*gradNs(2))*(*DRDT) + R0*(DeltaHatD*gradNv(4)- DeltaHatQ*gradNs(4)); - *dres1dT = Dres1DkcorEq*DkcorEqDT + Dres1Dpcor*DpcorDT + partDres1DT; + *dres1dT = Dres1DkcorEq*DkcorEqDT + Dres1Dpcor*DpcorDT + Dres1DyieldfV*DyieldfVDT + partDres1DT; double partDres2DT = ((1-f0)*(*DRDT)*DeltaHatP)/R0; - *dres2dT = Dres2DkcorEq*DkcorEqDT + Dres2Dpcor*DpcorDT+ partDres2DT; + *dres2dT = Dres2DkcorEq*DkcorEqDT + Dres2Dpcor*DpcorDT + partDres2DT; } }; +void mlawNonLocalDamageGurson::computeResidual_multipleNonLocalVariables(SVector3& res, STensor3& J, + const double kcorEqpr, const double pcorpr, const double R, const double H, + const double yieldfV, + const IPNonLocalPorosity *q0, const IPNonLocalPorosity* q1, + const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, // 3 unknonwn + const double* T + ) const{ + computeResidual_NonLocalPorosity(res,J,kcorEqpr,pcorpr,R,H,yieldfV,q0,q1,DeltaHatD,DeltaHatQ,DeltaHatP,T); +}; + void mlawNonLocalDamageGurson::computeDResidual_multipleNonLocalVariables(STensor3 &dres0dEpr, STensor3 &dres1dEpr, STensor3 &dres2dEpr, - std::vector<double> &dres0dtildefV, std::vector<double> &dres1dtildefV, std::vector<double> &dres2dtildefV, + std::vector<double> &Dres0DNonlocalVars, std::vector<double> &Dres1DNonlocalVars, std::vector<double> &Dres2DNonlocalVars, const STensor3& devKcorpr, const double kcorEqpr, const double pcorpr, const double R, - const double yieldfV, const double DyieldfVDfV, const std::vector<double>& DyieldfVDtildefV, - const STensor3& DDeltafVDEpr, const STensor43& DdevKcorprDEpr, const STensor3& DpcorprDEpr, + const double yieldfV, const STensor3& DyieldfVDKcorpr, const std::vector<double>& DyieldfVDNonlocalVars, + const STensor43& DKcorprDEpr, const STensor43& DdevKcorprDEpr, const STensor3& DpcorprDEpr, const IPNonLocalPorosity *q0, const IPNonLocalPorosity* q1, const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, const double* T, const double* DRDT, - const STensor3* DdevKcorprDT , const double* DpcorprDT, const double* DDeltafVDT, + const STensor3* DdevKcorprDT , const double* DpcorprDT, const STensor3* DKcorprVDT, double *dres0dT, double *dres1dT, double *dres2dT ) const{ @@ -429,6 +434,9 @@ void mlawNonLocalDamageGurson::computeDResidual_multipleNonLocalVariables(STenso KT=bulkModulus(*T); muT=shearModulus(*T); } + + static STensor3 DyieldfVDEpr; + STensorOperation::multSTensor3STensor43(DyieldfVDKcorpr,DKcorprDEpr,DyieldfVDEpr); static STensor3 DkcorEqprDEpr; STensorOperation::multSTensor3STensor43(devKcorpr,DdevKcorprDEpr,DkcorEqprDEpr); @@ -449,21 +457,21 @@ void mlawNonLocalDamageGurson::computeDResidual_multipleNonLocalVariables(STenso // compute Dres0DEpr double Dres0DkcorEq = gradf(0); double Dres0Dpcor = gradf(1); - double Dres0DDeltafV = gradf(3)*DyieldfVDfV; + double Dres0DyieldfV = gradf(3); dres0dEpr = DkcorEqDEpr; dres0dEpr*= Dres0DkcorEq; dres0dEpr.daxpy(DpcorDEpr,Dres0Dpcor); - dres0dEpr.daxpy(DDeltafVDEpr,Dres0DDeltafV); + dres0dEpr.daxpy(DyieldfVDEpr,Dres0DyieldfV); // compute Dres1DEpr double Dres1DkcorEq = R0*(DeltaHatD*gradNv(0)- DeltaHatQ*gradNs(0)); double Dres1Dpcor = R0*(DeltaHatD*gradNv(1)- DeltaHatQ*gradNs(1)); - double Dres1DDeltafV = R0*(DeltaHatD*gradNv(3)- DeltaHatQ*gradNs(3))*DyieldfVDfV; + double Dres1DyieldfV = R0*(DeltaHatD*gradNv(3)- DeltaHatQ*gradNs(3)); dres1dEpr = DkcorEqDEpr; dres1dEpr *= Dres1DkcorEq; dres1dEpr.daxpy(DpcorDEpr,Dres1Dpcor); - dres1dEpr.daxpy(DDeltafVDEpr,Dres1DDeltafV); + dres1dEpr.daxpy(DyieldfVDEpr,Dres1DyieldfV); // compute Dres2DEpr double Dres2DkcorEq = (-DeltaHatD)/R0; @@ -475,9 +483,9 @@ void mlawNonLocalDamageGurson::computeDResidual_multipleNonLocalVariables(STenso // compute nonlocal derivative for (int i=0; i< _numNonLocalVar; i++){ - dres0dtildefV[i] = gradf(3)*DyieldfVDtildefV[i]; - dres1dtildefV[i] = R0*(DeltaHatD*gradNv(3)- DeltaHatQ*gradNs(3))*DyieldfVDtildefV[i]; - dres2dtildefV[i] = 0.; + Dres0DNonlocalVars[i] = gradf(3)*DyieldfVDNonlocalVars[i]; + Dres1DNonlocalVars[i] = R0*(DeltaHatD*gradNv(3)- DeltaHatQ*gradNs(3))*DyieldfVDNonlocalVars[i]; + Dres2DNonlocalVars[i] = 0.; } if (isThermomechanicallyCoupled()){ @@ -487,19 +495,88 @@ void mlawNonLocalDamageGurson::computeDResidual_multipleNonLocalVariables(STenso static double DkcorEqDT, DpcorDT; DkcorEqDT = STensorOperation::doubledot(devKcorpr,*DdevKcorprDT)*1.5/kcorEqpr - 3.*dmudT*DeltaHatD; DpcorDT = *DpcorprDT -dKdT* DeltaHatQ; - + + double DyieldfVDT = STensorOperation::doubledot(DyieldfVDKcorpr,*DKcorprVDT); double partDres0DT = gradf(2)*(*DRDT) + gradf(4); // yield temperature-dependent - *dres0dT = Dres0DkcorEq*DkcorEqDT + Dres0Dpcor*DpcorDT + partDres0DT; + *dres0dT = Dres0DkcorEq*DkcorEqDT + Dres0Dpcor*DpcorDT + Dres0DyieldfV*DyieldfVDT + partDres0DT; double partDres1DT = R0*(DeltaHatD*gradNv(2)- DeltaHatQ*gradNs(2))*(*DRDT) + R0*(DeltaHatD*gradNv(4)- DeltaHatQ*gradNs(4)); - *dres1dT = Dres1DkcorEq*DkcorEqDT + Dres1Dpcor*DpcorDT + partDres1DT; + *dres1dT = Dres1DkcorEq*DkcorEqDT + Dres1Dpcor*DpcorDT + Dres0DyieldfV*DyieldfVDT + partDres1DT; double partDres2DT = ((1-f0)*(*DRDT)*DeltaHatP)/R0; *dres2dT = Dres2DkcorEq*DkcorEqDT + Dres2Dpcor*DpcorDT+ partDres2DT; } }; +void mlawNonLocalDamageGurson::computeResidualLocal(SVector3& res, STensor3& J, + const double kcorEqpr, const double pcorpr, const double R, const double H, + const double yieldfV, const double DyieldfVDfV, + const IPNonLocalPorosity *q0, const IPNonLocalPorosity* q1, + const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, // 3 unknonwn + const double DDeltafVDDeltaHatD, const double DDeltafVDDeltaHatQ, const double DDeltafVDDeltaHatP, + const double* T) const +{ + double f0 = q1->getInitialPorosity(); + double R0 = _j2IH->getYield0(); // reference value + + double KT= _K; + double muT = _mu; + if (isThermomechanicallyCoupled()){ + KT = bulkModulus(*T); + muT =shearModulus(*T); + }; + + // corrected value + double kcorEq = kcorEqpr - 3.*muT*DeltaHatD; + double pcor = pcorpr - KT*DeltaHatQ; + + // yield + res(0) = yieldFunction(kcorEq,pcor,R,yieldfV,q0,q1,T); + + double Ns, Nv; // plastic flow components + plasticFlow(Ns,Nv,kcorEq,pcor,R,yieldfV,T); + // normality + res(1) = R0*(DeltaHatD*Nv- DeltaHatQ*Ns); + + // plastic energy balance + res(2) = ((1-f0)*R*DeltaHatP - kcorEq*DeltaHatD - pcor*DeltaHatQ)/R0; + + + double DkcorEqDDeltaHatD = -3.*muT; + double DpcorDDeltaHatQ = -KT; + + static fullVector<double> gradf, gradNs, gradNv; + computeYieldDerivatives(gradf,kcorEq,pcor,R,yieldfV,T); + plasticFlowDerivatives(gradNs,gradNv,kcorEq,pcor,R,yieldfV,T); + + double Dres0DfV = gradf(3)*DyieldfVDfV; + double Dres1DfV = R0*(DeltaHatD*gradNv(3)- DeltaHatQ*gradNs(3))*DyieldfVDfV; + double Dres2DfV = 0.; + + // Dres0DDeltaHatD + J(0,0) = gradf(0)*DkcorEqDDeltaHatD + Dres0DfV*DDeltafVDDeltaHatD; + // Dres0DDeltaHatQ + J(0,1) = gradf(1)*DpcorDDeltaHatQ + Dres0DfV*DDeltafVDDeltaHatQ; + // Dres0DDeltaHatP + J(0,2) = gradf(2)*H + Dres0DfV*DDeltafVDDeltaHatP; + + // Dres1DDeltaHatD + J(1,0) = R0*(Nv + DeltaHatD*gradNv(0)*DkcorEqDDeltaHatD - DeltaHatQ*gradNs(0)*DkcorEqDDeltaHatD) + Dres1DfV*DDeltafVDDeltaHatD; + // Dres1DDeltaHatQ + J(1,1) = R0*(DeltaHatD*gradNv(1)*DpcorDDeltaHatQ- Ns - DeltaHatQ*gradNs(1)*DpcorDDeltaHatQ) + Dres1DfV*DDeltafVDDeltaHatQ; + // Dres1DDeltaHatP + J(1,2) = R0*(DeltaHatD*gradNv(2) - DeltaHatQ*gradNs(2))*H + Dres1DfV*DDeltafVDDeltaHatP; + + // Dres2DDeltaHatd + J(2,0) = (-kcorEq - DkcorEqDDeltaHatD*DeltaHatD)/R0 + Dres2DfV*DDeltafVDDeltaHatD; + // Dres2DDeltaHatq + J(2,1) = (-pcor - DpcorDDeltaHatQ*DeltaHatQ)/R0 + Dres2DfV*DDeltafVDDeltaHatQ; + // Dres2DDeltaHatp + J(2,2) = (1-f0)*(R + H*DeltaHatP)/R0+ Dres2DfV*DDeltafVDDeltaHatP; + +}; + void mlawNonLocalDamageGurson::computeDResidualLocal(STensor3 &dres0dEpr, STensor3 &dres1dEpr, STensor3 &dres2dEpr, const STensor3& devKcorpr, const double kcorEqpr, const double pcorpr, const double R, const double yieldfV, const double DyieldfVDfV, @@ -591,17 +668,6 @@ double mlawNonLocalDamageGurson::getOnsetCriterion(const IPNonLocalPorosity* q1) }; -void mlawNonLocalDamageGurson::nucleation(const double p1, const double p0, const double f0, IPNonLocalPorosity* q1, const IPNonLocalPorosity *q0) const{ - // Update nucleation state - for (int i = 0; i < _gdnLawContainer.size(); i++){ - // Get IpNucl - const IPNucleation& ipvnucprev = q0->getConstRefToIPNucleation(i); - IPNucleation& ipvnuc = q1->getRefToIPNucleation(i); - // Compute... - _gdnLawContainer[i]->nucleate(p1,p0,f0,ipvnucprev,ipvnuc); - } -}; - void mlawNonLocalDamageGurson::checkCoalescence(IPNonLocalPorosity* q1, const IPNonLocalPorosity *q0, const double *T) const{ // check coalescence _coalescenceLaw->checkCoalescence(q0,q1,&q0->getConstRefToIPCoalescence(),&q1->getRefToIPCoalescence()); diff --git a/NonLinearSolver/materialLaw/mlawNonLocalDamageGurson.h b/NonLinearSolver/materialLaw/mlawNonLocalDamageGurson.h index 6a8f0cf8d92aedb1b98a1133a666a12c694a5b4a..cfe467bfb5cab2e029541afcff983e25449f3611 100644 --- a/NonLinearSolver/materialLaw/mlawNonLocalDamageGurson.h +++ b/NonLinearSolver/materialLaw/mlawNonLocalDamageGurson.h @@ -83,28 +83,35 @@ class mlawNonLocalDamageGurson : public mlawNonLocalPorosity virtual double yieldFunction(const double kcorEq, const double pcor, const double R, const double yieldfV, const IPNonLocalPorosity* q0, const IPNonLocalPorosity* q1, const double* T = NULL) const; - virtual void computeResidual(SVector3& res, STensor3& J, + virtual void computeResidual_NonLocalPorosity(SVector3& res, STensor3& J, const double kcorEqpr, const double pcorpr, const double R, const double H, - const double yieldfV, const double DyieldfVDfV, + const double yieldfV, const IPNonLocalPorosity *q0, const IPNonLocalPorosity* q1, const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, // 3 unknonwn - const double DeltafV, const double DDeltafVDDeltaHatD, const double DDeltafVDDeltaHatQ, const double DDeltafVDDeltaHatP, const double* T = NULL ) const; - virtual void computeDResidual(STensor3 &dres0dEpr, STensor3 &dres1dEpr, STensor3 &dres2dEpr, - double &dres0dtildefV, double &dres1dtildefV, double &dres2dtildefV, - const STensor3& devKcorpr, const double kcorEqpr, const double pcorpr, const double R, - const double yieldfV, const double DyieldfVDfV, const double DyieldfVDtildefV, - const STensor3& DDeltafVDEpr, const STensor43& DdevKcorprDEpr, const STensor3& DpcorprDEpr, - const IPNonLocalPorosity *q0, const IPNonLocalPorosity* q1, - const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, - const double* T = NULL, const double* DRDT= NULL, - const STensor3* DdevKcorprDT = NULL, const double* DpcorprDT = NULL, const double* DDeltafVDT = NULL, - double *dres0dT= NULL, double *dres1dT= NULL, double *dres2dT = NULL + virtual void computeDResidual_NonLocalPorosity(STensor3 &dres0dEpr, STensor3 &dres1dEpr, STensor3 &dres2dEpr, + double &dres0dtildefV, double &dres1dtildefV, double &dres2dtildefV, + const STensor3& devKcorpr, const double kcorEqpr, const double pcorpr, const double R, + const double yieldfV, const STensor3& DyieldfVDKcorpr, const double DyieldfVDtildefV, + const STensor43& DKcorprDEpr, const STensor43& DdevKcorprDEpr, const STensor3& DpcorprDEpr, + const IPNonLocalPorosity *q0, const IPNonLocalPorosity* q1, + const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, + const double* T = NULL, const double* DRDT= NULL, + const STensor3* DdevKcorprDT = NULL, const double* DpcorprDT = NULL, const STensor3* DKcorprDT = NULL, + double *dres0dT= NULL, double *dres1dT= NULL, double *dres2dT = NULL ) const; - + + virtual void computeResidualLocal(SVector3& res, STensor3& J, + const double kcorEqpr, const double pcorpr, const double R, const double H, + const double yieldfV, const double DyieldfVDfV, + const IPNonLocalPorosity *q0, const IPNonLocalPorosity* q1, + const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, // 3 unknonwn + const double DDeltafVDDeltaHatD, const double DDeltafVDDeltaHatQ, const double DDeltafVDDeltaHatP, + const double* T = NULL + ) const; virtual void computeDResidualLocal(STensor3 &dres0dEpr, STensor3 &dres1dEpr, STensor3 &dres2dEpr, const STensor3& devKcorpr, const double kcorEqpr, const double pcorpr, const double R, const double yieldfV, const double DyieldfVDfV, @@ -117,31 +124,27 @@ class mlawNonLocalDamageGurson : public mlawNonLocalPorosity ) const; virtual void computeResidual_multipleNonLocalVariables(SVector3& res, STensor3& J, - const double kcorEqpr, const double pcorpr, const double R, const double H, - const double yieldfV, const double DyieldfVDfV, - const IPNonLocalPorosity *q0, const IPNonLocalPorosity* q1, - const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, // 3 unknonwn - const double DeltafV, const double* T = NULL - ) const{ - computeResidual(res,J,kcorEqpr,pcorpr,R,H,yieldfV,DyieldfVDfV,q0,q1,DeltaHatD,DeltaHatQ,DeltaHatP,DeltafV,0.,0.,0.,T); - }; - + const double kcorEqpr, const double pcorpr, const double R, const double H, + const double yieldfV, + const IPNonLocalPorosity *q0, const IPNonLocalPorosity* q1, + const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, // 3 unknonwn + const double* T = NULL + ) const; virtual void computeDResidual_multipleNonLocalVariables(STensor3 &dres0dEpr, STensor3 &dres1dEpr, STensor3 &dres2dEpr, - std::vector<double> &dres0dtildefV, std::vector<double> &dres1dtildefV, std::vector<double> &dres2dtildefV, + std::vector<double> &Dres0DNonlocalVars, std::vector<double> &Dres1DNonlocalVars, std::vector<double> &Dres2DNonlocalVars, const STensor3& devKcorpr, const double kcorEqpr, const double pcorpr, const double R, - const double yieldfV, const double DyieldfVDfV, const std::vector<double>& DyieldfVDtildefV, - const STensor3& DDeltafVDEpr, const STensor43& DdevKcorprDEpr, const STensor3& DpcorprDEpr, + const double yieldfV, const STensor3& DyieldfVDKcorpr, const std::vector<double>& DyieldfVDNonlocalVars, + const STensor43& DkcorprDEpr, const STensor43& DdevKcorprDEpr, const STensor3& DpcorprDEpr, const IPNonLocalPorosity *q0, const IPNonLocalPorosity* q1, const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, const double* T = NULL, const double* DRDT= NULL, - const STensor3* DdevKcorprDT = NULL, const double* DpcorprDT = NULL, const double* DDeltafVDT = NULL, + const STensor3* DdevKcorprDT = NULL, const double* DpcorprDT = NULL, const STensor3* DKcorprVDT = NULL, double *dres0dT= NULL, double *dres1dT= NULL, double *dres2dT = NULL ) const; virtual double getOnsetCriterion(const IPNonLocalPorosity* q1) const; - virtual void nucleation(const double p1, const double p0, const double f0, IPNonLocalPorosity* q1, const IPNonLocalPorosity *q0) const; virtual void checkCoalescence(IPNonLocalPorosity* q1, const IPNonLocalPorosity *q0, const double* T) const; virtual void checkFailed(IPNonLocalPorosity* q1, const IPNonLocalPorosity *q0) const; diff --git a/NonLinearSolver/materialLaw/mlawNonLocalPorous.cpp b/NonLinearSolver/materialLaw/mlawNonLocalPorous.cpp index 33fecc25f030f0de6257231dfd5e3bfece5cfa11..ff24f3b544e862c33a993237917c09fec67b0de4 100644 --- a/NonLinearSolver/materialLaw/mlawNonLocalPorous.cpp +++ b/NonLinearSolver/materialLaw/mlawNonLocalPorous.cpp @@ -81,11 +81,9 @@ mlawNonLocalPorosity::mlawNonLocalPorosity(const int num,const double E,const do _triFunc_kw = new constantScalarFunction(1.); //---------------------------end if (fVinitial > 0){ - _localRegularizedFunction = new fourVariableExponentialSaturationScalarFunction(std::min(1.e-16,fVinitial), 0., 0.9*_localfVFailure,0.999*_localfVFailure); _correctedRegularizedFunction = new fourVariableExponentialSaturationScalarFunction(std::min(1.e-16,fVinitial), 0., 0.9*_fV_failure,0.999*_fV_failure); } else{ - _localRegularizedFunction = new fourVariableExponentialSaturationScalarFunction(0.,-1.e-16,0.9*_localfVFailure,0.999*_localfVFailure); _correctedRegularizedFunction = new fourVariableExponentialSaturationScalarFunction(0.,-1.e-16, 0.9*_fV_failure,0.999*_fV_failure); } // @@ -172,10 +170,6 @@ mlawNonLocalPorosity::mlawNonLocalPorosity(const mlawNonLocalPorosity &source) : } //-----------------------------end - _localRegularizedFunction = NULL; - if (source._localRegularizedFunction != NULL){ - _localRegularizedFunction = source._localRegularizedFunction->clone(); - } _correctedRegularizedFunction = NULL; if (source._correctedRegularizedFunction != NULL){ @@ -218,8 +212,6 @@ mlawNonLocalPorosity::~mlawNonLocalPorosity() if (_triFunc_kw != NULL) delete _triFunc_kw; _triFunc_kw = NULL; //-----------------------end - if (_localRegularizedFunction != NULL) delete _localRegularizedFunction; - _localRegularizedFunction = NULL; if (_correctedRegularizedFunction != NULL) delete _correctedRegularizedFunction; _correctedRegularizedFunction = NULL; if (_temFunc_ThermalConductivity != NULL) delete _temFunc_ThermalConductivity; _temFunc_ThermalConductivity = NULL; @@ -312,10 +304,6 @@ void mlawNonLocalPorosity::setFailureTolerance(const double NewFailureTol){ _failedTol = NewFailureTol; }; -void mlawNonLocalPorosity::setLocalRegularizedFunction(const scalarFunction& fct){ - if (_localRegularizedFunction) delete _localRegularizedFunction; - _localRegularizedFunction = fct.clone(); -}; void mlawNonLocalPorosity::setCorrectedRegularizedFunction(const scalarFunction& fct){ if (_correctedRegularizedFunction) delete _correctedRegularizedFunction; @@ -586,12 +574,11 @@ void mlawNonLocalPorosity::elasticPredictor( const STensor3& F1, const STensor3& void mlawNonLocalPorosity::updateInternalVariables(IPNonLocalPorosity *q1, const IPNonLocalPorosity* q0, - const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, const double DeltafV, + const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, const double* T) const{ double hatPn = q0->getMatrixPlasticStrain(); double hatQn = q0->getVolumetricPlasticStrain(); double hatDn = q0->getDeviatoricPlasticStrain(); - double fVn = q0->getLocalPorosity(); double& hatP = q1->getRefToMatrixPlasticStrain(); hatP = hatPn + DeltaHatP; @@ -602,9 +589,6 @@ void mlawNonLocalPorosity::updateInternalVariables(IPNonLocalPorosity *q1, const double& hatD = q1->getRefToDeviatoricPlasticStrain(); hatD = hatDn + DeltaHatD; - double& fV = q1->getRefToLocalPorosity(); - fV = fVn + DeltafV; - // update hardening if (isThermomechanicallyCoupled()){ _j2IH->hardening(hatPn,q0->getConstRefToIPJ2IsotropicHardening(),hatP,*T, q1->getRefToIPJ2IsotropicHardening()); @@ -618,7 +602,7 @@ void mlawNonLocalPorosity::updateInternalVariables(IPNonLocalPorosity *q1, const void mlawNonLocalPorosity::updatePlasticState(IPNonLocalPorosity *q1, const IPNonLocalPorosity* q0, const STensor3& F1, - const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, const double DeltafV, + const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, const STensor3& devKcorpr, const double kcorEqpr, const double pcorpr, const double yield, STensor3& Fe1, STensor3& Ce, STensor3& Ee, STensor43& Le, STensor63& dLe, STensor3& DGNp, STensor3& devDGNp, double& trDGNp, STensor43& Dexp, const double* T) const{ @@ -773,20 +757,23 @@ void mlawNonLocalPorosity::predictorCorrector_NonLocalPorosity( _cLLaw[0]->computeCL(ipvprev->getNonLocalPorosity(), ipvcur->getRefToIPCLength(0)); // Hardening law - if (isThermomechanicallyCoupled()){ + if (isThermomechanicallyCoupled()) + { _j2IH->hardening(ipvprev->getMatrixPlasticStrain(),ipvprev->getConstRefToIPJ2IsotropicHardening(), ipvcur->getMatrixPlasticStrain(),T, ipvcur->getRefToIPJ2IsotropicHardening()); } - else{ + else + { _j2IH->hardening(ipvprev->getMatrixPlasticStrain(),ipvprev->getConstRefToIPJ2IsotropicHardening(), ipvcur->getMatrixPlasticStrain(),ipvcur->getRefToIPJ2IsotropicHardening()); } // Yield stress double& R = ipvcur->getRefToCurrentViscoplasticYieldStress(); R = ipvcur->getConstRefToIPJ2IsotropicHardening().getR(); - // nucleation from previous - // cannot copy because nucleation void part must be set to zero initially - nucleation(ipvcur->getMatrixPlasticStrain(),ipvprev->getMatrixPlasticStrain(),ipvprev->getLocalPorosity(),ipvcur,ipvprev); - + // no nucleation + for (int i=0; i< _gdnLawContainer.size(); i++) + { + ipvcur->getRefToIPNucleation(i).resetNucleation(ipvprev->getConstRefToIPNucleation(i)); + } // copy void state ipvcur->getRefToIPVoidState() = ipvprev->getConstRefToIPVoidState(); // coalescene from previous @@ -839,11 +826,13 @@ void mlawNonLocalPorosity::predictorCorrector_NonLocalPorosity( ipvcur->getRefToDPlasticEnergyDMatrixPlasticStrain() = 0.; STensorOperation::zero(ipvcur->getRefToDPlasticEnergyDF()); - if (isThermomechanicallyCoupled()){ + if (isThermomechanicallyCoupled()) + { (*dLocalPorosityDT)=0.; STensorOperation::zero(ipvcur->getRefToDPlasticEnergyDT()); } - for (int i=0; i< _numNonLocalVar; i++){ + for (int i=0; i< _numNonLocalVar; i++) + { STensorOperation::zero(ipvcur->getRefToDPlasticEnergyDNonLocalVariable(i)); } } @@ -859,8 +848,8 @@ void mlawNonLocalPorosity::predictorCorrector_NonLocalPorosity( if (plastic) { - double DfVtildeStarDtildefVPrev = ipvprev->getConstRefToIPCoalescence().getAccelerateRate(); - correctorOK = plasticCorrectorLocal(F1,ipvprev->getCorrectedPorosity(),DfVtildeStarDtildefVPrev,corKirpr,kcorprDev,ppr,ipvprev,ipvcur, + double DfVtildeStarDtildefV = ipvcur->getConstRefToIPCoalescence().getAccelerateRate(); + correctorOK = plasticCorrectorLocal(F1,ipvprev->getCorrectedPorosity(),DfVtildeStarDtildefV,corKirpr,kcorprDev,ppr,ipvprev,ipvcur, Fe,Ce,Ee,Le,dLe, stiff,DcorKirprDEpr,DkcorprDevDEpr,DpprDEpr, DcorKirDEpr, DFpDEpr, @@ -917,7 +906,7 @@ void mlawNonLocalPorosity::predictorCorrector_NonLocalPorosity( if (plastic){ //Msg::Info("plastic occurs"); - correctorOK = plasticCorrectorLocal(Fcur,ipvTemp.getCorrectedPorosity(),DfVtildeStarDtildefVPrev,corKirpr,kcorprDev,ppr,&ipvTemp,ipvcur, + correctorOK = plasticCorrectorLocal(Fcur,ipvTemp.getCorrectedPorosity(),DfVtildeStarDtildefV,corKirpr,kcorprDev,ppr,&ipvTemp,ipvcur, Fe,Ce,Ee,Le,dLe, estimateStiff,DcorKirprDEpr,DkcorprDevDEpr,DpprDEpr, DcorKirDEpr, DFpDEpr, @@ -1245,10 +1234,34 @@ void mlawNonLocalPorosity::predictorCorrector_NonLocalPorosity( + void mlawNonLocalPorosity::voidCharacteristicsEvoltion_NonLocalPorosity(const STensor3& kcor, + const IPNonLocalPorosity *q0, IPNonLocalPorosity* q1, + const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, + double& DfVDDeltaHatD, double& DfVDDeltaHatQ, double& DfVDDeltaHatP, + STensor3& DfVDkcorpr) const +{ + double hatPn = q0->getMatrixPlasticStrain(); // previous converge value + double fn = q0->getLocalPorosity(); + + // Update nucleation state + nucleation(hatPn+DeltaHatP,hatPn,fn,q1,q0); + + // void evolution + localPorosityGrowth(q1, DeltaHatD,DeltaHatQ,DeltaHatP, + kcor, q0, + true, &DfVDDeltaHatD,&DfVDDeltaHatQ,&DfVDDeltaHatP,&DfVDkcorpr); + + // update void state data + _voidEvolutionLaw->evolve(q0->getYieldPorosity(),q1->getYieldPorosity(),DeltaHatD,DeltaHatQ,DeltaHatP, + q0,q1, q0->getConstRefToIPVoidState(), q1->getRefToIPVoidState()); + // update coalescene data + _coalescenceLaw->computeIPCoalescence(q0,q1,&q0->getConstRefToIPCoalescence(),&q1->getRefToIPCoalescence()); +}; -bool mlawNonLocalPorosity::plasticCorrector_NonLocalPorosity(const STensor3& F1, const double& tildefVstar,const double& DtildefVstarDtildefV, +bool mlawNonLocalPorosity::plasticCorrector_NonLocalPorosity(const STensor3& F1, + const double& yieldfV,const double& DyieldfVDtildefV, const STensor3& Kcorpr, const STensor3& devKcorpr, const double& pcorpr, const IPNonLocalPorosity *q0, IPNonLocalPorosity *q1, STensor3& Fe, STensor3& Ce, STensor3& Ee, STensor43& Le, STensor63& dLe, @@ -1261,27 +1274,25 @@ bool mlawNonLocalPorosity::plasticCorrector_NonLocalPorosity(const STensor3& F1, const STensor3* DKcorprDT, const STensor3* DdevKcorprDT, const double* DpcorprDT, STensor3* DKcorDT, STensor3* DFpDT, double* DfVDT ) const{ - - // previous converged state - double hatPn = q0->getMatrixPlasticStrain(); - double hatQn = q0->getVolumetricPlasticStrain(); - double hatDn = q0->getDeviatoricPlasticStrain(); - double fVn = q0->getLocalPorosity(); - + // + // yieldfV depends only on nonlocal porosity + // + double hatPn = q0->getMatrixPlasticStrain(); // previous converge value + double fn = q0->getLocalPorosity(); + // unknowns double DeltaHatD = 1.e-8; double DeltaHatQ = 0.; double DeltaHatP = 1.e-8; - double DeltafV = 0.; - double DDeltafVDDeltaHatD = 0.; - double DDeltafVDDeltaHatQ = 0.; - double DDeltafVDDeltaHatP = 0.; - static STensor3 DDeltafVDkcorpr; - - // to get initial derivatives - double kcorEqpr = sqrt(1.5*devKcorpr.dotprod()); - localPorosityGrowth(DeltafV, DeltaHatD,DeltaHatQ,DeltaHatP, - Kcorpr,q0,q1, true,&DDeltafVDDeltaHatD,&DDeltafVDDeltaHatQ,&DDeltafVDDeltaHatP,&DDeltafVDkcorpr); + // dependence of local porosity on unknowns + double DfVDDeltaHatD = 0.; + double DfVDDeltaHatQ = 0.; + double DfVDDeltaHatP = 0.; + // and stress tensor due to kw + static STensor3 DfVDkcorpr; + + voidCharacteristicsEvoltion_NonLocalPorosity(Kcorpr,q0,q1,DeltaHatD,DeltaHatQ,DeltaHatP, + DfVDDeltaHatD,DfVDDeltaHatQ,DfVDDeltaHatP,DfVDkcorpr); // First residual static SVector3 res; @@ -1291,10 +1302,10 @@ bool mlawNonLocalPorosity::plasticCorrector_NonLocalPorosity(const STensor3& F1, double & yield = q1->getRefToCurrentViscoplasticYieldStress(); yield = q1->getConstRefToIPJ2IsotropicHardening().getR(); double H = q1->getConstRefToIPJ2IsotropicHardening().getDR(); - - computeResidual(res,J,kcorEqpr,pcorpr,yield,H,tildefVstar,0.,q0,q1, - DeltaHatD,DeltaHatQ,DeltaHatP,DeltafV, - DDeltafVDDeltaHatD,DDeltafVDDeltaHatQ,DDeltafVDDeltaHatP,T); + + double kcorEqpr = sqrt(1.5*devKcorpr.dotprod()); + computeResidual_NonLocalPorosity(res,J,kcorEqpr,pcorpr,yield,H,yieldfV,q0,q1, + DeltaHatD,DeltaHatQ,DeltaHatP,T); double muT = _mu; if (isThermomechanicallyCoupled()){ @@ -1339,24 +1350,10 @@ bool mlawNonLocalPorosity::plasticCorrector_NonLocalPorosity(const STensor3& F1, else DeltaHatP -= sol(2); - // Update porosity - // Update nucleation state - nucleation(hatPn+DeltaHatP,hatPn,q0->getLocalPorosity(),q1,q0); - - // void evolution - localPorosityGrowth(DeltafV, DeltaHatD,DeltaHatQ,DeltaHatP, - Kcorpr, q0,q1, - true, &DDeltafVDDeltaHatD,&DDeltafVDDeltaHatQ,&DDeltafVDDeltaHatP,&DDeltafVDkcorpr); - + voidCharacteristicsEvoltion_NonLocalPorosity(Kcorpr,q0,q1,DeltaHatD,DeltaHatQ,DeltaHatP, + DfVDDeltaHatD,DfVDDeltaHatQ,DfVDDeltaHatP,DfVDkcorpr); // update internal variable - updateInternalVariables(q1,q0,DeltaHatD,DeltaHatQ,DeltaHatP,DeltafV,T); - - // update void state data - _voidEvolutionLaw->evolve(q0->getYieldPorosity(),q1->getYieldPorosity(),DeltaHatD,DeltaHatQ,DeltaHatP, - q0,q1, q0->getConstRefToIPVoidState(), q1->getRefToIPVoidState()); - // update coalescene data - _coalescenceLaw->computeIPCoalescence(q0,q1,&q0->getConstRefToIPCoalescence(),&q1->getRefToIPCoalescence()); - + updateInternalVariables(q1,q0,DeltaHatD,DeltaHatQ,DeltaHatP,T); yield = q1->getConstRefToIPJ2IsotropicHardening().getR(); H = q1->getConstRefToIPJ2IsotropicHardening().getDR(); @@ -1370,19 +1367,18 @@ bool mlawNonLocalPorosity::plasticCorrector_NonLocalPorosity(const STensor3& F1, H += dR/delta_t; } - computeResidual(res,J,kcorEqpr,pcorpr,yield,H,tildefVstar,0.,q0,q1, - DeltaHatD,DeltaHatQ,DeltaHatP,DeltafV, - DDeltafVDDeltaHatD,DDeltafVDDeltaHatQ,DDeltafVDDeltaHatP,T); + computeResidual_NonLocalPorosity(res,J,kcorEqpr,pcorpr,yield,H,yieldfV,q0,q1, + DeltaHatD,DeltaHatQ,DeltaHatP,T); f = res.norm(); - //Msg::Info("ite = %d maxite = %d norm = %e ,DeltaHatD = %e,DeltaHatQ = %e,DeltaHatP = %e,DeltafV =%e !!",ite,_maxite,f,DeltaHatD,DeltaHatQ,DeltaHatP,DeltafV); + //Msg::Info("ite = %d maxite = %d norm = %e ,DeltaHatD = %e,DeltaHatQ = %e,DeltaHatP = %e !!",ite,_maxite,f,DeltaHatD,DeltaHatQ,DeltaHatP); if (f < _tol) break; ite++; if((ite > _maxite) or STensorOperation::isnan(f)) { - Msg::Warning("No convergence in NON-local plast. correct. ite= %d: norm= %e, DeltaHatD= %e, DeltaHatQ= %e, DeltaHatP= %e, DeltafV= %e, fv_y = %e, Cft= %e ", - ite,f,DeltaHatD,DeltaHatQ,DeltaHatP,DeltafV, q1->getYieldPorosity(),q1->getConstRefToIPCoalescence().getConcentrationFactor()); + Msg::Warning("No convergence in NON-local plast. correct. ite= %d: norm= %e, DeltaHatD= %e, DeltaHatQ= %e, DeltaHatP= %e, fv_y = %e, Cft= %e ", + ite,f,DeltaHatD,DeltaHatQ,DeltaHatP, q1->getYieldPorosity(),q1->getConstRefToIPCoalescence().getConcentrationFactor()); return false; } } @@ -1392,37 +1388,33 @@ bool mlawNonLocalPorosity::plasticCorrector_NonLocalPorosity(const STensor3& F1, double trDGNp; static STensor43 ENp; - updatePlasticState(q1,q0,F1,DeltaHatD,DeltaHatQ,DeltaHatP,DeltafV,devKcorpr,kcorEqpr,pcorpr, + updatePlasticState(q1,q0,F1,DeltaHatD,DeltaHatQ,DeltaHatP,devKcorpr,kcorEqpr,pcorpr, yield,Fe,Ce,Ee,Le,dLe,DGNp,devDGNp,trDGNp,ENp,T); double f0=q0->getInitialPorosity(); q1->getRefToDPlasticEnergyDMatrixPlasticStrain() =(1.-f0)*H*DeltaHatP+(1.-f0)*yield; /* Stiffness computation*/ if(stiff) { - static STensor3 DDeltafVDEpr; // partial derivatives - STensorOperation::multSTensor3STensor43(DDeltafVDkcorpr,DKcorprDEpr,DDeltafVDEpr); double dRdT= 0.; - double DDeltafVDT =0.; // partial derivatives - if (isThermomechanicallyCoupled()){ dRdT = q1->getConstRefToIPJ2IsotropicHardening().getDRDT(); - DDeltafVDT = STensorOperation::doubledot(DDeltafVDkcorpr,*DKcorprDT); } - /* Compute internal variables derivatives from residual derivatives */ static STensor3 dres0dEpr, dres1dEpr, dres2dEpr; double dres0dtildefV, dres1dtildefV, dres2dtildefV; double dres0dT, dres1dT,dres2dT; + + static STensor3 DyieldfVDKcorpr(0.); // fV - computeDResidual(dres0dEpr,dres1dEpr,dres2dEpr, + computeDResidual_NonLocalPorosity(dres0dEpr,dres1dEpr,dres2dEpr, dres0dtildefV,dres1dtildefV,dres2dtildefV, devKcorpr,kcorEqpr,pcorpr,yield, - tildefVstar,0.,DtildefVstarDtildefV, - DDeltafVDEpr,DdevKcorprDEpr,DpcorprDEpr, + yieldfV,DyieldfVDKcorpr,DyieldfVDtildefV, + DKcorprDEpr,DdevKcorprDEpr,DpcorprDEpr, q0,q1, DeltaHatD,DeltaHatQ,DeltaHatP, - T,&dRdT,DdevKcorprDT,DpcorprDT,&DDeltafVDT, + T,&dRdT,DdevKcorprDT,DpcorprDT,DKcorprDT, &dres0dT,&dres1dT,&dres2dT); static STensor3 dDeltaHatDdEpr, dDeltaHatQdEpr, dDeltaHatPdEpr; @@ -1476,20 +1468,20 @@ bool mlawNonLocalPorosity::plasticCorrector_NonLocalPorosity(const STensor3& F1, dDeltaHatDdT = sol(0); dDeltaHatQdT = sol(1); dDeltaHatPdT = sol(2); - *DfVDT = DDeltafVDT+ DDeltafVDDeltaHatD*dDeltaHatDdT+DDeltafVDDeltaHatQ*dDeltaHatQdT+DDeltafVDDeltaHatP*dDeltaHatPdT; + *DfVDT = STensorOperation::doubledot(DfVDkcorpr,*DKcorprDT)+ DfVDDeltaHatD*dDeltaHatDdT+DfVDDeltaHatQ*dDeltaHatQdT+DfVDDeltaHatP*dDeltaHatPdT; double &DplEnergyDT=q1->getRefToDPlasticEnergyDT(); DplEnergyDT=(1.-f0)*(H*dDeltaHatPdT+dRdT)*DeltaHatP+(1.-f0)*yield*dDeltaHatPdT; } // compute DfVDEpr - DfVDEpr = DDeltafVDEpr; - DfVDEpr.daxpy(dDeltaHatDdEpr,DDeltafVDDeltaHatD); - DfVDEpr.daxpy(dDeltaHatQdEpr,DDeltafVDDeltaHatQ); - DfVDEpr.daxpy(dDeltaHatPdEpr,DDeltafVDDeltaHatP); + STensorOperation::multSTensor3STensor43(DfVDkcorpr,DKcorprDEpr,DfVDEpr); + DfVDEpr.daxpy(dDeltaHatDdEpr,DfVDDeltaHatD); + DfVDEpr.daxpy(dDeltaHatQdEpr,DfVDDeltaHatQ); + DfVDEpr.daxpy(dDeltaHatPdEpr,DfVDDeltaHatP); // compute DfVDtildefV - DfVDtildefV = DDeltafVDDeltaHatD*dDeltaHatDdtildefV+DDeltafVDDeltaHatQ*dDeltaHatQdtildefV+DDeltafVDDeltaHatP*dDeltaHatPdtildefV; + DfVDtildefV = DfVDDeltaHatD*dDeltaHatDdtildefV+DfVDDeltaHatQ*dDeltaHatQdtildefV+DfVDDeltaHatP*dDeltaHatPdtildefV; computePlasticTangentNonLocal(q1,q0,devKcorpr,kcorEqpr,pcorpr,DGNp,devDGNp,trDGNp,ENp, DeltaHatD,DeltaHatQ,DeltaHatP, @@ -1542,9 +1534,11 @@ void mlawNonLocalPorosity::predictorCorrectorLocal( _j2IH->hardening(ipvprev->getMatrixPlasticStrain(),ipvprev->getConstRefToIPJ2IsotropicHardening(), ipvcur->getMatrixPlasticStrain(),ipvcur->getRefToIPJ2IsotropicHardening()); } - // nucleation from previous - // cannot copy because nucleation void part must be set to zero initially - nucleation(ipvcur->getMatrixPlasticStrain(),ipvprev->getMatrixPlasticStrain(),ipvprev->getLocalPorosity(),ipvcur,ipvprev); + // no nucleation + for (int i=0; i< _gdnLawContainer.size(); i++) + { + ipvcur->getRefToIPNucleation(i).resetNucleation(ipvprev->getConstRefToIPNucleation(i)); + } // reset to previous state ipvcur->getRefToIPCoalescence() = (ipvprev->getConstRefToIPCoalescence()); @@ -1764,7 +1758,36 @@ void mlawNonLocalPorosity::predictorCorrectorLocal( +void mlawNonLocalPorosity::voidCharacteristicsEvoltionLocal(const STensor3& kcor, + const IPNonLocalPorosity *q0, IPNonLocalPorosity* q1, + const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, + const double DtildefVstarDDeltafV, + double& DyieldfVDDeltafV, + double& DDeltafVDDeltaHatD, double& DDeltafVDDeltaHatQ, double& DDeltafVDDeltaHatP, + STensor3& DDeltafVDKcor) const +{ + double hatPn = q0->getMatrixPlasticStrain(); + // nucleatino + nucleation(hatPn+DeltaHatP,hatPn,q0->getLocalPorosity(),q1,q0); + // local void growth + localPorosityGrowth(q1, DeltaHatD,DeltaHatQ,DeltaHatP, + kcor,q0,true,&DDeltafVDDeltaHatD,&DDeltafVDDeltaHatQ,&DDeltafVDDeltaHatP,&DDeltafVDKcor); + + // yield porosity + double & tildefVstar = q1->getRefToCorrectedPorosity(); + double& yieldfV = q1->getRefToYieldPorosity(); + + tildefVstar = q0->getCorrectedPorosity() + DtildefVstarDDeltafV*(q1->getLocalPorosity() - q0->getLocalPorosity()); + yieldfV = _correctedRegularizedFunction->getVal(tildefVstar); + DyieldfVDDeltafV = _correctedRegularizedFunction->getDiff(tildefVstar)*DtildefVstarDDeltafV; + + // update void + _voidEvolutionLaw->evolve(q0->getYieldPorosity(),q1->getYieldPorosity(),DeltaHatD,DeltaHatQ,DeltaHatP, + q0,q1, q0->getConstRefToIPVoidState(), q1->getRefToIPVoidState()); + _coalescenceLaw->computeIPCoalescence(q0,q1,&q0->getConstRefToIPCoalescence(),&q1->getRefToIPCoalescence()); + +}; @@ -1789,37 +1812,31 @@ bool mlawNonLocalPorosity::plasticCorrectorLocal(const STensor3& F1, const doubl double DeltaHatD = 1.e-8; double DeltaHatQ = 0.; double DeltaHatP = 1.e-8; - double DeltafV = 0.; + double DDeltafVDDeltaHatD = 0.; double DDeltafVDDeltaHatQ = 0.; - double DDeltafVDDeltaHatP = 0.; - - + double DDeltafVDDeltaHatP = 0.; static STensor3 DDeltafVDKcorpr; + double DyieldfVDDeltafV = 1.; + + voidCharacteristicsEvoltionLocal(Kcorpr,q0,q1,DeltaHatD,DeltaHatQ,DeltaHatP, + DtildefVstarDDeltafV, + DyieldfVDDeltafV, DDeltafVDDeltaHatD, DDeltafVDDeltaHatQ, DDeltafVDDeltaHatP,DDeltafVDKcorpr); double kcorEqpr = sqrt(1.5*devKcorpr.dotprod()); - // get derivatives - localPorosityGrowth(DeltafV, DeltaHatD,DeltaHatQ,DeltaHatP, - Kcorpr,q0,q1, - true,&DDeltafVDDeltaHatD,&DDeltafVDDeltaHatQ,&DDeltafVDDeltaHatP,&DDeltafVDKcorpr); - + // First residual static SVector3 res; static SVector3 sol; static STensor3 J, invJ; - - double & yield = q1->getRefToCurrentViscoplasticYieldStress(); + + double & yield = q1->getRefToCurrentViscoplasticYieldStress(); yield = q1->getConstRefToIPJ2IsotropicHardening().getR(); double H = q1->getConstRefToIPJ2IsotropicHardening().getDR(); - - double & tildefVstar = q1->getRefToCorrectedPorosity(); - tildefVstar = tildefVstarPrev + DtildefVstarDDeltafV*DeltafV; - double& yieldfV = q1->getRefToYieldPorosity(); - yieldfV = _correctedRegularizedFunction->getVal(tildefVstar); - double DyieldfVDDeltafV = _correctedRegularizedFunction->getDiff(tildefVstar)*DtildefVstarDDeltafV; - - computeResidual(res,J,kcorEqpr,pcorpr,yield,H,yieldfV,DyieldfVDDeltafV,q0,q1, - DeltaHatD,DeltaHatQ,DeltaHatP,DeltafV, + + double yieldfV = q1->getYieldPorosity(); + computeResidualLocal(res,J,kcorEqpr,pcorpr,yield,H,yieldfV,DyieldfVDDeltafV,q0,q1, + DeltaHatD,DeltaHatQ,DeltaHatP, DDeltafVDDeltaHatD,DDeltafVDDeltaHatQ,DDeltafVDDeltaHatP,T); double muT = _mu; @@ -1863,24 +1880,11 @@ bool mlawNonLocalPorosity::plasticCorrectorLocal(const STensor3& F1, const doubl else DeltaHatP -= sol(2); + voidCharacteristicsEvoltionLocal(Kcorpr,q0,q1,DeltaHatD,DeltaHatQ,DeltaHatP, + DtildefVstarDDeltafV, + DyieldfVDDeltafV, DDeltafVDDeltaHatD, DDeltafVDDeltaHatQ, DDeltafVDDeltaHatP,DDeltafVDKcorpr); - - nucleation(hatPn+DeltaHatP,hatPn,q0->getLocalPorosity(),q1,q0); - - localPorosityGrowth(DeltafV, DeltaHatD,DeltaHatQ,DeltaHatP, - Kcorpr,q0,q1, - true, &DDeltafVDDeltaHatD,&DDeltafVDDeltaHatQ,&DDeltafVDDeltaHatP,&DDeltafVDKcorpr); - - updateInternalVariables(q1,q0,DeltaHatD,DeltaHatQ,DeltaHatP,DeltafV,T); - - tildefVstar = tildefVstarPrev + DtildefVstarDDeltafV*DeltafV; - yieldfV = _correctedRegularizedFunction->getVal(tildefVstar); - DyieldfVDDeltafV = _correctedRegularizedFunction->getDiff(tildefVstar)*DtildefVstarDDeltafV; - - // update void - _voidEvolutionLaw->evolve(q0->getYieldPorosity(),q1->getYieldPorosity(),DeltaHatD,DeltaHatQ,DeltaHatP, - q0,q1, q0->getConstRefToIPVoidState(), q1->getRefToIPVoidState()); - _coalescenceLaw->computeIPCoalescence(q0,q1,&q0->getConstRefToIPCoalescence(),&q1->getRefToIPCoalescence()); + updateInternalVariables(q1,q0,DeltaHatD,DeltaHatQ,DeltaHatP,T); yield = q1->getConstRefToIPJ2IsotropicHardening().getR(); H = q1->getConstRefToIPJ2IsotropicHardening().getDR(); @@ -1893,9 +1897,10 @@ bool mlawNonLocalPorosity::plasticCorrectorLocal(const STensor3& F1, const doubl yield += R; H += dR/delta_t; } - - computeResidual(res,J,kcorEqpr,pcorpr,yield,H,yieldfV,DyieldfVDDeltafV,q0,q1, - DeltaHatD,DeltaHatQ,DeltaHatP,DeltafV, + + yieldfV = q1->getYieldPorosity(); + computeResidualLocal(res,J,kcorEqpr,pcorpr,yield,H,yieldfV,DyieldfVDDeltafV,q0,q1, + DeltaHatD,DeltaHatQ,DeltaHatP, DDeltafVDDeltaHatD,DDeltafVDDeltaHatQ,DDeltafVDDeltaHatP,T); f = res.norm(); @@ -1906,12 +1911,12 @@ bool mlawNonLocalPorosity::plasticCorrectorLocal(const STensor3& F1, const doubl if((ite > _maxite) or STensorOperation::isnan(f)) { if (q1->getConstRefToIPCoalescence().getCoalescenceActiveFlag()){ - Msg::Warning("No convergence in LOCAL plast. correct. ite= %d: active coales, norm= %e, DeltaHatD= %e, DeltaHatQ= %e, DeltaHatP= %e, DeltafV= %e, fv_y= %e,Cft= %e ", - ite,f,DeltaHatD,DeltaHatQ,DeltaHatP,DeltafV, q1->getYieldPorosity(),q1->getConstRefToIPCoalescence().getConcentrationFactor()); + Msg::Warning("No convergence in LOCAL plast. correct. ite= %d: active coales, norm= %e, DeltaHatD= %e, DeltaHatQ= %e, DeltaHatP= %e, fv_y= %e,Cft= %e ", + ite,f,DeltaHatD,DeltaHatQ,DeltaHatP, q1->getYieldPorosity(),q1->getConstRefToIPCoalescence().getConcentrationFactor()); } else{ - Msg::Warning("No convergence in LOCAL plast. correct. ite= %d: inactive coa., norm= %e, DeltaHatD= %e, DeltaHatQ= %e, DeltaHatP= %e, DeltafV= %e, fv_y= %e,Cft= %e ", - ite,f,DeltaHatD,DeltaHatQ,DeltaHatP,DeltafV, q1->getYieldPorosity(),q1->getConstRefToIPCoalescence().getConcentrationFactor()); + Msg::Warning("No convergence in LOCAL plast. correct. ite= %d: inactive coa., norm= %e, DeltaHatD= %e, DeltaHatQ= %e, DeltaHatP= %e, fv_y= %e,Cft= %e ", + ite,f,DeltaHatD,DeltaHatQ,DeltaHatP, q1->getYieldPorosity(),q1->getConstRefToIPCoalescence().getConcentrationFactor()); double J3 = STensorOperation::determinantSTensor3(devKcorpr); Msg::Warning("res=[%e; %e; %e;] fVloc= %e, tauEqpr= %e , ppr = %e, J3= %e, DyieldfVDDeltafV= %e, DDeltafVDDeltaHatV= [%e %e %e], yieldfG = %e", res(0),res(1),res(2),q0->getLocalPorosity(), kcorEqpr/_j2IH->getYield0(), pcorpr/_j2IH->getYield0(), 27.*J3/(2.*kcorEqpr*kcorEqpr*kcorEqpr), @@ -1925,7 +1930,7 @@ bool mlawNonLocalPorosity::plasticCorrectorLocal(const STensor3& F1, const doubl static STensor3 DGNp, devDGNp; double trDGNp; static STensor43 ENp; - updatePlasticState(q1,q0,F1,DeltaHatD,DeltaHatQ,DeltaHatP,DeltafV,devKcorpr,kcorEqpr,pcorpr, + updatePlasticState(q1,q0,F1,DeltaHatD,DeltaHatQ,DeltaHatP,devKcorpr,kcorEqpr,pcorpr, yield,Fe,Ce,Ee,Le,dLe,DGNp,devDGNp,trDGNp,ENp,T); double f0=q0->getInitialPorosity(); q1->getRefToDPlasticEnergyDMatrixPlasticStrain() = (1.-f0)*H*DeltaHatP + (1.-f0)*yield; @@ -3543,18 +3548,36 @@ void mlawNonLocalPorosity::constitutive_NonLocalLogarithmPorosity( } }; -void mlawNonLocalPorosity::localPorosityGrowth(double& DeltafV, +void mlawNonLocalPorosity::nucleation(const double p1, const double p0, const double f0, IPNonLocalPorosity* q1, const IPNonLocalPorosity *q0) const{ + // Update nucleation state + for (int i = 0; i < _gdnLawContainer.size(); i++){ + // Get IpNucl + const IPNucleation& ipvnucprev = q0->getConstRefToIPNucleation(i); + IPNucleation& ipvnuc = q1->getRefToIPNucleation(i); + // Compute... + if (q1->getConstRefToIPCoalescence().getCoalescenceActiveFlag()) + { + ipvnuc.resetNucleation(ipvnucprev); + } + else + { + _gdnLawContainer[i]->nucleate(p1,p0,f0,ipvnucprev,ipvnuc); + + } + } +}; + +void mlawNonLocalPorosity::localPorosityGrowth(IPNonLocalPorosity *q1, const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, const STensor3& Kcor, - const IPNonLocalPorosity *q0, const IPNonLocalPorosity *q1, - bool stiff, - double* DDeltafVDDeltaHatD, double* DDeltafVDDeltaHatQ, double* DDeltafVDDeltaHatP, STensor3* DDeltafVDKcor) const + const IPNonLocalPorosity *q0, + bool stiff, double* DDeltafVDDeltaHatD, double* DDeltafVDDeltaHatQ, double* DDeltafVDDeltaHatP, STensor3* DDeltafVDKcor) const { // Compute local porosity growth if damage is not blocked (otherwise : no more growth) if (q1->dissipationIsBlocked()) { // No more growth as dissipation is blocked - DeltafV =0.; + q1->getRefToLocalPorosity() = q0->getLocalPorosity(); if (stiff){ *DDeltafVDDeltaHatD = 0.; *DDeltafVDDeltaHatQ = 0.; @@ -3606,20 +3629,23 @@ void mlawNonLocalPorosity::localPorosityGrowth(double& DeltafV, if (kw > 0. and DeltaHatD > 0. and kcorEq > 0) { - J3 = STensorOperation::determinantSTensor3(devKcor); - Xi = 27.*J3/(2.*kcorEq*kcorEq*kcorEq); u += kw*(1.- Xi*Xi)*fVn*DeltaHatD; v -= kw*(1.- Xi*Xi)*DeltaHatD; } // get local porosity - DeltafV = u/v; + double DeltafV = u/v; // Regularise porosity growth and rates - double ffPrev = _localRegularizedFunction->inverse(fVn); - double ff = ffPrev+DeltafV; - DeltafV = _localRegularizedFunction->getVal(ff) - fVn; + double regularizedRate = 1.; + if (fVn + DeltafV > _localfVFailure){ + q1->getRefToLocalPorosity() = _localfVFailure; + regularizedRate = (_localfVFailure - q1->getLocalPorosity())/DeltafV; + } + else{ + q1->getRefToLocalPorosity() = q0->getLocalPorosity()+ DeltafV; + } if (stiff){ // Compute derivatives @@ -3667,7 +3693,6 @@ void mlawNonLocalPorosity::localPorosityGrowth(double& DeltafV, STensorOperation::multSTensor3STensor43(DDeltafVDdevKcor,_I4dev,*DDeltafVDKcor); } - double regularizedRate = _localRegularizedFunction->getDiff(ff); *DDeltafVDDeltaHatD *= regularizedRate; *DDeltafVDDeltaHatQ *= regularizedRate; *DDeltafVDDeltaHatP *= regularizedRate; @@ -3936,7 +3961,8 @@ void mlawNonLocalPorosity::constitutive( } }; -bool mlawNonLocalPorosity::plasticCorrector_multipleNonLocalVariables(const STensor3& F1, const double& yieldfV,const double& DyieldfVDDeltafV, +bool mlawNonLocalPorosity::plasticCorrector_multipleNonLocalVariables(const STensor3& F1, + const double& yieldfV,const std::vector<double>& DyieldfVDnonlocalVar, const STensor3& DyieldfVDKcorpr, const STensor3& Kcorpr, const STensor3& devKcorpr, const double& pcorpr, const IPNonLocalPorosity *q0, IPNonLocalPorosity *q1, STensor3& Fe, STensor3& Ce, STensor3& Ee, STensor43& Le, STensor63& dLe, @@ -3949,28 +3975,12 @@ bool mlawNonLocalPorosity::plasticCorrector_multipleNonLocalVariables(const STen const STensor3* DKcorprDT, const STensor3* DdevKcorprDT, const double* DpcorprDT, STensor3* DKcorDT, STensor3* DFpDT, fullMatrix<double>* DlocalVarDT ) const{ - + + // unknowns double DeltaHatD = 0.; double DeltaHatQ = 0.; double DeltaHatP = 0.; - // deformation - double DeltafV = 0.; - - double DeltaHatDNonLocal = q1->getNonLocalDeviatoricPlasticStrain() - q0->getNonLocalDeviatoricPlasticStrain(); - double DeltaHatQNonLocal = q1->getNonLocalVolumetricPlasticStrain() - q0->getNonLocalVolumetricPlasticStrain(); - double DeltaHatPNonLocal = q1->getNonLocalMatrixPlasticStrain() - q0->getNonLocalMatrixPlasticStrain(); - - double DDeltafVDDeltaHatDNonLocal = 0.; - double DDeltafVDDeltaHatQNonLocal = 0.; - double DDeltafVDDeltaHatPNonLocal = 0.; - - static STensor3 DDeltafVDKcorpr; - - double kcorEqpr = sqrt(1.5*devKcorpr.dotprod()); - localPorosityGrowth(DeltafV, DeltaHatDNonLocal,DeltaHatQNonLocal,DeltaHatPNonLocal, - Kcorpr,q0,q1, - true, &DDeltafVDDeltaHatDNonLocal,&DDeltafVDDeltaHatQNonLocal,&DDeltafVDDeltaHatPNonLocal,&DDeltafVDKcorpr); // First residual static SVector3 res; @@ -3981,9 +3991,10 @@ bool mlawNonLocalPorosity::plasticCorrector_multipleNonLocalVariables(const STen double & yield = q1->getRefToCurrentViscoplasticYieldStress(); yield = q1->getConstRefToIPJ2IsotropicHardening().getR(); double H = q1->getConstRefToIPJ2IsotropicHardening().getDR(); - - computeResidual_multipleNonLocalVariables(res,J,kcorEqpr,pcorpr,yield,H,yieldfV,DyieldfVDDeltafV,q0,q1, - DeltaHatD,DeltaHatQ,DeltaHatP,DeltafV,T); + + double kcorEqpr = sqrt(1.5*STensorOperation::doubledot(devKcorpr,devKcorpr)); + computeResidual_multipleNonLocalVariables(res,J,kcorEqpr,pcorpr,yield,H,yieldfV,q0,q1, + DeltaHatD,DeltaHatQ,DeltaHatP,T); int ite = 0; double f = res.norm(); @@ -4017,7 +4028,7 @@ bool mlawNonLocalPorosity::plasticCorrector_multipleNonLocalVariables(const STen else DeltaHatP -= sol(2); - updateInternalVariables(q1,q0,DeltaHatD,DeltaHatQ,DeltaHatP,DeltafV,T); + updateInternalVariables(q1,q0,DeltaHatD,DeltaHatQ,DeltaHatP,T); yield = q1->getConstRefToIPJ2IsotropicHardening().getR(); H = q1->getConstRefToIPJ2IsotropicHardening().getDR(); // Add strain rate effects @@ -4030,8 +4041,8 @@ bool mlawNonLocalPorosity::plasticCorrector_multipleNonLocalVariables(const STen H += dR/delta_t; } - computeResidual_multipleNonLocalVariables(res,J,kcorEqpr,pcorpr,yield,H,yieldfV,DyieldfVDDeltafV,q0,q1, - DeltaHatD,DeltaHatQ,DeltaHatP,DeltafV,T); + computeResidual_multipleNonLocalVariables(res,J,kcorEqpr,pcorpr,yield,H,yieldfV,q0,q1, + DeltaHatD,DeltaHatQ,DeltaHatP,T); f = res.norm(); //printf("ite = %d maxite = %d norm = %e ,DeltaHatD = %e,DeltaHatQ = %e,DeltaHatP = %e,DeltafV =%e !! \n",ite,_maxite,f,DeltaHatD,DeltaHatQ,DeltaHatP,DeltafV); @@ -4040,7 +4051,7 @@ bool mlawNonLocalPorosity::plasticCorrector_multipleNonLocalVariables(const STen ite++; if((ite > _maxite) or STensorOperation::isnan(f)) { - printf("No convergence for plastic correction with ite = %d maxite = %d norm = %e ,DeltaHatD = %e,DeltaHatQ = %e,DeltaHatP = %e,DeltafV =%e !!\n",ite,_maxite,f,DeltaHatD,DeltaHatQ,DeltaHatP,DeltafV); + printf("No convergence for plastic correction with ite = %d maxite = %d norm = %e ,DeltaHatD = %e,DeltaHatQ = %e,DeltaHatP = %e!!\n",ite,_maxite,f,DeltaHatD,DeltaHatQ,DeltaHatP); return false; } } @@ -4050,9 +4061,9 @@ bool mlawNonLocalPorosity::plasticCorrector_multipleNonLocalVariables(const STen static STensor43 ENp; // update internal value first - updateInternalVariables(q1,q0,DeltaHatD,DeltaHatQ,DeltaHatP,DeltafV,T); + updateInternalVariables(q1,q0,DeltaHatD,DeltaHatQ,DeltaHatP,T); - updatePlasticState(q1,q0,F1,DeltaHatD,DeltaHatQ,DeltaHatP,DeltafV,devKcorpr,kcorEqpr,pcorpr, + updatePlasticState(q1,q0,F1,DeltaHatD,DeltaHatQ,DeltaHatP,devKcorpr,kcorEqpr,pcorpr, yield,Fe,Ce,Ee,Le,dLe,DGNp,devDGNp,trDGNp,ENp,T); double DplasticEnergyDHatP = (1-q0->getInitialPorosity())*(yield +H*DeltaHatP); @@ -4061,39 +4072,24 @@ bool mlawNonLocalPorosity::plasticCorrector_multipleNonLocalVariables(const STen /* Stiffness computation*/ if(stiff) { - static STensor3 DDeltafVDEpr; // partial derivatives - STensorOperation::multSTensor3STensor43(DDeltafVDKcorpr,DKcorprDEpr,DDeltafVDEpr); - double DDeltafVDT =0.; // partial derivatives double dRdT= 0.; if (isThermomechanicallyCoupled()){ dRdT = q1->getConstRefToIPJ2IsotropicHardening().getDRDT(); - DDeltafVDT = STensorOperation::doubledot(DDeltafVDKcorpr,*DKcorprDT); } - /* Compute internal variables derivatives from residual derivatives */ static STensor3 dres0dEpr, dres1dEpr, dres2dEpr; - static std::vector<double> Dres0DNonLocalVar, Dres1DNonLocalVar, Dres2DNonLocalVar, DyieldfVDNonLocalVar; - if (Dres0DNonLocalVar.size() != _numNonLocalVar){ - Dres0DNonLocalVar.resize(_numNonLocalVar); - Dres1DNonLocalVar.resize(_numNonLocalVar); - Dres2DNonLocalVar.resize(_numNonLocalVar); - DyieldfVDNonLocalVar.resize(_numNonLocalVar); - } - - DyieldfVDNonLocalVar[0] = DyieldfVDDeltafV*DDeltafVDDeltaHatQNonLocal; - DyieldfVDNonLocalVar[1] = DyieldfVDDeltafV*DDeltafVDDeltaHatPNonLocal; - DyieldfVDNonLocalVar[2] = DyieldfVDDeltafV*DDeltafVDDeltaHatDNonLocal; - + static std::vector<double> Dres0DNonLocalVar(_numNonLocalVar,0.), Dres1DNonLocalVar(_numNonLocalVar,0.), Dres2DNonLocalVar(_numNonLocalVar,0.); + double dres0dT, dres1dT,dres2dT; computeDResidual_multipleNonLocalVariables(dres0dEpr,dres1dEpr,dres2dEpr, Dres0DNonLocalVar,Dres1DNonLocalVar,Dres2DNonLocalVar, devKcorpr,kcorEqpr,pcorpr,yield, - yieldfV,DyieldfVDDeltafV,DyieldfVDNonLocalVar, - DDeltafVDEpr,DdevKcorprDEpr,DpcorprDEpr, + yieldfV,DyieldfVDKcorpr,DyieldfVDnonlocalVar, + DKcorprDEpr,DdevKcorprDEpr,DpcorprDEpr, q0,q1, DeltaHatD,DeltaHatQ,DeltaHatP, - T,&dRdT,DdevKcorprDT,DpcorprDT,&DDeltafVDT, + T,&dRdT,DdevKcorprDT,DpcorprDT,DKcorprDT, &dres0dT,&dres1dT,&dres2dT); static STensor3 dDeltaHatDdEpr, dDeltaHatQdEpr, dDeltaHatPdEpr; @@ -4118,12 +4114,7 @@ bool mlawNonLocalPorosity::plasticCorrector_multipleNonLocalVariables(const STen DlocalVarDEpr[1] = dDeltaHatPdEpr; DlocalVarDEpr[2] = dDeltaHatDdEpr; - static std::vector<double> dDeltaHatDDNonLocalVar, dDeltaHatQDNonLocalVar, dDeltaHatPDNonLocalVar; - if (dDeltaHatDDNonLocalVar.size() != _numNonLocalVar){ - dDeltaHatDDNonLocalVar.resize(_numNonLocalVar); - dDeltaHatQDNonLocalVar.resize(_numNonLocalVar); - dDeltaHatPDNonLocalVar.resize(_numNonLocalVar); - } + static std::vector<double> dDeltaHatDDNonLocalVar(_numNonLocalVar,0.), dDeltaHatQDNonLocalVar(_numNonLocalVar,0.), dDeltaHatPDNonLocalVar(_numNonLocalVar,0.); for (int i=0; i< _numNonLocalVar; i++){ // dtilde_fv @@ -4186,6 +4177,70 @@ bool mlawNonLocalPorosity::plasticCorrector_multipleNonLocalVariables(const STen return true; }; +void mlawNonLocalPorosity::voidCharacteristicsEvoltion_multipleNonLocalVariables(const STensor3& kcor, + const IPNonLocalPorosity *q0, IPNonLocalPorosity* q1, + std::vector<double>& DyieldfVDNonlocalVars, + STensor3& DyieldfVDKcor, const bool blockVoidGrowth + ) const +{ + if (blockVoidGrowth) + { + // purely plastic problem without void growth + q1->getRefToLocalPorosity() = q0->getLocalPorosity(); + q1->getRefToNonLocalPorosity() = q0->getNonLocalPorosity(); + q1->getRefToCorrectedPorosity() = q0->getCorrectedPorosity(); + q1->getRefToLocalLogarithmPorosity() = q0->getLocalLogarithmPorosity(); + q1->getRefToYieldPorosity() = q0->getYieldPorosity(); + // + for (int i=0; i< _numNonLocalVar; i++) + { + DyieldfVDNonlocalVars[i] = 0.; + } + STensorOperation::zero(DyieldfVDKcor); + } + else + { + // note the computation order + // nucleation--> porosities (local, nonlocal, yield ...) -> void state -> coalescence + + // Update nucleation state first + nucleation(q1->getNonLocalMatrixPlasticStrain(),q0->getNonLocalMatrixPlasticStrain(),q0->getYieldPorosity(),q1,q0); + + // update internal data with nonlocal variable + // nonlocal increment + double DeltaHatQNonLocal = q1->getNonLocalVolumetricPlasticStrain() - q0->getNonLocalVolumetricPlasticStrain(); + double DeltaHatPNonLocal = q1->getNonLocalMatrixPlasticStrain() - q0->getNonLocalMatrixPlasticStrain(); + double DeltaHatDNonLocal = q1->getNonLocalDeviatoricPlasticStrain() - q0->getNonLocalDeviatoricPlasticStrain(); + + // note that nonlocal var = [hatQ hatP hatD] + // void growth --> yield porosity = local porosity + localPorosityGrowth(q1,DeltaHatDNonLocal,DeltaHatQNonLocal,DeltaHatPNonLocal, + kcor,q0,true, + &DyieldfVDNonlocalVars[2],&DyieldfVDNonlocalVars[0],&DyieldfVDNonlocalVars[1],&DyieldfVDKcor); + // nonlocal + q1->getRefToNonLocalPorosity() = q1->getLocalPorosity(); + // corrected porosity + double & tildefVstar = q1->getRefToCorrectedPorosity(); + double DfVtildeStarDtildefV = q1->getConstRefToIPCoalescence().getAccelerateRate(); // current rate + tildefVstar = q0->getCorrectedPorosity() + DfVtildeStarDtildefV*(q1->getNonLocalPorosity() - q0->getNonLocalPorosity()); + // yield + q1->getRefToYieldPorosity() = _correctedRegularizedFunction->getVal(tildefVstar); + + // derivatives of yield porosity + double DyieldfVDDtildefV = _correctedRegularizedFunction->getDiff(tildefVstar)*DfVtildeStarDtildefV; + for (int i=0; i< 3; i++) + { + DyieldfVDNonlocalVars[i] *= DyieldfVDDtildefV; + } + DyieldfVDKcor *= (DyieldfVDDtildefV); + + // update void state + _voidEvolutionLaw->evolve(q0->getYieldPorosity(),q1->getYieldPorosity(),DeltaHatDNonLocal,DeltaHatQNonLocal,DeltaHatPNonLocal, + q0,q1, q0->getConstRefToIPVoidState(),q1->getRefToIPVoidState()); + _coalescenceLaw->computeIPCoalescence(q0,q1,&q0->getConstRefToIPCoalescence(),&q1->getRefToIPCoalescence()); + } +}; + void mlawNonLocalPorosity::predictorCorrector_multipleNonLocalVariables(const STensor3& F0, // initial deformation gradient (input @ time n) const STensor3& F1, // updated deformation gradient (input @ time n+1) STensor3 &P, // updated 1st Piola-Kirchhoff stress tensor (output) @@ -4248,7 +4303,10 @@ void mlawNonLocalPorosity::predictorCorrector_multipleNonLocalVariables(const ST ipvcur->getRefToIPCoalescence() = (ipvprev->getConstRefToIPCoalescence()); // // no nucleation - this->nucleation(ipvcur->getNonLocalMatrixPlasticStrain(),ipvprev->getNonLocalMatrixPlasticStrain(), ipvprev->getYieldPorosity(),ipvcur,ipvprev); + for (int i=0; i< _gdnLawContainer.size(); i++) + { + ipvcur->getRefToIPNucleation(i).resetNucleation(ipvprev->getConstRefToIPNucleation(i)); + } // const STensor3* Fp0 = &(ipvprev->getConstRefToFp()); @@ -4438,51 +4496,17 @@ void mlawNonLocalPorosity::predictorCorrector_multipleNonLocalVariables(const ST } if (!elasticFollowedBlocked){ - //Non local - // update internal data with nonlocal variable - // nonlocal in - double DeltaHatQNonLocal = ipvcur->getNonLocalVolumetricPlasticStrain() - ipvprev->getNonLocalVolumetricPlasticStrain(); - double DeltaHatDNonLocal = ipvcur->getNonLocalDeviatoricPlasticStrain() - ipvprev->getNonLocalDeviatoricPlasticStrain(); - double DeltaHatPNonLocal = ipvcur->getNonLocalMatrixPlasticStrain() - ipvprev->getNonLocalMatrixPlasticStrain(); - double DeltafV = 0.; - - // Update nucleation state - nucleation(ipvcur->getNonLocalMatrixPlasticStrain(),ipvprev->getNonLocalMatrixPlasticStrain(),ipvprev->getYieldPorosity(),ipvcur,ipvprev); - - // void growth - localPorosityGrowth(DeltafV,DeltaHatDNonLocal,DeltaHatQNonLocal,DeltaHatPNonLocal, - corKirpr,ipvprev,ipvcur); - - // internal data - updateInternalVariables(ipvcur,ipvprev,0.,0.,0.,DeltafV,&T); - - // update yield porosity as it depends on nonlocal variable - double & tildefVstar = ipvcur->getRefToCorrectedPorosity(); - double DfVtildeStarDtildefVPrev = ipvprev->getConstRefToIPCoalescence().getAccelerateRate(); - tildefVstar = ipvprev->getCorrectedPorosity() + DfVtildeStarDtildefVPrev*DeltafV; - - double& yieldfV = ipvcur->getRefToYieldPorosity(); // value - double DyieldfVDDtildefV; // rate - if (plasticFollowedBlocked){ - yieldfV = ipvprev->getYieldPorosity(); - DyieldfVDDtildefV = 0.; - } - else{ - yieldfV = _correctedRegularizedFunction->getVal(tildefVstar); - DyieldfVDDtildefV = _correctedRegularizedFunction->getDiff(tildefVstar)*DfVtildeStarDtildefVPrev; - } - - _voidEvolutionLaw->evolve(ipvprev->getYieldPorosity(),ipvcur->getYieldPorosity(),DeltaHatDNonLocal,DeltaHatQNonLocal,DeltaHatPNonLocal, - ipvprev,ipvcur, ipvprev->getConstRefToIPVoidState(), ipvcur->getRefToIPVoidState()); - _coalescenceLaw->computeIPCoalescence(ipvprev,ipvcur,&ipvprev->getConstRefToIPCoalescence(),&ipvcur->getRefToIPCoalescence()); - - + static std::vector<double> DyieldfVDNonlocalVar(3,0.); + static STensor3 DyieldfVDKcorpr; + voidCharacteristicsEvoltion_multipleNonLocalVariables(corKirpr,ipvprev,ipvcur,DyieldfVDNonlocalVar,DyieldfVDKcorpr,plasticFollowedBlocked); // check with previous value + double yieldfV = ipvcur->getYieldPorosity(); // does not change during corrector double yieldF = yieldFunction(kCorPrEq,ppr,R,yieldfV,ipvprev,ipvcur,&T); plastic = (yieldF > _tol); - if (plastic){ - correctorOK = plasticCorrector_multipleNonLocalVariables(F1,yieldfV,DyieldfVDDtildefV,corKirpr,kcorprDev,ppr,ipvprev,ipvcur, + correctorOK = plasticCorrector_multipleNonLocalVariables(F1, + yieldfV,DyieldfVDNonlocalVar,DyieldfVDKcorpr, + corKirpr,kcorprDev,ppr,ipvprev,ipvcur, Fe,Ce,Ee,Le,dLe,stiff,DcorKirprDEpr,DkcorprDevDEpr,DpprDEpr, DcorKirDEpr,DcorKirDNonLocalVar, DFpDEpr,DFpDNonLocalVar, @@ -4494,17 +4518,21 @@ void mlawNonLocalPorosity::predictorCorrector_multipleNonLocalVariables(const ST // substepping devide by 0 untile converge int numSubStep = 2.; int numAttempt = 0; - static STensor3 dF, Fcur; + + static STensor3 dF; dF = F1; dF -= F0; - - static IPNonLocalPorosity ipvTemp(*ipvprev); - double dT,Tcur;//---------added for substepping temperature - dT = T - T0; + double DeltaHatQNonLocal = ipvcur->getNonLocalVolumetricPlasticStrain() - ipvprev->getNonLocalVolumetricPlasticStrain(); + double DeltaHatPNonLocal = ipvcur->getNonLocalMatrixPlasticStrain() - ipvprev->getNonLocalMatrixPlasticStrain(); + double DeltaHatDNonLocal = ipvcur->getNonLocalDeviatoricPlasticStrain() - ipvprev->getNonLocalDeviatoricPlasticStrain(); + double dT = T - T0; + + static IPNonLocalPorosity* ipvTemp = dynamic_cast<IPNonLocalPorosity*>(ipvprev->clone()); // do not known type of ip a priori + while (true){ bool success = true; int iter = 0; - ipvTemp.operator =(*dynamic_cast<const IPVariable*>(ipvprev)); // take privious value + ipvTemp->operator =(*dynamic_cast<const IPVariable*>(ipvprev)); // take privious value while (iter < numSubStep){ @@ -4516,61 +4544,33 @@ void mlawNonLocalPorosity::predictorCorrector_multipleNonLocalVariables(const ST estimateStiff = stiff; } - // + //update current kinematic variables + static STensor3 Fcur; Fcur = F0; Fcur.daxpy(dF,fact); ipvcur->getRefToNonLocalVolumetricPlasticStrain() = ipvprev->getNonLocalVolumetricPlasticStrain() + fact*DeltaHatQNonLocal; ipvcur->getRefToNonLocalDeviatoricPlasticStrain() = ipvprev->getNonLocalDeviatoricPlasticStrain() + fact*DeltaHatDNonLocal; ipvcur->getRefToNonLocalMatrixPlasticStrain() = ipvprev->getNonLocalMatrixPlasticStrain() + fact*DeltaHatPNonLocal; - Tcur = T0 + fact*dT;//------for temperature substepping - + double Tcur = T0 + fact*dT;//------for temperature substepping + ipvcur->setTemperature(Tcur); // some dependence on temperature must be followed + //elastic predictor - Fp0 = &ipvTemp.getConstRefToFp(); - // Fp - ipvcur->getRefToFp() = ipvTemp.getConstRefToFp(); - + Fp0 = &ipvTemp->getConstRefToFp(); elasticPredictor(Fcur,*Fp0,corKirpr,kcorprDev,ppr,DcorKirprDEpr,DkcorprDevDEpr,DpprDEpr,Fepr,Cepr,Epr,Lepr,dLepr,estimateStiff, &Tcur,&DcorKirprDT,&DkcorprDevDT,&dpprDT); - //check yield condition kCorPrEq = sqrt(1.5*kcorprDev.dotprod()); - R = ipvTemp.getConstRefToIPJ2IsotropicHardening().getR(); - - // void growth - double subDeltaHatDNonLocal = DeltaHatDNonLocal/(double)numSubStep; - double subDeltaHatQNonLocal = DeltaHatQNonLocal/(double)numSubStep; - double subDeltaHatPNonLocal = DeltaHatPNonLocal/(double)numSubStep; - - - nucleation(ipvcur->getNonLocalMatrixPlasticStrain(),ipvTemp.getNonLocalMatrixPlasticStrain(),ipvprev->getYieldPorosity(),ipvcur,&ipvTemp); - - localPorosityGrowth(DeltafV,subDeltaHatDNonLocal,subDeltaHatQNonLocal,subDeltaHatPNonLocal, - corKirpr,&ipvTemp,ipvcur); - // internal data - updateInternalVariables(ipvcur,&ipvTemp,0.,0.,0.,DeltafV,&Tcur); - - // update yield porosity as it depends on nonlocal variable - tildefVstar = ipvTemp.getCorrectedPorosity() + DfVtildeStarDtildefVPrev*DeltafV; - if (plasticFollowedBlocked){ - yieldfV = ipvprev->getYieldPorosity(); - DyieldfVDDtildefV = 0.; - } - else{ - yieldfV = _correctedRegularizedFunction->getVal(tildefVstar); - DyieldfVDDtildefV = _correctedRegularizedFunction->getDiff(tildefVstar)*DfVtildeStarDtildefVPrev; - } + R = ipvTemp->getConstRefToIPJ2IsotropicHardening().getR(); + voidCharacteristicsEvoltion_multipleNonLocalVariables(corKirpr,ipvTemp,ipvcur,DyieldfVDNonlocalVar,DyieldfVDKcorpr,plasticFollowedBlocked); - _voidEvolutionLaw->evolve(ipvTemp.getYieldPorosity(),ipvcur->getYieldPorosity(),subDeltaHatDNonLocal,subDeltaHatQNonLocal,subDeltaHatPNonLocal, - &ipvTemp,ipvcur, ipvTemp.getConstRefToIPVoidState(), ipvcur->getRefToIPVoidState()); - _coalescenceLaw->computeIPCoalescence(&ipvTemp,ipvcur,&ipvTemp.getConstRefToIPCoalescence(),&ipvcur->getRefToIPCoalescence()); - - - yieldF = yieldFunction(kCorPrEq,ppr,R,yieldfV,&ipvTemp,ipvcur,&Tcur); + yieldfV = ipvcur->getYieldPorosity(); // does not change during corrector + yieldF = yieldFunction(kCorPrEq,ppr,R,yieldfV,ipvTemp,ipvcur,&Tcur); plastic = (yieldF > _tol); if (plastic){ - correctorOK = plasticCorrector_multipleNonLocalVariables(Fcur,yieldfV,DyieldfVDDtildefV, - corKirpr,kcorprDev,ppr,&ipvTemp,ipvcur, + correctorOK = plasticCorrector_multipleNonLocalVariables(Fcur, + yieldfV,DyieldfVDNonlocalVar,DyieldfVDKcorpr, + corKirpr,kcorprDev,ppr,ipvTemp,ipvcur, Fe,Ce,Ee,Le,dLe,estimateStiff,DcorKirprDEpr,DkcorprDevDEpr,DpprDEpr, DcorKirDEpr,DcorKirDNonLocalVar, DFpDEpr,DFpDNonLocalVar, @@ -4582,10 +4582,9 @@ void mlawNonLocalPorosity::predictorCorrector_multipleNonLocalVariables(const ST break; } } - // next step if (iter < numSubStep){ - ipvTemp.operator =(*dynamic_cast<const IPVariable*>(ipvcur)); + ipvTemp->operator =(*static_cast<const IPVariable*>(ipvcur)); } } if (!success){ @@ -4610,7 +4609,11 @@ void mlawNonLocalPorosity::predictorCorrector_multipleNonLocalVariables(const ST } else{ //reset nucleation - nucleation(ipvprev->getNonLocalMatrixPlasticStrain(),ipvprev->getNonLocalMatrixPlasticStrain(),ipvprev->getYieldPorosity(),ipvcur,ipvprev); + // no nucleation + for (int i=0; i< _gdnLawContainer.size(); i++) + { + ipvcur->getRefToIPNucleation(i).resetNucleation(ipvprev->getConstRefToIPNucleation(i)); + } } } } @@ -4743,24 +4746,7 @@ void mlawNonLocalPorosity::I1J2J3_updateInternalVariables(IPNonLocalPorosity *q1 STensorOperation::decomposeDevTr(DeltaEp, devDeltaEp, DeltaHatQ); DeltaHatD = sqrt(2.*STensorOperation::doubledot(devDeltaEp,devDeltaEp)/3.); - - double& hatP = q1->getRefToMatrixPlasticStrain(); - hatP = hatPn + DeltaHatP; - - double& hatQ = q1->getRefToVolumetricPlasticStrain(); - hatQ = hatQn + DeltaHatQ; - - double& hatD = q1->getRefToDeviatoricPlasticStrain(); - hatD = hatDn + DeltaHatD; - - // update hardening - if (isThermomechanicallyCoupled()){ - _j2IH->hardening(hatPn,q0->getConstRefToIPJ2IsotropicHardening(),hatP,*T, q1->getRefToIPJ2IsotropicHardening()); - } - else{ - _j2IH->hardening(hatPn,q0->getConstRefToIPJ2IsotropicHardening(),hatP,q1->getRefToIPJ2IsotropicHardening()); - } - + updateInternalVariables(q1,q0,DeltaHatD,DeltaHatQ,DeltaHatP); }; void mlawNonLocalPorosity::I1J2J3_voidCharacteristicsEvoltion_NonLocal(const STensor3& kcor, @@ -4777,7 +4763,6 @@ void mlawNonLocalPorosity::I1J2J3_voidCharacteristicsEvoltion_NonLocal(const STe double DeltaHatPNonLocal = nonlocalVars[1] - nonlocalVarsPrev[1]; double DeltaHatDNonLocal = nonlocalVars[2] - nonlocalVarsPrev[2]; - double DeltafVtilde; double DDeltafVtildeDDeltaHatDNonLocal, DDeltafVtildeDDeltaHatQNonLocal, DDeltafVtildeDDeltaHatPNonLocal; static STensor3 DDeltafVtildeDKcor; @@ -4785,25 +4770,24 @@ void mlawNonLocalPorosity::I1J2J3_voidCharacteristicsEvoltion_NonLocal(const STe nucleation(q1->getNonLocalMatrixPlasticStrain(),q0->getNonLocalMatrixPlasticStrain(),q0->getYieldPorosity(),q1,q0); // nonlocal void growth - localPorosityGrowth(DeltafVtilde, DeltaHatDNonLocal,DeltaHatQNonLocal,DeltaHatPNonLocal, - kcor,q0,q1, stiff, + localPorosityGrowth(q1, DeltaHatDNonLocal,DeltaHatQNonLocal,DeltaHatPNonLocal, + kcor,q0, stiff, &DDeltafVtildeDDeltaHatDNonLocal, &DDeltafVtildeDDeltaHatQNonLocal,&DDeltafVtildeDDeltaHatPNonLocal, &DDeltafVtildeDKcor); // - double& fV = q1->getRefToLocalPorosity(); + double fV = q1->getLocalPorosity(); double& fVtilde = q1->getRefToNonLocalPorosity(); double& fVtildeStar = q1->getRefToCorrectedPorosity(); double& yieldfV = q1->getRefToYieldPorosity(); // update void - fV = q0->getLocalPorosity() + DeltafVtilde; - fVtilde = q0->getNonLocalPorosity() + DeltafVtilde; + fVtilde = fV; // update yield porosity as it depends on nonlocal variable - double DfVtildeStarDtildefVPrev = q0->getConstRefToIPCoalescence().getAccelerateRate(); - fVtildeStar = q0->getCorrectedPorosity() + DfVtildeStarDtildefVPrev*DeltafVtilde; + double DfVtildeStarDtildefV = q1->getConstRefToIPCoalescence().getAccelerateRate(); + fVtildeStar = q0->getCorrectedPorosity() + DfVtildeStarDtildefV*(q1->getLocalPorosity() - q0->getLocalPorosity()); yieldfV = _correctedRegularizedFunction->getVal(fVtildeStar); - double DyieldfVDDfVtilde = _correctedRegularizedFunction->getDiff(fVtildeStar)*DfVtildeStarDtildefVPrev; + double DyieldfVDDfVtilde = _correctedRegularizedFunction->getDiff(fVtildeStar)*DfVtildeStarDtildefV; // update void state _voidEvolutionLaw->evolve(q0->getYieldPorosity(),q1->getYieldPorosity(),DeltaHatDNonLocal,DeltaHatQNonLocal,DeltaHatPNonLocal, @@ -5432,8 +5416,11 @@ void mlawNonLocalPorosity::I1J2J3_predictorCorrector_NonLocal(const STensor3& F0 // coalescence from previous state ipvcur->getRefToIPCoalescence() = (ipvprev->getConstRefToIPCoalescence()); // - // no nucleation - this->nucleation(ipvcur->getNonLocalMatrixPlasticStrain(),ipvprev->getNonLocalMatrixPlasticStrain(), ipvprev->getYieldPorosity(),ipvcur,ipvprev); + // no nucleation + for (int i=0; i< _gdnLawContainer.size(); i++) + { + ipvcur->getRefToIPNucleation(i).resetNucleation(ipvprev->getConstRefToIPNucleation(i)); + } // const STensor3* Fp0 = &(ipvprev->getConstRefToFp()); diff --git a/NonLinearSolver/materialLaw/mlawNonLocalPorous.h b/NonLinearSolver/materialLaw/mlawNonLocalPorous.h index 835c6280073f9d745b7bbef17a9875883198fa23..8b8e5c376f946b599e818652ff738f72d57e1155 100644 --- a/NonLinearSolver/materialLaw/mlawNonLocalPorous.h +++ b/NonLinearSolver/materialLaw/mlawNonLocalPorous.h @@ -89,7 +89,6 @@ protected: // Failure management double _fV_failure; // max porosity in yield surface (value for which fG=0) double _localfVFailure; // max local porosity at failure (almost 1) - scalarFunction* _localRegularizedFunction; // Regularisation function for local values scalarFunction* _correctedRegularizedFunction; // Regularisation function for yield/effective values double _failedTol; // tolerance applied on max values at which the IP is considered as failed. @@ -135,7 +134,6 @@ protected: virtual void setShearPorosityGrowthFactor(const double k); virtual void setStressTriaxialityFunction_kw(const scalarFunction& fct); virtual void setFailureTolerance(const double NewFailureTol); - virtual void setLocalRegularizedFunction(const scalarFunction& fct); virtual void setCorrectedRegularizedFunction(const scalarFunction& fct); virtual void setPostBlockedDissipationBehavior(const int method); virtual void clearCLengthLaw(); @@ -368,27 +366,36 @@ protected: // Case-dependent functions virtual double yieldFunction(const double kcorEq, const double pcor, const double R, const double yieldfV, const IPNonLocalPorosity* q0, const IPNonLocalPorosity* q1, const double* T = NULL) const = 0; - - virtual void computeResidual(SVector3& res, STensor3& J, + + // when considereing nonlocal porosity, + virtual void computeResidual_NonLocalPorosity(SVector3& res, STensor3& J, const double kcorEqpr, const double pcorpr, const double R, const double H, - const double yieldfV, const double DyieldfVDfV, + const double yieldfV, const IPNonLocalPorosity *q0, const IPNonLocalPorosity* q1, const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, // 3 unknonwn - const double DeltafV, const double DDeltafVDDeltaHatD, const double DDeltafVDDeltaHatQ, const double DDeltafVDDeltaHatP, const double* T = NULL ) const = 0; - virtual void computeDResidual(STensor3 &dres0dEpr, STensor3 &dres1dEpr, STensor3 &dres2dEpr, + virtual void computeDResidual_NonLocalPorosity(STensor3 &dres0dEpr, STensor3 &dres1dEpr, STensor3 &dres2dEpr, double &dres0dtildefV, double &dres1dtildefV, double &dres2dtildefV, const STensor3& devKcorpr, const double kcorEqpr, const double pcorpr, const double R, - const double yieldfV, const double DyieldfVDfV, const double DyieldfVDtildefV, - const STensor3& DDeltafVDEpr, const STensor43& DdevKcorprDEpr, const STensor3& DpcorprDEpr, + const double yieldfV, const STensor3& DyieldfVDKcorpr, const double DyieldfVDtildefV, + const STensor43& DKcorprDEpr, const STensor43& DdevKcorprDEpr, const STensor3& DpcorprDEpr, const IPNonLocalPorosity *q0, const IPNonLocalPorosity* q1, const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, const double* T = NULL, const double* DRDT= NULL, - const STensor3* DdevKcorprDT = NULL, const double* DpcorprDT = NULL, const double* DDeltafVDT = NULL, + const STensor3* DdevKcorprDT = NULL, const double* DpcorprDT = NULL, const STensor3* DKcorprDT = NULL, double *dres0dT= NULL, double *dres1dT= NULL, double *dres2dT = NULL ) const = 0; + + virtual void computeResidualLocal(SVector3& res, STensor3& J, + const double kcorEqpr, const double pcorpr, const double R, const double H, + const double yieldfV, const double DyieldfVDfV, + const IPNonLocalPorosity *q0, const IPNonLocalPorosity* q1, + const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, // 3 unknonwn + const double DDeltafVDDeltaHatD, const double DDeltafVDDeltaHatQ, const double DDeltafVDDeltaHatP, + const double* T = NULL + ) const = 0; virtual void computeDResidualLocal(STensor3 &dres0dEpr, STensor3 &dres1dEpr, STensor3 &dres2dEpr, const STensor3& devKcorpr, const double kcorEqpr, const double pcorpr, const double R, @@ -403,40 +410,41 @@ protected: // Multiple nonlocal version virtual void computeResidual_multipleNonLocalVariables(SVector3& res, STensor3& J, - const double kcorEqpr, const double pcorpr, const double R, const double H, - const double yieldfV, const double DyieldfVDfVtilde, - const IPNonLocalPorosity *q0, const IPNonLocalPorosity* q1, - const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, // 3 unknonwn - const double DeltafV, const double* T = NULL - ) const = 0; + const double kcorEqpr, const double pcorpr, const double R, const double H, + const double yieldfV, + const IPNonLocalPorosity *q0, const IPNonLocalPorosity* q1, + const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, // 3 unknonwn + const double* T = NULL + ) const = 0; virtual void computeDResidual_multipleNonLocalVariables(STensor3 &dres0dEpr, STensor3 &dres1dEpr, STensor3 &dres2dEpr, - std::vector<double> &dres0dtildefV, std::vector<double> &dres1dtildefV, std::vector<double> &dres2dtildefV, + std::vector<double> &dres0dNonlocalVars, std::vector<double> &dres1dNonlocalVars, std::vector<double> &dres2dNonlocalVars, const STensor3& devKcorpr, const double kcorEqpr, const double pcorpr, const double R, - const double yieldfV, const double DyieldfVDfV, const std::vector<double>& DyieldfVDtildefV, - const STensor3& DDeltafVDEpr, const STensor43& DdevKcorprDEpr, const STensor3& DpcorprDEpr, + const double yieldfV, const STensor3& DyieldfVDkcorpr, const std::vector<double>& DyieldfVDNonlocalVars, + const STensor43& DkcorprDEpr, const STensor43& DdevKcorprDEpr, const STensor3& DpcorprDEpr, const IPNonLocalPorosity *q0, const IPNonLocalPorosity* q1, const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, const double* T = NULL, const double* DRDT= NULL, - const STensor3* DdevKcorprDT = NULL, const double* DpcorprDT = NULL, const double* DDeltafVDT = NULL, + const STensor3* DdevKcorprDT = NULL, const double* DpcorprDT = NULL, const STensor3* DKcorprVDT = NULL, double *dres0dT= NULL, double *dres1dT= NULL, double *dres2dT = NULL ) const = 0; // Internal state and failure management virtual double getOnsetCriterion(const IPNonLocalPorosity* q1) const = 0; - virtual void checkInternalState(IPVariable* ipv, const IPVariable* ipvprev) const; - virtual void nucleation(const double p1, const double p0, const double f0, IPNonLocalPorosity* q1, const IPNonLocalPorosity *q0) const=0; virtual void checkCoalescence(IPNonLocalPorosity* q1, const IPNonLocalPorosity *q0, const double* T) const = 0; virtual void checkFailed(IPNonLocalPorosity* q1, const IPNonLocalPorosity *q0) const = 0; + virtual void checkInternalState(IPVariable* ipv, const IPVariable* ipvprev) const; + virtual void nucleation(const double p1, const double p0, const double f0, IPNonLocalPorosity* q1, const IPNonLocalPorosity *q0) const; + // void expansion from growth, nucleation and shear // in the integrated form, it is a function of // plastic defos as DeltaHatD=deviatoric plastic defo, DeltaHatQ = volumetric plastic defor, DeltaHatP=matrixPlasticDefo // and kcor - virtual void localPorosityGrowth(double& DeltafV, + virtual void localPorosityGrowth(IPNonLocalPorosity *q1, const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, - const STensor3& Kcor, const IPNonLocalPorosity *q0, const IPNonLocalPorosity *q1, + const STensor3& Kcor, const IPNonLocalPorosity *q0, bool stiff = false, double* DDeltafVDDeltaHatD=NULL, double* DDeltafVDDeltaHatQ=NULL, double* DDeltafVDDeltaHatP=NULL, STensor3* DDeltafVDKcor=NULL) const; @@ -506,12 +514,12 @@ protected: // Update internal variables during corrector iterations virtual void updateInternalVariables(IPNonLocalPorosity *q1, const IPNonLocalPorosity* q0, - const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, const double DeltafV, + const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, const double* T = NULL) const; // Update plastic state at the end of a plastic corrector step (and check for coalescence) virtual void updatePlasticState(IPNonLocalPorosity *q1, const IPNonLocalPorosity* q0, const STensor3& F1, - const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, const double DeltafV, + const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, const STensor3& devKcorpr, const double kcorEqpr, const double pcorpr, const double yield, STensor3& Fe1, STensor3& Ce, STensor3& Ee, STensor43& Le, STensor63& dLe, STensor3& DGNp, STensor3& devDGNp, double& trDGNp, STensor43& Dexp, @@ -555,8 +563,15 @@ protected: double* dLocalPorosityDT = NULL, const double T0 = 0.,const double T = 0. ) const; - - virtual bool plasticCorrector_NonLocalPorosity(const STensor3& F1, const double& tildefVstar,const double& DtildefVstarDtildefV, + + virtual void voidCharacteristicsEvoltion_NonLocalPorosity(const STensor3& kcor, + const IPNonLocalPorosity *q0, IPNonLocalPorosity* q1, + const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, + double& DfVDDeltaHatD, double& DfVDDeltaHatQ, double& DfVDDeltaHatP, + STensor3& DfVDkcorpr) const; + + virtual bool plasticCorrector_NonLocalPorosity(const STensor3& F1, + const double& yieldfV,const double& DyieldfVDtildefV, const STensor3& Kcorpr, const STensor3& devKcorpr, const double& pcorpr, const IPNonLocalPorosity *q0, IPNonLocalPorosity *q1, STensor3& Fe, STensor3& Ce, STensor3& Ee, STensor43& Le, STensor63& dLe, @@ -571,7 +586,13 @@ protected: ) const; - + virtual void voidCharacteristicsEvoltionLocal(const STensor3& kcor, + const IPNonLocalPorosity *q0, IPNonLocalPorosity* q1, + const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, + const double DtildefVstarDDeltafV, + double& DyieldfVDDeltafV, + double& DDeltafVDDeltaHatD, double& DDeltafVDDeltaHatQ, double& DDeltafVDDeltaHatP, + STensor3& DDeltafVDKcor) const; // Predictor-corrector and plastic corrector for local case virtual void predictorCorrectorLocal(const STensor3& F0, // initial deformation gradient (input @ time n) const STensor3& Fn, // updated deformation gradient (input @ time n+1) @@ -743,8 +764,13 @@ protected: STensor3* DKcorDT= NULL, STensor3* DFpDT= NULL ) const; - - virtual bool plasticCorrector_multipleNonLocalVariables(const STensor3& F1, const double& yieldfV,const double& DyieldfVDDeltafV, + virtual void voidCharacteristicsEvoltion_multipleNonLocalVariables(const STensor3& kcor, + const IPNonLocalPorosity *q0, IPNonLocalPorosity* q1, + std::vector<double>& DyieldfVDNonlocalVars, + STensor3& DyieldfVDKcor, const bool blockVoidGrowth + ) const; + virtual bool plasticCorrector_multipleNonLocalVariables(const STensor3& F1, + const double& yieldfV,const std::vector<double>& DyieldfVDNonlocalVar, const STensor3& DyieldfVDKcorpr, const STensor3& Kcorpr, const STensor3& devKcorpr, const double& pcorpr, const IPNonLocalPorosity *q0, IPNonLocalPorosity *q1, STensor3& Fe, STensor3& Ce, STensor3& Ee, STensor43& Le, STensor63& dLe, diff --git a/NonLinearSolver/materialLaw/mlawNonLocalPorousCoalescence.cpp b/NonLinearSolver/materialLaw/mlawNonLocalPorousCoalescence.cpp index fc9c1aaa599451392de1499b52df752f15c532cc..cd7b9b0069552d7561ebcd5945001cc8b6690260 100644 --- a/NonLinearSolver/materialLaw/mlawNonLocalPorousCoalescence.cpp +++ b/NonLinearSolver/materialLaw/mlawNonLocalPorousCoalescence.cpp @@ -127,9 +127,6 @@ double mlawNonLocalPorousThomasonLaw::getOnsetCriterion(const IPNonLocalPorosity return q1->getConstRefToIPVoidState().getVoidLigamentRatio(); }; -void mlawNonLocalPorousThomasonLaw::nucleation(const double p1, const double p0, const double f0, IPNonLocalPorosity* q1, const IPNonLocalPorosity *q0) const{ - // do nothing -}; void mlawNonLocalPorousThomasonLaw::checkCoalescence(IPNonLocalPorosity* q1, const IPNonLocalPorosity *q0, const double* T) const{ // do nothing @@ -424,12 +421,11 @@ void mlawNonLocalPorousThomasonLaw::plasticFlowDerivatives(fullVector<double>& g }; -void mlawNonLocalPorousThomasonLaw::computeResidual(SVector3& res, STensor3& J, +void mlawNonLocalPorousThomasonLaw::computeResidual_NonLocalPorosity(SVector3& res, STensor3& J, const double kcorEqpr, const double pcorpr, const double R, const double H, - const double yieldfV, const double DyieldfVDfV, + const double yieldfV, const IPNonLocalPorosity *q0, const IPNonLocalPorosity* q1, const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, // 3 unknonwn - const double DeltafV, const double DDeltafVDDeltaHatD, const double DDeltafVDDeltaHatQ, const double DDeltafVDDeltaHatP, const double* T ) const { @@ -439,19 +435,19 @@ void mlawNonLocalPorousThomasonLaw::computeResidual(SVector3& res, STensor3& J, // Get values double Chi = voidState->getVoidLigamentRatio(); - double DChiDDeltafV = voidState->getDVoidLigamentRatioDYieldPorosity()*DyieldfVDfV; + double DChiDyieldfV = voidState->getDVoidLigamentRatioDYieldPorosity(); double DChiDDeltaHatD = voidState->getDVoidLigamentRatioDDeviatoricPlasticDeformation(); double DChiDDeltaHatQ = voidState->getDVoidLigamentRatioDVolumetricPlasticDeformation(); double DChiDDeltaHatP = voidState->getDVoidLigamentRatioDMatrixPlasticDeformation(); double W = voidState->getVoidAspectRatio(); - double DWDDeltafV = voidState->getDVoidAspectRatioDYieldPorosity()*DyieldfVDfV; + double DWDyieldfV = voidState->getDVoidAspectRatioDYieldPorosity(); double DWDDeltaHatD = voidState->getDVoidAspectRatioDDeviatoricPlasticDeformation(); double DWDDeltaHatQ = voidState->getDVoidAspectRatioDVolumetricPlasticDeformation(); double DWDDeltaHatP = voidState->getDVoidAspectRatioDMatrixPlasticDeformation(); double gamma = voidState->getVoidShapeFactor(); - double DgammaDDeltafV = voidState->getDVoidShapeFactorDYieldPorosity()*DyieldfVDfV; + double DgammaDyieldfV = voidState->getDVoidShapeFactorDYieldPorosity(); double DgammaDDeltaHatD = voidState->getDVoidShapeFactorDDeviatoricPlasticDeformation(); double DgammaDDeltaHatQ = voidState->getDVoidShapeFactorDVolumetricPlasticDeformation(); double DgammaDDeltaHatP = voidState->getDVoidShapeFactorDMatrixPlasticDeformation(); @@ -506,34 +502,25 @@ void mlawNonLocalPorousThomasonLaw::computeResidual(SVector3& res, STensor3& J, computeYieldDerivatives(gradf,kcorEq,pcor,R,Chi,W,q0,q1,T); plasticFlowDerivatives(gradNs,gradNv,kcorEq,pcor,R,Chi,W,q0,q1,T); - double Dres0DfV = gradf(3)*DChiDDeltafV + gradf(4)*DWDDeltafV; - // Dres0DDeltaHatD - J(0,0) = gradf(0)*DkcorEqDDeltaHatD+ gradf(3)*DChiDDeltaHatD + gradf(4)*DWDDeltaHatD + Dres0DfV*DDeltafVDDeltaHatD; + J(0,0) = gradf(0)*DkcorEqDDeltaHatD+ gradf(3)*DChiDDeltaHatD + gradf(4)*DWDDeltaHatD; // Dres0DDeltaHatQ - J(0,1) = gradf(1)*DpcorDDeltaHatQ + gradf(3)*DChiDDeltaHatQ + gradf(4)*DWDDeltaHatQ+ Dres0DfV*DDeltafVDDeltaHatQ; + J(0,1) = gradf(1)*DpcorDDeltaHatQ + gradf(3)*DChiDDeltaHatQ + gradf(4)*DWDDeltaHatQ; // Dres0DDeltaHatP - J(0,2) = gradf(2)*H+ + gradf(3)*DChiDDeltaHatP + gradf(4)*DWDDeltaHatP + Dres0DfV*DDeltafVDDeltaHatP; - - double Dres1DfV = R0*(DeltaHatD*gradNv(3)- DeltaHatQ*gradNs(3))*DChiDDeltafV + - R0*(DeltaHatD*gradNv(4)- DeltaHatQ*gradNs(4))*DWDDeltafV; - + J(0,2) = gradf(2)*H+ + gradf(3)*DChiDDeltaHatP + gradf(4)*DWDDeltaHatP; // Dres1DDeltaHatD J(1,0) = R0*(Nv + DeltaHatD*gradNv(0)*DkcorEqDDeltaHatD - DeltaHatQ*gradNs(0)*DkcorEqDDeltaHatD) + R0*(DeltaHatD*gradNv(3)- DeltaHatQ*gradNs(3))*DChiDDeltaHatD + - R0*(DeltaHatD*gradNv(4)- DeltaHatQ*gradNs(4))*DWDDeltaHatD + - Dres1DfV*DDeltafVDDeltaHatD; + R0*(DeltaHatD*gradNv(4)- DeltaHatQ*gradNs(4))*DWDDeltaHatD; // Dres1DDeltaHatQ J(1,1) = R0*(DeltaHatD*gradNv(1)*DpcorDDeltaHatQ- Ns - DeltaHatQ*gradNs(1)*DpcorDDeltaHatQ) + R0*(DeltaHatD*gradNv(3)- DeltaHatQ*gradNs(3))*DChiDDeltaHatQ + - R0*(DeltaHatD*gradNv(4)- DeltaHatQ*gradNs(4))*DWDDeltaHatQ + - Dres1DfV*DDeltafVDDeltaHatQ; + R0*(DeltaHatD*gradNv(4)- DeltaHatQ*gradNs(4))*DWDDeltaHatQ; // Dres1DDeltaHatP - J(1,2) = R0*(DeltaHatD*gradNv(2) - DeltaHatQ*gradNs(2))*H + + J(1,2) = R0*(DeltaHatD*gradNv(2) - DeltaHatQ*gradNs(2))*H+ R0*(DeltaHatD*gradNv(3)- DeltaHatQ*gradNs(3))*DChiDDeltaHatP+ - R0*(DeltaHatD*gradNv(4)- DeltaHatQ*gradNs(4))*DWDDeltaHatP+ - Dres1DfV*DDeltafVDDeltaHatP; + R0*(DeltaHatD*gradNv(4)- DeltaHatQ*gradNs(4))*DWDDeltaHatP; if (_balanceEquationType == 1){ // Dres2DDeltaHatd @@ -544,13 +531,12 @@ void mlawNonLocalPorousThomasonLaw::computeResidual(SVector3& res, STensor3& J, J(2,2) = (1-f0)*(R + H*DeltaHatP)/R0; } else if (_balanceEquationType == 2){ - double Dres2DfV =(2.*DgammaDDeltafV*yieldfV*DeltaHatP - 2.*Chi*DChiDDeltafV*DeltaHatD + 2.*gamma*DeltaHatP*DyieldfVDfV)/f0; // Dres2DDeltaHatD - J(2,0) = (2.*DgammaDDeltaHatD*yieldfV*DeltaHatP - Chi*Chi- 2.*Chi*DChiDDeltaHatD*DeltaHatD)/f0 + Dres2DfV*DDeltafVDDeltaHatD; + J(2,0) = (2.*DgammaDDeltaHatD*yieldfV*DeltaHatP - Chi*Chi- 2.*Chi*DChiDDeltaHatD*DeltaHatD)/f0; // Dres2DDeltaHatQ - J(2,1) = (2.*DgammaDDeltaHatQ*yieldfV*DeltaHatP - 2.*Chi*DChiDDeltaHatQ*DeltaHatD)/f0 + Dres2DfV*DDeltafVDDeltaHatQ; + J(2,1) = (2.*DgammaDDeltaHatQ*yieldfV*DeltaHatP - 2.*Chi*DChiDDeltaHatQ*DeltaHatD)/f0; // Dres2DDeltaHatP - J(2,2) = (2.*DgammaDDeltaHatP*yieldfV*DeltaHatP+2.*gamma*yieldfV - 2.*Chi*DChiDDeltaHatP*DeltaHatD)/f0 + Dres2DfV*DDeltafVDDeltaHatP; + J(2,2) = (2.*DgammaDDeltaHatP*yieldfV*DeltaHatP+2.*gamma*yieldfV - 2.*Chi*DChiDDeltaHatP*DeltaHatD)/f0; } else{ Msg::Fatal("balance equation is not defined"); @@ -559,31 +545,28 @@ void mlawNonLocalPorousThomasonLaw::computeResidual(SVector3& res, STensor3& J, }; -void mlawNonLocalPorousThomasonLaw::computeDResidual(STensor3 &dres0dEpr, STensor3 &dres1dEpr, STensor3 &dres2dEpr, +void mlawNonLocalPorousThomasonLaw::computeDResidual_NonLocalPorosity(STensor3 &dres0dEpr, STensor3 &dres1dEpr, STensor3 &dres2dEpr, double &dres0dtildefV, double &dres1dtildefV, double &dres2dtildefV, const STensor3& devKcorpr, const double kcorEqpr, const double pcorpr, const double R, - const double yieldfV, const double DyieldfVDfV, const double DyieldfVDtildefV, - const STensor3& DDeltafVDEpr, const STensor43& DdevKcorprDEpr, const STensor3& DpcorprDEpr, + const double yieldfV, const STensor3& DyieldfVDKcorpr, const double DyieldfVDtildefV, + const STensor43& DKcorprDEpr, const STensor43& DdevKcorprDEpr, const STensor3& DpcorprDEpr, const IPNonLocalPorosity *q0, const IPNonLocalPorosity* q1, const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, const double* T, const double* DRDT, - const STensor3* DdevKcorprDT , const double* DpcorprDT, const double* DDeltafVDT, + const STensor3* DdevKcorprDT , const double* DpcorprDT, const STensor3* DKcorprDT, double *dres0dT, double *dres1dT, double *dres2dT ) const{ const IPVoidState* voidState = &q1->getConstRefToIPVoidState(); double Chi = voidState->getVoidLigamentRatio(); - double DChiDDeltafV = voidState->getDVoidLigamentRatioDYieldPorosity()*DyieldfVDfV; - double DChiDtildefV = voidState->getDVoidLigamentRatioDYieldPorosity()*DyieldfVDtildefV; + double DChiDyieldfV = voidState->getDVoidLigamentRatioDYieldPorosity(); double W = voidState->getVoidAspectRatio(); - double DWDDeltafV = voidState->getDVoidAspectRatioDYieldPorosity()*DyieldfVDfV; - double DWDtildefV = voidState->getDVoidAspectRatioDYieldPorosity()*DyieldfVDtildefV; + double DWDyieldfV = voidState->getDVoidAspectRatioDYieldPorosity(); double gamma = voidState->getVoidShapeFactor(); - double DgammaDDeltafV = voidState->getDVoidShapeFactorDYieldPorosity()*DyieldfVDfV; - double DgammaDtildefV = voidState->getDVoidShapeFactorDYieldPorosity()*DyieldfVDtildefV; + double DgammaDyieldfV = voidState->getDVoidShapeFactorDYieldPorosity(); double f0 = q1->getInitialPorosity(); double R0 = _j2IH->getYield0(); // reference value @@ -594,7 +577,10 @@ void mlawNonLocalPorousThomasonLaw::computeDResidual(STensor3 &dres0dEpr, STenso KT=bulkModulus(*T); muT=shearModulus(*T); } - + + static STensor3 DyieldfVDEpr; + STensorOperation::multSTensor3STensor43(DyieldfVDKcorpr,DKcorprDEpr,DyieldfVDEpr); + static STensor3 DkcorEqprDEpr; STensorOperation::multSTensor3STensor43(devKcorpr,DdevKcorprDEpr,DkcorEqprDEpr); DkcorEqprDEpr *= (1.5/kcorEqpr); @@ -614,29 +600,29 @@ void mlawNonLocalPorousThomasonLaw::computeDResidual(STensor3 &dres0dEpr, STenso // compute Dres0DEpr double Dres0DkcorEq = gradf(0); double Dres0Dpcor = gradf(1); - double Dres0DDeltafV = gradf(3)*DChiDDeltafV+gradf(4)*DWDDeltafV; + double Dres0DyieldfV = gradf(3)*DChiDyieldfV+gradf(4)*DWDyieldfV; dres0dEpr = DkcorEqDEpr; dres0dEpr*= Dres0DkcorEq; dres0dEpr.daxpy(DpcorDEpr,Dres0Dpcor); - dres0dEpr.daxpy(DDeltafVDEpr,Dres0DDeltafV); + dres0dEpr.daxpy(DyieldfVDEpr,Dres0DyieldfV); // compute Dres1DEpr double Dres1DkcorEq = R0*(DeltaHatD*gradNv(0)- DeltaHatQ*gradNs(0)); double Dres1Dpcor = R0*(DeltaHatD*gradNv(1)- DeltaHatQ*gradNs(1)); - double Dres1DDeltafV = R0*(DeltaHatD*gradNv(3)- DeltaHatQ*gradNs(3))*DChiDDeltafV + - R0*(DeltaHatD*gradNv(4)- DeltaHatQ*gradNs(4))*DWDDeltafV; + double Dres1DyieldfV = R0*(DeltaHatD*gradNv(3)- DeltaHatQ*gradNs(3))*DChiDyieldfV + + R0*(DeltaHatD*gradNv(4)- DeltaHatQ*gradNs(4))*DWDyieldfV; dres1dEpr = DkcorEqDEpr; dres1dEpr *= Dres1DkcorEq; dres1dEpr.daxpy(DpcorDEpr,Dres1Dpcor); - dres1dEpr.daxpy(DDeltafVDEpr,Dres1DDeltafV); + dres1dEpr.daxpy(DyieldfVDEpr,Dres1DyieldfV); // compute Dres2DEpr double Dres2DkcorEq = 0.; double Dres2Dpcor = 0.; double Dres2DChi = 0.; - double Dres2DDeltafV = 0.; + double Dres2DyieldfV = 0.; if (_balanceEquationType == 1){ Dres2DkcorEq = (-DeltaHatD)/R0; @@ -647,23 +633,22 @@ void mlawNonLocalPorousThomasonLaw::computeDResidual(STensor3 &dres0dEpr, STenso dres2dEpr.daxpy(DpcorDEpr,Dres2Dpcor); } else if (_balanceEquationType == 2){ - Dres2DDeltafV = (2.*DgammaDDeltafV*yieldfV*DeltaHatP - 2.*Chi*DChiDDeltafV*DeltaHatD + 2.*gamma*DeltaHatP*DyieldfVDfV)/f0; - dres2dEpr = DDeltafVDEpr; - dres2dEpr *= Dres2DDeltafV; + Dres2DyieldfV = (2.*DgammaDyieldfV*yieldfV*DeltaHatP - 2.*Chi*DChiDyieldfV*DeltaHatD + 2.*gamma*DeltaHatP)/f0; + dres2dEpr = DyieldfVDEpr; + dres2dEpr *= Dres2DyieldfV; } else{ Msg::Fatal("balance equation is not defined"); } // compute nonlocal derivative - dres0dtildefV = gradf(3)*DChiDtildefV+gradf(4)*DWDtildefV; - dres1dtildefV = R0*(DeltaHatD*gradNv(3)- DeltaHatQ*gradNs(3))*DChiDtildefV + - R0*(DeltaHatD*gradNv(4)- DeltaHatQ*gradNs(4))*DWDtildefV; + dres0dtildefV = (gradf(3)*DChiDyieldfV+gradf(4)*DWDyieldfV)*DyieldfVDtildefV; + dres1dtildefV = (R0*(DeltaHatD*gradNv(3)- DeltaHatQ*gradNs(3))*DChiDyieldfV + R0*(DeltaHatD*gradNv(4)- DeltaHatQ*gradNs(4))*DWDyieldfV)*DyieldfVDtildefV; if (_balanceEquationType == 1){ dres2dtildefV = 0.; } else if (_balanceEquationType == 2){ - dres2dtildefV = (2.*DgammaDtildefV*yieldfV*DeltaHatP - 2.*Chi*DChiDtildefV*DeltaHatD + 2.*gamma*DeltaHatP*DyieldfVDtildefV)/f0; + dres2dtildefV = (2.*DgammaDyieldfV*yieldfV*DeltaHatP - 2.*Chi*DChiDyieldfV*DeltaHatD + 2.*gamma*DeltaHatP)*DyieldfVDtildefV/f0; } else{ Msg::Fatal("balance equation is not defined"); @@ -673,11 +658,11 @@ void mlawNonLocalPorousThomasonLaw::computeDResidual(STensor3 &dres0dEpr, STenso double dKdT=bulkModulusDerivative(*T); double dmudT=shearModulusDerivative(*T); + static double DkcorEqDT, DpcorDT; DkcorEqDT = STensorOperation::doubledot(devKcorpr,*DdevKcorprDT)*1.5/kcorEqpr - 3.*dmudT*DeltaHatD; DpcorDT = *DpcorprDT -dKdT* DeltaHatQ; - double partDres0DT = gradf(2)*(*DRDT) + gradf(5); // yield temperature-dependent *dres0dT = Dres0DkcorEq*DkcorEqDT + Dres0Dpcor*DpcorDT + partDres0DT; @@ -689,7 +674,8 @@ void mlawNonLocalPorousThomasonLaw::computeDResidual(STensor3 &dres0dEpr, STenso *dres2dT = Dres2DkcorEq*DkcorEqDT + Dres2Dpcor*DpcorDT+ partDres2DT; } else if (_balanceEquationType == 2){ - *dres2dT = Dres2DDeltafV*(*DDeltafVDT); + double DyieldfVDT = STensorOperation::doubledot(DyieldfVDKcorpr,*DKcorprDT); + *dres2dT = Dres2DyieldfV*DyieldfVDT; } else{ Msg::Fatal("balance equation is not defined"); @@ -697,6 +683,140 @@ void mlawNonLocalPorousThomasonLaw::computeDResidual(STensor3 &dres0dEpr, STenso } }; +void mlawNonLocalPorousThomasonLaw::computeResidualLocal(SVector3& res, STensor3& J, + const double kcorEqpr, const double pcorpr, const double R, const double H, + const double yieldfV, const double DyieldfVDfV, + const IPNonLocalPorosity *q0, const IPNonLocalPorosity* q1, + const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, // 3 unknonwn + const double DDeltafVDDeltaHatD, const double DDeltafVDDeltaHatQ, const double DDeltafVDDeltaHatP, + const double* T + ) const +{ + // Get ipv + const IPVoidState* voidStatePrev = &q0->getConstRefToIPVoidState(); + const IPVoidState* voidState = &q1->getConstRefToIPVoidState(); + + // Get values + double Chi = voidState->getVoidLigamentRatio(); + double DChiDDeltafV = voidState->getDVoidLigamentRatioDYieldPorosity()*DyieldfVDfV; + double DChiDDeltaHatD = voidState->getDVoidLigamentRatioDDeviatoricPlasticDeformation(); + double DChiDDeltaHatQ = voidState->getDVoidLigamentRatioDVolumetricPlasticDeformation(); + double DChiDDeltaHatP = voidState->getDVoidLigamentRatioDMatrixPlasticDeformation(); + + double W = voidState->getVoidAspectRatio(); + double DWDDeltafV = voidState->getDVoidAspectRatioDYieldPorosity()*DyieldfVDfV; + double DWDDeltaHatD = voidState->getDVoidAspectRatioDDeviatoricPlasticDeformation(); + double DWDDeltaHatQ = voidState->getDVoidAspectRatioDVolumetricPlasticDeformation(); + double DWDDeltaHatP = voidState->getDVoidAspectRatioDMatrixPlasticDeformation(); + + double gamma = voidState->getVoidShapeFactor(); + double DgammaDDeltafV = voidState->getDVoidShapeFactorDYieldPorosity()*DyieldfVDfV; + double DgammaDDeltaHatD = voidState->getDVoidShapeFactorDDeviatoricPlasticDeformation(); + double DgammaDDeltaHatQ = voidState->getDVoidShapeFactorDVolumetricPlasticDeformation(); + double DgammaDDeltaHatP = voidState->getDVoidShapeFactorDMatrixPlasticDeformation(); + + + double yieldfVprev = q0->getYieldPorosity(); + double Chiprev = voidStatePrev->getVoidLigamentRatio(); + double gammprev = voidStatePrev->getVoidShapeFactor(); + + double f0 = q1->getInitialPorosity(); + double R0 = _j2IH->getYield0(); + + + // Get elastic parameters + double KT= _K; + double muT = _mu; + if (isThermomechanicallyCoupled()){ + KT = bulkModulus(*T); + muT =shearModulus(*T); + }; + + // Corrected stress invariants + double kcorEq = kcorEqpr - 3.*muT*DeltaHatD; + double pcor = pcorpr - KT*DeltaHatQ; + + + // Residues + // 1. yield function + res(0) = yieldFunction(kcorEq,pcor,R,yieldfV,q0,q1,T); + + + // 2. plastic flow normality + double Ns, Nv; // plastic flow components + plasticFlow(Ns,Nv,kcorEq,pcor,R,Chi,W,q0,q1,T); + res(1) = R0*(DeltaHatD*Nv- DeltaHatQ*Ns); + + // plastic energy balance + if (_balanceEquationType == 1){ + res(2) = ((1-f0)*R*DeltaHatP - kcorEq*DeltaHatD - pcor*DeltaHatQ)/R0; + } + else if (_balanceEquationType == 2){ + res(2) = (2.*gamma*yieldfV*DeltaHatP - (Chi*Chi)*DeltaHatD)/f0; + } + else{ + Msg::Fatal("balance equation is not defined"); + } + + double DkcorEqDDeltaHatD = -3.*muT; + double DpcorDDeltaHatQ = -KT; + + static fullVector<double> gradf, gradNs, gradNv; + computeYieldDerivatives(gradf,kcorEq,pcor,R,Chi,W,q0,q1,T); + plasticFlowDerivatives(gradNs,gradNv,kcorEq,pcor,R,Chi,W,q0,q1,T); + + double Dres0DfV = gradf(3)*DChiDDeltafV + gradf(4)*DWDDeltafV; + + // Dres0DDeltaHatD + J(0,0) = gradf(0)*DkcorEqDDeltaHatD+ gradf(3)*DChiDDeltaHatD + gradf(4)*DWDDeltaHatD + Dres0DfV*DDeltafVDDeltaHatD; + // Dres0DDeltaHatQ + J(0,1) = gradf(1)*DpcorDDeltaHatQ + gradf(3)*DChiDDeltaHatQ + gradf(4)*DWDDeltaHatQ+ Dres0DfV*DDeltafVDDeltaHatQ; + // Dres0DDeltaHatP + J(0,2) = gradf(2)*H+ + gradf(3)*DChiDDeltaHatP + gradf(4)*DWDDeltaHatP + Dres0DfV*DDeltafVDDeltaHatP; + + double Dres1DfV = R0*(DeltaHatD*gradNv(3)- DeltaHatQ*gradNs(3))*DChiDDeltafV + + R0*(DeltaHatD*gradNv(4)- DeltaHatQ*gradNs(4))*DWDDeltafV; + + + // Dres1DDeltaHatD + J(1,0) = R0*(Nv + DeltaHatD*gradNv(0)*DkcorEqDDeltaHatD - DeltaHatQ*gradNs(0)*DkcorEqDDeltaHatD) + + R0*(DeltaHatD*gradNv(3)- DeltaHatQ*gradNs(3))*DChiDDeltaHatD + + R0*(DeltaHatD*gradNv(4)- DeltaHatQ*gradNs(4))*DWDDeltaHatD + + Dres1DfV*DDeltafVDDeltaHatD; + // Dres1DDeltaHatQ + J(1,1) = R0*(DeltaHatD*gradNv(1)*DpcorDDeltaHatQ- Ns - DeltaHatQ*gradNs(1)*DpcorDDeltaHatQ) + + R0*(DeltaHatD*gradNv(3)- DeltaHatQ*gradNs(3))*DChiDDeltaHatQ + + R0*(DeltaHatD*gradNv(4)- DeltaHatQ*gradNs(4))*DWDDeltaHatQ + + Dres1DfV*DDeltafVDDeltaHatQ; + // Dres1DDeltaHatP + J(1,2) = R0*(DeltaHatD*gradNv(2) - DeltaHatQ*gradNs(2))*H + + R0*(DeltaHatD*gradNv(3)- DeltaHatQ*gradNs(3))*DChiDDeltaHatP+ + R0*(DeltaHatD*gradNv(4)- DeltaHatQ*gradNs(4))*DWDDeltaHatP+ + Dres1DfV*DDeltafVDDeltaHatP; + + if (_balanceEquationType == 1){ + // Dres2DDeltaHatd + J(2,0) = (-kcorEq - DkcorEqDDeltaHatD*DeltaHatD)/R0; + // Dres2DDeltaHatq + J(2,1) = (-pcor - DpcorDDeltaHatQ*DeltaHatQ)/R0; + // Dres2DDeltaHatp + J(2,2) = (1-f0)*(R + H*DeltaHatP)/R0; + } + else if (_balanceEquationType == 2){ + double Dres2DfV =(2.*DgammaDDeltafV*yieldfV*DeltaHatP - 2.*Chi*DChiDDeltafV*DeltaHatD + 2.*gamma*DeltaHatP*DyieldfVDfV)/f0; + // Dres2DDeltaHatD + J(2,0) = (2.*DgammaDDeltaHatD*yieldfV*DeltaHatP - Chi*Chi- 2.*Chi*DChiDDeltaHatD*DeltaHatD)/f0 + Dres2DfV*DDeltafVDDeltaHatD; + // Dres2DDeltaHatQ + J(2,1) = (2.*DgammaDDeltaHatQ*yieldfV*DeltaHatP - 2.*Chi*DChiDDeltaHatQ*DeltaHatD)/f0 + Dres2DfV*DDeltafVDDeltaHatQ; + // Dres2DDeltaHatP + J(2,2) = (2.*DgammaDDeltaHatP*yieldfV*DeltaHatP+2.*gamma*yieldfV - 2.*Chi*DChiDDeltaHatP*DeltaHatD)/f0 + Dres2DfV*DDeltafVDDeltaHatP; + } + else{ + Msg::Fatal("balance equation is not defined"); + } + + +}; void mlawNonLocalPorousThomasonLaw::computeDResidualLocal(STensor3 &dres0dEpr, STensor3 &dres1dEpr, STensor3 &dres2dEpr, const STensor3& devKcorpr, const double kcorEqpr, const double pcorpr, const double R, @@ -821,10 +941,10 @@ void mlawNonLocalPorousThomasonLaw::computeDResidualLocal(STensor3 &dres0dEpr, S void mlawNonLocalPorousThomasonLaw::computeResidual_multipleNonLocalVariables(SVector3& res, STensor3& J, const double kcorEqpr, const double pcorpr, const double R, const double H, - const double yieldfV, const double DyieldfVDfV, + const double yieldfV, const IPNonLocalPorosity *q0, const IPNonLocalPorosity* q1, const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, // 3 unknonwn - const double DeltafV, const double* T + const double* T ) const{ // note that Chi, W, gamma are nonlocal @@ -919,27 +1039,27 @@ void mlawNonLocalPorousThomasonLaw::computeResidual_multipleNonLocalVariables(SV void mlawNonLocalPorousThomasonLaw::computeDResidual_multipleNonLocalVariables(STensor3 &dres0dEpr, STensor3 &dres1dEpr, STensor3 &dres2dEpr, - std::vector<double> &dres0dtildefV, std::vector<double> &dres1dtildefV, std::vector<double> &dres2dtildefV, + std::vector<double> &dres0dNonlocalVars, std::vector<double> &dres1dNonlocalVars, std::vector<double> &dres2dNonlocalVars, const STensor3& devKcorpr, const double kcorEqpr, const double pcorpr, const double R, - const double yieldfV, const double DyieldfVDfV, const std::vector<double>& DyieldfVDtildefV, - const STensor3& DDeltafVDEpr, const STensor43& DdevKcorprDEpr, const STensor3& DpcorprDEpr, + const double yieldfV, const STensor3& DyieldfVDkcorpr, const std::vector<double>& DyieldfVDNonlocalVars, + const STensor43& DkcorprDEpr, const STensor43& DdevKcorprDEpr, const STensor3& DpcorprDEpr, const IPNonLocalPorosity *q0, const IPNonLocalPorosity* q1, const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, const double* T, const double* DRDT, - const STensor3* DdevKcorprDT , const double* DpcorprDT, const double* DDeltafVDT, + const STensor3* DdevKcorprDT , const double* DpcorprDT, const STensor3* DKcorprVDT, double *dres0dT, double *dres1dT, double *dres2dT ) const{ const IPVoidState* voidState = &q1->getConstRefToIPVoidState(); double Chi = voidState->getVoidLigamentRatio(); - double DChiDDeltafV = voidState->getDVoidLigamentRatioDYieldPorosity()*DyieldfVDfV; + double DChiDyieldfV = voidState->getDVoidLigamentRatioDYieldPorosity(); double W = voidState->getVoidAspectRatio(); - double DWDDeltafV = voidState->getDVoidAspectRatioDYieldPorosity()*DyieldfVDfV; + double DWDyieldfV = voidState->getDVoidAspectRatioDYieldPorosity(); double gamma = voidState->getVoidShapeFactor(); - double DgammaDDeltafV = voidState->getDVoidShapeFactorDYieldPorosity()*DyieldfVDfV; + double DgammaDyieldfV = voidState->getDVoidShapeFactorDYieldPorosity(); double f0 = q1->getInitialPorosity(); double R0 = _j2IH->getYield0(); // reference value @@ -950,6 +1070,9 @@ void mlawNonLocalPorousThomasonLaw::computeDResidual_multipleNonLocalVariables(S KT=bulkModulus(*T); muT=shearModulus(*T); } + + static STensor3 DyieldfVDEpr; + STensorOperation::multSTensor3STensor43(DyieldfVDkcorpr,DkcorprDEpr,DyieldfVDEpr); static STensor3 DkcorEqprDEpr; STensorOperation::multSTensor3STensor43(devKcorpr,DdevKcorprDEpr,DkcorEqprDEpr); @@ -970,31 +1093,32 @@ void mlawNonLocalPorousThomasonLaw::computeDResidual_multipleNonLocalVariables(S // compute Dres0DEpr double Dres0DkcorEq = gradf(0); double Dres0Dpcor = gradf(1); - double Dres0DDeltafV = gradf(3)*DChiDDeltafV+gradf(4)*DWDDeltafV; + double Dres0DyieldfV = gradf(3)*DChiDyieldfV+gradf(4)*DWDyieldfV; dres0dEpr = DkcorEqDEpr; dres0dEpr*= Dres0DkcorEq; dres0dEpr.daxpy(DpcorDEpr,Dres0Dpcor); - dres0dEpr.daxpy(DDeltafVDEpr,Dres0DDeltafV); + dres0dEpr.daxpy(DyieldfVDEpr,Dres0DyieldfV); // compute Dres1DEpr double Dres1DkcorEq = R0*(DeltaHatD*gradNv(0)- DeltaHatQ*gradNs(0)); double Dres1Dpcor = R0*(DeltaHatD*gradNv(1)- DeltaHatQ*gradNs(1)); - double Dres1DDeltafV = R0*(DeltaHatD*gradNv(3)- DeltaHatQ*gradNs(3))*DChiDDeltafV + - R0*(DeltaHatD*gradNv(4)- DeltaHatQ*gradNs(4))*DWDDeltafV; + double Dres1DyieldfV = R0*(DeltaHatD*gradNv(3)- DeltaHatQ*gradNs(3))*DChiDyieldfV + + R0*(DeltaHatD*gradNv(4)- DeltaHatQ*gradNs(4))*DWDyieldfV; dres1dEpr = DkcorEqDEpr; dres1dEpr *= Dres1DkcorEq; dres1dEpr.daxpy(DpcorDEpr,Dres1Dpcor); - dres1dEpr.daxpy(DDeltafVDEpr,Dres1DDeltafV); + dres1dEpr.daxpy(DyieldfVDEpr,Dres1DyieldfV); // compute Dres2DEpr double Dres2DkcorEq = 0.; double Dres2Dpcor = 0.; double Dres2DChi = 0.; - double Dres2DDeltafV = 0.; + double Dres2DyieldfV = 0.; if (_balanceEquationType == 1){ + // ((1-f0)*R*DeltaHatP - kcorEq*DeltaHatD - pcor*DeltaHatQ)/R0; Dres2DkcorEq = (-DeltaHatD)/R0; Dres2Dpcor = (-DeltaHatQ)/R0; @@ -1003,21 +1127,17 @@ void mlawNonLocalPorousThomasonLaw::computeDResidual_multipleNonLocalVariables(S dres2dEpr.daxpy(DpcorDEpr,Dres2Dpcor); } else if (_balanceEquationType == 2){ - Dres2DDeltafV = (2.*DgammaDDeltafV*yieldfV*DeltaHatP - 2.*Chi*DChiDDeltafV*DeltaHatD+ 2.*gamma*DeltaHatP*DyieldfVDfV)/f0; + // (2.*gamma*yieldfV*DeltaHatP - (Chi*Chi)*DeltaHatD)/f0; + Dres2DyieldfV = (2.*DgammaDyieldfV*yieldfV*DeltaHatP - 2.*Chi*DChiDyieldfV*DeltaHatD+ 2.*gamma*DeltaHatP)/f0; - dres2dEpr= DDeltafVDEpr; - dres2dEpr *= Dres2DDeltafV; + dres2dEpr= DyieldfVDEpr; + dres2dEpr *= Dres2DyieldfV; } else{ Msg::Fatal("balance equation is not defined"); } - static std::vector<double> DChiDtildefV, DWDtildefV; - if (DChiDtildefV.size() != _numNonLocalVar){ - DChiDtildefV.resize(_numNonLocalVar); - DWDtildefV.resize(_numNonLocalVar); - } - + static std::vector<double> DChiDNonlocalVars(3,0.), DWDNonlocalVars(3,0.); double DChiDDeltaHatDNonLocal = voidState->getDVoidLigamentRatioDDeviatoricPlasticDeformation(); double DChiDDeltaHatQNonLocal = voidState->getDVoidLigamentRatioDVolumetricPlasticDeformation(); @@ -1027,29 +1147,29 @@ void mlawNonLocalPorousThomasonLaw::computeDResidual_multipleNonLocalVariables(S double DWDDeltaHatQNonLocal = voidState->getDVoidAspectRatioDVolumetricPlasticDeformation(); double DWDDeltaHatPNonLocal = voidState->getDVoidAspectRatioDMatrixPlasticDeformation(); - DChiDtildefV[0] = DChiDDeltaHatQNonLocal; - DChiDtildefV[1] = DChiDDeltaHatPNonLocal; - DChiDtildefV[2] = DChiDDeltaHatDNonLocal; + DChiDNonlocalVars[0] = DChiDDeltaHatQNonLocal; + DChiDNonlocalVars[1] = DChiDDeltaHatPNonLocal; + DChiDNonlocalVars[2] = DChiDDeltaHatDNonLocal; - DWDtildefV[0] = DWDDeltaHatQNonLocal; - DWDtildefV[1] = DWDDeltaHatPNonLocal; - DWDtildefV[2] = DWDDeltaHatDNonLocal; + DWDNonlocalVars[0] = DWDDeltaHatQNonLocal; + DWDNonlocalVars[1] = DWDDeltaHatPNonLocal; + DWDNonlocalVars[2] = DWDDeltaHatDNonLocal; for (int i=0; i< _numNonLocalVar; i++){ - DChiDtildefV[i] += voidState->getDVoidLigamentRatioDYieldPorosity()*DyieldfVDtildefV[i]; - DWDtildefV[i] += voidState->getDVoidAspectRatioDYieldPorosity()*DyieldfVDtildefV[i]; + DChiDNonlocalVars[i] += voidState->getDVoidLigamentRatioDYieldPorosity()*DyieldfVDNonlocalVars[i]; + DWDNonlocalVars[i] += voidState->getDVoidAspectRatioDYieldPorosity()*DyieldfVDNonlocalVars[i]; } for (int i=0; i< _numNonLocalVar; i++){ // compute nonlocal derivative - dres0dtildefV[i] = gradf(3)*DChiDtildefV[i]+gradf(4)*DWDtildefV[i]; - dres1dtildefV[i] = R0*(DeltaHatD*gradNv(3)- DeltaHatQ*gradNs(3))*DChiDtildefV[i] + - R0*(DeltaHatD*gradNv(4)- DeltaHatQ*gradNs(4))*DWDtildefV[i]; + dres0dNonlocalVars[i] = gradf(3)*DChiDNonlocalVars[i]+gradf(4)*DWDNonlocalVars[i]; + dres1dNonlocalVars[i] = R0*(DeltaHatD*gradNv(3)- DeltaHatQ*gradNs(3))*DChiDNonlocalVars[i] + + R0*(DeltaHatD*gradNv(4)- DeltaHatQ*gradNs(4))*DWDNonlocalVars[i]; if (_balanceEquationType == 1){ - dres2dtildefV[i] = 0.; + dres2dNonlocalVars[i] = 0.; } else if (_balanceEquationType == 2){ - dres2dtildefV[i] = Dres2DChi*DChiDtildefV[i] + 2.*gamma*DeltaHatP*DyieldfVDtildefV[i]/f0; + dres2dNonlocalVars[i] = Dres2DChi*DChiDNonlocalVars[i] + 2.*gamma*DeltaHatP*DyieldfVDNonlocalVars[i]/f0; } else{ Msg::Fatal("balance equation is not defined"); @@ -1077,7 +1197,8 @@ void mlawNonLocalPorousThomasonLaw::computeDResidual_multipleNonLocalVariables(S *dres2dT = Dres2DkcorEq*DkcorEqDT + Dres2Dpcor*DpcorDT+ partDres2DT; } else if (_balanceEquationType == 2){ - *dres2dT = Dres2DDeltafV*(*DDeltafVDT); + double DyieldfVDT= STensorOperation::doubledot(DyieldfVDkcorpr,*DKcorprVDT); + *dres2dT = Dres2DyieldfV*DyieldfVDT; } else{ Msg::Fatal("balance equation is not defined"); diff --git a/NonLinearSolver/materialLaw/mlawNonLocalPorousCoalescence.h b/NonLinearSolver/materialLaw/mlawNonLocalPorousCoalescence.h index ce84311bba571921ddbaae3c98f62a5547a5821b..71cf120320c511bd507d893972052a1e64aa1901 100644 --- a/NonLinearSolver/materialLaw/mlawNonLocalPorousCoalescence.h +++ b/NonLinearSolver/materialLaw/mlawNonLocalPorousCoalescence.h @@ -75,28 +75,37 @@ public: virtual double yieldFunction(const double kcorEq, const double pcor, const double R, const double yieldfV, const IPNonLocalPorosity* q0, const IPNonLocalPorosity* q1, const double* T = NULL) const; - virtual void computeResidual(SVector3& res, STensor3& J, + virtual void computeResidual_NonLocalPorosity(SVector3& res, STensor3& J, const double kcorEqpr, const double pcorpr, const double R, const double H, - const double yieldfV, const double DyieldfVDfV, + const double yieldfV, const IPNonLocalPorosity *q0, const IPNonLocalPorosity* q1, const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, // 3 unknonwn - const double DeltafV, const double DDeltafVDDeltaHatD, const double DDeltafVDDeltaHatQ, const double DDeltafVDDeltaHatP, const double* T = NULL ) const; - virtual void computeDResidual(STensor3 &dres0dEpr, STensor3 &dres1dEpr, STensor3 &dres2dEpr, + virtual void computeDResidual_NonLocalPorosity(STensor3 &dres0dEpr, STensor3 &dres1dEpr, STensor3 &dres2dEpr, double &dres0dtildefV, double &dres1dtildefV, double &dres2dtildefV, const STensor3& devKcorpr, const double kcorEqpr, const double pcorpr, const double R, - const double yieldfV, const double DyieldfVDfV, const double DyieldfVDtildefV, - const STensor3& DDeltafVDEpr, const STensor43& DdevKcorprDEpr, const STensor3& DpcorprDEpr, + const double yieldfV, const STensor3& DyieldfVDKcorpr, const double DyieldfVDtildefV, + const STensor43& DKcorprDEpr, const STensor43& DdevKcorprDEpr, const STensor3& DpcorprDEpr, const IPNonLocalPorosity *q0, const IPNonLocalPorosity* q1, const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, const double* T = NULL, const double* DRDT= NULL, - const STensor3* DdevKcorprDT = NULL, const double* DpcorprDT = NULL, const double* DDeltafVDT = NULL, + const STensor3* DdevKcorprDT = NULL, const double* DpcorprDT = NULL, const STensor3* DKcorprDT = NULL, double *dres0dT= NULL, double *dres1dT= NULL, double *dres2dT = NULL ) const; - + + + virtual void computeResidualLocal(SVector3& res, STensor3& J, + const double kcorEqpr, const double pcorpr, const double R, const double H, + const double yieldfV, const double DyieldfVDfV, + const IPNonLocalPorosity *q0, const IPNonLocalPorosity* q1, + const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, // 3 unknonwn + const double DDeltafVDDeltaHatD, const double DDeltafVDDeltaHatQ, const double DDeltafVDDeltaHatP, + const double* T = NULL + ) const; + virtual void computeDResidualLocal(STensor3 &dres0dEpr, STensor3 &dres1dEpr, STensor3 &dres2dEpr, const STensor3& devKcorpr, const double kcorEqpr, const double pcorpr, const double R, const double yieldfV, const double DyieldfVDfV, @@ -110,27 +119,26 @@ public: virtual void computeResidual_multipleNonLocalVariables(SVector3& res, STensor3& J, - const double kcorEqpr, const double pcorpr, const double R, const double H, - const double yieldfV, const double DyieldfVDfV, - const IPNonLocalPorosity *q0, const IPNonLocalPorosity* q1, - const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, // 3 unknonwn - const double DeltafV, const double* T = NULL - ) const; + const double kcorEqpr, const double pcorpr, const double R, const double H, + const double yieldfV, + const IPNonLocalPorosity *q0, const IPNonLocalPorosity* q1, + const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, // 3 unknonwn + const double* T = NULL + ) const; virtual void computeDResidual_multipleNonLocalVariables(STensor3 &dres0dEpr, STensor3 &dres1dEpr, STensor3 &dres2dEpr, - std::vector<double> &dres0dtildefV, std::vector<double> &dres1dtildefV, std::vector<double> &dres2dtildefV, + std::vector<double> &dres0dNonlocalVars, std::vector<double> &dres1dNonlocalVars, std::vector<double> &dres2dNonlocalVars, const STensor3& devKcorpr, const double kcorEqpr, const double pcorpr, const double R, - const double yieldfV, const double DyieldfVDfV, const std::vector<double>& DyieldfVDtildefV, - const STensor3& DDeltafVDEpr, const STensor43& DdevKcorprDEpr, const STensor3& DpcorprDEpr, + const double yieldfV, const STensor3& DyieldfVDkcorpr, const std::vector<double>& DyieldfVDtildefV, + const STensor43& DkcorprDEpr, const STensor43& DdevKcorprDEpr, const STensor3& DpcorprDEpr, const IPNonLocalPorosity *q0, const IPNonLocalPorosity* q1, const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, const double* T = NULL, const double* DRDT= NULL, - const STensor3* DdevKcorprDT = NULL, const double* DpcorprDT = NULL, const double* DDeltafVDT = NULL, + const STensor3* DdevKcorprDT = NULL, const double* DpcorprDT = NULL, const STensor3* DKcorprVDT = NULL, double *dres0dT= NULL, double *dres1dT= NULL, double *dres2dT = NULL ) const; virtual double getOnsetCriterion(const IPNonLocalPorosity* q1) const; - virtual void nucleation(const double p1, const double p0, const double f0, IPNonLocalPorosity* q1, const IPNonLocalPorosity *q0) const; virtual void checkCoalescence(IPNonLocalPorosity* q1, const IPNonLocalPorosity *q0, const double* T) const; virtual void checkFailed(IPNonLocalPorosity* q1, const IPNonLocalPorosity *q0) const; @@ -217,72 +225,83 @@ class mlawNonLocalPorousThomasonLawWithLodeEnhanced : public mlawNonLocalPorousT virtual double yieldFunction(const double kcorEq, const double pcor, const double R, const double yieldfV, const IPNonLocalPorosity* q0, const IPNonLocalPorosity* q1, const double* T = NULL) const { - Msg::Fatal("mlawNonLocalPorousThomasonLawWithLodeEnhanced cannot be used"); + Msg::Fatal("mlawNonLocalPorousThomasonLawWithLodeEnhanced::yieldFunction cannot be used"); }; - virtual void computeResidual(SVector3& res, STensor3& J, - const double kcorEqpr, const double pcorpr, const double R, const double H, - const double yieldfV, const double DyieldfVDfV, - const IPNonLocalPorosity *q0, const IPNonLocalPorosity* q1, - const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, // 3 unknonwn - const double DeltafV, const double DDeltafVDDeltaHatD, const double DDeltafVDDeltaHatQ, const double DDeltafVDDeltaHatP, - const double* T = NULL - ) const + virtual void computeResidual_NonLocalPorosity(SVector3& res, STensor3& J, + const double kcorEqpr, const double pcorpr, const double R, const double H, + const double yieldfV, + const IPNonLocalPorosity *q0, const IPNonLocalPorosity* q1, + const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, // 3 unknonwn + const double* T = NULL + ) const { - Msg::Fatal("mlawNonLocalPorousThomasonLawWithLodeEnhanced cannot be used"); + Msg::Fatal("mlawNonLocalPorousThomasonLawWithLodeEnhanced::computeResidual_NonLocalPorosity cannot be used"); }; - virtual void computeDResidual(STensor3 &dres0dEpr, STensor3 &dres1dEpr, STensor3 &dres2dEpr, - double &dres0dtildefV, double &dres1dtildefV, double &dres2dtildefV, - const STensor3& devKcorpr, const double kcorEqpr, const double pcorpr, const double R, - const double yieldfV, const double DyieldfVDfV, const double DyieldfVDtildefV, - const STensor3& DDeltafVDEpr, const STensor43& DdevKcorprDEpr, const STensor3& DpcorprDEpr, - const IPNonLocalPorosity *q0, const IPNonLocalPorosity* q1, - const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, - const double* T = NULL, const double* DRDT= NULL, - const STensor3* DdevKcorprDT = NULL, const double* DpcorprDT = NULL, const double* DDeltafVDT = NULL, - double *dres0dT= NULL, double *dres1dT= NULL, double *dres2dT = NULL - ) const + virtual void computeDResidual_NonLocalPorosity(STensor3 &dres0dEpr, STensor3 &dres1dEpr, STensor3 &dres2dEpr, + double &dres0dtildefV, double &dres1dtildefV, double &dres2dtildefV, + const STensor3& devKcorpr, const double kcorEqpr, const double pcorpr, const double R, + const double yieldfV, const STensor3& DyieldfVDKcorpr, const double DyieldfVDtildefV, + const STensor43& DKcorprDEpr, const STensor43& DdevKcorprDEpr, const STensor3& DpcorprDEpr, + const IPNonLocalPorosity *q0, const IPNonLocalPorosity* q1, + const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, + const double* T = NULL, const double* DRDT= NULL, + const STensor3* DdevKcorprDT = NULL, const double* DpcorprDT = NULL, const STensor3* DKcorprDT = NULL, + double *dres0dT= NULL, double *dres1dT= NULL, double *dres2dT = NULL + ) const { - Msg::Fatal("mlawNonLocalPorousThomasonLawWithLodeEnhanced cannot be used"); + Msg::Fatal("mlawNonLocalPorousThomasonLawWithLodeEnhanced::computeDResidual_NonLocalPorosity cannot be used"); + }; + + virtual void computeResidualLocal(SVector3& res, STensor3& J, + const double kcorEqpr, const double pcorpr, const double R, const double H, + const double yieldfV, const double DyieldfVDfV, + const IPNonLocalPorosity *q0, const IPNonLocalPorosity* q1, + const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, // 3 unknonwn + const double DDeltafVDDeltaHatD, const double DDeltafVDDeltaHatQ, const double DDeltafVDDeltaHatP, + const double* T = NULL + ) const + { + Msg::Fatal("mlawNonLocalPorousThomasonLawWithLodeEnhanced::computeResidualLocal cannot be used"); }; virtual void computeDResidualLocal(STensor3 &dres0dEpr, STensor3 &dres1dEpr, STensor3 &dres2dEpr, - const STensor3& devKcorpr, const double kcorEqpr, const double pcorpr, const double R, - const double yieldfV, const double DyieldfVDfV, - const STensor3& DDeltafVDEpr, const STensor43& DdevKcorprDEpr, const STensor3& DpcorprDEpr, - const IPNonLocalPorosity *q0, const IPNonLocalPorosity* q1, - const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, - const double* T = NULL, const double* DRDT= NULL, - const STensor3* DdevKcorprDT = NULL, const double* DpcorprDT = NULL, const double* DDeltafVDT = NULL, - double *dres0dT= NULL, double *dres1dT= NULL, double *dres2dT = NULL - ) const + const STensor3& devKcorpr, const double kcorEqpr, const double pcorpr, const double R, + const double yieldfV, const double DyieldfVDfV, + const STensor3& DDeltafVDEpr, const STensor43& DdevKcorprDEpr, const STensor3& DpcorprDEpr, + const IPNonLocalPorosity *q0, const IPNonLocalPorosity* q1, + const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, + const double* T = NULL, const double* DRDT= NULL, + const STensor3* DdevKcorprDT = NULL, const double* DpcorprDT = NULL, const double* DDeltafVDT = NULL, + double *dres0dT= NULL, double *dres1dT= NULL, double *dres2dT = NULL + ) const { - Msg::Fatal("mlawNonLocalPorousThomasonLawWithLodeEnhanced cannot be used"); + Msg::Fatal("mlawNonLocalPorousThomasonLawWithLodeEnhanced::computeDResidualLocal cannot be used"); }; // Multiple nonlocal version - virtual void computeResidual_multipleNonLocalVariables(SVector3& res, STensor3& J, - const double kcorEqpr, const double pcorpr, const double R, const double H, - const double yieldfV, const double DyieldfVDfVtilde, - const IPNonLocalPorosity *q0, const IPNonLocalPorosity* q1, - const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, // 3 unknonwn - const double DeltafV, const double* T = NULL - ) const + void computeResidual_multipleNonLocalVariables(SVector3& res, STensor3& J, + const double kcorEqpr, const double pcorpr, const double R, const double H, + const double yieldfV, + const IPNonLocalPorosity *q0, const IPNonLocalPorosity* q1, + const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, // 3 unknonwn + const double* T = NULL + ) const { Msg::Fatal("mlawNonLocalPorousThomasonLawWithLodeEnhanced cannot be used"); }; virtual void computeDResidual_multipleNonLocalVariables(STensor3 &dres0dEpr, STensor3 &dres1dEpr, STensor3 &dres2dEpr, - std::vector<double> &dres0dtildefV, std::vector<double> &dres1dtildefV, std::vector<double> &dres2dtildefV, + std::vector<double> &dres0dNonlocalVars, std::vector<double> &dres1dNonlocalVars, std::vector<double> &dres2dNonlocalVars, const STensor3& devKcorpr, const double kcorEqpr, const double pcorpr, const double R, - const double yieldfV, const double DyieldfVDfV, const std::vector<double>& DyieldfVDtildefV, - const STensor3& DDeltafVDEpr, const STensor43& DdevKcorprDEpr, const STensor3& DpcorprDEpr, + const double yieldfV, const STensor3& DyieldfVDkcorpr, const std::vector<double>& DyieldfVDtildefV, + const STensor43& DkcorprDEpr, const STensor43& DdevKcorprDEpr, const STensor3& DpcorprDEpr, const IPNonLocalPorosity *q0, const IPNonLocalPorosity* q1, const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, const double* T = NULL, const double* DRDT= NULL, - const STensor3* DdevKcorprDT = NULL, const double* DpcorprDT = NULL, const double* DDeltafVDT = NULL, + const STensor3* DdevKcorprDT = NULL, const double* DpcorprDT = NULL, const STensor3* DKcorprVDT = NULL, double *dres0dT= NULL, double *dres1dT= NULL, double *dres2dT = NULL ) const { diff --git a/NonLinearSolver/materialLaw/mlawNonLocalPorousCoupled.cpp b/NonLinearSolver/materialLaw/mlawNonLocalPorousCoupled.cpp index bfe96ff2dcc0a7355ce5de6424dd9d16084570c2..a3e06082fedb20544914b34d98cec38ebe907a3d 100644 --- a/NonLinearSolver/materialLaw/mlawNonLocalPorousCoupled.cpp +++ b/NonLinearSolver/materialLaw/mlawNonLocalPorousCoupled.cpp @@ -188,11 +188,6 @@ void mlawNonLocalPorousCoupledLaw::setFailureTolerance(const double NewFailureTo _mlawCoales->setFailureTolerance(NewFailureTol); }; -void mlawNonLocalPorousCoupledLaw::setLocalRegularizedFunction(const scalarFunction& fct){ - mlawNonLocalPorosity::setLocalRegularizedFunction(fct); - _mlawGrowth->setLocalRegularizedFunction(fct); - _mlawCoales->setLocalRegularizedFunction(fct); -}; void mlawNonLocalPorousCoupledLaw::setCorrectedRegularizedFunction(const scalarFunction& fct){ mlawNonLocalPorosity::setCorrectedRegularizedFunction(fct); _mlawGrowth->setCorrectedRegularizedFunction(fct); @@ -320,72 +315,93 @@ double mlawNonLocalPorousCoupledLaw::yieldFunction(const double kcorEq, const do else return _mlawGrowth->yieldFunction(kcorEq,pcor,R,yieldfV,q0,q1,T); }; - -void mlawNonLocalPorousCoupledLaw::computeResidual(SVector3& res, STensor3& J, +void mlawNonLocalPorousCoupledLaw::computeResidual_NonLocalPorosity(SVector3& res, STensor3& J, const double kcorEqpr, const double pcorpr, const double R, const double H, - const double yieldfV, const double DyieldfVDfV, + const double yieldfV, const IPNonLocalPorosity *q0, const IPNonLocalPorosity* q1, const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, // 3 unknonwn - const double DeltafV, const double DDeltafVDDeltaHatD, const double DDeltafVDDeltaHatQ, const double DDeltafVDDeltaHatP, const double* T ) const{ bool coalesFlag = q1->getConstRefToIPCoalescence().getCoalescenceActiveFlag(); if (coalesFlag){ - _mlawCoales->computeResidual(res,J,kcorEqpr,pcorpr,R,H,yieldfV,DyieldfVDfV,q0,q1, - DeltaHatD,DeltaHatQ,DeltaHatP,DeltafV, - DDeltafVDDeltaHatD,DDeltafVDDeltaHatQ,DDeltafVDDeltaHatP,T); + _mlawCoales->computeResidual_NonLocalPorosity(res,J,kcorEqpr,pcorpr,R,H,yieldfV,q0,q1, + DeltaHatD,DeltaHatQ,DeltaHatP,T); } else { - _mlawGrowth->computeResidual(res,J,kcorEqpr,pcorpr,R,H,yieldfV,DyieldfVDfV,q0,q1, - DeltaHatD,DeltaHatQ,DeltaHatP,DeltafV, - DDeltafVDDeltaHatD,DDeltafVDDeltaHatQ,DDeltafVDDeltaHatP,T); + _mlawGrowth->computeResidual_NonLocalPorosity(res,J,kcorEqpr,pcorpr,R,H,yieldfV,q0,q1, + DeltaHatD,DeltaHatQ,DeltaHatP,T); } } -void mlawNonLocalPorousCoupledLaw::computeDResidual(STensor3 &dres0dEpr, STensor3 &dres1dEpr, STensor3 &dres2dEpr, + +void mlawNonLocalPorousCoupledLaw::computeDResidual_NonLocalPorosity(STensor3 &dres0dEpr, STensor3 &dres1dEpr, STensor3 &dres2dEpr, double &dres0dtildefV, double &dres1dtildefV, double &dres2dtildefV, const STensor3& devKcorpr, const double kcorEqpr, const double pcorpr, const double R, - const double yieldfV, const double DyieldfVDfV, const double DyieldfVDtildefV, - const STensor3& DDeltafVDEpr, const STensor43& DdevKcorprDEpr, const STensor3& DpcorprDEpr, + const double yieldfV, const STensor3& DyieldfVDKcorpr, const double DyieldfVDtildefV, + const STensor43& DKcorprDEpr, const STensor43& DdevKcorprDEpr, const STensor3& DpcorprDEpr, const IPNonLocalPorosity *q0, const IPNonLocalPorosity* q1, const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, const double* T, const double* DRDT, - const STensor3* DdevKcorprDT , const double* DpcorprDT, const double* DDeltafVDT, + const STensor3* DdevKcorprDT , const double* DpcorprDT, const STensor3* DKcorprDT, double *dres0dT, double *dres1dT, double *dres2dT ) const{ bool coalesFlag = q1->getConstRefToIPCoalescence().getCoalescenceActiveFlag(); if (coalesFlag){ - _mlawCoales->computeDResidual(dres0dEpr,dres1dEpr,dres2dEpr, + _mlawCoales->computeDResidual_NonLocalPorosity(dres0dEpr,dres1dEpr,dres2dEpr, dres0dtildefV,dres1dtildefV,dres2dtildefV, devKcorpr,kcorEqpr,pcorpr,R, - yieldfV,DyieldfVDfV,DyieldfVDtildefV, - DDeltafVDEpr,DdevKcorprDEpr,DpcorprDEpr, + yieldfV,DyieldfVDKcorpr,DyieldfVDtildefV, + DKcorprDEpr,DdevKcorprDEpr,DpcorprDEpr, q0, q1, DeltaHatD,DeltaHatQ,DeltaHatP, T,DRDT, - DdevKcorprDT ,DpcorprDT,DDeltafVDT, + DdevKcorprDT ,DpcorprDT,DKcorprDT, dres0dT,dres1dT,dres2dT); } else { - _mlawGrowth->computeDResidual(dres0dEpr,dres1dEpr,dres2dEpr, + _mlawGrowth->computeDResidual_NonLocalPorosity(dres0dEpr,dres1dEpr,dres2dEpr, dres0dtildefV,dres1dtildefV,dres2dtildefV, devKcorpr,kcorEqpr,pcorpr,R, - yieldfV,DyieldfVDfV,DyieldfVDtildefV, - DDeltafVDEpr,DdevKcorprDEpr,DpcorprDEpr, + yieldfV,DyieldfVDKcorpr,DyieldfVDtildefV, + DKcorprDEpr,DdevKcorprDEpr,DpcorprDEpr, q0, q1, DeltaHatD,DeltaHatQ,DeltaHatP, T,DRDT, - DdevKcorprDT ,DpcorprDT,DDeltafVDT, + DdevKcorprDT ,DpcorprDT,DKcorprDT, dres0dT,dres1dT,dres2dT); } }; +void mlawNonLocalPorousCoupledLaw::computeResidualLocal(SVector3& res, STensor3& J, + const double kcorEqpr, const double pcorpr, const double R, const double H, + const double yieldfV, const double DyieldfVDfV, + const IPNonLocalPorosity *q0, const IPNonLocalPorosity* q1, + const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, // 3 unknonwn + const double DDeltafVDDeltaHatD, const double DDeltafVDDeltaHatQ, const double DDeltafVDDeltaHatP, + const double* T + ) const{ + + bool coalesFlag = q1->getConstRefToIPCoalescence().getCoalescenceActiveFlag(); + + if (coalesFlag){ + _mlawCoales->computeResidualLocal(res,J,kcorEqpr,pcorpr,R,H,yieldfV,DyieldfVDfV,q0,q1, + DeltaHatD,DeltaHatQ,DeltaHatP, + DDeltafVDDeltaHatD,DDeltafVDDeltaHatQ,DDeltafVDDeltaHatP,T); + } + else { + _mlawGrowth->computeResidualLocal(res,J,kcorEqpr,pcorpr,R,H,yieldfV,DyieldfVDfV,q0,q1, + DeltaHatD,DeltaHatQ,DeltaHatP, + DDeltafVDDeltaHatD,DDeltafVDDeltaHatQ,DDeltafVDDeltaHatP,T); + } +} + + void mlawNonLocalPorousCoupledLaw::computeDResidualLocal(STensor3 &dres0dEpr, STensor3 &dres1dEpr, STensor3 &dres2dEpr, const STensor3& devKcorpr, const double kcorEqpr, const double pcorpr, const double R, const double yieldfV, const double DyieldfVDfV, @@ -753,56 +769,56 @@ void mlawNonLocalPorousCoupledLaw::checkFailed(IPNonLocalPorosity* q1, const IPN void mlawNonLocalPorousCoupledLaw::computeResidual_multipleNonLocalVariables(SVector3& res, STensor3& J, const double kcorEqpr, const double pcorpr, const double R, const double H, - const double yieldfV, const double DyieldfVDfV, + const double yieldfV, const IPNonLocalPorosity *q0, const IPNonLocalPorosity* q1, const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, // 3 unknonwn - const double DeltafV, const double* T + const double* T ) const{ bool coalesFlag = q1->getConstRefToIPCoalescence().getCoalescenceActiveFlag(); if (coalesFlag){ - _mlawCoales->computeResidual_multipleNonLocalVariables(res,J,kcorEqpr,pcorpr,R,H,yieldfV,DyieldfVDfV,q0,q1, - DeltaHatD,DeltaHatQ,DeltaHatP,DeltafV,T); + _mlawCoales->computeResidual_multipleNonLocalVariables(res,J,kcorEqpr,pcorpr,R,H,yieldfV,q0,q1, + DeltaHatD,DeltaHatQ,DeltaHatP,T); } else { - _mlawGrowth->computeResidual_multipleNonLocalVariables(res,J,kcorEqpr,pcorpr,R,H,yieldfV,DyieldfVDfV,q0,q1, - DeltaHatD,DeltaHatQ,DeltaHatP,DeltafV,T); + _mlawGrowth->computeResidual_multipleNonLocalVariables(res,J,kcorEqpr,pcorpr,R,H,yieldfV,q0,q1, + DeltaHatD,DeltaHatQ,DeltaHatP,T); } }; void mlawNonLocalPorousCoupledLaw::computeDResidual_multipleNonLocalVariables(STensor3 &dres0dEpr, STensor3 &dres1dEpr, STensor3 &dres2dEpr, - std::vector<double> &dres0dtildefV, std::vector<double> &dres1dtildefV, std::vector<double> &dres2dtildefV, - const STensor3& devKcorpr, const double kcorEqpr, const double pcorpr, const double R, - const double yieldfV, const double DyieldfVDfV, const std::vector<double>& DyieldfVDtildefV, - const STensor3& DDeltafVDEpr, const STensor43& DdevKcorprDEpr, const STensor3& DpcorprDEpr, - const IPNonLocalPorosity *q0, const IPNonLocalPorosity* q1, - const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, - const double* T, const double* DRDT, - const STensor3* DdevKcorprDT, const double* DpcorprDT, const double* DDeltafVDT, - double *dres0dT, double *dres1dT, double *dres2dT + std::vector<double> &dres0dNonlocalVars, std::vector<double> &dres1dNonlocalVars, std::vector<double> &dres2dNonlocalVars, + const STensor3& devKcorpr, const double kcorEqpr, const double pcorpr, const double R, + const double yieldfV, const STensor3& DyieldfVDkcorpr, const std::vector<double>& DyieldfVDNonlocalVars, + const STensor43& DkcorprDEpr, const STensor43& DdevKcorprDEpr, const STensor3& DpcorprDEpr, + const IPNonLocalPorosity *q0, const IPNonLocalPorosity* q1, + const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, + const double* T, const double* DRDT, + const STensor3* DdevKcorprDT, const double* DpcorprDT, const STensor3* DKcorprVDT, + double *dres0dT, double *dres1dT, double *dres2dT ) const{ bool coalesFlag = q1->getConstRefToIPCoalescence().getCoalescenceActiveFlag(); if (coalesFlag){ _mlawCoales->computeDResidual_multipleNonLocalVariables(dres0dEpr,dres1dEpr,dres2dEpr, - dres0dtildefV,dres1dtildefV,dres2dtildefV, + dres0dNonlocalVars,dres1dNonlocalVars,dres2dNonlocalVars, devKcorpr,kcorEqpr,pcorpr,R, - yieldfV,DyieldfVDfV,DyieldfVDtildefV, - DDeltafVDEpr,DdevKcorprDEpr,DpcorprDEpr, + yieldfV,DyieldfVDkcorpr,DyieldfVDNonlocalVars, + DkcorprDEpr,DdevKcorprDEpr,DpcorprDEpr, q0, q1, DeltaHatD,DeltaHatQ,DeltaHatP, T,DRDT, - DdevKcorprDT ,DpcorprDT,DDeltafVDT, + DdevKcorprDT ,DpcorprDT,DKcorprVDT, dres0dT,dres1dT,dres2dT); } else { _mlawGrowth->computeDResidual_multipleNonLocalVariables(dres0dEpr,dres1dEpr,dres2dEpr, - dres0dtildefV,dres1dtildefV,dres2dtildefV, + dres0dNonlocalVars,dres1dNonlocalVars,dres2dNonlocalVars, devKcorpr,kcorEqpr,pcorpr,R, - yieldfV,DyieldfVDfV,DyieldfVDtildefV, - DDeltafVDEpr,DdevKcorprDEpr,DpcorprDEpr, + yieldfV,DyieldfVDkcorpr,DyieldfVDNonlocalVars, + DkcorprDEpr,DdevKcorprDEpr,DpcorprDEpr, q0, q1, DeltaHatD,DeltaHatQ,DeltaHatP, T,DRDT, - DdevKcorprDT ,DpcorprDT,DDeltafVDT, + DdevKcorprDT ,DpcorprDT,DKcorprVDT, dres0dT,dres1dT,dres2dT); } diff --git a/NonLinearSolver/materialLaw/mlawNonLocalPorousCoupled.h b/NonLinearSolver/materialLaw/mlawNonLocalPorousCoupled.h index 374dca8f9525213922fd58d628fdfdc47616024e..c55d6bdff6b15ba357a2c171250faa4a686be806 100644 --- a/NonLinearSolver/materialLaw/mlawNonLocalPorousCoupled.h +++ b/NonLinearSolver/materialLaw/mlawNonLocalPorousCoupled.h @@ -58,7 +58,6 @@ class mlawNonLocalPorousCoupledLaw : public mlawNonLocalPorosity virtual void setLodeOffset(const bool fl); virtual void setShearPorosityGrowthFactor(const double k); - virtual void setLocalRegularizedFunction(const scalarFunction& fct); virtual void setCorrectedRegularizedFunction(const scalarFunction& fct); virtual void setFailureTolerance(const double NewFailureTol); virtual void setPostBlockedDissipationBehavior(const int method); @@ -112,27 +111,34 @@ class mlawNonLocalPorousCoupledLaw : public mlawNonLocalPorosity virtual double yieldFunction(const double kcorEq, const double pcor, const double R, const double yieldfV, const IPNonLocalPorosity* q0, const IPNonLocalPorosity* q1, const double* T = NULL) const; - virtual void computeResidual(SVector3& res, STensor3& J, + virtual void computeResidual_NonLocalPorosity(SVector3& res, STensor3& J, const double kcorEqpr, const double pcorpr, const double R, const double H, - const double yieldfV, const double DyieldfVDfV, + const double yieldfV, const IPNonLocalPorosity *q0, const IPNonLocalPorosity* q1, const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, // 3 unknonwn - const double DeltafV, const double DDeltafVDDeltaHatD, const double DDeltafVDDeltaHatQ, const double DDeltafVDDeltaHatP, const double* T = NULL ) const; - virtual void computeDResidual(STensor3 &dres0dEpr, STensor3 &dres1dEpr, STensor3 &dres2dEpr, + virtual void computeDResidual_NonLocalPorosity(STensor3 &dres0dEpr, STensor3 &dres1dEpr, STensor3 &dres2dEpr, double &dres0dtildefV, double &dres1dtildefV, double &dres2dtildefV, const STensor3& devKcorpr, const double kcorEqpr, const double pcorpr, const double R, - const double yieldfV, const double DyieldfVDfV, const double DyieldfVDtildefV, - const STensor3& DDeltafVDEpr, const STensor43& DdevKcorprDEpr, const STensor3& DpcorprDEpr, + const double yieldfV, const STensor3& DyieldfVDKcorpr , const double DyieldfVDtildefV, + const STensor43& DKcorprDEpr, const STensor43& DdevKcorprDEpr, const STensor3& DpcorprDEpr, const IPNonLocalPorosity *q0, const IPNonLocalPorosity* q1, const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, const double* T = NULL, const double* DRDT= NULL, - const STensor3* DdevKcorprDT = NULL, const double* DpcorprDT = NULL, const double* DDeltafVDT = NULL, + const STensor3* DdevKcorprDT = NULL, const double* DpcorprDT = NULL, const STensor3* DKcorprDT = NULL, double *dres0dT= NULL, double *dres1dT= NULL, double *dres2dT = NULL ) const; - + + virtual void computeResidualLocal(SVector3& res, STensor3& J, + const double kcorEqpr, const double pcorpr, const double R, const double H, + const double yieldfV, const double DyieldfVDfV, + const IPNonLocalPorosity *q0, const IPNonLocalPorosity* q1, + const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, // 3 unknonwn + const double DDeltafVDDeltaHatD, const double DDeltafVDDeltaHatQ, const double DDeltafVDDeltaHatP, + const double* T = NULL + ) const; virtual void computeDResidualLocal(STensor3 &dres0dEpr, STensor3 &dres1dEpr, STensor3 &dres2dEpr, const STensor3& devKcorpr, const double kcorEqpr, const double pcorpr, const double R, const double yieldfV, const double DyieldfVDfV, @@ -147,21 +153,21 @@ class mlawNonLocalPorousCoupledLaw : public mlawNonLocalPorosity virtual void computeResidual_multipleNonLocalVariables(SVector3& res, STensor3& J, const double kcorEqpr, const double pcorpr, const double R, const double H, - const double yieldfV, const double DyieldfVDfV, + const double yieldfV, const IPNonLocalPorosity *q0, const IPNonLocalPorosity* q1, const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, // 3 unknonwn - const double DeltafV, const double* T = NULL + const double* T = NULL ) const; virtual void computeDResidual_multipleNonLocalVariables(STensor3 &dres0dEpr, STensor3 &dres1dEpr, STensor3 &dres2dEpr, - std::vector<double> &dres0dtildefV, std::vector<double> &dres1dtildefV, std::vector<double> &dres2dtildefV, + std::vector<double> &dres0dNonlocalVars, std::vector<double> &dres1dNonlocalVars, std::vector<double> &dres2dNonlocalVars, const STensor3& devKcorpr, const double kcorEqpr, const double pcorpr, const double R, - const double yieldfV, const double DyieldfVDfV, const std::vector<double>& DyieldfVDtildefV, - const STensor3& DDeltafVDEpr, const STensor43& DdevKcorprDEpr, const STensor3& DpcorprDEpr, + const double yieldfV, const STensor3& DyieldfVDkcorpr, const std::vector<double>& DyieldfVDNonlocalVars, + const STensor43& DkcorprDEpr, const STensor43& DdevKcorprDEpr, const STensor3& DpcorprDEpr, const IPNonLocalPorosity *q0, const IPNonLocalPorosity* q1, const double DeltaHatD, const double DeltaHatQ, const double DeltaHatP, const double* T = NULL, const double* DRDT= NULL, - const STensor3* DdevKcorprDT = NULL, const double* DpcorprDT = NULL, const double* DDeltafVDT = NULL, + const STensor3* DdevKcorprDT = NULL, const double* DpcorprDT = NULL, const STensor3* DKcorprVDT = NULL, double *dres0dT= NULL, double *dres1dT= NULL, double *dres2dT = NULL ) const; diff --git a/NonLinearSolver/materialLaw/voidStateEvolutionLaw.cpp b/NonLinearSolver/materialLaw/voidStateEvolutionLaw.cpp index e6a364508f89219555c47aa37603eb2704ffdf36..4f2ac57efa7fc9ae38ac89b5923851f25698fd50 100644 --- a/NonLinearSolver/materialLaw/voidStateEvolutionLaw.cpp +++ b/NonLinearSolver/materialLaw/voidStateEvolutionLaw.cpp @@ -58,10 +58,12 @@ void SphericalVoidStateEvolutionLawWithMatrixPlasticDeformation::evolve(const do const IPVoidState& sPrev, IPVoidState& sCur) const{ double lambdaPrev = sPrev.getVoidSpacingRatio(); + double roughChiPrev = sPrev.getRoughVoidLigamentRatio(); double chiPrev = sPrev.getVoidLigamentRatio(); double& lambda = sCur.getRefToVoidSpacingRatio(); // Update Chi and lambda from previous state and then, increment + double& roughChi = sCur.getRefToRoughVoidLigamentRatio(); double& Chi = sCur.getRefToVoidLigamentRatio(); // new lambda double DlambdaDHatP = 0; @@ -72,11 +74,8 @@ void SphericalVoidStateEvolutionLawWithMatrixPlasticDeformation::evolve(const do } // new regularised chi double fact = yieldfV1*lambda/(yieldfV0*lambdaPrev); - double ChiComputed = chiPrev*pow(fact,1./3.); - - double ffPrev = _ChiRegularizedFunction->inverse(chiPrev); - double ff = ffPrev+ChiComputed-chiPrev; - Chi = _ChiRegularizedFunction->getVal(ff); + roughChi = roughChiPrev*pow(fact,1./3.); + Chi = _ChiRegularizedFunction->getVal(roughChi); double& dChidf = sCur.getRefToDVoidLigamentRatioDYieldPorosity(); @@ -84,12 +83,12 @@ void SphericalVoidStateEvolutionLawWithMatrixPlasticDeformation::evolve(const do double& dChidhatD = sCur.getRefToDVoidLigamentRatioDDeviatoricPlasticDeformation(); double& dChidhatP = sCur.getRefToDVoidLigamentRatioDMatrixPlasticDeformation(); - double DiffChiComputed = _ChiRegularizedFunction->getDiff(ff); + double DiffRoughChi = _ChiRegularizedFunction->getDiff(roughChi); // new Chi rate - dChidf = DiffChiComputed*ChiComputed/(3.*yieldfV1); + dChidf = DiffRoughChi*roughChi/(3.*yieldfV1); dChidhatQ = 0.; dChidhatD = 0.; - dChidhatP = DiffChiComputed*DlambdaDHatP*ChiComputed/(3.*lambda); + dChidhatP = DiffRoughChi*DlambdaDHatP*roughChi/(3.*lambda); }; @@ -105,10 +104,12 @@ void SphericalVoidStateEvolutionLawWithDeviatoricPlasticDeformation::evolve(cons const IPVoidState& sPrev, IPVoidState& sCur) const{ double lambdaPrev = sPrev.getVoidSpacingRatio(); + double roughChiPrev = sPrev.getRoughVoidLigamentRatio(); double chiPrev = sPrev.getVoidLigamentRatio(); double& lambda = sCur.getRefToVoidSpacingRatio(); // Update Chi and lambda from previous state and then, increment + double& roughChi = sCur.getRefToRoughVoidLigamentRatio(); double& Chi = sCur.getRefToVoidLigamentRatio(); // new lambda double DlambdaDHatD = 0; @@ -119,21 +120,19 @@ void SphericalVoidStateEvolutionLawWithDeviatoricPlasticDeformation::evolve(cons } // new regularised chi double fact = yieldfV1*lambda/(yieldfV0*lambdaPrev); - double ChiComputed = chiPrev*pow(fact,1./3.); - double ffPrev = _ChiRegularizedFunction->inverse(chiPrev); - double ff = ffPrev+ChiComputed-chiPrev; - Chi = _ChiRegularizedFunction->getVal(ff); + roughChi = roughChiPrev*pow(fact,1./3.); + Chi = _ChiRegularizedFunction->getVal(roughChi); double& dChidf = sCur.getRefToDVoidLigamentRatioDYieldPorosity(); double& dChidhatQ = sCur.getRefToDVoidLigamentRatioDVolumetricPlasticDeformation(); double& dChidhatD = sCur.getRefToDVoidLigamentRatioDDeviatoricPlasticDeformation(); double& dChidhatP = sCur.getRefToDVoidLigamentRatioDMatrixPlasticDeformation(); - double DiffChiComputed = _ChiRegularizedFunction->getDiff(ff); + double DiffChiComputed = _ChiRegularizedFunction->getDiff(roughChi); // new Chi rate - dChidf = DiffChiComputed*ChiComputed/(3.*yieldfV1); + dChidf = DiffChiComputed*roughChi/(3.*yieldfV1); dChidhatQ = 0.; - dChidhatD = DiffChiComputed*DlambdaDHatD*ChiComputed/(3.*lambda); + dChidhatD = DiffChiComputed*DlambdaDHatD*roughChi/(3.*lambda); dChidhatP = 0.; }; @@ -181,7 +180,8 @@ void SpheroidalVoidStateEvolutionLawWithAspectRatioEvolution::evolve(const doubl double& dWdHatQ = sCur.getRefToDVoidAspectRatioDVolumetricPlasticDeformation(); double& dWdHatD = sCur.getRefToDVoidAspectRatioDDeviatoricPlasticDeformation(); double& dWdHatP = sCur.getRefToDVoidAspectRatioDMatrixPlasticDeformation(); - + + double& roughX = sCur.getRefToRoughVoidLigamentRatio(); double& X = sCur.getRefToVoidLigamentRatio(); double& dXdf = sCur.getRefToDVoidLigamentRatioDYieldPorosity(); double& dXdHatQ = sCur.getRefToDVoidLigamentRatioDVolumetricPlasticDeformation(); @@ -201,6 +201,7 @@ void SpheroidalVoidStateEvolutionLawWithAspectRatioEvolution::evolve(const doubl dgammadHatP = 0.; // previpis value + double roughXPrev = sPrev.getRoughVoidLigamentRatio(); double lambdaPrev = sPrev.getVoidSpacingRatio(); double XPrev = sPrev.getVoidLigamentRatio(); double WPrev = sPrev.getVoidAspectRatio(); @@ -224,46 +225,42 @@ void SpheroidalVoidStateEvolutionLawWithAspectRatioEvolution::evolve(const doubl // new regularised chi double fact = yieldfV1*lambda/(yieldfV0*lambdaPrev); - double XComputed = XPrev*pow(fact,1./3.); - double ffPrev = _ChiRegularizedFunction->inverse(XPrev); - double ff = ffPrev+XComputed-XPrev; - X = _ChiRegularizedFunction->getVal(ff); - double DXComputed = _ChiRegularizedFunction->getDiff(ff); + roughX = roughXPrev*pow(fact,1./3.); + X = _ChiRegularizedFunction->getVal(roughX); + double DXComputed = _ChiRegularizedFunction->getDiff(roughX); // new Chi rate - dXdf = DXComputed*XComputed/(3.*yieldfV1); + dXdf = DXComputed*roughX/(3.*yieldfV1); dXdHatQ = 0.; - dXdHatD = DXComputed*DlambdaDhatD*XComputed/(3.*lambda); + dXdHatD = DXComputed*DlambdaDhatD*roughX/(3.*lambda); dXdHatP = 0.; } else{ if (DeltahatD > 0){ - double Zprev = XPrev*WPrev; + double Zprev = roughXPrev*WPrev; double DeltaZ = 1.5*(lambda-lambdaPrev)/_kappa; double Z = Zprev+DeltaZ; - double Xcomputed = sqrt(1.5-(1.5-XPrev*XPrev)*Zprev/Z); - double dXcomputeddhatD = (3./4.)*(lambda*Xcomputed/Z)*(1.5/Xcomputed/Xcomputed-1.); - - double ffPrev = _ChiRegularizedFunction->inverse(XPrev); + roughX = sqrt(1.5-(1.5-roughXPrev*roughXPrev)*Zprev/Z); + double droughXdhatD = (3./4.)*(lambda*roughX/Z)*(1.5/roughX/roughX-1.); - double ff = ffPrev+Xcomputed-XPrev; - X = _ChiRegularizedFunction->getVal(ff); - double DXDXcomputed = _ChiRegularizedFunction->getDiff(ff); + X = _ChiRegularizedFunction->getVal(roughX); + double DXDroughX = _ChiRegularizedFunction->getDiff(roughX); dXdf =0.; dXdHatQ = 0.; - dXdHatD = DXDXcomputed*dXcomputeddhatD; + dXdHatD = DXDroughX*droughXdhatD; dXdHatP = 0.; - W = Z/Xcomputed; + W = Z/roughX; dWdf = 0.; dWdHatQ = 0.; - dWdHatD = (9./4.)*(lambda/Xcomputed)*(1.-0.5/Xcomputed*Xcomputed); + dWdHatD = (9./4.)*(lambda/roughX)*(1.-0.5/roughX*roughX); dWdHatP = 0.; } else{ + roughX = roughXPrev; X = XPrev; dXdf =0.; dXdHatQ = 0.; diff --git a/NonLinearSolver/nlsolver/scalarFunction.h b/NonLinearSolver/nlsolver/scalarFunction.h index 9ccc85f5a3bbf0197fcedc43d383230d48dfef50..faae3957749e2d9152fa91422aff7ddcd0ea4959 100644 --- a/NonLinearSolver/nlsolver/scalarFunction.h +++ b/NonLinearSolver/nlsolver/scalarFunction.h @@ -25,7 +25,6 @@ class scalarFunction{ virtual ~scalarFunction(){}; virtual void setElement(MElement* el) const{} virtual double getVal(const double x) const = 0; // function value at x - virtual double inverse(const double y) const = 0; // resolve function y = f(x) to get x virtual double getDiff(const double x) const = 0; // function derivative at x virtual double getVal(const std::vector<double>& input) const { return getVal(input[0]); @@ -59,11 +58,6 @@ class constantScalarFunction : public scalarFunction{ virtual ~constantScalarFunction(){}; virtual double getVal(const double x) const {return _f;}; - virtual double inverse(const double y) const { - // resolve function y = f(x) to get x - Msg::Error("there is infinite solution in constantScalarFunction::inverse"); - return 0.; - }; virtual double getDiff(const double x) const {return 0.;}; virtual scalarFunction* clone() const {return new constantScalarFunction(*this);}; #endif // SWIG @@ -96,13 +90,7 @@ class elementWiseScalarFunction : public constantScalarFunction{ std::map<int,double>::const_iterator it = _constantOnElements.find(_curELe->getNum()); if (it != _constantOnElements.end()) return it->second; return _f; - }; - virtual double inverse(const double y) const { - // resolve function y = f(x) to get x - Msg::Error("there is infinite solution in elementWiseScalarFunction::inverse"); - return 0.; - }; - + }; virtual double getDiff(const double x) const { Msg::Error("elementWiseScalarFunction::getDiff should not be used"); return 0.; @@ -136,11 +124,6 @@ class twoValuesFunction : public scalarFunction{ if (x < _x01 and x > _x00) return _A0; else return _A1; }; - virtual double inverse(const double y) const { - // resolve function y = f(x) to get x - Msg::Error("there is infinite solution in twoValuesFunction::inverse"); - return 0.; - }; virtual double getDiff(const double x) const {return 0.;}; virtual scalarFunction* clone() const {return new twoValuesFunction(*this);}; #endif // SWIG @@ -167,13 +150,6 @@ class linearScalarFunction : public scalarFunction{ virtual ~linearScalarFunction(){}; virtual double getVal(const double x) const {return _a*(x-_x0)+_f0;}; - virtual double inverse(const double y) const { - if (_a == 0.){ - Msg::Error("twoValuesFunction::inverse cannot be used"); - return 0.; - } - return _x0+(y-_f0)/_a; - }; virtual double getDiff(const double x) const {return _a;}; virtual scalarFunction* clone() const {return new linearScalarFunction(*this);}; #endif // SWIG @@ -217,9 +193,6 @@ protected: } }; - virtual double inverse(const double y) const { - Msg::Fatal("piecewiseScalarFunction::inverse has not been implemented yet"); - }; virtual double getDiff(const double x) const { int n = _var.size(); if (x < _var[0]) return 0.; @@ -276,24 +249,6 @@ class twoVariableExponentialSaturationScalarFunction : public scalarFunction{ } } }; - virtual double inverse(const double y) const { - if(_upperBound){ - if (y >= _f2) Msg::Fatal("no solution in twoVariableExponentialSaturationScalarFunction::inverse upperBound"); - if (y < _f1) return y; - else{ - double fact = (_f2-y)/(_f2-_f1); - return _f1 - (_f2-_f1)*log(fact); - } - } - else{ - if (y <= _f2) Msg::Fatal("no solution in twoVariableExponentialSaturationScalarFunction::inverse lowerBound"); - if (y > _f1) return y; - else{ - double fact = (_f2-y)/(_f2-_f1); - return _f1 - (_f2-_f1)*log(fact); - } - } - } virtual double getDiff(const double x) const { if (_upperBound){ if (x < _f1) @@ -370,20 +325,6 @@ protected: } }; - virtual double inverse(const double y) const { - if ( y >= _f2max or y <= _f2min) Msg::Fatal("fourVariableExponentialSaturationScalarFunction::inverse has no solution with val = %e",y); - if (y < _f1min){ - double fact = (_f2min-y)/(_f2min-_f1min); - return _f1min - (_f2min-_f1min)*log(fact); - } - else if (y > _f1max){ - double fact = (_f2max-y)/(_f2max-_f1max); - return _f1max - (_f2max-_f1max)*log(fact); - } - else{ - return y; - } - }; virtual double getDiff(const double x) const { if (x < _f1min) @@ -443,9 +384,6 @@ class polynomialScalarFunction : public scalarFunction{ else if (_order == 3) return _coeffs[0]+_coeffs[1]*x+_coeffs[2]*x*x+_coeffs[3]*x*x*x; else Msg::Fatal("polynomialScalarFunction with order %d has not been implemented"); }; - virtual double inverse(const double y) const { - Msg::Fatal("polynomialScalarFunction::inverse is not implemented!!!"); - }; virtual double getDiff(const double x) const { if (_order == 0) return 0.; else if (_order == 1) return _coeffs[1]; @@ -477,10 +415,6 @@ class asinwt : public scalarFunction{ virtual ~asinwt(){}; virtual double getVal(const double x) const {return _a*sin(_omega*x);}; - virtual double inverse(const double y) const{ - if (fabs(y) > fabs(_a)) Msg::Fatal("asinwt::inverse has not solution"); - else return (asin(y/_a))/_omega; - } virtual double getDiff(const double x) const {return _a*_omega*cos(_omega*x);}; virtual scalarFunction* clone() const {return new asinwt(*this);}; #endif // SWIG diff --git a/dG3D/benchmarks/CMakeLists.txt b/dG3D/benchmarks/CMakeLists.txt index 40952cdaa489cc6d43eb031cfb828c0aa945e271..4fdfc5eaa531d289972d83154bad476857fd2bfd 100644 --- a/dG3D/benchmarks/CMakeLists.txt +++ b/dG3D/benchmarks/CMakeLists.txt @@ -176,3 +176,4 @@ add_subdirectory(Thomason_cube_I1J2J3) add_subdirectory(GursonThomason_cube_I1J2J3) add_subdirectory(GursonThomason_cube_withLodeEnhanced) add_subdirectory(Thomason_planeStrain_withLodeEnhanced) +add_subdirectory(LocalGurson_PathFollowing) diff --git a/dG3D/benchmarks/LocalGurson_PathFollowing/NodalDisplacement18comp1.csv b/dG3D/benchmarks/LocalGurson_PathFollowing/NodalDisplacement18comp1.csv deleted file mode 100644 index 36f0a6347036841273c338576e68e81037c07767..0000000000000000000000000000000000000000 --- a/dG3D/benchmarks/LocalGurson_PathFollowing/NodalDisplacement18comp1.csv +++ /dev/null @@ -1,213 +0,0 @@ -3.333333e-03;5.231572e-04 -6.666667e-03;-3.608092e-03 -1.000000e-02;-9.666361e-03 -1.333333e-02;-1.596241e-02 -1.666667e-02;-2.235176e-02 -2.000000e-02;-2.873383e-02 -2.333333e-02;-3.502402e-02 -2.666667e-02;-4.336159e-02 -3.000000e-02;-5.166774e-02 -3.333333e-02;-6.270994e-02 -3.666667e-02;-7.738285e-02 -4.000000e-02;-9.689127e-02 -4.333333e-02;-1.228686e-01 -4.666667e-02;-1.575335e-01 -5.000000e-02;-2.040408e-01 -5.333333e-02;-2.588823e-01 -5.666667e-02;-3.144424e-01 -6.000000e-02;-3.708322e-01 -6.333333e-02;-4.280457e-01 -6.666667e-02;-4.744352e-01 -7.000000e-02;-5.215554e-01 -7.333333e-02;-5.695508e-01 -7.666667e-02;-6.185366e-01 -8.000000e-02;-6.813001e-01 -8.333333e-02;-7.458442e-01 -8.666667e-02;-8.122454e-01 -9.000000e-02;-8.667188e-01 -9.333333e-02;-9.224292e-01 -9.666667e-02;-9.793877e-01 -1.000000e-01;-1.037639e+00 -1.033333e-01;-1.097254e+00 -1.066667e-01;-1.146043e+00 -1.100000e-01;-1.185856e+00 -1.133333e-01;-1.218368e+00 -1.166667e-01;-1.244935e+00 -1.200000e-01;-1.272028e+00 -1.233333e-01;-1.299722e+00 -1.266667e-01;-1.328087e+00 -1.300000e-01;-1.357252e+00 -1.333333e-01;-1.386753e+00 -1.366667e-01;-1.398605e+00 -1.400000e-01;-1.408076e+00 -1.433333e-01;-1.420623e+00 -1.466667e-01;-1.437200e+00 -1.500000e-01;-1.443835e+00 -1.533333e-01;-1.450458e+00 -1.566667e-01;-1.459252e+00 -1.600000e-01;-1.466274e+00 -1.633333e-01;-1.475567e+00 -1.666667e-01;-1.481728e+00 -1.700000e-01;-1.487864e+00 -1.733333e-01;-1.495993e+00 -1.766667e-01;-1.504129e+00 -1.800000e-01;-1.514934e+00 -1.833333e-01;-1.518235e+00 -1.866667e-01;-1.520856e+00 -1.900000e-01;-1.524308e+00 -1.933333e-01;-1.528824e+00 -1.966667e-01;-1.534671e+00 -2.000000e-01;-1.542136e+00 -2.033333e-01;-1.551469e+00 -2.066667e-01;-1.560065e+00 -2.100000e-01;-1.570364e+00 -2.133333e-01;-1.579410e+00 -2.166667e-01;-1.587281e+00 -2.200000e-01;-1.596165e+00 -2.233333e-01;-1.603320e+00 -2.266667e-01;-1.609001e+00 -2.300000e-01;-1.613379e+00 -2.333333e-01;-1.616687e+00 -2.366667e-01;-1.619111e+00 -2.400000e-01;-1.620807e+00 -2.433333e-01;-1.621847e+00 -2.466667e-01;-1.622240e+00 -2.500000e-01;-1.622109e+00 -2.533333e-01;-1.621336e+00 -2.566667e-01;-1.619946e+00 -2.600000e-01;-1.617432e+00 -2.633333e-01;-1.614212e+00 -2.666667e-01;-1.610391e+00 -2.700000e-01;-1.606272e+00 -2.716667e-01;-1.604967e+00 -2.733333e-01;-1.604307e+00 -2.750000e-01;-1.603443e+00 -2.766667e-01;-1.602343e+00 -2.783333e-01;-1.601089e+00 -2.800000e-01;-1.600345e+00 -2.816667e-01;-1.600868e+00 -2.818750e-01;-1.600909e+00 -2.820833e-01;-1.600944e+00 -2.822917e-01;-1.600993e+00 -2.825000e-01;-1.601059e+00 -2.827083e-01;-1.601145e+00 -2.829167e-01;-1.601253e+00 -2.831250e-01;-1.601380e+00 -2.833333e-01;-1.601511e+00 -2.835417e-01;-1.601580e+00 -2.837500e-01;-1.601452e+00 -2.839583e-01;-1.601377e+00 -2.841667e-01;-1.601324e+00 -2.843750e-01;-1.601266e+00 -2.845833e-01;-1.601206e+00 -2.847917e-01;-1.601143e+00 -2.850000e-01;-1.601074e+00 -2.852083e-01;-1.600996e+00 -2.854167e-01;-1.600907e+00 -2.856250e-01;-1.600805e+00 -2.858333e-01;-1.600748e+00 -2.860417e-01;-1.600681e+00 -2.862500e-01;-1.600604e+00 -2.864583e-01;-1.600560e+00 -2.866667e-01;-1.600506e+00 -2.868750e-01;-1.600468e+00 -2.870833e-01;-1.600421e+00 -2.872917e-01;-1.600391e+00 -2.875000e-01;-1.600369e+00 -2.877083e-01;-1.600346e+00 -2.879167e-01;-1.600326e+00 -2.881250e-01;-1.600303e+00 -2.883333e-01;-1.600294e+00 -2.885417e-01;-1.600284e+00 -2.887500e-01;-1.600274e+00 -2.889583e-01;-1.600268e+00 -2.891667e-01;-1.600262e+00 -2.893750e-01;-1.600259e+00 -2.895833e-01;-1.600258e+00 -2.897917e-01;-1.600259e+00 -2.900000e-01;-1.600259e+00 -2.902083e-01;-1.600261e+00 -2.904167e-01;-1.600264e+00 -2.906250e-01;-1.600269e+00 -2.908333e-01;-1.600275e+00 -2.910417e-01;-1.600285e+00 -2.912500e-01;-1.600298e+00 -2.914583e-01;-1.600310e+00 -2.916667e-01;-1.600328e+00 -2.918750e-01;-1.600333e+00 -2.920833e-01;-1.600340e+00 -2.922917e-01;-1.600350e+00 -2.925000e-01;-1.600361e+00 -2.927083e-01;-1.600375e+00 -2.929167e-01;-1.600394e+00 -2.931250e-01;-1.600402e+00 -2.933333e-01;-1.600410e+00 -2.935417e-01;-1.600418e+00 -2.937500e-01;-1.600427e+00 -2.939583e-01;-1.600440e+00 -2.941667e-01;-1.600460e+00 -2.943750e-01;-1.600485e+00 -2.945833e-01;-1.600512e+00 -2.947917e-01;-1.600521e+00 -2.950000e-01;-1.600532e+00 -2.952083e-01;-1.600543e+00 -2.954167e-01;-1.600553e+00 -2.956250e-01;-1.600563e+00 -2.958333e-01;-1.600570e+00 -2.960417e-01;-1.600575e+00 -2.962500e-01;-1.600577e+00 -2.964583e-01;-1.600579e+00 -2.965625e-01;-1.600580e+00 -2.966146e-01;-1.600580e+00 -2.966667e-01;-1.600580e+00 -2.967187e-01;-1.600580e+00 -2.967708e-01;-1.600580e+00 -2.968229e-01;-1.600580e+00 -2.968750e-01;-1.600580e+00 -2.969271e-01;-1.600580e+00 -2.969792e-01;-1.600580e+00 -2.970312e-01;-1.600580e+00 -2.970833e-01;-1.600580e+00 -2.971354e-01;-1.600581e+00 -2.971875e-01;-1.600581e+00 -2.972396e-01;-1.600581e+00 -2.972917e-01;-1.600581e+00 -2.973437e-01;-1.600581e+00 -2.973698e-01;-1.600581e+00 -2.973958e-01;-1.600581e+00 -2.974219e-01;-1.600581e+00 -2.974479e-01;-1.600581e+00 -2.974740e-01;-1.600581e+00 -2.975000e-01;-1.600581e+00 -2.975260e-01;-1.600581e+00 -2.975521e-01;-1.600581e+00 -2.975781e-01;-1.600581e+00 -2.976042e-01;-1.600581e+00 -2.976302e-01;-1.600581e+00 -2.976562e-01;-1.600581e+00 -2.976823e-01;-1.600581e+00 -2.977083e-01;-1.600581e+00 -2.977344e-01;-1.600581e+00 -2.977604e-01;-1.600581e+00 -2.977865e-01;-1.600581e+00 -2.978125e-01;-1.600581e+00 -2.978385e-01;-1.600581e+00 -2.978646e-01;-1.600581e+00 -2.978906e-01;-1.600581e+00 -2.979167e-01;-1.600581e+00 -2.979427e-01;-1.600581e+00 -2.979687e-01;-1.600581e+00 -2.979948e-01;-1.600581e+00 -2.980208e-01;-1.600581e+00 -2.980469e-01;-1.600581e+00 -2.980729e-01;-1.600581e+00 -2.980990e-01;-1.600581e+00 -2.981250e-01;-1.600581e+00 -2.981510e-01;-1.600581e+00 -2.981771e-01;-1.600581e+00 -2.982031e-01;-1.600581e+00 -2.982292e-01;-1.600581e+00 -2.982552e-01;-1.600581e+00 -2.982812e-01;-1.600581e+00 -2.983073e-01;-1.600581e+00 -2.983333e-01;-1.600581e+00 diff --git a/dG3D/benchmarks/LocalGurson_PathFollowing/NodalDisplacement19comp1.csv b/dG3D/benchmarks/LocalGurson_PathFollowing/NodalDisplacement19comp1.csv deleted file mode 100644 index 93219e10b5a0c83afbe682839b12e1505998a9dd..0000000000000000000000000000000000000000 --- a/dG3D/benchmarks/LocalGurson_PathFollowing/NodalDisplacement19comp1.csv +++ /dev/null @@ -1,213 +0,0 @@ -3.333333e-03;2.322882e-03 -6.666667e-03;1.005008e-02 -1.000000e-02;1.655122e-02 -1.333333e-02;2.314741e-02 -1.666667e-02;2.976523e-02 -2.000000e-02;3.637185e-02 -2.333333e-02;4.293414e-02 -2.666667e-02;5.167398e-02 -3.000000e-02;6.041818e-02 -3.333333e-02;7.208282e-02 -3.666667e-02;8.763348e-02 -4.000000e-02;1.083510e-01 -4.333333e-02;1.359063e-01 -4.666667e-02;1.725148e-01 -5.000000e-02;2.211113e-01 -5.333333e-02;2.776734e-01 -5.666667e-02;3.341823e-01 -6.000000e-02;3.908783e-01 -6.333333e-02;4.480852e-01 -6.666667e-02;4.944498e-01 -7.000000e-02;5.415301e-01 -7.333333e-02;5.894724e-01 -7.666667e-02;6.383926e-01 -8.000000e-02;7.010575e-01 -8.333333e-02;7.654848e-01 -8.666667e-02;8.317506e-01 -9.000000e-02;8.861017e-01 -9.333333e-02;9.416763e-01 -9.666667e-02;9.984845e-01 -1.000000e-01;1.056569e+00 -1.033333e-01;1.115998e+00 -1.066667e-01;1.164623e+00 -1.100000e-01;1.204293e+00 -1.133333e-01;1.236672e+00 -1.166667e-01;1.263109e+00 -1.200000e-01;1.290063e+00 -1.233333e-01;1.317605e+00 -1.266667e-01;1.345794e+00 -1.300000e-01;1.374713e+00 -1.333333e-01;1.403895e+00 -1.366667e-01;1.415615e+00 -1.400000e-01;1.424972e+00 -1.433333e-01;1.437357e+00 -1.466667e-01;1.453698e+00 -1.500000e-01;1.460238e+00 -1.533333e-01;1.466763e+00 -1.566667e-01;1.475421e+00 -1.600000e-01;1.482331e+00 -1.633333e-01;1.491469e+00 -1.666667e-01;1.497527e+00 -1.700000e-01;1.503554e+00 -1.733333e-01;1.511538e+00 -1.766667e-01;1.519530e+00 -1.800000e-01;1.530164e+00 -1.833333e-01;1.533417e+00 -1.866667e-01;1.536004e+00 -1.900000e-01;1.539415e+00 -1.933333e-01;1.543883e+00 -1.966667e-01;1.549681e+00 -2.000000e-01;1.557099e+00 -2.033333e-01;1.566395e+00 -2.066667e-01;1.574968e+00 -2.100000e-01;1.585246e+00 -2.133333e-01;1.594274e+00 -2.166667e-01;1.602128e+00 -2.200000e-01;1.610979e+00 -2.233333e-01;1.618090e+00 -2.266667e-01;1.623722e+00 -2.300000e-01;1.628046e+00 -2.333333e-01;1.631296e+00 -2.366667e-01;1.633661e+00 -2.400000e-01;1.635296e+00 -2.433333e-01;1.636273e+00 -2.466667e-01;1.636601e+00 -2.500000e-01;1.636406e+00 -2.533333e-01;1.635549e+00 -2.566667e-01;1.634079e+00 -2.600000e-01;1.631460e+00 -2.633333e-01;1.628128e+00 -2.666667e-01;1.624277e+00 -2.700000e-01;1.619805e+00 -2.716667e-01;1.618343e+00 -2.733333e-01;1.617587e+00 -2.750000e-01;1.616550e+00 -2.766667e-01;1.615089e+00 -2.783333e-01;1.612840e+00 -2.800000e-01;1.609783e+00 -2.816667e-01;1.604521e+00 -2.818750e-01;1.604128e+00 -2.820833e-01;1.603809e+00 -2.822917e-01;1.603380e+00 -2.825000e-01;1.602804e+00 -2.827083e-01;1.602033e+00 -2.829167e-01;1.601000e+00 -2.831250e-01;1.599615e+00 -2.833333e-01;1.597745e+00 -2.835417e-01;1.595184e+00 -2.837500e-01;1.591546e+00 -2.839583e-01;1.589417e+00 -2.841667e-01;1.587697e+00 -2.843750e-01;1.585392e+00 -2.845833e-01;1.582312e+00 -2.847917e-01;1.578205e+00 -2.850000e-01;1.572756e+00 -2.852083e-01;1.565551e+00 -2.854167e-01;1.556064e+00 -2.856250e-01;1.543576e+00 -2.858333e-01;1.535256e+00 -2.860417e-01;1.524303e+00 -2.862500e-01;1.509881e+00 -2.864583e-01;1.500271e+00 -2.866667e-01;1.487624e+00 -2.868750e-01;1.477526e+00 -2.870833e-01;1.464249e+00 -2.872917e-01;1.453651e+00 -2.875000e-01;1.443116e+00 -2.877083e-01;1.429291e+00 -2.879167e-01;1.415617e+00 -2.881250e-01;1.397752e+00 -2.883333e-01;1.388791e+00 -2.885417e-01;1.377054e+00 -2.887500e-01;1.361806e+00 -2.889583e-01;1.349748e+00 -2.891667e-01;1.334165e+00 -2.893750e-01;1.319002e+00 -2.895833e-01;1.299571e+00 -2.897917e-01;1.291004e+00 -2.900000e-01;1.282588e+00 -2.902083e-01;1.271708e+00 -2.904167e-01;1.261107e+00 -2.906250e-01;1.247558e+00 -2.908333e-01;1.234513e+00 -2.910417e-01;1.218566e+00 -2.912500e-01;1.204233e+00 -2.914583e-01;1.193852e+00 -2.916667e-01;1.182211e+00 -2.918750e-01;1.178989e+00 -2.920833e-01;1.175052e+00 -2.922917e-01;1.170444e+00 -2.925000e-01;1.166435e+00 -2.927083e-01;1.162202e+00 -2.929167e-01;1.158372e+00 -2.931250e-01;1.156904e+00 -2.933333e-01;1.155734e+00 -2.935417e-01;1.154859e+00 -2.937500e-01;1.154306e+00 -2.939583e-01;1.153958e+00 -2.941667e-01;1.153807e+00 -2.943750e-01;1.153508e+00 -2.945833e-01;1.152336e+00 -2.947917e-01;1.151581e+00 -2.950000e-01;1.150327e+00 -2.952083e-01;1.148340e+00 -2.954167e-01;1.146025e+00 -2.956250e-01;1.142607e+00 -2.958333e-01;1.138813e+00 -2.960417e-01;1.135511e+00 -2.962500e-01;1.133174e+00 -2.964583e-01;1.130787e+00 -2.965625e-01;1.129956e+00 -2.966146e-01;1.129770e+00 -2.966667e-01;1.129583e+00 -2.967187e-01;1.129396e+00 -2.967708e-01;1.129209e+00 -2.968229e-01;1.129022e+00 -2.968750e-01;1.128835e+00 -2.969271e-01;1.128648e+00 -2.969792e-01;1.128461e+00 -2.970312e-01;1.128273e+00 -2.970833e-01;1.128086e+00 -2.971354e-01;1.127898e+00 -2.971875e-01;1.127710e+00 -2.972396e-01;1.127460e+00 -2.972917e-01;1.127126e+00 -2.973437e-01;1.126992e+00 -2.973698e-01;1.126965e+00 -2.973958e-01;1.126944e+00 -2.974219e-01;1.126923e+00 -2.974479e-01;1.126901e+00 -2.974740e-01;1.126880e+00 -2.975000e-01;1.126859e+00 -2.975260e-01;1.126838e+00 -2.975521e-01;1.126821e+00 -2.975781e-01;1.126804e+00 -2.976042e-01;1.126781e+00 -2.976302e-01;1.126763e+00 -2.976562e-01;1.126749e+00 -2.976823e-01;1.126729e+00 -2.977083e-01;1.126703e+00 -2.977344e-01;1.126686e+00 -2.977604e-01;1.126673e+00 -2.977865e-01;1.126659e+00 -2.978125e-01;1.126645e+00 -2.978385e-01;1.126632e+00 -2.978646e-01;1.126618e+00 -2.978906e-01;1.126605e+00 -2.979167e-01;1.126591e+00 -2.979427e-01;1.126580e+00 -2.979687e-01;1.126565e+00 -2.979948e-01;1.126551e+00 -2.980208e-01;1.126531e+00 -2.980469e-01;1.126505e+00 -2.980729e-01;1.126488e+00 -2.980990e-01;1.126474e+00 -2.981250e-01;1.126460e+00 -2.981510e-01;1.126447e+00 -2.981771e-01;1.126433e+00 -2.982031e-01;1.126419e+00 -2.982292e-01;1.126405e+00 -2.982552e-01;1.126391e+00 -2.982812e-01;1.126378e+00 -2.983073e-01;1.126364e+00 -2.983333e-01;1.126350e+00 diff --git a/dG3D/benchmarks/LocalGurson_PathFollowing/Plane_notch.py b/dG3D/benchmarks/LocalGurson_PathFollowing/Plane_notch.py index 86c8fb5ac38d597e10d8a3b0d8e65b97ea78cb47..bec947abda75e09e277a52ecb58cbb3f7db190b4 100644 --- a/dG3D/benchmarks/LocalGurson_PathFollowing/Plane_notch.py +++ b/dG3D/benchmarks/LocalGurson_PathFollowing/Plane_notch.py @@ -39,11 +39,10 @@ Gdn1 = LinearNucleationLaw(NucleationLawNum1, 0.2, 0.005, 1.) # material law creation -BulkLaw1 = LocalDamageGursonDG3DMaterialLaw(BulkLawNum1, rho, young, nu, q1,q2,q3,fVinitial, Harden1,1e-6,False,1e-8) +BulkLaw1 = NonLocalDamageGursonDG3DMaterialLaw(BulkLawNum1, rho, young, nu, q1,q2,q3,fVinitial, Harden1,1e-6,False,1e-8) +BulkLaw1.setNonLocalMethod(0) BulkLaw1.setOrderForLogExp(3) BulkLaw1.setNucleationLaw(Gdn1) -BulkLaw1.setPredictorCorrectorParameters(2,100,1.,2) -BulkLaw1.setFailureTolerance(0.9,1e-1,0.9) BulkLaw1.setSubStepping(True,3) # Solver parameters - shift @@ -54,7 +53,7 @@ r_impl = 1.0 # Solver parameters - implicit # =================================================================================== soltype = 1 # StaticLinear=0 (default, StaticNonLinear=1, Explicit=2, # Multi=3, Implicit=4, Eigen=5) -nstep = 300 # Number of step +nstep = 70 # Number of step tol=1.e-6 # Relative tolerance for NR scheme tolAbs = 1.e-8 # Absolute tolerance for NR scheme nstepArchIP=1 # Number of step between 2 archiving @@ -150,14 +149,14 @@ mysolver.internalPointBuildView("local_fV",IPField.LOCAL_POROSITY,1,1) mysolver.internalPointBuildView("local_fV_max",IPField.LOCAL_POROSITY,1,IPField.MAX_VALUE) mysolver.internalPointBuildView("epl",IPField.PLASTICSTRAIN, 1, 1) mysolver.internalPointBuildView("triaxiality",IPField.STRESS_TRIAXIALITY, 1, 1) - +mysolver.internalPointBuildView("yield_fV",IPField.YIELD_POROSITY,1,1) mysolver.archivingForceOnPhysicalGroup("Edge", 1400, 0, nstepArchForce) mysolver.archivingNodeDisplacement(401,0, nstepArchForce) mysolver.archivingNodeDisplacementOnPhysical(0,100,1,nstepArchForce) -mysolver.archivingIPOnPhysicalGroup("Face", 700, IPField.DAMAGE,IPField.MAX_VALUE,nstepArchForce) +mysolver.archivingIPOnPhysicalGroup("Face", 700, IPField.YIELD_POROSITY,IPField.MAX_VALUE,nstepArchForce) mysolver.archivingIPOnPhysicalGroup("Face", 700, IPField.LOCAL_POROSITY,IPField.MAX_VALUE,nstepArchForce) mysolver.solve() check = TestCheck() -check.equal(-8.171800e+02,mysolver.getArchivedForceOnPhysicalGroup("Edge", 1400, 0),1.e-6) +check.equal(-4.319212e+02,mysolver.getArchivedForceOnPhysicalGroup("Edge", 1400, 0),1.e-6) diff --git a/dG3D/benchmarks/LocalGurson_PathFollowing/force1400comp0.csv b/dG3D/benchmarks/LocalGurson_PathFollowing/force1400comp0.csv deleted file mode 100644 index 277cb7a360cd8967b806a6889ac60aec6baedf6a..0000000000000000000000000000000000000000 --- a/dG3D/benchmarks/LocalGurson_PathFollowing/force1400comp0.csv +++ /dev/null @@ -1,213 +0,0 @@ -3.333333e-03;-9.990288e+02 -6.666667e-03;-2.253347e+03 -1.000000e-02;-2.406483e+03 -1.333333e-02;-2.510439e+03 -1.666667e-02;-2.589631e+03 -2.000000e-02;-2.653479e+03 -2.333333e-02;-2.706600e+03 -2.666667e-02;-2.766120e+03 -3.000000e-02;-2.816298e+03 -3.333333e-02;-2.872671e+03 -3.666667e-02;-2.934286e+03 -4.000000e-02;-2.999600e+03 -4.333333e-02;-3.066359e+03 -4.666667e-02;-3.131415e+03 -5.000000e-02;-3.190458e+03 -5.333333e-02;-3.233093e+03 -5.666667e-02;-3.256273e+03 -6.000000e-02;-3.265241e+03 -6.333333e-02;-3.263152e+03 -6.666667e-02;-3.254917e+03 -7.000000e-02;-3.241615e+03 -7.333333e-02;-3.223713e+03 -7.666667e-02;-3.201507e+03 -8.000000e-02;-3.167938e+03 -8.333333e-02;-3.127975e+03 -8.666667e-02;-3.081460e+03 -9.000000e-02;-3.039278e+03 -9.333333e-02;-2.992348e+03 -9.666667e-02;-2.940222e+03 -1.000000e-01;-2.882295e+03 -1.033333e-01;-2.817692e+03 -1.066667e-01;-2.760451e+03 -1.100000e-01;-2.710519e+03 -1.133333e-01;-2.664079e+03 -1.166667e-01;-2.619062e+03 -1.200000e-01;-2.570328e+03 -1.233333e-01;-2.517161e+03 -1.266667e-01;-2.455886e+03 -1.300000e-01;-2.369640e+03 -1.333333e-01;-2.258439e+03 -1.366667e-01;-2.212056e+03 -1.400000e-01;-2.172446e+03 -1.433333e-01;-2.115643e+03 -1.466667e-01;-2.033212e+03 -1.500000e-01;-1.999961e+03 -1.533333e-01;-1.965554e+03 -1.566667e-01;-1.917985e+03 -1.600000e-01;-1.879003e+03 -1.633333e-01;-1.825132e+03 -1.666667e-01;-1.788842e+03 -1.700000e-01;-1.751013e+03 -1.733333e-01;-1.700120e+03 -1.766667e-01;-1.649680e+03 -1.800000e-01;-1.579215e+03 -1.833333e-01;-1.558744e+03 -1.866667e-01;-1.542636e+03 -1.900000e-01;-1.521617e+03 -1.933333e-01;-1.494462e+03 -1.966667e-01;-1.460229e+03 -2.000000e-01;-1.417281e+03 -2.033333e-01;-1.363543e+03 -2.066667e-01;-1.312287e+03 -2.100000e-01;-1.247775e+03 -2.133333e-01;-1.186553e+03 -2.166667e-01;-1.130106e+03 -2.200000e-01;-1.058946e+03 -2.233333e-01;-9.924668e+02 -2.266667e-01;-9.311516e+02 -2.300000e-01;-8.744794e+02 -2.333333e-01;-8.220825e+02 -2.366667e-01;-7.741716e+02 -2.400000e-01;-7.296713e+02 -2.433333e-01;-6.873558e+02 -2.466667e-01;-6.473365e+02 -2.500000e-01;-6.103359e+02 -2.533333e-01;-5.650414e+02 -2.566667e-01;-5.238882e+02 -2.600000e-01;-4.745466e+02 -2.633333e-01;-4.307740e+02 -2.666667e-01;-3.917970e+02 -2.700000e-01;-3.569718e+02 -2.716667e-01;-3.477019e+02 -2.733333e-01;-3.431687e+02 -2.750000e-01;-3.372253e+02 -2.766667e-01;-3.294609e+02 -2.783333e-01;-3.192801e+02 -2.800000e-01;-3.088291e+02 -2.816667e-01;-2.959601e+02 -2.818750e-01;-2.949540e+02 -2.820833e-01;-2.941399e+02 -2.822917e-01;-2.930447e+02 -2.825000e-01;-2.915751e+02 -2.827083e-01;-2.896095e+02 -2.829167e-01;-2.869859e+02 -2.831250e-01;-2.834855e+02 -2.833333e-01;-2.787956e+02 -2.835417e-01;-2.723949e+02 -2.837500e-01;-2.632183e+02 -2.839583e-01;-2.578561e+02 -2.841667e-01;-2.536204e+02 -2.843750e-01;-2.480821e+02 -2.845833e-01;-2.409074e+02 -2.847917e-01;-2.317143e+02 -2.850000e-01;-2.200928e+02 -2.852083e-01;-2.056425e+02 -2.854167e-01;-1.880488e+02 -2.856250e-01;-1.671412e+02 -2.858333e-01;-1.546578e+02 -2.860417e-01;-1.395861e+02 -2.862500e-01;-1.218771e+02 -2.864583e-01;-1.114226e+02 -2.866667e-01;-9.892048e+01 -2.868750e-01;-8.996644e+01 -2.870833e-01;-7.934254e+01 -2.872917e-01;-7.180597e+01 -2.875000e-01;-6.502859e+01 -2.877083e-01;-5.707496e+01 -2.879167e-01;-5.024944e+01 -2.881250e-01;-4.265987e+01 -2.883333e-01;-3.942225e+01 -2.885417e-01;-3.560078e+01 -2.887500e-01;-3.125190e+01 -2.889583e-01;-2.828454e+01 -2.891667e-01;-2.490900e+01 -2.893750e-01;-2.206602e+01 -2.895833e-01;-1.892144e+01 -2.897917e-01;-1.772313e+01 -2.900000e-01;-1.662312e+01 -2.902083e-01;-1.529443e+01 -2.904167e-01;-1.410870e+01 -2.906250e-01;-1.271117e+01 -2.908333e-01;-1.148678e+01 -2.910417e-01;-1.006616e+01 -2.912500e-01;-8.844003e+00 -2.914583e-01;-7.993207e+00 -2.916667e-01;-7.027279e+00 -2.918750e-01;-6.784877e+00 -2.920833e-01;-6.479999e+00 -2.922917e-01;-6.103859e+00 -2.925000e-01;-5.759598e+00 -2.927083e-01;-5.345105e+00 -2.929167e-01;-4.861076e+00 -2.931250e-01;-4.669663e+00 -2.933333e-01;-4.490884e+00 -2.935417e-01;-4.323930e+00 -2.937500e-01;-4.167580e+00 -2.939583e-01;-3.978710e+00 -2.941667e-01;-3.768032e+00 -2.943750e-01;-3.543317e+00 -2.945833e-01;-3.310794e+00 -2.947917e-01;-3.233855e+00 -2.950000e-01;-3.142202e+00 -2.952083e-01;-3.036225e+00 -2.954167e-01;-2.944997e+00 -2.956250e-01;-2.841528e+00 -2.958333e-01;-2.754239e+00 -2.960417e-01;-2.693644e+00 -2.962500e-01;-2.657116e+00 -2.964583e-01;-2.623217e+00 -2.965625e-01;-2.612659e+00 -2.966146e-01;-2.610602e+00 -2.966667e-01;-2.608468e+00 -2.967187e-01;-2.606328e+00 -2.967708e-01;-2.604182e+00 -2.968229e-01;-2.602042e+00 -2.968750e-01;-2.599891e+00 -2.969271e-01;-2.597741e+00 -2.969792e-01;-2.595593e+00 -2.970312e-01;-2.593448e+00 -2.970833e-01;-2.591306e+00 -2.971354e-01;-2.589168e+00 -2.971875e-01;-2.587035e+00 -2.972396e-01;-2.584353e+00 -2.972917e-01;-2.580275e+00 -2.973437e-01;-2.578953e+00 -2.973698e-01;-2.579799e+00 -2.973958e-01;-2.580210e+00 -2.974219e-01;-2.580063e+00 -2.974479e-01;-2.579902e+00 -2.974740e-01;-2.579767e+00 -2.975000e-01;-2.579565e+00 -2.975260e-01;-2.579422e+00 -2.975521e-01;-2.579629e+00 -2.975781e-01;-2.579456e+00 -2.976042e-01;-2.578519e+00 -2.976302e-01;-2.579502e+00 -2.976562e-01;-2.578716e+00 -2.976823e-01;-2.580032e+00 -2.977083e-01;-2.577659e+00 -2.977344e-01;-2.578499e+00 -2.977604e-01;-2.578933e+00 -2.977865e-01;-2.578612e+00 -2.978125e-01;-2.578726e+00 -2.978385e-01;-2.578530e+00 -2.978646e-01;-2.578528e+00 -2.978906e-01;-2.578291e+00 -2.979167e-01;-2.578286e+00 -2.979427e-01;-2.578688e+00 -2.979687e-01;-2.576984e+00 -2.979948e-01;-2.576947e+00 -2.980208e-01;-2.578507e+00 -2.980469e-01;-2.575899e+00 -2.980729e-01;-2.576730e+00 -2.980990e-01;-2.576844e+00 -2.981250e-01;-2.576685e+00 -2.981510e-01;-2.576600e+00 -2.981771e-01;-2.576421e+00 -2.982031e-01;-2.576333e+00 -2.982292e-01;-2.576188e+00 -2.982552e-01;-2.576099e+00 -2.982812e-01;-2.575917e+00 -2.983073e-01;-2.575826e+00 -2.983333e-01;-2.575689e+00 diff --git a/dG3D/src/nonLocalDamageDG3DMaterialLaw.cpp b/dG3D/src/nonLocalDamageDG3DMaterialLaw.cpp index e89c52643eba9737d5c73d6204ed47aed646e926..de13c7714c8a431be79952a41f60e2f448bc585a 100644 --- a/dG3D/src/nonLocalDamageDG3DMaterialLaw.cpp +++ b/dG3D/src/nonLocalDamageDG3DMaterialLaw.cpp @@ -924,10 +924,6 @@ void NonLocalPorousDuctileDamageDG3DMaterialLaw::setCorrectedRegularizedFunction _nldPorous->setCorrectedRegularizedFunction(fct); }; -void NonLocalPorousDuctileDamageDG3DMaterialLaw::setLocalRegularizedFunction(const scalarFunction& fct){ - _nldPorous->setLocalRegularizedFunction(fct); -}; - void NonLocalPorousDuctileDamageDG3DMaterialLaw::setNonLocalMethod(const int i) { _nldPorous->setNonLocalMethod(i); }; diff --git a/dG3D/src/nonLocalDamageDG3DMaterialLaw.h b/dG3D/src/nonLocalDamageDG3DMaterialLaw.h index d0f74bdc351c9e890c344f686051b8d18d0df5b5..cd0ebf3745e03cd8697e326d8333a6d10371e920 100644 --- a/dG3D/src/nonLocalDamageDG3DMaterialLaw.h +++ b/dG3D/src/nonLocalDamageDG3DMaterialLaw.h @@ -345,7 +345,6 @@ class NonLocalPorousDuctileDamageDG3DMaterialLaw : public dG3DMaterialLaw{ void setPostBlockedDissipationBehavior(const int method); void setFailureTolerance(const double NewFailureTol); void setCorrectedRegularizedFunction(const scalarFunction& fct); - void setLocalRegularizedFunction(const scalarFunction& fct); void setNonLocalMethod(const int i); void setShearPorosityGrowthFactor(const double k); void setStressTriaxialityFunction_kw(const scalarFunction& fct);