OOFEM  2.4
OOFEM.org - Object Oriented Finite Element Solver
misesmat.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 - 2013 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 "misesmat.h"
37 #include "gausspoint.h"
38 #include "floatmatrix.h"
39 #include "floatarray.h"
40 #include "function.h"
41 #include "intarray.h"
42 #include "mathfem.h"
43 #include "contextioerr.h"
44 #include "datastream.h"
45 #include "classfactory.h"
46 #include "fieldmanager.h"
47 #include "../sm/Elements/structuralelement.h"
48 #include "engngm.h"
49 
50 namespace oofem {
51 REGISTER_Material(MisesMat);
52 
53 // constructor
55 {
57  H = 0.;
58  //sig0 = 0.;
59  G = 0.;
60  K = 0.;
61 }
62 
63 // destructor
65 {
66  delete linearElasticMaterial;
67 }
68 
69 // reads the model parameters from the input file
72 {
73  IRResultType result; // required by IR_GIVE_FIELD macro
74 
76  if ( result != IRRT_OK ) return result;
77 
78  result = linearElasticMaterial->initializeFrom(ir); // takes care of elastic constants
79  if ( result != IRRT_OK ) return result;
80 
81  G = static_cast< IsotropicLinearElasticMaterial * >(linearElasticMaterial)->giveShearModulus();
82  K = static_cast< IsotropicLinearElasticMaterial * >(linearElasticMaterial)->giveBulkModulus();
83 
84  IR_GIVE_FIELD(ir, sig0, _IFT_MisesMat_sig0); // uniaxial yield stress
85 
86  H = 0.;
87  IR_GIVE_OPTIONAL_FIELD(ir, H, _IFT_MisesMat_h); // hardening modulus
88  /*********************************************************************************************************/
89  omega_crit = 0;
91 
92  a = 0;
93  IR_GIVE_OPTIONAL_FIELD(ir, a, _IFT_MisesMat_a); // exponent in damage law
94  /********************************************************************************************************/
95 
96  return IRRT_OK;
97 }
98 
99 // creates a new material status corresponding to this class
102 {
103  return new MisesMatStatus(1, this->giveDomain(), gp);
104 }
105 
106 void
108  GaussPoint *gp,
109  const FloatArray &totalStrain,
110  TimeStep *tStep)
111 {
113 #if 1
114  MisesMatStatus *status = static_cast< MisesMatStatus * >( this->giveStatus(gp) );
115  FloatArray strainR;
116 
117  // subtract stress independent part
118  this->giveStressDependentPartOfStrainVector(strainR, gp, totalStrain,
119  tStep, VM_Total);
120  this->performPlasticityReturn(gp, strainR, tStep);
121  double omega = computeDamage(gp, tStep);
122  answer = status->giveTempEffectiveStress();
123  answer.times(1 - omega);
124 
125  // Compute the other components of the strain:
127  double E = lmat->give('E', gp), nu = lmat->give('n', gp);
128 
129  FloatArray strain = status->getTempPlasticStrain();
130  strain[0] = totalStrain[0];
131  strain[1] -= nu / E * status->giveTempEffectiveStress()[0];
132  strain[2] -= nu / E * status->giveTempEffectiveStress()[0];
133 
134  status->letTempStrainVectorBe(strain);
135  status->setTempDamage(omega);
136  status->letTempStressVectorBe(answer);
137 #else
138  StructuralMaterial :: giveRealStressVector_1d(answer, gp, totalStrain, tStep);
139 #endif
140 }
141 
142 void
144  GaussPoint *gp,
145  const FloatArray &totalStrain,
146  TimeStep *tStep)
147 {
148  MisesMatStatus *status = static_cast< MisesMatStatus * >( this->giveStatus(gp) );
149  // subtract stress independent part
150  FloatArray strainR(6);
151  this->giveStressDependentPartOfStrainVector(strainR, gp, totalStrain,
152  tStep, VM_Total);
153 
154  this->performPlasticityReturn(gp, strainR, tStep);
155  double omega = computeDamage(gp, tStep);
156  answer = status->giveTempEffectiveStress();
157  answer.times(1 - omega);
158  status->setTempDamage(omega);
159  status->letTempStrainVectorBe(totalStrain);
160  status->letTempStressVectorBe(answer);
161 }
162 
163 
164 void
166  GaussPoint *gp,
167  const FloatArray &totalDefGradOOFEM,
168  TimeStep *tStep)
169 {
170  MisesMatStatus *status = static_cast< MisesMatStatus * >( this->giveStatus(gp) );
171 
172  double kappa, dKappa, yieldValue, mi;
173  FloatMatrix F, oldF, invOldF;
174  FloatArray s;
175  F.beMatrixForm(totalDefGradOOFEM); //(method assumes full 3D)
176 
177  kappa = status->giveCumulativePlasticStrain();
178  oldF.beMatrixForm( status->giveFVector() );
179  invOldF.beInverseOf(oldF);
180  //relative deformation radient
181  FloatMatrix f;
182  f.beProductOf(F, invOldF);
183  //compute elastic predictor
184  FloatMatrix trialLeftCauchyGreen, help;
185 
186  f.times( 1./cbrt(f.giveDeterminant()) );
187 
188  help.beProductOf(f, status->giveTempLeftCauchyGreen());
189  trialLeftCauchyGreen.beProductTOf(help, f);
190  FloatMatrix E;
191  E.beTProductOf(F, F);
192  E.at(1, 1) -= 1.0;
193  E.at(2, 2) -= 1.0;
194  E.at(3, 3) -= 1.0;
195  E.times(0.5);
196 
197  FloatArray e;
199 
200  FloatArray leftCauchyGreen;
201  FloatArray leftCauchyGreenDev;
202  double leftCauchyGreenVol;
203 
204  leftCauchyGreen.beSymVectorFormOfStrain(trialLeftCauchyGreen);
205 
206  leftCauchyGreenVol = computeDeviatoricVolumetricSplit(leftCauchyGreenDev, leftCauchyGreen);
207  FloatArray trialStressDev;
208  applyDeviatoricElasticStiffness(trialStressDev, leftCauchyGreenDev, G / 2.);
209  s = trialStressDev;
210 
211  //check for plastic loading
212  double trialS = computeStressNorm(trialStressDev);
213  double sigmaY = this->give('s', gp, tStep) + H * kappa;
214  //yieldValue = sqrt(3./2.)*trialS-sigmaY;
215  yieldValue = trialS - sqrt(2. / 3.) * sigmaY;
216 
217 
218  //store deviatoric trial stress(reused by algorithmic stiffness)
219  status->letTrialStressDevBe(trialStressDev);
220  //the return-mapping algorithm
221  double J = F.giveDeterminant();
222  mi = leftCauchyGreenVol * G;
223  if ( yieldValue > 0 ) {
224  //dKappa =sqrt(3./2.)* yieldValue/(H + 3.*mi);
225  //kappa = kappa + dKappa;
226  //trialStressDev.times(1-sqrt(6.)*mi*dKappa/trialS);
227  dKappa = ( yieldValue / ( 2 * mi ) ) / ( 1 + H / ( 3 * mi ) );
228  FloatArray n = trialStressDev;
229  n.times(2 * mi * dKappa / trialS);
231  s.beDifferenceOf(trialStressDev, n);
232  kappa += sqrt(2. / 3.) * dKappa;
233 
234 
235  //update of intermediate configuration
236  trialLeftCauchyGreen.beMatrixForm(s);
237  trialLeftCauchyGreen.times(1.0 / G);
238  trialLeftCauchyGreen.at(1, 1) += leftCauchyGreenVol;
239  trialLeftCauchyGreen.at(2, 2) += leftCauchyGreenVol;
240  trialLeftCauchyGreen.at(2, 2) += leftCauchyGreenVol;
241  trialLeftCauchyGreen.times(J * J);
242  }
243 
244  //addition of the elastic mean stress
245  FloatMatrix kirchhoffStress;
246  kirchhoffStress.beMatrixForm(s);
247  kirchhoffStress.at(1, 1) += 1. / 2. * K * ( J * J - 1 );
248  kirchhoffStress.at(2, 2) += 1. / 2. * K * ( J * J - 1 );
249  kirchhoffStress.at(3, 3) += 1. / 2. * K * ( J * J - 1 );
250 
251 
252  FloatMatrix iF, Ep(3, 3), S;
253  FloatArray vF, vS, ep;
254 
255  //transform Kirchhoff stress into Second Piola - Kirchhoff stress
256  iF.beInverseOf(F);
257  help.beProductOf(iF, kirchhoffStress);
258  S.beProductTOf(help, iF);
259 
260  this->computeGLPlasticStrain(F, Ep, trialLeftCauchyGreen, J);
261 
263  vS.beSymVectorForm(S);
264  vF.beVectorForm(F);
265  answer.beVectorForm(kirchhoffStress);
266 
267  status->setTrialStressVol(mi);
268  status->letTempLeftCauchyGreenBe(trialLeftCauchyGreen);
269  status->setTempCumulativePlasticStrain(kappa);
270  status->letTempStressVectorBe(answer);
271  status->letTempStrainVectorBe(e);
272  status->letTempPlasticStrainBe(ep);
273  status->letTempPVectorBe(answer);
274  status->letTempFVectorBe(vF);
275 }
276 
277 
278 void
280 {
281  FloatMatrix I, invB, help;
282  I.resize(3, 3);
283  I.beUnitMatrix();
284  invB.beInverseOf(b);
285  help.beTProductOf(F, invB);
286  Ep.beProductOf(help, F);
287  Ep.times( pow(J, -2. / 3.) );
288  Ep.subtract(I);
289  Ep.times(1. / 2.);
290 }
291 
292 
293 void
295 {
296  MisesMatStatus *status = static_cast< MisesMatStatus * >( this->giveStatus(gp) );
297  double kappa;
298  FloatArray plStrain;
299  FloatArray fullStress;
300  // get the initial plastic strain and initial kappa from the status
301  plStrain = status->givePlasticStrain();
302  kappa = status->giveCumulativePlasticStrain();
303 
304  // === radial return algorithm ===
305  if ( totalStrain.giveSize() == 1 ) {
307  double E = lmat->give('E', gp);
308  /*trial stress*/
309  fullStress.resize(6);
310  fullStress.at(1) = E * ( totalStrain.at(1) - plStrain.at(1) );
311  double trialS = fabs(fullStress.at(1));
312  /*yield function*/
313  double yieldValue = trialS - (this->give('s', gp, tStep) + H * kappa);
314  // === radial return algorithm ===
315  if ( yieldValue > 0 ) {
316  double dKappa = yieldValue / ( H + E );
317  kappa += dKappa;
318  plStrain.at(1) += dKappa * signum( fullStress.at(1) );
319  plStrain.at(2) -= 0.5 * dKappa * signum( fullStress.at(1) );
320  plStrain.at(3) -= 0.5 * dKappa * signum( fullStress.at(1) );
321  fullStress.at(1) -= dKappa * E * signum( fullStress.at(1) );
322  }
323  } else {
324  // elastic predictor
325  FloatArray elStrain = totalStrain;
326  elStrain.subtract(plStrain);
327  FloatArray elStrainDev;
328  double elStrainVol;
329  elStrainVol = computeDeviatoricVolumetricSplit(elStrainDev, elStrain);
330  FloatArray trialStressDev;
331  applyDeviatoricElasticStiffness(trialStressDev, elStrainDev, G);
332  /**************************************************************/
333  double trialStressVol = 3 * K * elStrainVol;
334  /**************************************************************/
335 
336  // store the deviatoric and trial stress (reused by algorithmic stiffness)
337  status->letTrialStressDevBe(trialStressDev);
338  status->setTrialStressVol(trialStressVol);
339  // check the yield condition at the trial state
340  double trialS = computeStressNorm(trialStressDev);
341  double yieldValue = sqrt(3./2.) * trialS - (this->give('s', gp, tStep) + H * kappa);
342  if ( yieldValue > 0. ) {
343  // increment of cumulative plastic strain
344  double dKappa = yieldValue / ( H + 3. * G );
345  kappa += dKappa;
346  FloatArray dPlStrain;
347  // the following line is equivalent to multiplication by scaling matrix P
348  applyDeviatoricElasticCompliance(dPlStrain, trialStressDev, 0.5);
349  // increment of plastic strain
350  plStrain.add(sqrt(3. / 2.) * dKappa / trialS, dPlStrain);
351  // scaling of deviatoric trial stress
352  trialStressDev.times(1. - sqrt(6.) * G * dKappa / trialS);
353  }
354 
355  // assemble the stress from the elastically computed volumetric part
356  // and scaled deviatoric part
357 
358  computeDeviatoricVolumetricSum(fullStress, trialStressDev, trialStressVol);
359  }
360 
361  // store the effective stress in status
362  status->letTempEffectiveStressBe(fullStress);
363  // store the plastic strain and cumulative plastic strain
364  status->letTempPlasticStrainBe(plStrain);
365  status->setTempCumulativePlasticStrain(kappa);
366 }
367 
368 double
370 {
371  if ( tempKappa > 0. ) {
372  return omega_crit * ( 1.0 - exp(-a * tempKappa) );
373  } else {
374  return 0.;
375  }
376 }
377 
378 double
380 {
381  if ( tempKappa >= 0. ) {
382  return omega_crit * a * exp(-a * tempKappa);
383  } else {
384  return 0.;
385  }
386 }
387 
388 
389 
390 double
392 {
393  double tempKappa, dam;
394  MisesMatStatus *status = static_cast< MisesMatStatus * >( this->giveStatus(gp) );
395  dam = status->giveDamage();
396  computeCumPlastStrain(tempKappa, gp, tStep);
397  double tempDam = computeDamageParam(tempKappa);
398  if ( dam > tempDam ) {
399  tempDam = dam;
400  }
401 
402  return tempDam;
403 }
404 
405 
406 void MisesMat :: computeCumPlastStrain(double &tempKappa, GaussPoint *gp, TimeStep *tStep)
407 {
408  MisesMatStatus *status = static_cast< MisesMatStatus * >( this->giveStatus(gp) );
409  tempKappa = status->giveTempCumulativePlasticStrain();
410 }
411 
412 
413 void
415 {
417  FloatMatrix dSdE;
418  this->give3dLSMaterialStiffnessMatrix(dSdE, mode, gp, tStep);
419  this->give_dPdF_from(dSdE, answer, gp);
420 }
421 
422 // returns the consistent (algorithmic) tangent stiffness matrix
423 void
425  MatResponseMode mode,
426  GaussPoint *gp,
427  TimeStep *tStep)
428 {
429  // start from the elastic stiffness
430  this->giveLinearElasticMaterial()->give3dMaterialStiffnessMatrix(answer, mode, gp, tStep);
431  if ( mode != TangentStiffness ) {
432  return;
433  }
434 
435  MisesMatStatus *status = static_cast< MisesMatStatus * >( this->giveStatus(gp) );
436  double kappa = status->giveCumulativePlasticStrain();
437  double tempKappa = status->giveTempCumulativePlasticStrain();
438  // increment of cumulative plastic strain as an indicator of plastic loading
439  double dKappa = tempKappa - kappa;
440 
441  if ( dKappa <= 0.0 ) { // elastic loading - elastic stiffness plays the role of tangent stiffness
442  return;
443  }
444 
445  // === plastic loading ===
446 
447  // yield stress at the beginning of the step
448  double sigmaY = this->give('s', gp, tStep) + H * kappa;
449 
450  // trial deviatoric stress and its norm
451  const FloatArray &trialStressDev = status->giveTrialStressDev();
452  //double trialStressVol = status->giveTrialStressVol();
453  double trialS = computeStressNorm(trialStressDev);
454 
455  // one correction term
456  FloatMatrix stiffnessCorrection;
457  stiffnessCorrection.beDyadicProductOf(trialStressDev, trialStressDev);
458  double factor = -2. * sqrt(6.) * G * G / trialS;
459  double factor1 = factor * sigmaY / ( ( H + 3. * G ) * trialS * trialS );
460  answer.add(factor1, stiffnessCorrection);
461 
462  // another correction term
463  stiffnessCorrection.bePinvID();
464  double factor2 = factor * dKappa;
465  answer.add(factor2, stiffnessCorrection);
466 
467  //influence of damage
468  // double omega = computeDamageParam(tempKappa);
469  double omega = status->giveTempDamage();
470  answer.times(1. - omega);
471  const FloatArray &effStress = status->giveTempEffectiveStress();
472  double omegaPrime = computeDamageParamPrime(tempKappa);
473  double scalar = -omegaPrime *sqrt(6.) * G / ( 3. * G + H ) / trialS;
474  stiffnessCorrection.beDyadicProductOf(effStress, trialStressDev);
475  stiffnessCorrection.times(scalar);
476  answer.add(stiffnessCorrection);
477 }
478 
479 void
481  MatResponseMode mode,
482  GaussPoint *gp,
483  TimeStep *tStep)
484 {
485  this->giveLinearElasticMaterial()->give1dStressStiffMtrx(answer, mode, gp, tStep);
486  MisesMatStatus *status = static_cast< MisesMatStatus * >( this->giveStatus(gp) );
487  double kappa = status->giveCumulativePlasticStrain();
488  // increment of cumulative plastic strain as an indicator of plastic loading
489  double tempKappa = status->giveTempCumulativePlasticStrain();
490  double omega = status->giveTempDamage();
491  double E = answer.at(1, 1);
492  if ( mode != TangentStiffness ) {
493  return;
494  }
495 
496 
497  if ( tempKappa <= kappa ) { // elastic loading - elastic stiffness plays the role of tangent stiffness
498  answer.times(1 - omega);
499  return;
500  }
501 
502 
503  // === plastic loading ===
504  const FloatArray &stressVector = status->giveTempEffectiveStress();
505  double stress = stressVector.at(1);
506  answer.resize(1, 1);
507  answer.at(1, 1) = ( 1 - omega ) * E * H / ( E + H ) - computeDamageParamPrime(tempKappa) * E / ( E + H ) * stress * signum(stress);
508 }
509 
510 void
512 {
513  MisesMatStatus *status = static_cast< MisesMatStatus * >( this->giveStatus(gp) );
514  // start from the elastic stiffness
515 
516  FloatMatrix I(6, 6);
517  I.at(1, 1) = I.at(2, 2) = I.at(3, 3) = 1;
518  I.at(4, 4) = I.at(5, 5) = I.at(6, 6) = 0.5;
519  FloatArray delta(6);
520  delta.at(1) = delta.at(2) = delta.at(3) = 1;
521 
522  FloatMatrix F;
523  F.beMatrixForm( status->giveTempFVector() );
524  double J = F.giveDeterminant();
525 
526  const FloatArray &trialStressDev = status->giveTrialStressDev();
527  double trialStressVol = status->giveTrialStressVol();
528  double trialS = computeStressNorm(trialStressDev);
529  FloatArray n = trialStressDev;
530  if ( trialS == 0 ) {
531  n.resize(6);
532  } else {
533  n.times(1 / trialS);
534  }
535 
536 
537  FloatMatrix C;
538  FloatMatrix help;
539  help.beDyadicProductOf(delta, delta);
540  C = help;
541  help.times(-1. / 3.);
542  FloatMatrix C1 = I;
543  C1.add(help);
544  C1.times(2 * trialStressVol);
545 
546  FloatMatrix n1, n2;
547  n1.beDyadicProductOf(n, delta);
548  n2.beDyadicProductOf(delta, n);
549  help = n1;
550  help.add(n2);
551  C1.add(-2. / 3. * trialS, help);
552  C.times(K * J * J);
553 
554  C.add(-K * ( J * J - 1 ), I);
555  C.add(C1);
557 
558  FloatMatrix invF;
559  FloatMatrix T(6, 6);
560 
561  invF.beInverseOf(F);
563  //first row of pull back transformation matrix
564  T.at(1, 1) = invF.at(1, 1) * invF.at(1, 1);
565  T.at(1, 2) = invF.at(1, 2) * invF.at(1, 2);
566  T.at(1, 3) = invF.at(1, 3) * invF.at(1, 3);
567  T.at(1, 4) = 2. * invF.at(1, 2) * invF.at(1, 3);
568  T.at(1, 5) = 2. * invF.at(1, 1) * invF.at(1, 3);
569  T.at(1, 6) = 2. * invF.at(1, 1) * invF.at(1, 2);
570  //second row of pull back transformation matrix
571  T.at(2, 1) = invF.at(2, 1) * invF.at(2, 1);
572  T.at(2, 2) = invF.at(2, 2) * invF.at(2, 2);
573  T.at(2, 3) = invF.at(2, 3) * invF.at(2, 3);
574  T.at(2, 4) = 2. * invF.at(2, 2) * invF.at(2, 3);
575  T.at(2, 5) = 2. * invF.at(2, 1) * invF.at(2, 3);
576  T.at(2, 6) = 2. * invF.at(2, 1) * invF.at(2, 2);
577  //third row of pull back transformation matrix
578  T.at(3, 1) = invF.at(3, 1) * invF.at(3, 1);
579  T.at(3, 2) = invF.at(3, 2) * invF.at(3, 2);
580  T.at(3, 3) = invF.at(3, 3) * invF.at(3, 3);
581  T.at(3, 4) = 2. * invF.at(3, 2) * invF.at(3, 3);
582  T.at(3, 5) = 2. * invF.at(3, 1) * invF.at(3, 3);
583  T.at(3, 6) = 2. * invF.at(3, 1) * invF.at(3, 2);
584  //fourth row of pull back transformation matrix
585  T.at(4, 1) = invF.at(2, 1) * invF.at(3, 1);
586  T.at(4, 2) = invF.at(2, 2) * invF.at(3, 2);
587  T.at(4, 3) = invF.at(2, 3) * invF.at(3, 3);
588  T.at(4, 4) = ( invF.at(2, 2) * invF.at(3, 3) + invF.at(2, 3) * invF.at(3, 2) );
589  T.at(4, 5) = ( invF.at(2, 1) * invF.at(3, 3) + invF.at(2, 3) * invF.at(3, 1) );
590  T.at(4, 6) = ( invF.at(2, 1) * invF.at(3, 2) + invF.at(2, 2) * invF.at(3, 1) );
591  //fifth row of pull back transformation matrix
592  T.at(5, 1) = invF.at(1, 1) * invF.at(3, 1);
593  T.at(5, 2) = invF.at(1, 2) * invF.at(3, 2);
594  T.at(5, 3) = invF.at(1, 3) * invF.at(3, 3);
595  T.at(5, 4) = ( invF.at(1, 2) * invF.at(3, 3) + invF.at(1, 3) * invF.at(3, 2) );
596  T.at(5, 5) = ( invF.at(1, 1) * invF.at(3, 3) + invF.at(1, 3) * invF.at(3, 1) );
597  T.at(5, 6) = ( invF.at(1, 1) * invF.at(3, 2) + invF.at(1, 2) * invF.at(3, 1) );
598  //sixth row of pull back transformation matrix
599  T.at(6, 1) = invF.at(1, 1) * invF.at(2, 1);
600  T.at(6, 2) = invF.at(1, 2) * invF.at(2, 2);
601  T.at(6, 3) = invF.at(1, 3) * invF.at(2, 3);
602  T.at(6, 4) = ( invF.at(1, 2) * invF.at(2, 3) + invF.at(1, 3) * invF.at(2, 2) );
603  T.at(6, 5) = ( invF.at(1, 1) * invF.at(2, 3) + invF.at(1, 3) * invF.at(2, 1) );
604  T.at(6, 6) = ( invF.at(1, 1) * invF.at(2, 2) + invF.at(1, 2) * invF.at(2, 1) );
606 
607  if ( mode != TangentStiffness ) {
608  help.beProductTOf(C, T);
609  answer.beProductOf(T, help);
610  return;
611  }
612 
613 
614  double kappa = status->giveCumulativePlasticStrain();
615  // increment of cumulative plastic strain as an indicator of plastic loading
616  double dKappa = sqrt(3. / 2.) * ( status->giveTempCumulativePlasticStrain() - kappa );
617  //double dKappa = ( status->giveTempCumulativePlasticStrain() - kappa);
618  if ( dKappa <= 0.0 ) { // elastic loading - elastic stiffness plays the role of tangent stiffness
619  help.beProductTOf(C, T);
620  answer.beProductOf(T, help);
621  return;
622  }
623 
624  // === plastic loading ===
625  //dKappa = dKappa*sqrt(3./2.);
626  // trial deviatoric stress and its norm
627 
628 
629  double beta1, beta3, beta4;
630  if ( trialS == 0 ) {
631  beta1 = 0;
632  } else {
633  beta1 = 2 * trialStressVol * dKappa / trialS;
634  }
635 
636  if ( trialStressVol == 0 ) {
637  beta3 = beta1;
638  beta4 = 0;
639  } else {
640  double beta0 = 1 + H / 3 / trialStressVol;
641  double beta2 = ( 1 - 1 / beta0 ) * 2. / 3. * trialS * dKappa / trialStressVol;
642  beta3 = 1 / beta0 - beta1 + beta2;
643  beta4 = ( 1 / beta0 - beta1 ) * trialS / trialStressVol;
644  }
645 
646  FloatMatrix N;
647  N.beDyadicProductOf(n, n);
648  N.times(-2 * trialStressVol * beta3);
649 
650  C1.times(-beta1);
651  FloatMatrix mN(3, 3);
652  mN.at(1, 1) = n.at(1);
653  mN.at(1, 2) = n.at(6);
654  mN.at(1, 3) = n.at(5);
655  mN.at(2, 1) = n.at(6);
656  mN.at(2, 2) = n.at(2);
657  mN.at(2, 3) = n.at(4);
658  mN.at(3, 1) = n.at(5);
659  mN.at(3, 2) = n.at(4);
660  mN.at(3, 3) = n.at(3);
661  FloatMatrix mN2;
662  mN2.beProductOf(mN, mN);
663 
664  double volN2 = 1. / 3. * ( mN2.at(1, 1) + mN2.at(2, 2) + mN2.at(3, 3) );
665  FloatArray devN2(6);
666  devN2.at(1) = mN2.at(1, 1) - volN2;
667  devN2.at(2) = mN2.at(2, 2) - volN2;
668 
669  devN2.at(3) = mN2.at(3, 3) - volN2;
670  devN2.at(4) = mN2.at(2, 3);
671  devN2.at(5) = mN2.at(1, 3);
672  devN2.at(6) = mN2.at(1, 2);
673  FloatMatrix nonSymPart;
674  nonSymPart.beDyadicProductOf(n, devN2);
675  //symP.beTranspositionOf(nonSymPart);
676  //symP.add(nonSymPart);
677  //symP.times(1./2.);
678  nonSymPart.times(-2 * trialStressVol * beta4);
679 
680  C.add(C1);
681  C.add(N);
682  C.add(nonSymPart);
683  help.beProductTOf(C, T);
684  answer.beProductOf(T, help);
685 }
686 
687 
688 #ifdef __OOFEG
689 #endif
690 
691 int
693 {
694  MisesMatStatus *status = static_cast< MisesMatStatus * >( this->giveStatus(gp) );
695  if ( type == IST_PlasticStrainTensor ) {
696  answer = status->givePlasDef();
697  return 1;
698  } else if ( type == IST_MaxEquivalentStrainLevel ) {
699  answer.resize(1);
700  answer.at(1) = status->giveCumulativePlasticStrain();
701  return 1;
702  } else if ( ( type == IST_DamageScalar ) || ( type == IST_DamageTensor ) ) {
703  answer.resize(1);
704  answer.at(1) = status->giveDamage();
705  return 1;
706  } else if ( type == IST_YieldStrength ) {
707  answer.resize(1);
708  answer.at(1) = this->give('s', gp, tStep);
709  return 1;
710  } else {
711  return StructuralMaterial :: giveIPValue(answer, gp, type, tStep);
712  }
713 }
714 
715 //=============================================================================
716 
718  StructuralMaterialStatus(n, d, g), plasticStrain(6), tempPlasticStrain(), trialStressD()
719 {
720  stressVector.resize(6);
721  strainVector.resize(6);
722 
723  damage = tempDamage = 0.;
724  kappa = tempKappa = 0.;
725  effStress.resize(6);
727  leftCauchyGreen.resize(3, 3);
728  leftCauchyGreen.at(1, 1) = leftCauchyGreen.at(2, 2) = leftCauchyGreen.at(3, 3) = 1;
729 }
730 
732 { }
733 
734 void
736 {
738 
739  fprintf(file, " plastic ");
740  for ( auto &val : this->plasticStrain ) {
741  fprintf(file, "%.4e ", val);
742  }
743  fprintf(file, "\n");
744 
745  fprintf(file, "status { ");
746  /*
747  * // this would not be correct, since the status is already updated and kappa is now the "final" value
748  * if ( tempKappa > kappa ) {
749  * fprintf(file, " Yielding, ");
750  * } else {
751  * fprintf(file, " Unloading, ");
752  * }
753  */
754 
755  /*********************************************************************************/
756 
757  fprintf(file, "damage %.4e", tempDamage);
758 
759  /********************************************************************************/
760  /*
761  * // print the plastic strain
762  * n = plasticStrain.giveSize();
763  * fprintf(file, " plastic_strains ");
764  * for ( i = 1; i <= n; i++ ) {
765  * fprintf( file, " %.4e", plasticStrain.at(i) );
766  * }
767  */
768  // print the cumulative plastic strain
769  fprintf(file, ", kappa ");
770  fprintf(file, " %.4e", kappa);
771 
772  fprintf(file, "}\n");
773  /*
774  * //print Left Cauchy - Green deformation tensor
775  * fprintf(file," left Cauchy Green");
776  * fprintf( file, " %.4e",tempLeftCauchyGreen.at(1,1) );
777  * fprintf( file, " %.4e",tempLeftCauchyGreen.at(2,2) );
778  * fprintf( file, " %.4e",tempLeftCauchyGreen.at(3,3) );
779  * fprintf( file, " %.4e",tempLeftCauchyGreen.at(2,3) );
780  * fprintf( file, " %.4e",tempLeftCauchyGreen.at(1,3) );
781  * fprintf( file, " %.4e",tempLeftCauchyGreen.at(1,2) );
782  *
783  * //print deformation gradient
784  * fprintf(file," Deformation Gradient");
785  * fprintf( file, " %.4e",tempDefGrad.at(1,1) );
786  * fprintf( file, " %.4e",tempDefGrad.at(1,2) );
787  * fprintf( file, " %.4e",tempDefGrad.at(1,3) );
788  * fprintf( file, " %.4e",tempDefGrad.at(2,1) );
789  * fprintf( file, " %.4e",tempDefGrad.at(2,2) );
790  * fprintf( file, " %.4e",tempDefGrad.at(2,3) );
791  * fprintf( file, " %.4e",tempDefGrad.at(3,1) );
792  * fprintf( file, " %.4e",tempDefGrad.at(3,2) );
793  * fprintf( file, " %.4e",tempDefGrad.at(3,3) );
794  */
795 
796  fprintf(file, "}\n");
797 }
798 
799 
800 // initializes temporary variables based on their values at the previous equlibrium state
802 {
804 
805  tempDamage = damage;
807  tempKappa = kappa;
808  trialStressD.clear(); // to indicate that it is not defined yet
810 }
811 
812 
813 // updates internal variables when equilibrium is reached
814 void
816 {
818 
820  kappa = tempKappa;
821  damage = tempDamage;
822  trialStressD.clear(); // to indicate that it is not defined any more
824 }
825 
826 
827 double
828 MisesMat :: give(int aProperty, GaussPoint *gp, TimeStep *tStep)
829 //
830 // Returns the value of the property aProperty.
831 //
832 {
833  if ( aProperty == 's' ) {
834  return sig0.eval( { { "te", giveTemperature(gp, tStep) }, { "t", tStep->giveIntrinsicTime() } }, this->giveDomain(), gp, giveTemperature(gp, tStep) );
835  }
836 
837  return this->Material :: give(aProperty, gp);
838 }
839 
841 {
843  FieldPtr tf;
844  int err;
845  if ( ( tf = fm->giveField(FT_Temperature) ) ) {
846  // temperature field registered
847  FloatArray gcoords, answer;
848  static_cast< StructuralElement * >( gp->giveElement() )->computeGlobalCoordinates( gcoords, gp->giveNaturalCoordinates() );
849  if ( ( err = tf->evaluateAt(answer, gcoords, VM_Total, tStep) ) ) {
850  OOFEM_ERROR("tf->evaluateAt failed, element %d, error code %d", gp->giveElement()->giveNumber(), err);
851  }
852  return answer.at(1);
853  }
854  return 0.;
855 }
856 
857 
858 // saves full information stored in this status
859 // temporary variables are NOT stored
862 {
863  contextIOResultType iores;
864 
865  // save parent class status
866  if ( ( iores = StructuralMaterialStatus :: saveContext(stream, mode, obj) ) != CIO_OK ) {
867  THROW_CIOERR(iores);
868  }
869 
870  // write raw data
871 
872  // write plastic strain (vector)
873  if ( ( iores = plasticStrain.storeYourself(stream) ) != CIO_OK ) {
874  THROW_CIOERR(iores);
875  }
876 
877  // write cumulative plastic strain (scalar)
878  if ( !stream.write(kappa) ) {
880  }
881 
882  // write damage (scalar)
883  if ( !stream.write(damage) ) {
885  }
886 
887  return CIO_OK;
888 }
889 
890 
891 
894 //
895 // restores full information stored in stream to this Status
896 //
897 {
898  contextIOResultType iores;
899 
900  // read parent class status
901  if ( ( iores = StructuralMaterialStatus :: restoreContext(stream, mode, obj) ) != CIO_OK ) {
902  THROW_CIOERR(iores);
903  }
904 
905  // read plastic strain (vector)
906  if ( ( iores = plasticStrain.restoreYourself(stream) ) != CIO_OK ) {
907  THROW_CIOERR(iores);
908  }
909 
910  // read cumulative plastic strain (scalar)
911  if ( !stream.read(kappa) ) {
913  }
914 
915  // read damage (scalar)
916  if ( !stream.read(damage) ) {
918  }
919 
920  return CIO_OK; // return succes
921 }
922 } // end namespace oofem
double giveDeterminant() const
Returns the trace (sum of diagonal components) of the receiver.
Definition: floatmatrix.C:1408
void letTempLeftCauchyGreenBe(const FloatMatrix &values)
Definition: misesmat.h:223
virtual void updateYourself(TimeStep *tStep)
Update equilibrium history variables according to temp-variables.
Definition: structuralms.C:96
InternalStateType
Type representing the physical meaning of element or constitutive model internal variable.
void subtract(const FloatArray &src)
Subtracts array src to receiver.
Definition: floatarray.C:258
FloatArray plasticStrain
Plastic strain (initial).
Definition: misesmat.h:153
void letTempStrainVectorBe(const FloatArray &v)
Assigns tempStrainVector to given vector v.
Definition: structuralms.h:137
void bePinvID()
Sets receiver to the inverse of scaling matrix P multiplied by the deviatoric projector ID...
Definition: floatmatrix.C:1347
virtual void give1dStressStiffMtrx(FloatMatrix &answer, MatResponseMode mmode, GaussPoint *gp, TimeStep *tStep)
Method for computing 1d stiffness matrix of receiver.
virtual MaterialStatus * giveStatus(GaussPoint *gp) const
Returns material status of receiver in given integration point.
Definition: material.C:244
GaussPoint * gp
Associated integration point.
std::shared_ptr< Field > FieldPtr
Definition: field.h:72
Class and object Domain.
Definition: domain.h:115
static void applyDeviatoricElasticCompliance(FloatArray &strain, const FloatArray &stress, double EModulus, double nu)
void letTempFVectorBe(const FloatArray &v)
Assigns tempFVector to given vector v.
Definition: structuralms.h:143
virtual void give3dMaterialStiffnessMatrix(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)
Computes full 3d material stiffness matrix at given integration point, time, respecting load history ...
Definition: misesmat.C:424
FloatArray tempPlasticStrain
Plastic strain (final).
Definition: misesmat.h:156
#define _IFT_MisesMat_sig0
Definition: misesmat.h:49
Domain * domain
Link to domain object, useful for communicating with other FEM components.
Definition: femcmpnn.h:82
static void computeDeviatoricVolumetricSum(FloatArray &s, const FloatArray &dev, double mean)
double H
Hardening modulus.
Definition: misesmat.h:85
The purpose of DataStream abstract class is to allow to store/restore context to different streams...
Definition: datastream.h:54
contextIOResultType storeYourself(DataStream &stream) const
Definition: floatarray.C:872
virtual int giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep)
Returns the integration point corresponding value in Reduced form.
double & at(int i)
Coefficient access function.
Definition: floatarray.h:131
MisesMat(int n, Domain *d)
Definition: misesmat.C:54
virtual void giveFirstPKStressVector_3d(FloatArray &answer, GaussPoint *gp, const FloatArray &vF, TimeStep *tStep)
Default implementation relies on giveRealStressVector for second Piola-Kirchoff stress.
Definition: misesmat.C:165
This class implements a structural material status information.
Definition: structuralms.h:65
void clear()
Clears receiver (zero size).
Definition: floatarray.h:206
void letTempEffectiveStressBe(const FloatArray &values)
Definition: misesmat.h:213
double giveCumulativePlasticStrain()
Definition: misesmat.h:197
FloatArray stressVector
Equilibrated stress vector in reduced form.
Definition: structuralms.h:71
double computeDamage(GaussPoint *gp, TimeStep *tStep)
Definition: misesmat.C:391
double giveTempCumulativePlasticStrain()
Definition: misesmat.h:198
double giveTempDamage()
Definition: misesmat.h:195
EngngModel * giveEngngModel()
Returns engineering model to which receiver is associated.
Definition: domain.C:433
void letTrialStressDevBe(const FloatArray &values)
Definition: misesmat.h:209
void beVectorForm(const FloatMatrix &aMatrix)
Reciever will be a vector with 9 components formed from a 3x3 matrix.
Definition: floatarray.C:992
const FloatMatrix & giveTempLeftCauchyGreen()
Definition: misesmat.h:200
const FloatArray & givePlasDef()
Definition: misesmat.h:226
virtual contextIOResultType saveContext(DataStream &stream, ContextMode mode, void *obj=NULL)
Stores receiver state to output stream.
Definition: misesmat.C:861
virtual IRResultType initializeFrom(InputRecord *ir)
Initializes receiver according to object description stored in input record.
Element * giveElement()
Returns corresponding element to receiver.
Definition: gausspoint.h:188
General IO error.
#define S(p)
Definition: mdm.C:481
void give_dPdF_from(const FloatMatrix &dSdE, FloatMatrix &answer, GaussPoint *gp)
void giveStressDependentPartOfStrainVector(FloatArray &answer, GaussPoint *gp, const FloatArray &reducedStrainVector, TimeStep *tStep, ValueModeType mode)
Method for subtracting from reduced space strain vector its stress-independent parts (caused by tempe...
FloatArray effStress
Definition: misesmat.h:165
FieldManager * giveFieldManager()
Definition: engngm.h:131
virtual void printOutputAt(FILE *file, TimeStep *tStep)
Print receiver&#39;s output to given stream.
Definition: structuralms.C:73
double K
Elastic bulk modulus.
Definition: misesmat.h:82
virtual int read(int *data, int count)=0
Reads count integer values into array pointed by data.
MatResponseMode
Describes the character of characteristic material matrix.
double computeDamageParam(double tempKappa)
Definition: misesmat.C:369
#define _IFT_MisesMat_a
Definition: misesmat.h:52
#define THROW_CIOERR(e)
Definition: contextioerr.h:61
This class is a abstract base class for all linear elastic material models in a finite element proble...
double giveTrialStressVol()
Definition: misesmat.h:192
FloatArray trialStressD
Deviatoric trial stress - needed for tangent stiffness.
Definition: misesmat.h:159
void beDifferenceOf(const FloatArray &a, const FloatArray &b)
Sets receiver to be a - b.
Definition: floatarray.C:341
void setTempCumulativePlasticStrain(double value)
Definition: misesmat.h:218
void beMatrixForm(const FloatArray &aArray)
Definition: floatmatrix.C:1657
virtual void updateYourself(TimeStep *tStep)
Update equilibrium history variables according to temp-variables.
Definition: misesmat.C:815
void performPlasticityReturn(GaussPoint *gp, const FloatArray &totalStrain, TimeStep *tStep)
Definition: misesmat.C:294
virtual int write(const int *data, int count)=0
Writes count integer values from array pointed by data.
FloatMatrix tempLeftCauchyGreen
Left Cauchy-Green deformation gradient (final).
Definition: misesmat.h:181
virtual double give(int aProperty, GaussPoint *gp)
Returns the value of material property &#39;aProperty&#39;.
Definition: material.C:52
Abstract base class for all "structural" finite elements.
virtual IRResultType initializeFrom(InputRecord *ir)
Initializes receiver according to object description stored in input record.
virtual void printOutputAt(FILE *file, TimeStep *tStep)
Print receiver&#39;s output to given stream.
Definition: misesmat.C:735
const FloatArray & giveTrialStressDev()
Definition: misesmat.h:189
#define E(p)
Definition: mdm.C:368
This class implements an isotropic linear elastic material in a finite element problem.
#define OOFEM_ERROR(...)
Definition: error.h:61
EngngModelContext * giveContext()
Context requesting service.
Definition: engngm.h:1078
virtual ~MisesMatStatus()
Definition: misesmat.C:731
virtual void give3dMaterialStiffnessMatrix(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)
Computes full 3d material stiffness matrix at given integration point, time, respecting load history ...
void times(double f)
Multiplies receiver by factor f.
Definition: floatmatrix.C:1594
virtual void computeCumPlastStrain(double &kappa, GaussPoint *gp, TimeStep *tStep)
Definition: misesmat.C:406
LinearElasticMaterial * linearElasticMaterial
Reference to the basic elastic material.
Definition: misesmat.h:76
contextIOResultType restoreYourself(DataStream &stream)
Definition: floatarray.C:895
static double computeStressNorm(const FloatArray &stress)
#define N(p, q)
Definition: mdm.C:367
#define _IFT_MisesMat_omega_crit
Definition: misesmat.h:51
virtual int giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep)
Returns the integration point corresponding value in Reduced form.
Definition: misesmat.C:692
double at(int i, int j) const
Coefficient access function.
Definition: floatmatrix.h:176
double giveIntrinsicTime()
Returns intrinsic time, e.g. time in which constitutive model is evaluated.
Definition: timestep.h:148
double computeDamageParamPrime(double tempKappa)
Definition: misesmat.C:379
virtual void give3dLSMaterialStiffnessMatrix(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)
Definition: misesmat.C:511
virtual contextIOResultType restoreContext(DataStream &stream, ContextMode mode, void *obj=NULL)
Restores the receiver state previously written in stream.
Definition: structuralms.C:157
FieldPtr giveField(FieldType key)
Returns the previously registered field under given key; NULL otherwise.
Definition: fieldmanager.C:63
double omega_crit
Definition: misesmat.h:90
MisesMatStatus(int n, Domain *d, GaussPoint *g)
Definition: misesmat.C:717
void subtract(const FloatMatrix &a)
Subtracts matrix from the receiver.
Definition: floatmatrix.C:1084
void setTempDamage(double value)
Definition: misesmat.h:220
Abstract base class representing a material status information.
Definition: matstatus.h:84
Class representing vector of real numbers.
Definition: floatarray.h:82
double kappa
Cumulative plastic strain (initial).
Definition: misesmat.h:169
const FloatArray & getTempPlasticStrain() const
Definition: misesmat.h:207
FloatArray strainVector
Equilibrated strain vector in reduced form.
Definition: structuralms.h:69
Implementation of matrix containing floating point numbers.
Definition: floatmatrix.h:94
virtual double give(int aProperty, GaussPoint *gp, TimeStep *tStep)
Definition: misesmat.C:828
IRResultType
Type defining the return values of InputRecord reading operations.
Definition: irresulttype.h:47
double cbrt(double x)
Returns the cubic root of x.
Definition: mathfem.h:109
void letTempStressVectorBe(const FloatArray &v)
Assigns tempStressVector to given vector v.
Definition: structuralms.h:135
const FloatArray & giveFVector() const
Returns the const pointer to receiver&#39;s deformation gradient vector.
Definition: structuralms.h:113
static void applyDeviatoricElasticStiffness(FloatArray &stress, const FloatArray &strain, double EModulus, double nu)
void resize(int rows, int cols)
Checks size of receiver towards requested bounds.
Definition: floatmatrix.C:1358
Class representing the general Input Record.
Definition: inputrecord.h:101
void setTrialStressVol(double value)
Definition: misesmat.h:216
const FloatArray & giveTempEffectiveStress()
Definition: misesmat.h:203
void add(const FloatMatrix &a)
Adds matrix to the receiver.
Definition: floatmatrix.C:1023
virtual void give3dMaterialStiffnessMatrix_dPdF(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)
Definition: misesmat.C:414
virtual MaterialStatus * CreateStatus(GaussPoint *gp) const
Creates new copy of associated status and inserts it into given integration point.
Definition: misesmat.C:101
virtual void giveRealStressVector_1d(FloatArray &answer, GaussPoint *gp, const FloatArray &reducedE, TimeStep *tStep)
Default implementation relies on giveRealStressVector_StressControl.
Definition: misesmat.C:107
double giveTemperature(GaussPoint *gp, TimeStep *tStep)
Definition: misesmat.C:840
void beDyadicProductOf(const FloatArray &vec1, const FloatArray &vec2)
Assigns to the receiver the dyadic product .
Definition: floatmatrix.C:492
void beTProductOf(const FloatMatrix &a, const FloatMatrix &b)
Assigns to the receiver product of .
Definition: floatmatrix.C:367
const FloatArray & giveTempFVector() const
Returns the const pointer to receiver&#39;s temporary deformation gradient vector.
Definition: structuralms.h:123
const FloatArray & givePlasticStrain()
Definition: misesmat.h:187
void times(double s)
Multiplies receiver with scalar.
Definition: floatarray.C:818
static double computeDeviatoricVolumetricSplit(FloatArray &dev, const FloatArray &s)
Computes split of receiver into deviatoric and volumetric part.
virtual void giveRealStressVector_1d(FloatArray &answer, GaussPoint *gp, const FloatArray &reducedE, TimeStep *tStep)
Default implementation relies on giveRealStressVector_StressControl.
long ContextMode
Context mode (mask), defining the type of information written/read to/from context.
Definition: contextmode.h:43
virtual ~MisesMat()
Definition: misesmat.C:64
void beSymVectorForm(const FloatMatrix &aMatrix)
Reciever will be a vector with 6 components formed from a 3x3 matrix.
Definition: floatarray.C:1035
Abstract base class for all "structural" constitutive models.
void letTempPlasticStrainBe(const FloatArray &values)
Definition: misesmat.h:206
void beProductTOf(const FloatMatrix &a, const FloatMatrix &b)
Assigns to the receiver product of .
Definition: floatmatrix.C:397
virtual contextIOResultType restoreContext(DataStream &stream, ContextMode mode, void *obj=NULL)
Restores the receiver state previously written in stream.
Definition: misesmat.C:893
virtual void initTempStatus()
Initializes the temporary internal variables, describing the current state according to previously re...
Definition: structuralms.C:108
Domain * giveDomain() const
Definition: femcmpnn.h:100
#define _IFT_MisesMat_h
Definition: misesmat.h:50
double signum(double i)
Returns the signum of given value (i = 0 returns 0, i < 0 returns -1, i > 0 returns 1) ...
Definition: mathfem.C:326
void beUnitMatrix()
Sets receiver to unity matrix.
Definition: floatmatrix.C:1332
virtual void give1dStressStiffMtrx(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)
Method for computing 1d stiffness matrix of receiver.
Definition: misesmat.C:480
REGISTER_Material(DummyMaterial)
void beSymVectorFormOfStrain(const FloatMatrix &aMatrix)
Definition: floatarray.C:1014
#define IR_GIVE_OPTIONAL_FIELD(__ir, __value, __id)
Macro facilitating the use of input record reading methods.
Definition: inputrecord.h:78
void beProductOf(const FloatMatrix &a, const FloatMatrix &b)
Assigns to the receiver product of .
Definition: floatmatrix.C:337
virtual void initTempStatus()
Initializes the temporary internal variables, describing the current state according to previously re...
Definition: misesmat.C:801
int giveSize() const
Returns the size of receiver.
Definition: floatarray.h:218
virtual contextIOResultType saveContext(DataStream &stream, ContextMode mode, void *obj=NULL)
Stores receiver state to output stream.
Definition: structuralms.C:133
the oofem namespace is to define a context or scope in which all oofem names are defined.
double G
Elastic shear modulus.
Definition: misesmat.h:79
double tempKappa
Cumulative plastic strain (final).
Definition: misesmat.h:172
#define IR_GIVE_FIELD(__ir, __value, __id)
Macro facilitating the use of input record reading methods.
Definition: inputrecord.h:69
int giveNumber() const
Definition: femcmpnn.h:107
void beInverseOf(const FloatMatrix &src)
Modifies receiver to become inverse of given parameter.
Definition: floatmatrix.C:835
ScalarFunction sig0
Initial (uniaxial) yield stress.
Definition: misesmat.h:88
Class representing integration point in finite element program.
Definition: gausspoint.h:93
Class representing solution step.
Definition: timestep.h:80
virtual void giveRealStressVector_3d(FloatArray &answer, GaussPoint *gp, const FloatArray &reducedE, TimeStep *tStep)
Default implementation relies on giveRealStressVector for second Piola-Kirchoff stress.
Definition: misesmat.C:143
virtual IRResultType initializeFrom(InputRecord *ir)
Initializes receiver according to object description stored in input record.
Definition: misesmat.C:71
FloatArray tempEffStress
Definition: misesmat.h:166
void add(const FloatArray &src)
Adds array src to receiver.
Definition: floatarray.C:156
void computeGLPlasticStrain(const FloatMatrix &F, FloatMatrix &Ep, FloatMatrix b, double J)
Definition: misesmat.C:279
FloatMatrix leftCauchyGreen
Left Cauchy-Green deformation gradient (initial).
Definition: misesmat.h:179
const FloatArray & giveNaturalCoordinates()
Returns coordinate array of receiver.
Definition: gausspoint.h:138
void letTempPVectorBe(const FloatArray &v)
Assigns tempPVector to given vector v.
Definition: structuralms.h:139
void resize(int s)
Resizes receiver towards requested size.
Definition: floatarray.C:631
LinearElasticMaterial * giveLinearElasticMaterial()
Returns a reference to the basic elastic material.
Definition: misesmat.h:112

This page is part of the OOFEM documentation. Copyright (c) 2011 Borek Patzak
Project e-mail: info@oofem.org
Generated at Tue Jan 2 2018 20:07:30 for OOFEM by doxygen 1.8.11 written by Dimitri van Heesch, © 1997-2011