Ejemplo n.º 1
0
void
IntMatIsoDamage :: give2dStiffnessMatrix_Eng(FloatMatrix &answer, MatResponseMode rMode,
                                                                     GaussPoint *gp, TimeStep *tStep)
{
    IntMatIsoDamageStatus *status = static_cast< IntMatIsoDamageStatus * >( this->giveStatus(gp) );

    if ( ( rMode == ElasticStiffness ) || ( rMode == SecantStiffness ) || ( rMode == TangentStiffness ) ) {
        // assemble eleastic stiffness
        answer.resize(2, 2);
        answer.zero();
        answer.at(1, 1) = ks;
        answer.at(2, 2) = kn;

        if ( rMode == ElasticStiffness ) {
            return;
        }

        const FloatArray &jump3d = status->giveTempJump();
        FloatArray jump2d = {jump3d.at(1), jump3d.at(3)};
        double om = min(status->giveTempDamage(), maxOmega);
        double un = jump2d.at(2);

        if ( rMode == SecantStiffness ) {
            answer.at(1, 1) *= 1.0 - om;
            // damage in tension only
            if ( un >= 0 ) {
                answer.at(2, 2) *= 1.0 - om;
            }

            return;
        } else { // Tangent Stiffness
            answer.at(1, 1) *= 1.0 - om;
            // damage in tension only
            if ( un >= 0 ) {
                answer.at(2, 2) *= 1.0 - om; ///@todo this is only the secant stiffness - tangent stiffness is broken!

#if 0
                se.beProductOf(answer, jump2d);
                double omega, omega_plus;
                computeDamageParam(omega, un);
                computeDamageParam(omega_plus, un + 1.0e-8 );
                double dom = (omega_plus - omega)/ 1.0e-8;
                
                // d( (1-omega)*D*j ) / dj = (1-omega)D - D*j openprod domega/dj
                double fac = ft*(e0 - un)/gf;
                dom = e0*exp(fac) /(un*un + 1.0e-9) + e0*ft*exp(fac) / (gf*un + 1.0e-9);
                
                
                dom = -( -e0 / (un * un+1.0e-9) * exp( -( ft / gf ) * ( un - e0 ) ) + e0 / (un+1.0e-9) * exp( -( ft / gf ) * ( un - e0 ) ) * ( -( ft / gf ) ) );
                if ( ( om > 0. ) && ( status->giveTempKappa() > status->giveKappa() ) ) {
                    answer.at(1, 2) -= se.at(1) * dom;
                    answer.at(2, 2) -= se.at(2) * dom;
                }
#endif
            }
        }
    }  else {
        OOFEM_ERROR("Unknown MatResponseMode");
    }
}
Ejemplo n.º 2
0
double
TrabBoneEmbed :: computeDamage(GaussPoint *gp,  TimeStep *atTime)
{
    double tempAlpha;

    computeCumPlastStrain(tempAlpha, gp, atTime);

    double tempDam = computeDamageParam(tempAlpha, gp);

    //  double dam=0.0;

    return tempDam;
}
Ejemplo n.º 3
0
double
MisesMat :: computeDamage(GaussPoint *gp,  TimeStep *tStep)
{
    double tempKappa, dam;
    MisesMatStatus *status = static_cast< MisesMatStatus * >( this->giveStatus(gp) );
    dam = status->giveDamage();
    computeCumPlastStrain(tempKappa, gp, tStep);
    double tempDam = computeDamageParam(tempKappa);
    if ( dam > tempDam ) {
        tempDam = dam;
    }

    return tempDam;
}