45#define YIELD_TOL 1.e-5
47#define PLASTIC_MATERIAL_MAX_ITERATIONS 40
53PlasticMaterial :: ~PlasticMaterial()
60PlasticMaterial :: hasMaterialModeCapability(MaterialMode mode)
const
62 return mode == _3dMat ||
65 mode == _PlaneStress ||
67 mode == _PlaneStrain ||
68 mode == _PlateLayer ||
69 mode == _2dBeamLayer ||
74std::unique_ptr<MaterialStatus>
82PlasticMaterial :: giveRealStressVector(
FloatArray &answer,
94 FloatArray fullStressVector, *fullStressSpaceHardeningVars, *residualVectorR;
96 FloatArray strainVectorR, plasticStrainVectorR, *gradientVectorR;
98 double yieldValue, Gamma, dGamma, helpVal1, helpVal2;
99 int strSize, totSize, nIterations = 0;
100 FloatMatrix elasticModuli, hardeningModuli, consistentModuli;
101 FloatMatrix elasticModuliInverse, hardeningModuliInverse;
122 totSize = strSize + strainSpaceHardeningVariables.
giveSize();
129 elasticStrainVectorR.
beDifferenceOf(strainVectorR, plasticStrainVectorR);
133 yieldValue = this->
computeYieldValueAt(gp, & fullStressVector, fullStressSpaceHardeningVars);
136 & strainSpaceHardeningVariables,
141 delete fullStressSpaceHardeningVars;
142 delete gradientVectorR;
143 delete residualVectorR;
150 hardeningModuliInverse.
beInverseOf(hardeningModuli);
152 hardeningModuliInverse.
clear();
156 hardeningModuliInverse, Gamma,
157 fullStressVector, * fullStressSpaceHardeningVars);
163 helpVal1 = helpVec.
at(1);
165 helpVal2 = helpVec.
at(1);
166 dGamma = ( yieldValue - helpVal2 ) / helpVal1;
171 gradientVectorR->
times(dGamma);
172 residualVectorR->
add(* gradientVectorR);
173 helpVec.
beProductOf(consistentModuli, * residualVectorR);
175 this->
computeDiagModuli(helpMtrx, gp, elasticModuliInverse, hardeningModuliInverse);
179 for (
int i = 1; i <= strSize; i++ ) {
180 plasticStrainVectorR.
at(i) += helpVec2.
at(i);
183 for (
int i = strSize + 1; i <= totSize; i++ ) {
184 strainSpaceHardeningVariables.
at(i - strSize) += helpVec2.
at(i);
193 delete fullStressSpaceHardeningVars;
194 delete gradientVectorR;
195 delete residualVectorR;
198 OOFEM_WARNING(
"local equlibrium not reached in %d iterations\nElement %d, gp %d, continuing",
207 StructuralMaterial :: giveReducedSymVectorForm( helpVec, fullStressVector, gp->giveMaterialMode() );
235 FloatArray *fullStressSpaceHardeningVars)
const
247 FloatArray *stressSpaceHardVarGradient, *answer;
251 fullStressSpaceHardeningVars);
253 StructuralMaterial :: giveReducedSymVectorForm( stressGradientR, * stressGradient, gp->
giveMaterialMode() );
258 if ( stressSpaceHardVarGradient ) {
259 size = isize + stressSpaceHardVarGradient->
giveSize();
265 for (
int i = 1; i <= isize; i++ ) {
266 answer->
at(i) = stressGradientR.
at(i);
269 for (
int i = isize + 1; i <= size; i++ ) {
270 answer->
at(i) = stressSpaceHardVarGradient->
at(i - isize);
273 delete stressSpaceHardVarGradient;
274 delete stressGradient;
281PlasticMaterial :: ComputeResidualVector(
GaussPoint *gp,
double Gamma,
288 FloatArray oldPlasticStrainVectorR, oldStrainSpaceHardeningVariables;
293 isize = plasticStrainVectorR->
giveSize();
300 for (
int i = 1; i <= isize; i++ ) {
301 answer->
at(i) = oldPlasticStrainVectorR.
at(i) - plasticStrainVectorR->
at(i) + Gamma *gradientVectorR->
at(i);
304 for (
int i = isize + 1; i <= size; i++ ) {
305 answer->
at(i) = oldStrainSpaceHardeningVariables.
at(i - isize) - strainSpaceHardeningVariables->
at(i - isize) + Gamma *gradientVectorR->
at(i);
319 OOFEM_ERROR(
"Unable to compute trial stress increment");
330 const FloatArray &fullStressSpaceHardeningVars)
const
350 fullStressSpaceHardeningVars);
353 helpInverse.
resize(size, size);
355 for (
int i = 1; i <= isize; i++ ) {
356 for (
int j = 1; j <= isize; j++ ) {
357 helpInverse.
at(i, j) = elasticModuliInverse.
at(i, j) + Gamma *gradientMatrix.
at(i, j);
360 for (
int j = isize + 1; j <= size; j++ ) {
361 helpInverse.
at(i, j) = Gamma * gradientMatrix.
at(i, j);
365 for (
int i = isize + 1; i <= size; i++ ) {
366 for (
int j = 1; j <= isize; j++ ) {
367 helpInverse.
at(i, j) = Gamma * gradientMatrix.
at(i, j);
370 for (
int j = isize + 1; j <= size; j++ ) {
371 helpInverse.
at(i, j) = hardeningModuliInverse.
at(i - isize, j - isize) + Gamma *gradientMatrix.
at(i, j);
381PlasticMaterial :: giveConsistentStiffnessMatrix(MatResponseMode mode,
390 FloatMatrix consistentModuli, elasticModuli, hardeningModuli;
391 FloatMatrix elasticModuliInverse, hardeningModuliInverse;
393 FloatArray *gradientVector, stressVector, fullStressVector;
395 FloatArray strainSpaceHardeningVariables, helpVector;
406 return elasticModuli;
420 hardeningModuliInverse.
beInverseOf(hardeningModuli);
422 hardeningModuliInverse.
clear();
426 StructuralMaterial :: giveFullSymVectorForm( fullStressVector, stressVector, gp->
giveMaterialMode() );
431 elasticModuliInverse,
432 hardeningModuliInverse,
435 * stressSpaceHardeningVars);
438 helpVector.
beProductOf(consistentModuli, * gradientVector);
439 s = ( -1. ) * gradientVector->
dotProduct(helpVector);
444 helpVector.
beProductOf(consistentSubModuli, * gradientVector);
446 for (
int i = 1; i <= sizeR; i++ ) {
447 for (
int j = 1; j <= sizeR; j++ ) {
448 answerR.
at(i, j) += ( 1. / s ) * helpVector.
at(i) * helpVector.
at(j);
452 delete gradientVector;
453 delete stressSpaceHardeningVars;
475 answer.
resize(size2, size2);
478 for (
int i = 1; i <= size1; i++ ) {
479 for (
int j = 1; j <= size1; j++ ) {
480 answer.
at(i, j) = elasticModuliInverse.
at(i, j);
484 for (
int i = size1 + 1; i <= size2; i++ ) {
485 for (
int j = size1 + 1; j <= size2; j++ ) {
486 answer.
at(i, j) = hardeningModuliInverse.
at(i - size1, j - size1);
493PlasticMaterial :: computeReducedElasticModuli(
FloatMatrix &answer,
504PlasticMaterial :: give3dMaterialStiffnessMatrix(MatResponseMode mode,
531 if ( mode == ElasticStiffness ) {
540PlasticMaterial :: givePlaneStressStiffMtrx(MatResponseMode mode,
551 if ( mode == ElasticStiffness ) {
560PlasticMaterial :: givePlaneStrainStiffMtrx(MatResponseMode mode,
570 if ( mode == ElasticStiffness ) {
579PlasticMaterial :: give1dStressStiffMtrx(MatResponseMode mode,
587 if ( mode == ElasticStiffness ) {
596PlasticMaterial :: give2dBeamLayerStiffMtrx(MatResponseMode mode,
607 if ( mode == ElasticStiffness ) {
616PlasticMaterial :: givePlateLayerStiffMtrx(MatResponseMode mode,
627 if ( mode == ElasticStiffness ) {
636PlasticMaterial :: giveFiberStiffMtrx(MatResponseMode mode,
647 if ( mode == ElasticStiffness ) {
659 if ( type == IST_PlasticStrainTensor ) {
662 StructuralMaterial :: giveFullSymVectorForm( answer, ep, gp->
giveMaterialMode() );
664 }
else if ( type == IST_PrincipalPlasticStrainTensor ) {
669 StructuralMaterial :: giveFullSymVectorForm( st, s, gp->
giveMaterialMode() );
674 return StructuralMaterial :: giveIPValue(answer, gp, type, tStep);
679PlasticMaterialStatus :: PlasticMaterialStatus(
GaussPoint *g,
int statusSize) :
686PlasticMaterialStatus :: printOutputAt(FILE *file,
TimeStep *tStep)
const
688 StructuralMaterialStatus :: printOutputAt(file, tStep);
689 fprintf(file,
"status { ");
692 fprintf(file,
" Yielding, ");
694 fprintf(file,
" Unloading, ");
697 fprintf(file,
" plastic strains ");
699 fprintf( file,
" %.4e", val );
703 fprintf(file,
", strain space hardening vars ");
705 fprintf( file,
" %.4e", val );
710 fprintf(file,
"}\n");
714void PlasticMaterialStatus :: initTempStatus()
719 StructuralMaterialStatus :: initTempStatus();
722 plasticStrainVector.resize( StructuralMaterial :: giveSizeOfVoigtSymVector(
gp->giveMaterialMode() ) );
736PlasticMaterialStatus :: updateYourself(
TimeStep *tStep)
743 StructuralMaterialStatus :: updateYourself(tStep);
756 StructuralMaterialStatus :: saveContext(stream, mode);
780 StructuralMaterialStatus :: restoreContext(stream, mode);
802 StructuralMaterialStatus :: copyStateVariables(iStatus);
821 printf(
"Entering PlasticMaterialStatus :: copyAddVariables().\n");
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 beDifferenceOf(const FloatArray &a, const FloatArray &b)
void beProductOf(const FloatMatrix &aMatrix, const FloatArray &anArray)
void add(const FloatArray &src)
static FloatMatrix fromArray(const FloatArray &vector, bool transpose=false)
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 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
MaterialMode giveMaterialMode()
Returns corresponding material mode of receiver.
GaussPoint * gp
Associated integration point.
virtual MaterialStatus * giveStatus(GaussPoint *gp) const
virtual void initTempStatus(GaussPoint *gp) const
int giveStateFlag() const
FloatArray tempStrainSpaceHardeningVarsVector
const FloatArray & giveTempPlasticStrainVector() const
const FloatArray & givePlasticStrainVector() const
PlasticMaterialStatus(GaussPoint *g, int statusSize)
int state_flag
Yield function status indicator.
void letTempPlasticStrainVectorBe(FloatArray v)
FloatArray strainSpaceHardeningVarsVector
Strain space hardening variables.
void letTempPlasticConsistencyPrameterBe(double v)
FloatArray tempPlasticStrainVector
double givePlasticConsistencyPrameter() const
const FloatArray & giveStrainSpaceHardeningVars() const
const FloatArray & givetempStrainSpaceHardeningVarsVector() const
FloatArray plasticStrainVector
Plastic strain vector (reduced form).
int giveTempStateFlag() const
double giveTempPlasticConsistencyPrameter() const
void letTempStrainSpaceHardeningVarsVectorBe(FloatArray v)
double gamma
Plastic consistency parameter.
void letTempStateFlagBe(int v)
LinearElasticMaterial * linearElasticMaterial
Reference to bulk (undamaged) material.
FloatArray * ComputeGradientVector(GaussPoint *gp, FloatArray *fullStressVector, FloatArray *fullStressSpaceHardeningVars) const
virtual int giveSizeOfReducedHardeningVarsVector(GaussPoint *) const
virtual void computeHardeningReducedModuli(FloatMatrix &answer, GaussPoint *gp, FloatArray *strainSpaceHardeningVariables, TimeStep *tStep) const =0
friend class PlasticMaterialStatus
virtual void computeTrialStressIncrement(FloatArray &answer, GaussPoint *gp, const FloatArray &strainIncrement, TimeStep *tStep) const
void computeConsistentModuli(FloatMatrix &answer, GaussPoint *gp, FloatMatrix &elasticModuliInverse, FloatMatrix &hardeningModuliInverse, double Gamma, const FloatArray &fullStressVector, const FloatArray &fullStressSpaceHardeningVars) const
virtual int hasHardening() const
virtual FloatArray * ComputeStressSpaceHardeningVarsReducedGradient(GaussPoint *gp, FloatArray *stressVector, FloatArray *stressSpaceHardeningVars) const
virtual double computeYieldValueAt(GaussPoint *gp, FloatArray *stressVector, FloatArray *stressSpaceHardeningVars) const
virtual FloatArray * ComputeStressGradient(GaussPoint *gp, FloatArray *stressVector, FloatArray *stressSpaceHardeningVars) const
void computeDiagModuli(FloatMatrix &answer, GaussPoint *gp, FloatMatrix &elasticModuliInverse, FloatMatrix &hardeningModuliInverse) const
virtual void computeReducedGradientMatrix(FloatMatrix &answer, GaussPoint *gp, const FloatArray &stressVector, const FloatArray &stressSpaceHardeningVars) const =0
virtual FloatMatrix giveConsistentStiffnessMatrix(MatResponseMode, GaussPoint *gp, TimeStep *tStep) const
virtual void computeReducedElasticModuli(FloatMatrix &answer, GaussPoint *gp, TimeStep *tStep) const
FloatArray * ComputeResidualVector(GaussPoint *gp, double Gamma, FloatArray *plasticStrainVectorR, FloatArray *strainSpaceHardeningVariables, FloatArray *gradientVectorR) const
virtual FloatArray * ComputeStressSpaceHardeningVars(GaussPoint *gp, FloatArray *strainSpaceHardeningVariables) 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.