OOFEM 3.0
Loading...
Searching...
No Matches
latticedamage.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 program is free software; you can redistribute it and/or modify
21 * it under the terms of the GNU General Public License as published by
22 * the Free Software Foundation; either version 2 of the License, or
23 * (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
28 * GNU General Public License for more details.
29 *
30 * You should have received a copy of the GNU General Public License
31 * along with this program; if not, write to the Free Software
32 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
33 */
34
35#include "latticedamage.h"
36#include "gausspoint.h"
37#include "floatmatrix.h"
38#include "floatmatrixf.h"
39#include "floatarray.h"
40#include "floatarrayf.h"
42#include "engngm.h"
43#include "mathfem.h"
45#include "datastream.h"
46#include "staggeredproblem.h"
47#include "contextioerr.h"
48#include "classfactory.h"
49
50namespace oofem {
52
53LatticeDamage :: LatticeDamage(int n, Domain *d) : LatticeLinearElastic(n, d)
54{}
55
56
57bool
58LatticeDamage :: hasMaterialModeCapability(MaterialMode mode) const
59{
60 return ( mode == _3dLattice );
61}
62
63
64void
65LatticeDamage :: initializeFrom(InputRecord &ir)
66{
67 LatticeLinearElastic :: initializeFrom(ir);
68
69 softeningType = 1;
71
73
74 if ( softeningType == 2 ) { //bilinear softening
75 wfOne = 0.15 * wf;
77 e0OneMean = 0.3 * e0Mean;
79 }
80
82
83 this->coh = 2.;
85
86 this->ec = 10.;
88
89 this->biotCoefficient = 0.;
91
92 this->biotType = 0;
94}
95
96
97double
98LatticeDamage :: computeEquivalentStrain(const FloatArrayF< 6 > &strain, GaussPoint *gp) const
99{
100 const double e0 = this->give(e0_ID, gp) * this->e0Mean;
101 double paramA = 0.5 * ( e0 + ec * e0 );
102 double paramB = ( coh * e0 ) / sqrt(1. - pow( ( ec * e0 - e0 ) / ( e0 + ec * e0 ), 2. ) );
103 double paramC = 0.5 * ( this->ec * e0 - e0 );
104
105 double shearNorm = norm(strain [ { 1, 2 } ]);
106 return norm({ this->alphaOne * shearNorm / paramB, ( strain.at(1) + paramC ) / paramA }) * paramA - paramC;
107}
108
109
110double
111LatticeDamage :: computeDamageParam(double tempKappa, GaussPoint *gp) const
112{
113 double le = static_cast< LatticeStructuralElement * >( gp->giveElement() )->giveLength();
114 const double e0 = this->give(e0_ID, gp) * this->e0Mean;
115 double eNormal = this->give(eNormal_ID, gp) * this->eNormalMean;
116
117 if ( softeningType == 1 ) { //linear
118 if ( tempKappa >= e0 && tempKappa < this->wf / le ) {
119 //linear stress-crack opening relation
120 //check if input parameter make sense
121 if ( this->wf / le <= e0 ) {
122 OOFEM_ERROR("e0>wf/Le \n Possible solutions: Increase fracture energy or reduce element size\n");
123 }
124
125 return ( 1. - e0 / tempKappa ) / ( 1. - e0 / ( this->wf / le ) );
126 } else if ( tempKappa >= this->wf / le ) {
127 return 1.;
128 } else {
129 return 0.;
130 }
131 } else if ( softeningType == 2 ) { //bilinear softening
132 //Check if input parameter make sense
133 if ( e0 > wfOne / le ) {
134 OOFEM_ERROR("parameter wf1 is too small");
135 } else if ( wfOne / le > this->wf / le ) {
136 OOFEM_ERROR("parameter wf is too small");
137 }
138
139 if ( tempKappa > e0 ) {
140 double helpStrain = 0.3 * e0;
141 double omega = ( 1 - e0 / tempKappa ) / ( ( helpStrain - e0 ) / this->wfOne * le + 1. );
142
143 if ( omega * tempKappa * le > 0 && omega * tempKappa * le < this->wfOne ) {
144 return omega;
145 } else {
146 omega = ( 1. - helpStrain / tempKappa - helpStrain * this->wfOne / ( tempKappa * ( this->wf - this->wfOne ) ) ) / ( 1. - helpStrain * le / ( this->wf - this->wfOne ) );
147
148 if ( omega * tempKappa * le >= this->wfOne && omega * tempKappa * le < this->wf ) {
149 return omega;
150 }
151 }
152
153 return clamp(omega, 0., 1.);
154 } else {
155 return 0.;
156 }
157 } else if ( softeningType == 3 ) {
158 //exponential softening
159 // iteration to achieve objectivity
160 // we are finding state, where elastic stress is equal to
161 // stress from crack-opening relation (wf = wf characterizes the carc opening diagram)
162 if ( tempKappa <= e0 ) {
163 return 0.0;
164 } else {
165 int nite = 0;
166 double R = 0., omega = 0.;
167 double Ft = eNormal * e0;
168 do {
169 nite++;
170 double help = le * omega * tempKappa / this->wf;
171 double Lhs = eNormal * tempKappa - Ft * exp(-help) * le * tempKappa / this->wf;
172 R = ( 1. - omega ) * eNormal * tempKappa - Ft * exp(-help);
173 omega += R / Lhs;
174 if ( nite > 40 ) {
175 OOFEM_ERROR("computeDamageParam: algorithm not converging");
176 }
177 } while ( fabs(R) >= 1.e-4 );
178
179 if ( ( omega > 1.0 ) || ( omega < 0.0 ) ) {
180 OOFEM_ERROR("computeDamageParam: internal error\n");
181 }
182 return omega;
183 }
184 } else {
185 OOFEM_ERROR("computeDamageParam: unknown softening type");
186 }
187}
188
189
190std::unique_ptr<MaterialStatus>
191LatticeDamage :: CreateStatus(GaussPoint *gp) const
192{
193 return std::make_unique<LatticeDamageStatus>(gp);
194}
195
196
198LatticeDamage :: give3dLatticeStiffnessMatrix(MatResponseMode mode, GaussPoint *gp, TimeStep *tStep) const
199{
200 auto elastic = LatticeLinearElastic :: give3dLatticeStiffnessMatrix(mode, gp, tStep);
201
202 if ( mode == ElasticStiffness ) {
203 return elastic;
204 } else if ( ( mode == SecantStiffness ) || ( mode == TangentStiffness ) ) {
205 auto status = static_cast< LatticeDamageStatus * >( this->giveStatus(gp) );
206
207 double omega = min(status->giveTempDamage(), 0.99999);
208 return elastic * ( 1. - omega );
209 } else {
210 OOFEM_ERROR("Unsupported stiffness mode\n");
211 }
212}
213
214
216LatticeDamage :: give2dLatticeStiffnessMatrix(MatResponseMode mode, GaussPoint *gp, TimeStep *tStep) const
217{
218
219 auto elastic = LatticeLinearElastic :: give2dLatticeStiffnessMatrix(mode, gp, tStep);
220
221 if ( mode == ElasticStiffness ) {
222 return elastic;
223 } else if ( ( mode == SecantStiffness ) || ( mode == TangentStiffness ) ) {
224 auto status = static_cast< LatticeDamageStatus * >( this->giveStatus(gp) );
225 double omega = status->giveTempDamage();
226
227 if ( omega > 0.99999 ) {
228 omega = 0.99999;
229 }
230
231 return elastic * ( 1. - omega );
232 } else {
233 OOFEM_ERROR("Unsupported stiffness mode\n");
234 }
235}
236
237
239LatticeDamage :: giveLatticeStress3d(const FloatArrayF< 6 > &strain, GaussPoint *gp, TimeStep *tStep)
240{
241 auto status = static_cast< LatticeDamageStatus * >( this->giveStatus(gp) );
242
243 const double e0 = this->give(e0_ID, gp) * this->e0Mean;
244
245 status->setE0(e0);
246 this->initTempStatus(gp);
247
248 // substract stress independent part
249 auto reducedStrain = strain;
250 auto thermalStrain = this->computeStressIndependentStrainVector(gp, tStep, VM_Total);
251 if ( thermalStrain.giveSize() ) {
252 reducedStrain -= FloatArrayF< 6 >(thermalStrain);
253 }
254
255 double omega = 0.;
256 this->performDamageEvaluation(gp, reducedStrain);
257 omega = status->giveTempDamage();
258
259 auto stiffnessMatrix = LatticeLinearElastic :: give3dLatticeStiffnessMatrix(ElasticStiffness, gp, tStep);
260
261 FloatArrayF< 6 >answer;
262 for ( int i = 1; i <= 6; i++ ) { // only diagonal terms matter
263 answer.at(i) = stiffnessMatrix.at(i, i) * reducedStrain.at(i) * ( 1. - omega );
264 }
265
266 //Read in fluid pressures from structural element if this is not a slave problem
267 FloatArray pressures;
268 if ( !domain->giveEngngModel()->giveMasterEngngModel() ) {
269 static_cast< LatticeStructuralElement * >( gp->giveElement() )->givePressures(pressures);
270 }
271
272 double waterPressure = 0.;
273 for ( int i = 0; i < pressures.giveSize(); i++ ) {
274 waterPressure += 1. / pressures.giveSize() * pressures [ i ];
275 }
276 answer.at(1) += waterPressure;
277
278 double tempDeltaDissipation = computeDeltaDissipation3d(omega, reducedStrain, gp, tStep);
279 double tempDissipation = status->giveDissipation() + tempDeltaDissipation;
280
281 //Set all temp values
282 status->setTempDissipation(tempDissipation);
283 status->setTempDeltaDissipation(tempDeltaDissipation);
284
285 status->letTempLatticeStrainBe(strain);
286 status->letTempReducedLatticeStrainBe(reducedStrain);
287 status->letTempLatticeStressBe(answer);
288 status->setTempNormalLatticeStress(answer.at(1) );
289
290 return answer;
291}
292
293
294void
295LatticeDamage :: performDamageEvaluation(GaussPoint *gp, FloatArrayF< 6 > &reducedStrain) const
296{
297 auto status = static_cast< LatticeDamageStatus * >( this->giveStatus(gp) );
298 // compute equivalent strain
299 double equivStrain = this->computeEquivalentStrain(reducedStrain, gp);
300
301 // compute value of loading function if strainLevel crit apply
302 double f = equivStrain - status->giveKappa();
303
304 double tempKappa, omega = 0.;
305 if ( f <= 0.0 ) {
306 // damage does not grow
307 tempKappa = status->giveKappa();
308 omega = status->giveDamage();
309 if ( status->giveCrackFlag() != 0 ) {
310 status->setTempCrackFlag(2);
311 } else {
312 status->setTempCrackFlag(0);
313 }
314 } else {
315 // damage grows
316 tempKappa = equivStrain;
317
318 // evaluate damage parameter
319
320 omega = this->computeDamageParam(tempKappa, gp);
321 if ( omega > 0 ) {
322 status->setTempCrackFlag(1);
323 }
324 }
325
326 //Create history variables for the damage strain
327 FloatArrayF< 6 >tempDamageLatticeStrain = omega * reducedStrain;
328 status->letTempDamageLatticeStrainBe(tempDamageLatticeStrain);
329
330 //Compute crack width
331 double length = ( static_cast< LatticeStructuralElement * >( gp->giveElement() ) )->giveLength();
332 double crackWidth = omega * norm(reducedStrain [ { 0, 1, 2 } ]) * length;
333
334 status->setTempEquivalentStrain(equivStrain);
335 status->setTempKappa(tempKappa);
336 status->setTempDamage(omega);
337 status->setTempCrackWidth(crackWidth);
338}
339
340double
341LatticeDamage :: computeBiot(double omega, double kappa, double le) const
342{
343 if ( this->softeningType == 1 || this->softeningType == 3 ) {
344 if ( omega == 0 ) {
345 return this->biotCoefficient;
346 } else if ( omega * kappa * le > 0 && omega * kappa * le < this->wf ) {
347 return this->biotCoefficient + ( 1. - biotCoefficient ) * omega * kappa * le / this->wf;
348 } else {
349 return 1.;
350 }
351 } else {
352 OOFEM_ERROR("Wrong stype for btype=1. Only linear and exponential softening considered so far\n");
353 }
354}
355
356
357double
358LatticeDamage :: computeReferenceGf(GaussPoint *gp) const
359{
360 const double e0 = this->give(e0_ID, gp) * this->e0Mean;
361 const double eNormal = this->give(eNormal_ID, gp) * this->eNormalMean;
362 if ( softeningType == 1 ) {
363 return e0 * eNormal * this->wf / 2.;
364 } else { //This is for the exponential law. Should also implement it for the bilinear one.
365 return e0 * eNormal * this->wf;
366 }
367}
368
369
370double
371LatticeDamage :: computeIntervals(double testDissipation, double referenceGf) const
372{
373 if ( testDissipation / ( referenceGf ) > 0.01 ) {
374 return 1000. * min(testDissipation / referenceGf, 1.);
375 } else {
376 return 1.;
377 }
378}
379
380
381double
382LatticeDamage :: computeDeltaDissipation2d(double omega,
383 const FloatArrayF< 3 > &reducedStrain,
384 GaussPoint *gp,
385 TimeStep *tStep) const
386{
387 auto status = static_cast< LatticeDamageStatus * >( this->giveStatus(gp) );
388 const double length = ( static_cast< LatticeStructuralElement * >( gp->giveElement() ) )->giveLength();
389 const double eNormal = this->give(eNormal_ID, gp) * this->eNormalMean;
390 const double eShear = this->alphaOne * eNormal;
391 const double eTorsion = this->alphaTwo * eNormal;
392 const FloatArrayF< 3 >tangent = { eNormal, eShear, eTorsion };
393
394 const auto reducedStrainOld = status->giveReducedLatticeStrain() [ { 0, 1, 5 } ];
395 const double omegaOld = status->giveDamage();
396
397 auto oldIntermediateStrain = reducedStrainOld;
398 double oldIntermediateOmega = omegaOld;
399 double deltaOmega = ( omega - omegaOld );
400 auto testStrain = ( reducedStrain + reducedStrainOld ) * 0.5;
401 auto testStress = mult(tangent, testStrain);
402 double testDissipation = 0.5 * length * norm(testStress) * deltaOmega;
403
404 double referenceGf = computeReferenceGf(gp);
405 double intervals = computeIntervals(testDissipation, referenceGf);
406
407 double oldKappa = status->giveKappa();
408 if ( deltaOmega > 0 ) {
409 double tempDeltaDissipation = 0.;
410 for ( int k = 0; k < intervals; k++ ) {
411 auto intermediateStrain = reducedStrainOld + ( k + 1 ) / intervals * ( reducedStrain - reducedStrainOld );
412 double equivStrain = this->computeEquivalentStrain(assemble< 6 >(intermediateStrain, { 0, 1, 5 }), gp);
413 double f = equivStrain - oldKappa;
414 if ( f > 0 ) {
415 auto intermediateOmega = this->computeDamageParam(equivStrain, gp);
416 auto deltaOmega = ( intermediateOmega - oldIntermediateOmega );
417 auto midStrain = ( intermediateStrain + oldIntermediateStrain ) / 2.;
418 auto midStress = mult(tangent, midStrain);
419 auto deltaTempDeltaDissipation = 0.5 * length * norm(midStress) * deltaOmega;
420 oldKappa = equivStrain;
421 oldIntermediateOmega = intermediateOmega;
422 tempDeltaDissipation += deltaTempDeltaDissipation;
423 }
424
425 oldIntermediateStrain = intermediateStrain;
426 }
427 return max(tempDeltaDissipation, 2. * referenceGf);
428 } else {
429 return 0.;
430 }
431}
432
433
434double
435LatticeDamage :: computeDeltaDissipation3d(double omega,
436 const FloatArrayF< 6 > &reducedStrain,
437 GaussPoint *gp,
438 TimeStep *atTime) const
439{
440 auto status = static_cast< LatticeDamageStatus * >( this->giveStatus(gp) );
441 const double length = ( static_cast< LatticeStructuralElement * >( gp->giveElement() ) )->giveLength();
442 const double eNormal = this->give(eNormal_ID, gp) * this->eNormalMean;
443 const double eShear = this->alphaOne * eNormal;
444 const double eTorsion = this->alphaTwo * eNormal;
445 const FloatArrayF< 6 >tangent = { eNormal, eShear, eShear, eTorsion, eTorsion, eTorsion };
446
447 const auto &reducedStrainOld = status->giveReducedLatticeStrain();
448 const double omegaOld = status->giveDamage();
449
450 auto oldIntermediateStrain = reducedStrainOld;
451 double oldIntermediateOmega = omegaOld;
452 double deltaOmega = ( omega - omegaOld );
453 auto testStrain = ( reducedStrain + reducedStrainOld ) * 0.5;
454 auto testStress = mult(tangent, testStrain);
455 double testDissipation = 0.5 * length * norm(testStress) * deltaOmega;
456
457 double referenceGf = computeReferenceGf(gp);
458 double intervals = computeIntervals(testDissipation, referenceGf);
459
460 double oldKappa = status->giveKappa();
461 if ( deltaOmega > 0 ) {
462 double tempDeltaDissipation = 0.;
463 for ( int k = 0; k < intervals; k++ ) {
464 auto intermediateStrain = reducedStrainOld + ( k + 1 ) / intervals * ( reducedStrain - reducedStrainOld );
465 double equivStrain = this->computeEquivalentStrain(intermediateStrain, gp);
466 double f = equivStrain - oldKappa;
467 if ( f > 0 ) {
468 auto intermediateOmega = this->computeDamageParam(equivStrain, gp);
469 auto deltaOmega = ( intermediateOmega - oldIntermediateOmega );
470 auto midStrain = ( intermediateStrain + oldIntermediateStrain ) / 2.;
471 auto midStress = mult(tangent, midStrain);
472 auto deltaTempDeltaDissipation = 0.5 * length * norm(midStress) * deltaOmega;
473 oldKappa = equivStrain;
474 oldIntermediateOmega = intermediateOmega;
475 tempDeltaDissipation += deltaTempDeltaDissipation;
476 }
477
478 oldIntermediateStrain = intermediateStrain;
479 }
480 return max(tempDeltaDissipation, 2. * referenceGf);
481 } else {
482 return 0.;
483 }
484}
485
486
487double
488LatticeDamage :: give(int aProperty, GaussPoint *gp) const
489{
490 this->giveStatus(gp);
491
492 double answer;
493 if ( RandomMaterialExtensionInterface :: give(aProperty, gp, answer) ) {
494 if ( answer < 0.1 ) { //Introduce cut off to avoid numerical problems
495 answer = 0.1;
496 } else if ( answer > 10 ) {
497 answer = 10;
498 }
499 return answer;
500 } else if ( aProperty == e0_ID ) {
501 return 1.;
502 } else if ( aProperty == ef_ID ) {
503 return 1.;
504 } else {
505 return LatticeLinearElastic :: give(aProperty, gp);
506 }
507}
508
509int
510LatticeDamage :: giveIPValue(FloatArray &answer,
511 GaussPoint *gp,
513 TimeStep *atTime)
514{
515 LatticeDamageStatus *status = static_cast< LatticeDamageStatus * >( this->giveStatus(gp) );
516 if ( type == IST_CrackedFlag ) {
517 answer.resize(1);
518 answer.zero();
519 answer.at(1) = status->giveCrackFlag();
520 return 1;
521 } else if ( type == IST_DamageScalar ) {
522 answer.resize(1);
523 answer.zero();
524 answer.at(1) = status->giveDamage();
525 return 1;
526 } else if ( type == IST_DamageTensor ) {
527 answer.resize(6);
528 answer.zero();
529 answer.at(1) = answer.at(2) = answer.at(3) = status->giveDamage();
530 return 1;
531 } else if ( type == IST_DissWork ) {
532 answer.resize(1);
533 answer.zero();
534 answer.at(1) = status->giveDissipation();
535 return 1;
536 } else if ( type == IST_DeltaDissWork ) {
537 answer.resize(1);
538 answer.zero();
539 answer.at(1) = status->giveDeltaDissipation();
540 return 1;
541 } else if ( type == IST_CrackWidth ) {
542 answer.resize(1);
543 answer.zero();
544 answer.at(1) = status->giveCrackWidth();
545 return 1;
546 } else if ( type == IST_NormalStress ) {
547 answer.resize(1);
548 answer.zero();
549 answer.at(1) = status->giveNormalLatticeStress();
550 return 1;
551 } else if ( type == IST_CharacteristicLength ) {
552 answer.resize(1);
553 answer.zero();
554 answer.at(1) = static_cast< LatticeStructuralElement * >( gp->giveElement() )->giveLength();
555 return 1;
556 } else {
557 return LatticeLinearElastic :: giveIPValue(answer, gp, type, atTime);
558 }
559}
560
561LatticeDamageStatus :: LatticeDamageStatus(GaussPoint *g) :
563{ }
564
565void
566LatticeDamageStatus :: initTempStatus()
567{
568 LatticeMaterialStatus :: initTempStatus();
569
570 this->tempKappa = this->kappa;
571 this->tempEquivStrain = this->equivStrain;
572 this->tempDamage = this->damage;
573}
574
575void
576LatticeDamageStatus :: printOutputAt(FILE *file, TimeStep *tStep) const
577{
578 LatticeMaterialStatus :: printOutputAt(file, tStep);
579 fprintf(file, "kappa %f, equivStrain %f, damage %f, dissipation %f, deltaDissipation %f, e0 %f, crackFlag %d\n", this->kappa, this->equivStrain, this->damage, this->dissipation, this->deltaDissipation, this->e0, this->crackFlag);
580}
581
582
583void
584LatticeDamageStatus :: updateYourself(TimeStep *atTime)
585//
586// updates variables (nonTemp variables describing situation at previous equilibrium state)
587// after a new equilibrium state has been reached
588// temporary variables are having values corresponding to newly reached equilibrium.
589//
590{
591 LatticeMaterialStatus :: updateYourself(atTime);
592
593 this->kappa = this->tempKappa;
594 this->equivStrain = this->tempEquivStrain;
595 this->damage = this->tempDamage;
596}
597
598void
599LatticeDamageStatus :: saveContext(DataStream &stream, ContextMode mode)
600//
601// saves full information stored in this Status
602// no temp variables stored
603//
604{
605 LatticeMaterialStatus :: saveContext(stream, mode);
606
607 if ( !stream.write(kappa) ) {
609 }
610
611 if ( !stream.write(equivStrain) ) {
613 }
614
615 if ( !stream.write(damage) ) {
617 }
618
619 if ( !stream.write(e0) ) {
621 }
622
623 if ( !stream.write(biot) ) {
625 }
626}
627
628void
629LatticeDamageStatus :: restoreContext(DataStream &stream, ContextMode mode)
630//
631// restores full information stored in stream to this Status
632//
633{
634 LatticeMaterialStatus :: restoreContext(stream, mode);
635
636 if ( !stream.read(kappa) ) {
638 }
639
640 if ( !stream.read(equivStrain) ) {
642 }
643
644 if ( !stream.read(damage) ) {
646 }
647
648 if ( !stream.read(e0) ) {
650 }
651
652 if ( !stream.read(biot) ) {
654 }
655}
656} // end namespace oofem
double length(const Vector &a)
Definition CSG.h:88
#define REGISTER_Material(class)
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.
Domain * domain
Link to domain object, useful for communicating with other FEM components.
Definition femcmpnn.h:79
double & at(std::size_t i)
void resize(Index s)
Definition floatarray.C:94
double & at(Index i)
Definition floatarray.h:202
Index giveSize() const
Returns the size of receiver.
Definition floatarray.h:261
void zero()
Zeroes all coefficients of receiver.
Definition floatarray.C:683
Element * giveElement()
Returns corresponding element to receiver.
Definition gausspoint.h:187
double equivStrain
scalar measure of the largest strain level ever reached in material
double giveDamage() const
Returns the last equilibrated damage level.
double giveTempDamage() const
Returns the temp. damage level.
double tempDamage
non-equilibrated damage level of material
double tempEquivStrain
non-equilibrated scalar measure of the largest strain level
double kappa
scalar measure of the largest strain level ever reached in material
double tempKappa
non-equilibrated scalar measure of the largest strain level
double e0
random material parameter stored in status, since each gp has a differnet value.
double biot
computed biot coefficient
double damage
damage level of material
int biotType
Parameter specifying how the biot coefficient changes with the crack opening.
double biotCoefficient
Biot's coefficient.
double computeDeltaDissipation3d(double omega, const FloatArrayF< 6 > &reducedStrain, GaussPoint *gp, TimeStep *atTime) const
virtual double computeEquivalentStrain(const FloatArrayF< 6 > &strain, GaussPoint *gp) const
double computeIntervals(double testDissipation, double referenceGf) const
virtual double computeDamageParam(double kappa, GaussPoint *gp) const
double computeReferenceGf(GaussPoint *gp) const
double give(int aProperty, GaussPoint *gp) const override
double e0Mean
max effective strain at peak
double wf
determines the softening -> corresponds to crack opening when tension stress vanishes
void performDamageEvaluation(GaussPoint *gp, FloatArrayF< 6 > &reducedStrain) const
double alphaOne
Ratio of shear and normal modulus.
double alphaTwo
Ratio of torsion and normal modulus.
double eNormalMean
Normal modulus.
MaterialStatus * giveStatus(GaussPoint *gp) const override
virtual double giveCrackWidth() const
double deltaDissipation
Increment of dissipation.
virtual int giveCrackFlag() const
virtual double giveDissipation() const
virtual double giveDeltaDissipation() const
double giveNormalLatticeStress() const
Gives the last equilibrated normal stress.
virtual void givePressures(FloatArray &pressures)
virtual void initTempStatus(GaussPoint *gp) const
Definition material.C:221
virtual FloatArray computeStressIndependentStrainVector(GaussPoint *gp, TimeStep *tStep, ValueModeType mode) const
#define THROW_CIOERR(e)
#define OOFEM_ERROR(...)
Definition error.h:79
#define IR_GIVE_OPTIONAL_FIELD(__ir, __value, __id)
Definition inputrecord.h:75
#define IR_GIVE_FIELD(__ir, __value, __id)
Definition inputrecord.h:67
#define _IFT_LatticeDamage_bio
#define _IFT_LatticeDamage_e0Mean
#define _IFT_LatticeDamage_softeningType
#define _IFT_LatticeDamage_e0OneMean
#define _IFT_LatticeDamage_ec
#define _IFT_LatticeDamage_wfOne
#define _IFT_LatticeDamage_coh
#define _IFT_LatticeDamage_wf
#define _IFT_LatticeDamage_btype
#define eNormal_ID
Definition matconst.h:100
#define e0_ID
Definition matconst.h:83
#define ef_ID
Definition matconst.h:84
long ContextMode
Definition contextmode.h:43
double norm(const FloatArray &x)
FloatArrayF< N > min(const FloatArrayF< N > &a, const FloatArrayF< N > &b)
FloatArrayF< N > assemble(const FloatArrayF< M > &x, int const (&c)[M])
Assemble components into zero matrix.
FloatArrayF< N > max(const FloatArrayF< N > &a, const FloatArrayF< N > &b)
FloatArrayF< N > mult(const FloatArrayF< N > &x, const FloatArrayF< N > &y)
Element-wise multiplication.
@ CIO_IOERR
General IO error.
double clamp(int a, int lower, int upper)
Returns the clamped value of a between upper and lower.
Definition mathfem.h:88

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