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

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