53IsotropicGradientDamageMaterial :: IsotropicGradientDamageMaterial(
int n,
Domain *d) :
60IsotropicGradientDamageMaterial :: initializeFrom(
InputRecord &ir)
62 IsotropicDamageMaterial1 :: initializeFrom(ir);
63 GradientDamageMaterialExtensionInterface :: initializeFrom(ir);
65 int formulationType = 0;
67 if ( formulationType == 0 ) {
69 }
else if ( formulationType == 1 ) {
75 }
else if ( formulationType == 2 ) {
82 return this->
mapper.initializeFrom(ir);
90IsotropicGradientDamageMaterial :: hasMaterialModeCapability(MaterialMode mode)
const
92 return mode == _1dMat || mode == _PlaneStress || mode == _PlaneStrain || mode == _3dMat;
96IsotropicGradientDamageMaterial :: giveStiffnessMatrix(
FloatMatrix &answer,
111 if ( mode == ElasticStiffness ) {
115 if ( tempDamage > 0.0 ) {
121 answer.
times(1.0 - tempDamage);
149 if ( mode == TangentStiffness ) {
153 if ( tempDamage < 1. ) {
154 stress.
times( 1. / ( 1 - tempDamage ) );
160 answer.
times(-gPrime);
194 StructuralMaterial :: giveReducedSymVectorForm( reducedStrain, totalStrain, gp->
giveMaterialMode() );
195 this->
computeEta(eta, reducedStrain, gp, tStep);
197 if ( mode == TangentStiffness ) {
222 answer.
times(1. / iA);
247 answer.
at(1, 1) += 1. / iA;
250 if ( mode == TangentStiffness ) {
251 if ( tempKappa > status->
giveKappa() && iA != 0 ) {
256 answer.
at(1, 1) += iAPrime / iA / iA * gPrime * ( epsEqNonLocal - epsEqLocal );
265IsotropicGradientDamageMaterial :: computeEikonalInternalLength_a(
GaussPoint *gp)
274IsotropicGradientDamageMaterial :: computeEikonalInternalLength_b(
GaussPoint *gp)
284IsotropicGradientDamageMaterial :: computeEikonalInternalLength_aPrime(
GaussPoint *gp)
293IsotropicGradientDamageMaterial :: computeEikonalInternalLength_bPrime(
GaussPoint *gp)
314 answer.
times(iL * iL);
327 if ( mode == TangentStiffness ) {
341 answer.
times(factor);
355 answer.
times(iBPrime * gPrime);
369IsotropicGradientDamageMaterial :: giveDimension(
GaussPoint *gp)
385IsotropicGradientDamageMaterial :: giveNonlocalInternalForces_N_factor(
double &answer,
double nlDamageDrivingVariable,
GaussPoint *gp,
TimeStep *tStep)
393 answer = answer / iA;
401 answer = nlDamageDrivingVariable_grad;
407 answer.
times(iL * iL);
413IsotropicGradientDamageMaterial :: computeInternalLength(
GaussPoint *gp)
430IsotropicGradientDamageMaterial :: giveRealStressVectorGradientDamage(
FloatArray &stress,
double &localDamageDrivingVariable,
GaussPoint *gp,
const FloatArray &totalStrain,
double nonlocalDamageDrivingVariable,
TimeStep *tStep)
442 double f, damage, tempKappa = 0.0;
457 f = nonlocalDamageDrivingVariable - status->giveKappa();
460 tempKappa = status->giveKappa();
461 damage = status->giveDamage();
464 tempKappa = nonlocalDamageDrivingVariable;
465 this->
initDamaged(nonlocalDamageDrivingVariable, reducedTotalStrainVector, gp);
467 damage = this->
computeDamageParam(nonlocalDamageDrivingVariable, reducedTotalStrainVector, gp);
471 tempKappa = nonlocalDamageDrivingVariable;
472 this->
initDamaged(nonlocalDamageDrivingVariable, strain, gp);
473 damage = this->
computeDamageParam(nonlocalDamageDrivingVariable, reducedTotalStrainVector, gp);
474 if ( damage < status->giveDamage() ) {
476 damage = status->giveDamage();
479 OOFEM_ERROR(
"unsupported loading/uloading criteria");
483 lmat->giveStiffnessMatrix(de, SecantStiffness, gp, tStep);
484 de.
times(1.0 - damage);
488 status->letTempStrainVectorBe(totalStrain);
489 status->letTempStressVectorBe(stress);
490 status->setTempLocalDamageDrivingVariable(localDamageDrivingVariable);
491 status->setTempNonlocalDamageDrivingVariable(nonlocalDamageDrivingVariable);
492 status->setTempKappa(tempKappa);
493 status->setTempDamage(damage);
494#ifdef keep_track_of_dissipated_energy
495 status->computeWork(gp);
502std::unique_ptr<MaterialStatus>
503IsotropicGradientDamageMaterial :: CreateStatus(
GaussPoint *gp)
const
505 return std::make_unique<IsotropicGradientDamageMaterialStatus>(gp);
514IsotropicGradientDamageMaterialStatus :: initTempStatus()
520 IsotropicDamageMaterial1Status :: initTempStatus();
521 GradientDamageMaterialStatusExtensionInterface :: initTempStatus();
528IsotropicGradientDamageMaterialStatus :: updateYourself(
TimeStep *tStep)
535 IsotropicDamageMaterial1Status :: updateYourself(tStep);
536 GradientDamageMaterialStatusExtensionInterface :: updateYourself(tStep);
#define REGISTER_Material(class)
void beProductOf(const FloatMatrix &aMatrix, const FloatArray &anArray)
static FloatMatrix fromArray(const FloatArray &vector, bool transpose=false)
void resize(Index rows, Index cols)
*Sets size of receiver to be an empty matrix It will have zero rows and zero columns size void clear()
void zero()
Zeroes all coefficient of receiver.
double at(std::size_t i, std::size_t j) const
void beUnitMatrix()
Sets receiver to unity matrix.
MaterialMode giveMaterialMode()
Returns corresponding material mode of receiver.
GradientDamageMaterialExtensionInterface(Domain *d)
virtual double giveTempLocalDamageDrivingVariable()
virtual double giveTempNonlocalDamageDrivingVariable()
const FloatArray & giveTempNonlocalDamageDrivingVariableGrad() const
IsotropicDamageMaterial1Status(GaussPoint *g)
Constructor.
IsotropicDamageMaterial1(int n, Domain *d)
Constructor.
static MMAContainingElementProjection mapper
Mapper used to map internal variables in adaptivity.
double computeEquivalentStrain(const FloatArray &strain, GaussPoint *gp, TimeStep *tStep) const override
double computeDamageParam(double kappa, const FloatArray &strain, GaussPoint *gp) const override
MaterialStatus * giveStatus(GaussPoint *gp) const override
void initDamaged(double kappa, FloatArray &totalStrainVector, GaussPoint *gp) const override
double damageFunctionPrime(double kappa, GaussPoint *gp) const override
void computeEta(FloatArray &answer, const FloatArray &strain, GaussPoint *gp, TimeStep *tStep) const override
double damage
Damage level of material.
double giveKappa() const
Returns the last equilibrated scalar measure of the largest strain level.
double giveTempKappa() const
Returns the temp. scalar measure of the largest strain level.
double giveDamage() const
Returns the last equilibrated damage level.
double giveTempDamage() const
Returns the temp. damage level.
double tempDamage
Non-equilibrated damage level of material.
double maxOmega
Maximum limit on omega. The purpose is elimination of a too compliant material which may cause conver...
enum oofem::IsotropicDamageMaterial::loaUnloCriterium llcriteria
LinearElasticMaterial * giveLinearElasticMaterial() const
Returns reference to undamaged (bulk) material.
double computeEikonalInternalLength_a(GaussPoint *gp)
int giveDimension(GaussPoint *gp)
double computeEikonalInternalLength_b(GaussPoint *gp)
@ GDFT_DecreasingInteractions
GradientDamageFormulationType gradientDamageFormulationType
double computeEikonalInternalLength_aPrime(GaussPoint *gp)
double computeEikonalInternalLength_bPrime(GaussPoint *gp)
double computeInternalLength(GaussPoint *gp)
virtual void initTempStatus(GaussPoint *gp) const
const FloatArray & giveTempStressVector() const
Returns the const pointer to receiver's temporary stress vector.
const FloatArray & giveTempStrainVector() const
Returns the const pointer to receiver's temporary strain vector.
void giveStressDependentPartOfStrainVector(FloatArray &answer, GaussPoint *gp, const FloatArray &reducedStrainVector, TimeStep *tStep, ValueModeType mode) const
#define OOFEM_WARNING(...)
#define _IFT_IsotropicGradientDamageMaterial_formulationType
#define _IFT_IsotropicGradientDamageMaterial_di_rho
#define _IFT_IsotropicGradientDamageMaterial_di_eta
FloatArrayF< N > min(const FloatArrayF< N > &a, const FloatArrayF< N > &b)