54MPSDamMaterialStatus :: MPSDamMaterialStatus(
GaussPoint *g,
int nunits) :
58 int rsize = StructuralMaterial :: giveSizeOfVoigtSymVector( g->
giveMaterialMode() );
65MPSDamMaterialStatus :: initTempStatus()
67 MPSMaterialStatus :: initTempStatus();
81MPSDamMaterialStatus :: updateYourself(
TimeStep *tStep)
83 MPSMaterialStatus :: updateYourself(tStep);
97MPSDamMaterialStatus :: giveCrackVector(
FloatArray &answer)
const
104MPSDamMaterialStatus :: printOutputAt(FILE *file,
TimeStep *tStep)
const
106 MPSMaterialStatus :: printOutputAt(file, tStep);
108 fprintf(file,
"damage status { ");
110 fprintf(file,
"kappa %f", this->
kappa);
111 }
else if ( this->
damage > 0.0 ) {
112 fprintf( file,
"kappa %f, damage %f crackVector %f %f %f", this->
kappa, this->
damage, this->
crackVector.at(1), this->crackVector.at(2), this->crackVector.at(3) );
114 fprintf(file,
"}\n");
121 MPSMaterialStatus :: saveContext(stream, mode);
156 MPSMaterialStatus :: restoreContext(stream, mode);
198MPSDamMaterial :: hasMaterialModeCapability(MaterialMode mode)
const
200 return mode == _3dMat || mode == _PlaneStress || mode == _PlaneStrain || mode == _1dMat;
207 MPSMaterial :: initializeFrom(ir);
232 OOFEM_ERROR(
"Fracture energy at 28 days must be positive");
237 OOFEM_ERROR(
"Tensile strength at 28 days must be positive");
249 switch ( damageLaw ) {
268 OOFEM_ERROR(
"Softening type number %d is unknown", damageLaw);
279 if ( this->
E < 0. ) {
280 this->
E = 1. / MPSMaterial :: computeCreepFunction(28.01*this->
lambda0, 28.*this->
lambda0, gp, tStep);
293 double f, sigma1, kappa, tempKappa = 0.0, omega = 0.0;
296 MPSMaterial :: giveRealStressVector(tempEffectiveStress, gp, totalStrain, tStep);
307#ifdef supplementary_info
314 answer = tempEffectiveStress;
321 if ( principalStress.
at(1) > 0.0 ) {
322 sigma1 = principalStress.
at(1);
325 kappa = sigma1 / this->
E;
333#ifdef supplementary_info
334 double residualStrength = 0.;
344 residualStrength =
E * e0;
346 double gf, ef, wf = 0., Le;
351 wf = gf / this->
E / e0;
353 wf = 2. * gf / this->
E / e0;
361 residualStrength =
E * e0 * ( ef - tempKappa ) / ( ef - e0 );
363 residualStrength =
E * e0 * exp(-1. * ( tempKappa - e0 ) / ef);
365 OOFEM_ERROR(
"Unknown softening type for cohesive crack model.");
379 for (
int i = 1; i <= principalStress.
giveSize(); i++ ) {
380 crackPlaneNormal.
at(i) = principalDir.
at(i, 1);
382 this->
initDamaged(tempKappa, crackPlaneNormal, gp, tStep);
389 tempNominalStress = tempEffectiveStress;
393 tempNominalStress.
times(1. - omega);
394 answer.
add(tempNominalStress);
400 for (
int i = 1; i <= principalStress.
giveSize(); i++ ) {
401 if ( principalStress.
at(i) > 0. ) {
403 principalStress.
at(i) *= ( 1. - omega );
407 if ( mode == _PlaneStress ) {
418 if ( mode == _PlaneStress ) {
419 answer.
add(principalStress);
423 answer.
add(redFormStress);
425 answer.
add(principalStress);
429 answer.
add(tempEffectiveStress);
432#ifdef supplementary_info
434 if ( ( omega == 0. ) || ( sigma1 <= 0 ) ) {
443 double strainWithoutTemperShrink = principalStrains.
at(1);
449 crackWidth = status->
giveCharLength() * omega * strainWithoutTemperShrink;
470 if ( status->giveDamage() == 0. ) {
487 return this->
ft / this->
E;
505MPSDamMaterial :: computeFractureEnergy(
double equivalentTime)
const
529 double fractureEnergy28;
530 if ( this->
gf28 > 0. ) {
531 fractureEnergy28 = this->
gf28;
533 fractureEnergy28 = 73. * pow(
fib_fcm28, 0.18) / MPSMaterial :: stiffnessFactor;
543 return fractureEnergy28 * ftm / ftm28;
547MPSDamMaterial :: computeTensileStrength(
double equivalentTime)
const
551 if ( this->
ft28 > 0. ) {
552 double fcm28mod = pow ( this->
ft28 * MPSMaterial :: stiffnessFactor / 0.3e6, 3./2. ) + 8.;
553 fcm = exp(
fib_s * ( 1. - sqrt(28. * MPSMaterial :: lambda0 / equivalentTime) ) ) * fcm28mod;
557 fcm = exp(
fib_s * ( 1. - sqrt(28. * MPSMaterial :: lambda0 / equivalentTime) ) ) *
fib_fcm28;
563 ftm = 2.12 * log ( 1. + 0.1 * fcm ) * 1.e6 / MPSMaterial :: stiffnessFactor;
564 }
else if ( fcm <= 20. ) {
565 ftm = 0.07862 * fcm * 1.e6 / MPSMaterial :: stiffnessFactor;
567 ftm = 0.3 * pow(fcm - 8., 2. / 3.) * 1.e6 / MPSMaterial :: stiffnessFactor;
586MPSDamMaterial :: computeDamage(
double kappa,
GaussPoint *gp)
const
596MPSDamMaterial :: computeDamageForCohesiveCrack(
double kappa,
GaussPoint *gp)
const
601 double e0 = this->
givee0(gp);
603 double gf = this->
givegf(gp);
607 wf = gf / this->
E / e0;
609 wf = 2. * gf / this->
E / e0;
614 double Le = status->giveCharLength();
621 minGf = this->
E * e0 * e0 * Le;
623 minGf = this->
E * e0 * e0 * Le / 2.;
628 OOFEM_WARNING(
"Material number %d, decrease e0, or increase Gf from %f to Gf=%f", this->
giveNumber(), gf, minGf);
636 omega = ( ef / kappa ) * ( kappa - e0 ) / ( ef - e0 );
650 double help = omega * kappa / ef;
651 R = ( 1. - omega ) * kappa - e0 *exp(-help);
652 double Lhs = kappa - e0 *exp(-help) * kappa / ef;
659 OOFEM_ERROR(
"Unknown softening type for cohesive crack model.");
663 OOFEM_ERROR(
"damage parameter is %f, which is greater than 1, snap-back problems", omega);
667 OOFEM_WARNING(
"damage parameter is %f, which is smaller than 0, snap-back problems", omega);
675#ifdef supplementary_info
676 double residualStrength = 0.;
679 residualStrength =
E * e0;
682 residualStrength =
E * e0 * ( ef - kappa ) / ( ef - e0 );
684 residualStrength =
E * e0 * exp(-1. * ( kappa - e0 ) / ef);
686 OOFEM_ERROR(
"Unknown softening type for cohesive crack model.");
690 status->setResidualTensileStrength(residualStrength);
706 double e0 = this->
givee0(gp);
707 double gf = this->
givegf(gp);
715 wf = 2. * gf /
E / e0;
720 if ( ( kappa > e0 ) && ( status->giveDamage() == 0. ) ) {
721 status->setCrackVector(principalDirection);
724 status->setCharLength(le);
726 if ( gf != 0. && e0 >= ( wf / le ) ) {
727 OOFEM_WARNING(
"Fracturing strain %e is lower than the elastic strain e0=%e, possible snap-back. Element number %d, wf %e, le %e. Increase fracturing strain or decrease element size by at least %f", wf / le, e0, gp->
giveElement()->
giveLabel(), wf, le, e0/(wf/le) );
737std::unique_ptr<MaterialStatus>
743 return std::make_unique<MPSDamMaterialStatus>(gp,
nUnits);
748MPSDamMaterial :: give3dMaterialStiffnessMatrix(MatResponseMode mode,
752 auto d = RheoChainMaterial :: give3dMaterialStiffnessMatrix(ElasticStiffness, gp, tStep);
754 if ( mode == ElasticStiffness || ( mode == SecantStiffness && !this->
isotropic ) ) {
759 double tempDamage =
min(status->giveTempDamage(), this->maxOmega);
760 return d * (1.0 - tempDamage);
765MPSDamMaterial :: givePlaneStressStiffMtrx(MatResponseMode mode,
769 auto d = RheoChainMaterial :: givePlaneStressStiffMtrx(ElasticStiffness, gp, tStep);
771 if ( mode == ElasticStiffness || ( mode == SecantStiffness && !this->
isotropic ) ) {
776 double tempDamage =
min(status->giveTempDamage(), this->maxOmega);
777 return d * (1.0 - tempDamage);
782MPSDamMaterial :: givePlaneStrainStiffMtrx(MatResponseMode mode,
786 auto d = RheoChainMaterial :: givePlaneStrainStiffMtrx(ElasticStiffness, gp, tStep);
788 if ( mode == ElasticStiffness || ( mode == SecantStiffness && !this->
isotropic ) ) {
793 double tempDamage =
min(status->giveTempDamage(), this->maxOmega);
794 return d * (1.0 - tempDamage);
799MPSDamMaterial :: give1dStressStiffMtrx(MatResponseMode mode,
803 auto d = RheoChainMaterial :: give1dStressStiffMtrx(ElasticStiffness, gp, tStep);
805 if ( mode == ElasticStiffness || ( mode == SecantStiffness && !this->
isotropic ) ) {
810 double tempDamage =
min(status->giveTempDamage(), this->maxOmega);
811 return d * (1.0 - tempDamage);
819 if ( type == IST_DamageScalar ) {
822 answer.
at(1) = status->giveDamage();
824 }
else if ( type == IST_DamageTensor ) {
827 answer.
at(1) = answer.
at(2) = answer.
at(3) = status->giveDamage();
829 }
else if ( type == IST_PrincipalDamageTensor ) {
832 answer.
at(1) = status->giveDamage();
834 }
else if ( type == IST_DamageTensorTemp ) {
837 answer.
at(1) = answer.
at(2) = answer.
at(3) = status->giveTempDamage();
839 }
else if ( type == IST_PrincipalDamageTempTensor ) {
842 answer.
at(1) = status->giveTempDamage();
844 }
else if ( type == IST_CharacteristicLength ) {
847 answer.
at(1) = status->giveCharLength();
849 }
else if ( type == IST_CrackVector ) {
852 status->giveCrackVector(answer);
854 }
else if ( type == IST_CrackWidth ) {
857 answer.
at(1) = status->giveCrackWidth();
859 }
else if ( type == IST_ResidualTensileStrength ) {
862 answer.
at(1) = status->giveResidualTensileStrength();
864 }
else if ( type == IST_TensileStrength ) {
865 double tequiv = status->giveEquivalentTime();
872 }
else if ( type == IST_CrackIndex ) {
876 if ( status->giveDamage()>0. ){
883 StructuralMaterial :: giveIPValue(principalStress, gp, IST_PrincipalStressTensor, tStep);
884 double tequiv = status->giveEquivalentTime();
885 if ( tequiv >= 0. ) {
887 if (
ft > 1.e-20 && principalStress.
at(1)>1.e-20 ) {
888 answer.
at(1) = principalStress.
at(1)/
ft;
893 return MPSMaterial :: giveIPValue(answer, gp, type, tStep);
#define REGISTER_Material(class)
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.
int giveGlobalNumber() const
virtual double giveCharacteristicSize(GaussPoint *gp, FloatArray &normalToCrackPlane, ElementCharSizeMethod method)
Index giveSize() const
Returns the size of receiver.
void resizeWithValues(Index s, std::size_t allocChunk=0)
void zero()
Zeroes all coefficients of receiver.
void rotatedWith(FloatMatrix &r, char mode)
void beScaled(double s, const FloatArray &b)
void add(const FloatArray &src)
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.
double var_e0
hydration-degree dependent equivalent strain at stress peak
double tempKappa
Non-equilibrated scalar measure of the largest strain level.
FloatArray tempEffectiveStressVector
Temporary stress vector in reduced form (increments are used mainly in nonlinear analysis).
double tempDamage
Non-equilibrated damage level of material.
void setTempKappa(double newKappa)
Sets the temp scalar measure of the largest strain level to given value.
double giveCharLength() const
Returns characteristic length stored in receiver.
void setResidualTensileStrength(double src)
double damage
Damage level of material.
void setCrackWidth(double src)
FloatArray effectiveStressVector
Equilibrated stress vector in reduced form.
double kappa
Scalar measure of the largest strain level ever reached in material.
void letTempViscoelasticStressVectorBe(FloatArray v)
Assigns tempStressVector to given vector v.
double giveDamage() const
Returns the last equilibrated damage level.
void setTempDamage(double newDamage)
Sets the temp damage level to given value.
FloatArray crackVector
Crack orientation normalized to damage magnitude. This is useful for plotting cracks as a vector fiel...
double var_gf
hydration-degree dependent fracture energy
double charLength
Characteristic length.
double giveKappa() const
Returns the last equilibrated scalar measure of the largest strain level.
double givee0(GaussPoint *gp) const
@ ST_Linear_Cohesive_Crack
@ ST_Exponential_Cohesive_Crack
void initDamagedFib(GaussPoint *gp, TimeStep *tStep) const
double computeDamage(double kappa, GaussPoint *gp) const
void initDamaged(double kappa, FloatArray &totalStrainVector, GaussPoint *gp, TimeStep *tStep) const
double E
dummy Young's modulus
double givegf(GaussPoint *gp) const
int checkSnapBack
Check possible snap back flag.
double gf28
28-day value of fracture energy. Used only with "timedepfracturing"
double ft28
28-day value of tensile strength. Used only with "timedepfracturing"
ElementCharSizeMethod ecsMethod
Method used for evaluation of characteristic element size.
SofteningType softType
Parameter specifying the type of softening (damage law).
double computeDamageForCohesiveCrack(double kappa, GaussPoint *gp) const
virtual double computeTensileStrength(double equivalentTime) const
virtual double computeFractureEnergy(double equivalentTime) const
double ft
Equivalent strain at stress peak (or a similar parameter).
MPSMaterialStatus(GaussPoint *g, int nunits)
double giveTempAutogenousShrinkageStrain(void)
double giveTempDryingShrinkageStrain(void)
double computeEquivalentTime(GaussPoint *gp, TimeStep *tStep, int option) const
MPSMaterial(int n, Domain *d)
double lambda0
constant equal to one day in time units of analysis (eg. 86400 if the analysis runs in seconds)
virtual MaterialStatus * giveStatus(GaussPoint *gp) const
double giveTempThermalStrain(void)
bool isActivated(TimeStep *tStep) const override
Extended meaning: returns true if the material is cast (target time > casting time) or the precasing ...
int nUnits
Number of (Maxwell or Kelvin) units in the rheologic chain.
void convertFromFullForm(const FloatArray &reducedform, MaterialMode mode)
void computePrincipalValDir(FloatArray &answer, FloatMatrix &dir) const override
void letTempStressVectorBe(const FloatArray &v)
Assigns tempStressVector to given vector v.
void letTempStrainVectorBe(const FloatArray &v)
Assigns tempStrainVector to given vector v.
static FloatMatrixF< 3, 3 > givePlaneStressVectorTranformationMtrx(const FloatMatrixF< 2, 2 > &base, bool transpose=false)
static FloatMatrixF< 6, 6 > giveStressVectorTranformationMtrx(const FloatMatrixF< 3, 3 > &base, bool transpose=false)
static void computePrincipalValues(FloatArray &answer, const FloatArray &s, stressStrainPrincMode mode)
Common functions for convenience.
static int giveSizeOfVoigtSymVector(MaterialMode mmode)
#define OOFEM_WARNING(...)
#define _IFT_MPSMaterial_fc
#define _IFT_MPSDamMaterial_gf28
#define _IFT_MPSDamMaterial_damageLaw
#define _IFT_MPSDamMaterial_isotropic
#define MPSDAMMAT_ITERATION_LIMIT
#define _IFT_MPSDamMaterial_timedepfracturing
#define _IFT_MPSDamMaterial_gf
#define _IFT_MPSDamMaterial_ft
#define _IFT_MPSDamMaterial_fib_s
#define _IFT_MPSDamMaterial_checkSnapBack
#define _IFT_MPSDamMaterial_ft28
FloatArrayF< N > min(const FloatArrayF< N > &a, const FloatArrayF< N > &b)
@ principal_strain
For computing principal strains from engineering strains.
@ CIO_IOERR
General IO error.