OOFEM 3.0
Loading...
Searching...
No Matches
frcfcm.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 "frcfcm.h"
36#include "gausspoint.h"
37#include "mathfem.h"
38#include "classfactory.h"
39#include "contextioerr.h"
40#include "datastream.h"
41
42namespace oofem {
44
45FRCFCM :: FRCFCM(int n, Domain *d) : ConcreteFCM(n, d) {}
46
47
48void
49FRCFCM :: initializeFrom(InputRecord &ir)
50{
51 ConcreteFCM :: initializeFrom(ir);
52
53 this->fibreActivationOpening = 0.e-6;
55 if ( this->fibreActivationOpening < 0. ) {
56 OOFEM_ERROR("FibreActivationOpening must be positive");
57 }
58
59 this->dw0 = 0.;
61 if ( ( this->dw0 < 0. ) || ( this->dw0 > this->fibreActivationOpening ) ) {
62 OOFEM_ERROR("dw0 must be positive and smaller than fibreActivationOpening");
63 }
64
65 this->dw1 = 0.;
67 if ( ( this->dw1 < 0. ) ) {
68 OOFEM_ERROR("dw1 must be positive");
69 }
70
71 this->smoothen = false;
72 if ( ( ( this->dw1 == 0. ) && ( this->dw0 > 0. ) ) || ( ( this->dw0 == 0. ) && ( this->dw1 > 0. ) ) ) {
73 OOFEM_ERROR("both dw0 and dw1 must be specified at the same time");
74 } else {
75 this->smoothen = true;
76 this->dw0 *= -1.;
77 }
78
79 // type of SHEAR STRESS FOR FIBER PULLOUT
80 int type = 0;
81
83 switch ( type ) {
84 case 0:
86 break;
87
88 case 1:
91 break;
92
93 case 2:
98 break;
99
100 case 3:
105 break;
106
107 default:
109 throw ValueInputException(ir, _IFT_FRCFCM_fssType, "Softening type is unknown");
110 }
111
112
113
114 // type of FIBER DAMAGE
115 type = 0;
116
118 switch ( type ) {
119 case 0:
121 break;
122
123 case 1:
126 break;
127
128 case 2:
131 break;
132
133 default:
135 throw ValueInputException(ir, _IFT_FRCFCM_fDamType, "Fibre damage type is unknown");
136 }
137
138
140 switch ( type ) {
141 case 0:
143 break;
144
145 case 1:
147 break;
148
149 case 2:
151 break;
152
153 case 3:
155 break;
156
157 default:
159 throw ValueInputException(ir, _IFT_FRCFCM_fiberType, "Fibre type is unknown");
160 }
161
162 if ( ( fiberType == FT_CAF ) || ( fiberType == FT_SAF ) ) {
165
166 if ( !( ( this->orientationVector.giveSize() == 2 ) || ( this->orientationVector.giveSize() == 3 ) ) ) {
168 "length of the fibre orientation vector must be 2 for 2D and 3 for 3D analysis");
169 }
170
171 // we normalize the user-defined orientation vector
172 double length = 0.;
173 for ( int i = 1; i <= this->orientationVector.giveSize(); i++ ) {
174 length += pow(this->orientationVector.at(i), 2);
175 }
176 length = sqrt(length);
177
178 this->orientationVector.times(1 / length);
179 } else {
180 this->orientationVector.resize(3);
181 this->orientationVector.zero();
182 this->orientationVector.at(1) = 1.;
183 }
184 }
185
186 // general properties
188 if ( Vf < 0. ) {
189 throw ValueInputException(ir, _IFT_FRCFCM_Vf, "fibre volume content must not be negative");
190 }
191
193 if ( Df <= 0. ) {
194 throw ValueInputException(ir, _IFT_FRCFCM_Df, "fibre diameter must be positive");
195 }
196
198 if ( Ef <= 0. ) {
199 throw ValueInputException(ir, _IFT_FRCFCM_Ef, "fibre stiffness must be positive");
200 }
201
202 // compute or read shear modulus of fibers
203 double nuf = 0.;
204 Gfib = 0.;
205 if ( ir.hasField(_IFT_FRCFCM_nuf) ) {
207 Gfib = Ef / ( 2. * ( 1. + nuf ) );
208 } else {
210 }
211
212 this->kfib = 0.9;
214
215 // debonding
217 if ( tau_0 <= 0. ) {
218 throw ValueInputException(ir, _IFT_FRCFCM_tau_0, "shear strength must be positive");
219 }
220
221 // snubbing coefficient
223 if ( f < 0. ) {
224 throw ValueInputException(ir, _IFT_FRCFCM_f, "snubbing coefficient must not be negative");
225 }
226
227 // for SRF only
228 if ( fiberType == FT_SRF ) {
229 this->g = 2. * ( 1. + exp(M_PI * f / 2.) ) / ( 4. + f * f );
230 }
231
232 if ( fiberType == FT_SRF2D ) {
233 this->g = ( exp(M_PI * f / 2.) - f ) / ( 1. + f * f );
234 }
235
236 double Em;
238
239 this->eta = this->Ef * this->Vf / ( Em * ( 1. - this->Vf ) );
240
241 this->M = 4; // exponent in unloading-reloading law
243
244
245 if ( ( fiberType == FT_SAF ) || ( fiberType == FT_SRF ) || ( fiberType == FT_SRF2D ) ) {
247 // transitional opening at which sigma_b = max (zero derivative) for SRF and SAF
248 this->w_star = this->Lf * this->Lf * this->tau_0 / ( ( 1. + this->eta ) * this->Ef * this->Df );
249 }
250
252 this->crackSpacing = this->computeCrackSpacing();
253 }
254}
255
256
257double
258FRCFCM :: computeCrackFibreAngle(GaussPoint *gp, int index) const
259{
260 FCMMaterialStatus *status = static_cast< FCMMaterialStatus * >( this->giveStatus(gp) );
261
262 double theta = 0.;
263
264 for ( int i = 1; i <= min( (int)status->giveCrackDirs().giveNumberOfRows(), (int)this->orientationVector.giveSize() ); i++ ) {
265 theta += status->giveCrackDirs().at(i, index) * this->orientationVector.at(i);
266 }
267
268 // can be exceeded due to truncation error
269 if ( theta > 1 ) {
270 return 0.;
271 } else if ( theta < -1. ) {
272 return 0.;
273 }
274
275 // transform into angle
276 theta = acos(theta);
277
278
279 if ( theta > M_PI / 2. ) {
280 theta = M_PI - theta;
281 }
282
283
284 return theta;
285}
286
287
288
289double
290FRCFCM :: giveCrackingModulus(MatResponseMode rMode, GaussPoint *gp, TimeStep *tStep, int i) const
291//
292// returns current cracking modulus according to crackStrain for i-th
293// crackplane
294//
295{
296 FCMMaterialStatus *status = static_cast< FCMMaterialStatus * >( this->giveStatus(gp) );
297
298 double Cfc; //stiffness of cracked concrete and fibers
299 double Cff = 0.;
300 double theta = 0.;
301 double ec, emax, Le, Ncr, w, w_max, factor, omega;
302 double max_traction; // for secant stiffness
303 double sig_dw1, Dsig_dw1, x, dw_smooth, C1, C2; // smoothen
304
305
306 // adjust concrete modulus by fibre volume fraction and by the crack orientation wrt fibres
307 // it turns out that the concrete area is in the end independent of the angle
308 // larger angle causes less fiber to cross the crack but also larger area of the fiber section area (an ellipse)
309 // these two effects cancel out and what only matters is the fiber volume Vf
310 Cfc = ConcreteFCM :: giveCrackingModulus(rMode, gp, tStep, i);
311 Cfc *= ( 1. - this->Vf );
312
313
314 if ( ( this->fiberType == FT_CAF ) || ( this->fiberType == FT_SAF ) ) {
315 theta = fabs( this->computeCrackFibreAngle(gp, i) );
316 }
317
318 // in case of continuous aligned fibres and short aligned fibers the TANGENT stiffness of the fibers is multiplied by cos(theta) to reflect decreased number of crossing fibers and by exp(theta * f) to consider the snubbing effect. The secant stiffness uses a function for computing the normal stress where "theta" is used too.
319
320 // virgin material -> return stiffness of concrete
321 if ( status->giveTempCrackStatus(i) == pscm_NONE ) {
322 return Cfc;
323 }
324
325 // modification to take into account crack spacing - makes sense only in crack-opening-based materials
326
327 Ncr = this->giveNumberOfCracksInDirection(gp, i);
328
329 ec = status->giveTempCrackStrain(i) / Ncr;
330 emax = max(status->giveMaxCrackStrain(i) / Ncr, ec);
331
332 Le = status->giveCharLength(i);
333
334 w_max = emax * Le; //maximal crack opening
335 w_max -= fibreActivationOpening;
336
337 w = ec * Le; //current crack opening
339
340
341 if ( rMode == TangentStiffness ) { // assumption of constant tau_s(w) in the derivative
342 // for zero or negative strain has been taken care of before
343
344 if ( this->smoothen ) {
345 if ( ( w_max <= this->dw0 ) || ( w <= this->dw0 ) ) {
346 return Cfc;
347 }
348 } else {
349 if ( ( w_max < 0. ) || ( w < 0. ) ) {
350 return Cfc;
351 }
352 }
353
354
355 if ( ( this->smoothen ) && ( w_max > this->dw0 ) && ( w_max < this->dw1 ) ) {
356 if ( w == w_max ) {
357 omega = this->computeTempDamage(gp, tStep);
358
359 x = w_max - this->dw0;
360 dw_smooth = this->dw1 - this->dw0;
361
362 if ( fiberType == FT_CAF ) { // continuous aligned fibers
363 sig_dw1 = 2. *this->Vf *sqrt(this->dw1 *this->Ef * ( 1. + this->eta ) *this->tau_0 / this->Df); // stress in fibers per unit area of concrete
364 Dsig_dw1 = this->Vf * sqrt( this->Ef * ( 1. + this->eta ) * this->tau_0 / ( this->Df * this->dw1 ) ); // stress derivative
365
366 C1 = Dsig_dw1 / pow(dw_smooth, 2) - ( 2 * sig_dw1 ) / pow(dw_smooth, 3);
367 C2 = ( 3 * sig_dw1 ) / pow(dw_smooth, 2) - Dsig_dw1 / dw_smooth;
368
369 Cff = 3. *C1 *pow(x, 2) + 2. * C2 * x;
370 Cff *= Le;
371
372 // reflect fibre orientation wrt crack
373 theta = fabs( this->computeCrackFibreAngle(gp, i) );
374 Cff *= fabs( cos(theta) ) * exp(theta * this->f);
375
376 Cff *= ( 1. - omega );
377 } else if ( fiberType == FT_SAF ) { // short aligned fibers
378 sig_dw1 = this->Vf * ( sqrt(4. * this->Ef * ( 1. + this->eta ) * this->dw1 * this->tau_0 / this->Df) - this->Ef * ( 1. + this->eta ) * this->dw1 / this->Lf );
379 Dsig_dw1 = this->Vf * ( sqrt( this->Ef * ( 1. + this->eta ) * this->tau_0 / ( this->Df * this->dw1 ) ) - this->Ef * ( 1. + this->eta ) / this->Lf );
380
381 C1 = Dsig_dw1 / pow(dw_smooth, 2) - ( 2 * sig_dw1 ) / pow(dw_smooth, 3);
382 C2 = ( 3 * sig_dw1 ) / pow(dw_smooth, 2) - Dsig_dw1 / dw_smooth;
383
384 Cff = 3. *C1 *pow(x, 2) + 2. * C2 * x;
385 Cff *= Le;
386
387
388 // reflect fibre orientation wrt crack
389 theta = fabs( this->computeCrackFibreAngle(gp, i) );
390 Cff *= fabs( cos(theta) ) * exp(theta * this->f);
391
392 Cff *= ( 1. - omega );
393 } else if ( fiberType == FT_SRF ) { // short random fibers
394 factor = ( 1. - omega ) * this->g * this->Vf * this->Lf / ( 2. * this->Df );
395
396 sig_dw1 = factor * this->tau_0 * ( 2. * sqrt(this->dw1 / this->w_star) - this->dw1 / this->w_star );
397 Dsig_dw1 = factor * this->tau_0 * ( 1. / ( this->w_star * sqrt(this->dw1 / this->w_star) ) - 1. / this->w_star );
398
399 C1 = Dsig_dw1 / pow(dw_smooth, 2) - ( 2 * sig_dw1 ) / pow(dw_smooth, 3);
400 C2 = ( 3 * sig_dw1 ) / pow(dw_smooth, 2) - Dsig_dw1 / dw_smooth;
401
402 Cff = 3. *C1 *pow(x, 2) + 2. * C2 * x;
403 Cff *= Le;
404
405 } else if ( fiberType == FT_SRF2D ) { // short random fibers in 2D
406
407 factor = ( 1. - omega ) * this->g * this->Vf * this->Lf * 2. / ( M_PI * this->Df );
408
409 sig_dw1 = factor * this->tau_0 * ( 2. * sqrt(this->dw1 / this->w_star) - this->dw1 / this->w_star );
410 Dsig_dw1 = factor * this->tau_0 * ( 1. / ( this->w_star * sqrt(this->dw1 / this->w_star) ) - 1. / this->w_star );
411
412 C1 = Dsig_dw1 / pow(dw_smooth, 2) - ( 2 * sig_dw1 ) / pow(dw_smooth, 3);
413 C2 = ( 3 * sig_dw1 ) / pow(dw_smooth, 2) - Dsig_dw1 / dw_smooth;
414
415 Cff = 3. *C1 *pow(x, 2) + 2. * C2 * x;
416 Cff *= Le;
417
418 }
419 } else { // unlo-relo with smoothing
420 // compute traction for ec == emax
421 double max_traction = this->computeStressInFibersInCracked(gp, tStep, emax * Ncr, i);
422 Cff = ( this->M * max_traction * Le / ( w_max - this->dw0 ) ) * pow( ( w - this->dw0 ) / ( w_max - this->dw0 ), ( this->M - 1 ) );
423 }
424
425#if DEBUG
426 if ( Cff < 0. ) {
427 OOFEM_WARNING("Negative fiber stress - smooth transition, increase dw1 or decrease dw0");
428 return Cfc;
429 }
430#endif
431
432 Cff = max(0., Cff);
433 } else if ( w_max == 0. ) { //zero strain
434 w_max = 1.e-10;
435
436 if ( fiberType == FT_CAF ) { // continuous aligned fibers
437 Cff = this->Vf * Le * sqrt( this->Ef * ( 1. + this->eta ) * this->tau_0 / ( this->Df * w_max ) );
438
439 // reflect fibre orientation wrt crack
440 Cff *= fabs( cos(theta) ) * exp(theta * this->f);
441 } else if ( fiberType == FT_SAF ) { // short aligned fibers
442 Cff = this->Vf * Le * ( sqrt( this->Ef * ( 1. + this->eta ) * this->tau_0 / ( this->Df * w_max ) ) - this->Ef * ( 1. + this->eta ) / this->Lf );
443
444 // reflect fibre orientation wrt crack
445 Cff *= fabs( cos(theta) ) * exp(theta * this->f);
446 } else if ( fiberType == FT_SRF ) { // short random fibers
447 factor = this->g * this->Vf * this->Lf / ( 2. * this->Df );
448 Cff = factor * this->tau_0 * ( Le / ( this->w_star * sqrt(w_max / this->w_star) ) - Le / this->w_star );
449
450 } else if ( fiberType == FT_SRF2D ) { // short random fibers in 2D
451 factor = this->g * this->Vf * this->Lf * 2. / ( M_PI * this->Df );
452 Cff = factor * this->tau_0 * ( Le / ( this->w_star * sqrt(w_max / this->w_star) ) - Le / this->w_star );
453
454 } else {
455 OOFEM_ERROR("Unknown fiber type");
456 }
457 } else if ( w == w_max ) { // softening
458 if ( fiberType == FT_CAF ) { // continuous aligned fibers
459 Cff = this->Vf * Le * sqrt( this->Ef * ( 1. + this->eta ) * this->tau_0 / ( this->Df * w_max ) );
460 // reflect fibre orientation wrt crack
461 Cff *= fabs( cos(theta) ) * exp(theta * this->f);
462
463 omega = this->computeTempDamage(gp, tStep);
464 Cff *= ( 1. - omega );
465 } else if ( fiberType == FT_SAF ) { // short aligned fibers
466 omega = this->computeTempDamage(gp, tStep);
467
468
469 if ( w_max < this->w_star ) { // debonding + pullout
470 Cff = ( 1. - omega ) * this->Vf * Le * ( sqrt( this->Ef * ( 1. + this->eta ) * this->tau_0 / ( this->Df * w_max ) ) - this->Ef * ( 1. + this->eta ) / this->Lf );
471
472 // reflect fibre orientation wrt crack
473 Cff *= fabs( cos(theta) ) * exp(theta * this->f);
474 } else if ( w_max <= this->Lf / 2. ) { // pullout
475 factor = ( 1. - omega ) * this->Vf * this->Lf / this->Df;
476
477 Cff = factor * this->computeFiberBond(w_max) * ( 8. * w_max * Le / ( this->Lf * this->Lf ) - 4. * Le / this->Lf );
478
479 // reflect fibre orientation wrt crack
480 Cff *= fabs( cos(theta) ) * exp(theta * this->f);
481 } else { // fully pulled out
482 Cff = 0.;
483 }
484 } else if ( fiberType == FT_SRF ) { // short random fibers
485 omega = this->computeTempDamage(gp, tStep);
486 factor = ( 1. - omega ) * this->g * this->Vf * this->Lf / ( 2. * this->Df );
487
488 if ( w_max < this->w_star ) { // debonding + pullout
489 Cff = factor * this->tau_0 * ( Le / ( this->w_star * sqrt(w_max / this->w_star) ) - Le / this->w_star );
490 } else if ( w_max <= this->Lf / 2. ) { // pullout
491 Cff = factor * this->computeFiberBond(w_max) * ( 8. * w_max * Le / ( this->Lf * this->Lf ) - 4. * Le / this->Lf );
492 } else { // fully pulled out
493 Cff = 0.;
494 }
495
496 } else if ( fiberType == FT_SRF2D ) { // short random fibers in 2D
497
498 omega = this->computeTempDamage(gp, tStep);
499 factor = ( 1. - omega ) * this->g * this->Vf * this->Lf * 2. / ( M_PI * this->Df );
500
501 if ( w_max < this->w_star ) { // debonding + pullout
502 Cff = factor * this->tau_0 * ( Le / ( this->w_star * sqrt(w_max / this->w_star) ) - Le / this->w_star );
503 } else if ( w_max <= this->Lf / 2. ) { // pullout
504 Cff = factor * this->computeFiberBond(w_max) * ( 8. * w_max * Le / ( this->Lf * this->Lf ) - 4. * Le / this->Lf );
505 } else { // fully pulled out
506 Cff = 0.;
507 }
508
509
510 } else {
511 OOFEM_ERROR("Unknown fiber type");
512 }
513 } else { // unlo-relo
514 // compute traction for ec == emax
515 max_traction = this->computeStressInFibersInCracked(gp, tStep, emax * Ncr, i);
516
517 Cff = ( this->M * max_traction * Le / w_max ) * pow( ( w / w_max ), ( this->M - 1 ) );
518 }
519 } else if ( rMode == SecantStiffness ) {
520 if ( this->smoothen ) {
521 if ( ( w_max <= this->dw0 ) || ( w <= this->dw0 ) ) { // fibres are not activated
522 Cff = 0.;
523 } else if ( ec == emax ) { // softening
524 Cff = computeStressInFibersInCracked(gp, tStep, emax * Ncr, i); // gets stress
525 Cff /= ( emax ); // converted into stiffness
526 } else { // unlo-relo
527 // compute traction for ec == emax
528 max_traction = this->computeStressInFibersInCracked(gp, tStep, emax * Ncr, i);
529 Cff = max_traction * pow( ( ( w - this->dw0 ) / ( w_max - this->dw0 ) ), this->M ) / ec;
530 }
531 } else {
532 if ( ( w_max < 0. ) || ( w < 0. ) ) { // fibres are not activated
533 Cff = 0.;
534 } else if ( w_max == 0. ) { //zero strain
535 w_max = 1.e-10 / Ncr;
536 emax = w_max / Le;
537
538 Cff = computeStressInFibersInCracked(gp, tStep, emax * Ncr, i); // gets stress
539 Cff /= ( emax ); // converted into stiffness
540 } else if ( ec == emax ) { // softening
541 Cff = computeStressInFibersInCracked(gp, tStep, emax * Ncr, i); // gets stress
542 Cff /= ( emax ); // converted into stiffness
543 } else { // unlo-relo
544 // compute traction for ec == emax
545 max_traction = this->computeStressInFibersInCracked(gp, tStep, emax * Ncr, i);
546
547 Cff = max_traction * pow( ( w / w_max ), this->M ) / ec;
548 }
549 }
550 } else {
551 OOFEM_ERROR("Unknown material response mode");
552 }
553
554 // to take into account crack-spacing
555 Cff /= Ncr;
556
557 return Cfc + Cff;
558}
559
560
561
562double
563FRCFCM :: computeFiberBond(double w) const
564{
565 double tau_s = 0.;
566 double dw, tau_tilde = 0.;
567
568 if ( ( w <= 0. ) || ( fiberShearStrengthType == FSS_NONE ) || ( fiberType == FT_CAF ) ) {
569 return this->tau_0;
570 }
571
572 if ( fiberShearStrengthType == FSS_Sajdlova ) { // Sajdlova
573 tau_s = this->tau_0 * ( 1. + sgn(this->b0) * ( 1. - exp(-fabs(this->b0) * w / this->Df) ) );
574 } else if ( fiberShearStrengthType == FSS_Kabele ) { // Kabele
575 tau_s = this->tau_0 * ( 1 + this->b1 * ( w / this->Df ) + this->b2 * ( w / this->Df ) * ( w / this->Df ) + this->b3 * ( w / this->Df ) * ( w / this->Df ) * ( w / this->Df ) );
576 tau_s = max(0., tau_s);
577 } else if ( fiberShearStrengthType == FSS_Havlasek ) { // Havlasek
578 dw = w - this->w_star;
579
580 if ( fiberType == FT_SRF || ( fiberType == FT_SRF2D ) ) {
581 tau_tilde = this->tau_0 / ( ( 1. - 2.*this->w_star / this->Lf ) * ( 1. - 2.*this->w_star / this->Lf ) );
582 } else { // SAF
583 tau_tilde = this->tau_0 * this->Ef * ( 1. + this->eta ) * this->Df / ( this->Ef * ( 1. + this->eta ) * this->Df - 2. * this->Lf * this->tau_0 );
584 }
585
586 tau_s = tau_tilde + this->tau_0 * ( this->b1 * ( dw / this->Df ) +
587 this->b2 * ( dw / this->Df ) * ( dw / this->Df ) +
588 this->b3 * ( dw / this->Df ) * ( dw / this->Df ) * ( dw / this->Df ) );
589
590 tau_s = max(0., tau_s);
591 } else {
592 OOFEM_ERROR("Unknown FiberShearStrengthType");
593 }
594
595 return tau_s;
596}
597
598
599
600
601double
602FRCFCM :: giveNormalCrackingStress(GaussPoint *gp, TimeStep *tStep, double ec, int i) const
603//
604// returns receivers Normal Stress in crack i for given cracking strain
605//
606{
607 double traction_fc, traction_ff; //normal stress in cracked concrete and fibers
608
609 traction_fc = ConcreteFCM :: giveNormalCrackingStress(gp, tStep, ec, i);
610 traction_fc *= ( 1. - this->Vf );
611
612 traction_ff = this->computeStressInFibersInCracked(gp, tStep, ec, i);
613
614
615 return traction_fc + traction_ff;
616}
617
618
619double
620FRCFCM :: computeStressInFibersInCracked(GaussPoint *gp, TimeStep *tStep, double ec, int i) const
621//
622// returns receivers Normal Stress in crack i for given cracking strain
623//
624{
625 FCMMaterialStatus *status = static_cast< FCMMaterialStatus * >( this->giveStatus(gp) );
626
627 double traction_ff = 0.; //normal stress in cracked concrete in its FIBERS (continuum point of view)
628
629 double emax, Le, w_max, w, Ncr, omega, factor;
630 double theta = 0.;
631
632 double sig_dw1, Dsig_dw1, x, dw_smooth, C1, C2; // smoothen
633
634
635 if ( status->giveTempCrackStatus(i) == pscm_NONE ) {
636 return 0.;
637 }
638
639 emax = max(status->giveMaxCrackStrain(i), ec);
640
641 if ( emax == 0. ) {
642 return 0.;
643 }
644
645 Ncr = this->giveNumberOfCracksInDirection(gp, i);
646 emax /= Ncr;
647 ec /= Ncr;
648
649 Le = status->giveCharLength(i);
650
651 w_max = emax * Le; // maximal crack opening
652 // w_max already corresponds to one parallel
653 w_max -= fibreActivationOpening; // offset the initial crack opening when fibers do not extend but matrix has already cracked
654
655 w = ec * Le; // crack opening
656 w -= fibreActivationOpening; // offset the initial crack opening when fibers do not extend but matrix has already cracked
657
658
659 if ( this->smoothen ) {
660 if ( ( w_max <= this->dw0 ) || ( w <= this->dw0 ) ) {
661 return 0.;
662 }
663 } else {
664 if ( ( w_max <= 0. ) || ( w <= 0. ) ) {
665 return 0.;
666 }
667 }
668
669
670 if ( ( this->fiberType == FT_CAF ) || ( this->fiberType == FT_SAF ) ) {
671 theta = fabs( this->computeCrackFibreAngle(gp, i) );
672 }
673
674 if ( fiberType == FT_CAF ) { // continuous aligned fibers
675 // smooth
676 if ( ( this->smoothen ) && ( w_max > this->dw0 ) && ( w_max < this->dw1 ) ) {
677 sig_dw1 = 2. *this->Vf *sqrt(this->dw1 *this->Ef * ( 1. + this->eta ) *this->tau_0 / this->Df); // stress in fibers per unit area of concrete
678 Dsig_dw1 = this->Vf * sqrt( this->Ef * ( 1. + this->eta ) * this->tau_0 / ( this->Df * this->dw1 ) ); // stress derivative
679
680 x = w_max - this->dw0;
681 dw_smooth = this->dw1 - this->dw0;
682
683 C1 = Dsig_dw1 / pow(dw_smooth, 2) - ( 2 * sig_dw1 ) / pow(dw_smooth, 3);
684 C2 = ( 3 * sig_dw1 ) / pow(dw_smooth, 2) - Dsig_dw1 / dw_smooth;
685
686 traction_ff = C1 * pow(x, 3) + C2 *pow(x, 2);
687
688 // sharp
689 } else {
690 // expressed with respect to crack opening
691 //
692 traction_ff = 2. *this->Vf *sqrt(w_max *this->Ef * ( 1. + this->eta ) *this->tau_0 / this->Df); // stress in fibers per unit area of concrete
693 }
694
695 // reflect fibre orientation wrt crack
696 traction_ff *= fabs( cos(theta) ) * exp(theta * this->f);
697
698 // reflect damage
699 omega = this->computeTempDamage(gp, tStep);
700 traction_ff *= ( 1. - omega );
701 } else if ( fiberType == FT_SAF ) { // short aligned fibers
702 omega = this->computeTempDamage(gp, tStep);
703
704 // smooth
705 if ( ( this->smoothen ) && ( w_max > this->dw0 ) && ( w_max < this->dw1 ) ) {
706 sig_dw1 = this->Vf * ( sqrt(4. * this->Ef * ( 1. + this->eta ) * this->dw1 * this->tau_0 / this->Df) - this->Ef * ( 1. + this->eta ) * this->dw1 / this->Lf );
707 Dsig_dw1 = this->Vf * ( sqrt( this->Ef * ( 1. + this->eta ) * this->tau_0 / ( this->Df * this->dw1 ) ) - this->Ef * ( 1. + this->eta ) / this->Lf );
708
709 x = w_max - this->dw0;
710 dw_smooth = this->dw1 - this->dw0;
711
712 C1 = Dsig_dw1 / pow(dw_smooth, 2) - ( 2 * sig_dw1 ) / pow(dw_smooth, 3);
713 C2 = ( 3 * sig_dw1 ) / pow(dw_smooth, 2) - Dsig_dw1 / dw_smooth;
714
715 traction_ff = C1 * pow(x, 3) + C2 *pow(x, 2);
716
717 // reflect fibre orientation wrt crack
718 traction_ff *= fabs( cos(theta) ) * exp(theta * this->f);
719
720 traction_ff *= ( 1. - omega );
721 } else if ( w_max < this->w_star ) { // debonding + pullout
722 traction_ff = this->Vf * ( sqrt(4. * this->Ef * ( 1. + this->eta ) * w_max * this->tau_0 / this->Df) - this->Ef * ( 1. + this->eta ) * w_max / this->Lf );
723
724 // reflect fibre orientation wrt crack
725 traction_ff *= fabs( cos(theta) ) * exp(theta * this->f);
726
727 traction_ff *= ( 1. - omega );
728 } else if ( w_max <= this->Lf / 2. ) { // pullout
729 factor = this->Vf * this->Lf / this->Df;
730
731 traction_ff = factor * this->computeFiberBond(w_max) * ( 1. - 2. * w_max / this->Lf ) * ( 1. - 2. * w_max / this->Lf );
732
733 // reflect fibre orientation wrt crack
734 traction_ff *= fabs( cos(theta) ) * exp(theta * this->f);
735
736 traction_ff *= ( 1. - omega );
737 } else { // fully pulled out
738 traction_ff = 0.;
739 }
740 } else if ( fiberType == FT_SRF ) { // short random fibers
741 omega = this->computeTempDamage(gp, tStep);
742 factor = ( 1. - omega ) * this->g * this->Vf * this->Lf / ( 2. * this->Df );
743
744 // smooth
745 if ( ( this->smoothen ) && ( w_max > this->dw0 ) && ( w_max < this->dw1 ) ) {
746 sig_dw1 = factor * this->tau_0 * ( 2. * sqrt(this->dw1 / this->w_star) - this->dw1 / this->w_star );
747 Dsig_dw1 = factor * this->tau_0 * ( 1. / ( this->w_star * sqrt(this->dw1 / this->w_star) ) - 1. / this->w_star );
748
749 x = w_max - this->dw0;
750 dw_smooth = this->dw1 - this->dw0;
751
752 C1 = Dsig_dw1 / pow(dw_smooth, 2) - ( 2 * sig_dw1 ) / pow(dw_smooth, 3);
753 C2 = ( 3 * sig_dw1 ) / pow(dw_smooth, 2) - Dsig_dw1 / dw_smooth;
754
755 traction_ff = C1 * pow(x, 3) + C2 *pow(x, 2);
756 } else if ( w_max < this->w_star ) { // debonding + pullout
757 traction_ff = factor * this->tau_0 * ( 2. * sqrt(w_max / this->w_star) - w_max / this->w_star );
758 } else if ( w_max <= this->Lf / 2. ) { // pullout
759 traction_ff = factor * this->computeFiberBond(w_max) * ( 1. - 2. * w_max / this->Lf ) * ( 1. - 2. * w_max / this->Lf );
760 } else { // fully pulled out
761 traction_ff = 0.;
762 }
763
764 } else if ( fiberType == FT_SRF2D ) { // short random fibers in 2D
765
766 omega = this->computeTempDamage(gp, tStep);
767 factor = ( 1. - omega ) * this->g * this->Vf * this->Lf * 2./ ( M_PI * this->Df );
768
769 // smooth
770 if ( ( this->smoothen ) && ( w_max > this->dw0 ) && ( w_max < this->dw1 ) ) {
771 sig_dw1 = factor * this->tau_0 * ( 2. * sqrt(this->dw1 / this->w_star) - this->dw1 / this->w_star );
772 Dsig_dw1 = factor * this->tau_0 * ( 1. / ( this->w_star * sqrt(this->dw1 / this->w_star) ) - 1. / this->w_star );
773
774 x = w_max - this->dw0;
775 dw_smooth = this->dw1 - this->dw0;
776
777 C1 = Dsig_dw1 / pow(dw_smooth, 2) - ( 2 * sig_dw1 ) / pow(dw_smooth, 3);
778 C2 = ( 3 * sig_dw1 ) / pow(dw_smooth, 2) - Dsig_dw1 / dw_smooth;
779
780 traction_ff = C1 * pow(x, 3) + C2 *pow(x, 2);
781 } else if ( w_max < this->w_star ) { // debonding + pullout
782 traction_ff = factor * this->tau_0 * ( 2. * sqrt(w_max / this->w_star) - w_max / this->w_star );
783 } else if ( w_max <= this->Lf / 2. ) { // pullout
784 traction_ff = factor * this->computeFiberBond(w_max) * ( 1. - 2. * w_max / this->Lf ) * ( 1. - 2. * w_max / this->Lf );
785 } else { // fully pulled out
786 traction_ff = 0.;
787 }
788
789
790 } else {
791 OOFEM_ERROR("Unknown fiber type");
792 }
793
794#if DEBUG
795 if ( traction_ff < 0. ) {
796 OOFEM_WARNING("Negative fiber stress - smooth transition, increase dw1 or decrease dw0");
797 return 0.;
798 }
799#endif
800
801 traction_ff = max(0., traction_ff);
802
803 if ( ec < emax ) { // unloading-reloading
804 if ( smoothen ) {
805 traction_ff *= pow( ( w - this->dw0 ) / ( w_max - this->dw0 ), this->M );
806 } else {
807 traction_ff *= pow(w / w_max, this->M);
808 }
809 }
810
811 return traction_ff;
812}
813
814
815
816double
817FRCFCM :: computeEffectiveShearModulus(GaussPoint *gp, TimeStep *tStep, int shearDirection) const
818{
819 double G, Geff;
820 double beta_mf;
821 double D2_1, D2_2, D2;
822 int crackA, crackB;
823
824 G = this->computeOverallElasticShearModulus(gp, tStep);
825
826 if ( this->isIntactForShear(gp, shearDirection) ) {
827 Geff = G;
828 } else {
829 if ( this->shearType == SHR_NONE ) {
830 Geff = G;
831 } else {
832 if ( shearDirection == 4 ) {
833 crackA = 2;
834 crackB = 3;
835 } else if ( shearDirection == 5 ) {
836 crackA = 1;
837 crackB = 3;
838 } else if ( shearDirection == 6 ) {
839 crackA = 1;
840 crackB = 2;
841 } else {
842 OOFEM_ERROR("Unexpected value of index i (4, 5, 6 permitted only)");
843 }
844
845 if ( ( this->isIntact(gp, crackA) ) || ( this->isIntact(gp, crackB) ) ) {
846 if ( this->isIntact(gp, crackA) ) {
847 D2 = this->computeD2ModulusForCrack(gp, tStep, crackB);
848 } else {
849 D2 = this->computeD2ModulusForCrack(gp, tStep, crackA);
850 }
851
852 beta_mf = D2 / ( D2 + G );
853 } else {
854 D2_1 = this->computeD2ModulusForCrack(gp, tStep, crackA);
855 D2_2 = this->computeD2ModulusForCrack(gp, tStep, crackB);
856
857 if ( multipleCrackShear ) {
858 beta_mf = 1. / ( 1. + G * ( 1 / D2_1 + 1 / D2_2 ) );
859 } else {
860 D2 = min(D2_1, D2_2);
861 beta_mf = D2 / ( D2 + G );
862 }
863 }
864
865 Geff = G * beta_mf;
866 }
867 } // not intact for shear
868
869 return Geff;
870}
871
872
873double
874FRCFCM :: computeD2ModulusForCrack(GaussPoint *gp, TimeStep *tStep, int icrack) const
875{
876 double cos_theta;
877 double E = linearElasticMaterial.giveYoungsModulus();
878 FRCFCMStatus *status = static_cast< FRCFCMStatus * >( this->giveStatus(gp) );
879 double crackStrain;
880 double D2m, D2f;
881 double omega;
882
883 crackStrain = status->giveTempMaxCrackStrain(icrack);
884
885 if ( ( this->isIntact(gp, icrack) ) || ( crackStrain <= 0. ) ) {
886 return E * fcm_BIGNUMBER;
887 } else {
888 if ( ( this->fiberType == FT_CAF ) || ( this->fiberType == FT_SAF ) ) {
889 cos_theta = fabs( cos( this->computeCrackFibreAngle(gp, icrack) ) );
890 } else if ( this->fiberType == FT_SRF ) {
891 cos_theta = 0.5; // to reduce Vf for SRF to one half
892 } else if ( this->fiberType == FT_SRF2D ) {
893 cos_theta = 2./M_PI; // reduce Vf
894 } else {
895 OOFEM_ERROR("Unknown fiber type");
896 }
897
898
899 D2m = ConcreteFCM :: computeD2ModulusForCrack(gp, tStep, icrack);
900 D2m *= ( 1. - this->Vf );
901
902 omega = this->computeTempDamage(gp, tStep);
903
904 // fiber shear stiffness is not influenced by the number of parallel cracks
905 D2f = ( 1. - omega ) * this->Vf * cos_theta * this->kfib * this->Gfib / crackStrain;
906
907 D2f = min(E * fcm_BIGNUMBER, D2f);
908
909 return D2m + D2f;
910 }
911}
912
913// the same function as "computeD2ModulusForCrack", only without current value of fiber damage.
914double
915FRCFCM :: estimateD2ModulusForCrack(GaussPoint *gp, TimeStep *tStep, int icrack) const
916{
917 double cos_theta;
918 double E = linearElasticMaterial.giveYoungsModulus();
919 FRCFCMStatus *status = static_cast< FRCFCMStatus * >( this->giveStatus(gp) );
920 double crackStrain;
921 double D2m, D2f;
922 double omega;
923
924 crackStrain = status->giveTempMaxCrackStrain(icrack);
925
926 if ( ( this->isIntact(gp, icrack) ) || ( crackStrain <= 0. ) ) {
927 return E * fcm_BIGNUMBER;
928 } else {
929 if ( ( this->fiberType == FT_CAF ) || ( this->fiberType == FT_SAF ) ) {
930 cos_theta = fabs( cos( this->computeCrackFibreAngle(gp, icrack) ) );
931 } else if ( this->fiberType == FT_SRF ) {
932 cos_theta = 0.5; // to reduce Vf for SRF to one half
933 } else if ( this->fiberType == FT_SRF2D ) {
934 cos_theta = 2./M_PI; // reduce Vf
935 } else {
936 OOFEM_ERROR("Unknown fiber type");
937 }
938
939 D2m = ConcreteFCM :: computeD2ModulusForCrack(gp, tStep, icrack);
940 D2m *= ( 1. - this->Vf );
941
942 omega = status->giveDamage();
943
944 // fiber shear stiffness is not influenced by the number of parallel cracks
945 D2f = ( 1. - omega ) * this->Vf * cos_theta * this->kfib * this->Gfib / crackStrain;
946
947 D2f = min(E * fcm_BIGNUMBER, D2f);
948
949 return D2m + D2f;
950 }
951}
952
953
954double
955FRCFCM :: computeTempDamage(GaussPoint *gp, TimeStep *tStep) const {
956 // we assume that fibre damage is the same for all crack planes
957 FRCFCMStatus *status = static_cast< FRCFCMStatus * >( this->giveStatus(gp) );
958
959 double omega = 0.;
960 double gammaCrack = 0.;
961
962 double slip, opening;
963
964 int numberOfActiveCracks = status->giveNumberOfTempCracks();
965
966
967 if ( fiberDamageType != FDAM_NONE ) { // fiber damage is allowed
968 for ( int i = 1; i <= numberOfActiveCracks; i++ ) {
969 if ( !this->isIntact(gp, i) ) {
970 opening = this->computeMaxNormalCrackOpening(gp, tStep, i);
971
972 // if (opening > 0.) {
973 if ( opening > this->fibreActivationOpening ) {
974 slip = this->computeShearSlipOnCrack(gp, tStep, i);
975 gammaCrack = max(gammaCrack, slip / opening);
976 }
977 } // initiation condition
978 } // active crack loop
979
981 omega = min(gammaCrack / this->gammaCrackFail, 1.);
982 } else if ( fiberDamageType == FDAM_GammaCrackExp ) {
983 omega = 1. - exp(-gammaCrack / this->gammaCrackFail);
984 } else {
985 OOFEM_ERROR("Unknown FiberDamageType");
986 }
987
988 omega = max( omega, status->giveDamage() );
989 status->setTempDamage(omega);
990 }
991
992#if DEBUG
993 if ( omega > 0.9 ) {
994 OOFEM_WARNING( "High value of damage in Element %d", gp->giveElement()->giveNumber() );
995 }
996#endif
997
998 return omega;
999}
1000
1001
1002
1003double
1004FRCFCM :: maxShearStress(GaussPoint *gp, TimeStep *tStep, int shearDirection) const
1005{
1006 double maxTau_m;
1007 double minTau_f;
1008 double E = linearElasticMaterial.giveYoungsModulus();
1009 double crackStrain;
1010 double gamma_cr;
1011 double omega;
1012 double cos_theta;
1013 MaterialMode mMode = gp->giveMaterialMode();
1014
1015 FRCFCMStatus *status = static_cast< FRCFCMStatus * >( this->giveStatus(gp) );
1016
1017 int crackA, crackB;
1018 int icrack;
1019
1020 // max shear in matrix
1021 maxTau_m = ConcreteFCM :: maxShearStress(gp, tStep, shearDirection);
1022 maxTau_m *= ( 1. - this->Vf );
1023
1024
1025 // for now we simply compute the least allowable stress as a product of crack shear stiffness (fiber contribution) * max shear strain
1026
1027 omega = this->computeTempDamage(gp, tStep);
1028 minTau_f = E * fcm_BIGNUMBER;
1029
1030 // TODO - check if behaves reasonably with nonzero damage
1031 // if (omega > 0.) {
1032
1033
1034 if ( shearDirection == 4 ) {
1035 crackA = 2;
1036 crackB = 3;
1037 } else if ( shearDirection == 5 ) {
1038 crackA = 1;
1039 crackB = 3;
1040 } else if ( shearDirection == 6 ) {
1041 crackA = 1;
1042 crackB = 2;
1043 } else {
1044 OOFEM_ERROR("Unexpected value of index i (4, 5, 6 permitted only)");
1045 }
1046
1047
1048
1049 if ( mMode == _PlaneStress ) {
1050 gamma_cr = fabs( status->giveTempMaxCrackStrain(3) );
1051 } else {
1052 gamma_cr = fabs( status->giveTempMaxCrackStrain(shearDirection) );
1053 }
1054
1055 for ( int i = 1; i <= 2; i++ ) {
1056 if ( i == 1 ) {
1057 icrack = crackA;
1058 } else { // i == 2
1059 icrack = crackB;
1060 }
1061
1062 crackStrain = status->giveTempMaxCrackStrain(icrack);
1063
1064 if ( ( this->isIntact(gp, icrack) ) || ( crackStrain <= 0. ) ) {
1065 minTau_f = min(minTau_f, E * fcm_BIGNUMBER);
1066 } else {
1067 if ( ( this->fiberType == FT_CAF ) || ( this->fiberType == FT_SAF ) ) {
1068 cos_theta = fabs( cos( this->computeCrackFibreAngle(gp, icrack) ) );
1069 } else if ( this->fiberType == FT_SRF ) {
1070 cos_theta = 0.5; // to reduce Vf for SRF to one half
1071 } else if ( this->fiberType == FT_SRF2D ) {
1072 cos_theta = 2./M_PI; // reduce Vf
1073 } else {
1074 OOFEM_ERROR("Unknown fiber type");
1075 }
1076
1077 //omega = this->computeTempDamage(gp, tStep);
1078
1079 minTau_f = min(minTau_f, gamma_cr * ( 1. - omega ) * this->Vf * cos_theta * this->kfib * this->Gfib / crackStrain);
1080 }
1081 } // loop over crack directions
1082
1083 //} // damage condition
1084
1085 return maxTau_m + minTau_f;
1086}
1087
1088
1089// computes crack spacing at saturated state
1090// random tensile strength is not supported here
1091// effect of fiber inclination is not considered
1092double
1093FRCFCM :: computeCrackSpacing() {
1094 double x_CA, lambda;
1095 double x = 0.;
1096
1097 x_CA = ( 1. - this->Vf ) * this->Ft * this->Df / ( 4. * this->Vf * this->tau_0 );
1098
1099 if ( fiberType == FT_CAF ) { // continuous aligned fibers
1100 x = x_CA;
1101 } else if ( fiberType == FT_SAF ) { // short aligned fibers
1102 x = 0.5 * (this->Lf - sqrt(this->Lf * this->Lf - 4. * this->Lf * x_CA) );
1103 } else if ( fiberType == FT_SRF ) { // short random fibers
1104 lambda = ( 2. / M_PI ) * ( 4. + this->f * this->f ) / ( 1. + exp(M_PI * f / 2.) );
1105 x = 0.5 * ( this->Lf - sqrt(this->Lf * this->Lf - 2. * M_PI * this->Lf * lambda * x_CA) );
1106 } else if ( fiberType == FT_SRF2D ) { // short random fibers in 2D
1107 x = 0.5 * ( this->Lf - sqrt(this->Lf * this->Lf - 2. * M_PI * this->Lf * this->g * x_CA) );
1108 } else {
1109 OOFEM_ERROR("Unknown fiber type");
1110 }
1111
1112 return x;
1113}
1114
1115
1116bool
1117FRCFCM :: isStrengthExceeded(const FloatMatrix &base, GaussPoint *gp, TimeStep *tStep, int iCrack, double trialStress) const
1118{
1119 double Em, sigma_m;
1120
1121 if ( trialStress <= 0. ) {
1122 return false;
1123 }
1124
1125 Em = linearElasticMaterial.giveYoungsModulus();
1126
1127 // matrix is stiffer -> carries higher stress
1128 if ( ( this->Ef <= Em ) && ( trialStress > this->giveTensileStrength(gp, tStep) ) ) {
1129 return true;
1130 } else {
1131 sigma_m = trialStress / ( 1. + this->Vf * ( this->Ef / Em - 1. ) );
1132
1133 if ( sigma_m > this->giveTensileStrength(gp, tStep) ) {
1134 return true;
1135 } else {
1136 return false;
1137 }
1138 }
1139}
1140
1141
1142
1143double
1144FRCFCM :: computeShearStiffnessRedistributionFactor(GaussPoint *gp, TimeStep *tStep, int ithCrackPlane, int jthCrackDirection) const
1145{
1146 double factor_ij, D2_i, D2_j;
1147
1148 // slightly modified version here. The problem is recursive calling of damage & slip evaluation for the FRCFCM material
1149 D2_i = this->estimateD2ModulusForCrack(gp, tStep, ithCrackPlane);
1150 D2_j = this->estimateD2ModulusForCrack(gp, tStep, jthCrackDirection);
1151
1152 factor_ij = D2_j / ( D2_i + D2_j );
1153
1154 return factor_ij;
1155}
1156
1157
1158int
1159FRCFCM :: giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep)
1160{
1161 FRCFCMStatus *status = static_cast< FRCFCMStatus * >( this->giveStatus(gp) );
1162
1163 // nominal stress in fibers
1164 if ( type == IST_FiberStressLocal ) {
1165 answer.resize(1);
1166 answer.at(1) = this->computeStressInFibersInCracked(gp, tStep, status->giveCrackStrain(1), 1);
1167 return 1;
1168 } else if ( type == IST_DamageScalar ) {
1169 answer.resize(1);
1170 answer.at(1) = status->giveDamage();
1171 return 1;
1172 } else {
1173 return ConcreteFCM :: giveIPValue(answer, gp, type, tStep);
1174 }
1175}
1176
1177
1178
1179
1180
1181// computes overall stiffness of the composite material: the main purpose of this method is to adjust the stiffness given by the linear elastic material which corresponds to the matrix. The same method is used by all fiber types.
1182double
1183FRCFCM :: computeOverallElasticStiffness(GaussPoint *gp, TimeStep *tStep) const {
1184 double stiffness = 0.;
1185
1186 double Em = linearElasticMaterial.giveYoungsModulus();
1187
1188 if ( this->fiberType == FT_CAF ) { // continuous aligned fibers
1189 stiffness = this->Vf * this->Ef + ( 1. - this->Vf ) * Em;
1190 } else if ( this->fiberType == FT_SAF ) { // short aligned fibers
1191 stiffness = this->Vf * this->Ef + ( 1. - this->Vf ) * Em;
1192 } else if ( this->fiberType == FT_SRF ) { // short random fibers
1193 stiffness = this->Vf * this->Ef + ( 1. - this->Vf ) * Em;
1194 } else if ( this->fiberType == FT_SRF2D ) { // short random fibers in 2D
1195 stiffness = this->Vf * this->Ef + ( 1. - this->Vf ) * Em;
1196 } else {
1197 OOFEM_ERROR("Unknown fiber type");
1198 }
1199
1200 return stiffness;
1201}
1202
1203
1205// CONCRETE FCM STATUS ///
1207
1208
1209FRCFCMStatus :: FRCFCMStatus(GaussPoint *gp) :
1211{ }
1212
1213
1214void
1215FRCFCMStatus :: printOutputAt(FILE *file, TimeStep *tStep) const
1216{
1217 ConcreteFCMStatus :: printOutputAt(file, tStep);
1218
1219
1220 fprintf(file, "damage status { ");
1221 if ( this->damage > 0.0 ) {
1222 fprintf(file, "damage %f ", this->damage);
1223 }
1224 fprintf(file, "}\n");
1225}
1226
1227
1228
1229
1230
1231void
1232FRCFCMStatus :: initTempStatus()
1233//
1234// initializes temp variables according to variables form previous equlibrium state.
1235//
1236{
1237 ConcreteFCMStatus :: initTempStatus();
1238
1239 this->tempDamage = this->damage;
1240}
1241
1242
1243
1244void
1245FRCFCMStatus :: updateYourself(TimeStep *tStep)
1246//
1247// updates variables (nonTemp variables describing situation at previous equilibrium state)
1248// after a new equilibrium state has been reached
1249// temporary variables correspond to newly reched equilibrium.
1250//
1251{
1252 ConcreteFCMStatus :: updateYourself(tStep);
1253
1254 this->damage = this->tempDamage;
1255}
1256
1257
1258
1259void
1260FRCFCMStatus :: saveContext(DataStream &stream, ContextMode mode)
1261{
1262 ConcreteFCMStatus :: saveContext(stream, mode);
1263
1264 if ( !stream.write(damage) ) {
1266 }
1267}
1268
1269void
1270FRCFCMStatus :: restoreContext(DataStream &stream, ContextMode mode)
1271{
1272 ConcreteFCMStatus :: restoreContext(stream, mode);
1273
1274 if ( !stream.read(damage) ) {
1276 }
1277}
1278} // end namespace oofem
double length(const Vector &a)
Definition CSG.h:88
#define E(a, b)
#define REGISTER_Material(class)
ConcreteFCMStatus(GaussPoint *g)
double giveTensileStrength(GaussPoint *gp, TimeStep *tStep) const override
comutes tensile strength
double Ft
Tensile strength.
ConcreteFCM(int n, Domain *d)
Definition concretefcm.C:44
MaterialStatus * giveStatus(GaussPoint *gp) const override
ShearRetentionType shearType
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 giveCharLength(int icrack) const
returns characteristic length associated with i-th crack direction
Definition fcm.h:162
double giveCrackStrain(int icrack) const
returns i-th component of the crack strain vector (equilibrated)
Definition fcm.h:132
const IntArray & giveTempCrackStatus()
returns vector of temporary crack statuses
Definition fcm.h:119
double giveTempMaxCrackStrain(int icrack)
returns maximum crack strain for the i-th crack (temporary value)
Definition fcm.h:114
virtual int giveNumberOfTempCracks() const
returns temporary number of cracks
Definition fcm.C:2421
double giveMaxCrackStrain(int icrack)
returns maximum crack strain for the i-th crack (equilibrated value)
Definition fcm.h:109
double giveTempCrackStrain(int icrack) const
returns i-th component of the crack strain vector (temporary)
Definition fcm.h:134
const FloatMatrix & giveCrackDirs()
returns crack directions
Definition fcm.h:172
bool multipleCrackShear
if true = takes shear compliance of all cracks, false = only dominant crack contribution,...
Definition fcm.h:281
virtual bool isIntactForShear(GaussPoint *gp, int i) const
returns true for closed or no cracks associated to given shear direction (i = 4, 5,...
Definition fcm.C:1060
virtual bool isIntact(GaussPoint *gp, int icrack) const
returns true for closed or no crack (i = 1, 2, 3)
Definition fcm.C:1042
virtual double computeShearSlipOnCrack(GaussPoint *gp, TimeStep *tStep, int i) const
computes total shear slip on a given crack plane (i = 1, 2, 3); the slip is computed from the tempora...
Definition fcm.C:1168
virtual double giveNumberOfCracksInDirection(GaussPoint *gp, int iCrack) const
returns number of fictiotious parallel cracks in the direction of i-th crack
Definition fcm.C:2032
virtual double computeMaxNormalCrackOpening(GaussPoint *gp, TimeStep *tStep, int i) const
uses maximum equilibrated cracking strain and characteristic length to obtain the maximum reached cra...
Definition fcm.C:1149
IsotropicLinearElasticMaterial linearElasticMaterial
Definition fcm.h:199
double crackSpacing
value of crack spacing (allows to "have" more parallel cracks in one direction if the element size ex...
Definition fcm.h:343
int giveNumber() const
Definition femcmpnn.h:104
void setTempDamage(double newDamage)
Sets the temp damage level to given value.
Definition frcfcm.h:90
double damage
Damage level of material.
Definition frcfcm.h:78
double giveDamage() const
Returns the last equilibrated damage level.
Definition frcfcm.h:86
double tempDamage
Non-equilibrated damage level of material.
Definition frcfcm.h:80
@ FDAM_GammaCrackExp
Definition frcfcm.h:197
@ FDAM_GammaCrackLin
Definition frcfcm.h:197
FiberDamageType fiberDamageType
Definition frcfcm.h:198
virtual double computeFiberBond(double w) const
evaluates the fiber bond if w > w*
Definition frcfcm.C:563
double f
snubbing factor "f"
Definition frcfcm.h:131
virtual double computeStressInFibersInCracked(GaussPoint *gp, TimeStep *tStep, double eps_cr, int i) const
compute the nominal stress in fibers in the i-th crack
Definition frcfcm.C:620
virtual double estimateD2ModulusForCrack(GaussPoint *gp, TimeStep *tStep, int icrack) const
estimate shear modulus for a given crack plane (1, 2, 3). Uses equilibrated value of damage.
Definition frcfcm.C:915
double b2
Definition frcfcm.h:128
double kfib
fiber cross-sectional shear factor
Definition frcfcm.h:152
double tau_0
fiber shear strength at zero slip
Definition frcfcm.h:123
bool smoothen
Definition frcfcm.h:187
double gammaCrackFail
shear strain at full fibers rupture
Definition frcfcm.h:161
double computeOverallElasticShearModulus(GaussPoint *gp, TimeStep *tStep) const override
returns overall shear modulus
Definition frcfcm.h:231
double b0
micromechanical parameter for fiber shear according to Sajdlova
Definition frcfcm.h:126
double b1
micromechanical parameter for fiber shear according to Kabele
Definition frcfcm.h:128
double dw1
Definition frcfcm.h:186
virtual double computeTempDamage(GaussPoint *gp, TimeStep *tStep) const
evaluates temporary value of damage caused by fibre shearing
Definition frcfcm.C:955
double g
auxiliary parameter computed from snubbing factor "f"
Definition frcfcm.h:134
double Ef
fiber Young's modulus
Definition frcfcm.h:146
double Df
fiber diameter
Definition frcfcm.h:143
double Lf
fiber length
Definition frcfcm.h:140
double w_star
transitional opening
Definition frcfcm.h:155
FiberShearStrengthType fiberShearStrengthType
Definition frcfcm.h:194
double computeD2ModulusForCrack(GaussPoint *gp, TimeStep *tStep, int icrack) const override
shear modulus for a given crack plane (1, 2, 3)
Definition frcfcm.C:874
virtual double computeCrackSpacing()
computes crack spacing based on composition of the fibre composite
Definition frcfcm.C:1093
virtual double computeCrackFibreAngle(GaussPoint *gp, int i) const
compute the angle between the fibre and i-th crack normal
Definition frcfcm.C:258
double dw0
Definition frcfcm.h:186
double fibreActivationOpening
crack opening at which the crossing fibers begin to be activated
Definition frcfcm.h:178
double b3
Definition frcfcm.h:128
double eta
aux. factor
Definition frcfcm.h:158
FiberType fiberType
Definition frcfcm.h:208
FloatArray orientationVector
orientation of fibres
Definition frcfcm.h:175
double Gfib
fiber shear modulus
Definition frcfcm.h:149
double Vf
volume fraction of fibers
Definition frcfcm.h:137
void resize(Index s)
Definition floatarray.C:94
double & at(Index i)
Definition floatarray.h:202
int giveNumberOfRows() const
Returns number of rows of receiver.
double at(std::size_t i, std::size_t j) const
MaterialMode giveMaterialMode()
Returns corresponding material mode of receiver.
Definition gausspoint.h:190
Element * giveElement()
Returns corresponding element to receiver.
Definition gausspoint.h:187
virtual bool hasField(InputFieldType id)=0
Returns true if record contains field identified by idString keyword.
GaussPoint * gp
Associated integration point.
#define THROW_CIOERR(e)
#define OOFEM_WARNING(...)
Definition error.h:80
#define OOFEM_ERROR(...)
Definition error.h:79
#define pscm_NONE
Definition fcm.h:56
#define fcm_BIGNUMBER
Definition fcm.h:63
#define _IFT_FRCFCM_computeCrackSpacing
Definition frcfcm.h:63
#define _IFT_FRCFCM_fssType
Definition frcfcm.h:59
#define _IFT_FRCFCM_dw0
Definition frcfcm.h:65
#define _IFT_FRCFCM_f
Definition frcfcm.h:56
#define _IFT_FRCFCM_Vf
Definition frcfcm.h:44
#define _IFT_FRCFCM_Gfib
Definition frcfcm.h:49
#define _IFT_FRCFCM_b3
Definition frcfcm.h:55
#define _IFT_FRCFCM_gammaCrack
Definition frcfcm.h:62
#define _IFT_FRCFCM_b1
Definition frcfcm.h:53
#define _IFT_FRCFCM_orientationVector
Definition frcfcm.h:58
#define _IFT_FRCFCM_b0
Definition frcfcm.h:52
#define _IFT_FRCFCM_fiberType
Definition frcfcm.h:61
#define _IFT_FRCFCM_M
Definition frcfcm.h:57
#define _IFT_FRCFCM_b2
Definition frcfcm.h:54
#define _IFT_FRCFCM_Lf
Definition frcfcm.h:45
#define _IFT_FRCFCM_fDamType
Definition frcfcm.h:60
#define _IFT_FRCFCM_dw1
Definition frcfcm.h:66
#define _IFT_FRCFCM_nuf
Definition frcfcm.h:48
#define _IFT_FRCFCM_Df
Definition frcfcm.h:46
#define _IFT_FRCFCM_tau_0
Definition frcfcm.h:51
#define _IFT_FRCFCM_fibreActivationOpening
Definition frcfcm.h:64
#define _IFT_FRCFCM_Ef
Definition frcfcm.h:47
#define _IFT_FRCFCM_kfib
Definition frcfcm.h:50
#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_IsotropicLinearElasticMaterial_e
#define M_PI
Definition mathfem.h:52
long ContextMode
Definition contextmode.h:43
FloatArrayF< N > min(const FloatArrayF< N > &a, const FloatArrayF< N > &b)
FloatArrayF< N > max(const FloatArrayF< N > &a, const FloatArrayF< N > &b)
double sgn(double i)
Returns the signum of given value (if value is < 0 returns -1, otherwise returns 1).
Definition mathfem.h:104
@ CIO_IOERR
General IO error.

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