void M1Material :: giveRealStressVector_PlaneStress(FloatArray &answer, GaussPoint *gp, const FloatArray &totalStrain, TimeStep *tStep) { int i, imp; FloatArray sigmaN, deps, sigmaNyield; double depsN, epsN; answer.resize(3); answer.zero(); sigmaNyield.resize(nmp); sigmaNyield.zero(); M1MaterialStatus *status = static_cast< M1MaterialStatus * >( this->giveStatus(gp) ); this->initTempStatus(gp); sigmaN = status->giveNormalMplaneStresses(); if ( sigmaN.giveSize() < nmp ) { sigmaN.resize(nmp); sigmaN.zero(); } deps.beDifferenceOf( totalStrain, status->giveStrainVector() ); for ( imp = 1; imp <= nmp; imp++ ) { depsN = N.at(imp, 1) * deps.at(1) + N.at(imp, 2) * deps.at(2) + N.at(imp, 3) * deps.at(3); epsN = N.at(imp, 1) * totalStrain.at(1) + N.at(imp, 2) * totalStrain.at(2) + N.at(imp, 3) * totalStrain.at(3); sigmaN.at(imp) += EN * depsN; double sy = EN * ( s0 + HN * epsN ) / ( EN + HN ); // current microplane yield stress if ( sy < 0. ) { sy = 0.; } if ( sigmaN.at(imp) > sy ) { sigmaN.at(imp) = sy; } sigmaNyield.at(imp) = sy; for ( i = 1; i <= 3; i++ ) { answer.at(i) += N.at(imp, i) * sigmaN.at(imp) * mw.at(imp); } } // update status status->letTempStrainVectorBe(totalStrain); status->letTempNormalMplaneStressesBe(sigmaN); status->letNormalMplaneYieldStressesBe(sigmaNyield); status->letTempStressVectorBe(answer); }
void M1Material :: givePlaneStressStiffMtrx(FloatMatrix &answer, MatResponseMode rMode, GaussPoint *gp, TimeStep *tStep) { answer.resize(3, 3); if ( rMode == ElasticStiffness ) { giveElasticPlaneStressStiffMtrx(answer); return; } M1MaterialStatus *status = static_cast< M1MaterialStatus * >( this->giveStatus(gp) ); FloatArray sigmaN = status->giveTempNormalMplaneStresses(); if ( sigmaN.giveSize() != nmp ) { sigmaN = status->giveNormalMplaneStresses(); if ( sigmaN.giveSize() != nmp ) { giveElasticPlaneStressStiffMtrx(answer); return; } } FloatArray sigmaNyield = status->giveNormalMplaneYieldStresses(); double D11, D12, D13, D22, D23, aux; D11 = D12 = D13 = D22 = D23 = 0.; for ( int imp = 1; imp <= nmp; imp++ ) { if ( sigmaN.at(imp) < sigmaNyield.at(imp) ) { // otherwise the plane is yielding aux = mw.at(imp) * EN; } else if ( sigmaNyield.at(imp) > 0. ) { aux = mw.at(imp) * EN * HN / ( EN + HN ); } else { aux = 0.; } D11 += aux * NN.at(imp, 1); D12 += aux * NN.at(imp, 3); D13 += aux * NN.at(imp, 2); D22 += aux * NN.at(imp, 5); D23 += aux * NN.at(imp, 4); } answer.at(1, 1) = D11; answer.at(1, 2) = answer.at(2, 1) = answer.at(3, 3) = D12; answer.at(1, 3) = answer.at(3, 1) = D13; answer.at(2, 2) = D22; answer.at(2, 3) = answer.at(3, 2) = D23; }