39 #include "../sm/Materials/structuralms.h" 42 #include "../sm/Materials/structuralmaterial.h" 55 tempPlasticStrain( 6 )
93 fprintf(file,
"\tstatus { ");
98 fprintf(file,
" Elastic");
101 fprintf(file,
" Yielding1");
104 fprintf(file,
" Yielding2");
107 fprintf(file,
" Yielding3");
110 fprintf(file,
" Unloading");
114 fprintf(file,
", plasticStrains ");
116 fprintf( file,
" %.4e", val );
119 fprintf(file,
", q %.4e",
q);
121 fprintf(file,
"}\n");
175 if ( result !=
IRRT_OK )
return result;
179 if ( result !=
IRRT_OK )
return result;
240 OOFEM_WARNING(
"parameter 'alpha' must be greater than parameter 'lambda'");
288 double volumetricStrain;
293 double volumetricPlasticStrain;
296 double volumetricElasticStrain = volumetricStrain - volumetricPlasticStrain;
297 FloatArray elasticStrainDeviator = strainDeviator;
298 elasticStrainDeviator.
subtract(plasticStrainDeviator);
301 double bulkModulus, shearModulus;
303 double volumetricStress = 3. * bulkModulus * volumetricElasticStrain;
304 FloatArray stressDeviator = {2 * elasticStrainDeviator[0], 2 * elasticStrainDeviator[1], 2 * elasticStrainDeviator[2],
305 elasticStrainDeviator[3], elasticStrainDeviator[4], elasticStrainDeviator[5]};
306 stressDeviator.
times(shearModulus);
310 double i1 = 3 * volumetricStress;
311 double f1, f2, f3, q, tempQ;
312 q = tempQ = status->
giveQ();
321 double auxModulus = 2 * shearModulus / ( 9 * bulkModulus );
324 if ( f1 > 0 && i1 >= q && rho >= temp ) {
330 }
else if ( f2 > 0 && i1 < q ) {
336 }
else if ( f3 > 0 && rho < temp ) {
340 double b = fFeFt - 2 * shearModulus / ( 9 * bulkModulus ) * ( i1 -
ft ) - ( 1 + fFeDqFt ) * rho;
341 double c = -fFeFt / ( 9 * bulkModulus ) * ( i1 -
ft );
342 lambda = 1 / ( 4 * shearModulus ) * ( -b + sqrt(b * b - 8 * shearModulus * c) );
343 double deltaVolumetricPlasticStrain = 3 * ( 1 - ( 1 + fFeDqFt ) * rho / fFeFt ) *
lambda;
344 if ( volumetricPlasticStrain + deltaVolumetricPlasticStrain < -.5 *
wHard ) {
345 deltaVolumetricPlasticStrain = -.5 *
wHard - volumetricPlasticStrain;
369 plasticStrain.
add(m);
373 i1 -= 3 * bulkModulus * mVol;
374 volumetricStress = i1 / 3.;
375 mDeviator.
times(-2 * shearModulus);
376 stressDeviator.
add(mDeviator);
380 stress.
at(1) += volumetricStress;
381 stress.
at(2) += volumetricStress;
382 stress.
at(3) += volumetricStress;
395 double q = status->
giveQ();
398 double m = 9 * bulkModulus / ( 2 * shearModulus );
399 double vfI1, vfI1DQ, a, b, c, d, da, db, dc;
400 int positiveFlag = 0;
405 a = ( vfI1 - tempQ ) / (
ft - tempQ );
408 da = ( ( vfI1DQ - 1 ) * (
ft - tempQ ) + ( vfI1 - tempQ ) ) / ( (
ft - tempQ ) * (
ft - tempQ ) );
411 d = da * b * c + a * db * c + a * b * dc;
412 fx = -3 *bulkModulus *
functionH(q, tempQ) - m * a * b * c;
416 if ( positiveFlag >= 1 ) {
425 if ( fabs(fx / dfx / tempQ) <
newtonTol ) {
431 OOFEM_LOG_DEBUG(
" i1 %e rho %e bulkM %e shearM %e\n", i1, rho, bulkModulus, shearModulus);
441 double q = status->
giveQ();
444 double tempQ = .5 * ( qLeft + qRight );
448 fx = i1 - 3 *bulkModulus *
functionH(q, qLeft) - qLeft;
457 fq =
fTempR2(tempQ, q, i1, rho, bulkModulus, shearModulus);
458 if ( fabs( ( qRight - qLeft ) / qRight ) <
newtonTol ) {
469 tempQ = .5 * ( qLeft + qRight );
485 fx =
functionH(q, answer) - deltaVolumetricPlasticStrain;
488 if ( fabs(fx / dfx / answer) <
newtonTol ) {
511 if ( mode == ElasticStiffness ) {
513 }
else if ( mode == SecantStiffness || mode == TangentStiffness ) {
525 if ( type == IST_PlasticStrainTensor ) {
528 }
else if ( type == IST_StressCapPos ) {
543 if ( type == IST_PlasticStrainTensor ) {
546 }
else if ( type == IST_PrincipalPlasticStrainTensor ) {
549 }
else if ( type == IST_VolumetricPlasticStrain ) {
553 }
else if ( type == IST_StressCapPos ) {
555 answer.
at(1) = status->
giveQ();
591 return sqrt( rho * rho + 1 /
rEll /
rEll * ( q - i1 ) * ( q - i1 ) );
632 if ( fabs(fx / dfx / answer) <
newtonTol ) {
634 OOFEM_ERROR(
"internal parameter q has to be negative");
651 if ( volumetricPlasticStrain < 0. ) {
652 ym -=
mStiff * volumetricPlasticStrain;
665 answer.
beScaled(1./rho, stressDeviator);
668 answer.
at(1) += temp;
669 answer.
at(2) += temp;
670 answer.
at(3) += temp;
677 answer.
beScaled(1./fc, stressDeviator);
679 double temp = ( q - i1 ) / (
rEll *
rEll * fc );
680 answer.
at(1) -= temp;
681 answer.
at(2) -= temp;
682 answer.
at(3) -= temp;
689 answer.
beScaled(1./feft, stressDeviator);
692 double temp = 1 - ( 1 + dfeft ) * rho / feft;
693 answer.
at(1) += temp;
694 answer.
at(2) += temp;
695 answer.
at(3) += temp;
729 return i1 - 3 *bulkModulus *
functionH(q, tempQ);
742 return rEll *
rEll *
functionFe(tempQ) * vfH / ( 3 * ( i1 - 3 * bulkModulus * vfH - tempQ ) );
752 double frac1 =
rEll *
rEll * vfEq * vfH;
753 double dfrac1 =
rEll *
rEll * ( vdfEq * vfH + vfEq * vdfH );
754 double frac2 = 3 * ( i1 - 3 * bulkModulus * vfH - tempQ );
755 double dfrac2 = 3 * ( -3 * bulkModulus * vdfH - 1 );
756 return ( dfrac1 * frac2 - frac1 * dfrac2 ) / frac2 / frac2;
764 double frac = ( vfEq + 2 * shearModulus * dgq );
765 double a = rho * vfEq / frac;
766 frac = (
rEll *
rEll * vfEq + 9 * bulkModulus * dgq );
767 double b = ( tempQ - i1 ) *
rEll * vfEq / frac;
768 return a * a + b * b - vfEq * vfEq;
double functionFe(double i1)
Auxiliary equation Fe (7.8)
virtual void updateYourself(TimeStep *tStep)
Update equilibrium history variables according to temp-variables.
InternalStateType
Type representing the physical meaning of element or constitutive model internal variable.
double newtonTol
Tollerance for iterative methods.
static void computePrincipalValues(FloatArray &answer, const FloatArray &s, stressStrainPrincMode mode)
Common functions for convenience.
void subtract(const FloatArray &src)
Subtracts array src to receiver.
void letTempStrainVectorBe(const FloatArray &v)
Assigns tempStrainVector to given vector v.
void letQBe(double v)
Assign the value of variable q.
void computePlastStrainDirM1(FloatArray &answer, const FloatArray &stressDeviator, double rho, double i1, double q)
Computes direction of plastic yielding m1, equation 7.17.
virtual ~DustMaterialStatus()
Destructor.
virtual MaterialStatus * giveStatus(GaussPoint *gp) const
Returns material status of receiver in given integration point.
#define _IFT_DustMaterial_rEll
void letTempStateFlagBe(int v)
Assign the temp value of the state flag.
#define _IFT_DustMaterial_mStiff
For computing principal strains from engineering strains.
double giveYoungsModulus()
Get the value of actual Young's modulus of the status.
#define _IFT_DustMaterial_theta
double wHard
Parameter determining hardening law (parameter W in original publication)
double computeDeltaGamma2DQ(double tempQ, double q, double i1, double bulkModulus)
Computed derivative by tempQ of equation 7.39.
virtual IRResultType initializeFrom(InputRecord *ir)
Initializes receiver according to object description stored in input record.
static double computeSecondCoordinate(const FloatArray &s)
FloatArray tempStrainVector
Temporary strain vector in reduced form (to find balanced state)
double functionI1(double q, double tempQ, double i1, double bulkModulus)
Auxiliary equation I1 (7.32)
#define _IFT_DustMaterial_newtonTol
The purpose of DataStream abstract class is to allow to store/restore context to different streams...
virtual int giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep)
Returns the integration point corresponding value in Reduced form.
double & at(int i)
Coefficient access function.
double functionFc(double rho, double i1, double q)
Auxiliary equation Fc (7.9)
DustMaterialStatus(int n, Domain *d, GaussPoint *gp, double q0)
Constructor.
This class implements a structural material status information.
void letTempQBe(double v)
Assign the temp value of variable q.
FloatArray stressVector
Equilibrated stress vector in reduced form.
virtual contextIOResultType saveContext(DataStream &stream, ContextMode mode, void *obj=NULL)
Stores receiver state to output stream.
int hardeningType
Parameter determining hardening type.
void performF2return(double i1, double rho, GaussPoint *gp)
Performs stress return of case of yield function F2, computes new value of tempQ and sets it to statu...
#define _IFT_DustMaterial_newtonIter
void computeAndSetBulkAndShearModuli(double &bulkModulus, double &shearModulus, GaussPoint *gp)
Computes and sets all elastic moduli, with possible stiffening.
double functionX(double q)
Auxiliary equation X (7.11)
IsotropicLinearElasticMaterial * LEMaterial
Pointer for linear elastic material.
double functionHDQ(double tempQ)
Derivative by tempQ of auxiliary equation H (7.33 or 7.34)
virtual MaterialStatus * CreateStatus(GaussPoint *gp) const
Creates new copy of associated status and inserts it into given integration point.
virtual void printOutputAt(FILE *file, TimeStep *tStep)
Print receiver's output to given stream.
#define OOFEM_LOG_DEBUG(...)
MatResponseMode
Describes the character of characteristic material matrix.
const FloatArray & givePlasticStrain() const
Get the full plastic strain vector from the material status.
void letPlasticStrainBe(const FloatArray &v)
Assign the value of plastic strain.
double functionI1DQ(double tempQ, double bulkModulus)
Derivative by tempQ of auxiliary equation I1 (7.32)
static double computeBulkModulusFromYoungAndPoisson(double young, double nu)
Computes bulk modulus from given Young's modulus and Poisson's ratio.
virtual ~DustMaterial()
Destructor.
void performStressReturn(GaussPoint *gp, const FloatArray &strain)
Perform stress return and update all internal variables.
void computePlastStrainDirM3(FloatArray &answer, const FloatArray &stressDeviator, double rho, double i1, double q)
Computes direction of plastic yielding m2, equation 7.18.
double givePoissonsRatio()
Returns Poisson's ratio.
#define _IFT_DustMaterial_beta
FloatArray tempPlasticStrain
virtual void initTempStatus()
Initializes the temporary internal variables, describing the current state according to previously re...
void beScaled(double s, const FloatArray &b)
Sets receiver to be .
virtual void give3dMaterialStiffnessMatrix(FloatMatrix &answer, MatResponseMode mmode, GaussPoint *gp, TimeStep *tStep)
Computes full 3d material stiffness matrix at given integration point, time, respecting load history ...
double giveTempQ() const
Get the temp value of the hardening variable q from the material status.
virtual IRResultType initializeFrom(InputRecord *ir)
Initializes receiver according to object description stored in input record.
#define _IFT_DustMaterial_lambda
double functionXDQ(double q)
Derivative by q of auxiliary equation X (7.11)
double computeDeltaGamma2(double tempQ, double q, double i1, double bulkModulus)
Computed value of plastic multiplier for F2 yield function, equation 7.39.
This class implements an isotropic linear elastic material in a finite element problem.
double x0
Parameter determining shape of yield surface (param X0 in original publication)
virtual void giveRealStressVector_3d(FloatArray &answer, GaussPoint *gp, const FloatArray &strainVector, TimeStep *tStep)
Default implementation relies on giveRealStressVector for second Piola-Kirchoff stress.
double yieldFunction3(double i1)
Yield function 3 (tension dominant), equation 7.7.
virtual int giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep)
Returns the integration point corresponding value in Reduced form.
#define _IFT_DustMaterial_hardeningType
virtual void give3dMaterialStiffnessMatrix(FloatMatrix &answer, MatResponseMode, GaussPoint *gp, TimeStep *tStep)
Computes full 3d material stiffness matrix at given integration point, time, respecting load history ...
double functionFeDI1DI1(double i1)
Second derivative by i1 of auxiliary equation (7.8)
double theta
Parameter determining shape of yield surface.
DustMaterial(int n, Domain *d)
Constructor.
void times(double f)
Multiplies receiver by factor f.
#define _IFT_DustMaterial_x0
virtual int setIPValue(const FloatArray &value, GaussPoint *gp, InternalStateType type)
Sets the value of a certain variable at a given integration point to the given value.
void giveStressDependentPartOfStrainVector_3d(FloatArray &answer, GaussPoint *gp, const FloatArray &reducedStrainVector, TimeStep *tStep, ValueModeType mode)
double alpha
Parameter determining shape of yield surface.
double fTempR2(double tempQ, double q, double i1, double rho, double bulkModulus, double shearModulus)
Equation 7.38.
int giveStateFlag() const
Get the state flag from the material status.
void letTempPlasticStrainBe(const FloatArray &v)
Assign the temp value of plastic strain.
#define _IFT_DustMaterial_dHard
This class implements material status for dust material model.
double giveVolumetricPlasticStrain() const
Get the full plastic strain vector from the material status.
double q0
Parameter determining shape of yield surface.
double functionH(double q, double tempQ)
Auxiliary equation H (7.33 or 7.34)
virtual void updateYourself(TimeStep *tStep)
Update equilibrium history variables according to temp-variables.
virtual contextIOResultType restoreContext(DataStream &stream, ContextMode mode, void *obj=NULL)
Restores the receiver state previously written in stream.
void performF1return(double i1, double rho, GaussPoint *gp)
Performs stress return of case of yield function F1, computes new value of tempQ and sets it to statu...
double giveBulkModulus()
Get the value of actual bulk modulus of the status.
Abstract base class representing a material status information.
double giveQ() const
Get the value of hardening variable q from the material status.
double functionFeDI1(double i1)
Derivative by i1 of auxiliary equation (7.8)
Class representing vector of real numbers.
virtual IRResultType initializeFrom(InputRecord *ir)
Initializes receiver according to object description stored in input record.
FloatArray strainVector
Equilibrated strain vector in reduced form.
Implementation of matrix containing floating point numbers.
IRResultType
Type defining the return values of InputRecord reading operations.
void computePlastStrainDirM2(FloatArray &answer, const FloatArray &stressDeviator, double rho, double i1, double q)
Computes direction of plastic yielding m2, equation 7.19.
virtual contextIOResultType restoreContext(DataStream &stream, ContextMode mode, void *obj=NULL)
Restores the receiver state previously written in stream.
void letTempStressVectorBe(const FloatArray &v)
Assigns tempStressVector to given vector v.
double dHard
Parameter determining hardening law (parameter D in original publication)
#define _IFT_DustMaterial_alpha
double yieldFunction2(double rho, double i1, double q)
Yield function 2 (compression dominant), equation 7.6.
void setYoungsModulus(double v)
Assign the value of actual Young's modulus of the status.
double giveShearModulus()
Get the value of actual shear modulus of the status.
void times(double s)
Multiplies receiver with scalar.
static double computeDeviatoricVolumetricSplit(FloatArray &dev, const FloatArray &s)
Computes split of receiver into deviatoric and volumetric part.
double mStiff
Parameter increasing stiffness (parameter M in original publication)
long ContextMode
Context mode (mask), defining the type of information written/read to/from context.
double beta
Parameter determining shape of yield surface.
void solveQ0(double &answer)
Solves q0 according to given parameters, equation 7.12.
Abstract base class for all "structural" constitutive models.
virtual void initTempStatus()
Initializes the temporary internal variables, describing the current state according to previously re...
void setShearModulus(double v)
Assign the value of actual shear modulus of the status.
Domain * giveDomain() const
void computeQFromPlastVolEps(double &answer, double q, double deltaVolumetricPlasticStrain)
Computes tempQ from volumetric plastic strain increment, equation 7.44.
REGISTER_Material(DummyMaterial)
double lambda
Parameter determining shape of yield surface.
const FloatArray & giveTempStressVector() const
Returns the const pointer to receiver's temporary stress vector.
double yieldFunction1(double rho, double i1)
Yield function 1 (shear dominant), equation 7.5.
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.
#define _IFT_DustMaterial_ft
virtual void initTempStatus(GaussPoint *gp)
Initializes temporary variables stored in integration point status at the beginning of new time step...
#define _IFT_DustMaterial_wHard
double giveYoungsModulus()
Returns Young's modulus.
FloatArray tempStressVector
Temporary stress vector in reduced form (increments are used mainly in nonlinear analysis) ...
virtual int setIPValue(const FloatArray &value, GaussPoint *gp, InternalStateType type)
Sets the value of a certain variable at a given integration point to the given value.
Class representing integration point in finite element program.
#define OOFEM_WARNING(...)
int stateFlag
Indicates the state (i.e. elastic, yielding, unloading) of the Gauss point.
Class representing solution step.
virtual void printOutputAt(FILE *file, TimeStep *tStep)
Print receiver's output to given stream.
void add(const FloatArray &src)
Adds array src to receiver.
static double computeShearModulusFromYoungAndPoisson(double young, double nu)
Computes shear modulus from given Young's modulus and Poisson's ratio.
double ft
Parameter determining shape of yield surface (param T in original publication)
int newtonIter
Maximum number of iterations for iterative methods.
FloatArray plasticStrain
Plastic strain.
double q
Hardening parameter q.
double rEll
Parameter determining shape of yield surface (param R in original publication)
void setBulkModulus(double v)
Assign the value of actual bulk modulus of the status.
void resize(int s)
Resizes receiver towards requested size.