00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
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
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
00056 PressureDependMultiYield02 ();
00057
00058
00059 PressureDependMultiYield02 (const PressureDependMultiYield02 &);
00060
00061
00062 virtual ~PressureDependMultiYield02 ();
00063
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
00123
00124 friend class PyLiq1;
00125 friend class TzLiq1;
00126
00127 protected:
00128
00129 private:
00130
00131 static int matCount;
00132 static int* ndmx;
00133 static int* loadStagex;
00134 static double* rhox;
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;
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
00161 static double* residualPressx;
00162 static double* stressRatioPTx;
00163 static Matrix theTangent;
00164
00165 int matN;
00166 int e2p;
00167 MultiYieldSurface * theSurfaces;
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;
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
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
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
00236 int stressCorrection(int crossedSurface);
00237 void updateActiveSurface(void);
00238 void updateInnerSurface(void);
00239
00240
00241 int isCrossingNextSurface(void);
00242 };
00243
00244 #endif
00245