00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
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
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
00055 PressureDependMultiYield ();
00056
00057
00058 PressureDependMultiYield (const PressureDependMultiYield &);
00059
00060
00061 virtual ~PressureDependMultiYield ();
00062
00063 const char *getClassType(void) const {return "PressureDependMultiYield";};
00064 double getRho(void) {return rhox[matN];} ;
00065
00066
00067 int setTrialStrain (const Vector &strain);
00068
00069
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
00076 const Matrix &getTangent (void);
00077 const Matrix &getInitialTangent (void);
00078
00079 void getBackbone (Matrix &);
00080
00081
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
00093
00094 int commitState (void);
00095
00096
00097 int revertToLastCommit (void);
00098
00099 int revertToStart(void) {return 0;}
00100
00101
00102 NDMaterial *getCopy (void);
00103
00104
00105 NDMaterial *getCopy (const char *code);
00106
00107
00108 const char *getType (void) const ;
00109
00110
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
00120 int updateParameter(int responseID, Information &eleInformation);
00121
00122 protected:
00123
00124 private:
00125
00126 static int matCount;
00127 static int* ndmx;
00128 static int* loadStagex;
00129 static double* rhox;
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;
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
00154 static double* residualPressx;
00155 static double* stressRatioPTx;
00156 static Matrix theTangent;
00157
00158 int matN;
00159 int e2p;
00160 MultiYieldSurface * theSurfaces;
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;
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
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
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
00228 int stressCorrection(int crossedSurface);
00229 void updateActiveSurface(void);
00230 void updateInnerSurface(void);
00231
00232
00233 int isCrossingNextSurface(void);
00234 };
00235
00236 #endif