44#define YIELD_TOL 1.e-4
46#define PLASTIC_MATERIAL_MAX_ITERATIONS 90
53MPlasticMaterial :: ~MPlasticMaterial()
60MPlasticMaterial :: hasMaterialModeCapability(MaterialMode mode)
const
65 return mode == _3dMat ||
68 mode == _PlaneStress ||
74std::unique_ptr<MaterialStatus>
82MPlasticMaterial :: giveRealStressVector(
FloatArray &answer,
95 FloatArray strainVectorR, plasticStrainVectorR;
117 this->
closestPointReturn(fullStressVector, activeConditionMap, gamma, gp, strainVectorR,
118 plasticStrainVectorR, strainSpaceHardeningVariables, tStep);
120 this->
cuttingPlaneReturn(fullStressVector, activeConditionMap, gamma, gp, strainVectorR,
121 plasticStrainVectorR, strainSpaceHardeningVariables, tStep);
126 StructuralMaterial :: giveReducedSymVectorForm( helpVec, fullStressVector, gp->giveMaterialMode() );
138 bool yieldFlag =
false;
139 for (
int i = 1; i <=
nsurf; i++ ) {
140 if ( gamma.
at(i) > 0. ) {
146 newState = MPlasticMaterialStatus :: PM_Yielding;
149 else if ( ( state == MPlasticMaterialStatus :: PM_Yielding ) || ( state == MPlasticMaterialStatus :: PM_Unloading ) ) {
150 newState = MPlasticMaterialStatus :: PM_Unloading;
152 newState = MPlasticMaterialStatus :: PM_Elastic;
173 FloatArray fullStressSpaceHardeningVars, residualVectorR;
177 FloatMatrix elasticModuli, hardeningModuli, consistentModuli;
178 FloatMatrix elasticModuliInverse, hardeningModuliInverse;
181 std :: vector< FloatArray > yieldGradVec(this->
nsurf), loadGradVec(this->
nsurf), * yieldGradVecPtr, * loadGradVecPtr;
185 int i, j, strSize, totSize;
186 int elastic, restart, actSurf, indx;
187 bool yieldConsistency;
191 yieldGradVecPtr = loadGradVecPtr = & yieldGradVec;
193 yieldGradVecPtr = & yieldGradVec;
194 loadGradVecPtr = & loadGradVec;
208 totSize = strSize + strainSpaceHardeningVariables.
giveSize();
219 elasticStrainVectorR = totalStrain;
220 elasticStrainVectorR.
subtract(plasticStrainVectorR);
231 activeConditionMap.
zero();
232 for ( i = 1; i <= this->
nsurf; i++ ) {
233 yieldValue = this->
computeYieldValueAt(gp, i, fullStressVector, fullStressSpaceHardeningVars);
237 activeConditionMap.
at(i) = actSurf;
249 elasticStrainVectorR = totalStrain;
250 elasticStrainVectorR.
subtract(plasticStrainVectorR);
257 for ( i = 1; i <=
nsurf; i++ ) {
262 for ( i = 1; i <=
nsurf; i++ ) {
270 strainSpaceHardeningVariables, * loadGradVecPtr);
273 yieldConsistency =
true;
274 for ( i = 1; i <=
nsurf; i++ ) {
275 if ( activeConditionMap.
at(i) ) {
276 yieldValue = this->
computeYieldValueAt(gp, i, fullStressVector, fullStressSpaceHardeningVars);
278 yieldConsistency =
false;
284 answer = fullStressVector;
285 printf(
" (%d iterations)", nIterations);
292 hardeningModuliInverse.
beInverseOf(hardeningModuli);
295 hardeningModuliInverse.
clear();
299 hardeningModuliInverse, gamma, activeConditionMap,
300 fullStressVector, fullStressSpaceHardeningVars);
303 gmat.
resize(actSurf, actSurf);
304 for ( i = 1; i <=
nsurf; i++ ) {
305 if ( activeConditionMap.
at(i) ) {
306 yieldValue = this->
computeYieldValueAt(gp, i, fullStressVector, fullStressSpaceHardeningVars);
307 helpVector.
beTProductOf(consistentModuli, ( * yieldGradVecPtr ) [ i - 1 ]);
309 for ( j = 1; j <= this->
nsurf; j++ ) {
310 if ( activeConditionMap.
at(j) ) {
311 gmat.
at(i, j) = ( * loadGradVecPtr ) [ j - 1 ].dotProduct(helpVector);
315 rhs.
at(i) = yieldValue - residualVectorR.
dotProduct(helpVector);
323 for ( i = 1; i <= this->
nsurf; i++ ) {
324 if ( ( indx = activeConditionMap.
at(i) ) ) {
325 dgamma.
at(i) = helpVector.
at(indx);
332 tempGamma.
add(dgamma);
339 for ( i = 1; i <= this->
nsurf; i++ ) {
340 if ( tempGamma.
at(i) < 0.0 ) {
348 activeConditionMap.
zero();
349 for ( i = 1; i <= this->
nsurf; i++ ) {
350 if ( tempGamma.
at(i) > 0.0 ) {
352 activeConditionMap.
at(i) = actSurf;
365 for ( i = 1; i <=
nsurf; i++ ) {
366 if ( activeConditionMap.
at(i) ) {
367 ( * loadGradVecPtr ) [ i - 1 ].times( dgamma.
at(i) );
368 residualVectorR.
add( ( * loadGradVecPtr ) [ i - 1 ] );
372 helpVector.
beProductOf(consistentModuli, residualVectorR);
373 this->
computeDiagModuli(helpMtrx, gp, elasticModuliInverse, hardeningModuliInverse);
377 for ( i = 1; i <= strSize; i++ ) {
378 plasticStrainVectorR.
at(i) += helpVector2.
at(i);
381 for ( i = strSize + 1; i <= totSize; i++ ) {
382 strainSpaceHardeningVariables.
at(i - strSize) += helpVector2.
at(i);
391 OOFEM_WARNING(
"local equlibrium not reached in %d iterations\nElement %d, gp %d, continuing",
393 answer = fullStressVector;
398 answer = fullStressVector;
414 FloatArray fullStressVector, fullStressSpaceHardeningVars;
415 FloatArray helpVector, trialStressIncrement, rhs;
416 FloatMatrix elasticModuli, hardeningModuli, dmat, gmatInv;
417 std :: vector< FloatArray > yieldGradVec(this->
nsurf), loadGradVec(this->
nsurf), * yieldGradVecPtr, * loadGradVecPtr;
421 int size, sizeR, i, j, elastic, restart, actSurf, indx, iindx, jindx;
426 yieldGradVecPtr = loadGradVecPtr = & yieldGradVec;
428 yieldGradVecPtr = & yieldGradVec;
429 loadGradVecPtr = & loadGradVec;
446 elasticStrainVectorR = totalStrain;
447 elasticStrainVectorR.
subtract(plasticStrainVectorR);
450 StructuralMaterial :: giveReducedSymVectorForm( trialStressIncrement, fullStressVector, gp->
giveMaterialMode() );
456 activeConditionMap.
zero();
457 for ( i = 1; i <= this->
nsurf; i++ ) {
458 yieldValue = this->
computeYieldValueAt(gp, i, fullStressVector, fullStressSpaceHardeningVars);
462 activeConditionMap.
at(i) = actSurf;
476 for ( i = 1; i <= sizeR; i++ ) {
477 for ( j = 1; j <= sizeR; j++ ) {
478 dmat.
at(i, j) = elasticModuli.
at(i, j);
482 for ( i = sizeR + 1; i <= size; i++ ) {
483 for ( j = sizeR + 1; j <= size; j++ ) {
484 dmat.
at(i, j) = hardeningModuli.
at(i - sizeR, j - sizeR);
491 for ( i = sizeR + 1; i <= size; i++ ) {
492 for ( j = sizeR + 1; j <= size; j++ ) {
493 dmat.
at(i, j) = hardeningModuli.
at(i - sizeR, j - sizeR);
498 gmatInv.
resize(actSurf, actSurf);
504 for ( i = 1; i <=
nsurf; i++ ) {
509 for ( i = 1; i <=
nsurf; i++ ) {
516 for ( i = 1; i <=
nsurf; i++ ) {
517 if ( ( iindx = activeConditionMap.
at(i) ) ) {
519 helpVector.
beTProductOf(dmat, ( * yieldGradVecPtr ) [ i - 1 ]);
521 for ( j = 1; j <= this->
nsurf; j++ ) {
522 if ( ( jindx = activeConditionMap.
at(j) ) ) {
523 gmatInv.
at(iindx, jindx) = ( * loadGradVecPtr ) [ j - 1 ].dotProduct(helpVector);
548 for ( i = 1; i <= this->
nsurf; i++ ) {
549 if ( ( indx = activeConditionMap.
at(i) ) ) {
550 dgamma.
at(i) = helpVector.
at(indx);
560 for ( i = 1; i <= this->
nsurf; i++ ) {
561 if ( ( gamma.
at(i) + dgamma.
at(i) ) < 0.0 ) {
570 activeConditionMap.
zero();
571 for ( i = 1; i <= this->
nsurf; i++ ) {
572 if ( ( gamma.
at(i) + dgamma.
at(i) ) > 0.0 ) {
574 activeConditionMap.
at(i) = actSurf;
587 for ( i = 1; i <= this->
nsurf; i++ ) {
588 if ( activeConditionMap.
at(i) ) {
589 ( * loadGradVecPtr ) [ i - 1 ].times( dgamma.
at(i) );
590 for ( j = 1; j <= sizeR; j++ ) {
591 helpVector.
at(j) += ( * loadGradVecPtr ) [ i - 1 ].at(j);
596 plasticStrainVectorR.
add(helpVector);
598 helpVector.
resize(size - sizeR);
600 for ( i = 1; i <= this->
nsurf; i++ ) {
601 if ( activeConditionMap.
at(i) ) {
603 for ( j = sizeR + 1; j <= size; j++ ) {
604 helpVector.
at(j - sizeR) += ( * loadGradVecPtr ) [ i - 1 ].at(j);
609 strainSpaceHardeningVariables.
add(helpVector);
613 elasticStrainVectorR = totalStrain;
614 elasticStrainVectorR.
subtract(plasticStrainVectorR);
620 for ( i = 1; i <= this->
nsurf; i++ ) {
621 yieldValue = this->
computeYieldValueAt(gp, i, fullStressVector, fullStressSpaceHardeningVars);
636 char buff [ 200 ], buff1 [ 150 ];
646 printf(
" (%d iterations)", nIterations);
647 answer = fullStressVector;
655 const FloatArray &fullStressSpaceHardeningVars)
const
671 fullStressSpaceHardeningVars);
673 StructuralMaterial :: giveReducedSymVectorForm( stressGradientR, stressGradient, gp->
giveMaterialMode() );
676 fullStressVector, fullStressSpaceHardeningVars);
679 if ( stressSpaceHardVarGradient.
isNotEmpty() ) {
680 size = isize + stressSpaceHardVarGradient.
giveSize();
686 for (
int i = 1; i <= isize; i++ ) {
687 answer.
at(i) = stressGradientR.
at(i);
690 for (
int i = isize + 1; i <= size; i++ ) {
691 answer.
at(i) = stressSpaceHardVarGradient.
at(i - isize);
699 const FloatArray &strainSpaceHardeningVariables,
700 std :: vector< FloatArray > &gradientVectorR)
const
704 FloatArray oldPlasticStrainVectorR, oldStrainSpaceHardeningVariables;
708 isize = plasticStrainVectorR.
giveSize();
709 size = gradientVectorR [ 0 ].giveSize();
715 for (
int i = 1; i <= isize; i++ ) {
716 answer.
at(i) = oldPlasticStrainVectorR.
at(i) - plasticStrainVectorR.
at(i);
719 for (
int i = isize + 1; i <= size; i++ ) {
720 answer.
at(i) = oldStrainSpaceHardeningVariables.
at(i - isize) - strainSpaceHardeningVariables.
at(i - isize);
723 for (
int i = 1; i <= this->
nsurf; i++ ) {
724 if ( activeConditionMap.
at(i) ) {
725 for (
int j = 1; j <= size; j++ ) {
726 answer.
at(j) += gamma.
at(i) * gradientVectorR [ i - 1 ].at(j);
745 reducedAnswer.
beProductOf(de, elasticStrainVectorR);
746 StructuralMaterial :: giveFullSymVectorForm( answer, reducedAnswer, gp->
giveMaterialMode() );
758 const FloatArray &fullStressSpaceHardeningVars)
const
767 int i, j, isize, size;
777 helpInverse.
resize(size, size);
779 for ( i = 1; i <=
nsurf; i++ ) {
780 if ( activeConditionMap.
at(i) ) {
783 fullStressSpaceHardeningVars);
785 gradientMatrix.
times( gamma.
at(i) );
786 helpInverse.
add(gradientMatrix);
790 for ( i = 1; i <= isize; i++ ) {
791 for ( j = 1; j <= isize; j++ ) {
792 helpInverse.
at(i, j) += elasticModuliInverse.
at(i, j);
797 for ( i = isize + 1; i <= size; i++ ) {
798 for ( j = isize + 1; j <= size; j++ ) {
799 helpInverse.
at(i, j) += hardeningModuliInverse.
at(i - isize, j - isize);
807 answer.
resize( isize + fullStressSpaceHardeningVars.
giveSize(), isize + fullStressSpaceHardeningVars.
giveSize() );
809 for ( i = 1; i <= size; i++ ) {
810 for ( j = 1; j <= size; j++ ) {
811 answer.
at(i, j) = help.
at(i, j);
823MPlasticMaterial :: giveConsistentStiffnessMatrix(MatResponseMode mode,
832 FloatMatrix consistentModuli, elasticModuli, hardeningModuli;
833 FloatMatrix elasticModuliInverse, hardeningModuliInverse;
834 FloatMatrix gmatInv, gmat, gradMat, helpMtrx, helpMtrx2, nmat, sbm1;
838 std :: vector< FloatArray > yieldGradVec(this->
nsurf), loadGradVec(this->
nsurf), * yieldGradVecPtr, * loadGradVecPtr;
842 int size, sizeR, i, j, iindx, actSurf = 0;
847 yieldGradVecPtr = loadGradVecPtr = & yieldGradVec;
849 yieldGradVecPtr = & yieldGradVec;
850 loadGradVecPtr = & loadGradVec;
869 for ( i = 1; i <=
nsurf; i++ ) {
870 if ( activeConditionMap.
at(i) ) {
883 hardeningModuliInverse.
beInverseOf(hardeningModuli);
885 hardeningModuliInverse.
clear();
889 StructuralMaterial :: giveFullSymVectorForm( fullStressVector, stressVector, gp->
giveMaterialMode() );
898 activeConditionMap, fullStressVector, stressSpaceHardeningVars);
901 for ( i = 1; i <=
nsurf; i++ ) {
906 for ( i = 1; i <=
nsurf; i++ ) {
913 gradMat.
resize(actSurf, size);
914 for ( i = 1; i <=
nsurf; i++ ) {
915 if ( ( iindx = activeConditionMap.
at(i) ) ) {
916 for ( j = 1; j <= size; j++ ) {
917 gradMat.
at(iindx, j) = ( * yieldGradVecPtr ) [ i - 1 ].at(j);
923 helpMtrx.
resize(actSurf, size);
943 for ( i = 1; i <=
nsurf; i++ ) {
944 if ( ( iindx = activeConditionMap.
at(i) ) ) {
945 for ( j = 1; j <= size; j++ ) {
946 lgradMat.
at(iindx, j) = ( * loadGradVecPtr ) [ i - 1 ].at(j);
951 helpMtrx.
resize(actSurf, size);
973MPlasticMaterial :: giveElastoPlasticStiffnessMatrix(
FloatMatrix &answer,
974 MatResponseMode mode,
984 FloatMatrix gmatInv, gmat, gradMat, helpMtrx, helpMtrx2;
988 std :: vector< FloatArray > yieldGradVec(this->
nsurf), loadGradVec(this->
nsurf);
991 int size, sizeR, i, j, iindx, actSurf = 0;
1009 for ( i = 1; i <=
nsurf; i++ ) {
1010 if ( activeConditionMap.
at(i) ) {
1023 StructuralMaterial :: giveFullSymVectorForm( fullStressVector, stressVector, gp->
giveMaterialMode() );
1035 for ( i = 1; i <= sizeR; i++ ) {
1036 for ( j = 1; j <= sizeR; j++ ) {
1037 dmat.
at(i, j) = elasticModuli.
at(i, j);
1041 for ( i = sizeR + 1; i <= size; i++ ) {
1042 for ( j = sizeR + 1; j <= size; j++ ) {
1043 dmat.
at(i, j) = hardeningModuli.
at(i - sizeR, j - sizeR);
1049 for ( i = 1; i <=
nsurf; i++ ) {
1054 for ( i = 1; i <=
nsurf; i++ ) {
1059 gradMat.
resize(actSurf, size);
1060 for ( i = 1; i <=
nsurf; i++ ) {
1061 if ( ( iindx = activeConditionMap.
at(i) ) ) {
1062 for ( j = 1; j <= size; j++ ) {
1063 gradMat.
at(iindx, j) = yieldGradVec [ i - 1 ].at(j);
1069 helpMtrx.
resize(actSurf, size);
1078 answer.
add(elasticModuli);
1081 for ( i = 1; i <=
nsurf; i++ ) {
1082 if ( ( iindx = activeConditionMap.
at(i) ) ) {
1083 for ( j = 1; j <= size; j++ ) {
1084 lgradMat.
at(iindx, j) = loadGradVec [ i - 1 ].at(j);
1089 helpMtrx.
resize(actSurf, size);
1099 answer.
add(elasticModuli);
1121 answer.
resize(size2, size2);
1124 for (
int i = 1; i <= size1; i++ ) {
1125 for (
int j = 1; j <= size1; j++ ) {
1126 answer.
at(i, j) = elasticModuliInverse.
at(i, j);
1130 for (
int i = size1 + 1; i <= size2; i++ ) {
1131 for (
int j = size1 + 1; j <= size2; j++ ) {
1132 answer.
at(i, j) = hardeningModuliInverse.
at(i - size1, j - size1);
1150MPlasticMaterial :: give3dMaterialStiffnessMatrix(MatResponseMode mode,
1177 if ( mode == ElasticStiffness ) {
1190MPlasticMaterial :: givePlaneStressStiffMtrx(MatResponseMode mode,
1202 if ( mode == ElasticStiffness ) {
1215MPlasticMaterial :: givePlaneStrainStiffMtrx(MatResponseMode mode,
1225 if ( mode == ElasticStiffness ) {
1238MPlasticMaterial :: give1dStressStiffMtrx(MatResponseMode mode,
1246 if ( mode == ElasticStiffness ) {
1259MPlasticMaterial :: give2dBeamLayerStiffMtrx(MatResponseMode mode,
1270 if ( mode == ElasticStiffness ) {
1283MPlasticMaterial :: givePlateLayerStiffMtrx(MatResponseMode mode,
1294 if ( mode == ElasticStiffness ) {
1307MPlasticMaterial :: giveFiberStiffMtrx(MatResponseMode mode,
1318 if ( mode == ElasticStiffness ) {
1334 if ( type == IST_PlasticStrainTensor ) {
1337 StructuralMaterial :: giveFullSymVectorForm( answer, ep, gp->
giveMaterialMode() );
1339 }
else if ( type == IST_PrincipalPlasticStrainTensor ) {
1344 StructuralMaterial :: giveFullSymVectorForm( st, s, gp->
giveMaterialMode() );
1349 return StructuralMaterial :: giveIPValue(answer, gp, type, tStep);
1354MPlasticMaterialStatus :: MPlasticMaterialStatus(
GaussPoint *g,
int statusSize) :
1361MPlasticMaterialStatus :: printOutputAt(FILE *file,
TimeStep *tStep)
const
1363 StructuralMaterialStatus :: printOutputAt(file, tStep);
1364 fprintf(file,
"status { ");
1365 if ( (
state_flag == MPlasticMaterialStatus :: PM_Yielding ) || (
state_flag == MPlasticMaterialStatus :: PM_Unloading ) ) {
1366 if (
state_flag == MPlasticMaterialStatus :: PM_Yielding ) {
1367 fprintf(file,
" Yielding, ");
1369 fprintf(file,
" Unloading, ");
1372 fprintf(file,
" plastic strains ");
1374 fprintf( file,
" %.4e", val );
1378 fprintf(file,
", strain space hardening vars ");
1380 fprintf( file,
" %.4e", val );
1385 fprintf(file,
"}\n");
1389void MPlasticMaterialStatus :: initTempStatus()
1394 StructuralMaterialStatus :: initTempStatus();
1397 plasticStrainVector.resize( StructuralMaterial :: giveSizeOfVoigtSymVector(
gp->giveMaterialMode() ) );
1412MPlasticMaterialStatus :: updateYourself(
TimeStep *tStep)
1419 StructuralMaterialStatus :: updateYourself(tStep);
1433 StructuralMaterialStatus :: saveContext(stream, mode);
1448 if ( ( iores =
gamma.storeYourself(stream) ) !=
CIO_OK ) {
1461 StructuralMaterialStatus :: restoreContext(stream, mode);
1476 if ( ( iores =
gamma.restoreYourself(stream) ) !=
CIO_OK ) {
virtual int read(int *data, std::size_t count)=0
Reads count integer values into array pointed by data.
virtual int write(const int *data, std::size_t count)=0
Writes count integer values from array pointed by data.
double computeNorm() const
double dotProduct(const FloatArray &x) const
Index giveSize() const
Returns the size of receiver.
void zero()
Zeroes all coefficients of receiver.
void beProductOf(const FloatMatrix &aMatrix, const FloatArray &anArray)
void beTProductOf(const FloatMatrix &aMatrix, const FloatArray &anArray)
void add(const FloatArray &src)
void subtract(const FloatArray &src)
bool isNotEmpty() const
Returns true if receiver is not empty.
void add(const FloatMatrix &a)
void resize(Index rows, Index cols)
*Sets size of receiver to be an empty matrix It will have zero rows and zero columns size void clear()
void beSubMatrixOf(const FloatMatrix &src, Index topRow, Index bottomRow, Index topCol, Index bottomCol)
void beProductTOf(const FloatMatrix &a, const FloatMatrix &b)
int giveNumberOfColumns() const
Returns number of columns of receiver.
void beProductOf(const FloatMatrix &a, const FloatMatrix &b)
void zero()
Zeroes all coefficient of receiver.
bool beInverseOf(const FloatMatrix &src)
int giveNumberOfRows() const
Returns number of rows of receiver.
double at(std::size_t i, std::size_t j) const
bool solveForRhs(const FloatArray &b, FloatArray &answer, bool transpose=false)
void subtract(const FloatMatrix &a)
void beTProductOf(const FloatMatrix &a, const FloatMatrix &b)
int giveNumber()
Returns number of receiver.
MaterialMode giveMaterialMode()
Returns corresponding material mode of receiver.
Element * giveElement()
Returns corresponding element to receiver.
void zero()
Sets all component to zero.
GaussPoint * gp
Associated integration point.
FloatArray tempPlasticStrainVector
const FloatArray & giveTempGamma()
FloatArray gamma
Consistency parameter values (needed for algorithmic stiffness).
FloatArray tempStrainSpaceHardeningVarsVector
void letTempStrainSpaceHardeningVarsVectorBe(FloatArray v)
void letTempStateFlagBe(int v)
void setTempActiveConditionMap(IntArray v)
const FloatArray & givePlasticStrainVector() const
Returns the equilibrated strain vector.
void setTempGamma(FloatArray v)
IntArray activeConditionMap
Active set of yield functions (needed for algorithmic stiffness).
const FloatArray & giveStrainSpaceHardeningVars() const
Returns the equilibrated hardening variable vector.
const IntArray & giveTempActiveConditionMap()
int state_flag
Yield function status indicator.
FloatArray strainSpaceHardeningVarsVector
Strain space hardening variables.
IntArray tempActiveConditionMap
FloatArray plasticStrainVector
Plastic strain vector.
void letTempPlasticStrainVectorBe(FloatArray v)
virtual int giveSizeOfReducedHardeningVarsVector(GaussPoint *) const
void cuttingPlaneReturn(FloatArray &answer, IntArray &activeConditionMap, FloatArray &gamma, GaussPoint *gp, const FloatArray &totalStrain, FloatArray &plasticStrainR, FloatArray &strainSpaceHardeningVariables, TimeStep *tStep) const
virtual void computeTrialStressIncrement(FloatArray &answer, GaussPoint *gp, const FloatArray &strainIncrement, TimeStep *tStep) const
void computeAlgorithmicModuli(FloatMatrix &answer, GaussPoint *gp, const FloatMatrix &elasticModuliInverse, const FloatMatrix &hardeningModuliInverse, const FloatArray &gamma, const IntArray &activeConditionMap, const FloatArray &fullStressVector, const FloatArray &fullStressSpaceHardeningVars) const
void closestPointReturn(FloatArray &answer, IntArray &activeConditionMap, FloatArray &gamma, GaussPoint *gp, const FloatArray &totalStrain, FloatArray &plasticStrainR, FloatArray &strainSpaceHardeningVariables, TimeStep *tStep) const
virtual void computeReducedGradientMatrix(FloatMatrix &answer, int isurf, GaussPoint *gp, const FloatArray &stressVector, const FloatArray &stressSpaceHardeningVars) const =0
virtual void computeStressSpaceHardeningVars(FloatArray &answer, GaussPoint *gp, const FloatArray &strainSpaceHardeningVariables) const =0
virtual void computeReducedElasticModuli(FloatMatrix &answer, GaussPoint *gp, TimeStep *tStep) const
MPlasticMaterial(int n, Domain *d)
virtual void computeHardeningReducedModuli(FloatMatrix &answer, GaussPoint *gp, const FloatArray &strainSpaceHardeningVariables, TimeStep *tStep) const =0
virtual void computeStressGradientVector(FloatArray &answer, functType ftype, int isurf, GaussPoint *gp, const FloatArray &stressVector, const FloatArray &stressSpaceHardeningVars) const =0
virtual double computeYieldValueAt(GaussPoint *gp, int isurf, const FloatArray &stressVector, const FloatArray &stressSpaceHardeningVars) const =0
functType
Type that allows to distinguish between yield function and loading function.
virtual void computeStressSpaceHardeningVarsReducedGradient(FloatArray &answer, functType ftype, int isurf, GaussPoint *gp, const FloatArray &stressVector, const FloatArray &stressSpaceHardeningVars) const =0
int nsurf
Number of yield surfaces.
virtual int hasHardening() const
enum oofem::MPlasticMaterial::ReturnMappingAlgoType rmType
void computeGradientVector(FloatArray &answer, functType ftype, int isurf, GaussPoint *gp, const FloatArray &fullStressVector, const FloatArray &fullStressSpaceHardeningVars) const
void computeResidualVector(FloatArray &answer, GaussPoint *gp, const FloatArray &gamma, const IntArray &activeConditionMap, const FloatArray &plasticStrainVectorR, const FloatArray &strainSpaceHardeningVariables, std ::vector< FloatArray > &gradVec) const
virtual void giveElastoPlasticStiffnessMatrix(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep) const
virtual FloatMatrix giveConsistentStiffnessMatrix(MatResponseMode, GaussPoint *gp, TimeStep *tStep) const
LinearElasticMaterial * linearElasticMaterial
Reference to bulk (undamaged) material.
enum oofem::MPlasticMaterial::plastType plType
void computeDiagModuli(FloatMatrix &answer, GaussPoint *gp, FloatMatrix &elasticModuliInverse, FloatMatrix &hardeningModuliInverse) const
virtual MaterialStatus * giveStatus(GaussPoint *gp) const
virtual void initTempStatus(GaussPoint *gp) const
const FloatArray & giveTempStressVector() const
Returns the const pointer to receiver's temporary stress vector.
StructuralMaterialStatus(GaussPoint *g)
Constructor. Creates new StructuralMaterialStatus with IntegrationPoint g.
const FloatArray & giveStressVector() const
Returns the const pointer to receiver's stress vector.
void letTempStressVectorBe(const FloatArray &v)
Assigns tempStressVector to given vector v.
void letTempStrainVectorBe(const FloatArray &v)
Assigns tempStrainVector to given vector v.
static void computePrincipalValues(FloatArray &answer, const FloatArray &s, stressStrainPrincMode mode)
Common functions for convenience.
StructuralMaterial(int n, Domain *d)
void giveStressDependentPartOfStrainVector(FloatArray &answer, GaussPoint *gp, const FloatArray &reducedStrainVector, TimeStep *tStep, ValueModeType mode) const
#define OOFEM_WARNING(...)
#define PLASTIC_MATERIAL_MAX_ITERATIONS
@ principal_strain
For computing principal strains from engineering strains.
@ CIO_IOERR
General IO error.