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.