50 FCMMaterial :: initializeFrom(ir);
51 RandomMaterialExtensionInterface :: initializeFrom(ir);
56 switch ( softening ) {
124 throw ValueInputException(ir,
"foo",
"crack spacing must not be defined in strain-defined materials (does not make sense)");
214ConcreteFCM :: giveCrackingModulus(MatResponseMode rMode,
GaussPoint *gp,
TimeStep *tStep,
int i)
const
238ConcreteFCM :: giveCrackingModulusInTension(MatResponseMode rMode,
GaussPoint *gp,
TimeStep *tStep,
int i)
const
244 double ef, emax, c1, c2, Le, Ncr, w;
264 if ( ( rMode == TangentStiffness ) && ( ec >= emax ) ) {
266 OOFEM_ERROR(
"For unknown reason the tensile strength has been exceeded and cracking has been initiated!");
268 ef =
Gf / ( ft * Le );
273 Cf = -ft / ef *exp(-ec / ef);
277 ef = 2. *
Gf / ( ft * Le );
279 if ( ( ec >= ef ) || ( emax >= ef ) ) {
289 ef = 5.14 *
Gf / ft / Le;
291 if ( ( ec >= ef ) || ( emax >= ef ) ) {
293 }
else if ( emax == 0. ) {
294 Cf = ft * ( -c2 / ef - ( exp(-c2) * ( c1 * c1 * c1 + 1. ) ) / ef );
296 Cf = ft * ( ( 3. * c1 * c1 * c1 * ec * ec * exp(-( c2 * ec ) / ef) ) / ( ef * ef * ef ) - ( c2 * exp(-( c2 * ec ) / ef) * ( c1 * c1 * c1 * ec * ec * ec + ef * ef * ef ) ) / ( ef * ef * ef * ef ) - ( exp(-c2) * ( c1 * c1 * c1 + 1. ) ) / ef );
304 OOFEM_WARNING(
"Crack width is larger than the last user-defined value in the traction-opening law.");
306 }
else if ( emax == 0. ) {
309 for (
int i = 1; i <=
soft_w.giveSize(); i++ ) {
322 if ( ( ec >= this->
eps_f ) || ( emax >= this->
eps_f ) ) {
333 OOFEM_WARNING(
"Crack strain is larger than the last user-defined value in the stress-crack-strain law.");
335 }
else if ( emax == 0. ) {
338 for (
int i = 1; i <=
soft_eps.giveSize(); i++ ) {
358 Cf = ConcreteFCM :: giveNormalCrackingStress(gp, tStep, emax * Ncr, i);
376 double Le, ef, emax, w,
E, c1, c2;
394 OOFEM_ERROR(
"For unknown reason the tensile strength has been exceeded and cracking has been initiated!");
396 ef =
Gf / ( ft * Le );
399 traction = ft * exp(-ec / ef);
403 traction = ft * ec / emax *exp(-emax / ef);
407 ef = 2. *
Gf / ( ft * Le );
409 if ( ( ec >= ef ) || ( emax >= ef ) ) {
412 }
else if ( ec >= emax ) {
414 traction = ft - ft * ec / ef;
415 }
else if ( ec <= 0. ) {
418 traction = ft * ec * ( ef - emax ) / ( emax * ef );
424 ef = 5.14 *
Gf / ft / Le;
426 if ( ( ec >= ef ) || ( emax >= ef ) ) {
429 }
else if ( ec >= emax ) {
431 traction = ft * ( ( 1. + pow( ( c1 * ec / ef ), 3. ) ) * exp(-c2 * ec / ef) - ec / ef * ( 1. + c1 * c1 * c1 ) * exp(-c2) );
432 }
else if ( ec <= 0. ) {
435 traction = ft * ec / emax * ( ( 1. + pow( ( c1 * emax / ef ), 3. ) ) * exp(-c2 * emax / ef) - emax / ef * ( 1. + c1 * c1 * c1 ) * exp(-c2) );
445 OOFEM_WARNING(
"Crack width is larger than the last user-defined value in the traction-opening law.");
447 }
else if ( ec >= emax ) {
448 for (
int i = 1; i <=
soft_w.giveSize(); i++ ) {
460 }
else if ( ec <= 0. ) {
465 for (
int i = 1; i <=
soft_w.giveSize(); i++ ) {
472 traction *= ft * ec / emax;
479 if ( ( ec >= this->
eps_f ) || ( emax >= this->
eps_f ) ) {
481 }
else if ( emax == 0. ) {
488 traction = ( ft + emax * this->
H ) * ec / emax;
497 OOFEM_WARNING(
"Cracking strain is larger than the last user-defined value in the traction-cracking-strain law.");
499 }
else if ( ec >= emax ) {
500 for (
int i = 1; i <=
soft_eps.giveSize(); i++ ) {
512 }
else if ( ec <= 0. ) {
515 for (
int i = 1; i <=
soft_eps.giveSize(); i++ ) {
522 traction *= ft * ec / emax;
536ConcreteFCM :: computeEffectiveShearModulus(
GaussPoint *gp,
TimeStep *tStep,
int shearDirection)
const
539 double G, Geff, D2tot,
N;
551 if ( shearDirection == 4 ) {
554 }
else if ( shearDirection == 5 ) {
557 }
else if ( shearDirection == 6 ) {
561 OOFEM_ERROR(
"Unexpected value of index i (4, 5, 6 permitted only)");
570 Geff = G * this->
beta / (
N - this->
beta * (
N - 1 ) );
575 Geff = G * D2tot / ( G + D2tot );
580 Geff = G * D2tot / ( G + D2tot );
593 double D2,
N, G,
E, w, beta_m;
607 D2 = G * this->
beta / ( 1. - this->
beta );
624 for (
int i = 1; i <= this->
beta_w.giveSize(); i++ ) {
632 beta_m =
min(1., beta_m);
637 if ( beta_m >= 1. ) {
640 D2 = G * beta_m / ( 1. - beta_m );
672 D2 = ConcreteFCM :: computeD2ModulusForCrack(gp, tStep, icrack);
679 D2 = ConcreteFCM :: computeD2ModulusForCrack(gp, tStep, icrack);
696 double E,
Gf, ft, Le;
699 double efail, c1, c2;
709 OOFEM_ERROR(
"For unknown reason the tensile strength has been exceeded and cracking has been initiated!");
711 ef =
Gf / ( ft * Le );
713 ef = 2. *
Gf / ( ft * Le );
715 efail = 5.14 *
Gf / ft / Le;
719 ef = 1. / ( c2 / efail + ( exp(-c2) * ( c1 * c1 * c1 + 1. ) ) / efail );
723 for (
int i = 1; i <
soft_w.giveSize(); i++ ) {
726 ef =
min(fabs(1. / slope), ef);
734 for (
int i = 1; i <
soft_eps.giveSize(); i++ ) {
737 ef =
min(fabs(1. / slope), ef);
744 if ( ef <= ft /
E ) {
753 double maxTau, crackOpening, wmax, scale;
767 }
else if ( i == 5 ) {
770 }
else if ( i == 6 ) {
774 OOFEM_ERROR(
"Unexpected number for shear stress (must be either 4, 5 or 6).");
783 crackOpening =
max(wmax, crackOpening);
786 maxTau = 0.18 * sqrt(this->
fc) / ( 0.31 + 24. * crackOpening * scale / ( this->
ag * scale + 16. ) );
811 for (
int i = 1; i <= nCracks; i++ ) {
818 sigma = ConcreteFCM :: giveNormalCrackingStress(gp, tStep, emax, i);
833 if ( RandomMaterialExtensionInterface :: give(aProperty, gp, answer) ) {
835 }
else if ( aProperty ==
gf_ID ) {
840 return FCMMaterial :: give(aProperty, gp);
849 if ( type == IST_TensileStrength ) {
854 }
else if ( type == IST_ResidualTensileStrength ) {
863 return FCMMaterial :: giveIPValue(answer, gp, type, tStep);
893ConcreteFCMStatus :: printOutputAt(FILE *file,
TimeStep *tStep)
const
895 FCMMaterialStatus :: printOutputAt(file, tStep);
903ConcreteFCMStatus :: initTempStatus()
908 FCMMaterialStatus :: initTempStatus();
913ConcreteFCMStatus :: updateYourself(
TimeStep *tStep)
920 FCMMaterialStatus :: updateYourself(tStep);
937 FCMMaterialStatus :: saveContext(stream, mode);
944 FCMMaterialStatus :: restoreContext(stream, mode);
#define REGISTER_Material(class)
double lengthScale
Collins' aggregate interlock: 1 for meter, 1000 for analysis in mm.
virtual double computeResidualTensileStrength(GaussPoint *gp, TimeStep *tStep) const
based on the maximum crack opening evaluates the residual strength
double giveTensileStrength(GaussPoint *gp, TimeStep *tStep) const override
comutes tensile strength
FloatArray beta_w
user-defined shear retention factor (with respect to crack opening)
virtual double giveFractureEnergy(GaussPoint *gp, TimeStep *tStep) const
FloatArray soft_function_eps
@ SHR_Const_ShearRetFactor
@ SHR_UserDefined_ShearRetFactor
@ SHR_Const_ShearFactorCoeff
std::unique_ptr< MaterialStatus > CreateStatus(GaussPoint *gp) const override
double fc
Collins' aggregate interlock: compressive strength in MPa.
FloatArray soft_w
user-defined softening (traction-COD)
double ag
Collins' aggregate interlock: aggregate diameter in appropriate units (same as FE mesh).
double beta
shear retention factor
FloatArray soft_function_w
FloatArray soft_eps
user-defined softening (traction-strain)
double sf_numer
shear factor for numerical purpose
double eps_f
strain at failure
double Ft
Tensile strength.
double Gf
Fracture energy.
ShearStrengthType shearStrengthType
double giveCrackingModulusInTension(MatResponseMode rMode, GaussPoint *gp, TimeStep *tStep, int i) const override
returns stiffness in the normal direction of the i-th crack
MaterialStatus * giveStatus(GaussPoint *gp) const override
@ ST_LinearHardeningStrain
ShearRetentionType shearType
double H
hardening modulus
int giveGlobalNumber() const
double giveCharLength(int icrack) const
returns characteristic length associated with i-th crack direction
const IntArray & giveTempCrackStatus()
returns vector of temporary crack statuses
virtual int giveNumberOfTempCracks() const
returns temporary number of cracks
FCMMaterialStatus(GaussPoint *g)
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)
virtual double computeNormalCrackOpening(GaussPoint *gp, int i) const
uses temporary cracking strain and characteristic length to obtain the crack opening
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 double giveNumberOfCracksForShearDirection(GaussPoint *gp, int i) const
returns number of cracks for given shear direction (i = 4, 5, 6) which is treated as the maximum of t...
virtual bool isIntact(GaussPoint *gp, int icrack) const
returns true for closed or no crack (i = 1, 2, 3)
virtual double giveCrackSpacing(void) const
returns either user-provided value of crack spacing or a value computed from composition
virtual double giveNumberOfCracksInDirection(GaussPoint *gp, int iCrack) const
returns number of fictiotious parallel cracks in the direction of i-th crack
virtual double computeOverallElasticShearModulus(GaussPoint *gp, TimeStep *tStep) const
returns overall shear modulus
virtual double computeOverallElasticStiffness(GaussPoint *gp, TimeStep *tStep) const
returns overall Young's modulus
virtual double computeMaxNormalCrackOpening(GaussPoint *gp, TimeStep *tStep, int i) const
uses maximum equilibrated cracking strain and characteristic length to obtain the maximum reached cra...
virtual double computeNumerD2Modulus(GaussPoint *gp, TimeStep *tStep, int i) const
shear modulus in a STIFFNESS MATRIX for a given shear direction (4, 5, 6)
FCMMaterial(int n, Domain *d)
void zero()
Zeroes all coefficients of receiver.
bool hasMaterialStatus(IntegrationPointStatusIDType key=IPSID_Default) const
IntegrationPointStatus * setMaterialStatus(std::unique_ptr< IntegrationPointStatus > ptr, IntegrationPointStatusIDType key=IPSID_Default)
IntegrationPointStatus * giveMaterialStatus(IntegrationPointStatusIDType key=IPSID_Default)
Element * giveElement()
Returns corresponding element to receiver.
GaussPoint * gp
Associated integration point.
RandomMaterialExtensionInterface()
Constructor.
void _generateStatusVariables(GaussPoint *) const
RandomMaterialStatusExtensionInterface()
#define _IFT_ConcreteFCM_soft_function_eps
#define _IFT_ConcreteFCM_ag
#define _IFT_ConcreteFCM_gf
#define _IFT_ConcreteFCM_fc
#define _IFT_ConcreteFCM_beta_w
#define _IFT_ConcreteFCM_sf_numer
#define _IFT_ConcreteFCM_beta
#define _IFT_ConcreteFCM_eps_f
#define _IFT_ConcreteFCM_shearType
#define _IFT_ConcreteFCM_soft_function_w
#define _IFT_ConcreteFCM_ft
#define _IFT_ConcreteFCM_beta_function
#define _IFT_ConcreteFCM_soft_eps
#define _IFT_ConcreteFCM_lengthScale
#define _IFT_ConcreteFCM_shearStrengthType
#define _IFT_ConcreteFCM_soft_w
#define _IFT_ConcreteFCM_softType
#define _IFT_ConcreteFCM_sf
#define _IFT_ConcreteFCM_H
#define OOFEM_WARNING(...)
#define _IFT_FCM_crackSpacing
FloatArrayF< N > min(const FloatArrayF< N > &a, const FloatArrayF< N > &b)
FloatArrayF< N > max(const FloatArrayF< N > &a, const FloatArrayF< N > &b)
@ RandomMaterialStatusExtensionInterfaceType