63PerfectlyPlasticMaterial :: giveRealStressVector(
FloatArray &answer,
80 FloatArray workStress, *yieldStressGrad, workStress2, stressVector3d;
81 FloatArray mStrainIncrement3d, mStressElasticIncrement3d, PlasticStrainVector3d;
82 FloatArray dSigmaIncrement3d, *stressCorrection, *loadingStressGrad;
84 FloatArray plasticStrainIncrement3d, strainIncrement, reducedStrain, reducedStrainIncrement;
85 FloatArray statusFullStressVector, statusFullPlasticVector;
91 ( gp->giveElement()->giveCrossSection() );
92 double f0, f1, f2, help, dLambda, r, r1, m;
104 StructuralMaterial :: giveFullSymVectorForm( strainIncrement, reducedStrainIncrement, gp->giveMaterialMode() );
106 StructuralMaterial :: giveFullSymVectorForm( statusFullPlasticVector, plasticStrainVector, gp->giveMaterialMode() );
107 StructuralMaterial :: giveFullSymVectorForm( statusFullStressVector, status->
giveStressVector(), gp->giveMaterialMode() );
116 workStress = statusFullStressVector;
117 workStress.
add(elasticStressIncrement);
120 & statusFullPlasticVector);
123 & statusFullPlasticVector);
125 PlasticStrainVector3d = statusFullPlasticVector;
133 r1 = -f0 / ( f1 - f0 );
135 & statusFullPlasticVector);
139 for (
int i = 1; i <= 6; i++ ) {
140 help += yieldStressGrad->
at(i) * elasticStressIncrement.
at(i);
143 delete yieldStressGrad;
145 workStress2 = elasticStressIncrement;
146 workStress2.
times(r1);
147 workStress2.
add(statusFullStressVector);
150 & statusFullPlasticVector);
152 if ( fabs(help) > 1.e-6 ) {
161 stressVector3d = elasticStressIncrement;
162 stressVector3d.
times(r);
163 stressVector3d.
add(statusFullStressVector);
166 mStrainIncrement3d = strainIncrement;
167 mStrainIncrement3d.
times( ( 1.0 - r ) / m );
168 mStressElasticIncrement3d = elasticStressIncrement;
169 mStressElasticIncrement3d.
times( ( 1.0 - r ) / m );
176 for (
int i = 1; i <= m; i++ ) {
185 & PlasticStrainVector3d,
186 & mStrainIncrement3d,
189 if ( dLambda < 0. ) {
193 dSigmaIncrement3d.
beProductOf(dp, mStrainIncrement3d);
195 dSigmaIncrement3d.
add(mStressElasticIncrement3d);
198 & PlasticStrainVector3d);
201 stressVector3d.
add(dSigmaIncrement3d);
204 stressCorrection = this->
206 & PlasticStrainVector3d);
209 stressVector3d.
add(* stressCorrection);
217 loadingStressGrad->
times(dLambda);
218 PlasticStrainVector3d.
add(* loadingStressGrad);
223 this->
updateTempYC(gp, & stressVector3d, & PlasticStrainVector3d);
224 this->
updateTempLC(gp, & stressVector3d, & PlasticStrainVector3d);
229 delete loadingStressGrad;
230 delete stressCorrection;
239 StructuralMaterial :: giveReducedSymVectorForm( helpArry, stressVector3d, gp->giveMaterialMode() );
246 stressVector3d = statusFullStressVector;
247 stressVector3d.
add(elasticStressIncrement);
252 StructuralMaterial :: giveReducedSymVectorForm( helpArray, stressVector3d, gp->giveMaterialMode() );
257 plasticStrainIncrement3d.
beDifferenceOf(PlasticStrainVector3d, statusFullPlasticVector);
258 StructuralMaterial :: giveReducedSymVectorForm( helpArray, plasticStrainIncrement3d, gp->giveMaterialMode() );
261 StructuralMaterial :: giveReducedSymVectorForm( answer, stressVector3d, gp->giveMaterialMode() );
297PerfectlyPlasticMaterial :: giveMaterialStiffnessMatrix(
FloatMatrix &answer, MatResponseMode mode,
317 FloatArray statusFullStressVector, statusFullPlasticVector, plasticStrainVector;
334 if ( mode == SecantStiffness ) {
339 StructuralMaterial :: giveFullSymVectorForm( statusFullPlasticVector, plasticStrainVector, gp->giveMaterialMode() );
340 StructuralMaterial :: giveFullSymVectorForm( statusFullStressVector, status->
giveStressVector(), gp->giveMaterialMode() );
345 & statusFullPlasticVector,
522PerfectlyPlasticMaterial :: computePlasticStiffnessAt(
FloatMatrix &answer,
528 double &lambda)
const
535 ( gp->giveElement()->giveCrossSection() );
536 FloatMatrix de, *yeldStressGradMat, *loadingStressGradMat;
538 FloatArray *yeldStressGrad, *loadingStressGrad;
540 double denominator, nominator;
551 currentPlasticStrainVector);
556 currentPlasticStrainVector);
562 delete loadingStressGrad;
565 delete yeldStressGradMat;
567 delete loadingStressGradMat;
570 for (
int i = 1; i <= 6; i++ ) {
571 denominator += yeldStressGrad->
at(i) * help.
at(i);
576 answer.times( -( 1. / denominator ) );
578 if ( strainIncrement3d != NULL ) {
581 for (
int i = 1; i <= 6; i++ ) {
582 nominator += yeldStressGrad->
at(i) * help.
at(i);
585 lambda = nominator / denominator;
588 delete yeldStressGrad;