PressureDependMultiYield02.h

Go to the documentation of this file.
00001 // $Revision: 1.7 $
00002 // $Date: 2006/08/04 18:29:48 $
00003 // $Source: /usr/local/cvs/OpenSees/SRC/material/nD/soil/PressureDependMultiYield02.h,v $
00004 
00005 // Written: ZHY
00006 // Created: May 2004
00007 
00008 
00009 // Description: This file contains the class prototype for PressureDependMultiYield02.
00010 //
00011 // What: "@(#) PressureDependMultiYield02.h, revA"
00012 
00013 #ifndef PressureDependMultiYield02_h
00014 #define PressureDependMultiYield02_h
00015 
00016 #include <NDMaterial.h>
00017 #include <MultiYieldSurface.h>
00018 #include <Matrix.h>
00019 #include <Tensor.h>
00020 #include <stresst.h>
00021 
00022 class PressureDependMultiYield02 : public NDMaterial
00023 {
00024 public:
00025      // Initialization constructor
00026      PressureDependMultiYield02 (int tag,
00027                                int nd,
00028                                    double rho,
00029                                double refShearModul,
00030                                double refBulkModul,
00031                                double frictionAng,
00032                                double peakShearStra,
00033                                double refPress,
00034                                double pressDependCoe,
00035                                double phaseTransformAngle,
00036                                double contractionParam1,
00037                                double contractionParam3,
00038                                double dilationParam1,
00039                                double dilationParam3,
00040                                int   numberOfYieldSurf = 20,
00041                                    double * gredu = 0,
00042                                double contractionParam2 = 5.,
00043                                double dilationParam2 = 3.,
00044                                double liquefactionParam1 = 1. ,
00045                                double liquefactionParam2 = 0. ,
00046                            double e = 0.6,
00047                                double volLimit1 = 0.9,
00048                                double volLimit2 = 0.02,
00049                                double volLimit3 = 0.7,
00050                                double atm = 101.,
00051                                    double cohesi = 0.1,
00052                                    double hv = 0.,
00053                                    double pv = 1.);
00054 
00055      // Default constructor
00056      PressureDependMultiYield02 ();
00057 
00058      // Copy constructor
00059      PressureDependMultiYield02 (const PressureDependMultiYield02 &);
00060 
00061      // Destructor: clean up memory storage space.
00062      virtual ~PressureDependMultiYield02 ();
00063 
00064                  double getRho(void) {return rhox[matN];} ;
00065 
00066      // Sets the values of the trial strain tensor.
00067      int setTrialStrain (const Vector &strain);
00068 
00069      // Sets the values of the trial strain and strain rate tensors.
00070      int setTrialStrain(const Vector &v, const Vector &r);
00071 
00072      int setTrialStrainIncr(const Vector &v);
00073      int setTrialStrainIncr(const Vector &v, const Vector &r);
00074 
00075      // Calculates current tangent stiffness.
00076      const Matrix &getTangent (void);
00077      const Matrix &getInitialTangent (void);
00078 
00079      void getBackbone (Matrix &);
00080 
00081      // Calculates the corresponding stress increment (rate), for a given strain increment.
00082      const Vector &getStress (void);
00083      const Vector &getStrain (void);
00084      const Vector &getCommittedStress (void);
00085      const Vector &getCommittedStrain (void);
00086 
00087      int setTrialStrain (const Tensor &v) {return 0;}
00088      int setTrialStrain (const Tensor &v, const Tensor &r) {return 0;}
00089      int setTrialStrainIncr (const Tensor &v) {return 0;}
00090      int setTrialStrainIncr (const Tensor &v, const Tensor &r) {return 0;}
00091 
00092      // Accepts the current trial strain values as being on the solution path, and updates
00093      // all model parameters related to stress/strain states. Return 0 on success.
00094      int commitState (void);
00095 
00096      // Revert the stress/strain states to the last committed states. Return 0 on success.
00097      int revertToLastCommit (void);
00098 
00099      int revertToStart(void) {return 0;}
00100 
00101      // Return an exact copy of itself.
00102      NDMaterial *getCopy (void);
00103 
00104      // Return a copy of itself if "code"="PressureDependMultiYield02", otherwise return null.
00105      NDMaterial *getCopy (const char *code);
00106 
00107      // Return the string "PressureDependMultiYield02".
00108      const char *getType (void) const ;
00109 
00110      // Return ndm.
00111      int getOrder (void) const ;
00112 
00113      int sendSelf(int commitTag, Channel &theChannel);
00114      int recvSelf(int commitTag, Channel &theChannel,
00115                   FEM_ObjectBroker &theBroker);
00116      Response *setResponse (const char **argv, int argc, Information &matInfo, OPS_Stream &s);
00117      int getResponse (int responseID, Information &matInformation);
00118      void Print(OPS_Stream &s, int flag =0);
00119      //void setCurrentStress(const Vector stress) { currentStress=T2Vector(stress); }
00120      int updateParameter(int responseID, Information &eleInformation);
00121 
00122 
00123     // RWB; PyLiq1 & TzLiq1 need to see the excess pore pressure and initial stresses.
00124     friend class PyLiq1;
00125     friend class TzLiq1;
00126 
00127 protected:
00128 
00129 private:
00130   // user supplied
00131          static int matCount;
00132      static int* ndmx;  //num of dimensions (2 or 3)
00133      static int* loadStagex;  //=0 if elastic; =1 or 2 if plastic
00134      static double* rhox;  //mass density
00135      static double* refShearModulusx;
00136      static double* refBulkModulusx;
00137      static double* frictionAnglex;
00138      static double* peakShearStrainx;
00139      static double* refPressurex;
00140      static double* cohesionx;
00141      static double* pressDependCoeffx;
00142      static int*    numOfSurfacesx;
00143      static double* phaseTransfAnglex;
00144      static double* contractParam1x;
00145      static double* contractParam2x;
00146      static double* contractParam3x;
00147      static double* dilateParam1x;
00148      static double* dilateParam2x;
00149      static double* liquefyParam1x;
00150      static double* liquefyParam2x;
00151      static double* dilateParam3x;
00152      static double* einitx;    //initial void ratio
00153      static double* volLimit1x;
00154      static double* volLimit2x;
00155      static double* volLimit3x;
00156      static double pAtm;
00157          static double* Hvx;
00158          static double* Pvx;
00159 
00160      // internal
00161      static double* residualPressx;
00162      static double* stressRatioPTx;
00163      static Matrix theTangent;
00164 
00165          int matN;
00166      int e2p;
00167      MultiYieldSurface * theSurfaces; // NOTE: surfaces[0] is not used
00168      MultiYieldSurface * committedSurfaces;
00169      int    activeSurfaceNum;
00170      int    committedActiveSurf;
00171      double modulusFactor;
00172          double initPress;
00173          double damage;
00174          double check;
00175      T2Vector currentStress;
00176      T2Vector trialStress;
00177      T2Vector updatedTrialStress;
00178      T2Vector currentStrain;
00179      T2Vector strainRate;
00180      static T2Vector subStrainRate;
00181 
00182      double pressureD;
00183      int onPPZ; //=-1 never reach PPZ before; =0 below PPZ; =1 on PPZ; =2 above PPZ
00184      double strainPTOcta;
00185      double PPZSize;
00186      double cumuDilateStrainOcta;
00187      double maxCumuDilateStrainOcta;
00188      double cumuTranslateStrainOcta;
00189      double prePPZStrainOcta;
00190      double oppoPrePPZStrainOcta;
00191      static T2Vector trialStrain;
00192      T2Vector PPZPivot;
00193      T2Vector PPZCenter;
00194          Vector PivotStrainRate;
00195 
00196      double pressureDCommitted;
00197      int onPPZCommitted;
00198      double PPZSizeCommitted;
00199      double cumuDilateStrainOctaCommitted;
00200      double maxCumuDilateStrainOctaCommitted;
00201      double cumuTranslateStrainOctaCommitted;
00202      double prePPZStrainOctaCommitted;
00203      double oppoPrePPZStrainOctaCommitted;
00204      T2Vector PPZPivotCommitted;
00205      T2Vector PPZCenterCommitted;
00206          Vector PivotStrainRateCommitted;
00207      static Vector workV6;
00208      static T2Vector workT2V;
00209          double maxPress;
00210 
00211      void elast2Plast(void);
00212      // Called by constructor
00213      void setUpSurfaces(double *);
00214      double yieldFunc(const T2Vector & stress, const MultiYieldSurface * surfaces,
00215                       int surface_num);
00216      void deviatorScaling(T2Vector & stress, const MultiYieldSurface * surfaces,
00217                           int surfaceNum);
00218      void initSurfaceUpdate(void);
00219      void initStrainUpdate(void);
00220 
00221      // Return num_strain_subincre
00222      int setSubStrainRate(void);
00223      int isLoadReversal(const T2Vector &);
00224      int isCriticalState(const T2Vector & stress);
00225      void getContactStress(T2Vector &contactStress);
00226      void getSurfaceNormal(const T2Vector & stress, T2Vector &normal);
00227      double getModulusFactor(T2Vector & stress);
00228      void updatePPZ(const T2Vector & stress);
00229      void PPZTranslation(const T2Vector & contactStress);
00230      double getPPZLimits(int which, const T2Vector & contactStress);
00231      double getPlasticPotential(const T2Vector & stress, const T2Vector & surfaceNormal);
00232      void setTrialStress(T2Vector & stress);
00233      double getLoadingFunc(const T2Vector & contact, const T2Vector & surfaceNormal,
00234                            double * plasticPotential,int crossedSurface);
00235      //return 1 if stress locked; o/w return 0.
00236      int stressCorrection(int crossedSurface);
00237      void updateActiveSurface(void);
00238      void updateInnerSurface(void);
00239 
00240      // Return 1 if crossing the active surface; return 0 o/w
00241      int  isCrossingNextSurface(void);
00242 };
00243 
00244 #endif
00245 

Generated on Mon Oct 23 15:05:16 2006 for OpenSees by doxygen 1.5.0