52DustMaterialStatus :: DustMaterialStatus(
GaussPoint *
gp,
double q0) :
64DustMaterialStatus :: initTempStatus()
67 StructuralMaterialStatus :: initTempStatus();
74DustMaterialStatus :: updateYourself(
TimeStep *tStep)
77 StructuralMaterialStatus :: updateYourself(tStep);
84DustMaterialStatus :: printOutputAt(FILE *file,
TimeStep *tStep)
const
87 StructuralMaterialStatus :: printOutputAt(file, tStep);
89 fprintf(file,
"\tstatus { ");
93 case DustMaterialStatus :: DM_Elastic:
94 fprintf(file,
" Elastic");
96 case DustMaterialStatus :: DM_Yielding1:
97 fprintf(file,
" Yielding1");
99 case DustMaterialStatus :: DM_Yielding2:
100 fprintf(file,
" Yielding2");
102 case DustMaterialStatus :: DM_Yielding3:
103 fprintf(file,
" Yielding3");
105 case DustMaterialStatus :: DM_Unloading:
106 fprintf(file,
" Unloading");
110 fprintf(file,
", plasticStrains ");
112 fprintf( file,
" %.4e", val );
115 fprintf(file,
", q %.4e",
q);
117 fprintf(file,
"}\n");
123 StructuralMaterialStatus :: saveContext(stream, mode);
130 StructuralMaterialStatus :: restoreContext(stream, mode);
150 StructuralMaterial :: initializeFrom(ir);
230 auto strainVectorR = strain - thermalStrain;
236 status->letTempStrainVectorBe(strain);
239 return status->giveTempStressVector();
250 auto strainDeviator = tmp.first;
251 auto volumetricStrain = tmp.second;
254 auto plasticStrain = status->givePlasticStrain();
258 auto plasticStrainDeviator = tmp2.first;
259 auto volumetricPlasticStrain = tmp2.second;
261 double volumetricElasticStrain = volumetricStrain - volumetricPlasticStrain;
262 auto elasticStrainDeviator = strainDeviator - plasticStrainDeviator;
265 double bulkModulus, shearModulus;
267 double volumetricStress = 3. * bulkModulus * volumetricElasticStrain;
268 FloatArrayF<6> stressDeviator = {2 * elasticStrainDeviator[0], 2 * elasticStrainDeviator[1], 2 * elasticStrainDeviator[2],
269 elasticStrainDeviator[3], elasticStrainDeviator[4], elasticStrainDeviator[5]};
270 stressDeviator *= shearModulus;
274 double i1 = 3 * volumetricStress;
275 double f1, f2, f3, q, tempQ;
276 q = tempQ = status->giveQ();
285 double auxModulus = 2 * shearModulus / ( 9 * bulkModulus );
288 if ( f1 > 0 && i1 >= q && rho >= temp ) {
289 status->letTempStateFlagBe(DustMaterialStatus :: DM_Yielding1);
291 tempQ = status->giveTempQ();
294 }
else if ( f2 > 0 && i1 < q ) {
295 status->letTempStateFlagBe(DustMaterialStatus :: DM_Yielding2);
297 tempQ = status->giveTempQ();
300 }
else if ( f3 > 0 && rho < temp ) {
301 status->letTempStateFlagBe(DustMaterialStatus :: DM_Yielding3);
304 double b = fFeFt - 2 * shearModulus / ( 9 * bulkModulus ) * ( i1 -
ft ) - ( 1 + fFeDqFt ) * rho;
305 double c = -fFeFt / ( 9 * bulkModulus ) * ( i1 -
ft );
306 lambda = 1 / ( 4 * shearModulus ) * ( -b + sqrt(b * b - 8 * shearModulus * c) );
307 double deltaVolumetricPlasticStrain = 3 * ( 1 - ( 1 + fFeDqFt ) * rho / fFeFt ) *
lambda;
308 if ( volumetricPlasticStrain + deltaVolumetricPlasticStrain < -.5 *
wHard ) {
309 deltaVolumetricPlasticStrain = -.5 *
wHard - volumetricPlasticStrain;
316 status->letTempQBe(tempQ);
319 int stateFlag = status->giveStateFlag();
320 if ( ( stateFlag == DustMaterialStatus :: DM_Unloading ) || ( stateFlag == DustMaterialStatus :: DM_Elastic ) ) {
321 status->letTempStateFlagBe(DustMaterialStatus :: DM_Elastic);
323 status->letTempStateFlagBe(DustMaterialStatus :: DM_Unloading);
337 auto mDeviator = tmp3.first;
338 auto mVol = tmp3.second;
340 i1 -= 3 * bulkModulus * mVol;
341 volumetricStress = i1 / 3.;
342 stressDeviator += (-2 * shearModulus) * mDeviator;
347 status->letTempStressVectorBe(stress);
350 status->letTempPlasticStrainBe(plasticStrain);
354DustMaterial :: performF1return(
double i1,
double rho,
GaussPoint *gp)
const
358 double shearModulus = status->giveShearModulus();
359 double q = status->giveQ();
360 double tempQ = status->giveTempQ();
361 double m = 9 * bulkModulus / ( 2 * shearModulus );
362 int positiveFlag = 0;
365 double vfI1 =
functionI1(q, tempQ, i1, bulkModulus);
367 double a = ( vfI1 - tempQ ) / (
ft - tempQ );
370 double da = ( ( vfI1DQ - 1 ) * (
ft - tempQ ) + ( vfI1 - tempQ ) ) / ( (
ft - tempQ ) * (
ft - tempQ ) );
373 double d = da * b * c + a * db * c + a * b * dc;
374 double fx = -3 *bulkModulus *
functionH(q, tempQ) - m * a * b * c;
375 double dfx = -3 *bulkModulus *
functionHDQ(tempQ) - m * d;
378 if ( positiveFlag >= 1 ) {
379 status->letTempQBe(0.0);
387 if ( fabs(fx / dfx / tempQ) <
newtonTol ) {
388 status->letTempQBe(tempQ);
393 OOFEM_LOG_DEBUG(
" i1 %e rho %e bulkM %e shearM %e\n", i1, rho, bulkModulus, shearModulus);
398DustMaterial :: performF2return(
double i1,
double rho,
GaussPoint *gp)
const
402 double shearModulus = status->giveShearModulus();
403 double q = status->giveQ();
406 double tempQ = .5 * ( qLeft + qRight );
408 double fx = i1 - 3 *bulkModulus *
functionH(q, qLeft) - qLeft;
409 double dfx = -3 *bulkModulus *
functionHDQ(qLeft) - 1;
417 double fq =
fTempR2(tempQ, q, i1, rho, bulkModulus, shearModulus);
418 if ( fabs( ( qRight - qLeft ) / qRight ) <
newtonTol ) {
419 status->letTempQBe(tempQ);
429 tempQ = .5 * ( qLeft + qRight );
436DustMaterial :: computeQFromPlastVolEps(
double &answer,
double q,
double deltaVolumetricPlasticStrain)
const
444 double fx =
functionH(q, answer) - deltaVolumetricPlasticStrain;
447 if ( fabs(fx / dfx / answer) <
newtonTol ) {
461DustMaterial :: give3dMaterialStiffnessMatrix(MatResponseMode mode,
467 double ym = status->giveYoungsModulus();
468 double coeff = status->giveVolumetricPlasticStrain() < 0 ? ym / ym0 : 1.0;
469 if ( mode == ElasticStiffness ) {
470 return LEMaterial.give3dMaterialStiffnessMatrix(mode, gp, tStep);
471 }
else if ( mode == SecantStiffness || mode == TangentStiffness ) {
472 return coeff *
LEMaterial.give3dMaterialStiffnessMatrix(mode, gp, tStep);
482 if ( type == IST_PlasticStrainTensor ) {
483 status->letPlasticStrainBe(value);
485 }
else if ( type == IST_StressCapPos ) {
486 status->letQBe( value.
at(1) );
489 return StructuralMaterial :: setIPValue(value, gp, type);
500 if ( type == IST_PlasticStrainTensor ) {
501 answer = status->givePlasticStrain();
503 }
else if ( type == IST_PrincipalPlasticStrainTensor ) {
506 }
else if ( type == IST_VolumetricPlasticStrain ) {
508 answer.
at(1) = status->giveVolumetricPlasticStrain();
510 }
else if ( type == IST_StressCapPos ) {
512 answer.
at(1) = status->giveQ();
515 return StructuralMaterial :: giveIPValue(answer, gp, type, tStep);
521std::unique_ptr<MaterialStatus>
524 return std::make_unique<DustMaterialStatus>(gp, this->
giveQ0() );
528DustMaterial :: functionFe(
double i1)
const
534DustMaterial :: functionFeDI1(
double i1)
const
540DustMaterial :: functionFeDI1DI1(
double i1)
const
546DustMaterial :: functionFc(
double rho,
double i1,
double q)
const
548 return sqrt( rho * rho + 1 /
rEll /
rEll * ( q - i1 ) * ( q - i1 ) );
552DustMaterial :: yieldFunction1(
double rho,
double i1)
const
558DustMaterial :: yieldFunction2(
double rho,
double i1,
double q)
const
564DustMaterial :: yieldFunction3(
double i1)
const
570DustMaterial :: functionX(
double q)
const
576DustMaterial :: functionXDQ(
double q)
const
582DustMaterial :: solveQ0(
double &answer)
const
588 if ( fabs(fx / dfx / answer) <
newtonTol ) {
590 OOFEM_ERROR(
"internal parameter q has to be negative");
601DustMaterial :: computeAndSetBulkAndShearModuli(
double &bulkModulus,
double &shearModulus,
GaussPoint *gp)
const
606 double volumetricPlasticStrain = status->giveVolumetricPlasticStrain();
607 if ( volumetricPlasticStrain < 0. ) {
608 ym -=
mStiff * volumetricPlasticStrain;
611 bulkModulus = IsotropicLinearElasticMaterial :: computeBulkModulusFromYoungAndPoisson(ym, nu);
612 shearModulus = IsotropicLinearElasticMaterial :: computeShearModulusFromYoungAndPoisson(ym, nu);
613 status->setBulkModulus(bulkModulus);
614 status->setShearModulus(shearModulus);
615 status->setYoungsModulus(ym);
619DustMaterial :: computePlastStrainDirM1(
const FloatArrayF<6> &stressDeviator,
double rho,
double i1,
double q)
const
627DustMaterial :: computePlastStrainDirM2(
const FloatArrayF<6> &stressDeviator,
double rho,
double i1,
double q)
const
630 double temp = ( q - i1 ) / (
rEll *
rEll * fc );
636DustMaterial :: computePlastStrainDirM3(
const FloatArrayF<6> &stressDeviator,
double rho,
double i1,
double q)
const
640 double temp = 1 - ( 1 + dfeft ) * rho / feft;
646DustMaterial :: functionH(
double q,
double tempQ)
const
660DustMaterial :: functionHDQ(
double tempQ)
const
674DustMaterial :: functionI1(
double q,
double tempQ,
double i1,
double bulkModulus)
const
676 return i1 - 3 *bulkModulus *
functionH(q, tempQ);
680DustMaterial :: functionI1DQ(
double tempQ,
double bulkModulus)
const
686DustMaterial :: computeDeltaGamma2(
double tempQ,
double q,
double i1,
double bulkModulus)
const
689 return rEll *
rEll *
functionFe(tempQ) * vfH / ( 3 * ( i1 - 3 * bulkModulus * vfH - tempQ ) );
693DustMaterial :: computeDeltaGamma2DQ(
double tempQ,
double q,
double i1,
double bulkModulus)
const
699 double frac1 =
rEll *
rEll * vfEq * vfH;
700 double dfrac1 =
rEll *
rEll * ( vdfEq * vfH + vfEq * vdfH );
701 double frac2 = 3 * ( i1 - 3 * bulkModulus * vfH - tempQ );
702 double dfrac2 = 3 * ( -3 * bulkModulus * vdfH - 1 );
703 return ( dfrac1 * frac2 - frac1 * dfrac2 ) / frac2 / frac2;
707DustMaterial :: fTempR2(
double tempQ,
double q,
double i1,
double rho,
double bulkModulus,
double shearModulus)
const
711 double frac = ( vfEq + 2 * shearModulus * dgq );
712 double a = rho * vfEq / frac;
713 frac = (
rEll *
rEll * vfEq + 9 * bulkModulus * dgq );
714 double b = ( tempQ - i1 ) *
rEll * vfEq / frac;
715 return a * a + b * b - vfEq * vfEq;
#define REGISTER_Material(class)
FloatArrayF< 6 > plasticStrain
Plastic strain.
const FloatArrayF< 6 > & givePlasticStrain() const
double q
Hardening parameter q.
double giveBulkModulus() const
FloatArrayF< 6 > tempPlasticStrain
int stateFlag
Indicates the state (i.e. elastic, yielding, unloading) of the Gauss point.
void solveQ0(double &answer) const
double functionFe(double i1) const
double newtonTol
Tollerance for iterative methods.
double yieldFunction2(double rho, double i1, double q) const
double x0
Parameter determining shape of yield surface (param X0 in original publication).
double functionI1DQ(double tempQ, double bulkModulus) const
double functionX(double q) const
double computeDeltaGamma2(double tempQ, double q, double i1, double bulkModulus) const
double yieldFunction1(double rho, double i1) const
double dHard
Parameter determining hardening law (parameter D in original publication).
int hardeningType
Parameter determining hardening type.
double alpha
Parameter determining shape of yield surface.
FloatArrayF< 6 > computePlastStrainDirM1(const FloatArrayF< 6 > &stressDeviator, double rho, double i1, double q) const
void performStressReturn(GaussPoint *gp, const FloatArrayF< 6 > &strain) const
void performF2return(double i1, double rho, GaussPoint *gp) const
double theta
Parameter determining shape of yield surface.
double q0
Parameter determining shape of yield surface.
double functionHDQ(double tempQ) const
double beta
Parameter determining shape of yield surface.
double wHard
Parameter determining hardening law (parameter W in original publication).
double rEll
Parameter determining shape of yield surface (param R in original publication).
double functionH(double q, double tempQ) const
double functionI1(double q, double tempQ, double i1, double bulkModulus) const
void computeQFromPlastVolEps(double &answer, double q, double deltaVolumetricPlasticStrain) const
double functionFeDI1(double i1) const
int newtonIter
Maximum number of iterations for iterative methods.
double fTempR2(double tempQ, double q, double i1, double rho, double bulkModulus, double shearModulus) const
double mStiff
Parameter increasing stiffness (parameter M in original publication).
IsotropicLinearElasticMaterial LEMaterial
Pointer for linear elastic material.
double lambda
Parameter determining shape of yield surface.
double ft
Parameter determining shape of yield surface (param T in original publication).
FloatArrayF< 6 > computePlastStrainDirM2(const FloatArrayF< 6 > &stressDeviator, double rho, double i1, double q) const
double functionXDQ(double q) const
FloatArrayF< 6 > computePlastStrainDirM3(const FloatArrayF< 6 > &stressDeviator, double rho, double i1, double q) const
double functionFc(double rho, double i1, double q) const
void computeAndSetBulkAndShearModuli(double &bulkModulus, double &shearModulus, GaussPoint *gp) const
double yieldFunction3(double i1) const
void performF1return(double i1, double rho, GaussPoint *gp) const
double functionFeDI1DI1(double i1) const
GaussPoint * gp
Associated integration point.
virtual MaterialStatus * giveStatus(GaussPoint *gp) const
virtual void initTempStatus(GaussPoint *gp) const
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 FloatArrayF< 6 > computeDeviatoricVolumetricSum(const FloatArrayF< 6 > &dev, double mean)
static void computePrincipalValues(FloatArray &answer, const FloatArray &s, stressStrainPrincMode mode)
Common functions for convenience.
StructuralMaterial(int n, Domain *d)
static double computeSecondCoordinate(const FloatArrayF< 6 > &s)
static std::pair< FloatArrayF< 6 >, double > computeDeviatoricVolumetricSplit(const FloatArrayF< 6 > &s)
FloatArrayF< 6 > computeStressIndependentStrainVector_3d(GaussPoint *gp, TimeStep *tStep, ValueModeType mode) const
#define _IFT_DustMaterial_rEll
#define _IFT_DustMaterial_newtonTol
#define _IFT_DustMaterial_ft
#define _IFT_DustMaterial_dHard
#define _IFT_DustMaterial_newtonIter
#define _IFT_DustMaterial_lambda
#define _IFT_DustMaterial_hardeningType
#define _IFT_DustMaterial_x0
#define _IFT_DustMaterial_mStiff
#define _IFT_DustMaterial_wHard
#define _IFT_DustMaterial_beta
#define _IFT_DustMaterial_theta
#define _IFT_DustMaterial_alpha
#define OOFEM_LOG_DEBUG(...)
@ principal_strain
For computing principal strains from engineering strains.