51 ConcreteFCM :: initializeFrom(ir);
56 OOFEM_ERROR(
"FibreActivationOpening must be positive");
62 OOFEM_ERROR(
"dw0 must be positive and smaller than fibreActivationOpening");
67 if ( ( this->
dw1 < 0. ) ) {
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");
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");
207 Gfib =
Ef / ( 2. * ( 1. + nuf ) );
229 this->
g = 2. * ( 1. + exp(
M_PI *
f / 2.) ) / ( 4. +
f *
f );
233 this->
g = ( exp(
M_PI *
f / 2.) -
f ) / ( 1. +
f *
f );
239 this->
eta = this->
Ef * this->
Vf / ( Em * ( 1. - this->
Vf ) );
258FRCFCM :: computeCrackFibreAngle(
GaussPoint *gp,
int index)
const
271 }
else if ( theta < -1. ) {
279 if ( theta >
M_PI / 2. ) {
280 theta =
M_PI - theta;
301 double ec, emax, Le, Ncr, w, w_max, factor, omega;
303 double sig_dw1, Dsig_dw1, x, dw_smooth, C1, C2;
310 Cfc = ConcreteFCM :: giveCrackingModulus(rMode, gp, tStep, i);
311 Cfc *= ( 1. - this->
Vf );
341 if ( rMode == TangentStiffness ) {
345 if ( ( w_max <= this->
dw0 ) || ( w <= this->
dw0 ) ) {
349 if ( ( w_max < 0. ) || ( w < 0. ) ) {
355 if ( ( this->
smoothen ) && ( w_max > this->
dw0 ) && ( w_max < this->
dw1 ) ) {
359 x = w_max - this->
dw0;
360 dw_smooth = this->dw1 - this->dw0;
363 sig_dw1 = 2. *this->
Vf *sqrt(this->dw1 *this->
Ef * ( 1. + this->
eta ) *this->
tau_0 / this->
Df);
364 Dsig_dw1 = this->
Vf * sqrt( this->
Ef * ( 1. + this->
eta ) * this->
tau_0 / ( this->
Df * this->dw1 ) );
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;
369 Cff = 3. *C1 *pow(x, 2) + 2. * C2 * x;
374 Cff *= fabs( cos(theta) ) * exp(theta * this->
f);
376 Cff *= ( 1. - omega );
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 );
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;
384 Cff = 3. *C1 *pow(x, 2) + 2. * C2 * x;
390 Cff *= fabs( cos(theta) ) * exp(theta * this->
f);
392 Cff *= ( 1. - omega );
394 factor = ( 1. - omega ) * this->
g * this->
Vf * this->
Lf / ( 2. * this->
Df );
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 );
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;
402 Cff = 3. *C1 *pow(x, 2) + 2. * C2 * x;
407 factor = ( 1. - omega ) * this->
g * this->
Vf * this->
Lf * 2. / (
M_PI * this->
Df );
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 );
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;
415 Cff = 3. *C1 *pow(x, 2) + 2. * C2 * x;
422 Cff = ( this->
M * max_traction * Le / ( w_max - this->
dw0 ) ) * pow( ( w - this->
dw0 ) / ( w_max - this->
dw0 ), ( this->
M - 1 ) );
427 OOFEM_WARNING(
"Negative fiber stress - smooth transition, increase dw1 or decrease dw0");
433 }
else if ( w_max == 0. ) {
437 Cff = this->
Vf * Le * sqrt( this->
Ef * ( 1. + this->
eta ) * this->
tau_0 / ( this->
Df * w_max ) );
440 Cff *= fabs( cos(theta) ) * exp(theta * this->
f);
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 );
445 Cff *= fabs( cos(theta) ) * exp(theta * this->
f);
447 factor = this->
g * this->
Vf * this->
Lf / ( 2. * this->
Df );
451 factor = this->
g * this->
Vf * this->
Lf * 2. / (
M_PI * this->
Df );
457 }
else if ( w == w_max ) {
459 Cff = this->
Vf * Le * sqrt( this->
Ef * ( 1. + this->
eta ) * this->
tau_0 / ( this->
Df * w_max ) );
461 Cff *= fabs( cos(theta) ) * exp(theta * this->
f);
464 Cff *= ( 1. - omega );
469 if ( w_max < this->
w_star ) {
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 );
473 Cff *= fabs( cos(theta) ) * exp(theta * this->
f);
474 }
else if ( w_max <= this->
Lf / 2. ) {
475 factor = ( 1. - omega ) * this->
Vf * this->
Lf / this->
Df;
477 Cff = factor * this->
computeFiberBond(w_max) * ( 8. * w_max * Le / ( this->
Lf * this->
Lf ) - 4. * Le / this->
Lf );
480 Cff *= fabs( cos(theta) ) * exp(theta * this->
f);
486 factor = ( 1. - omega ) * this->
g * this->
Vf * this->
Lf / ( 2. * this->
Df );
488 if ( w_max < this->
w_star ) {
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. ) {
491 Cff = factor * this->
computeFiberBond(w_max) * ( 8. * w_max * Le / ( this->
Lf * this->
Lf ) - 4. * Le / this->
Lf );
499 factor = ( 1. - omega ) * this->
g * this->
Vf * this->
Lf * 2. / (
M_PI * this->
Df );
501 if ( w_max < this->
w_star ) {
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. ) {
504 Cff = factor * this->
computeFiberBond(w_max) * ( 8. * w_max * Le / ( this->
Lf * this->
Lf ) - 4. * Le / this->
Lf );
517 Cff = ( this->
M * max_traction * Le / w_max ) * pow( ( w / w_max ), ( this->
M - 1 ) );
519 }
else if ( rMode == SecantStiffness ) {
521 if ( ( w_max <= this->
dw0 ) || ( w <= this->
dw0 ) ) {
523 }
else if ( ec == emax ) {
529 Cff = max_traction * pow( ( ( w - this->dw0 ) / ( w_max - this->dw0 ) ), this->
M ) / ec;
532 if ( ( w_max < 0. ) || ( w < 0. ) ) {
534 }
else if ( w_max == 0. ) {
535 w_max = 1.e-10 / Ncr;
540 }
else if ( ec == emax ) {
547 Cff = max_traction * pow( ( w / w_max ), this->
M ) / ec;
563FRCFCM :: computeFiberBond(
double w)
const
566 double dw, tau_tilde = 0.;
573 tau_s = this->
tau_0 * ( 1. +
sgn(this->
b0) * ( 1. - exp(-fabs(this->
b0) * w / this->
Df) ) );
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);
581 tau_tilde = this->
tau_0 / ( ( 1. - 2.*this->w_star / this->
Lf ) * ( 1. - 2.*this->w_star / this->
Lf ) );
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 );
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 ) );
590 tau_s =
max(0., tau_s);
607 double traction_fc, traction_ff;
609 traction_fc = ConcreteFCM :: giveNormalCrackingStress(gp, tStep, ec, i);
610 traction_fc *= ( 1. - this->
Vf );
615 return traction_fc + traction_ff;
627 double traction_ff = 0.;
629 double emax, Le, w_max, w, Ncr, omega, factor;
632 double sig_dw1, Dsig_dw1, x, dw_smooth, C1, C2;
660 if ( ( w_max <= this->
dw0 ) || ( w <= this->
dw0 ) ) {
664 if ( ( w_max <= 0. ) || ( w <= 0. ) ) {
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);
678 Dsig_dw1 = this->
Vf * sqrt( this->
Ef * ( 1. + this->
eta ) * this->
tau_0 / ( this->
Df * this->dw1 ) );
680 x = w_max - this->
dw0;
681 dw_smooth = this->dw1 - this->dw0;
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;
686 traction_ff = C1 * pow(x, 3) + C2 *pow(x, 2);
692 traction_ff = 2. *this->
Vf *sqrt(w_max *this->
Ef * ( 1. + this->
eta ) *this->
tau_0 / this->
Df);
696 traction_ff *= fabs( cos(theta) ) * exp(theta * this->
f);
700 traction_ff *= ( 1. - omega );
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 );
709 x = w_max - this->
dw0;
710 dw_smooth = this->dw1 - this->dw0;
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;
715 traction_ff = C1 * pow(x, 3) + C2 *pow(x, 2);
718 traction_ff *= fabs( cos(theta) ) * exp(theta * this->
f);
720 traction_ff *= ( 1. - omega );
721 }
else if ( w_max < this->
w_star ) {
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 );
725 traction_ff *= fabs( cos(theta) ) * exp(theta * this->
f);
727 traction_ff *= ( 1. - omega );
728 }
else if ( w_max <= this->
Lf / 2. ) {
729 factor = this->
Vf * this->
Lf / this->
Df;
731 traction_ff = factor * this->
computeFiberBond(w_max) * ( 1. - 2. * w_max / this->
Lf ) * ( 1. - 2. * w_max / this->
Lf );
734 traction_ff *= fabs( cos(theta) ) * exp(theta * this->
f);
736 traction_ff *= ( 1. - omega );
742 factor = ( 1. - omega ) * this->
g * this->
Vf * this->
Lf / ( 2. * this->
Df );
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 );
749 x = w_max - this->
dw0;
750 dw_smooth = this->dw1 - this->dw0;
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;
755 traction_ff = C1 * pow(x, 3) + C2 *pow(x, 2);
756 }
else if ( w_max < this->
w_star ) {
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. ) {
759 traction_ff = factor * this->
computeFiberBond(w_max) * ( 1. - 2. * w_max / this->
Lf ) * ( 1. - 2. * w_max / this->
Lf );
767 factor = ( 1. - omega ) * this->
g * this->
Vf * this->
Lf * 2./ (
M_PI * this->
Df );
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 );
774 x = w_max - this->
dw0;
775 dw_smooth = this->dw1 - this->dw0;
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;
780 traction_ff = C1 * pow(x, 3) + C2 *pow(x, 2);
781 }
else if ( w_max < this->
w_star ) {
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. ) {
784 traction_ff = factor * this->
computeFiberBond(w_max) * ( 1. - 2. * w_max / this->
Lf ) * ( 1. - 2. * w_max / this->
Lf );
795 if ( traction_ff < 0. ) {
796 OOFEM_WARNING(
"Negative fiber stress - smooth transition, increase dw1 or decrease dw0");
801 traction_ff =
max(0., traction_ff);
805 traction_ff *= pow( ( w - this->
dw0 ) / ( w_max - this->
dw0 ), this->
M );
807 traction_ff *= pow(w / w_max, this->
M);
821 double D2_1, D2_2, D2;
832 if ( shearDirection == 4 ) {
835 }
else if ( shearDirection == 5 ) {
838 }
else if ( shearDirection == 6 ) {
842 OOFEM_ERROR(
"Unexpected value of index i (4, 5, 6 permitted only)");
852 beta_mf = D2 / ( D2 + G );
858 beta_mf = 1. / ( 1. + G * ( 1 / D2_1 + 1 / D2_2 ) );
860 D2 =
min(D2_1, D2_2);
861 beta_mf = D2 / ( D2 + G );
885 if ( ( this->
isIntact(gp, icrack) ) || ( crackStrain <= 0. ) ) {
899 D2m = ConcreteFCM :: computeD2ModulusForCrack(gp, tStep, icrack);
900 D2m *= ( 1. - this->
Vf );
905 D2f = ( 1. - omega ) * this->
Vf * cos_theta * this->
kfib * this->
Gfib / crackStrain;
926 if ( ( this->
isIntact(gp, icrack) ) || ( crackStrain <= 0. ) ) {
939 D2m = ConcreteFCM :: computeD2ModulusForCrack(gp, tStep, icrack);
940 D2m *= ( 1. - this->
Vf );
945 D2f = ( 1. - omega ) * this->
Vf * cos_theta * this->
kfib * this->
Gfib / crackStrain;
960 double gammaCrack = 0.;
962 double slip, opening;
968 for (
int i = 1; i <= numberOfActiveCracks; i++ ) {
975 gammaCrack =
max(gammaCrack, slip / opening);
1021 maxTau_m = ConcreteFCM :: maxShearStress(gp, tStep, shearDirection);
1022 maxTau_m *= ( 1. - this->
Vf );
1034 if ( shearDirection == 4 ) {
1037 }
else if ( shearDirection == 5 ) {
1040 }
else if ( shearDirection == 6 ) {
1044 OOFEM_ERROR(
"Unexpected value of index i (4, 5, 6 permitted only)");
1049 if ( mMode == _PlaneStress ) {
1055 for (
int i = 1; i <= 2; i++ ) {
1064 if ( ( this->
isIntact(gp, icrack) ) || ( crackStrain <= 0. ) ) {
1072 cos_theta = 2./
M_PI;
1079 minTau_f =
min(minTau_f, gamma_cr * ( 1. - omega ) * this->
Vf * cos_theta * this->
kfib * this->
Gfib / crackStrain);
1085 return maxTau_m + minTau_f;
1093FRCFCM :: computeCrackSpacing() {
1094 double x_CA, lambda;
1097 x_CA = ( 1. - this->
Vf ) * this->
Ft * this->
Df / ( 4. * this->
Vf * this->
tau_0 );
1102 x = 0.5 * (this->
Lf - sqrt(this->
Lf * this->
Lf - 4. * this->
Lf * x_CA) );
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) );
1107 x = 0.5 * ( this->
Lf - sqrt(this->
Lf * this->
Lf - 2. *
M_PI * this->
Lf * this->
g * x_CA) );
1121 if ( trialStress <= 0. ) {
1131 sigma_m = trialStress / ( 1. + this->
Vf * ( this->
Ef / Em - 1. ) );
1144FRCFCM :: computeShearStiffnessRedistributionFactor(
GaussPoint *gp,
TimeStep *tStep,
int ithCrackPlane,
int jthCrackDirection)
const
1146 double factor_ij, D2_i, D2_j;
1152 factor_ij = D2_j / ( D2_i + D2_j );
1164 if ( type == IST_FiberStressLocal ) {
1168 }
else if ( type == IST_DamageScalar ) {
1173 return ConcreteFCM :: giveIPValue(answer, gp, type, tStep);
1184 double stiffness = 0.;
1189 stiffness = this->
Vf * this->
Ef + ( 1. - this->
Vf ) * Em;
1191 stiffness = this->
Vf * this->
Ef + ( 1. - this->
Vf ) * Em;
1193 stiffness = this->
Vf * this->
Ef + ( 1. - this->
Vf ) * Em;
1195 stiffness = this->
Vf * this->
Ef + ( 1. - this->
Vf ) * Em;
1215FRCFCMStatus :: printOutputAt(FILE *file,
TimeStep *tStep)
const
1217 ConcreteFCMStatus :: printOutputAt(file, tStep);
1220 fprintf(file,
"damage status { ");
1221 if ( this->
damage > 0.0 ) {
1222 fprintf(file,
"damage %f ", this->
damage);
1224 fprintf(file,
"}\n");
1232FRCFCMStatus :: initTempStatus()
1237 ConcreteFCMStatus :: initTempStatus();
1252 ConcreteFCMStatus :: updateYourself(tStep);
1262 ConcreteFCMStatus :: saveContext(stream, mode);
1272 ConcreteFCMStatus :: restoreContext(stream, mode);
double length(const Vector &a)
#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)
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
double giveCrackStrain(int icrack) const
returns i-th component of the crack strain vector (equilibrated)
const IntArray & giveTempCrackStatus()
returns vector of temporary crack statuses
double giveTempMaxCrackStrain(int icrack)
returns maximum crack strain for the i-th crack (temporary value)
virtual int giveNumberOfTempCracks() const
returns temporary number of cracks
double giveMaxCrackStrain(int icrack)
returns maximum crack strain for the i-th crack (equilibrated value)
double giveTempCrackStrain(int icrack) const
returns i-th component of the crack strain vector (temporary)
const FloatMatrix & giveCrackDirs()
returns crack directions
bool multipleCrackShear
if true = takes shear compliance of all cracks, false = only dominant crack contribution,...
virtual bool isIntactForShear(GaussPoint *gp, int i) const
returns true for closed or no cracks associated to given shear direction (i = 4, 5,...
virtual bool isIntact(GaussPoint *gp, int icrack) const
returns true for closed or no crack (i = 1, 2, 3)
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...
virtual double giveNumberOfCracksInDirection(GaussPoint *gp, int iCrack) const
returns number of fictiotious parallel cracks in the direction of i-th crack
virtual double computeMaxNormalCrackOpening(GaussPoint *gp, TimeStep *tStep, int i) const
uses maximum equilibrated cracking strain and characteristic length to obtain the maximum reached cra...
IsotropicLinearElasticMaterial linearElasticMaterial
double crackSpacing
value of crack spacing (allows to "have" more parallel cracks in one direction if the element size ex...
void setTempDamage(double newDamage)
Sets the temp damage level to given value.
double damage
Damage level of material.
double giveDamage() const
Returns the last equilibrated damage level.
double tempDamage
Non-equilibrated damage level of material.
FiberDamageType fiberDamageType
virtual double computeFiberBond(double w) const
evaluates the fiber bond if w > w*
double f
snubbing factor "f"
virtual double computeStressInFibersInCracked(GaussPoint *gp, TimeStep *tStep, double eps_cr, int i) const
compute the nominal stress in fibers in the i-th crack
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.
double kfib
fiber cross-sectional shear factor
double tau_0
fiber shear strength at zero slip
double gammaCrackFail
shear strain at full fibers rupture
double computeOverallElasticShearModulus(GaussPoint *gp, TimeStep *tStep) const override
returns overall shear modulus
double b0
micromechanical parameter for fiber shear according to Sajdlova
double b1
micromechanical parameter for fiber shear according to Kabele
virtual double computeTempDamage(GaussPoint *gp, TimeStep *tStep) const
evaluates temporary value of damage caused by fibre shearing
double g
auxiliary parameter computed from snubbing factor "f"
double Ef
fiber Young's modulus
double w_star
transitional opening
FiberShearStrengthType fiberShearStrengthType
double computeD2ModulusForCrack(GaussPoint *gp, TimeStep *tStep, int icrack) const override
shear modulus for a given crack plane (1, 2, 3)
virtual double computeCrackSpacing()
computes crack spacing based on composition of the fibre composite
virtual double computeCrackFibreAngle(GaussPoint *gp, int i) const
compute the angle between the fibre and i-th crack normal
double fibreActivationOpening
crack opening at which the crossing fibers begin to be activated
FloatArray orientationVector
orientation of fibres
double Gfib
fiber shear modulus
double Vf
volume fraction of fibers
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.
Element * giveElement()
Returns corresponding element to receiver.
GaussPoint * gp
Associated integration point.
#define OOFEM_WARNING(...)
#define _IFT_FRCFCM_computeCrackSpacing
#define _IFT_FRCFCM_fssType
#define _IFT_FRCFCM_gammaCrack
#define _IFT_FRCFCM_orientationVector
#define _IFT_FRCFCM_fiberType
#define _IFT_FRCFCM_fDamType
#define _IFT_FRCFCM_tau_0
#define _IFT_FRCFCM_fibreActivationOpening
#define _IFT_IsotropicLinearElasticMaterial_e
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).
@ CIO_IOERR
General IO error.