76 }
else if (
hType == 1 ) {
80 if (
h_eps.at(1) != 0. ) {
102std::unique_ptr<MaterialStatus>
105 return std::make_unique<MisesMatStatus>(gp);
127 auto strain = status->getTempPlasticStrain();
128 strain [ 0 ] = totalStrain [ 0 ];
129 strain [ 1 ] -= nu /
E * status->giveTempEffectiveStress() [ 0 ];
130 strain [ 2 ] -= nu /
E * status->giveTempEffectiveStress() [ 0 ];
132 status->letTempStrainVectorBe(strain);
133 status->setTempDamage(omega);
134 status->letTempStressVectorBe(stress);
154 status->setTempDamage(omega);
155 status->letTempStrainVectorBe(totalStrain);
156 status->letTempStressVectorBe(stress);
172 auto stress = status->giveTempEffectiveStress() * ( 1 - omega );
173 status->setTempDamage(omega);
174 status->letTempStrainVectorBe(strain);
175 status->letTempStressVectorBe(stress);
188 plStrain = status->givePlasticStrain();
189 kappa = status->giveCumulativePlasticStrain();
193 if ( totalStrain.
giveSize() == 1 ) {
197 fullStress.
at(1) =
E * ( totalStrain.
at(1) - plStrain.
at(1) );
198 double trialS = fabs(fullStress.
at(1) );
202 if ( yieldValue > 0 ) {
209 yieldValue -=
E * dKappa;
210 if ( yieldValue > 1.e-10 ) {
216 plStrain.
at(1) += dKappa *
signum(fullStress.
at(1) );
217 plStrain.
at(2) -= 0.5 * dKappa *
signum(fullStress.
at(1) );
218 plStrain.
at(3) -= 0.5 * dKappa *
signum(fullStress.
at(1) );
219 fullStress.
at(1) -= dKappa *
E *
signum(fullStress.
at(1) );
227 auto elStrainDev = tmp.first;
228 auto elStrainVol = tmp.second;
231 double trialStressVol = 3 *
K * elStrainVol;
235 status->letTrialStressDevBe(trialStressDev);
236 status->setTrialStressVol(trialStressVol);
239 double yieldValue = sqrt(3. / 2.) * trialS - (
computeYieldStress(kappa, gp, tStep) );
240 if ( yieldValue > 0. ) {
247 plStrain.
add(sqrt(3. / 2.) * dKappa / trialS, dPlStrain);
249 trialStressDev.
times(1. - sqrt(6.) *
G * dKappa / trialS);
259 status->letTempEffectiveStressBe(fullStress);
261 status->letTempPlasticStrainBe(plStrain);
262 status->setTempCumulativePlasticStrain(kappa);
286 double factor = 2. *
G / (
K + 4. / 3. *
G );
287 elStrainVol = ( elStrain.
at(1) + elStrain.
at(2) ) * factor;
289 elStrainDev = elStrain;
290 elStrainDev.
at(1) -= elStrainVol / 3.;
291 elStrainDev.
at(2) -= elStrainVol / 3.;
294 trialStressDev = elStrainDev;
295 trialStressDev.
times(2. *
G);
296 trialStressDev.
at(3) /= 2.;
298 double trialStressVol = 3 *
K * elStrainVol;
300 trialStress.
at(1) += trialStressVol / 3.;
301 trialStress.
at(2) += trialStressVol / 3.;
303 double a1 = ( trialStress.
at(1) + trialStress.
at(2) ) * ( trialStress.
at(1) + trialStress.
at(2) );
304 double a2 = ( trialStress.
at(2) - trialStress.
at(1) ) * ( trialStress.
at(2) - trialStress.
at(1) );
305 double a3 = trialStress.
at(3) * trialStress.
at(3);
307 double xi = 1. / 6. * a1 + 0.5 * a2 + 2. * a3;
309 double yieldValue = 0.5 * xi - 1. / 3. * sigmaY * sigmaY;
312 if ( yieldValue / sigmaY >
yieldTol ) {
318 double f = yieldValue;
323 double dXi = -a1 *
E / ( 1. - nu ) / 9. / denom1 / denom1 / denom1 - 2. *
G * ( a2 + 4. * a3 ) / denom2 / denom2 / denom2;
324 double Hbar = 2. * sigmaY * HiP * sqrt(2. / 3.) * ( sqrt(xi) + dKappa * dXi / ( 2. * sqrt(xi) ) );
325 double df = 0.5 * dXi - 1. / 3. * Hbar;
328 denom1 = ( 1. +
E * dKappa / 3. / ( 1. - nu ) );
329 denom2 = ( 1 + 2. *
G * dKappa );
330 xi = a1 / 6. / denom1 / denom1 + ( 0.5 * a2 + 2. * a3 ) / denom2 / denom2;
333 f = 1. / 2. * xi - 1. / 3. * sigmaY * sigmaY;
335 if ( fabs(f / sigmaY) <
yieldTol ) {
340 OOFEM_WARNING(
"No convergence of the stress return algorithm in MisesMat :: performPlasticityReturn_PlaneStress\n");
346 kappa += sqrt(2. * xi / 3.) * dKappa;
348 double As1 = 3. * ( 1. - nu ) / ( 3 * ( 1 - nu ) +
E * dKappa );
349 double As2 = 1. / ( 1. + 2. *
G * dKappa );
351 A.
at(1, 1) = 0.5 * ( As1 + As2 );
352 A.
at(2, 2) = A.
at(1, 1);
353 A.
at(1, 2) = 0.5 * ( As1 - As2 );
354 A.
at(2, 1) = A.
at(1, 2);
357 elStrainVol = ( fullStress.
at(1) + fullStress.
at(2) ) / 3. /
K;
359 redPlStrain.
at(1) = totalStrain.
at(1) - ( 2. / 3. * fullStress.
at(1) - 1. / 3. * fullStress.
at(2) ) / 2. /
G - elStrainVol / 3;
360 redPlStrain.
at(2) = totalStrain.
at(2) - ( 2. / 3. * fullStress.
at(2) - 1. / 3. * fullStress.
at(1) ) / 2. /
G - elStrainVol / 3;
361 redPlStrain.
at(3) = totalStrain.
at(3) - fullStress.
at(3) /
G;
364 plStrain.
at(3) = -( plStrain.
at(1) + plStrain.
at(2) );
367 fullStress = trialStress;
381 double yieldStress = 0.;
383 if ( kappa + dKappa >
h_eps.at(
h_eps.giveSize() ) ) {
384 OOFEM_ERROR(
"kappa outside range of specified hardening law/n");
387 for (
int i = 1; i <
h_eps.giveSize(); i++ ) {
388 if ( kappa + dKappa >=
h_eps.at(i) && kappa + dKappa <
h_eps.at(i + 1) && kappa <
h_eps.at(i) ) {
390 dKappa =
h_eps.at(i) - kappa;
392 }
else if ( kappa >=
h_eps.at(i) && kappa <
h_eps.at(i + 1) && kappa + dKappa >=
h_eps.at(i) && kappa + dKappa <
h_eps.at(i + 1) ) {
398 OOFEM_ERROR(
"MisesMat: Should not check yield stress for htype = 0\n");
406 double yieldStress = 0.;
408 return this->
giveS(gp, tStep) + this->
H * kappa;
411 OOFEM_ERROR(
"kappa outside range of specified hardening law/n");
414 for (
int i = 1; i <
h_eps.giveSize(); i++ ) {
415 if ( kappa >=
h_eps.at(i) && kappa <
h_eps.at(i + 1) ) {
428 double yieldStressPrime;
430 yieldStressPrime = this->
H;
431 return yieldStressPrime;
434 OOFEM_ERROR(
"kappa outside range of specified hardening law/n");
438 for (
int i = 1; i <
h_eps.giveSize(); i++ ) {
439 if ( kappa >=
h_eps.at(i) && kappa <
h_eps.at(i + 1) ) {
441 return yieldStressPrime;
453 if ( tempKappa > 0. ) {
463 if ( tempKappa >= 0. ) {
478 if ( dam > tempDam ) {
502 if ( mode != TangentStiffness ) {
508 double tempKappa = status->giveTempCumulativePlasticStrain();
510 double dKappa = tempKappa - kappa;
512 if ( dKappa <= 0.0 ) {
527 double factor = -2. * sqrt(6.) *
G *
G / trialS;
529 d += factor1 *
dyad(trialStressDev, trialStressDev);
532 double factor2 = factor * dKappa;
537 double omega = status->giveTempDamage();
542 d += scalar *
dyad(effStress, trialStressDev);
553 if ( mmode != TangentStiffness ) {
554 double omega = status->giveTempDamage();
555 return d * ( 1. - omega );
558 double kappa = status->giveCumulativePlasticStrain();
559 double tempKappa = status->giveTempCumulativePlasticStrain();
561 double dKappa = tempKappa - kappa;
562 if ( dKappa <= 0.0 ) {
567 fullStress = status->giveTempStressVector();
570 double xi = 2. / 3. * ( stress.
at(1) * stress.
at(1) + stress.
at(2) * stress.
at(2) - stress.
at(1) * stress.
at(2) ) + 2. * stress.
at(3) * stress.
at(3);
572 double dGamma = dKappa * sqrt(3. / 2. / xi);
579 double Es1 = 3. *
E / ( 3. * ( 1. - nu ) +
E * dGamma );
580 double Es2 = 2. *
G / ( 1. + 2. *
G * dGamma );
581 double Es3 = Es2 / 2.;
583 double EPs1 = 1. / 3. * Es1;
587 EP.
at(1, 1) = 0.5 * ( EPs1 + EPs2 );
588 EP.
at(2, 2) = EP.
at(1, 1);
589 EP.
at(1, 2) = 0.5 * ( EPs1 - EPs2 );
590 EP.
at(2, 1) = EP.
at(1, 2);
596 double denom1 = stress.
at(1) * ( 2. / 3. * n.
at(1) - 1. / 3. * n.
at(2) ) + stress.
at(2) * ( 2. / 3. * n.
at(2) - 1. / 3. * n.
at(1) ) + 2. * stress.
at(3) * n.
at(3);
597 double denom2 = 2. * xi * HiP / ( 3. - 2. * HiP * dGamma );
598 double alpha = 1. / ( denom1 + denom2 );
601 correction.
times(alpha);
604 answer.
at(1, 1) = 0.5 * ( Es1 + Es2 );
605 answer.
at(2, 2) = answer.
at(1, 1);
606 answer.
at(1, 2) = 0.5 * ( Es1 - Es2 );
607 answer.
at(2, 1) = answer.
at(1, 2);
608 answer.
at(3, 3) = Es3;
626 double E = elastic.at(1, 1);
627 if ( mode != TangentStiffness ) {
631 if ( tempKappa <= kappa ) {
632 return elastic * ( 1 - omega );
637 double stress = stressVector.
at(1);
650 if ( type == IST_PlasticStrainTensor ) {
653 }
else if ( type == IST_MaxEquivalentStrainLevel ) {
657 }
else if ( ( type == IST_DamageScalar ) || ( type == IST_DamageTensor ) ) {
661 }
else if ( type == IST_YieldStrength ) {
663 answer.
at(1) = this->
giveS(gp, tStep);
687 fprintf(file,
" plastic ");
689 fprintf(file,
"%.4e ", val);
693 fprintf(file,
"status { ");
697 fprintf(file,
", kappa ");
698 fprintf(file,
" %.4e",
kappa);
700 fprintf(file,
"}\n");
702 fprintf(file,
"}\n");
744 if ( ( tf = fm->
giveField(FT_Temperature) ) ) {
748 if ( ( err = tf->evaluateAt(answer, gcoords, VM_Total, tStep) ) ) {
#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.
virtual int computeGlobalCoordinates(FloatArray &answer, const FloatArray &lcoords)
Domain * giveDomain() const
Domain * domain
Link to domain object, useful for communicating with other FEM components.
FieldPtr giveField(FieldType key)
double & at(std::size_t i)
Index giveSize() const
Returns the size of receiver.
void beProductOf(const FloatMatrix &aMatrix, const FloatArray &anArray)
void add(const FloatArray &src)
void subtract(const FloatArray &src)
double at(std::size_t i, std::size_t j) const
void beDyadicProductOf(const FloatArray &vec1, const FloatArray &vec2)
double at(std::size_t i, std::size_t j) const
const FloatArray & giveNaturalCoordinates() const
Returns coordinate array of receiver.
Element * giveElement()
Returns corresponding element to receiver.
virtual MaterialStatus * giveStatus(GaussPoint *gp) const
virtual void initTempStatus(GaussPoint *gp) const
void restoreContext(DataStream &stream, ContextMode mode) override
double giveDamage() const
double damage
damage variable (initial).
void letTempEffectiveStressBe(const FloatArray &values)
double giveTempCumulativePlasticStrain() const
void printOutputAt(FILE *file, TimeStep *tStep) const override
Print receiver's output to given stream.
const FloatArray & givePlasDef()
void saveContext(DataStream &stream, ContextMode mode) override
double giveTempDamage() const
double giveCumulativePlasticStrain() const
const FloatArray & giveTempEffectiveStress() const
FloatArray trialStressD
Deviatoric trial stress - needed for tangent stiffness.
void letTempPlasticStrainBe(const FloatArray &values)
void initTempStatus() override
void setTempCumulativePlasticStrain(double value)
FloatArray tempPlasticStrain
Plastic strain (final).
double kappa
Cumulative plastic strain (initial).
double tempDamage
damage variable (final).
void updateYourself(TimeStep *tStep) override
const FloatArray & givePlasticStrain() const
MisesMatStatus(GaussPoint *g)
double tempKappa
Cumulative plastic strain (final).
FloatArray plasticStrain
Plastic strain (initial).
FloatArrayF< 1 > giveRealStressVector_1d(const FloatArrayF< 1 > &reducedE, GaussPoint *gp, TimeStep *tStep) const override
Default implementation relies on giveRealStressVector_StressControl.
ScalarFunction sig0
Initial (uniaxial) yield stress.
IsotropicLinearElasticMaterial linearElasticMaterial
Reference to the basic elastic material.
double giveS(GaussPoint *gp, TimeStep *tStep) const
virtual double computeCumPlastStrain(GaussPoint *gp, TimeStep *tStep) const
void initializeFrom(InputRecord &ir) override
double computeDamageParam(double tempKappa) const
double computeYieldStress(double kappa, GaussPoint *gp, TimeStep *tStep) const
double G
Elastic shear modulus.
FloatMatrixF< 6, 6 > give3dMaterialStiffnessMatrix(MatResponseMode mode, GaussPoint *gp, TimeStep *tStep) const override
double a
exponent in damage function.
double giveTemperature(GaussPoint *gp, TimeStep *tStep) const
FloatMatrixF< 1, 1 > give1dStressStiffMtrx(MatResponseMode mode, GaussPoint *gp, TimeStep *tStep) const override
double checkYieldStress(double &dKappa, double kappa, GaussPoint *gp, TimeStep *tStep) const
int giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep) override
std::unique_ptr< MaterialStatus > CreateStatus(GaussPoint *gp) const override
double computeDamage(GaussPoint *gp, TimeStep *tStep) const
double yieldTol
tolerance for the yield function in RRM algorithm.
void performPlasticityReturn(const FloatArray &totalStrain, GaussPoint *gp, TimeStep *tStep) const
FloatArray h_eps
user-defined hardening (yield stress - kappa)
FloatMatrixF< 3, 3 > givePlaneStressStiffMtrx(MatResponseMode mmode, GaussPoint *gp, TimeStep *tStep) const override
double computeYieldStressPrime(double kappa) const
int hType
type of hardening function
double H
Hardening modulus.
FloatArrayF< 3 > giveRealStressVector_PlaneStress(const FloatArrayF< 3 > &totalStrain, GaussPoint *gp, TimeStep *tStep) const override
Default implementation relies on giveRealStressVector_StressControl.
void performPlasticityReturn_PlaneStress(const FloatArrayF< 3 > &totalStrain, GaussPoint *gp, TimeStep *tStep) const
double omega_crit
critical(maximal) damage.
double K
Elastic bulk modulus.
FloatArray h_function_eps
double computeDamageParamPrime(double tempKappa) const
MisesMat(int n, Domain *d)
FloatArrayF< 6 > giveRealStressVector_3d(const FloatArrayF< 6 > &strain, GaussPoint *gp, TimeStep *tStep) const override
Default implementation relies on giveRealStressVector for second Piola-Kirchoff stress.
void initTempStatus() override
void printOutputAt(FILE *file, TimeStep *tStep) const override
Print receiver's output to given stream.
void saveContext(DataStream &stream, ContextMode mode) override
StructuralMaterialStatus(GaussPoint *g)
Constructor. Creates new StructuralMaterialStatus with IntegrationPoint g.
void updateYourself(TimeStep *tStep) override
FloatArray stressVector
Equilibrated stress vector in reduced form.
FloatArray strainVector
Equilibrated strain vector in reduced form.
void restoreContext(DataStream &stream, ContextMode mode) override
virtual FloatArrayF< 1 > giveRealStressVector_1d(const FloatArrayF< 1 > &reducedE, GaussPoint *gp, TimeStep *tStep) const
Default implementation relies on giveRealStressVector_StressControl.
static FloatArrayF< 6 > computeDeviatoricVolumetricSum(const FloatArrayF< 6 > &dev, double mean)
static void giveReducedSymVectorForm(FloatArray &answer, const FloatArray &vec, MaterialMode matMode)
Converts the full unsymmetric Voigt vector (2nd order tensor) to reduced form.
static FloatArrayF< 6 > applyDeviatoricElasticCompliance(const FloatArrayF< 6 > &stress, double EModulus, double nu)
void initializeFrom(InputRecord &ir) override
StructuralMaterial(int n, Domain *d)
static FloatArrayF< 6 > applyDeviatoricElasticStiffness(const FloatArrayF< 6 > &strain, double EModulus, double nu)
static double computeStressNorm(const FloatArrayF< 6 > &stress)
void giveStressDependentPartOfStrainVector(FloatArray &answer, GaussPoint *gp, const FloatArray &reducedStrainVector, TimeStep *tStep, ValueModeType mode) const
int giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep) override
static std::pair< FloatArrayF< 6 >, double > computeDeviatoricVolumetricSplit(const FloatArrayF< 6 > &s)
static void giveFullSymVectorForm(FloatArray &answer, const FloatArray &vec, MaterialMode matMode)
Converts the reduced unsymmetric Voigt vector (2nd order tensor) to full form.
double giveIntrinsicTime()
Returns intrinsic time, e.g. time in which constitutive model is evaluated.
#define OOFEM_WARNING(...)
#define _IFT_MisesMat_sig0
#define _IFT_MisesMat_h_function_eps
#define _IFT_MisesMat_h_eps
#define _IFT_MisesMat_omega_crit
#define _IFT_MisesMat_yieldTol
#define _IFT_MisesMat_htype
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.
std::shared_ptr< Field > FieldPtr
@ CIO_IOERR
General IO error.