int M1Material :: giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep) { M1MaterialStatus *status = static_cast< M1MaterialStatus * >( this->giveStatus(gp) ); if ( type == IST_PlasticStrainTensor ) { FloatArray plasticStrain(3); plasticStrain.zero(); FloatArray sigmaN = status->giveTempNormalMplaneStresses(); FloatArray strain = status->giveTempStrainVector(); double Exx, Eyy, Gamma; Exx = Eyy = Gamma = 0.; if ( sigmaN.giveSize() == nmp ) { for ( int imp = 1; imp <= nmp; imp++ ) { double epsN = 0.; for ( int i = 1; i <= 3; i++ ) { epsN += strain.at(i) * N.at(imp, i); } double epsNpl = epsN - sigmaN.at(imp) / EN; double aux = epsNpl * mw.at(imp); Exx += aux * N.at(imp, 1); Eyy += aux * N.at(imp, 2); Gamma += aux * N.at(imp, 3); } } plasticStrain.at(1) = 1.5 * Exx - 0.5 * Eyy; plasticStrain.at(2) = -0.5 * Exx + 1.5 * Eyy; plasticStrain.at(3) = 4. * Gamma; StructuralMaterial :: giveFullSymVectorForm( answer, plasticStrain, gp->giveMaterialMode() ); return 1; } else { return StructuralMaterial :: giveIPValue(answer, gp, type, tStep); } }
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; }