50IsotropicDamageMaterial :: ~IsotropicDamageMaterial()
56IsotropicDamageMaterial :: hasMaterialModeCapability(MaterialMode mode)
const
58 return mode == _3dMat || mode == _PlaneStress || mode == _PlaneStrain || mode == _1dMat;
63IsotropicDamageMaterial :: give3dMaterialStiffnessMatrix(MatResponseMode mode,
72 if ( mode == ElasticStiffness ) {
75 tempDamage = status->giveTempDamage();
80 return d * (1.0 - tempDamage);
100 double f, equivStrain, tempKappa = 0.0, omega = 0.0;
124 tempKappa = equivStrain;
125 this->
initDamaged(tempKappa, reducedTotalStrainVector, gp);
131 tempKappa = equivStrain;
132 this->
initDamaged(tempKappa, reducedTotalStrainVector, gp);
134 if ( omega < status->giveDamage() ) {
139 OOFEM_ERROR(
"unsupported loading/unloading criterion");
148 reducedTotalStrainVector.
at(1) -= epsp;
151 if ( ( reducedTotalStrainVector.
giveSize() > 1 ) || ( reducedTotalStrainVector.
at(1) > 0. ) ) {
153 de.
times(1.0 - omega);
156 answer.beProductOf(de, reducedTotalStrainVector);
163#ifdef keep_track_of_dissipated_energy
170IsotropicDamageMaterial :: givePlaneStressStiffMtrx(MatResponseMode mode,
GaussPoint *gp,
TimeStep *tStep)
const
174 if ( mode == ElasticStiffness ) {
177 tempDamage = status->giveTempDamage();
182 d *= 1.0 - tempDamage;
183 if ( mode == TangentStiffness ) {
184 double damage = status->giveDamage();
185 if ( tempDamage > damage ) {
189 stress = status->giveTempStressVector();
190 strain = status->giveTempStrainVector();
191 tempKappa = status->giveTempKappa();
193 stress.
times( 1. / ( 1 - tempDamage ) );
201 correctionTerm.
times(-damagePrime);
211IsotropicDamageMaterial :: givePlaneStrainStiffMtrx(MatResponseMode mode,
GaussPoint *gp,
TimeStep *tStep)
const
215 if ( mode == ElasticStiffness ) {
218 tempDamage = status->giveTempDamage();
228IsotropicDamageMaterial :: give1dStressStiffMtrx(MatResponseMode mode,
GaussPoint *gp,
TimeStep *tStep)
const
232 if ( mode == ElasticStiffness ) {
235 tempDamage = status->giveTempDamage();
240 answer *= 1.0 - tempDamage;
242 if ( mode == TangentStiffness ) {
243 double damage = status->giveDamage();
244 if ( tempDamage > damage ) {
248 stress = status->giveTempStressVector();
249 strain = status->giveTempStrainVector();
250 tempKappa = status->giveTempKappa();
252 stress.
times( 1. / ( 1 - tempDamage ) );
260 correctionTerm.
times(-damagePrime);
277 if ( type == IST_DamageScalar ) {
282 }
else if ( type == IST_DamageTensor ) {
287 }
else if ( type == IST_PrincipalDamageTensor ) {
292 }
else if ( type == IST_DamageTensorTemp ) {
297 }
else if ( type == IST_PrincipalDamageTempTensor ) {
302 }
else if ( type == IST_MaxEquivalentStrainLevel ) {
306 }
else if ( type == IST_CharacteristicLength ) {
310 }
else if ( type == IST_CrackWidth ) {
315 answer.
at(1) = status->
giveLe() * status->
giveDamage() * reducedTotalStrainVector.
at(maxStrain);
316 }
else if ( type == IST_CrackDirs ) {
320 }
else if ( type == IST_CrackVector ) {
323 }
else if ( type == IST_CumPlasticStrain ) {
328#ifdef keep_track_of_dissipated_energy
329 }
else if ( type == IST_StressWorkDensity ) {
333 }
else if ( type == IST_DissWorkDensity ) {
336 }
else if ( type == IST_FreeEnergyDensity ) {
343 return StructuralMaterial :: giveIPValue(answer, gp, type, tStep);
362 this->tempDillatCoeff,
367double IsotropicDamageMaterial :: give(
int aProperty,
GaussPoint *gp)
const
375 StructuralMaterial :: initializeFrom(ir);
392 StructuralMaterial :: giveInputRecord(input);
424IsotropicDamageMaterialStatus :: printOutputAt(FILE *file,
TimeStep *tStep)
const
426 StructuralMaterialStatus :: printOutputAt(file, tStep);
427 fprintf(file,
"status { ");
429 fprintf(file,
"kappa %f", this->
kappa);
430 }
else if ( this->
damage > 0.0 ) {
431 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) );
433#ifdef keep_track_of_dissipated_energy
436 fprintf(file,
"stressW %f ", this->
stressWork);
440 fprintf(file,
"}\n");
445IsotropicDamageMaterialStatus :: initTempStatus()
447 StructuralMaterialStatus :: initTempStatus();
451#ifdef keep_track_of_dissipated_energy
459IsotropicDamageMaterialStatus :: updateYourself(
TimeStep *tStep)
461 StructuralMaterialStatus :: updateYourself(tStep);
464#ifdef keep_track_of_dissipated_energy
474 StructuralMaterialStatus :: saveContext(stream, mode);
484#ifdef keep_track_of_dissipated_energy
499 StructuralMaterialStatus :: restoreContext(stream, mode);
509#ifdef keep_track_of_dissipated_energy
521#ifdef keep_track_of_dissipated_energy
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.
virtual void restoreContext(DataStream &stream, ContextMode mode)
virtual void saveContext(DataStream &stream, ContextMode mode)
Index giveSize() const
Returns the size of receiver.
void beDifferenceOf(const FloatArray &a, const FloatArray &b)
void zero()
Zeroes all coefficients of receiver.
int giveIndexMaxElem(void)
void beDyadicProductOf(const FloatArray &vec1, const FloatArray &vec2)
GaussPoint * gp
Associated integration point.
double stressWork
Density of total work done by stresses on strain increments.
double damage
Damage level of material.
double giveStressWork() const
Returns the density of total work of stress on strain increments.
double kappa
Scalar measure of the largest strain level ever reached in material.
double giveKappa() const
Returns the last equilibrated scalar measure of the largest strain level.
double tempDissWork
Non-equilibrated density of dissipated work.
FloatArrayF< 3 > giveCrackVector() const
Returns crack vector stored in receiver. This is useful for plotting cracks as a vector field (paravi...
void computeWork(GaussPoint *gp)
Computes the increment of total stress work and of dissipated work.
void setTempKappa(double newKappa)
Sets the temp scalar measure of the largest strain level to given value.
double giveLe() const
Returns characteristic length stored in receiver.
double giveDamage() const
Returns the last equilibrated damage level.
double giveTempDamage() const
Returns the temp. damage level.
FloatArrayF< 3 > crackVector
Crack orientation normalized to damage magnitude. This is useful for plotting cracks as a vector fiel...
void setTempDamage(double newDamage)
Sets the temp damage level to given value.
double giveCrackAngle() const
Returns crack angle stored in receiver.
double tempDamage
Non-equilibrated damage level of material.
double giveDissWork() const
Returns the density of dissipated work.
double dissWork
Density of dissipated work.
double tempStressWork
Non-equilibrated density of total work done by stresses on strain increments.
double tempKappa
Non-equilibrated scalar measure of the largest strain level.
double maxOmega
Maximum limit on omega. The purpose is elimination of a too compliant material which may cause conver...
virtual void initDamaged(double kappa, FloatArray &totalStrainVector, GaussPoint *gp) const
LinearElasticMaterial * linearElasticMaterial
Reference to bulk (undamaged) material.
double tempDillatCoeff
Coefficient of thermal dilatation.
int permStrain
Indicator of the type of permanent strain formulation (0 = standard damage with no permanent strain).
virtual double computeDamageParam(double kappa, const FloatArray &strain, GaussPoint *gp) const =0
enum oofem::IsotropicDamageMaterial::loaUnloCriterium llcriteria
virtual double evaluatePermanentStrain(double kappa, double omega) const
virtual double computeEquivalentStrain(const FloatArray &strain, GaussPoint *gp, TimeStep *tStep) const =0
virtual void computeEta(FloatArray &answer, const FloatArray &strain, GaussPoint *gp, TimeStep *tStep) const
virtual double damageFunctionPrime(double kappa, GaussPoint *gp) const
void saveContext(DataStream &stream, ContextMode mode) override
LinearElasticMaterial * giveLinearElasticMaterial() const
Returns reference to undamaged (bulk) material.
void restoreContext(DataStream &stream, ContextMode mode) override
virtual MaterialStatus * giveStatus(GaussPoint *gp) const
virtual void initTempStatus(GaussPoint *gp) const
const FloatArray & giveStrainVector() const
Returns the const pointer to receiver's strain vector.
StructuralMaterialStatus(GaussPoint *g)
Constructor. Creates new StructuralMaterialStatus with IntegrationPoint g.
FloatArray tempStrainVector
Temporary strain vector in reduced form (to find balanced state).
FloatArray tempStressVector
Temporary stress vector in reduced form (increments are used mainly in nonlinear analysis).
FloatArray stressVector
Equilibrated stress vector in reduced form.
FloatArray strainVector
Equilibrated strain vector in reduced form.
void letTempStressVectorBe(const FloatArray &v)
Assigns tempStressVector to given vector v.
void letTempStrainVectorBe(const FloatArray &v)
Assigns tempStrainVector to given vector v.
StructuralMaterial(int n, Domain *d)
virtual void giveStiffnessMatrix(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep) const
void giveStressDependentPartOfStrainVector(FloatArray &answer, GaussPoint *gp, const FloatArray &reducedStrainVector, TimeStep *tStep, ValueModeType mode) const
#define _IFT_IsotropicDamageMaterial_talpha
#define _IFT_IsotropicDamageMaterial_maxOmega
#define _IFT_IsotropicDamageMaterial_permstrain
FloatArrayF< N > min(const FloatArrayF< N > &a, const FloatArrayF< N > &b)
FloatArrayF< N > max(const FloatArrayF< N > &a, const FloatArrayF< N > &b)
@ CIO_IOERR
General IO error.