OOFEM 3.0
Loading...
Searching...
No Matches
plasticmaterial.C
Go to the documentation of this file.
1/*
2 *
3 * ##### ##### ###### ###### ### ###
4 * ## ## ## ## ## ## ## ### ##
5 * ## ## ## ## #### #### ## # ##
6 * ## ## ## ## ## ## ## ##
7 * ## ## ## ## ## ## ## ##
8 * ##### ##### ## ###### ## ##
9 *
10 *
11 * OOFEM : Object Oriented Finite Element Code
12 *
13 * Copyright (C) 1993 - 2025 Borek Patzak
14 *
15 *
16 *
17 * Czech Technical University, Faculty of Civil Engineering,
18 * Department of Structural Mechanics, 166 29 Prague, Czech Republic
19 *
20 * This library is free software; you can redistribute it and/or
21 * modify it under the terms of the GNU Lesser General Public
22 * License as published by the Free Software Foundation; either
23 * version 2.1 of the License, or (at your option) any later version.
24 *
25 * This program is distributed in the hope that it will be useful,
26 * but WITHOUT ANY WARRANTY; without even the implied warranty of
27 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
28 * Lesser General Public License for more details.
29 *
30 * You should have received a copy of the GNU Lesser General Public
31 * License along with this library; if not, write to the Free Software
32 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
33 */
34
35#include "plasticmaterial.h"
36#include "gausspoint.h"
37#include "floatmatrix.h"
38#include "floatarray.h"
39#include "intarray.h"
41#include "datastream.h"
42#include "contextioerr.h"
43
44namespace oofem {
45#define YIELD_TOL 1.e-5
46#define RES_TOL 1.e-5
47#define PLASTIC_MATERIAL_MAX_ITERATIONS 40
48
49PlasticMaterial :: PlasticMaterial(int n, Domain *d) : StructuralMaterial(n, d)
50{}
51
52
53PlasticMaterial :: ~PlasticMaterial()
54{
56}
57
58
59bool
60PlasticMaterial :: hasMaterialModeCapability(MaterialMode mode) const
61{
62 return mode == _3dMat ||
63 mode == _1dMat ||
64 //<RESTRICTED_SECTION>
65 mode == _PlaneStress ||
66 //</RESTRICTED_SECTION>
67 mode == _PlaneStrain ||
68 mode == _PlateLayer ||
69 mode == _2dBeamLayer ||
70 mode == _Fiber;
71}
72
73
74std::unique_ptr<MaterialStatus>
75PlasticMaterial :: CreateStatus(GaussPoint *gp) const
76{
77 return std::make_unique<PlasticMaterialStatus>(gp, this->giveSizeOfReducedHardeningVarsVector(gp));
78}
79
80
81void
82PlasticMaterial :: giveRealStressVector(FloatArray &answer,
83 GaussPoint *gp,
84 const FloatArray &totalStrain,
85 TimeStep *tStep) const
86//
87// returns real stress vector in 3d stress space of receiver according to
88// previous level of stress and current
89// strain increment, the only way, how to correctly update gp records
90//
91// completely formulated in Reduced stress-strain space
92{
93 FloatArray strainSpaceHardeningVariables;
94 FloatArray fullStressVector, *fullStressSpaceHardeningVars, *residualVectorR;
95 FloatArray elasticStrainVectorR;
96 FloatArray strainVectorR, plasticStrainVectorR, *gradientVectorR;
97 FloatArray helpVec, helpVec2;
98 double yieldValue, Gamma, dGamma, helpVal1, helpVal2;
99 int strSize, totSize, nIterations = 0;
100 FloatMatrix elasticModuli, hardeningModuli, consistentModuli;
101 FloatMatrix elasticModuliInverse, hardeningModuliInverse;
102 FloatMatrix helpMtrx, helpMtrx2;
103
104 PlasticMaterialStatus *status = static_cast< PlasticMaterialStatus * >( this->giveStatus(gp) );
105
106 this->initTempStatus(gp);
107
108 // subtract stress independent part
109 // note: eigenStrains (temperature) is not contained in mechanical strain stored in gp
110 // therefore it is necessary to subtract always the total eigen strain value
111 this->giveStressDependentPartOfStrainVector(strainVectorR, gp, totalStrain,
112 tStep, VM_Total);
113
114 plasticStrainVectorR = status->givePlasticStrainVector();
115 strainSpaceHardeningVariables = status->giveStrainSpaceHardeningVars();
116
117 // tady konec debugovani - strainSpaceHardeningVariables ve statusu neinicializovany
118 // to musi udelat material.
119
120 Gamma = 0.;
121 strSize = strainVectorR.giveSize(); // size of reducedStrain Vector
122 totSize = strSize + strainSpaceHardeningVariables.giveSize();
123
124 // compute elastic moduli and its inverse
125 this->computeReducedElasticModuli(elasticModuli, gp, tStep);
126 elasticModuliInverse.beInverseOf(elasticModuli);
127
128 do {
129 elasticStrainVectorR.beDifferenceOf(strainVectorR, plasticStrainVectorR);
130 // stress vector in full form due to computational convenience
131 this->computeTrialStressIncrement(fullStressVector, gp, elasticStrainVectorR, tStep);
132 fullStressSpaceHardeningVars = this->ComputeStressSpaceHardeningVars(gp, & strainSpaceHardeningVariables);
133 yieldValue = this->computeYieldValueAt(gp, & fullStressVector, fullStressSpaceHardeningVars);
134 gradientVectorR = this->ComputeGradientVector(gp, & fullStressVector, fullStressSpaceHardeningVars);
135 residualVectorR = this->ComputeResidualVector(gp, Gamma, & plasticStrainVectorR,
136 & strainSpaceHardeningVariables,
137 gradientVectorR);
138
139 // check for end of iteration
140 if ( ( yieldValue < YIELD_TOL ) && ( residualVectorR->computeNorm() < RES_TOL ) ) {
141 delete fullStressSpaceHardeningVars;
142 delete gradientVectorR;
143 delete residualVectorR;
144 break;
145 }
146
147 // compute consistent tangent moduli
148 this->computeHardeningReducedModuli(hardeningModuli, gp, & strainSpaceHardeningVariables, tStep);
149 if ( hardeningModuli.giveNumberOfRows() ) {
150 hardeningModuliInverse.beInverseOf(hardeningModuli);
151 } else {
152 hardeningModuliInverse.clear();
153 }
154
155 this->computeConsistentModuli(consistentModuli, gp, elasticModuliInverse,
156 hardeningModuliInverse, Gamma,
157 fullStressVector, * fullStressSpaceHardeningVars);
158
159 // obtain increment to consistency parameter
160 helpMtrx=FloatMatrix::fromArray(* gradientVectorR, 1);
161 helpMtrx2.beProductOf(helpMtrx, consistentModuli);
162 helpVec.beProductOf(helpMtrx2, * gradientVectorR);
163 helpVal1 = helpVec.at(1);
164 helpVec.beProductOf(helpMtrx2, * residualVectorR);
165 helpVal2 = helpVec.at(1);
166 dGamma = ( yieldValue - helpVal2 ) / helpVal1;
167
168 // obtain incremental plastic strains and internal variables
169 // we overwrite residualVectorR and gradientVectorR vectors
170 // but they are computed once again when iteration continues
171 gradientVectorR->times(dGamma);
172 residualVectorR->add(* gradientVectorR);
173 helpVec.beProductOf(consistentModuli, * residualVectorR);
174 // note elasticModuli and hardeningModuli are yet inverted
175 this->computeDiagModuli(helpMtrx, gp, elasticModuliInverse, hardeningModuliInverse);
176 helpVec2.beProductOf(helpMtrx, helpVec);
177
178 // Update state variables and consistency parameter
179 for ( int i = 1; i <= strSize; i++ ) {
180 plasticStrainVectorR.at(i) += helpVec2.at(i);
181 }
182
183 for ( int i = strSize + 1; i <= totSize; i++ ) {
184 strainSpaceHardeningVariables.at(i - strSize) += helpVec2.at(i);
185 }
186
187 Gamma += dGamma;
188
189 // increment iteration count
190 nIterations++;
191
192 // free allocated memory inside loop
193 delete fullStressSpaceHardeningVars;
194 delete gradientVectorR;
195 delete residualVectorR;
196
197 if ( nIterations > PLASTIC_MATERIAL_MAX_ITERATIONS ) {
198 OOFEM_WARNING("local equlibrium not reached in %d iterations\nElement %d, gp %d, continuing",
199 PLASTIC_MATERIAL_MAX_ITERATIONS, gp->giveElement()->giveNumber(), gp->giveNumber() );
200 break;
201 }
202 } while ( 1 );
203
204 // update temp state variables in gp and associted material status
205
206 status->letTempStrainVectorBe(totalStrain);
207 StructuralMaterial :: giveReducedSymVectorForm( helpVec, fullStressVector, gp->giveMaterialMode() );
208 status->letTempStressVectorBe(helpVec);
209 status->letTempPlasticStrainVectorBe(plasticStrainVectorR);
210 status->letTempStrainSpaceHardeningVarsVectorBe(strainSpaceHardeningVariables);
211 // update plastic consistency parameter
213
214 // update state flag
215 int newState, state = status->giveStateFlag();
216 if ( Gamma > 0. ) {
217 newState = PM_Yielding; // test if plastic loading occur
218 }
219 // no plastic loading - check for unloading
220 else if ( ( state == PM_Yielding ) || ( state == PM_Unloading ) ) {
221 newState = PM_Unloading;
222 } else {
223 newState = PM_Elastic;
224 }
225
226 status->letTempStateFlagBe(newState);
227
228 answer = status->giveTempStressVector();
229}
230
231
233PlasticMaterial :: ComputeGradientVector(GaussPoint *gp,
234 FloatArray *fullStressVector,
235 FloatArray *fullStressSpaceHardeningVars) const
236{
237 /*
238 * Computes gradient vector R in reduced form.
239 * R = {\der{\sigma}{f_{n+1}}, \der{q}{f_{n+1}}}^T
240 * Gradient vector contains partial derivatives of yield function
241 * with respect to stresses and with respect to
242 * strain space hardening variables
243 *
244 * Note: variablex with R posfix are in reduced stress-space.
245 */
246 FloatArray *stressGradient, stressGradientR;
247 FloatArray *stressSpaceHardVarGradient, *answer;
248 int isize, size;
249
250 stressGradient = this->ComputeStressGradient(gp, fullStressVector,
251 fullStressSpaceHardeningVars);
252
253 StructuralMaterial :: giveReducedSymVectorForm( stressGradientR, * stressGradient, gp->giveMaterialMode() );
254
255 stressSpaceHardVarGradient = this->ComputeStressSpaceHardeningVarsReducedGradient(gp, fullStressVector, fullStressSpaceHardeningVars);
256
257 isize = stressGradientR.giveSize();
258 if ( stressSpaceHardVarGradient ) {
259 size = isize + stressSpaceHardVarGradient->giveSize();
260 } else {
261 size = isize;
262 }
263
264 answer = new FloatArray(size);
265 for ( int i = 1; i <= isize; i++ ) {
266 answer->at(i) = stressGradientR.at(i);
267 }
268
269 for ( int i = isize + 1; i <= size; i++ ) {
270 answer->at(i) = stressSpaceHardVarGradient->at(i - isize);
271 }
272
273 delete stressSpaceHardVarGradient;
274 delete stressGradient;
275
276 return answer;
277}
278
279
281PlasticMaterial :: ComputeResidualVector(GaussPoint *gp, double Gamma,
282 FloatArray *plasticStrainVectorR,
283 FloatArray *strainSpaceHardeningVariables,
284 FloatArray *gradientVectorR) const
285{
286 /* Computes Residual vector for closes point projection algorithm */
287
288 FloatArray oldPlasticStrainVectorR, oldStrainSpaceHardeningVariables;
289 FloatArray *answer;
290 int isize, size;
291 PlasticMaterialStatus *status = static_cast< PlasticMaterialStatus * >( this->giveStatus(gp) );
292
293 isize = plasticStrainVectorR->giveSize();
294 size = gradientVectorR->giveSize();
295
296 answer = new FloatArray(size);
297 oldPlasticStrainVectorR = status->givePlasticStrainVector();
298 oldStrainSpaceHardeningVariables = status->giveStrainSpaceHardeningVars();
299
300 for ( int i = 1; i <= isize; i++ ) {
301 answer->at(i) = oldPlasticStrainVectorR.at(i) - plasticStrainVectorR->at(i) + Gamma *gradientVectorR->at(i);
302 }
303
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);
306 }
307
308 return answer;
309}
310
311
312void
313PlasticMaterial :: computeTrialStressIncrement(FloatArray &answer, GaussPoint *gp,
314 const FloatArray &elasticStrainVectorR,
315 TimeStep *tStep) const
316{
317 /* Computes the full trial elastic stress vector */
318
319 OOFEM_ERROR("Unable to compute trial stress increment");
320}
321
322
323void
324PlasticMaterial :: computeConsistentModuli(FloatMatrix &answer,
325 GaussPoint *gp,
326 FloatMatrix &elasticModuliInverse,
327 FloatMatrix &hardeningModuliInverse,
328 double Gamma,
329 const FloatArray &fullStressVector,
330 const FloatArray &fullStressSpaceHardeningVars) const
331{
332 /* returns consistent moduli in reduced form.
333 * Note: elasticModuli and hardeningModuli will be inverted
334 *
335 * stressVector in full form
336 */
337 FloatMatrix gradientMatrix;
338 FloatMatrix helpInverse;
339 int isize, size;
340
341 isize = elasticModuliInverse.giveNumberOfRows();
342 if ( this->hasHardening() ) {
343 size = isize + hardeningModuliInverse.giveNumberOfRows();
344 } else {
345 size = isize;
346 }
347
348 // ask gradientMatrix
349 this->computeReducedGradientMatrix(gradientMatrix, gp, fullStressVector,
350 fullStressSpaceHardeningVars);
351
352 // assemble consistent moduli
353 helpInverse.resize(size, size);
354
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);
358 }
359
360 for ( int j = isize + 1; j <= size; j++ ) {
361 helpInverse.at(i, j) = Gamma * gradientMatrix.at(i, j);
362 }
363 }
364
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);
368 }
369
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);
372 }
373 }
374
375 answer.beInverseOf(helpInverse);
376}
377
378// ----------------------------------------------------------------------------//
379
381PlasticMaterial :: giveConsistentStiffnessMatrix(MatResponseMode mode,
382 GaussPoint *gp,
383 TimeStep *tStep) const
384{
385 //
386 // returns receiver material matrix for given reached state
387 // described by temp variables.
388 //
389
390 FloatMatrix consistentModuli, elasticModuli, hardeningModuli;
391 FloatMatrix elasticModuliInverse, hardeningModuliInverse;
392 FloatMatrix consistentSubModuli, answerR;
393 FloatArray *gradientVector, stressVector, fullStressVector;
394 FloatArray *stressSpaceHardeningVars;
395 FloatArray strainSpaceHardeningVariables, helpVector;
396 double s, Gamma;
397 int sizeR;
398 PlasticMaterialStatus *status = static_cast< PlasticMaterialStatus * >( this->giveStatus(gp) );
399
400 // ask for plastic consistency parameter
401 Gamma = status->giveTempPlasticConsistencyPrameter();
402
403 // check for elastic cases
404 if ( ( status->giveTempStateFlag() == PM_Elastic ) || ( status->giveTempStateFlag() == PM_Unloading ) ) {
405 this->computeReducedElasticModuli(elasticModuli, gp, tStep);
406 return elasticModuli;
407 }
408
409 //
410 // plastic case
411 //
412 // compute elastic moduli and its inverse
413 this->computeReducedElasticModuli(elasticModuli, gp, tStep);
414 elasticModuliInverse.beInverseOf(elasticModuli);
415 sizeR = elasticModuliInverse.giveNumberOfRows();
416
417 // compute hardening moduli and its inverse
418 this->computeHardeningReducedModuli(hardeningModuli, gp, & strainSpaceHardeningVariables, tStep);
419 if ( hardeningModuli.giveNumberOfRows() ) {
420 hardeningModuliInverse.beInverseOf(hardeningModuli);
421 } else {
422 hardeningModuliInverse.clear();
423 }
424
425 stressVector = status->giveStressVector();
426 StructuralMaterial :: giveFullSymVectorForm( fullStressVector, stressVector, gp->giveMaterialMode() );
427 strainSpaceHardeningVariables = status->giveStrainSpaceHardeningVars();
428 stressSpaceHardeningVars = this->ComputeStressSpaceHardeningVars(gp, & strainSpaceHardeningVariables);
429
430 this->computeConsistentModuli(consistentModuli, gp,
431 elasticModuliInverse,
432 hardeningModuliInverse,
433 Gamma,
434 fullStressVector,
435 * stressSpaceHardeningVars);
436
437 gradientVector = this->ComputeGradientVector(gp, & fullStressVector, stressSpaceHardeningVars);
438 helpVector.beProductOf(consistentModuli, * gradientVector);
439 s = ( -1. ) * gradientVector->dotProduct(helpVector);
440
441 answerR.beSubMatrixOf(consistentModuli, 1, sizeR, 1, sizeR);
442 //consistentSubModuli.beSubMatrixOf (consistentModuli, 1,gradientVector->giveSize(), 1, sizeR);
443 consistentSubModuli.beSubMatrixOf( consistentModuli, 1, sizeR, 1, gradientVector->giveSize() );
444 helpVector.beProductOf(consistentSubModuli, * gradientVector);
445
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);
449 }
450 }
451
452 delete gradientVector;
453 delete stressSpaceHardeningVars;
454
455 return answerR;
456}
457
458void
459PlasticMaterial :: computeDiagModuli(FloatMatrix &answer,
460 GaussPoint *gp, FloatMatrix &elasticModuliInverse,
461 FloatMatrix &hardeningModuliInverse) const
462{
463 //
464 // assembles diagonal moduli from elasticModuliInverse and hardeningModuliInverse
465 //
466 int size1, size2;
467
468 size1 = elasticModuliInverse.giveNumberOfRows();
469 if ( hardeningModuliInverse.giveNumberOfRows() ) {
470 size2 = size1 + hardeningModuliInverse.giveNumberOfRows();
471 } else {
472 size2 = size1;
473 }
474
475 answer.resize(size2, size2);
476 answer.zero();
477
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);
481 }
482 }
483
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);
487 }
488 }
489}
490
491
492void
493PlasticMaterial :: computeReducedElasticModuli(FloatMatrix &answer,
494 GaussPoint *gp,
495 TimeStep *tStep) const
496{ /* Returns elastic moduli in reduced stress-strain space*/
497 this->linearElasticMaterial->giveStiffnessMatrix(answer, ElasticStiffness, gp, tStep);
498}
499
500
501// overloaded from structural material
502
504PlasticMaterial :: give3dMaterialStiffnessMatrix(MatResponseMode mode,
505 GaussPoint *gp,
506 TimeStep *tStep) const
507//
508//
509//
510// computes full 3d constitutive matrix for case of 3d stress-strain state.
511// it returns elasto-plastic stiffness material matrix.
512// if strainIncrement == NULL a loading is assumed
513// for detailed description see (W.F.Chen: Plasticity in Reinforced Concrete, McGraw-Hill, 1982,
514// chapter 6.)
515//
516// if derived material would like to implement failure behaviour
517// it must redefine basic Give3dMaterialStiffnessMatrix function
518// in order to take possible failure (tension cracking) into account
519//
520//
521//
522{
523 // we can force 3d response, and we obtain correct 3d tangent matrix,
524 // but in fact, stress integration algorithm will not work
525 // because in stress integration algorithm we are unable to recognize
526 // which reduction from 3d case should be performed to obtain correct result.
527 // so for new stressStrain state, instead of programming 3d reduction,
528 // you should enhance imposeConstraints functions for ne state, and
529 // then programming simple inteface function for you stressstrain state
530 // calling GiveMaterailStiffenssMatrix, which imposes constrains correctly.
531 if ( mode == ElasticStiffness ) {
532 return this->linearElasticMaterial->give3dMaterialStiffnessMatrix(mode, gp, tStep);
533 } else {
534 return this->giveConsistentStiffnessMatrix(mode, gp, tStep);
535 }
536}
537
538
540PlasticMaterial :: givePlaneStressStiffMtrx(MatResponseMode mode,
541 GaussPoint *gp,
542 TimeStep *tStep) const
543//
544// returns receiver's 2dPlaneStressMtrx
545// (2dPlaneStres ==> sigma_z = tau_xz = tau_yz = 0.)
546//
547// standard method from Material Class overloaded, because no inversion is needed.
548// the reduction from 3d case will not work
549// this implementation should be faster.
550{
551 if ( mode == ElasticStiffness ) {
552 return this->linearElasticMaterial->givePlaneStressStiffMtrx(mode, gp, tStep);
553 } else {
554 return this->giveConsistentStiffnessMatrix(mode, gp, tStep);
555 }
556}
557
558
560PlasticMaterial :: givePlaneStrainStiffMtrx(MatResponseMode mode,
561 GaussPoint *gp,
562 TimeStep *tStep) const
563
564//
565// return receiver's 2dPlaneStrainMtrx constructed from
566// general 3dMatrialStiffnessMatrix
567// (2dPlaneStrain ==> eps_z = gamma_xz = gamma_yz = 0.)
568//
569{
570 if ( mode == ElasticStiffness ) {
571 return this->linearElasticMaterial->givePlaneStrainStiffMtrx(mode, gp, tStep);
572 } else {
573 return this->giveConsistentStiffnessMatrix(mode, gp, tStep);
574 }
575}
576
577
579PlasticMaterial :: give1dStressStiffMtrx(MatResponseMode mode,
580 GaussPoint *gp,
581 TimeStep *tStep) const
582
583//
584// returns receiver's 1dMaterialStiffnessMAtrix
585// (1d case ==> sigma_y = sigma_z = tau_yz = tau_zx = tau_xy = 0.)
586{
587 if ( mode == ElasticStiffness ) {
588 return this->linearElasticMaterial->give1dStressStiffMtrx(mode, gp, tStep);
589 } else {
590 return this->giveConsistentStiffnessMatrix(mode, gp, tStep);
591 }
592}
593
594
596PlasticMaterial :: give2dBeamLayerStiffMtrx(MatResponseMode mode,
597 GaussPoint *gp,
598 TimeStep *tStep) const
599//
600// returns receiver's 2dBeamLayerStiffMtrx.
601// (2dPlaneStres ==> sigma_z = tau_xz = tau_yz = 0.)
602//
603// standard method from Material Class overloaded, because no inversion is needed.
604// the reduction from 3d case will not work
605// this implementation should be faster.
606{
607 if ( mode == ElasticStiffness ) {
608 return this->linearElasticMaterial->give2dBeamLayerStiffMtrx(mode, gp, tStep);
609 } else {
610 return this->giveConsistentStiffnessMatrix(mode, gp, tStep);
611 }
612}
613
614
616PlasticMaterial :: givePlateLayerStiffMtrx(MatResponseMode mode,
617 GaussPoint *gp,
618 TimeStep *tStep) const
619//
620// returns receiver's 2dPlateLayerMtrx
621// (2dPlaneStres ==> sigma_z = tau_xz = tau_yz = 0.)
622//
623// standard method from Material Class overloaded, because no inversion is needed.
624// the reduction from 3d case will not work
625// this implementation should be faster.
626{
627 if ( mode == ElasticStiffness ) {
628 return this->linearElasticMaterial->givePlateLayerStiffMtrx(mode, gp, tStep);
629 } else {
630 return this->giveConsistentStiffnessMatrix(mode, gp, tStep);
631 }
632}
633
634
636PlasticMaterial :: giveFiberStiffMtrx(MatResponseMode mode,
637 GaussPoint *gp,
638 TimeStep *tStep) const
639//
640// returns receiver's Fiber
641// (1dFiber ==> sigma_y = sigma_z = tau_yz = 0.)
642//
643// standard method from Material Class overloaded, because no inversion is needed.
644// the reduction from 3d case will not work
645// this implementation should be faster.
646{
647 if ( mode == ElasticStiffness ) {
648 return this->linearElasticMaterial->giveFiberStiffMtrx(mode, gp, tStep);
649 } else {
650 return this->giveConsistentStiffnessMatrix(mode, gp, tStep);
651 }
652}
653
654
655int
656PlasticMaterial :: giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep)
657{
658 PlasticMaterialStatus *status = static_cast< PlasticMaterialStatus * >( this->giveStatus(gp) );
659 if ( type == IST_PlasticStrainTensor ) {
660 const FloatArray ep = status->givePlasticStrainVector();
662 StructuralMaterial :: giveFullSymVectorForm( answer, ep, gp->giveMaterialMode() );
663 return 1;
664 } else if ( type == IST_PrincipalPlasticStrainTensor ) {
665 FloatArray st(6);
666 const FloatArray &s = status->givePlasticStrainVector();
667
669 StructuralMaterial :: giveFullSymVectorForm( st, s, gp->giveMaterialMode() );
670
671 this->computePrincipalValues(answer, st, principal_strain);
672 return 1;
673 } else {
674 return StructuralMaterial :: giveIPValue(answer, gp, type, tStep);
675 }
676}
677
678
679PlasticMaterialStatus :: PlasticMaterialStatus(GaussPoint *g, int statusSize) :
682{}
683
684
685void
686PlasticMaterialStatus :: printOutputAt(FILE *file, TimeStep *tStep) const
687{
688 StructuralMaterialStatus :: printOutputAt(file, tStep);
689 fprintf(file, "status { ");
690 if ( ( state_flag == PM_Yielding ) || ( state_flag == PM_Unloading ) ) {
691 if ( state_flag == PM_Yielding ) {
692 fprintf(file, " Yielding, ");
693 } else {
694 fprintf(file, " Unloading, ");
695 }
696
697 fprintf(file, " plastic strains ");
698 for ( auto &val : plasticStrainVector ) {
699 fprintf( file, " %.4e", val );
700 }
701
702 if ( strainSpaceHardeningVarsVector.giveSize() ) {
703 fprintf(file, ", strain space hardening vars ");
704 for ( auto &val : strainSpaceHardeningVarsVector ) {
705 fprintf( file, " %.4e", val );
706 }
707 }
708 }
709
710 fprintf(file, "}\n");
711}
712
713
714void PlasticMaterialStatus :: initTempStatus()
715//
716// initializes temp variables according to variables form previous equlibrium state.
717//
718{
719 StructuralMaterialStatus :: initTempStatus();
720
721 if ( plasticStrainVector.giveSize() == 0 ) {
722 plasticStrainVector.resize( StructuralMaterial :: giveSizeOfVoigtSymVector( gp->giveMaterialMode() ) );
723 plasticStrainVector.zero();
724 }
725
727
729
732}
733
734
735void
736PlasticMaterialStatus :: updateYourself(TimeStep *tStep)
737//
738// updates variables (nonTemp variables describing situation at previous equilibrium state)
739// after a new equilibrium state has been reached
740// temporary variables are having values corresponding to newly reched equilibrium.
741//
742{
743 StructuralMaterialStatus :: updateYourself(tStep);
744
747
750}
751
752
753void
754PlasticMaterialStatus :: saveContext(DataStream &stream, ContextMode mode)
755{
756 StructuralMaterialStatus :: saveContext(stream, mode);
757
759 if ( ( iores = plasticStrainVector.storeYourself(stream) ) != CIO_OK ) {
760 THROW_CIOERR(iores);
761 }
762
763 if ( ( iores = strainSpaceHardeningVarsVector.storeYourself(stream) ) != CIO_OK ) {
764 THROW_CIOERR(iores);
765 }
766
767 if ( !stream.write(state_flag) ) {
769 }
770
771 if ( !stream.write(gamma) ) {
773 }
774}
775
776
777void
778PlasticMaterialStatus :: restoreContext(DataStream &stream, ContextMode mode)
779{
780 StructuralMaterialStatus :: restoreContext(stream, mode);
781
783 if ( ( iores = plasticStrainVector.restoreYourself(stream) ) != CIO_OK ) {
784 THROW_CIOERR(iores);
785 }
786
787 if ( ( iores = strainSpaceHardeningVarsVector.restoreYourself(stream) ) != CIO_OK ) {
788 THROW_CIOERR(iores);
789 }
790
791 if ( !stream.read(state_flag) ) {
793 }
794
795 if ( !stream.read(gamma) ) {
797 }
798}
799
800void PlasticMaterialStatus :: copyStateVariables(const MaterialStatus &iStatus)
801{
802 StructuralMaterialStatus :: copyStateVariables(iStatus);
803
804 const PlasticMaterialStatus &plastStatus = static_cast< const PlasticMaterialStatus & >(iStatus);
805
808
811
812 state_flag = plastStatus.giveStateFlag();
813 temp_state_flag = plastStatus.giveTempStateFlag();
814
817}
818
819void PlasticMaterialStatus :: addStateVariables(const MaterialStatus &iStatus)
820{
821 printf("Entering PlasticMaterialStatus :: copyAddVariables().\n");
822}
823
824} // end namespace oofem
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
Definition floatarray.C:861
double & at(Index i)
Definition floatarray.h:202
double dotProduct(const FloatArray &x) const
Definition floatarray.C:524
Index giveSize() const
Returns the size of receiver.
Definition floatarray.h:261
void beDifferenceOf(const FloatArray &a, const FloatArray &b)
Definition floatarray.C:403
void beProductOf(const FloatMatrix &aMatrix, const FloatArray &anArray)
Definition floatarray.C:689
void add(const FloatArray &src)
Definition floatarray.C:218
void times(double s)
Definition floatarray.C:834
static FloatMatrix fromArray(const FloatArray &vector, bool transpose=false)
void resize(Index rows, Index cols)
Definition floatmatrix.C:79
*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.
Definition gausspoint.h:190
GaussPoint * gp
Associated integration point.
virtual MaterialStatus * giveStatus(GaussPoint *gp) const
Definition material.C:206
virtual void initTempStatus(GaussPoint *gp) const
Definition material.C:221
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)
double givePlasticConsistencyPrameter() const
const FloatArray & giveStrainSpaceHardeningVars() const
const FloatArray & givetempStrainSpaceHardeningVarsVector() const
FloatArray plasticStrainVector
Plastic strain vector (reduced form).
double giveTempPlasticConsistencyPrameter() const
void letTempStrainSpaceHardeningVarsVectorBe(FloatArray v)
double gamma
Plastic consistency parameter.
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 THROW_CIOERR(e)
#define OOFEM_WARNING(...)
Definition error.h:80
#define OOFEM_ERROR(...)
Definition error.h:79
#define RES_TOL
#define YIELD_TOL
#define PLASTIC_MATERIAL_MAX_ITERATIONS
long ContextMode
Definition contextmode.h:43
@ principal_strain
For computing principal strains from engineering strains.
@ CIO_IOERR
General IO error.

This page is part of the OOFEM-3.0 documentation. Copyright Copyright (C) 1994-2025 Borek Patzak Bořek Patzák
Project e-mail: oofem@fsv.cvut.cz
Generated at for OOFEM by doxygen 1.15.0 written by Dimitri van Heesch, © 1997-2011