00001 // ------------------------------------------------------------------------- 00002 // ElasPlas.h - This header file contains the public data structure 00003 // definitions for the Associative Elasto-plastic constitutive 00004 // model class within FEMOOP. 00005 // ------------------------------------------------------------------------- 00006 // 00007 // Description: In this base case are implemented the general methods of 00008 // the elasto-plastic constitutive models (e.g. the return 00009 // of a trial state of stress to the yield surface). Each 00010 // particular model has only to implement simple methods 00011 // (e.g. a method to evaluate the yield function). All 00012 // these methods are defined below. 00013 // 00014 // Currently are implemented the models: 00015 // von Mises 00016 // Tresca 00017 // Drucker-Prager 00018 // Mohr-Coulomb 00019 // 00020 // Important: The elasto-plastic constitutive models must 00021 // have only one surface. 00022 // 00023 // ------------------------------------------------------------------------- 00024 // Main reference: 00025 // 00026 // "Plasticity: Computational Aspects", J. C. Simo & T. J. R. Hughes, 1988. 00027 // 00028 // ------------------------------------------------------------------------- 00029 // Main public methods: 00030 // ------------------------------------------------------------------------- 00031 // 00032 // virtual void Init( void ) 00033 // 00034 // Initializes the elasto-plastic model. 00035 // 00036 // ------------------------------------------------------------------------- 00037 // 00038 // virtual void Update( void ) 00039 // 00040 // Updates the history of the elasto-plastic model. The iterative plastic 00041 // strains and internal (hardening) variables are assigned to the 00042 // incremental variables. This operation must be done only after the 00043 // structure has reached an equilibrium state. 00044 // 00045 // ------------------------------------------------------------------------- 00046 // 00047 // virtual int Stress( double *strain_vec, double *stress_vec ) 00048 // 00049 // strain_vec - integration point strain vector ( in ) 00050 // stress_vec - integration point stress vector ( out ) 00051 // 00052 // Evaluates the state of stress in a integration point for a given state of 00053 // strain. It returns (1) if the operation had success an (0) otherwise. 00054 // First this methods tries to use the Closest-Point Projection Algorithm, 00055 // if this method fails then it tries the Cutting Plane Algorithm. 00056 // 00057 // ------------------------------------------------------------------------- 00058 // 00059 // virtual void ModifyCMatrix( double **c_matrix ) 00060 // 00061 // c_matrix - constitutive matrix ( in/out ) 00062 // 00063 // Evaluates the elasto-plastic constitutive matrix. If the step is 00064 // elastic (_dGamma == 0) does nothing. If the return to yield surface 00065 // was performed by the Closest-Point Projection Algorithm then this 00066 // method evaluates the consistent constitutive matrix, but when used 00067 // the Cutting Plane Algorithm it evaluates the classical one. 00068 // 00069 // ------------------------------------------------------------------------- 00070 // 00071 // virtual void GetPlasticVar( double *Ep, double *alpha ) 00072 // 00073 // Ep - plastic strains ( out ) 00074 // alpha - internal variable in strain space ( out ) 00075 // 00076 // Returns the current iterative plastic strains and the internal in 00077 // variables strain space. 00078 // 00079 // ------------------------------------------------------------------------- 00080 // 00081 // virtual void SetPlasticVar( double *Ep, double *alpha ) 00082 // 00083 // Ep - plastic strains ( out ) 00084 // alpha - internal variables in strain space ( out ) 00085 // 00086 // Stores the plastic strains and the internal variables in the iterative 00087 // variables. 00088 // 00089 // ------------------------------------------------------------------------- 00090 // 00091 // virtual void InternalVar( double *alpha, double *q ) 00092 // 00093 // alpha - internal variables in strain space ( in ) 00094 // q - internal variables in stress space ( out ) 00095 // 00096 // Evaluates the internal variables in stress space from a givem set of 00097 // variables in strain space. 00098 // 00099 // ------------------------------------------------------------------------- 00100 // 00101 // virtual void PlasticModuli( double *alpha, double *D ) 00102 // 00103 // alpha - internal variables in strain space ( in ) 00104 // D - generalized plastic moduli ( out ) 00105 // 00106 // Returns the matrix of generalized plastic moduli. 00107 // 00108 // ------------------------------------------------------------------------- 00109 // 00110 // virtual double YieldFunction( double *stress, double *q ) 00111 // 00112 // stress - stress vector ( in ) 00113 // q - internal variables in stress space ( in ) 00114 // 00115 // Returns the yield function value from a given state of stress and 00116 // internal variables. 00117 // 00118 // ------------------------------------------------------------------------- 00119 // 00120 // virtual void YieldGrad( double *stress, double *q, 00121 // double *dfs, double *dfq ) 00122 // 00123 // stress - stress vector ( in ) 00124 // q - internal variables in stress space ( in ) 00125 // dfs - derivative of yield surf. w.r.t. stress ( out ) 00126 // dfq - derivative of yield surf. w.r.t. int. var.( out ) 00127 // 00128 // Evaluates the gradient of yield surface w.r.t. the stress components 00129 // and internal variables in stress space. 00130 // 00131 // ------------------------------------------------------------------------- 00132 // 00133 // virtual void YieldHessian( double *stress, double *q, double **H ) 00134 // 00135 // stress - stress vector ( in ) 00136 // q - internal variables in stress space ( in ) 00137 // H - hessian of yield surface ( out ) 00138 // 00139 // Evaluates the hessian of yield surface w.r.t. the stress components 00140 // and internal variables in stress space. 00141 // 00142 // ------------------------------------------------------------------------- 00143 // Private methods: 00144 // ------------------------------------------------------------------------- 00145 // 00146 // int ClosestPoint( double *Et, double **C, double **C1, 00147 // double *Sig ) 00148 // 00149 // Et - total strain ( in ) 00150 // C - elastic constitutive matrix ( in ) 00151 // C1 - inverse of elastic constitutive matrix ( in ) 00152 // Sig - stress vector ( out ) 00153 // 00154 // Evaluates the state of stress from a given state of strain using the 00155 // Closest-Point Projection Algorithm. Evaluates the plastic strains and 00156 // the internal variables. 00157 // ------------------------------------------------------------------------- 00158 // 00159 // int CuttingPlane( double *Et, double **C, double *Sig ) 00160 // 00161 // Et - total strain ( in ) 00162 // C - elastic constitutive matrix ( in ) 00163 // Sig - stress vector ( out ) 00164 // 00165 // Evaluates the state of stress from a given state of strain using the 00166 // Cutting Plane Algorithm. Evalautes the plastic strains and the internal 00167 // variables. 00168 // 00169 // ------------------------------------------------------------------------- 00170 // 00171 // $Author: joaquim $ 00172 // $Revision: 1.2 $ 00173 // $Date: 1998/02/16 20:21:11 $ 00174 // $State: Exp $ 00175 // 00176 // ------------------------------------------------------------------------- 00177 00178 #ifndef _ELASTOPLASTIC_H 00179 #define _ELASTOPLASTIC_H 00180 00181 #include "cmodel.h" 00182 00183 // ------------------------------------------------------------------------- 00184 // Elasto-plastic constitutive model class: 00185 00186 class cElastoPlastic : public cConstModel 00187 { 00188 protected: 00189 int _iNumStrCmp; // Num. of stress components 00190 int _iNumIntVar; // Number of internal variables 00191 double _dGamma; // Plastic Multiplier 00192 double _dDenom; // {dF/dSig dF/dq} [A] {df/dSig df/dq} 00193 double *_dFdSig; // Deriv. of Yield Func. w.r.t stress 00194 double *_dFdq; // Deriv. of Yield Func. w.r.t internal var. 00195 double **_H; // Algorithmic moduli (consistent) 00196 00197 public: 00198 cElastoPlastic ( cIntPt *, cMaterial * ); 00199 ~cElastoPlastic ( void ); 00200 virtual void Init ( void ) = 0; 00201 virtual void Update ( void ) = 0; 00202 virtual int Stress ( double *, double * ); 00203 virtual void ModifyCMatrix ( double ** ); 00204 virtual void GetPlasticVar ( double *, double * ) = 0; 00205 virtual void SetPlasticVar ( double *, double * ) = 0; 00206 virtual void InternalVar ( double *, double * ) = 0; 00207 virtual void PlasticModuli ( double *, double ** ) = 0; 00208 virtual double YieldFunction ( double *, double * ) = 0; 00209 virtual void YieldGrad ( double *, double *, double *, double * ) = 0; 00210 virtual void YieldHessian ( double *, double *, double ** ); 00211 virtual int GetNumPrintScls( void ) { return 0; } 00212 virtual void GetPrintSclLabs( char ** ) { } 00213 virtual void GetPrintSclVals( double *, double * ) { } 00214 00215 private: 00216 int ClosestPoint ( double *, double **, double **, double * ); 00217 int CuttingPlane ( double *, double **, double * ); 00218 }; 00219 00220 #endif