60RankineMat :: hasMaterialModeCapability(MaterialMode mode)
const
62 return mode == _PlaneStress || mode == _1dMat;
70 StructuralMaterial :: initializeFrom(ir);
106 }
else if (
damlaw == 1 ) {
109 }
else if (
damlaw == 2 ) {
115 }
else if (
damlaw == 3 ) {
126 if ( (
a != 0. ) && ( gf != 0 ) ) {
132 double A =
H0 * ( 1. +
H0 /
E );
133 double B =
sig0 * ( 1. +
H0 /
E );
139 double kappaf = ( -B + sqrt(B * B - 4. * A * C) ) / ( 2. * A );
145std::unique_ptr<MaterialStatus>
148 return std::make_unique<RankineMatStatus>(gp);
167 answer.
beScaled(1. - omega, status->giveTempEffectiveStress());
170 status->setTempDamage(omega);
171 status->letTempStrainVectorBe(totalStrain);
172 status->letTempStressVectorBe(answer);
173#ifdef keep_track_of_dissipated_energy
175 status->computeWork_1d(gp, gf);
196 answer.
beScaled(1. - omega, status->giveTempEffectiveStress());
199 status->setTempDamage(omega);
200 status->letTempStrainVectorBe(totalStrain);
201 status->letTempStressVectorBe(answer);
202#ifdef keep_track_of_dissipated_energy
204 status->computeWork_PlaneStress(gp, gf);
211RankineMat :: evalYieldFunction(
const FloatArray &sigPrinc,
const double kappa)
const
218RankineMat :: evalYieldStress(
const double kappa)
const
220 double yieldStress = 0.;
222 yieldStress =
sig0 +
H0 * kappa;
232 yieldStress = 50. *
E *kappa *exp(-pow ( kappa /
ep,
md ) /
md);
234 yieldStress =
sig0 +
H0 * kappa;
241RankineMat :: evalPlasticModulus(
const double kappa)
const
243 double plasticModulus = 0.;
250 double aux = pow(kappa /
ep,
md);
251 plasticModulus = 50. *
E *exp(-aux /
md) * ( 1. - aux );
256 return plasticModulus;
265 double kappa, tempKappa, H;
274 elStrain.
subtract(tempPlasticStrain);
282 if ( mode == _1dMat ) {
291 printf(
"kappa, ftrial: %g %g\n", kappa, ftrial);
292 OOFEM_ERROR(
"no convergence of regular stress return algorithm");
296 finalStress.
at(1) -=
E * ddKappa;
297 tempKappa += ddKappa;
302 tempPlasticStrain.
at(1) = tempKappa;
305 double difPrincTrialStresses = sigPrinc.
at(1) - sigPrinc.
at(2);
306 double tanG =
E / ( 2. * ( 1. +
nu ) );
309 bool vertex_case =
false;
312 double Enu =
E / ( 1. -
nu *
nu );
319 printf(
"kappa, ftrial: %g %g\n", kappa, ftrial);
320 OOFEM_ERROR(
"no convergence of regular stress return algorithm");
324 double ddKappa = f / ( Enu + H );
325 sigPrinc.
at(1) -= Enu * ddKappa;
326 sigPrinc.
at(2) -=
nu * Enu * ddKappa;
327 tempKappa += ddKappa;
331 if ( sigPrinc.
at(2) > sigPrinc.
at(1) ) {
338 double sigstar = ( sigPrinc.
at(1) -
nu * sigPrinc.
at(2) ) / ( 1. -
nu );
339 double alpha =
E / ( 1. -
nu );
340 double dkap0 = ( sigPrinc.
at(1) - sigPrinc.
at(2) ) * ( 1. +
nu ) /
E;
345 double C = alpha + H * ( 1. + sqrt(2.) ) / 2.;
351 printf(
"kappa, ftrial: %g %g\n", kappa, ftrial);
352 OOFEM_ERROR(
"no convergence of vertex stress return algorithm");
356 tempKappa = kappa + sqrt( dkap1 * dkap1 + ( dkap1 - dkap0 ) * ( dkap1 - dkap0 ) );
358 double aux = dkap1 * dkap1 + ( dkap1 - dkap0 ) * ( dkap1 - dkap0 );
361 C = alpha + H * ( 2. * dkap1 - dkap0 ) / sqrt(aux);
363 C = alpha + H *sqrt(2.);
367 sigPrinc.
at(1) = sigPrinc.
at(2) = sigstar - alpha * dkap1;
372 double sig1 = sigPrinc.
at(1);
373 double sig2 = sigPrinc.
at(2);
377 double n11 = nPrinc.
at(1, 1);
378 double n12 = nPrinc.
at(1, 2);
379 double n21 = nPrinc.
at(2, 1);
380 double n22 = nPrinc.
at(2, 2);
381 finalStress.
at(1) = sig1 * n11 * n11 + sig2 * n12 * n12;
382 finalStress.
at(2) = sig1 * n21 * n21 + sig2 * n22 * n22;
383 finalStress.
at(3) = sig1 * n11 * n21 + sig2 * n12 * n22;
385 if ( !vertex_case ) {
386 tempPlasticStrain.
at(1) += ( tempKappa - kappa ) * n11 * n11;
387 tempPlasticStrain.
at(2) += ( tempKappa - kappa ) * n21 * n21;
388 tempPlasticStrain.
at(3) += 2. * ( tempKappa - kappa ) * n11 * n21;
392 tempPlasticStrain.
at(1) += dkap1 * n11 * n11 + dkap2 * n12 * n12;
393 tempPlasticStrain.
at(2) += dkap1 * n21 * n21 + dkap2 * n22 * n22;
394 tempPlasticStrain.
at(3) += 2. * ( dkap1 * n11 * n21 + dkap2 * n12 * n22 );
398 if ( difPrincTrialStresses != 0. ) {
399 double factor = ( sig1 - sig2 ) / difPrincTrialStresses;
400 if ( factor > 0. && factor <= 1. ) {
416RankineMat :: computeDamageParam(
double tempKappa)
const
419 if ( tempKappa > 0. ) {
421 tempDam = 1.0 - exp(-
a * tempKappa);
422 }
else if (
damlaw == 1 && tempKappa >
ep ) {
424 }
else if (
damlaw == 2 && tempKappa >
ep ) {
426 }
else if (
damlaw == 3 ) {
435RankineMat :: computeDamageParamPrime(
double tempKappa)
const
438 if ( tempKappa >= 0. ) {
440 tempDam =
a * exp(-
a * tempKappa);
441 }
else if (
damlaw == 1 && tempKappa >=
ep ) {
443 }
else if (
damlaw == 2 && tempKappa >=
ep ) {
445 }
else if (
damlaw == 3 ) {
460 if ( dam > tempDam ) {
475RankineMat :: givePlaneStressStiffMtrx(MatResponseMode mode,
488 if ( mode == ElasticStiffness ) {
490 }
else if ( mode == SecantStiffness ) {
493 return {
E * (1.0 - om)};
495 OOFEM_ERROR(
"unknown type of stiffness (secant stiffness not implemented for 1d)");
502RankineMat :: evaluatePlaneStressStiffMtrx(MatResponseMode mode,
504 TimeStep *tStep,
double gprime)
const
507 if ( mode == ElasticStiffness || mode == SecantStiffness ) {
510 if ( mode == SecantStiffness ) {
512 double damage = status->giveTempDamage();
520 double tempKappa = status->giveTempCumulativePlasticStrain();
521 if ( tempKappa <= kappa ) {
523 double damage = status->giveTempDamage();
524 return d * (1. - damage);
532 double eta1, eta2, dkap2;
533 double dkap1 = status->giveDKappa(1);
539 double Enu =
E / ( 1. -
nu *
nu );
540 double aux = Enu / ( Enu + H );
541 answer.
at(1, 1) = aux * H;
542 answer.
at(1, 2) = answer.
at(2, 1) =
nu * aux * H;
543 answer.
at(2, 2) = aux * (
E + H );
544 answer.
at(3, 3) = status->giveTangentShearStiffness();
550 dkap2 = status->giveDKappa(2);
551 double denom =
E * dkap1 + H * ( 1. -
nu ) * ( dkap1 + dkap2 );
552 eta1 =
E * dkap1 / denom;
553 eta2 =
E * dkap2 / denom;
554 answer.
at(1, 1) = answer.
at(2, 1) = H * eta1;
555 answer.
at(1, 2) = answer.
at(2, 2) = H * eta2;
556 answer.
at(3, 3) = 0.;
562 double damage = status->giveTempDamage();
563 answer *= 1. - damage;
567 StressVector effStress(status->giveTempEffectiveStress(), _PlaneStress);
570 if ( gprime != 0. ) {
572 correction.
at(1, 1) = sigPrinc.
at(1) * eta1;
573 correction.
at(1, 2) = sigPrinc.
at(1) * eta2;
574 correction.
at(2, 1) = sigPrinc.
at(2) * eta1;
575 correction.
at(2, 2) = sigPrinc.
at(2) * eta2;
576 correction *= gprime;
577 answer -= correction;
598 double Estar =
E / ( 1. -
nu *
nu );
599 double aux = Estar / ( H + Estar );
601 eta.
at(2) =
nu * aux;
606 double denom =
E * dkap1 + H * ( 1. -
nu ) * ( dkap1 + dkap2 );
607 eta.
at(1) =
E * dkap1 / denom;
608 eta.
at(2) =
E * dkap2 / denom;
627 if ( type == IST_PlasticStrainTensor ) {
630 answer.
at(1) =
ep.at(1);
631 answer.
at(2) =
ep.at(2);
635 answer.
at(6) =
ep.at(3);
637 }
else if ( type == IST_CumPlasticStrain ) {
641 }
else if ( type == IST_DamageScalar ) {
645 }
else if ( type == IST_DamageTensor ) {
651#ifdef keep_track_of_dissipated_energy
652 }
else if ( type == IST_StressWorkDensity ) {
656 }
else if ( type == IST_DissWorkDensity ) {
660 }
else if ( type == IST_FreeEnergyDensity ) {
667 return StructuralMaterial :: giveIPValue(answer, gp, type, tStep);
685#ifdef keep_track_of_dissipated_energy
693RankineMatStatus :: printOutputAt(FILE *file,
TimeStep *tStep)
const
695 StructuralMaterialStatus :: printOutputAt(file, tStep);
697 fprintf(file,
"status { ");
707#ifdef keep_track_of_dissipated_energy
712 fprintf(file,
" plastic_strains ");
714 fprintf( file,
" %.4e", val );
718 fprintf(file,
"}\n");
723void RankineMatStatus :: initTempStatus()
725 StructuralMaterialStatus :: initTempStatus();
728 plasticStrain.resize( StructuralMaterial :: giveSizeOfVoigtSymVector(
gp->giveMaterialMode() ) );
735#ifdef keep_track_of_dissipated_energy
746 StructuralMaterialStatus :: updateYourself(tStep);
751#ifdef keep_track_of_dissipated_energy
761 StructuralMaterialStatus :: saveContext(stream, mode);
776#ifdef keep_track_of_dissipated_energy
791 StructuralMaterialStatus :: restoreContext(stream, mode);
806#ifdef keep_track_of_dissipated_energy
818#ifdef keep_track_of_dissipated_energy
#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.
void beDifferenceOf(const FloatArray &a, const FloatArray &b)
void zero()
Zeroes all coefficients of receiver.
void beProductOf(const FloatMatrix &aMatrix, const FloatArray &anArray)
void beScaled(double s, const FloatArray &b)
void subtract(const FloatArray &src)
double at(std::size_t i, std::size_t j) const
double at(std::size_t i, std::size_t j) const
MaterialMode giveMaterialMode()
Returns corresponding material mode of receiver.
GaussPoint * gp
Associated integration point.
virtual MaterialStatus * giveStatus(GaussPoint *gp) const
virtual void initTempStatus(GaussPoint *gp) const
double giveTempDamage() const
double tempStressWork
Non-equilibrated density of total work done by stresses on strain increments.
FloatArray tempPlasticStrain
Plastic strain (final).
double giveStressWork()
Returns the density of total work of stress on strain increments.
void setTangentShearStiffness(double value)
FloatArray plasticStrain
Plastic strain (initial).
double giveDamage() const
double tempKappa
Cumulative plastic strain (final).
double giveTempCumulativePlasticStrain() const
const FloatArray & giveTempEffectiveStress() const
const FloatArray & givePlasticStrain() const
double tempDamage
Damage (final).
const FloatArray & givePlasDef()
double giveDKappa(int i) const
double tempDissWork
Non-equilibrated density of dissipated work.
void letTempEffectiveStressBe(FloatArray values)
void setTempCumulativePlasticStrain(double value)
double stressWork
Density of total work done by stresses on strain increments.
void letTempPlasticStrainBe(FloatArray values)
double kappa
Cumulative plastic strain (initial).
double giveCumulativePlasticStrain() const
double damage
Damage (initial).
double giveDissWork()
Returns the density of dissipated work.
void setDKappa(double val1, double val2)
double tanG
Tangent shear stiffness (needed for tangent matrix).
double dissWork
Density of dissipated work.
virtual double computeCumPlastStrain(GaussPoint *gp, TimeStep *tStep) const
double param3
coefficient required when damlaw=2
double a
Parameter that controls damage evolution (a=0 turns damage off).
double H0
Initial hardening modulus.
double evalYieldStress(const double kappa) const
double computeDamage(GaussPoint *gp, TimeStep *tStep) const
double md
Exponent in hardening law–Used only if plasthardtype=2.
LinearElasticMaterial * linearElasticMaterial
Reference to the basic elastic material.
double computeDamageParamPrime(double tempKappa) const
double param1
coefficient required when damlaw=1 or 2
double ep
Total strain at peak stress sig0–Used only if plasthardtype=2.
double yieldtol
Relative tolerance in yield condition.
double delSigY
Final increment of yield stress (at infinite cumulative plastic strain).
double evalPlasticModulus(const double kappa) const
int damlaw
type of damage law (0=exponential, 1=exponential and damage starts after peak stress sig0)
double param5
coefficient required when damlaw=2
int plasthardtype
Type of plastic hardening (0=linear, 1=exponential).
double evalYieldFunction(const FloatArray &sigPrinc, const double kappa) const
FloatMatrixF< 3, 3 > evaluatePlaneStressStiffMtrx(MatResponseMode mode, GaussPoint *gp, TimeStep *tStep, double gprime) const
double sig0
Initial (uniaxial) yield stress.
double param4
coefficient required when damlaw=2
double param2
coefficient required when damlaw=1 or 2
double nu
Poisson's ratio.
double computeDamageParam(double tempKappa) const
void performPlasticityReturn(GaussPoint *gp, const FloatArray &totalStrain) const
void applyElasticStiffness(StressVector &stress, const double EModulus, const double nu) const
void computePrincipalValDir(FloatArray &answer, FloatMatrix &dir) const override
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.
static FloatMatrixF< 3, 3 > givePlaneStressVectorTranformationMtrx(const FloatMatrixF< 2, 2 > &base, bool transpose=false)
StructuralMaterial(int n, Domain *d)
FloatMatrixF< M, M > unrotate(FloatMatrixF< N, N > &a, const FloatMatrixF< M, N > &r)
Computes .
@ CIO_IOERR
General IO error.
#define _IFT_RankineMat_delsigy
#define _IFT_RankineMat_yieldtol
#define _IFT_RankineMat_param3
#define _IFT_RankineMat_damlaw
#define _IFT_RankineMat_ep
#define _IFT_RankineMat_plasthardtype
#define _IFT_RankineMat_h
#define _IFT_RankineMat_sig0
#define _IFT_RankineMat_a
#define _IFT_RankineMat_param1
#define _IFT_RankineMat_param5
#define _IFT_RankineMat_param4
#define _IFT_RankineMat_gf
#define _IFT_RankineMat_param2