00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef PressureIndependMultiYield_h
00013 #define PressureIndependMultiYield_h
00014
00015 #include <NDMaterial.h>
00016 #include <MultiYieldSurface.h>
00017 #include <Matrix.h>
00018 #include <Tensor.h>
00019
00020 class PressureIndependMultiYield : public NDMaterial
00021 {
00022 public:
00023
00024 PressureIndependMultiYield (int tag,
00025 int nd,
00026 double rho,
00027 double refShearModul,
00028 double refBulkModul,
00029 double cohesi,
00030 double peakShearStra,
00031 double frictionAng = 0.,
00032 double refPress = 100,
00033 double pressDependCoe = 0.0,
00034 int numberOfYieldSurf = 20,
00035 double * gredu = 0);
00036
00037
00038 PressureIndependMultiYield ();
00039
00040
00041 PressureIndependMultiYield (const PressureIndependMultiYield &);
00042
00043
00044 virtual ~PressureIndependMultiYield ();
00045
00046 const char *getClassType(void) const {return "PressureIndependMultiYield";};
00047
00048 double getRho(void) {return rhox[matN];} ;
00049
00050 int setTrialStrain (const Vector &strain);
00051
00052
00053 int setTrialStrain(const Vector &v, const Vector &r);
00054
00055 int setTrialStrainIncr(const Vector &v);
00056 int setTrialStrainIncr(const Vector &v, const Vector &r);
00057
00058
00059 const Matrix &getTangent (void);
00060 const Matrix &getInitialTangent (void);
00061
00062 void getBackbone (Matrix &);
00063
00064
00065 const Vector &getStress (void);
00066 const Vector &getStrain (void);
00067 const Vector &getCommittedStress (void);
00068 const Vector &getCommittedStrain (void);
00069
00070 int setTrialStrain (const Tensor &v) {return 0;}
00071 int setTrialStrain (const Tensor &v, const Tensor &r) {return 0;}
00072 int setTrialStrainIncr (const Tensor &v) {return 0;}
00073 int setTrialStrainIncr (const Tensor &v, const Tensor &r) {return 0;}
00074
00075
00076
00077 int commitState (void);
00078
00079
00080 int revertToLastCommit (void);
00081
00082 int revertToStart(void) {return 0;}
00083
00084
00085 NDMaterial *getCopy (void);
00086
00087
00088 NDMaterial *getCopy (const char *code);
00089
00090
00091 const char *getType (void) const ;
00092
00093
00094 int getOrder (void) const ;
00095
00096 int sendSelf(int commitTag, Channel &theChannel);
00097 int recvSelf(int commitTag, Channel &theChannel,
00098 FEM_ObjectBroker &theBroker);
00099
00100 Response *setResponse (const char **argv, int argc, Information &matInfo, OPS_Stream &s);
00101 int getResponse (int responseID, Information &matInformation);
00102 void Print(OPS_Stream &s, int flag =0);
00103
00104
00105 int updateParameter(int responseID, Information &eleInformation);
00106
00107
00108 friend class PyLiq1;
00109 friend class TzLiq1;
00110
00111 protected:
00112
00113 private:
00114
00115 static int matCount;
00116 static int* loadStagex;
00117
00118
00119 static int* ndmx;
00120 static double* rhox;
00121 static double* frictionAnglex;
00122 static double* peakShearStrainx;
00123 static double* refPressurex;
00124 static double* cohesionx;
00125 static double* pressDependCoeffx;
00126 static int* numOfSurfacesx;
00127
00128
00129 static double* residualPressx;
00130 static Matrix theTangent;
00131 int e2p;
00132 int matN;
00133 double refShearModulus;
00134 double refBulkModulus;
00135 MultiYieldSurface * theSurfaces;
00136 MultiYieldSurface * committedSurfaces;
00137 int activeSurfaceNum;
00138 int committedActiveSurf;
00139 T2Vector currentStress;
00140 T2Vector trialStress;
00141 T2Vector currentStrain;
00142 T2Vector strainRate;
00143 static T2Vector subStrainRate;
00144
00145 void elast2Plast(void);
00146
00147 void setUpSurfaces(double *);
00148
00149 double yieldFunc(const T2Vector & stress, const MultiYieldSurface * surfaces,
00150 int surface_num);
00151
00152 void deviatorScaling(T2Vector & stress, const MultiYieldSurface * surfaces,
00153 int surfaceNum, int count=0);
00154
00155 void initSurfaceUpdate(void);
00156
00157 void paramScaling(void);
00158
00159
00160 int setSubStrainRate(void);
00161
00162 int isLoadReversal(void);
00163
00164 void getContactStress(T2Vector &contactStress);
00165
00166 void getSurfaceNormal(const T2Vector & stress, Vector &surfaceNormal);
00167
00168 void setTrialStress(T2Vector & stress);
00169
00170 double getLoadingFunc(const T2Vector & contact,
00171 const Vector & surfaceNormal,int crossedSurface);
00172
00173 void stressCorrection(int crossedSurface);
00174
00175 void updateActiveSurface(void);
00176
00177 void updateInnerSurface(void);
00178
00179
00180 int isCrossingNextSurface(void);
00181
00182 };
00183
00184 #endif
00185
00186
00187
00188
00189
00190
00191