Пример #1
0
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);
    }
}
Пример #2
0
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;
}