75 return ( ( mode == _PlaneStress ) || ( mode == _1dMat ) );
86 if ( result !=
IRRT_OK )
return result;
89 if ( result !=
IRRT_OK )
return result;
125 }
else if (
damlaw == 1 ) {
128 }
else if (
damlaw == 2 ) {
142 if ( (
a != 0. ) && ( gf != 0 ) ) {
143 OOFEM_WARNING(
"parameters a and gf cannot be prescribed simultaneously");
149 double A =
H0 * ( 1. +
H0 /
E );
150 double B =
sig0 * ( 1. +
H0 /
E );
156 double kappaf = ( -B + sqrt(B * B - 4. * A * C) ) / ( 2. * A );
194 #ifdef keep_track_of_dissipated_energy 223 #ifdef keep_track_of_dissipated_energy 240 double yieldStress = 0.;
242 yieldStress =
sig0 +
H0 * kappa;
252 yieldStress = 50. *
E *kappa *exp(-pow ( kappa /
ep,
md ) /
md);
254 yieldStress =
sig0 +
H0 * kappa;
263 double plasticModulus = 0.;
270 double aux = pow(kappa /
ep,
md);
271 plasticModulus = 50. *
E *exp(-aux /
md) * ( 1. - aux );
276 return plasticModulus;
285 double kappa, tempKappa, H;
294 elStrain.
subtract(tempPlasticStrain);
302 if ( mode == _1dMat ) {
311 printf(
"kappa, ftrial: %g %g\n", kappa, ftrial);
312 OOFEM_ERROR(
"no convergence of regular stress return algorithm");
316 finalStress.
at(1) -=
E * ddKappa;
317 tempKappa += ddKappa;
322 tempPlasticStrain.
at(1) = tempKappa;
325 double difPrincTrialStresses = sigPrinc.
at(1) - sigPrinc.
at(2);
326 double tanG =
E / ( 2. * ( 1. +
nu ) );
329 bool vertex_case =
false;
332 double Enu =
E / ( 1. -
nu *
nu );
339 printf(
"kappa, ftrial: %g %g\n", kappa, ftrial);
340 OOFEM_ERROR(
"no convergence of regular stress return algorithm");
344 double ddKappa = f / ( Enu + H );
345 sigPrinc.
at(1) -= Enu * ddKappa;
346 sigPrinc.
at(2) -=
nu * Enu * ddKappa;
347 tempKappa += ddKappa;
351 if ( sigPrinc.
at(2) > sigPrinc.
at(1) ) {
358 double sigstar = ( sigPrinc.
at(1) -
nu * sigPrinc.
at(2) ) / ( 1. -
nu );
359 double alpha =
E / ( 1. -
nu );
360 double dkap0 = ( sigPrinc.
at(1) - sigPrinc.
at(2) ) * ( 1. +
nu ) /
E;
365 double C = alpha + H * ( 1. + sqrt(2.) ) / 2.;
371 printf(
"kappa, ftrial: %g %g\n", kappa, ftrial);
372 OOFEM_ERROR(
"no convergence of vertex stress return algorithm");
376 tempKappa = kappa + sqrt( dkap1 * dkap1 + ( dkap1 - dkap0 ) * ( dkap1 - dkap0 ) );
378 double aux = dkap1 * dkap1 + ( dkap1 - dkap0 ) * ( dkap1 - dkap0 );
381 C = alpha + H * ( 2. * dkap1 - dkap0 ) / sqrt(aux);
383 C = alpha + H *sqrt(2.);
385 }
while ( fabs(f) >
yieldtol * sig0 );
387 sigPrinc.
at(1) = sigPrinc.
at(2) = sigstar - alpha * dkap1;
392 double sig1 = sigPrinc.
at(1);
393 double sig2 = sigPrinc.
at(2);
397 double n11 = nPrinc.
at(1, 1);
398 double n12 = nPrinc.
at(1, 2);
399 double n21 = nPrinc.
at(2, 1);
400 double n22 = nPrinc.
at(2, 2);
401 finalStress.
at(1) = sig1 * n11 * n11 + sig2 * n12 * n12;
402 finalStress.
at(2) = sig1 * n21 * n21 + sig2 * n22 * n22;
403 finalStress.
at(3) = sig1 * n11 * n21 + sig2 * n12 * n22;
405 if ( !vertex_case ) {
406 tempPlasticStrain.
at(1) += ( tempKappa - kappa ) * n11 * n11;
407 tempPlasticStrain.
at(2) += ( tempKappa - kappa ) * n21 * n21;
408 tempPlasticStrain.
at(3) += 2. * ( tempKappa - kappa ) * n11 * n21;
412 tempPlasticStrain.
at(1) += dkap1 * n11 * n11 + dkap2 * n12 * n12;
413 tempPlasticStrain.
at(2) += dkap1 * n21 * n21 + dkap2 * n22 * n22;
414 tempPlasticStrain.
at(3) += 2. * ( dkap1 * n11 * n21 + dkap2 * n12 * n22 );
418 if ( difPrincTrialStresses != 0. ) {
419 double factor = ( sig1 - sig2 ) / difPrincTrialStresses;
420 if ( factor > 0. && factor <= 1. ) {
439 if ( tempKappa > 0. ) {
441 tempDam = 1.0 - exp(-
a * tempKappa);
442 }
else if (
damlaw == 1 && tempKappa >
ep ) {
444 }
else if (
damlaw == 2 && tempKappa >
ep ) {
456 if ( tempKappa >= 0. ) {
458 tempDam =
a * exp(-
a * tempKappa);
459 }
else if (
damlaw == 1 && tempKappa >=
ep ) {
461 }
else if (
damlaw == 2 && tempKappa >=
ep ) {
472 double tempKappa, dam;
477 if ( dam > tempDam ) {
508 answer.
at(1, 1) = this->
E;
509 if ( mode == ElasticStiffness ) {
510 }
else if ( mode == SecantStiffness ) {
512 answer.
times(1.0 - om);
514 OOFEM_ERROR(
"unknown type of stiffness (secant stiffness not implemented for 1d)");
527 if ( mode == ElasticStiffness || mode == SecantStiffness ) {
530 if ( mode == SecantStiffness ) {
533 answer.
times(1. - damage);
542 if ( tempKappa <= kappa ) {
545 answer.
times(1. - damage);
555 double eta1, eta2, dkap2;
562 double Enu =
E / ( 1. -
nu *
nu );
563 double aux = Enu / ( Enu + H );
564 answer.
at(1, 1) = aux * H;
565 answer.
at(1, 2) = answer.
at(2, 1) =
nu * aux * H;
566 answer.
at(2, 2) = aux * (
E + H );
574 double denom =
E * dkap1 + H * ( 1. -
nu ) * ( dkap1 + dkap2 );
575 eta1 =
E * dkap1 / denom;
576 eta2 =
E * dkap2 / denom;
577 answer.
at(1, 1) = answer.
at(2, 1) = H * eta1;
578 answer.
at(1, 2) = answer.
at(2, 2) = H * eta2;
579 answer.
at(3, 3) = 0.;
586 answer.
times(1. - damage);
593 if ( gprime != 0. ) {
596 correction.
at(1, 1) = sigPrinc.
at(1) * eta1;
597 correction.
at(1, 2) = sigPrinc.
at(1) * eta2;
598 correction.
at(2, 1) = sigPrinc.
at(2) * eta1;
599 correction.
at(2, 2) = sigPrinc.
at(2) * eta2;
600 correction.
times(gprime);
623 double Estar =
E / ( 1. -
nu *
nu );
624 double aux = Estar / ( H + Estar );
626 eta.
at(2) =
nu * aux;
631 double denom =
E * dkap1 + H * ( 1. -
nu ) * ( dkap1 + dkap2 );
632 eta.
at(1) =
E * dkap1 / denom;
633 eta.
at(2) =
E * dkap2 / denom;
653 if ( type == IST_PlasticStrainTensor ) {
656 answer.
at(1) = ep.
at(1);
657 answer.
at(2) = ep.
at(2);
661 answer.
at(6) = ep.
at(3);
663 }
else if ( type == IST_CumPlasticStrain ) {
667 }
else if ( type == IST_DamageScalar ) {
671 }
else if ( type == IST_DamageTensor ) {
677 #ifdef keep_track_of_dissipated_energy 678 }
else if ( type == IST_StressWorkDensity ) {
682 }
else if ( type == IST_DissWorkDensity ) {
686 }
else if ( type == IST_FreeEnergyDensity ) {
711 #ifdef keep_track_of_dissipated_energy 729 fprintf(file,
"status { ");
739 #ifdef keep_track_of_dissipated_energy 744 fprintf(file,
" plastic_strains ");
746 fprintf( file,
" %.4e", val );
750 fprintf(file,
"}\n");
767 #ifdef keep_track_of_dissipated_energy 783 #ifdef keep_track_of_dissipated_energy 819 #ifdef keep_track_of_dissipated_energy 862 #ifdef keep_track_of_dissipated_energy 877 #ifdef keep_track_of_dissipated_energy static int giveSizeOfVoigtSymVector(MaterialMode mmode)
Returns the size of symmetric part of a reduced stress/strain vector according to given mode...
void computeWork_1d(GaussPoint *gp, double gf)
virtual void updateYourself(TimeStep *tStep)
Update equilibrium history variables according to temp-variables.
FloatArray plasticStrain
Plastic strain (initial).
InternalStateType
Type representing the physical meaning of element or constitutive model internal variable.
MaterialMode giveMaterialMode()
Returns corresponding material mode of receiver.
void subtract(const FloatArray &src)
Subtracts array src to receiver.
void letTempStrainVectorBe(const FloatArray &v)
Assigns tempStrainVector to given vector v.
#define _IFT_RankineMat_param4
static void givePlaneStressVectorTranformationMtrx(FloatMatrix &answer, const FloatMatrix &base, bool transpose=false)
Computes 2d stress vector transformation matrix from standard vector transformation matrix...
virtual void giveRealStressVector_PlaneStress(FloatArray &answer, GaussPoint *gp, const FloatArray &reducesStrain, TimeStep *tStep)
Default implementation relies on giveRealStressVector_StressControl.
virtual void updateYourself(TimeStep *tStep)
Update equilibrium history variables according to temp-variables.
virtual MaterialStatus * giveStatus(GaussPoint *gp) const
Returns material status of receiver in given integration point.
#define _IFT_RankineMat_a
double tempKappa
Cumulative plastic strain (final).
GaussPoint * gp
Associated integration point.
double tanG
Tangent shear stiffness (needed for tangent matrix).
void applyElasticStiffness(StressVector &stress, const double EModulus, const double nu) const
Applies the elastic stiffness to the strain.
FloatArray tempStrainVector
Temporary strain vector in reduced form (to find balanced state)
int damlaw
type of damage law (0=exponential, 1=exponential and damage starts after peak stress sig0) ...
double giveTempCumulativePlasticStrain()
The purpose of DataStream abstract class is to allow to store/restore context to different streams...
contextIOResultType storeYourself(DataStream &stream) const
double damage
Damage (initial).
virtual int giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep)
Returns the integration point corresponding value in Reduced form.
void evaluatePlaneStressStiffMtrx(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep, double gprime)
Executive method used by local and gradient version.
Specialization of a floating point array for representing a stress state.
double sig0
Initial (uniaxial) yield stress.
double & at(int i)
Coefficient access function.
const FloatArray & giveTempEffectiveStress() const
This class implements a structural material status information.
void computePrincipalValDir(FloatArray &answer, FloatMatrix &dir) const
Computes principal values and directions of receiver vector.
#define _IFT_RankineMat_plasthardtype
FloatArray stressVector
Equilibrated stress vector in reduced form.
virtual int giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep)
Returns the integration point corresponding value in Reduced form.
virtual contextIOResultType restoreContext(DataStream &stream, ContextMode mode, void *obj=NULL)
Restores the receiver state previously written in stream.
void setDKappa(double val1, double val2)
double yieldtol
Relative tolerance in yield condition.
virtual IRResultType initializeFrom(InputRecord *ir)
Initializes receiver according to object description stored in input record.
LinearElasticMaterial * giveLinearElasticMaterial()
Returns a reference to the basic elastic material.
double evalYieldStress(const double kappa)
Specialization of a floating point array for representing a strain state.
double stressWork
Density of total work done by stresses on strain increments.
MaterialMode
Type representing material mode of integration point.
virtual void printOutputAt(FILE *file, TimeStep *tStep)
Print receiver's output to given stream.
virtual int read(int *data, int count)=0
Reads count integer values into array pointed by data.
MatResponseMode
Describes the character of characteristic material matrix.
double giveTangentShearStiffness()
double a
Parameter that controls damage evolution (a=0 turns damage off).
double ep
Total strain at peak stress sig0–Used only if plasthardtype=2.
void beDifferenceOf(const FloatArray &a, const FloatArray &b)
Sets receiver to be a - b.
double delSigY
Final increment of yield stress (at infinite cumulative plastic strain)
void computeWork_PlaneStress(GaussPoint *gp, double gf)
Computes the increment of total stress work and of dissipated work (gf is the dissipation density per...
virtual int write(const int *data, int count)=0
Writes count integer values from array pointed by data.
void beScaled(double s, const FloatArray &b)
Sets receiver to be .
virtual void printOutputAt(FILE *file, TimeStep *tStep)
Print receiver's output to given stream.
virtual IRResultType initializeFrom(InputRecord *ir)
Initializes receiver according to object description stored in input record.
virtual void giveStiffnessMatrix(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)
Computes the stiffness matrix for giveRealStressVector of receiver in given integration point...
RankineMatStatus(int n, Domain *d, GaussPoint *g)
void setTempCumulativePlasticStrain(double value)
virtual void initTempStatus()
Initializes the temporary internal variables, describing the current state according to previously re...
#define _IFT_RankineMat_gf
double dotProduct(const FloatArray &x) const
Computes the dot product (or inner product) of receiver and argument.
const FloatArray & givePlasticStrain() const
This class implements an isotropic linear elastic material in a finite element problem.
void times(double f)
Multiplies receiver by factor f.
void rotatedWith(const FloatMatrix &r, char mode= 'n')
Returns the receiver 'a' transformed using give transformation matrix r.
contextIOResultType restoreYourself(DataStream &stream)
void beProductOf(const FloatMatrix &aMatrix, const FloatArray &anArray)
Receiver becomes the result of the product of aMatrix and anArray.
const FloatArray & givePlasDef()
#define _IFT_RankineMat_damlaw
double computeDamage(GaussPoint *gp, TimeStep *tStep)
virtual MaterialStatus * CreateStatus(GaussPoint *gp) const
Creates new copy of associated status and inserts it into given integration point.
double giveStressWork()
Returns the density of total work of stress on strain increments.
#define _IFT_RankineMat_yieldtol
double at(int i, int j) const
Coefficient access function.
virtual int hasMaterialModeCapability(MaterialMode mode)
Tests if material supports material mode.
virtual contextIOResultType restoreContext(DataStream &stream, ContextMode mode, void *obj=NULL)
Restores the receiver state previously written in stream.
double param3
coefficient required when damlaw=2
double giveCumulativePlasticStrain()
void subtract(const FloatMatrix &a)
Subtracts matrix from the receiver.
Abstract base class representing a material status information.
Class representing vector of real numbers.
#define _IFT_RankineMat_param2
void setTempDamage(double value)
virtual ~RankineMatStatus()
FloatArray strainVector
Equilibrated strain vector in reduced form.
Implementation of matrix containing floating point numbers.
void performPlasticityReturn(GaussPoint *gp, const FloatArray &totalStrain)
double param1
coefficient required when damlaw=1 or 2
IRResultType
Type defining the return values of InputRecord reading operations.
int plasthardtype
Type of plastic hardening (0=linear, 1=exponential)
virtual void givePlaneStressStiffMtrx(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)
Method for computing plane stress stiffness matrix of receiver.
double dKappa1
Increments of cumulative plastic strain associated with the first and secomnd principal stress (used ...
void letTempStressVectorBe(const FloatArray &v)
Assigns tempStressVector to given vector v.
virtual contextIOResultType saveContext(DataStream &stream, ContextMode mode, void *obj=NULL)
Stores receiver state to output stream.
double tempStressWork
Non-equilibrated density of total work done by stresses on strain increments.
#define _IFT_RankineMat_sig0
virtual void pY() const
Print receiver on stdout with high accuracy.
void resize(int rows, int cols)
Checks size of receiver towards requested bounds.
virtual void give1dStressStiffMtrx(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)
Method for computing 1d stiffness matrix of receiver.
void zero()
Zeroes all coefficients of receiver.
double param4
coefficient required when damlaw=2
#define _IFT_RankineMat_param1
virtual IRResultType initializeFrom(InputRecord *ir)
Initializes receiver according to object description stored in input record.
LinearElasticMaterial * linearElasticMaterial
Reference to the basic elastic material.
double md
Exponent in hardening law–Used only if plasthardtype=2.
double computeDamageParamPrime(double tempKappa)
long ContextMode
Context mode (mask), defining the type of information written/read to/from context.
double E
Young's modulus.
double evalYieldFunction(const FloatArray &sigPrinc, const double kappa)
Abstract base class for all "structural" constitutive models.
void setTangentShearStiffness(double value)
double kappa
Cumulative plastic strain (initial).
void zero()
Zeroes all coefficient of receiver.
virtual void initTempStatus()
Initializes the temporary internal variables, describing the current state according to previously re...
FloatArray tempPlasticStrain
Plastic strain (final).
Domain * giveDomain() const
virtual void giveRealStressVector_1d(FloatArray &answer, GaussPoint *gp, const FloatArray &totalStrain, TimeStep *tStep)
Default implementation relies on giveRealStressVector_StressControl.
double computeDamageParam(double tempKappa)
double dissWork
Density of dissipated work.
#define _IFT_RankineMat_ep
REGISTER_Material(DummyMaterial)
double param2
coefficient required when damlaw=1 or 2
void letTempPlasticStrainBe(FloatArray values)
#define _IFT_RankineMat_param5
virtual void computeCumPlastStrain(double &kappa, GaussPoint *gp, TimeStep *tStep)
RankineMat(int n, Domain *d)
int giveSize() const
Returns the size of receiver.
virtual contextIOResultType saveContext(DataStream &stream, ContextMode mode, void *obj=NULL)
Stores receiver state to output stream.
the oofem namespace is to define a context or scope in which all oofem names are defined.
double param5
coefficient required when damlaw=2
virtual void initTempStatus(GaussPoint *gp)
Initializes temporary variables stored in integration point status at the beginning of new time step...
void computeEta(FloatArray &answer, RankineMatStatus *status)
Computes derivatives of final kappa with respect to final strain.
double evalPlasticModulus(const double kappa)
double nu
Poisson's ratio.
FloatArray tempStressVector
Temporary stress vector in reduced form (increments are used mainly in nonlinear analysis) ...
void letTempEffectiveStressBe(FloatArray values)
double H0
Initial hardening modulus.
#define _IFT_RankineMat_delsigy
Class representing integration point in finite element program.
#define OOFEM_WARNING(...)
Class representing solution step.
#define _IFT_RankineMat_param3
double tempDamage
Damage (final).
double tempDissWork
Non-equilibrated density of dissipated work.
#define _IFT_RankineMat_h
double giveDissWork()
Returns the density of dissipated work.
void resize(int s)
Resizes receiver towards requested size.