OOFEM 3.0
Loading...
Searching...
No Matches
rcm2.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 "rcm2.h"
36#include "gausspoint.h"
37#include "floatmatrix.h"
38#include "floatarray.h"
39#include "contextioerr.h"
40#include "mathfem.h"
41
42#include <cstring>
43
44namespace oofem {
45#define rcm_STRESSRELERROR 1.e-5
46#define rcm_RESIDUALSTIFFFACTOR 1.e-3
47
48RCM2Material :: RCM2Material(int n, Domain *d) : StructuralMaterial(n, d)
49{
50}
51
52
53bool
54RCM2Material :: hasMaterialModeCapability(MaterialMode mode) const
55//
56// returns whether receiver supports given mode
57//
58{
59 return mode == _3dMat || mode == _PlaneStress ||
60 mode == _PlaneStrain || mode == _1dMat ||
61 mode == _PlateLayer || mode == _2dBeamLayer;
62}
63
64
65/*
66 * void
67 * RCM2Material :: computeTrialStressIncrement (FloatArray& answer, GaussPoint *gp,
68 * const FloatArray &strainIncrement,
69 * TimeStep* tStep)
70 * //
71 * // returns trial stress according to strainIncrement
72 * //
73 * {
74 * FloatMatrix def;
75 *
76 * this -> giveEffectiveMaterialStiffnessMatrix (def, TangentStiffness,gp,tStep);
77 * answer.beProductOf (def, strainIncrement);
78 * }
79 */
80
81
82void
83RCM2Material :: giveMaterialStiffnessMatrix(FloatMatrix &answer,
84 MatResponseMode mode,
85 GaussPoint *gp,
86 TimeStep *tStep) const
87//
88// computes full constitutive matrix for case of gp stress-strain state.
89//
90{
91 /*
92 * FloatMatrix *def;
93 * RCM2MaterialStatus *status =
94 * (RCM2MaterialStatus*) this -> giveStatus (gp);
95 *
96 * CrossSection *crossSection = gp -> giveElement()->giveCrossSection();
97 */
98 this->giveEffectiveMaterialStiffnessMatrix(answer, mode, gp, tStep);
99 // def is full matrix for current gp stress strain mode.
100}
101
102
103void
104RCM2Material :: giveRealStressVector(FloatArray &answer, GaussPoint *gp,
105 const FloatArray &totalStrain,
106 TimeStep *tStep) const
107//
108// returns real stress vector in 3d stress space of receiver according to
109// previous level of stress and current
110// strain increment, the only way, how to correctly update gp records
111//
112{
113 FloatArray princStress, reducedStressVector, reducedAnswer;
114 FloatArray reducedTotalStrainVector, principalStrain, strainVector;
115 FloatMatrix tempCrackDirs;
116 RCM2MaterialStatus *status = static_cast< RCM2MaterialStatus * >( this->giveStatus(gp) );
117
118 this->initTempStatus(gp);
119
120 // subtract stress independent part
121 // note: eigenStrains (temperature) is not contained in mechanical strain stored in gp
122 // therefore it is necessary to subtract always the total eigen strain value
123 this->giveStressDependentPartOfStrainVector(reducedTotalStrainVector, gp, totalStrain, tStep, VM_Total);
124 //
125
126 StructuralMaterial :: giveFullSymVectorForm( strainVector, reducedTotalStrainVector, gp->giveMaterialMode() );
127
128 tempCrackDirs = status->giveTempCrackDirs();
129 this->computePrincipalValDir(principalStrain, tempCrackDirs,
130 strainVector,
132
133 this->giveRealPrincipalStressVector3d(princStress, gp, principalStrain, tempCrackDirs, tStep);
134 princStress.resizeWithValues(6);
135
136 tempCrackDirs = status->giveTempCrackDirs();
137 answer = this->transformStressVectorTo(tempCrackDirs, princStress, 1);
138
139 status->letTempStrainVectorBe(totalStrain);
140 StructuralMaterial :: giveReducedSymVectorForm( reducedStressVector, answer, gp->giveMaterialMode() );
141 status->letTempStressVectorBe(reducedStressVector);
142 this->updateCrackStatus(gp, status->giveCrackStrainVector());
143
144 StructuralMaterial :: giveReducedSymVectorForm( reducedAnswer, answer, gp->giveMaterialMode() );
145 answer = reducedAnswer;
146}
147
148
149void
150RCM2Material :: giveRealPrincipalStressVector3d(FloatArray &answer, GaussPoint *gp,
151 FloatArray &principalStrain,
152 FloatMatrix &tempCrackDirs,
153 TimeStep *tStep) const
154//
155// returns real principal stress vector in 3d stress space of receiver according to
156// previous level of stress and current
157// strain increment, the only way, how to correctly update gp records
158// updates principal strain and stress of the receiver's status.
159//
160{
161 int ind;
162 double maxErr;
163 FloatArray crackStrainVector;
164 FloatArray strainIncrement, crackStrainIterativeIncrement;
165 FloatArray prevPrincipalStrain;
166 FloatArray dSigma;
167 FloatArray elastStrain, sigmaEl, sigmaCr(3);
168 FloatArray fullDSigma;
169 IntArray activatedCracks, crackMapping;
170 FloatMatrix dcr, de, decr, fullDecr, crackDirs;
171 RCM2MaterialStatus *status = static_cast< RCM2MaterialStatus * >( this->giveStatus(gp) );
172
173 /*
174 * // totalStressVector = gp -> giveStressVector()->GiveCopy();
175 * reducedTotalStrainVector = status -> giveStrainVector();
176 * reducedTotalStrainVector.add(fullStrainIncrement);
177 * crossSection->giveFullCharacteristicVector(totalStrainVector, gp, reducedTotalStrainVector);
178 * //delete reducedTotalStrainVector;
179 * // plasticStrainVector = status -> givePlasticStrainVector()->GiveCopy();
180 *
181 *
182 * // already cracked - next directions are determined
183 * // according to principal strain directions
184 * status->giveTempCrackDirs(tempCrackDirs);
185 * this->computePrincipalValDir (principalStrain, tempCrackDirs,
186 * totalStrainVector,
187 * principal_strain);
188 * status->letTempCrackDirsBe (tempCrackDirs);
189 */
190 crackStrainVector = status->giveCrackStrainVector(); // local one
191 crackDirs = status->giveCrackDirs();
192 if ( principalStrain.containsOnlyZeroes() ) {
193 // keep old principal values
194 status->letTempCrackDirsBe(crackDirs);
195 } else {
196 this->sortPrincDirAndValCloseTo(principalStrain,
197 tempCrackDirs, crackDirs);
198 status->letTempCrackDirsBe(tempCrackDirs);
199 }
200
201 // compute de in local system
202 // for iso materials no transformation if stiffness required
203 //
204 // local strain increment
205 prevPrincipalStrain = status->givePrevPrincStrainVector();
206 strainIncrement.beDifferenceOf(principalStrain, prevPrincipalStrain);
207 status->letPrincipalStrainVectorBe(principalStrain);
208
209 this->giveNormalElasticStiffnessMatrix(de, false, TangentStiffness,
210 gp, tStep, tempCrackDirs);
211 //
212 // construct mapping matrix of active cracks
213 // this mapping will dynamically change as
214 // some crack can unlo or reload
215 //
216 this->updateActiveCrackMap(gp);
217 crackMapping = status->giveCrackMap();
218 // start iteration until stress computed from elastic increment
219 // is equal to stress computed from cracking strain increment
220 // we do this computation in reduced stress strain space
221 dSigma.clear();
222 for ( int iter = 1; iter <= 20; iter++ ) {
223 //
224 // first check if already cracked
225 //
226 if ( status->giveNumberOfTempActiveCracks() ) {
227 // active crack exist
228 this->giveCrackedStiffnessMatrix(dcr, TangentStiffness, gp, tStep);
229 fullDecr = de;
230 fullDecr.add(dcr);
231 decr.resize( crackMapping.maximum(), crackMapping.maximum() );
232 decr.zero();
233 decr.assemble(fullDecr, crackMapping, crackMapping);
234
235 if ( dSigma.giveSize() == 0 ) {
236 fullDSigma.beProductOf(de, strainIncrement);
237 dSigma.resize( crackMapping.maximum() );
238 dSigma.zero();
239 dSigma.assemble(fullDSigma, crackMapping);
240 //dSigma.beSubArrayOf(fullDSigma, crackMapping); //@todo fix! used old version of method beSubArrayOf
241 }
242
243 decr.solveForRhs(dSigma, crackStrainIterativeIncrement);
244 for ( int i = 1; i <= 3; i++ ) {
245 if ( ( ind = crackMapping.at(i) ) ) {
246 crackStrainVector.at(i) += crackStrainIterativeIncrement.at(ind);
247 }
248 }
249
250 // check for crack closing, updates also cracking map
251 this->checkIfClosedCracks(gp, crackStrainVector, crackMapping);
252
253 // elastic strain component
254 elastStrain.beDifferenceOf(principalStrain, crackStrainVector);
255 sigmaEl.beProductOf(de, elastStrain);
256
257 // Stress in cracks
258 for ( int i = 1; i <= 3; i++ ) {
259 if ( crackMapping.at(i) ) {
260 sigmaCr.at(i) = giveNormalCrackingStress(gp, crackStrainVector.at(i), i);
261 }
262 }
263
264 // update status
265 status->letCrackStrainVectorBe(crackStrainVector);
266 } else {
267 //
268 // no active crack exist - elastic behaviour
269 //
270 elastStrain.beDifferenceOf(principalStrain, crackStrainVector);
271 sigmaEl.beProductOf(de, elastStrain);
272 sigmaCr.zero();
273 }
274
275 // check for new cracks
276 // and update crack map if necessary
277 // when we update map, we need to add new crack at end
278 // because sigmaCr is build
279 this->checkForNewActiveCracks(activatedCracks, gp, crackStrainVector,
280 sigmaEl, sigmaCr, principalStrain);
281 if ( activatedCracks.giveSize() ) {
282 // update crack map also
283 this->updateActiveCrackMap(gp, & activatedCracks);
284 crackMapping = status->giveCrackMap(); // update crackMap
285 }
286
287 //
288
289 // compute unbalanced stress
290 // dSigma = sigmaEl - sigmaCr for active cracks
291 fullDSigma = sigmaEl;
292 fullDSigma.subtract(sigmaCr);
293 //fullDSigma.printYourself();
294 //crackMapping.printYourself();
295
296 dSigma.resize( crackMapping.maximum() );
297 dSigma.zero();
298 dSigma.assemble(fullDSigma, crackMapping);
299 //dSigma.beSubArrayOf(fullDSigma, crackMapping); //@todo fix! used old version of method beSubArrayOf
300 if ( dSigma.giveSize() ) {
301 // fullDSigma.printYourself();
302 //crackMapping.printYourself();
303 //dSigma.printYourself();
304 }
305 //dSigma.printYourself();
306
307 // find max error in dSigma
308 // if max err < allovedErr -> stop iteration
309 // allowed Err is computed relative to Ft;
310
311 // check only for active cracks
312 maxErr = 0.;
313 for ( int i = 1; i <= dSigma.giveSize(); i++ ) {
314 if ( fabs( dSigma.at(i) ) > maxErr ) {
315 maxErr = fabs( dSigma.at(i) );
316 }
317 }
318
319 if ( maxErr < rcm_STRESSRELERROR * this->give(pscm_Ft, gp) ) {
320 status->letPrincipalStressVectorBe(sigmaEl);
321 answer = sigmaEl;
322 return;
323 }
324 } // loop
325
326 // convergence not reached
327 OOFEM_ERROR("convergence not reached");
328}
329
330
331void
332RCM2Material :: checkForNewActiveCracks(IntArray &answer, GaussPoint *gp,
333 const FloatArray &crackStrain,
334 const FloatArray &princStressVector,
335 FloatArray &crackStressVector,
336 const FloatArray &princStrainVector) const
337//
338// returns int_array flag showing if some crack
339// is newly activated or
340// closed crack is reopened
341// return 0 if no crack is activated or reactivated.
342// modifies crackStressVector for newly activated crack.
343//
344{
345 double initStress, Le = 0.0;
346 int upd, activationFlag = 0;
347 RCM2MaterialStatus *status = static_cast< RCM2MaterialStatus * >( this->giveStatus(gp) );
348 FloatArray localStress;
349 FloatMatrix tempCrackDirs;
350 const IntArray &crackMap = status->giveCrackMap();
351
352 answer.resize(3);
353 answer.zero();
354 localStress = princStressVector;
355 //
356 // local stress is updated according to reached local crack strain
357 //
358 for ( int i = 1; i <= 3; i++ ) { // loop over each possible crack plane
359 // test previous status of each possible crack plane
360 upd = 0;
361 IntArray indx;
362 StructuralMaterial :: giveVoigtSymVectorMask( indx, gp->giveMaterialMode() );
363 if ( crackMap.at(i) == 0 && indx.contains(i) ) {
364 if ( status->giveTempMaxCrackStrain(i) > 0. ) {
365 // if (status->giveTempCrackStatus()->at(i) != pscm_NONE) {
366 //
367 // previously cracked direction
368 //
369 initStress = 0.;
370 } else {
371 // newer cracked, so we compute principal stresses
372 // and compare them with reduced tension strength
373 // as a criterion for crack initiation
374
375 FloatArray crackPlaneNormal(3);
376 tempCrackDirs = status->giveTempCrackDirs();
377 for ( int j = 1; j <= 3; j++ ) {
378 crackPlaneNormal.at(j) = tempCrackDirs.at(j, i);
379 }
380
381 Le = this->giveCharacteristicElementLength(gp, crackPlaneNormal);
382 initStress = this->computeStrength(gp, Le);
383 upd = 1;
384 }
385
386 if ( localStress.at(i) > initStress ) {
387 crackStressVector.at(i) = initStress;
388 answer.at(i) = 1;
389 activationFlag = 1;
390 if ( upd ) {
391 this->updateStatusForNewCrack(gp, i, Le);
392 }
393 }
394 } // end of tested crack
395 } // end of loop over are possible directions
396
397 if ( activationFlag ) {
398 return;
399 }
400
401 answer.clear();
402}
403
404
405void
406RCM2Material :: updateStatusForNewCrack(GaussPoint *gp, int i, double Le) const
407//
408// updates gp status when new crack-plane i is formed with charLength Le
409// updates Le and computes and sets minEffStrainForFullyOpenCrack
410//
411{
412 RCM2MaterialStatus *status = static_cast< RCM2MaterialStatus * >( this->giveStatus(gp) );
413
414 if ( Le <= 0 ) {
415 OOFEM_ERROR("Element %d returned zero char length", gp->giveElement()->giveNumber() );
416 }
417
418 status->setCharLength(i, Le);
419 //status -> setMinCrackStrainsForFullyOpenCrack (i, this->giveMinCrackStrainsForFullyOpenCrack(gp,i));
420}
421
422double
423RCM2Material :: giveCharacteristicElementLength(GaussPoint *gp, const FloatArray &crackPlaneNormal) const
424{
425 return gp->giveElement()->giveCharacteristicLength(crackPlaneNormal);
426}
427
428void
429RCM2Material :: updateCrackStatus(GaussPoint *gp, const FloatArray &crackStrain) const
430//
431// updates gp records and MatStatus due to cracking.
432//
433// Updates MatStatus (its temporary variables) to current
434// reached status during integrating incremental constitutive relations
435// Temporary variables are used, because we may integrate constitutive
436// realtions many times for different strainIncrement in order to
437// reach equilibrium state, so we don't want to change other variables
438// which describing previously reached equlibrium. After a new equilibrium
439// is reached, this->updateYourself is called which invokes matStatus->
440// updateYourself(), which copies temporary variables to variables
441// describing equilibrium.
442//
443//
444{
445 double minCrackStrainsForFullyOpenCrack;
446 RCM2MaterialStatus *status = static_cast< RCM2MaterialStatus * >( this->giveStatus(gp) );
447 const IntArray &crackMap = status->giveCrackMap();
448
449 // check if material previously cracked
450 // and compute possible crack planes
451 // or if newer cracked, so we compute principal stresses
452 // (for iso mat. coincide with princ strains)
453 // and compare them with reduced tension strength
454 // as a criterion for crack initiation
455
456 // principalStrain = status->givePrincipalStrainVector();
457 // transform stresses to principal directions of strains
458 //
459 // local stress is updated according to reached local crack strain
460 //
461 IntArray indx;
462 StructuralMaterial :: giveVoigtSymVectorMask( indx, gp->giveMaterialMode() );
463 for ( int i = 1; i <= 3; i++ ) { // loop over each possible crack plane
464 if ( crackMap.at(i) != 0 && indx.contains(i) ) {
465 if ( status->giveTempMaxCrackStrain(i) < crackStrain.at(i) ) {
466 status->setTempMaxCrackStrain( i, crackStrain.at(i) );
467 }
468
469 minCrackStrainsForFullyOpenCrack = this->giveMinCrackStrainsForFullyOpenCrack(gp, i);
470 //if ((crackStrain.at(i) >= status->giveMinCrackStrainsForFullyOpenCrack(i)) &&
471 if ( ( crackStrain.at(i) >= minCrackStrainsForFullyOpenCrack ) &&
472 ( crackStrain.at(i) >= status->giveTempMaxCrackStrain(i) ) ) {
473 //
474 // fully open crack
475 //
476 status->setTempCrackStatus(i, pscm_OPEN);
477 } else if ( crackStrain.at(i) >= status->giveTempMaxCrackStrain(i) ) {
478 //
479 // further softening of crack
480 //
482 // status->giveTempReachedSofteningStress()->at(i) = localStress->at(i);
483 } else if ( crackStrain.at(i) <= 0. ) {
484 if ( status->giveTempCrackStatus(i) != pscm_NONE ) {
485 // previously active crack becomes closed
487 }
488 } else {
489 //
490 // crack unloading or reloading
491 //
493 }
494 } // end for possible direction
495 } // end loop over prin directions
496}
497
498
499void
500RCM2Material :: checkIfClosedCracks(GaussPoint *gp, FloatArray &crackStrainVector,
501 IntArray &crackMap) const
502//
503// Check if crack closing occurs
504// if yes updates crackStrainVector and gp-status accordingly
505//
506{
507 RCM2MaterialStatus *status = static_cast< RCM2MaterialStatus * >( this->giveStatus(gp) );
508 int isClosing = 0;
509
510 for ( int i = 1; i <= 3; i++ ) {
511 if ( crackMap.at(i) ) {
512 if ( crackStrainVector.at(i) < 0. ) {
513 // crack closing occur
514 crackStrainVector.at(i) = 0.;
515 crackMap.at(i) = 0;
516 // status->giveTempCrackStatus()->at(i) = pscm_CLOSED;
517 isClosing = 1;
518 }
519 }
520 }
521
522 status->letCrackMapBe(crackMap);
523 if ( isClosing ) {
524 this->updateActiveCrackMap(gp);
525 }
526
527 crackMap = status->giveCrackMap(); // update crack Map
528}
529
530
531void
532RCM2Material :: giveNormalElasticStiffnessMatrix(FloatMatrix &answer,
533 bool reduce, MatResponseMode rMode,
534 GaussPoint *gp, TimeStep *tStep,
535 const FloatMatrix &dir) const
536//
537// return Elastic Stiffness matrix for normal Stresses
538// taking into account the directions of normal stresses
539// (not supported now)
540//
541{
543 FloatMatrix de, fullAnswer(3, 3);
544 IntArray mask;
545 int sd;
546
547 FloatMatrix stiff;
548 lMat->giveStiffnessMatrix(stiff, rMode, gp, tStep);
549 this->giveFullSymMatrixForm( de, stiff, gp->giveMaterialMode() );
550
551 // copy first 3x3 submatrix to answer
552 for ( int i = 1; i <= 3; i++ ) {
553 for ( int j = 1; j <= 3; j++ ) {
554 fullAnswer.at(i, j) = de.at(i, j);
555 }
556 }
557
558 if ( !reduce ) { // 3x3 full form required
559 answer = fullAnswer;
560 } else {
561 // reduced form for only
562 // nonzero normal stresses
563 //
564 // first find spatial dimension of problem
565 sd = 0;
566
567 IntArray indx;
568 StructuralMaterial :: giveVoigtSymVectorMask( indx, gp->giveMaterialMode() );
569 for ( int i = 1; i <= 3; i++ ) {
570 if ( indx.contains(i) ) {
571 sd++;
572 }
573 }
574
575 answer.resize(sd, sd);
576 answer.zero();
577
578 // copy fullAnswer to reduced one
579 StructuralMaterial :: giveInvertedVoigtVectorMask( mask, gp->giveMaterialMode() );
580 for ( int i = 1; i <= sd; i++ ) {
581 int iidx = mask.findFirstIndexOf(i);
582 for ( int j = 1; j <= sd; j++ ) {
583 int jidx = mask.findFirstIndexOf(j);
584 if ( iidx && jidx ) {
585 answer.at(i, j) = fullAnswer.at(iidx, jidx);
586 }
587 }
588 }
589 }
590}
591
592
593void
594RCM2Material :: giveEffectiveMaterialStiffnessMatrix(FloatMatrix &answer,
595 MatResponseMode rMode, GaussPoint *gp,
596 TimeStep *tStep) const
597//
598// returns effective material stiffness matrix in full form
599// for gp stress strain mode
600//
601{
602 RCM2MaterialStatus *status = static_cast< RCM2MaterialStatus * >( this->giveStatus(gp) );
603 StructuralMaterial *lMat = static_cast< StructuralMaterial * >( this->giveLinearElasticMaterial() );
604 int numberOfActiveCracks = status->giveNumberOfTempActiveCracks();
605 int indi, indj, ii, jj;
606 double G, princStressDis, princStrainDis;
607 FloatMatrix de, invDe, compliance, dcr, d, df, t, tempCrackDirs;
608 FloatArray principalStressVector, principalStrainVector;
609 IntArray mask;
610
611 if ( ( rMode == ElasticStiffness ) || ( numberOfActiveCracks == 0 ) ) {
612 lMat->giveStiffnessMatrix(answer, rMode, gp, tStep);
613 return;
614 }
615
616 // this->updateActiveCrackMap(gp) must be done after restart.
617 this->updateActiveCrackMap(gp);
618 tempCrackDirs = status->giveTempCrackDirs();
619 this->giveNormalElasticStiffnessMatrix(de, true, rMode, gp, tStep,
620 tempCrackDirs);
621 invDe.beInverseOf(de);
622 this->giveCrackedStiffnessMatrix(dcr, rMode, gp, tStep);
623 StructuralMaterial :: giveVoigtSymVectorMask( mask, gp->giveMaterialMode() );
624 compliance.resize( mask.giveSize(), mask.giveSize() );
625
626 // we will set
627 // first we set compliances for normal streses in
628 // local coordinate system defined by crackplane
629 for ( int i = 1; i <= 3; i++ ) {
630 IntArray indx;
631 StructuralMaterial :: giveVoigtSymVectorMask( indx, gp->giveMaterialMode() );
632 if ( ( indi = indx.findFirstIndexOf(i) ) ) {
633 for ( int j = 1; j <= 3; j++ ) {
634 if ( ( indj = indx.findFirstIndexOf(j) ) ) {
635 compliance.at(indi, indj) += invDe.at(i, j);
636 }
637 }
638
639 if ( status->isCrackActive(i) ) {
640 if ( dcr.at(i, i) <= 1.e-8 ) {
641 compliance.at(indi, indi) *= rcm2_BIGNUMBER;
642 } else {
643 compliance.at(indi, indi) += 1. / dcr.at(i, i);
644 }
645 }
646 }
647 }
648
649 principalStressVector = status->getPrincipalStressVector();
650 principalStrainVector = status->getPrincipalStrainVector();
651
652 // now remain to set shears
653 G = this->give(pscm_G, gp);
654
655 IntArray indx;
656 StructuralMaterial :: giveVoigtSymVectorMask( indx, gp->giveMaterialMode() );
657 for ( int i = 4; i <= 6; i++ ) {
658 if ( ( indi = indx.findFirstIndexOf(i) ) ) {
659 if ( i == 4 ) {
660 ii = 2;
661 jj = 3;
662 } else if ( i == 5 ) {
663 ii = 1;
664 jj = 3;
665 } else {
666 ii = 1;
667 jj = 2;
668 }
669
670 princStressDis = principalStressVector.at(ii) -
671 principalStressVector.at(jj);
672 princStrainDis = principalStrainVector.at(ii) -
673 principalStrainVector.at(jj);
674 if ( fabs(princStrainDis) < rcm_SMALL_STRAIN ) {
675 compliance.at(indi, indi) = 1. / G;
676 } else if ( fabs(princStressDis) < 1.e-8 ) {
677 compliance.at(indi, indi) = rcm2_BIGNUMBER;
678 } else {
679 compliance.at(indi, indi) = 2 * princStrainDis / princStressDis;
680 }
681 }
682 }
683
684 // now we invert compliance to get stiffness in reduced space
685 d.beInverseOf(compliance);
686 // delete compliance;
687 //
688 // now let d to grow to Full Format
689 //
690 StructuralMaterial :: giveVoigtSymVectorMask( mask, gp->giveMaterialMode() );
691 df.resize(6, 6);
692 df.zero();
693 df.assemble(d, mask);
694 //
695 // final step - transform stiffnes to global c.s
696 //
697
698 t = this->giveStressVectorTranformationMtrx(tempCrackDirs, 1);
699 df.rotatedWith(t, 't');
700
701 StructuralMaterial :: giveReducedSymMatrixForm( answer, df, gp->giveMaterialMode() );
702}
703
704
705void
706RCM2Material :: giveCrackedStiffnessMatrix(FloatMatrix &answer,
707 MatResponseMode rMode,
708 GaussPoint *gp,
709 TimeStep *tStep) const
710//
711//
712// Returns material incremental stiffness matrix for cracked concrete.
713// This matrix is composed from submatrix, each of them corresponds to
714// one active crack in material point.
715// when constructing submatrix, following assumptions are made:
716//
717// A salient characteriastic of crack formation concerns the fact that in most general case
718// of tree-dimensional solid only 3 out of 6 components of the crack strain rate vector
719// are possibly non-zero.(the normal and two shear strain rates).
720// We therefore assume that the stress-strain law for the crack has a structure
721// such that the other strains rate components vanish. Moreover we assume that
722// the novanishing strain rate components are only related to corresponding
723// stress rate components (submatrix has dimensions 3x3).
724//
725// if strainIncrement is defined (not null) then we take care about possible unlo&reloading
726// we don't teke care about possible cracking (or non-linear softening) during strain increment
727// this correction is made in this -> updateCrackStatus (gp);
728{
729 RCM2MaterialStatus *status = static_cast< RCM2MaterialStatus * >( this->giveStatus(gp) );
730 int numberOfActiveCracks = status->giveNumberOfTempActiveCracks();
731 const IntArray &crackMap = status->giveCrackMap();
732 if ( numberOfActiveCracks == 0 ) {
733 answer.clear();
734 return;
735 }
736
737 answer.resize(3, 3);
738 answer.zero();
739
740 // loop over each active crack plane
741 for ( int i = 1; i <= 3; i++ ) {
742 if ( crackMap.at(i) ) {
743 // obtain incremental law for one crack
744 answer.at(i, i) = this->giveCrackingModulus(rMode, gp,
745 status->giveCrackStrain(i),
746 i);
747 }
748 }
749}
750
751
752void
753RCM2Material :: updateActiveCrackMap(GaussPoint *gp, const IntArray *activatedCracks) const
754//
755//
756// updates mapping matrix of active cracks
757//
758{
759 int indx = 1;
760 RCM2MaterialStatus *status = static_cast< RCM2MaterialStatus * >( this->giveStatus(gp) );
761 IntArray crackMap = status->giveCrackMap();
762
763 //if (crackMap == NULL) OOFEM_ERROR("NULL pointer encountered");
764
765 for ( int i = 1; i <= 3; i++ ) {
766 if ( status->isCrackActive(i) ) {
767 crackMap.at(i) = indx++;
768 } else if ( activatedCracks ) {
769 if ( ( activatedCracks->at(i) != 0 ) ) {
770 crackMap.at(i) = indx++;
771 }
772 } else {
773 crackMap.at(i) = 0;
774 }
775 }
776
777 // store modified map into status
778 status->letCrackMapBe(crackMap);
779}
780
781
782void
783RCM2Material :: initializeFrom(InputRecord &ir)
784{
787
788 return this->giveLinearElasticMaterial()->initializeFrom(ir);
789}
790
791double
792RCM2Material :: give(int aProperty, GaussPoint *gp) const
793// Returns the value of the property aProperty (e.g. the Young's modulus
794// 'E') of the receiver.
795{
796 double value = 0.0;
797
798 if ( aProperty == pscm_Gf ) {
799 return this->Gf;
800 }
801
802 // if (aProperty == pscm_Beta) return this->beta;
803 if ( aProperty == pscm_Ft ) {
804 return this->Ft;
805 }
806
807 if ( aProperty == pscm_Ee ) {
808 aProperty = 'E';
809 }
810
811 if ( aProperty == pscm_G ) {
812 aProperty = 'G';
813 }
814
815 if ( propertyDictionary.includes(aProperty) ) {
816 value = propertyDictionary.at(aProperty);
817 } else {
818 if ( linearElasticMaterial ) {
819 value = this->linearElasticMaterial->give(aProperty, gp);
820 } else {
821 OOFEM_ERROR("property not defined");
822 }
823 }
824
825 return value;
826}
827
828
829int
830RCM2Material :: giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep)
831{
832 RCM2MaterialStatus *status = static_cast< RCM2MaterialStatus * >( this->giveStatus(gp) );
833 if ( type == IST_CrackedFlag ) {
834 answer.resize(1);
835 answer.at(1) = status->giveAlreadyCrack();
836 return 1;
837 } else if ( type == IST_CrackDirs ) {
838 const FloatMatrix &help = status->giveCrackDirs();
839 answer.resize(9);
840 for ( int i = 1; i <= 3; i++ ) {
841 answer.at(i) = help.at(1, i);
842 answer.at(i + 3) = help.at(2, i);
843 answer.at(i + 6) = help.at(3, i);
844 }
845
846 return 1;
847 } else if ( type == IST_CrackStatuses ) {
848 const IntArray &crackStatus = status->giveCrackStatus();
849 answer.resize(3);
850 for ( int i = 1; i <= 3; i++ ) {
851 answer.at(i) = crackStatus.at(i);
852 }
853
854 return 1;
855
856 } else if ( type == IST_CrackWidth ) {
857 double width;
858 answer.resize(1);
859 answer.zero();
860
861 // MAX WIDTH
862 width = 0.;
863 for ( int i = 1; i <= status->giveNumberOfActiveCracks(); i++ ) {
864 width = max( width, status->giveCharLength(i) * status->giveCrackStrain(i) );
865 }
866 answer.at(1) = width;
867 return 1;
868
869 } else {
870 return StructuralMaterial :: giveIPValue(answer, gp, type, tStep);
871 }
872}
873
875RCM2Material :: give3dMaterialStiffnessMatrix(MatResponseMode mode,
876 GaussPoint *gp,
877 TimeStep *tStep) const
878{
879 FloatMatrix answer;
880 const_cast<RCM2Material*>(this)->giveMaterialStiffnessMatrix(answer, mode, gp, tStep);
881 return answer;
882}
883
884
886RCM2Material :: givePlaneStressStiffMtrx(MatResponseMode mode,
887 GaussPoint *gp,
888 TimeStep *tStep) const
889//
890// returns receiver's 2dPlaneStressMtrx
891// (2dPlaneStres ==> sigma_z = tau_xz = tau_yz = 0.)
892//
893// standard method from Material Class overloaded, because no inversion is needed.
894// the reduction from 3d case will not work
895// this implementation should be faster.
896{
897 FloatMatrix answer;
898 const_cast<RCM2Material*>(this)->giveMaterialStiffnessMatrix(answer, mode, gp, tStep);
899 return answer;
900}
901
902
904RCM2Material :: givePlaneStrainStiffMtrx(MatResponseMode mode,
905 GaussPoint *gp,
906 TimeStep *tStep) const
907
908//
909// return receiver's 2dPlaneStrainMtrx constructed from
910// general 3dMatrialStiffnessMatrix
911// (2dPlaneStrain ==> eps_z = gamma_xz = gamma_yz = 0.)
912//
913{
915 FloatMatrix answer;
916 const_cast<RCM2Material*>(this)->giveMaterialStiffnessMatrix(answer, mode, gp, tStep);
917 return answer;
918}
919
920
922RCM2Material :: give1dStressStiffMtrx(MatResponseMode mode,
923 GaussPoint *gp,
924 TimeStep *tStep) const
925
926//
927// returns receiver's 1dMaterialStiffnessMAtrix
928// (1d case ==> sigma_y = sigma_z = tau_yz = tau_zx = tau_xy = 0.)
929{
931 FloatMatrix answer;
932 const_cast<RCM2Material*>(this)->giveMaterialStiffnessMatrix(answer, mode, gp, tStep);
933 return answer;
934}
935
936
938RCM2Material :: give2dBeamLayerStiffMtrx(MatResponseMode mode,
939 GaussPoint *gp,
940 TimeStep *tStep) const
941//
942// returns receiver's 2dBeamLayerStiffMtrx.
943// (2dPlaneStres ==> sigma_z = tau_xz = tau_yz = 0.)
944//
945// standard method from Material Class overloaded, because no inversion is needed.
946// the reduction from 3d case will not work
947// this implementation should be faster.
948{
950 FloatMatrix answer;
951 const_cast<RCM2Material*>(this)->giveMaterialStiffnessMatrix(answer, mode, gp, tStep);
952 return answer;
953}
954
955
957RCM2Material :: givePlateLayerStiffMtrx(MatResponseMode mode,
958 GaussPoint *gp,
959 TimeStep *tStep) const
960//
961// returns receiver's 2dPlateLayerMtrx
962// (2dPlaneStres ==> sigma_z = tau_xz = tau_yz = 0.)
963//
964// standard method from Material Class overloaded, because no inversion is needed.
965// the reduction from 3d case will not work
966// this implementation should be faster.
967{
969 FloatMatrix answer;
970 const_cast<RCM2Material*>(this)->giveMaterialStiffnessMatrix(answer, mode, gp, tStep);
971 return answer;
972}
973
974
975
976
977RCM2MaterialStatus :: RCM2MaterialStatus(GaussPoint *g) :
981 //minEffStrainsForFullyOpenCrack(3),
984{
985 for ( int i = 1; i <= 3; i++ ) {
986 crackDirs.at(i, i) = tempCrackDirs.at(i, i) = 1.0;
987 }
988}
989
990
991int
992RCM2MaterialStatus :: isCrackActive(int i) const
993//
994// return nonzero if crack is active
995//
996{
997 if ( crackStrainVector.at(i) > 0. ) {
998 return 1;
999 }
1000
1001 // handle situation for new crack with crackStrainVector->at(i) = 0.
1002 if ( crackMap.at(i) ) {
1003 return 1;
1004 }
1005
1006 return 0;
1007}
1008
1009void
1010RCM2MaterialStatus :: printOutputAt(FILE *file, TimeStep *tStep) const
1011{
1012 char s [ 11 ];
1013
1014 StructuralMaterialStatus :: printOutputAt(file, tStep);
1015 fprintf(file, "status { ");
1016 if ( this->giveTempAlreadyCrack() ) {
1017 for ( int i = 1; i <= 3; i++ ) {
1018 switch ( crackStatuses.at(i) ) {
1019 case pscm_NONE:
1020 strcpy(s, "NONE");
1021 break;
1022 case pscm_OPEN:
1023 strcpy(s, "OPEN");
1024 break;
1025 case pscm_SOFTENING:
1026 strcpy(s, "SOFTENING");
1027 break;
1028 case pscm_RELOADING:
1029 strcpy(s, "RELOADING");
1030 break;
1031 case pscm_UNLOADING:
1032 strcpy(s, "UNLOADING");
1033 break;
1034 default:
1035 strcpy(s, "UNKNOWN");
1036 break;
1037 }
1038
1039 fprintf( file, "crack %d {status %s, normal to crackplane { %f %f %f }} ",
1040 i, s, crackDirs.at(1, i), crackDirs.at(2, i), crackDirs.at(3, i) );
1041 }
1042 }
1043
1044 fprintf(file, "}\n");
1045}
1046
1047int
1048RCM2MaterialStatus :: giveNumberOfActiveCracks() const
1049//
1050// return number of active cracks, computed upon CrackStatus
1051//
1052{
1053 int answer = 0;
1054
1055 for ( int i = 1; i <= 3; i++ ) {
1056 if ( oldCrackStrainVector.at(i) > 0. ) {
1057 answer++;
1058 }
1059 }
1060
1061 return answer;
1062}
1063
1064
1065int
1066RCM2MaterialStatus :: giveNumberOfTempActiveCracks() const
1067//
1068// return number of active cracks, computed upon tempCrackStatus
1069//
1070{
1071 int answer = 0;
1072
1073 for ( int i = 1; i <= 3; i++ ) {
1074 if ( isCrackActive(i) ) {
1075 answer++;
1076 }
1077 }
1078
1079 return answer;
1080}
1081
1082
1083
1084void
1085RCM2MaterialStatus :: initTempStatus()
1086//
1087// initializes temp variables according to variables form previous equlibrium state.
1088// builds new crackMap
1089//
1090{
1091 StructuralMaterialStatus :: initTempStatus();
1092
1097
1100
1101 for ( int i = 1; i <= 3; i++ ) {
1102 crackMap.at(i) = 0;
1103 }
1104}
1105
1106
1107
1108void
1109RCM2MaterialStatus :: updateYourself(TimeStep *tStep)
1110//
1111// updates variables (nonTemp variables describing situation at previous equilibrium state)
1112// after a new equilibrium state has been reached
1113// temporary variables are having values corresponding to newly reched equilibrium.
1114//
1115{
1116 StructuralMaterialStatus :: updateYourself(tStep);
1117
1122
1125}
1126
1127
1128
1129void
1130RCM2MaterialStatus :: saveContext(DataStream &stream, ContextMode mode)
1131{
1132 StructuralMaterialStatus :: saveContext(stream, mode);
1133
1134 contextIOResultType iores;
1135 if ( ( iores = crackStatuses.storeYourself(stream) ) != CIO_OK ) {
1136 THROW_CIOERR(iores);
1137 }
1138
1139 if ( ( iores = maxCrackStrains.storeYourself(stream) ) != CIO_OK ) {
1140 THROW_CIOERR(iores);
1141 }
1142
1143 if ( ( iores = crackDirs.storeYourself(stream) ) != CIO_OK ) {
1144 THROW_CIOERR(iores);
1145 }
1146
1147 //if ((iores = minEffStrainsForFullyOpenCrack.storeYourself(stream)) != CIO_OK) THROW_CIOERR(iores);
1148 if ( ( iores = charLengths.storeYourself(stream) ) != CIO_OK ) {
1149 THROW_CIOERR(iores);
1150 }
1151
1152 if ( ( iores = crackStrainVector.storeYourself(stream) ) != CIO_OK ) {
1153 THROW_CIOERR(iores);
1154 }
1155
1156 if ( ( iores = oldCrackStrainVector.storeYourself(stream) ) != CIO_OK ) {
1157 THROW_CIOERR(iores);
1158 }
1159
1160 if ( ( iores = oldPrincipalStrain.storeYourself(stream) ) != CIO_OK ) {
1161 THROW_CIOERR(iores);
1162 }
1163
1164 if ( ( iores = principalStrain.storeYourself(stream) ) != CIO_OK ) {
1165 THROW_CIOERR(iores);
1166 }
1167
1168 if ( ( iores = oldPrincipalStress.storeYourself(stream) ) != CIO_OK ) {
1169 THROW_CIOERR(iores);
1170 }
1171
1172 if ( ( iores = principalStress.storeYourself(stream) ) != CIO_OK ) {
1173 THROW_CIOERR(iores);
1174 }
1175
1176 if ( ( iores = crackMap.storeYourself(stream) ) != CIO_OK ) {
1177 THROW_CIOERR(iores);
1178 }
1179}
1180
1181void
1182RCM2MaterialStatus :: restoreContext(DataStream &stream, ContextMode mode)
1183{
1184 StructuralMaterialStatus :: restoreContext(stream, mode);
1185
1186 contextIOResultType iores;
1187 if ( ( iores = crackStatuses.restoreYourself(stream) ) != CIO_OK ) {
1188 THROW_CIOERR(iores);
1189 }
1190
1191 if ( ( iores = maxCrackStrains.restoreYourself(stream) ) != CIO_OK ) {
1192 THROW_CIOERR(iores);
1193 }
1194
1195 if ( ( iores = crackDirs.restoreYourself(stream) ) != CIO_OK ) {
1196 THROW_CIOERR(iores);
1197 }
1198
1199 //if ((iores = minEffStrainsForFullyOpenCrack.restoreYourself(stream)) != CIO_OK) THROW_CIOERR(iores);
1200 if ( ( iores = charLengths.restoreYourself(stream) ) != CIO_OK ) {
1201 THROW_CIOERR(iores);
1202 }
1203
1204 if ( ( iores = crackStrainVector.restoreYourself(stream) ) != CIO_OK ) {
1205 THROW_CIOERR(iores);
1206 }
1207
1208 if ( ( iores = oldCrackStrainVector.restoreYourself(stream) ) != CIO_OK ) {
1209 THROW_CIOERR(iores);
1210 }
1211
1212 if ( ( iores = oldPrincipalStrain.restoreYourself(stream) ) != CIO_OK ) {
1213 THROW_CIOERR(iores);
1214 }
1215
1216 if ( ( iores = principalStrain.restoreYourself(stream) ) != CIO_OK ) {
1217 THROW_CIOERR(iores);
1218 }
1219
1220 if ( ( iores = oldPrincipalStress.restoreYourself(stream) ) != CIO_OK ) {
1221 THROW_CIOERR(iores);
1222 }
1223
1224 if ( ( iores = principalStress.restoreYourself(stream) ) != CIO_OK ) {
1225 THROW_CIOERR(iores);
1226 }
1227
1228 if ( ( iores = crackMap.restoreYourself(stream) ) != CIO_OK ) {
1229 THROW_CIOERR(iores);
1230 }
1231}
1232} // end namespace oofem
virtual double giveCharacteristicLength(const FloatArray &normalToCrackPlane)
Definition element.h:938
void assemble(const FloatArray &fe, const IntArray &loc)
Definition floatarray.C:616
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 resizeWithValues(Index s, std::size_t allocChunk=0)
Definition floatarray.C:103
void beDifferenceOf(const FloatArray &a, const FloatArray &b)
Definition floatarray.C:403
void zero()
Zeroes all coefficients of receiver.
Definition floatarray.C:683
void beProductOf(const FloatMatrix &aMatrix, const FloatArray &anArray)
Definition floatarray.C:689
void subtract(const FloatArray &src)
Definition floatarray.C:320
void rotatedWith(const FloatMatrix &r, char mode='n')
void add(const FloatMatrix &a)
void resize(Index rows, Index cols)
Definition floatmatrix.C:79
void zero()
Zeroes all coefficient of receiver.
bool beInverseOf(const FloatMatrix &src)
void assemble(const FloatMatrix &src, const IntArray &loc)
double at(std::size_t i, std::size_t j) const
bool solveForRhs(const FloatArray &b, FloatArray &answer, bool transpose=false)
Element * giveElement()
Returns corresponding element to receiver.
Definition gausspoint.h:187
int maximum() const
Definition intarray.C:144
void resize(int n)
Definition intarray.C:73
bool contains(int value) const
Definition intarray.h:292
int findFirstIndexOf(int value) const
Definition intarray.C:280
int & at(std::size_t i)
Definition intarray.h:104
int giveSize() const
Definition intarray.h:211
virtual MaterialStatus * giveStatus(GaussPoint *gp) const
Definition material.C:206
Dictionary propertyDictionary
Definition material.h:107
virtual void initTempStatus(GaussPoint *gp) const
Definition material.C:221
virtual int giveNumberOfTempActiveCracks() const
Definition rcm2.C:1066
const IntArray & giveCrackMap() const
Definition rcm2.h:115
const IntArray & giveTempCrackStatus()
Definition rcm2.h:130
IntArray crackStatuses
One value from (pscm_NONE, pscm_OPEN, pscm_SOFTENING, pscm_RELOADING, pscm_UNLOADING,...
Definition rcm2.h:81
double giveCrackStrain(int icrack) const
Definition rcm2.h:135
virtual int giveNumberOfActiveCracks() const
Definition rcm2.C:1048
FloatArray crackStrainVector
Components of crack strain vector.
Definition rcm2.h:85
const FloatArray & getPrincipalStressVector() const
Definition rcm2.h:109
FloatArray principalStress
Definition rcm2.h:100
int giveTempAlreadyCrack() const
Definition rcm2.h:120
const FloatArray & getPrincipalStrainVector() const
Definition rcm2.h:108
const FloatArray & giveCrackStrainVector() const
Definition rcm2.h:134
void setTempCrackStatus(int icrack, int val)
Definition rcm2.h:132
FloatArray oldPrincipalStrain
Definition rcm2.h:99
double giveTempMaxCrackStrain(int icrack)
Definition rcm2.h:128
const FloatMatrix & giveCrackDirs()
Definition rcm2.h:150
FloatMatrix crackDirs
Storing direction of cracks in columwise format.
Definition rcm2.h:87
double giveCharLength(int icrack) const
Definition rcm2.h:140
FloatMatrix tempCrackDirs
Definition rcm2.h:87
void setCharLength(int icrack, double val)
Definition rcm2.h:147
FloatArray charLengths
Definition rcm2.h:89
const FloatMatrix & giveTempCrackDirs()
Definition rcm2.h:125
FloatArray maxCrackStrains
Max crack strain reached.
Definition rcm2.h:83
void letCrackStrainVectorBe(FloatArray a)
Definition rcm2.h:137
FloatArray oldCrackStrainVector
Definition rcm2.h:85
void letTempCrackDirsBe(FloatMatrix a)
Definition rcm2.h:126
IntArray tempCrackStatuses
Definition rcm2.h:81
FloatArray oldPrincipalStress
Definition rcm2.h:100
const FloatArray & givePrevPrincStrainVector() const
Definition rcm2.h:110
void letPrincipalStressVectorBe(FloatArray pv)
Definition rcm2.h:113
void letCrackMapBe(IntArray map)
Definition rcm2.h:116
virtual int isCrackActive(int i) const
Definition rcm2.C:992
int giveAlreadyCrack() const
Definition rcm2.h:152
void setTempMaxCrackStrain(int icrack, double val)
Definition rcm2.h:129
FloatArray principalStrain
Definition rcm2.h:99
const IntArray & giveCrackStatus()
Definition rcm2.h:151
FloatArray tempMaxCrackStrains
Definition rcm2.h:83
void letPrincipalStrainVectorBe(FloatArray pv)
Definition rcm2.h:112
virtual void giveEffectiveMaterialStiffnessMatrix(FloatMatrix &answer, MatResponseMode rMode, GaussPoint *gp, TimeStep *tStep) const
Definition rcm2.C:594
virtual double giveNormalCrackingStress(GaussPoint *gp, double eps_cr, int i) const =0
virtual double giveCharacteristicElementLength(GaussPoint *gp, const FloatArray &crackPlaneNormal) const
Definition rcm2.C:423
void giveRealPrincipalStressVector3d(FloatArray &answer, GaussPoint *, FloatArray &, FloatMatrix &, TimeStep *) const
Definition rcm2.C:150
void giveCrackedStiffnessMatrix(FloatMatrix &answer, MatResponseMode rMode, GaussPoint *gp, TimeStep *tStep) const
Definition rcm2.C:706
LinearElasticMaterial * linearElasticMaterial
Definition rcm2.h:178
virtual double computeStrength(GaussPoint *gp, double) const =0
RCM2Material(int n, Domain *d)
Definition rcm2.C:48
double give(int aProperty, GaussPoint *gp) const override
Definition rcm2.C:792
virtual void checkIfClosedCracks(GaussPoint *gp, FloatArray &crackStrainVector, IntArray &) const
Definition rcm2.C:500
void updateActiveCrackMap(GaussPoint *gp, const IntArray *activatedCracks=NULL) const
Definition rcm2.C:753
virtual double giveMinCrackStrainsForFullyOpenCrack(GaussPoint *gp, int i) const =0
virtual double giveCrackingModulus(MatResponseMode rMode, GaussPoint *gp, double effStrain, int i) const
Definition rcm2.h:257
LinearElasticMaterial * giveLinearElasticMaterial() const
Definition rcm2.h:193
void giveNormalElasticStiffnessMatrix(FloatMatrix &answer, bool reduce, MatResponseMode, GaussPoint *, TimeStep *tStep, const FloatMatrix &) const
Definition rcm2.C:532
virtual void checkForNewActiveCracks(IntArray &answer, GaussPoint *gp, const FloatArray &, const FloatArray &, FloatArray &, const FloatArray &) const
Definition rcm2.C:332
virtual void updateCrackStatus(GaussPoint *gp, const FloatArray &crackStrain) const
Definition rcm2.C:429
virtual void giveMaterialStiffnessMatrix(FloatMatrix &answer, MatResponseMode, GaussPoint *gp, TimeStep *tStep) const
Definition rcm2.C:83
virtual void updateStatusForNewCrack(GaussPoint *, int, double) const
Definition rcm2.C:406
StructuralMaterialStatus(GaussPoint *g)
Constructor. Creates new StructuralMaterialStatus with IntegrationPoint g.
void letTempStressVectorBe(const FloatArray &v)
Assigns tempStressVector to given vector v.
void letTempStrainVectorBe(const FloatArray &v)
Assigns tempStrainVector to given vector v.
static void giveFullSymMatrixForm(FloatMatrix &answer, const FloatMatrix &red, MaterialMode matMode)
Converts the full unsymmetric Voigt matrix (4th order tensor) to reduced form.
static FloatMatrixF< 6, 6 > giveStressVectorTranformationMtrx(const FloatMatrixF< 3, 3 > &base, bool transpose=false)
StructuralMaterial(int n, Domain *d)
virtual void giveStiffnessMatrix(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep) const
static void sortPrincDirAndValCloseTo(FloatArray &pVal, FloatMatrix &pDir, const FloatMatrix &toPDir)
static void computePrincipalValDir(FloatArray &answer, FloatMatrix &dir, const FloatArray &s, stressStrainPrincMode mode)
void giveStressDependentPartOfStrainVector(FloatArray &answer, GaussPoint *gp, const FloatArray &reducedStrainVector, TimeStep *tStep, ValueModeType mode) const
static FloatArrayF< 6 > transformStressVectorTo(const FloatMatrixF< 3, 3 > &base, const FloatArrayF< 6 > &stress, bool transpose=false)
#define THROW_CIOERR(e)
#define OOFEM_ERROR(...)
Definition error.h:79
#define pscm_NONE
Definition fcm.h:56
#define pscm_CLOSED
Definition fcm.h:60
#define pscm_SOFTENING
Definition fcm.h:58
#define IR_GIVE_FIELD(__ir, __value, __id)
Definition inputrecord.h:67
long ContextMode
Definition contextmode.h:43
FloatArrayF< N > max(const FloatArrayF< N > &a, const FloatArrayF< N > &b)
@ principal_strain
For computing principal strains from engineering strains.
#define pscm_Gf
Definition rcm2.h:54
#define pscm_Ee
Definition rcm2.h:52
#define pscm_UNLOADING
Definition rcm2.h:64
#define rcm_SMALL_STRAIN
Definition rcm2.h:71
#define _IFT_RCM2Material_gf
Definition rcm2.h:46
#define pscm_G
Definition rcm2.h:56
#define pscm_OPEN
Definition rcm2.h:61
#define pscm_Ft
Definition rcm2.h:57
#define _IFT_RCM2Material_ft
Definition rcm2.h:47
#define rcm2_BIGNUMBER
Definition rcm2.h:72
#define pscm_RELOADING
Definition rcm2.h:63

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