void MisesMatNl :: give1dStressStiffMtrx(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep) { answer.resize(1, 1); answer.zero(); LinearElasticMaterial *lmat = this->giveLinearElasticMaterial(); double E = lmat->give('E', gp); double nlKappa; MisesMatNlStatus *status = static_cast< MisesMatNlStatus * >( this->giveStatus(gp) ); double kappa = status->giveCumulativePlasticStrain(); double tempKappa = status->giveTempCumulativePlasticStrain(); double tempDamage = status->giveTempDamage(); double damage = status->giveDamage(); answer.at(1, 1) = ( 1 - tempDamage ) * E; if ( mode != TangentStiffness ) { return; } if ( tempKappa <= kappa ) { // elastic loading - elastic stiffness plays the role of tangent stiffness return; } // === plastic loading === const FloatArray &stressVector = status->giveTempEffectiveStress(); double stress = stressVector.at(1); answer.at(1, 1) = ( 1. - tempDamage ) * E * H / ( E + H ); if ( tempDamage > damage ) { this->computeCumPlasticStrain(nlKappa, gp, tStep); answer.at(1, 1) = answer.at(1, 1) - ( 1 - mm ) * computeDamageParamPrime(nlKappa) * E / ( E + H ) * stress * sgn(stress); } }
int MisesMatNl :: giveLocalNonlocalStiffnessContribution(GaussPoint *gp, IntArray &loc, const UnknownNumberingScheme &s, FloatArray &lcontrib, TimeStep *atTime) { int nrows, nsize, i, j; double sum, nlKappa, damage, tempDamage, dDamF; MisesMatNlStatus *status = ( MisesMatNlStatus * ) this->giveStatus(gp); StructuralElement *elem = ( StructuralElement * )( gp->giveElement() ); FloatMatrix b; FloatArray stress; this->computeCumPlasticStrain(nlKappa, gp, atTime); damage = status->giveDamage(); tempDamage = status->giveTempDamage(); if ( ( tempDamage - damage ) > 0 ) { elem->giveLocationArray(loc, EID_MomentumBalance, s); status->giveTempEffectiveStress(stress); elem->computeBmatrixAt(gp, b); dDamF = computeDamageParamPrime(nlKappa); nrows = b.giveNumberOfColumns(); nsize = stress.giveSize(); lcontrib.resize(nrows); for ( i = 1; i <= nrows; i++ ) { sum = 0.0; for ( j = 1; j <= nsize; j++ ) { sum += b.at(j, i) * stress.at(j); } lcontrib.at(i) = sum * mm * dDamF; } } return 1; }
double MisesMatNl :: computeDamage(GaussPoint *gp, TimeStep *tStep) { MisesMatNlStatus *nlStatus = static_cast< MisesMatNlStatus * >( this->giveStatus(gp) ); double nlKappa; this->computeCumPlasticStrain(nlKappa, gp, tStep); double dam, tempDam; dam = nlStatus->giveDamage(); tempDam = this->computeDamageParam(nlKappa); if ( tempDam < dam ) { tempDam = dam; } return tempDam; }
int MisesMatNl :: giveLocalNonlocalStiffnessContribution(GaussPoint *gp, IntArray &loc, const UnknownNumberingScheme &s, FloatArray &lcontrib, TimeStep *tStep) { double nlKappa, damage, tempDamage, dDamF; MisesMatNlStatus *status = static_cast< MisesMatNlStatus * >( this->giveStatus(gp) ); StructuralElement *elem = static_cast< StructuralElement * >( gp->giveElement() ); FloatMatrix b; this->computeCumPlasticStrain(nlKappa, gp, tStep); damage = status->giveDamage(); tempDamage = status->giveTempDamage(); if ( ( tempDamage - damage ) > 0 ) { const FloatArray &stress = status->giveTempEffectiveStress(); elem->giveLocationArray(loc, s); elem->computeBmatrixAt(gp, b); dDamF = computeDamageParamPrime(nlKappa); lcontrib.clear(); lcontrib.plusProduct(b, stress, mm * dDamF); } return 1; }