57MisesMatGrad :: hasMaterialModeCapability(MaterialMode mode)
const
59 return mode == _1dMat || mode == _PlaneStrain || mode == _3dMat;
89 OOFEM_ERROR(
"unknown mode (%s)", __MaterialModeToString(mMode) );
108 OOFEM_ERROR(
"unknown mode (%s)", __MaterialModeToString(mMode) );
127 OOFEM_ERROR(
"unknown mode (%s)", __MaterialModeToString(mMode) );
146 OOFEM_ERROR(
"unknown mode (%s)", __MaterialModeToString(mMode) );
156 if ( mode != TangentStiffness ) {
169 double kappa =
mParam * nlKappa + ( 1. -
mParam ) * tempKappa;
170 if ( dKappa <= 0.0 ) {
171 return {( 1. - tempDamage ) *
E};
177 double stress = stressVector.
at(1);
179 auto tangent = ( 1. - tempDamage ) *
E *
H / (
E +
H );
180 if ( tempDamage > damage ) {
191 if ( mode != TangentStiffness ) {
198 double dKappa = tempKappa - kappa;
202 if ( dKappa <= 0.0 ) {
208 double sigmaY = this->
giveS( gp, tStep) +
H * kappa;
217 double factor = -2. * sqrt(6.) *
G *
G / trialS;
218 double factor1 = factor * sigmaY / ( (
H + 3. *
G ) * trialS * trialS );
219 stiffnessCorrection.
times(factor1);
222 stiffnessCorrection.
zero();
223 stiffnessCorrection.
at(1, 1) = stiffnessCorrection.
at(2, 2) = stiffnessCorrection.
at(3, 3) = 2. / 3.;
224 stiffnessCorrection.
at(1, 2) = stiffnessCorrection.
at(1, 3) = stiffnessCorrection.
at(2, 1) = -1. / 3.;
225 stiffnessCorrection.
at(2, 3) = stiffnessCorrection.
at(3, 1) = stiffnessCorrection.
at(3, 2) = -1. / 3.;
226 stiffnessCorrection.
at(4, 4) = 0.5;
227 double factor2 = factor * dKappa;
228 stiffnessCorrection.
times(factor2);
232 if ( tempDamage > damage ) {
237 double scalar = -omegaPrime *sqrt(6.) *
G / ( 3. *
G +
H ) / trialS;
239 stiffnessCorrection.
times( scalar * ( 1. -
mParam ) );
247MisesMatGrad :: give3dMaterialStiffnessMatrix(MatResponseMode mode,
GaussPoint *gp,
TimeStep *tStep)
const
252 if ( mode != TangentStiffness ) {
256 double tempKappa = status->giveTempCumulativePlasticStrain();
257 double kappa = status->giveCumulativePlasticStrain();
258 double dKappa = tempKappa - kappa;
260 if ( dKappa > 0.0 ) {
261 double tempDamage = status->giveTempDamage();
262 double damage = status->giveDamage();
263 double sigmaY = this->
giveS(gp, tStep) +
H * kappa;
265 const FloatArrayF<6> trialStressDev = status->giveTrialStressDev();
271 double factor = -2. * sqrt(6.) *
G *
G / trialS;
272 double factor1 = factor * sigmaY / ( (
H + 3. *
G ) * trialS * trialS );
273 d += factor1 *
dyad(trialStressDev, trialStressDev);
275 d += factor * dKappa *
I_dev6;
277 d *= (1. - tempDamage);
278 if ( tempDamage > damage ) {
279 const FloatArrayF<6> effStress = status->giveTempEffectiveStress();
280 double nlKappa = status->giveNonlocalCumulatedStrain();
283 double scalar = -omegaPrime *sqrt(6.) *
G / ( 3. *
G +
H ) / trialS;
284 d += scalar * ( 1. -
mParam ) *
dyad(effStress, trialStressDev);
301 double stress = effStress.
at(1);
303 double trialS =
signum(stress);
304 double factor = trialS *
E / (
E +
H );
305 answer.
at(1, 1) = factor;
321 answer.
at(1, 1) = trialStressDev.
at(1);
322 answer.
at(1, 2) = trialStressDev.
at(2);
323 answer.
at(1, 3) = trialStressDev.
at(3);
324 answer.
at(1, 4) = trialStressDev.
at(4);
325 double factor = sqrt(6.) *
G / ( 3. *
G +
H ) / trialS;
326 answer.
times(factor);
342 for (
int i = 1; i <= 6; i++ ) {
343 answer.
at(1, i) = trialStressDev.
at(i);
346 double factor = sqrt(6.) *
G / ( 3. *
G +
H ) / trialS;
347 answer.
times(factor);
356 double damage, tempDamage;
357 double nlKappa, kappa;
365 if ( ( tempDamage - damage ) > 0 ) {
367 answer.
at(1, 1) = tempEffStress.
at(1);
379 double damage, tempDamage;
380 double nlKappa, kappa;
389 if ( ( tempDamage - damage ) > 0 ) {
391 answer.
at(1, 1) = tempEffStress.
at(1);
392 answer.
at(2, 1) = tempEffStress.
at(2);
393 answer.
at(3, 1) = tempEffStress.
at(3);
394 answer.
at(4, 1) = tempEffStress.
at(4);
408 double damage, tempDamage;
409 double nlKappa, kappa;
416 if ( ( tempDamage - damage ) > 0 ) {
418 for (
int i = 1; i <= 6; i++ ) {
419 answer.
at(i, 1) = tempEffStress.
at(i);
446 MisesMat :: performPlasticityReturn(totalStrain, gp, tStep);
447 status->letTempStrainVectorBe(totalStrain);
449 const auto &tempEffStress = status->giveTempEffectiveStress();
450 answer1.
beScaled(1.0 - tempDamage, tempEffStress);
451 answer2 = status->giveTempCumulativePlasticStrain();
453 status->setNonlocalCumulatedStrain(nonlocalCumulatedStrain);
454 status->setTempDamage(tempDamage);
455 status->letTempEffectiveStressBe(tempEffStress);
456 status->letTempStressVectorBe(answer1);
465 double nlCumPlastStrain = status->giveNonlocalCumulatedStrain();
467 return mParam * nlCumPlastStrain + ( 1 -
mParam ) * localCumPlastStrain;
472MisesMatGrad :: giveNonlocalInternalForces_N_factor(
double &answer,
double nlDamageDrivingVariable,
GaussPoint *gp,
TimeStep *tStep)
474 answer = nlDamageDrivingVariable;
480 answer = nlDamageDrivingVariable_grad;
499 MisesMat :: initializeFrom(ir);
517MisesMatGradStatus :: printOutputAt(FILE *file,
TimeStep *tStep)
const
519 StructuralMaterialStatus :: printOutputAt(file, tStep);
520 fprintf(file,
"status {");
521 fprintf(file,
"kappa %f, damage %f ", this->
kappa, this->
damage);
522 fprintf(file,
"}\n");
527MisesMatGradStatus :: initTempStatus()
530 StructuralMaterialStatus :: initTempStatus();
533 if (
gp->giveMaterialMode() == _1dMat ) {
534 plasticStrain.resize( StructuralMaterial :: giveSizeOfVoigtSymVector(_1dMat) );
535 }
else if (
gp->giveMaterialMode() == _PlaneStrain ) {
536 plasticStrain.resize( StructuralMaterial :: giveSizeOfVoigtSymVector(_PlaneStrain) );
537 }
else if (
gp->giveMaterialMode() == _PlaneStress ) {
538 plasticStrain.resize( StructuralMaterial :: giveSizeOfVoigtSymVector(_PlaneStress) );
539 }
else if (
gp->giveMaterialMode() == _3dMat ) {
540 plasticStrain.resize( StructuralMaterial :: giveSizeOfVoigtSymVector(_3dMat) );
554MisesMatGradStatus :: updateYourself(
TimeStep *tStep)
556 MisesMatStatus :: updateYourself(tStep);
#define REGISTER_Material(class)
void beScaled(double s, const FloatArray &b)
void resize(Index rows, Index cols)
void zero()
Zeroes all coefficient of receiver.
void beDyadicProductOf(const FloatArray &vec1, const FloatArray &vec2)
double at(std::size_t i, std::size_t j) const
MaterialMode giveMaterialMode()
Returns corresponding material mode of receiver.
GradientDamageMaterialExtensionInterface(Domain *d)
GaussPoint * gp
Associated integration point.
virtual MaterialStatus * giveStatus(GaussPoint *gp) const
virtual void initTempStatus(GaussPoint *gp) const
double giveNonlocalCumulatedStrain() const
void givePlaneStrainKappaMatrix(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)
FloatMatrixF< 4, 4 > givePlaneStrainStiffMtrx(MatResponseMode, GaussPoint *gp, TimeStep *tStep) const override
FloatMatrixF< 1, 1 > give1dStressStiffMtrx(MatResponseMode, GaussPoint *gp, TimeStep *tStep) const override
void give1dKappaMatrix(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)
FloatMatrixF< 6, 6 > give3dMaterialStiffnessMatrix(MatResponseMode, GaussPoint *gp, TimeStep *tStep) const override
void giveInternalLength(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)
void give3dGprime(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)
void givePlaneStrainGprime(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)
void give1dGprime(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)
void give3dKappaMatrix(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)
double giveDamage() const
double damage
damage variable (initial).
double giveTempCumulativePlasticStrain() const
double giveTempDamage() const
double giveCumulativePlasticStrain() const
const FloatArray & giveTempEffectiveStress() const
FloatArray trialStressD
Deviatoric trial stress - needed for tangent stiffness.
FloatArray tempPlasticStrain
Plastic strain (final).
double kappa
Cumulative plastic strain (initial).
double tempDamage
damage variable (final).
const FloatArray & giveTrialStressDev() const
MisesMatStatus(GaussPoint *g)
double tempKappa
Cumulative plastic strain (final).
FloatArray plasticStrain
Plastic strain (initial).
IsotropicLinearElasticMaterial linearElasticMaterial
Reference to the basic elastic material.
double giveS(GaussPoint *gp, TimeStep *tStep) const
double G
Elastic shear modulus.
double computeDamage(GaussPoint *gp, TimeStep *tStep) const
double H
Hardening modulus.
double computeDamageParamPrime(double tempKappa) const
MisesMat(int n, Domain *d)
double computeStressNorm() const
static double computeStressNorm(const FloatArrayF< 6 > &stress)
#define _IFT_MisesMatGrad_m
#define _IFT_MisesMatGrad_l
FloatMatrixF< N, M > dyad(const FloatArrayF< N > &a, const FloatArrayF< M > &b)
Computes the dyadic product .
double signum(double i)
Returns the signum of given value (i = 0 returns 0, i < 0 returns -1, i > 0 returns 1).
const FloatMatrixF< 6, 6 > I_dev6
I_dev matrix in Voigt (stress) form.