예제 #1
0
void
RCM2Material :: giveRealStressVector(FloatArray &answer, MatResponseForm form, GaussPoint *gp,
                                     const FloatArray &totalStrain,
                                     TimeStep *atTime)
//
// returns real stress vector in 3d stress space of receiver according to
// previous level of stress and current
// strain increment, the only way, how to correctly update gp records
//
{
    FloatArray princStress, reducedStressVector, crackStrain, reducedAnswer;
    FloatArray reducedTotalStrainVector, principalStrain, strainVector;
    FloatMatrix tempCrackDirs;
    RCM2MaterialStatus *status = ( RCM2MaterialStatus * ) this->giveStatus(gp);
    StructuralCrossSection *crossSection = ( StructuralCrossSection * ) gp->giveElement()->giveCrossSection();

    this->initTempStatus(gp);
    this->initGpForNewStep(gp);

    // subtract stress independent part
    // note: eigenStrains (temperature) is not contained in mechanical strain stored in gp
    // therefore it is necessary to subtract always the total eigen strain value
    this->giveStressDependentPartOfStrainVector(reducedTotalStrainVector, gp, totalStrain, atTime, VM_Total);
    //

    crossSection->giveFullCharacteristicVector(strainVector, gp, reducedTotalStrainVector);

    status->giveTempCrackDirs(tempCrackDirs);
    this->computePrincipalValDir(principalStrain, tempCrackDirs,
                                 strainVector,
                                 principal_strain);

    this->giveRealPrincipalStressVector3d(princStress, gp, principalStrain, tempCrackDirs, atTime);

    princStress.resize(6);
    status->giveTempCrackDirs(tempCrackDirs);
    this->transformStressVectorTo(answer, tempCrackDirs, princStress, 1);

    status->letTempStrainVectorBe(totalStrain);
    crossSection->giveReducedCharacteristicVector(reducedStressVector, gp, answer);
    status->letTempStressVectorBe(reducedStressVector);
    status->giveCrackStrainVector(crackStrain);
    this->updateCrackStatus(gp, crackStrain);

    if ( form == FullForm ) {
        return;
    }

    crossSection->giveReducedCharacteristicVector(reducedAnswer, gp, answer);
    answer = reducedAnswer;
}
예제 #2
0
void
J2plasticMaterial :: computeTrialStressIncrement(FloatArray &answer, GaussPoint *gp,
                                                 const FloatArray &strainIncrement,
                                                 TimeStep *atTime)
{ /* Computes the full trial elastic stress vector */
    FloatArray reducedAnswer;
    FloatMatrix reducedModuli;
    StructuralCrossSection *crossSection = ( StructuralCrossSection * )
                                           ( gp->giveElement()->giveCrossSection() );

    this->giveLinearElasticMaterial()->giveCharacteristicMatrix(reducedModuli, ReducedForm, ElasticStiffness,
                                                                gp, atTime);

    reducedAnswer.beProductOf(reducedModuli, strainIncrement);
    crossSection->giveFullCharacteristicVector(answer, gp, reducedAnswer);
}