PressureDependMultiYield.h

Go to the documentation of this file.
00001 // $Revision: 1.20 $
00002 // $Date: 2006/08/04 18:29:48 $
00003 //>>>>>>> 1.7
00004 
00005 // $Source: /usr/local/cvs/OpenSees/SRC/material/nD/soil/PressureDependMultiYield.h,v $
00006 // Written: ZHY
00007 // Created: August 2000
00008 
00009 
00010 // Description: This file contains the class prototype for PressureDependMultiYield.
00011 //
00012 // What: "@(#) PressureDependMultiYield.h, revA"
00013 
00014 #ifndef PressureDependMultiYield_h
00015 #define PressureDependMultiYield_h
00016 
00017 #include <NDMaterial.h>
00018 #include <MultiYieldSurface.h>
00019 #include <Matrix.h>
00020 #include <Tensor.h>
00021 #include <stresst.h>
00022 
00023 class PressureDependMultiYield : public NDMaterial
00024 {
00025 public:
00026      // Initialization constructor
00027      PressureDependMultiYield (int tag, 
00028                                int nd,
00029                                                  double rho,
00030                                double refShearModul,
00031                                double refBulkModul,
00032                                double frictionAng,
00033                                double peakShearStra,
00034                                double refPress,
00035                                double pressDependCoe,
00036                                double phaseTransformAngle, 
00037                                double contractionParam1,
00038                                double dilationParam1,
00039                                double dilationParam2,
00040                                double liquefactionParam1,
00041                                double liquefactionParam2,
00042                                double liquefactionParam4,
00043                                int   numberOfYieldSurf = 20,
00044                                    double * gredu = 0,
00045                            double e = 0.6,
00046                                double volLimit1 = 0.9,
00047                                double volLimit2 = 0.02,
00048                                double volLimit3 = 0.7,
00049                                double atm = 101.,
00050                                    double cohesi = 0.1,
00051                                    double hv = 0.,
00052                                    double pv = 1.);
00053 
00054      // Default constructor
00055      PressureDependMultiYield ();
00056 
00057      // Copy constructor
00058      PressureDependMultiYield (const PressureDependMultiYield &);
00059 
00060      // Destructor: clean up memory storage space.
00061      virtual ~PressureDependMultiYield ();
00062 
00063      const char *getClassType(void) const {return "PressureDependMultiYield";};     
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"="PressureDependMultiYield", otherwise return null.
00105      NDMaterial *getCopy (const char *code);
00106 
00107      // Return the string "PressureDependMultiYield".
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     // RWB; PyLiq1 & TzLiq1 need to see the excess pore pressure and initial stresses.    friend class PyLiq1;    friend class TzLiq1;
00122 protected:
00123 
00124 private:
00125   // user supplied 
00126          static int matCount;
00127      static int* ndmx;  //num of dimensions (2 or 3)
00128      static int* loadStagex;  //=0 if elastic; =1 or 2 if plastic
00129      static double* rhox;  //mass density
00130      static double* refShearModulusx;
00131      static double* refBulkModulusx;
00132      static double* frictionAnglex;
00133      static double* peakShearStrainx;
00134      static double* refPressurex;
00135      static double* cohesionx;
00136      static double* pressDependCoeffx;
00137      static int*    numOfSurfacesx;
00138      static double* phaseTransfAnglex; 
00139      static double* contractParam1x;
00140      static double* dilateParam1x;
00141      static double* dilateParam2x;
00142      static double* liquefyParam1x;
00143      static double* liquefyParam2x;
00144      static double* liquefyParam4x;
00145      static double* einitx;    //initial void ratio
00146      static double* volLimit1x;
00147      static double* volLimit2x;
00148      static double* volLimit3x;
00149      static double pAtm;
00150          static double* Hvx;
00151          static double* Pvx;
00152 
00153      // internal
00154      static double* residualPressx;
00155      static double* stressRatioPTx;
00156      static Matrix theTangent;
00157      
00158          int matN;
00159      int e2p;
00160      MultiYieldSurface * theSurfaces; // NOTE: surfaces[0] is not used  
00161      MultiYieldSurface * committedSurfaces;  
00162      int    activeSurfaceNum;  
00163      int    committedActiveSurf;
00164      double modulusFactor;
00165          double initPress;
00166      T2Vector currentStress;
00167      T2Vector trialStress;
00168      T2Vector currentStrain;
00169      T2Vector strainRate;
00170      static T2Vector subStrainRate;
00171 
00172      double pressureD;
00173      T2Vector reversalStress;
00174      int onPPZ; //=-1 never reach PPZ before; =0 below PPZ; =1 on PPZ; =2 above PPZ
00175      double strainPTOcta;
00176      double PPZSize;
00177      double cumuDilateStrainOcta;
00178      double maxCumuDilateStrainOcta;
00179      double cumuTranslateStrainOcta;
00180      double prePPZStrainOcta;
00181      double oppoPrePPZStrainOcta;
00182      static T2Vector trialStrain;
00183      T2Vector PPZPivot;
00184      T2Vector PPZCenter;
00185      T2Vector lockStress;
00186 
00187      double pressureDCommitted;
00188      T2Vector reversalStressCommitted;
00189      int onPPZCommitted;
00190      double PPZSizeCommitted;
00191      double cumuDilateStrainOctaCommitted;
00192      double maxCumuDilateStrainOctaCommitted;
00193      double cumuTranslateStrainOctaCommitted;
00194      double prePPZStrainOctaCommitted;
00195      double oppoPrePPZStrainOctaCommitted;
00196      T2Vector PPZPivotCommitted;
00197      T2Vector PPZCenterCommitted;
00198      T2Vector lockStressCommitted;
00199      static Vector workV6;
00200      static T2Vector workT2V;
00201          double maxPress;
00202      
00203      void elast2Plast(void);
00204      // Called by constructor
00205      void setUpSurfaces(double *);  
00206      double yieldFunc(const T2Vector & stress, const MultiYieldSurface * surfaces, 
00207                       int surface_num);
00208      void deviatorScaling(T2Vector & stress, const MultiYieldSurface * surfaces, 
00209                           int surfaceNum);
00210      void initSurfaceUpdate(void);
00211      void initStrainUpdate(void);
00212 
00213      // Return num_strain_subincre
00214      int setSubStrainRate(void);
00215      int isLoadReversal(const T2Vector &);
00216      int isCriticalState(const T2Vector & stress);
00217      void getContactStress(T2Vector &contactStress);
00218      void getSurfaceNormal(const T2Vector & stress, T2Vector &normal); 
00219      double getModulusFactor(T2Vector & stress);
00220      void updatePPZ(const T2Vector & stress);
00221      void PPZTranslation(const T2Vector & contactStress);
00222      double getPPZLimits(int which, const T2Vector & contactStress);
00223      double getPlasticPotential(const T2Vector & stress, const T2Vector & surfaceNormal);
00224      void setTrialStress(T2Vector & stress); 
00225      double getLoadingFunc(const T2Vector & contact, const T2Vector & surfaceNormal,
00226                            double plasticPotential,int crossedSurface);
00227      //return 1 if stress locked; o/w return 0.
00228      int stressCorrection(int crossedSurface);
00229      void updateActiveSurface(void);
00230      void updateInnerSurface(void);
00231 
00232      // Return 1 if crossing the active surface; return 0 o/w
00233      int  isCrossingNextSurface(void);  
00234 };
00235 
00236 #endif

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