void MisesMat :: giveRealStressVector_1d(FloatArray &answer, GaussPoint *gp, const FloatArray &totalStrain, TimeStep *tStep) { /// @note: One should obtain the same answer using the iterations in the default implementation (this is verified for this model). #if 1 MisesMatStatus *status = static_cast< MisesMatStatus * >( this->giveStatus(gp) ); this->performPlasticityReturn(gp, totalStrain); double omega = computeDamage(gp, tStep); answer = status->giveTempEffectiveStress(); answer.times(1 - omega); // Compute the other components of the strain: LinearElasticMaterial *lmat = this->giveLinearElasticMaterial(); double E = lmat->give('E', gp), nu = lmat->give('n', gp); FloatArray strain = status->getTempPlasticStrain(); strain[0] = totalStrain[0]; strain[1] -= nu / E * status->giveTempEffectiveStress()[0]; strain[2] -= nu / E * status->giveTempEffectiveStress()[0]; status->letTempStrainVectorBe(strain); status->setTempDamage(omega); status->letTempStressVectorBe(answer); #else StructuralMaterial :: giveRealStressVector_1d(answer, gp, totalStrain, tStep); #endif }
void MisesMat :: give1dStressStiffMtrx(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep) { this->giveLinearElasticMaterial()->give1dStressStiffMtrx(answer, mode, gp, tStep); MisesMatStatus *status = static_cast< MisesMatStatus * >( this->giveStatus(gp) ); double kappa = status->giveCumulativePlasticStrain(); // increment of cumulative plastic strain as an indicator of plastic loading double tempKappa = status->giveTempCumulativePlasticStrain(); double omega = status->giveTempDamage(); double E = answer.at(1, 1); if ( mode != TangentStiffness ) { return; } if ( tempKappa <= kappa ) { // elastic loading - elastic stiffness plays the role of tangent stiffness answer.times(1 - omega); return; } // === plastic loading === const FloatArray &stressVector = status->giveTempEffectiveStress(); double stress = stressVector.at(1); answer.resize(1, 1); answer.at(1, 1) = ( 1 - omega ) * E * H / ( E + H ) - computeDamageParamPrime(tempKappa) * E / ( E + H ) * stress * signum(stress); }
// returns the consistent (algorithmic) tangent stiffness matrix void MisesMat :: give3dSSMaterialStiffnessMatrix(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *atTime) { // start from the elastic stiffness this->giveLinearElasticMaterial()->give3dMaterialStiffnessMatrix(answer, mode, gp, atTime); if ( mode != TangentStiffness ) { return; } MisesMatStatus *status = static_cast< MisesMatStatus * >( this->giveStatus(gp) ); double kappa = status->giveCumulativePlasticStrain(); double tempKappa = status->giveTempCumulativePlasticStrain(); // increment of cumulative plastic strain as an indicator of plastic loading double dKappa = tempKappa - kappa; if ( dKappa <= 0.0 ) { // elastic loading - elastic stiffness plays the role of tangent stiffness return; } // === plastic loading === // yield stress at the beginning of the step double sigmaY = sig0 + H * kappa; // trial deviatoric stress and its norm StressVector trialStressDev(_3dMat); double trialStressVol; status->giveTrialStressVol(trialStressVol); status->giveTrialStressDev(trialStressDev); double trialS = trialStressDev.computeStressNorm(); // one correction term FloatMatrix stiffnessCorrection(6, 6); stiffnessCorrection.beDyadicProductOf(trialStressDev, trialStressDev); double factor = -2. * sqrt(6.) * G * G / trialS; double factor1 = factor * sigmaY / ( ( H + 3. * G ) * trialS * trialS ); stiffnessCorrection.times(factor1); answer.add(stiffnessCorrection); // another correction term stiffnessCorrection.bePinvID(); double factor2 = factor * dKappa; stiffnessCorrection.times(factor2); answer.add(stiffnessCorrection); //influence of damage // double omega = computeDamageParam(tempKappa); double omega = status->giveTempDamage(); answer.times(1. - omega); FloatArray effStress; status->giveTempEffectiveStress(effStress); double omegaPrime = computeDamageParamPrime(tempKappa); double scalar = -omegaPrime *sqrt(6.) * G / ( 3. * G + H ) / trialS; stiffnessCorrection.beDyadicProductOf(effStress, trialStressDev); stiffnessCorrection.times(scalar); answer.add(stiffnessCorrection); }
void MisesMat :: giveRealStressVector_3d(FloatArray &answer, GaussPoint *gp, const FloatArray &totalStrain, TimeStep *tStep) { MisesMatStatus *status = static_cast< MisesMatStatus * >( this->giveStatus(gp) ); this->performPlasticityReturn(gp, totalStrain); double omega = computeDamage(gp, tStep); answer = status->giveTempEffectiveStress(); answer.times(1 - omega); status->setTempDamage(omega); status->letTempStrainVectorBe(totalStrain); status->letTempStressVectorBe(answer); }
// returns the stress vector in 3d stress space void MisesMat :: giveRealStressVector(FloatArray &answer, GaussPoint *gp, const FloatArray &totalStrain, TimeStep *atTime) { MisesMatStatus *status = static_cast< MisesMatStatus * >( this->giveStatus(gp) ); this->initTempStatus(gp); this->initGpForNewStep(gp); this->performPlasticityReturn(gp, totalStrain); double omega = computeDamage(gp, atTime); StressVector effStress(_3dMat), totalStress(_3dMat); status->giveTempEffectiveStress(effStress); totalStress = effStress; totalStress.times(1 - omega); answer = totalStress; status->setTempDamage(omega); status->letTempStrainVectorBe(totalStrain); status->letTempStressVectorBe(answer); }