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); }