OOFEM 3.0
Loading...
Searching...
No Matches
trabbone3d.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 "trabbone3d.h"
36#include "gausspoint.h"
37#include "floatmatrix.h"
38#include "floatarray.h"
39#include "mathfem.h"
40#include "internalstatetype.h"
41#include "contextioerr.h"
42#include "intarray.h"
43#include "datastream.h"
44#include "classfactory.h"
45
46
47namespace oofem {
49
50TrabBone3D :: TrabBone3D(int n, Domain *d) : StructuralMaterial(n, d)
51{ }
52
53
54void TrabBone3D :: computePlasStrainEnerDensity(GaussPoint *gp, const FloatArrayF<6> &strain, const FloatArrayF<6> &stress) const
55{
56 auto status = static_cast< TrabBone3DStatus * >( this->giveStatus(gp) );
57
58 auto tsed = status->giveTSED();
59 auto &oldTotalDef = status->giveStrainVector();
60 auto &tempPlasDef = status->giveTempPlasDef();
61 auto &oldStress = status->giveTempStressVector();
62
63 auto elStrain = strain - tempPlasDef;
64 auto deltaStrain = strain - oldTotalDef;
65
66 auto tmpStress = stress + oldStress;
67
68 double tempESED = 0.5 * dot(elStrain, stress);
69 double tempTSED = tsed + 0.5 * dot(deltaStrain, tmpStress);
70 double tempPSED = tempTSED - tempESED;
71
72 status->setTempTSED(tempTSED);
73 status->setTempPSED(tempPSED);
74}
75
76
78TrabBone3D :: give3dMaterialStiffnessMatrix(MatResponseMode mode, GaussPoint *gp, TimeStep *tStep) const
79{
80 auto status = static_cast< TrabBone3DStatus * >( this->giveStatus(gp) );
81
82 if ( mode == ElasticStiffness ) {
83 auto compliance = this->constructAnisoComplTensor();
84 auto elasticity = inv(compliance);
85 return elasticity;
86 } else if ( mode == SecantStiffness ) {
87 if ( printflag ) {
88 printf("secant\n");
89 }
90
91 auto compliance = this->constructAnisoComplTensor();
92 auto elasticity = inv(compliance);
93 auto tempDam = status->giveTempDam();
94 return elasticity * (1.0 - tempDam);
95 } else /*if ( mode == TangentStiffness )*/ {
96 double kappa = status->giveKappa();
97 double tempKappa = status->giveTempKappa();
98 double tempDam = status->giveTempDam();
99
100 FloatMatrixF<6,6> answer;
101 if ( tempKappa > kappa ) {
102 // plastic loading
103 // Imports
104 auto &tempEffectiveStress = status->giveTempEffectiveStress();
105 auto &plasFlowDirec = status->givePlasFlowDirec();
106 auto &SSaTensor = status->giveSSaTensor();
107 auto beta = status->giveBeta();
108 // Construction of the dyadic product tensor
109 auto prodTensor = Tdot(SSaTensor, plasFlowDirec);
110 // Construction of the tangent stiffness third term
111 auto thirdTerm = dyad(tempEffectiveStress, prodTensor) * ((-expDam * critDam * exp(-expDam * tempKappa)) / beta);
112 // Construction of the tangent stiffness second term
113 auto tempTensor2 = dot(SSaTensor, plasFlowDirec);
114 auto secondTerm = dyad(tempTensor2, prodTensor) * (( 1.0 - tempDam ) / beta);
115 // Construction of the tangent stiffness
116 auto tangentMatrix = SSaTensor * (1.0 - tempDam) + secondTerm + thirdTerm;
117 answer = tangentMatrix;
118 } else {
119 // elastic behavior with damage
120 // Construction of the secant stiffness
121 auto compliance = this->constructAnisoComplTensor();
122 auto elasticity = inv(compliance);
123 answer = elasticity * (1.0 - tempDam);
124 }
125
126 double g = status->giveDensG();
127 if ( g <= 0. ) {
128 double factor = gammaL0 * pow(rho, rL) + gammaP0 *pow(rho, rP) * ( tDens - 1 ) * pow(g, tDens - 2);
129 // printf("densification");
130 answer += I6_I6 * factor;
131 }
132 return answer;
133 }
134}
135
136
137double
138TrabBone3D :: evaluateCurrentYieldStress(double kappa) const
139{
140 return ( 1. + plasHardFactor * ( 1.0 - exp(-kappa * expPlasHard) ) );
141}
142
143double
144TrabBone3D :: evaluateCurrentPlasticModulus(double kappa) const
145{
146 return ( plasHardFactor * expPlasHard * exp(-kappa * expPlasHard) );
147}
148
149
150double
151TrabBone3D :: evaluateCurrentViscousStress(const double deltaKappa, TimeStep *tStep) const
152{
153 double deltaT = tStep->giveTimeIncrement();
154 double answer;
155 if ( deltaT == 0 ) {
156 answer = 0;
157 } else {
158 answer = -viscosity * deltaKappa / deltaT;
159 }
160
161 return answer;
162}
163
164double
165TrabBone3D :: evaluateCurrentViscousModulus(double deltaKappa, TimeStep *tStep) const
166{
167 double deltaT = tStep->giveTimeIncrement();
168 double answer = -viscosity / deltaT;
169
170 return answer;
171}
172
173
174void
175TrabBone3D :: performPlasticityReturn(GaussPoint *gp, const FloatArrayF<6> &strain, TimeStep *tStep) const
176{
177 auto status = static_cast< TrabBone3DStatus * >( this->giveStatus(gp) );
178
179 // elastic compliance
180 auto compliance = this->constructAnisoComplTensor();
181 // elastic stiffness
182 auto elasticity = inv(compliance);
183
184 // this->constructAnisoStiffnessTensor(elasticity);
185 // initialize the plastic strain and cumulative plastic strain
186 // by values after the previous step
187 auto tempPlasDef = status->givePlasDef();
188 double tempKappa = status->giveKappa();
189 // evaluate the trial stress
190 auto trialEffectiveStress = dot(elasticity, strain - tempPlasDef);
191 auto tempEffectiveStress = trialEffectiveStress;
192 // apply the iterative procedure that solves the system of nonlinear equations
193 // consisting of the yield condition and discretized flow rule
194 // and evaluates:
195 // tempKappa ... cumulative plastic strain at the end of the substep
196 // tempEffectiveStress ... effective stress at the end of the substep
197 // tempPlasDef ... plastic strain at the end of the substep
198 bool convergence = projectOnYieldSurface(tempKappa, tempEffectiveStress, tempPlasDef, trialEffectiveStress, elasticity, compliance, status, tStep, gp, 0);
199 if ( convergence ) {
200 status->setTempPlasDef(tempPlasDef);
201 status->setTempKappa(tempKappa);
202 status->setTempEffectiveStress(tempEffectiveStress);
203 } else {
204 //printf("LineSearch \n");
205 tempEffectiveStress = trialEffectiveStress;
206 tempKappa = status->giveKappa();
207 tempPlasDef = status->givePlasDef();
208 convergence = projectOnYieldSurface(tempKappa, tempEffectiveStress, tempPlasDef, trialEffectiveStress, elasticity, compliance, status, tStep, gp, 1);
209 if ( !convergence ) {
210 OOFEM_ERROR("No convergence of the stress return algorithm in TrabBone3D :: performPlasticityReturn\n");
211 }
212
213 status->setTempPlasDef(tempPlasDef);
214 status->setTempKappa(tempKappa);
215 status->setTempEffectiveStress(tempEffectiveStress);
216 }
217}
218
219
220bool
221TrabBone3D :: projectOnYieldSurface(double &tempKappa, FloatArrayF<6> &tempEffectiveStress, FloatArrayF<6> &tempPlasDef, const FloatArrayF<6> &trialEffectiveStress, const FloatMatrixF<6,6> &elasticity, const FloatMatrixF<6,6> &compliance, TrabBone3DStatus *status, TimeStep *tStep, GaussPoint *gp, int lineSearchFlag) const
222{
223 bool convergence;
224
225 auto fabric = this->constructAnisoFabricTensor();
226 auto F = this->constructAnisoFtensor();
227
228 auto tempTensor2 = dot(fabric, trialEffectiveStress);
229 auto FS = dot(F, trialEffectiveStress);
230 auto SFS = sqrt( dot(trialEffectiveStress, tempTensor2) );
231 auto plasCriterion = SFS + FS - this->evaluateCurrentYieldStress(tempKappa);
232
233 int current_max_num_iter = this->max_num_iter;
234 if ( plasCriterion < rel_yield_tol ) {
235 // trial stress in elastic domain
236 convergence = true;
237 } else {
238 // return to the yield surface needed
239 // Initial valuesr
240 FloatArrayF<6> toSolveTensor;
241 double toSolveScalar = plasCriterion;
242 double errorF = plasCriterion;
243 double errorR = 0;
244 double deltaKappa = 0.;
245 auto SSaTensor = elasticity;
246 //auto [plastFloxDirec, norm] = this->constructPlasFlowDirec(fabric, F, tempEffectiveStress);
247 auto tmp = this->constructPlasFlowDirec(fabric, F, tempEffectiveStress);
248 auto plasFlowDirec = tmp.first;
249 double norm = tmp.second;
250 //auto tensorFF_S = dot(fabric, tempEffectiveStress); // FIXME: unusued in old code
251 /***********************************************************************************************/
252 double radialReturnFlag = lineSearchFlag;
253 if ( radialReturnFlag == 2 ) {
254 //printf("Radial return");
255 double k = tempKappa;
256 double f = plasCriterion;
257 double SFSr = sqrt( dot(trialEffectiveStress, tempTensor2) );
258 double FSr = dot(F, trialEffectiveStress);
259 auto normAdjust = this->constructNormAdjustTensor();
260 auto tempTensor2 = dot(compliance, trialEffectiveStress);
261 auto helpArray = dot(normAdjust, tempTensor2);
262 norm = sqrt( dot(tempTensor2, helpArray) );
263 double alfa = 1;
264 FloatArrayF<6> stress;
265 while ( fabs(f) > 1.e-12 ) {
266 double dSYdA = norm * this->evaluateCurrentPlasticModulus(k);
267 dSYdA *= -norm;
268 double denom = SFSr + FSr - dSYdA;
269 double dAlfa = -f / denom;
270 alfa += dAlfa;
271 stress = trialEffectiveStress * alfa;
272 k += ( 1 - alfa ) * norm;
273 f = evaluatePlasCriterion(fabric, F, stress, k, ( 1 - alfa ) * norm, tStep);
274 }
275
276 tempEffectiveStress = stress;
277 deltaKappa = k;
278 toSolveScalar = 0;
279
280 tmp = this->constructPlasFlowDirec(fabric, F, tempEffectiveStress);
281 plasFlowDirec = tmp.first;
282 norm = tmp.second;
283
284 if ( tempEffectiveStress.giveSize() != trialEffectiveStress.giveSize() ) {
285 printf( "tempS %d \n", tempEffectiveStress.giveSize() );
286 printf( "trial S %d \n", trialEffectiveStress.giveSize() );
287 }
288
289 toSolveTensor = dot( compliance, ( tempEffectiveStress - trialEffectiveStress ) ) + deltaKappa * plasFlowDirec;
290 // Construction of the derivative of the plastic flow
291 auto derivPlasFlowDirec = this->constructDerivativeOfPlasFlowDirec(fabric, F, tempEffectiveStress);
292 // Construction of the gradient Nabla_S of R and SSa tensor
293 SSaTensor = inv(derivPlasFlowDirec * deltaKappa + compliance);
294 }
295
296 /***********************************************************************************************/
297 // iteration loop - solution of a set of nonlinear equations
298 int flagLoop = 1;
299 do {
300 double plasModulus = evaluateCurrentPlasticModulus(tempKappa + deltaKappa);
301 double viscoModulus = evaluateCurrentViscousModulus(deltaKappa, tStep);
302 //*************************************
303 //Evaluation of the Recursive Equations
304 //*************************************
305 double beta = dot(plasFlowDirec, dot(SSaTensor, plasFlowDirec)) + ( plasModulus - viscoModulus ) / norm; //+ viscoModulus;
306 // Construction of the equation of Delta Kappa
307 auto tempScalar = dot(plasFlowDirec, dot(SSaTensor, toSolveTensor));
308 auto incKappa = ( toSolveScalar / norm - tempScalar ) / beta;
309 auto incTempEffectiveStress = dot(SSaTensor, plasFlowDirec * incKappa + toSolveTensor);
310
311 if ( lineSearchFlag == 1 ) {
312 current_max_num_iter = 4000;
313 double eta = 0.1;
314 beta = 25.e-4;
315 int jMax = 10;
316 double alfa = 1;
317 double M = ( errorR * errorR + errorF * errorF ) / 2;
318 double dM = -2 * M;
319 for ( int j = 0; ; ++j ) {
320 auto tempStress = incTempEffectiveStress * (-alfa) + tempEffectiveStress;
321 auto newDeltaKappa = deltaKappa + alfa * incKappa;
322 //*************************************
323 // Evaluation of the f and R
324 //*************************************
325 // Construction of the derivative of the plastic flow
326 auto derivPlasFlowDirec = this->constructDerivativeOfPlasFlowDirec(fabric, F, tempStress);
327
328 // Construction of the gradient Nabla_S of R and SSa tensor
329 SSaTensor = inv(derivPlasFlowDirec * newDeltaKappa + compliance);
330
331 // Evaluation of R
332 auto tmp = this->constructPlasFlowDirec(fabric, F, tempStress);
333 plasFlowDirec = tmp.first;
334 norm = tmp.second; // FIXME: unusued in old code
335
336 toSolveTensor = dot( compliance, ( tempStress - trialEffectiveStress ) ) + newDeltaKappa * plasFlowDirec;
337 // Evaluation of f
338 //auto SFS = sqrt( dot(tempStress, dot(fabric, tempStress)) ); // FIXME: was unused in old code
339 toSolveScalar = evaluatePlasCriterion(fabric, F, tempStress, tempKappa + newDeltaKappa, newDeltaKappa, tStep);
340 //*************************************
341 // Evaluation of the error
342 //*************************************
343 errorR = sqrt(dot(toSolveTensor, toSolveTensor));
344 errorF = fabs(toSolveScalar);
345 double newM = ( errorR * errorR + errorF * errorF ) / 2;
346 //check Goldstein's condition
347 //if(newM < M || j == jMax)
348 if ( newM < ( 1 - 2 * beta * alfa ) * M || j == jMax ) {
349 deltaKappa = newDeltaKappa;
350 tempEffectiveStress = tempStress;
351 break;
352 }
353
354 double alfa1 = eta * alfa;
355 double alfa2 = -alfa * alfa * dM / 2 / ( newM - M - alfa * dM );
356 alfa = alfa1;
357 if ( alfa1 < alfa2 ) {
358 alfa = alfa2;
359 }
360 }
361 } else {
363 deltaKappa += incKappa;
364 tempEffectiveStress -= incTempEffectiveStress;
365 //*************************************
366 // Evaluation of the f and R
367 //*************************************
368 // Construction of the derivative of the plastic flow
369 //auto derivPlasFlowDirec = this->constructDerivativeOfPlasFlowDirec(fabric, F, tempEffectiveStress); // FIXME: unused in old code
370
371 // Construction of the gradient Nabla_S of R and SSa tensor
372 //auto SSaTensor = inv(derivPlasFlowDirec * deltaKappa + compliance); // FIXME: unused in old code
373
374 // Evaluation of R
375 auto tmp = this->constructPlasFlowDirec(fabric, F, tempEffectiveStress);
376 plasFlowDirec = tmp.first;
377 norm = tmp.second;
378 toSolveTensor = dot( compliance, ( tempEffectiveStress - trialEffectiveStress ) ) + deltaKappa * plasFlowDirec;
379
380 // Evaluation of f
381 //auto SFS = sqrt( dot(tempEffectiveStress, dot(fabric, tempEffectiveStress)) ); // FIXME: was unsued in old code?
382 toSolveScalar = evaluatePlasCriterion(fabric, F, tempEffectiveStress, tempKappa + deltaKappa, deltaKappa, tStep);
383 //*************************************
384 // Evaluation of the error
385 //*************************************
386 errorR = sqrt(dot(toSolveTensor, toSolveTensor));
387 errorF = fabs(toSolveScalar);
388 }
389
390 if ( printflag ) {
391 printf(" %d %g %g %g %g\n", flagLoop, tempEffectiveStress.at(1), tempEffectiveStress.at(3), incKappa, deltaKappa);
392 }
393
394 flagLoop++;
395 convergence = ( fabs(errorF) < rel_yield_tol && errorR < strain_tol );
396 } while ( flagLoop <= current_max_num_iter && !convergence );
397
398 if ( convergence ) {
399 auto plasModulus = evaluateCurrentPlasticModulus(tempKappa + deltaKappa);
400 auto viscoModulus = evaluateCurrentViscousModulus(deltaKappa, tStep);
401 auto tempTensor2 = dot(SSaTensor, plasFlowDirec);
402 auto beta = dot(plasFlowDirec, tempTensor2) + ( plasModulus - viscoModulus ) / norm;
403 tempPlasDef += deltaKappa * plasFlowDirec;
404 tempKappa += deltaKappa;
405 status->setBeta(beta);
406 status->setPlasFlowDirec(plasFlowDirec);
407 status->setSSaTensor(SSaTensor);
408 }
409 }
410
411 return convergence;
412}
413
414std::pair<FloatArrayF<6>, double>
415TrabBone3D :: constructPlasFlowDirec(FloatMatrixF<6,6> &fabric, const FloatArrayF<6> &F, const FloatArrayF<6> &S) const
416{
417 auto FFS = dot(fabric, S);
418 // FS = dot(F, S);
419 double SFS = sqrt( dot(S, FFS) );
420 // scaling matrix
421 auto normAdjust = this->constructNormAdjustTensor();
422 //direction of Np
423 auto answer = F + FFS * (1. / SFS);
424 auto tempTensor2 = dot(normAdjust, answer);
425 //norm Np
426 double norm = sqrt( dot(answer, tempTensor2) );
427 //plastic flow
428 answer *= 1.0 / norm;
429
430 return {answer, norm};
431}
432
433
435TrabBone3D :: constructDerivativeOfPlasFlowDirec(const FloatMatrixF<6,6> &fabric, const FloatArrayF<6> &F, const FloatArrayF<6> &S) const
436{
437 // FIXME: unused in old code:
438 //auto FFS = dot(fabric, S);
439 //auto SFS = sqrt( dot(S, FFS) );
440 //auto SGS = pow(SFS, -3.);
441 //auto secondGradientOfG = dyad(FFS, FFS) * (-1. * SGS) + fabric * (1. / SFS);
442 //to gradientOfG = FFS * (1. / SFS) + F;
443 //auto h = norm(gradientOfG));
444 //auto gradientOfH = Tdot(secondGradientOfG, gradientOfG) * (1. / h);
445 //auto test = - dyad(gradientOfG, gradientOfH) + secondGradientOfG * (1./ h/.h);
446 //secondGradientOfG *= h;
448 auto FFS = dot(fabric, S);
449 auto SFS = sqrt( dot(S, FFS) );
450 // scaling matrix
451 auto normAdjust = this->constructNormAdjustTensor();
452 //norm
453 auto tempTensor2 = FFS * (1. / SFS) + F;
454 auto tempTensor21 = dot(normAdjust, tempTensor2);
455 //norm Np
456 auto norm = sqrt( dot(tempTensor2, tempTensor21) );
458 auto FSFS = dyad(FFS, FFS);
459 auto dNp = (FSFS * (-1. / SFS / SFS) + fabric) * (1. / SFS / norm);
461 auto FFSF = FFS * (1. / SFS) + F;
463 auto tempTensor4 = (FSFS * (-1. / SFS / SFS) + fabric) * (1. / SFS / norm);
464 tempTensor2 = dot(normAdjust, FFSF);
465 auto dNorm = dot(tempTensor4, tempTensor2);
467 tempTensor4 = dyad(FFSF, dNorm) * (-1. / norm / norm);
469 return dNp + tempTensor4;
470}
471
472double
473TrabBone3D :: evaluatePlasCriterion(const FloatMatrixF<6,6> &fabric, const FloatArrayF<6> &F, const FloatArrayF<6> &stress, double kappa, double deltaKappa, TimeStep *tStep) const
474{
475 auto FFS = dot(fabric, stress);
476 auto FS = dot(F, stress);
477 auto SFS = sqrt( dot(stress, FFS) );
478 return SFS + FS - evaluateCurrentYieldStress(kappa) + this->evaluateCurrentViscousStress(deltaKappa, tStep);
479}
480
481double
482TrabBone3D :: computeDamageParam(double tempKappa) const
483{
484 double tempDam;
485 if ( tempKappa > 0. ) {
486 tempDam = critDam * ( 1.0 - exp(-expDam * tempKappa) );
487 } else {
488 tempDam = 0.0;
489 }
490
491 return tempDam;
492}
493
494
495double
496TrabBone3D :: computeDamageParamPrime(double tempKappa) const
497{
498 return critDam * expDam * exp(-expDam * tempKappa);
499}
500//
501// END: FUNCTION FOR DAMAGE PARAMETER
503
504
506// BEGIN: FUNCTION FOR DAMAGE EVALUATION
507//
508
509double
510TrabBone3D :: computeDamage(GaussPoint *gp, TimeStep *tStep) const
511{
512 double tempKappa = computeCumPlastStrain( gp, tStep);
513 double tempDam = computeDamageParam(tempKappa);
514 if ( tempDam < 0 ) {
515 OOFEM_ERROR("negative damage");
516 }
517
518 return tempDam;
519}
520
521
522double TrabBone3D :: computeCumPlastStrain(GaussPoint *gp, TimeStep *tStep) const
523{
524 auto status = static_cast< TrabBone3DStatus * >( this->giveStatus(gp) );
525 return status->giveTempKappa();
526}
527
528
529
530FloatArrayF<6> TrabBone3D :: computeDensificationStress(GaussPoint *gp, const FloatArrayF<6> &strain, TimeStep *tStep) const
531{
532 auto status = static_cast< TrabBone3DStatus * >( this->giveStatus(gp) );
533
534 FloatArrayF<6> answer;
535 double traceLnU = ( strain.at(1) + strain.at(2) + strain.at(3) );
536 double g = traceLnU - densCrit;
537 status->setDensG(g);
538 if ( g <= 0 ) {
539 double factor = gammaL0 * pow(rho, rL) * g + gammaP0 *pow(rho, rP) * pow(g, tDens - 1);
540 answer.at(1) = answer.at(2) = answer.at(3) = factor;
541 }
542 return answer;
543}
544
545
547TrabBone3D :: giveRealStressVector_3d(const FloatArrayF<6> &strain, GaussPoint *gp,
548 TimeStep *tStep) const
549{
550 auto status = static_cast< TrabBone3DStatus * >( this->giveStatus(gp) );
551
552 this->initTempStatus(gp);
553 // compute effective stress using the plasticity model
554 this->performPlasticityReturn(gp, strain, tStep);
555
556 auto effStress = status->giveTempEffectiveStress();
557
558 // evaluate damage variable
559 double tempDam = computeDamage(gp, tStep);
560
561 // transform effective stress into nominal stress
562 auto stress = ( 1 - tempDam ) * effStress;
563
564 computePlasStrainEnerDensity(gp, strain, stress);
565
566 // add densification stress, if the densificator is activated
567 if ( densCrit != 0 ) {
568 stress += computeDensificationStress(gp, strain, tStep);
569 }
570
571 // store final damage, strain and stress in status
572 status->setTempDam(tempDam);
573 status->letTempStrainVectorBe(strain);
574 status->letTempStressVectorBe(stress);
575 return stress;
576}
577
578
580TrabBone3D :: constructAnisoComplTensor() const
581{
582 double m3 = 3. - m1 - m2;
583 double eps0k = eps0 * pow(rho, expk);
584 double mu0k = mu0 * pow(rho, expk);
585 double m1l = pow(m1, expl);
586 double m2l = pow(m2, expl);
587 double m3l = pow(m3, expl);
588
590
591 D.at(1, 1) = 1 / ( eps0k * m1l * m1l );
592 D.at(2, 2) = 1 / ( eps0k * m2l * m2l );
593 D.at(3, 3) = 1 / ( eps0k * m3l * m3l );
594 D.at(1, 2) = -nu0 / ( eps0k * m1l * m2l );
595 D.at(2, 1) = D.at(1, 2);
596 D.at(1, 3) = -nu0 / ( eps0k * m1l * m3l );
597 D.at(3, 1) = D.at(1, 3);
598 D.at(2, 3) = -nu0 / ( eps0k * m2l * m3l );
599 D.at(3, 2) = D.at(2, 3);
600 D.at(4, 4) = 1 / ( mu0k * m2l * m3l );
601 D.at(5, 5) = 1 / ( mu0k * m3l * m1l );
602 D.at(6, 6) = 1 / ( mu0k * m1l * m2l );
603
604#if 0
607 auto stiffness = inv(D);
608 auto TST = rotate(S, t);
609#endif
610
612 return rotate(D, T);
613}
614
615
617TrabBone3D :: constructAnisoStiffnessTensor() const
618{
619 double m3 = 3. - m1 - m2;
620 double eps0k = eps0 * pow(rho, expk);
621 double mu0k = mu0 * pow(rho, expk);
622 double m1l = pow(m1, expl);
623 double m2l = pow(m2, expl);
624 double m3l = pow(m3, expl);
625
626 double E1 = eps0k * m1l * m1l;
627 double E2 = eps0k * m2l * m2l;
628 double E3 = eps0k * m3l * m3l;
629
630 double G23 = mu0k * m2l * m3l;
631 double G13 = mu0k * m1l * m3l;
632 double G12 = mu0k * m1l * m2l;
633
634 double n23 = nu0 * m2l / m3l;
635 double n12 = nu0 * m1l / m2l;
636 double n31 = nu0 * m3l / m1l;
637 double n32 = nu0 * m3l / m2l;
638 double n21 = nu0 * m2l / m1l;
639 double n13 = nu0 * m1l / m3l;
640
641 double eksi = 1. - ( n12 * n21 + n23 * n32 + n31 * n13 ) - ( n12 * n23 * n31 + n21 * n32 * n13 );
642
644 // switched letters from original oofem -> now produces same material stiffness matrix as Abaqus method
645 D.at(1, 1) = E1 * ( 1. - n23 * n32 ) / eksi;
646 D.at(1, 2) = E2 * ( n12 + n13 * n32 ) / eksi;
647 D.at(1, 3) = E3 * ( n13 + n23 * n12 ) / eksi;
648 D.at(2, 2) = E2 * ( 1. - n13 * n31 ) / eksi;
649 D.at(2, 3) = E3 * ( n23 + n21 * n13 ) / eksi;
650 D.at(3, 3) = E3 * ( 1. - n21 * n12 ) / eksi;
651
652 // define the lower triangle
653 for ( int i = 1; i < 4; i++ ) {
654 for ( int j = 1; j < i; j++ ) {
655 D.at(i, j) = D.at(j, i);
656 }
657 }
658
659 D.at(4, 4) = G23;
660 D.at(5, 5) = G13;
661 D.at(6, 6) = G12;
662
664 return rotate(D, t);
665}
666
667
669TrabBone3D :: constructAnisoFabricTensor() const
670{
671 double S0 = ( sig0Pos + sig0Neg ) / ( 2. * sig0Pos * sig0Neg );
672 double rhoP = pow(rho, 2. * expp);
673 double m3 = 3. - m1 - m2;
674 double m1q = pow(m1, 2. * expq);
675 double m2q = pow(m2, 2. * expq);
676 double m3q = pow(m3, 2. * expq);
677
679 F.at(1, 1) = S0 * S0 / ( rhoP * m1q * m1q );
680 F.at(2, 2) = S0 * S0 / ( rhoP * m2q * m2q );
681 F.at(3, 3) = S0 * S0 / ( rhoP * m3q * m3q );
682 F.at(1, 2) = -chi0 * S0 * S0 / ( rhoP * m1q * m2q );
683 F.at(2, 1) = F.at(1, 2);
684 F.at(1, 3) = -chi0 * S0 * S0 / ( rhoP * m1q * m3q );
685 F.at(3, 1) = F.at(1, 3);
686 F.at(2, 3) = -chi0 * S0 * S0 / ( rhoP * m2q * m3q );
687 F.at(3, 2) = F.at(2, 3);
688 F.at(4, 4) = 1. / ( tau0 * tau0 * rhoP * m2q * m3q );
689 F.at(5, 5) = 1. / ( tau0 * tau0 * rhoP * m1q * m3q );
690 F.at(6, 6) = 1. / ( tau0 * tau0 * rhoP * m1q * m2q );
691
692 auto T = this->constructFabricTransformationMatrix();
693 return rotate(F, T);
694}
695
696
698TrabBone3D :: constructAnisoFtensor() const
699{
700 double rhoP = pow(rho, expp);
701 double m3 = 3. - m1 - m2;
702 double m1q = pow(m1, 2. * expq);
703 double m2q = pow(m2, 2. * expq);
704 double m3q = pow(m3, 2. * expq);
705
707 F.at(1) = -( sig0Pos - sig0Neg ) / ( 2. * sig0Pos * sig0Neg * rhoP * m1q );
708 F.at(2) = -( sig0Pos - sig0Neg ) / ( 2. * sig0Pos * sig0Neg * rhoP * m2q );
709 F.at(3) = -( sig0Pos - sig0Neg ) / ( 2. * sig0Pos * sig0Neg * rhoP * m3q );
710
712 return Tdot(T, F);
713}
714
715
717TrabBone3D :: constructStiffnessTransformationMatrix() const
718{
719 FloatMatrixF<6,6> answer;
720
721 answer.at(1, 1) = x1 * x1;
722 answer.at(1, 2) = x2 * x2;
723 answer.at(1, 3) = x3 * x3;
724 answer.at(1, 4) = x2 * x3;
725 answer.at(1, 5) = x1 * x3;
726 answer.at(1, 6) = x1 * x2;
727 //second row of pull back transformation matrix
728 answer.at(2, 1) = y1 * y1;
729 answer.at(2, 2) = y2 * y2;
730 answer.at(2, 3) = y3 * y3;
731 answer.at(2, 4) = y2 * y3;
732 answer.at(2, 5) = y1 * y3;
733 answer.at(2, 6) = y1 * y2;
734 //third row of pull back transformation matrix
735 answer.at(3, 1) = z1 * z1;
736 answer.at(3, 2) = z2 * z2;
737 answer.at(3, 3) = z3 * z3;
738 answer.at(3, 4) = z2 * z3;
739 answer.at(3, 5) = z1 * z3;
740 answer.at(3, 6) = z1 * z2;
741 //fourth row of pull back transformation matrix
742 answer.at(4, 1) = 2. * y1 * z1;
743 answer.at(4, 2) = 2. * y2 * z2;
744 answer.at(4, 3) = 2. * y3 * z3;
745 answer.at(4, 4) = ( y2 * z3 + y3 * z2 );
746 answer.at(4, 5) = ( y1 * z3 + y3 * z1 );
747 answer.at(4, 6) = ( y1 * z2 + y2 * z1 );
748 //fifth row of pull back transformation matrix
749 answer.at(5, 1) = 2. * x1 * z1;
750 answer.at(5, 2) = 2. * x2 * z2;
751 answer.at(5, 3) = 2. * x3 * z3;
752 answer.at(5, 4) = ( x2 * z3 + x3 * z2 );
753 answer.at(5, 5) = ( x1 * z3 + x3 * z1 );
754 answer.at(5, 6) = ( x1 * z2 + x2 * z1 );
755 //sixth row of pull back transformation matrix
756 answer.at(6, 1) = 2. * x1 * y1;
757 answer.at(6, 2) = 2. * x2 * y2;
758 answer.at(6, 3) = 2. * x3 * y3;
759 answer.at(6, 4) = ( x2 * y3 + x3 * y2 );
760 answer.at(6, 5) = ( x1 * y3 + x3 * y1 );
761 answer.at(6, 6) = ( x1 * y2 + x2 * y1 );
762
763 return answer;
764}
765
766
768TrabBone3D :: constructNormAdjustTensor() const
769{
770 FloatMatrixF<6,6> answer;
771
772 for ( int i = 1; i <= 3; i++ ) {
773 answer.at(i, i) = 1.;
774 }
775
776 for ( int i = 4; i <= 6; i++ ) {
777 answer.at(i, i) = 0.5;
778 }
779 return answer;
780}
781
782
783
785TrabBone3D :: constructFabricTransformationMatrix() const
786{
787 FloatMatrixF<6,6> answer;
788
789 answer.at(1, 1) = x1 * x1;
790 answer.at(1, 2) = x2 * x2;
791 answer.at(1, 3) = x3 * x3;
792 answer.at(1, 4) = 2 * x2 * x3; //2
793 answer.at(1, 5) = 2 * x1 * x3; //2
794 answer.at(1, 6) = 2 * x1 * x2; //2
795 //second row of pull back transformation matrix
796 answer.at(2, 1) = y1 * y1;
797 answer.at(2, 2) = y2 * y2;
798 answer.at(2, 3) = y3 * y3;
799 answer.at(2, 4) = 2 * y2 * y3; //2
800 answer.at(2, 5) = 2 * y1 * y3; //2
801 answer.at(2, 6) = 2 * y1 * y2; //2
802 //third row of pull back transformation matrix
803 answer.at(3, 1) = z1 * z1;
804 answer.at(3, 2) = z2 * z2;
805 answer.at(3, 3) = z3 * z3;
806 answer.at(3, 4) = 2 * z2 * z3; //2
807 answer.at(3, 5) = 2 * z1 * z3; //2
808 answer.at(3, 6) = 2 * z1 * z2; //2
809 //fourth row of pull back transformation matrix
810 answer.at(4, 1) = y1 * z1;
811 answer.at(4, 2) = y2 * z2;
812 answer.at(4, 3) = y3 * z3;
813 answer.at(4, 4) = ( y2 * z3 + y3 * z2 );
814 answer.at(4, 5) = ( y1 * z3 + y3 * z1 );
815 answer.at(4, 6) = ( y1 * z2 + y2 * z1 );
816 //fifth row of pull back transformation matrix
817 answer.at(5, 1) = x1 * z1;
818 answer.at(5, 2) = x2 * z2;
819 answer.at(5, 3) = x3 * z3;
820 answer.at(5, 4) = ( x2 * z3 + x3 * z2 );
821 answer.at(5, 5) = ( x1 * z3 + x3 * z1 );
822 answer.at(5, 6) = ( x1 * z2 + x2 * z1 );
823 //sixth row of pull back transformation matrix
824 answer.at(6, 1) = x1 * y1;
825 answer.at(6, 2) = x2 * y2;
826 answer.at(6, 3) = x3 * y3;
827 answer.at(6, 4) = ( x2 * y3 + x3 * y2 );
828 answer.at(6, 5) = ( x1 * y3 + x3 * y1 );
829 answer.at(6, 6) = ( x1 * y2 + x2 * y1 );
830
831 return answer;
832}
833
834void
835TrabBone3D :: initializeFrom(InputRecord &ir)
836{
837 StructuralMaterial :: initializeFrom(ir);
838
839 // Mandatory parameters
845
846
850
855
856
857
860
861
862
865
868
869 // evaluation of dependent parameter
870 chi0Neg = ( sig0Neg * sig0Neg ) / ( sig0Pos * sig0Pos ) * ( chi0Pos + 1 ) - 1;
871 chi0 = chi0Pos;
872
873 //local coordinate system
874 //x'
875 x1 = 1;
876 x2 = 0;
877 x3 = 0;
878 //y'
879 y1 = 0;
880 y2 = 1;
881 y3 = 0;
882
887
891
892 double normX = sqrt(x1 * x1 + x2 * x2 + x3 * x3);
893 x1 = x1 / normX;
894 x2 = x2 / normX;
895 x3 = x3 / normX;
896
897 //y'
898 double normY = sqrt(y1 * y1 + y2 * y2 + y3 * y3);
899 y1 = y1 / normY;
900 y2 = y2 / normY;
901 y3 = y3 / normY;
902 //z'
903 z1 = x2 * y3 - x3 * y2;
904 z2 = x3 * y1 - x1 * y3;
905 z3 = x1 * y2 - x2 * y1;
906 //viscosity parameter
907 viscosity = 0.0;
909
910 // optional control parameters for printing and convergence
911 printflag = 0;
913 max_num_iter = 100;
915 rel_yield_tol = 1.e-9;
917 strain_tol = 1.e-9;
919}
920
921
922
923int
924TrabBone3D :: giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep)
925{
926 auto status = static_cast< TrabBone3DStatus * >( this->giveStatus(gp) );
927 if ( type == IST_DamageScalar ) {
928 answer.resize(1);
929 answer.at(1) = status->giveTempDam();
930 return 1;
931 } else if ( type == IST_PlasticStrainTensor ) {
932 answer = status->giveTempPlasDef();
933 return 1;
934 } else if ( type == IST_MaxEquivalentStrainLevel ) {
935 answer.resize(1);
936 answer.at(1) = status->giveTempKappa();
937 return 1;
938 } else if ( type == IST_BoneVolumeFraction ) {
939 answer.resize(1);
940 answer.at(1) = rho;
941 return 1;
942 } else if ( type == IST_PlasStrainEnerDens ) {
943 answer.resize(1);
944 answer.at(1) = status->giveTempPSED();
945 return 1;
946 } else if ( type == IST_ElasStrainEnerDens ) {
947 answer.resize(1);
948 answer.at(1) = status->giveTempTSED() - status->giveTempPSED();
949 return 1;
950 } else if ( type == IST_TotalStrainEnerDens ) {
951 answer.resize(1);
952 answer.at(1) = status->giveTempTSED();
953 return 1;
954 } else {
955 return StructuralMaterial :: giveIPValue(answer, gp, type, tStep);
956 }
957}
958
959
960double TrabBone3D :: predictRelativeComputationalCost(GaussPoint *gp)
961{
962 auto status = static_cast< TrabBone3DStatus * >( this->giveStatus(gp) );
963
964 if ( status->giveTempDam() > 0.0 ) {
965 return 15.0;
966 } else {
967 return 1.0;
968 }
969}
970
971
972double TrabBone3D :: predictRelativeRedistributionCost(GaussPoint *gp)
973{
974 return 1.0;
975}
976
977
978
979TrabBone3DStatus :: TrabBone3DStatus(GaussPoint *g) : StructuralMaterialStatus(g)
980{
981}
982
983
984void
985TrabBone3DStatus :: printOutputAt(FILE *file, TimeStep *tStep) const
986{
987 StructuralMaterialStatus :: printOutputAt(file, tStep);
988 fprintf(file, "status { ");
989 fprintf( file, "plastrains: %f %f %f %f %f %f", this->plasDef.at(1), this->plasDef.at(2), this->plasDef.at(3), this->plasDef.at(4), this->plasDef.at(5), this->plasDef.at(6) );
990 fprintf(file, " , kappa %f , dam %f , esed %f , psed %f , tsed %f ", this->tempKappa, this->tempDam, this->tempTSED - this->tempPSED, this->tempPSED, this->tempTSED);
991 fprintf(file, "}\n");
992}
993
994
995void
996TrabBone3DStatus :: initTempStatus()
997{
998 StructuralMaterialStatus :: initTempStatus();
999 densG = 1;
1000 this->tempKappa = this->kappa;
1001 this->tempDam = this->dam;
1002 this->tempTSED = this->tsed;
1003 this->tempPlasDef = this->plasDef;
1004}
1005
1006
1007void
1008TrabBone3DStatus :: updateYourself(TimeStep *tStep)
1009{
1010 StructuralMaterialStatus :: updateYourself(tStep);
1011 this->kappa = this->tempKappa;
1012 this->dam = this->tempDam;
1013 this->tsed = this->tempTSED;
1014 this->plasDef = this->tempPlasDef;
1015}
1016
1017
1018void
1019TrabBone3DStatus :: saveContext(DataStream &stream, ContextMode mode)
1020{
1021 contextIOResultType iores;
1022
1023 // save parent class status
1024 StructuralMaterialStatus :: saveContext(stream, mode);
1025
1026 if ( ( iores = plasDef.storeYourself(stream) ) != CIO_OK ) {
1027 THROW_CIOERR(iores);
1028 }
1029
1030
1031 if ( !stream.write(dam) ) {
1033 }
1034
1035 if ( !stream.write(kappa) ) {
1037 }
1038
1039 if ( !stream.write(beta) ) {
1041 }
1042
1043 if ( ( iores = effectiveStress.storeYourself(stream) ) != CIO_OK ) {
1044 THROW_CIOERR(iores);
1045 }
1046
1047 if ( ( iores = plasFlowDirec.storeYourself(stream) ) != CIO_OK ) {
1048 THROW_CIOERR(iores);
1049 }
1050
1051 /*
1052 * if ( ( iores = smtrx.storeYourself(stream) ) != CIO_OK ) {
1053 * THROW_CIOERR(iores);
1054 * }
1055 * if ( ( iores = tangentMatrix.storeYourself(stream) ) != CIO_OK ) {
1056 * THROW_CIOERR(iores);
1057 * }
1058 * if ( ( iores = SSaTensor.storeYourself(stream) ) != CIO_OK ) {
1059 * THROW_CIOERR(iores);
1060 * }
1061 *
1062 * if ( ( iores = tempStrain.storeYourself(stream) ) != CIO_OK ) {
1063 * THROW_CIOERR(iores);
1064 * }
1065 */
1066}
1067
1068
1069void
1070TrabBone3DStatus :: restoreContext(DataStream &stream, ContextMode mode)
1071{
1072 contextIOResultType iores;
1073
1074 // read parent class status
1075 StructuralMaterialStatus :: restoreContext(stream, mode);
1076
1077 // read raw data
1078 if ( ( iores = plasDef.restoreYourself(stream) ) != CIO_OK ) {
1079 THROW_CIOERR(iores);
1080 }
1081
1082
1083 if ( !stream.read(dam) ) {
1085 }
1086
1087 if ( !stream.read(kappa) ) {
1089 }
1090
1091 if ( !stream.read(beta) ) {
1093 }
1094
1095
1096 if ( ( iores = effectiveStress.restoreYourself(stream) ) != CIO_OK ) {
1097 THROW_CIOERR(iores);
1098 }
1099
1100 if ( ( iores = plasFlowDirec.restoreYourself(stream) ) != CIO_OK ) {
1101 THROW_CIOERR(iores);
1102 }
1103
1104 /*
1105 * if ( ( iores = smtrx.restoreYourself(stream) ) != CIO_OK ) {
1106 * THROW_CIOERR(iores);
1107 * }
1108 * if ( ( iores = tangentMatrix.restoreYourself(stream) ) != CIO_OK ) {
1109 * THROW_CIOERR(iores);
1110 * }
1111 * if ( ( iores = SSaTensor.restoreYourself(stream) ) != CIO_OK ) {
1112 * THROW_CIOERR(iores);
1113 * }
1114 * if ( ( iores = tempStrain.restoreYourself(stream) ) != CIO_OK ) {
1115 * THROW_CIOERR(iores);
1116 * }
1117 */
1118}
1119
1120
1121std::unique_ptr<MaterialStatus> TrabBone3D :: CreateStatus(GaussPoint *gp) const
1122{
1123 return std::make_unique<TrabBone3DStatus>(gp);
1124}
1125} //end namespace oofem
#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.
double & at(std::size_t i)
int giveSize() const
Returns the size of receiver.
void resize(Index s)
Definition floatarray.C:94
double & at(Index i)
Definition floatarray.h:202
double at(std::size_t i, std::size_t j) const
virtual MaterialStatus * giveStatus(GaussPoint *gp) const
Definition material.C:206
virtual void initTempStatus(GaussPoint *gp) const
Definition material.C:221
StructuralMaterialStatus(GaussPoint *g)
Constructor. Creates new StructuralMaterialStatus with IntegrationPoint g.
StructuralMaterial(int n, Domain *d)
double giveTimeIncrement()
Returns solution step associated time increment.
Definition timestep.h:168
double densG
Densificator criterion.
Definition trabbone3d.h:118
FloatArrayF< 6 > plasDef
Definition trabbone3d.h:111
FloatArrayF< 6 > tempPlasDef
Definition trabbone3d.h:111
double giveTempKappa() const
Definition trabbone3d.h:126
FloatArrayF< 6 > effectiveStress
Definition trabbone3d.h:112
void setSSaTensor(const FloatMatrixF< 6, 6 > &ssa)
Definition trabbone3d.h:150
void setBeta(double be)
Definition trabbone3d.h:146
void setPlasFlowDirec(const FloatArrayF< 6 > &pfd)
Definition trabbone3d.h:149
double giveTSED() const
Definition trabbone3d.h:130
FloatArrayF< 6 > plasFlowDirec
Definition trabbone3d.h:113
FloatMatrixF< 6, 6 > constructAnisoComplTensor() const
Construct anisotropic compliance tensor.
Definition trabbone3d.C:580
double evaluateCurrentYieldStress(double kappa) const
Definition trabbone3d.C:138
std::pair< FloatArrayF< 6 >, double > constructPlasFlowDirec(FloatMatrixF< 6, 6 > &fabric, const FloatArrayF< 6 > &F, const FloatArrayF< 6 > &S) const
Definition trabbone3d.C:415
void computePlasStrainEnerDensity(GaussPoint *gp, const FloatArrayF< 6 > &strain, const FloatArrayF< 6 > &stress) const
Definition trabbone3d.C:54
double gammaL0
Densificator properties.
Definition trabbone3d.h:188
double evaluateCurrentPlasticModulus(double kappa) const
Definition trabbone3d.C:144
double x1
Local coordinate system.
Definition trabbone3d.h:184
FloatMatrixF< 6, 6 > constructNormAdjustTensor() const
Construct Tensor to adjust Norm.
Definition trabbone3d.C:768
double evaluateCurrentViscousStress(double deltaKappa, TimeStep *tStep) const
Definition trabbone3d.C:151
double evaluatePlasCriterion(const FloatMatrixF< 6, 6 > &fabric, const FloatArrayF< 6 > &F, const FloatArrayF< 6 > &stress, double kappa, double deltaKappa, TimeStep *tStep) const
Definition trabbone3d.C:473
double evaluateCurrentViscousModulus(double deltaKappa, TimeStep *tStep) const
Definition trabbone3d.C:165
virtual double computeCumPlastStrain(GaussPoint *gp, TimeStep *tStep) const
Definition trabbone3d.C:522
FloatMatrixF< 6, 6 > constructStiffnessTransformationMatrix() const
Definition trabbone3d.C:717
void performPlasticityReturn(GaussPoint *gp, const FloatArrayF< 6 > &strain, TimeStep *tStep) const
Definition trabbone3d.C:175
bool projectOnYieldSurface(double &tempKappa, FloatArrayF< 6 > &tempEffectiveStress, FloatArrayF< 6 > &tempPlasDef, const FloatArrayF< 6 > &trialEffectiveStress, const FloatMatrixF< 6, 6 > &elasticity, const FloatMatrixF< 6, 6 > &compliance, TrabBone3DStatus *status, TimeStep *tStep, GaussPoint *gp, int lineSearchFlag) const
Definition trabbone3d.C:221
double viscosity
Viscosity parameter.
Definition trabbone3d.h:190
FloatArrayF< 6 > constructAnisoFtensor() const
Definition trabbone3d.C:698
FloatMatrixF< 6, 6 > constructDerivativeOfPlasFlowDirec(const FloatMatrixF< 6, 6 > &fabric, const FloatArrayF< 6 > &F, const FloatArrayF< 6 > &S) const
Definition trabbone3d.C:435
double computeDamage(GaussPoint *gp, TimeStep *tStep) const
Definition trabbone3d.C:510
FloatArrayF< 6 > computeDensificationStress(GaussPoint *gp, const FloatArrayF< 6 > &totalStrain, TimeStep *tStep) const
Definition trabbone3d.C:530
double computeDamageParam(double kappa) const
Definition trabbone3d.C:482
FloatMatrixF< 6, 6 > constructFabricTransformationMatrix() const
Definition trabbone3d.C:785
FloatMatrixF< 6, 6 > constructAnisoFabricTensor() const
Construct anisotropic fabric tensor.
Definition trabbone3d.C:669
#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 S(p)
Definition mdm.C:469
long ContextMode
Definition contextmode.h:43
double norm(const FloatArray &x)
FloatMatrixF< N, P > Tdot(const FloatMatrixF< M, N > &a, const FloatMatrixF< M, P > &b)
Computes .
FloatMatrixF< N, M > dyad(const FloatArrayF< N > &a, const FloatArrayF< M > &b)
Computes the dyadic product .
const FloatMatrixF< 6, 6 > I6_I6
I(x)I expressed in Voigt form.
FloatMatrixF< M, M > rotate(FloatMatrixF< N, N > &a, const FloatMatrixF< N, M > &r)
Computes .
double dot(const FloatArray &x, const FloatArray &y)
FloatMatrixF< N, N > inv(const FloatMatrixF< N, N > &mat, double zeropiv=1e-24)
Computes the inverse.
@ CIO_IOERR
General IO error.
#define _IFT_TrabBone3D_m1
Definition trabbone3d.h:56
#define _IFT_TrabBone3D_strain_tol
Definition trabbone3d.h:93
#define _IFT_TrabBone3D_sig0Neg
Definition trabbone3d.h:61
#define _IFT_TrabBone3D_x1
Definition trabbone3d.h:73
#define _IFT_TrabBone3D_tau0
Definition trabbone3d.h:64
#define _IFT_TrabBone3D_max_num_iter
Definition trabbone3d.h:90
#define _IFT_TrabBone3D_expq
Definition trabbone3d.h:66
#define _IFT_TrabBone3D_expPlasHard
Definition trabbone3d.h:68
#define _IFT_TrabBone3D_y2
Definition trabbone3d.h:77
#define _IFT_TrabBone3D_rel_yield_tol
Definition trabbone3d.h:92
#define _IFT_TrabBone3D_mu0
Definition trabbone3d.h:52
#define _IFT_TrabBone3D_m2
Definition trabbone3d.h:57
#define _IFT_TrabBone3D_expDam
Definition trabbone3d.h:70
#define _IFT_TrabBone3D_critDam
Definition trabbone3d.h:71
#define _IFT_TrabBone3D_rho
Definition trabbone3d.h:58
#define _IFT_TrabBone3D_x3
Definition trabbone3d.h:75
#define _IFT_TrabBone3D_printflag
Definition trabbone3d.h:89
#define _IFT_TrabBone3D_eps0
Definition trabbone3d.h:50
#define _IFT_TrabBone3D_expk
Definition trabbone3d.h:53
#define _IFT_TrabBone3D_expp
Definition trabbone3d.h:65
#define _IFT_TrabBone3D_nu0
Definition trabbone3d.h:51
#define _IFT_TrabBone3D_plasHardFactor
Definition trabbone3d.h:67
#define _IFT_TrabBone3D_y3
Definition trabbone3d.h:78
#define _IFT_TrabBone3D_chi0Pos
Definition trabbone3d.h:62
#define _IFT_TrabBone3D_y1
Definition trabbone3d.h:76
#define _IFT_TrabBone3D_viscosity
Definition trabbone3d.h:80
#define _IFT_TrabBone3D_expl
Definition trabbone3d.h:54
#define _IFT_TrabBone3D_sig0Pos
Definition trabbone3d.h:60
#define _IFT_TrabBone3D_x2
Definition trabbone3d.h:74

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