RMC01_YS.cppGo to the documentation of this file.00001 //================================================================================ 00002 //# COPY LEFT and RIGHT: # 00003 //# Commercial use of this program without express permission of the # 00004 //# University of California, is strictly encouraged. Copyright and Copyleft # 00005 //# are covered by the following clause: # 00006 //# # 00007 //# Woody's license: # 00008 //# ``This source code is Copyrighted in U.S., by the The Regents of the # 00009 //# University of California, for an indefinite period, and anybody caught # 00010 //# using it without our permission, will be mighty good friends of ourn, # 00011 //# cause we don't give a darn. Hack it. Compile it. Debug it. Run it. Yodel # 00012 //# it. Enjoy it. We wrote it, that's all we wanted to do.'' bj # 00013 //# # 00014 //# # 00015 //# # 00016 //# PROJECT: Object Oriented Finite Element Program # 00017 //# PURPOSE: Rounded Mohr Coulomb Potential Surface # 00018 //# CLASS: RMC01YieldSurface # 00019 //# # 00020 //# VERSION: # 00021 //# LANGUAGE: C++ # 00022 //# TARGET OS: DOS || UNIX || . . . # 00023 //# DESIGNER(S): Boris Jeremic jeremic@ucdavis.edu # 00024 //# Zhao Cheng, # 00025 //# PROGRAMMER(S): Zhao Cheng, Boris Jeremic # 00026 //# # 00027 //# # 00028 //# DATE: 12 Feb. 2003 # 00029 //# UPDATE HISTORY: Feb 25th 2003 00030 //# # 00031 //# Short Explanation: # 00032 //# Willam & Warnke (1974) deviatoric shape # 00033 //# # 00034 //# # 00035 //================================================================================ 00036 // 00037 00038 #ifndef RMC01_YS_CPP 00039 #define RMC01_YS_CPP 00040 00041 #include "RMC01_YS.h" 00042 #include "RMC01.h" 00043 00044 //================================================================================ 00045 //create a clone of itself 00046 //================================================================================ 00047 00048 YieldSurface * RMC01YieldSurface::newObj() 00049 { 00050 YieldSurface *new_YS = new RMC01YieldSurface(); 00051 return new_YS; 00052 } 00053 00054 //================================================================================ 00055 // Yield criterion evaluation function F(EPState) 00056 //================================================================================ 00057 00058 double RMC01YieldSurface::f(const EPState *EPS) const 00059 { 00060 double p = EPS->getStress().p_hydrostatic(); // 00061 double q = EPS->getStress().q_deviatoric(); // q 00062 double theta = EPS->getStress().theta(); // theta 00063 // double temp_phi = EPS->getScalarVar(1)*3.14159265358979/180.0; // frictional angle 00064 // double temp_cohesive = EPS->getScalarVar(2); // cohesion 00065 // double a1 = -6*sin(temp_phi)/(3.0-sin(temp_phi)); 00066 // double a2 = -6*temp_cohesive*cos(temp_phi)/(3.0-sin(temp_phi)); 00067 double alfa = EPS->getScalarVar(1); // Take alfa & k as internal variables 00068 double k = EPS->getScalarVar(2); // instead of phi & conhesive 00069 double a1 = (3.0*1.7320508076*alfa) / (2.0+1.7320508076*alfa); 00070 double e = (3.0-a1)/(3.0+a1); // ratio of tensile radius to compressive radius 00071 double Frou = g_0(theta, e); 00072 //double f = a1*p+q*Frou+a2; // yield fuction 00073 double f = alfa*p*(-3.0) + Frou*q/1.7320508076 - k; // new form 00074 return f; 00075 } 00076 00077 //================================================================================ 00078 // tensor dF/dsigma_ij 00079 //================================================================================ 00080 00081 tensor RMC01YieldSurface::dFods(const EPState *EPS) const 00082 { 00083 00084 tensor dFoverds( 2, def_dim_2, 0.0); 00085 00086 // double p = EPS->getStress().p_hydrostatic(); 00087 double q = EPS->getStress().q_deviatoric(); 00088 double theta = EPS->getStress().theta(); 00089 // double temp_phi = EPS->getScalarVar(1)*3.14159265358979/180.0; 00090 // double temp_cohesive = EPS->getScalarVar(2); 00091 tensor DpoDs = EPS->getStress().dpoverds(); // dp/ds 00092 tensor DqoDs = EPS->getStress().dqoverds(); // dq/ds 00093 tensor DthetaoDs = EPS->getStress().dthetaoverds(); // d(theta)/ds 00094 // double a1 = -6*sin(temp_phi)/(3.0-sin(temp_phi)); 00095 // double a2 = -6*temp_cohesive*cos(temp_phi)/(3.0-sin(temp_phi)); 00096 double alfa = EPS->getScalarVar(1); 00097 // double k = EPS->getScalarVar(2); 00098 double a1 = (3.0*1.7320508076*alfa) / (2.0+1.7320508076*alfa); 00099 double e = (3.0-a1)/(3.0+a1); 00100 double Frou = g_0(theta, e); 00101 double Frou_prime = g_prime(theta, e); 00102 double dFoverdp = alfa*(-3.0); 00103 // double dFoverdq = Frou; 00104 // double dFoverdtheta = q*Frou_prime; 00105 double dFoverdq = Frou/1.7320508076; 00106 double dFoverdtheta = q*Frou_prime/1.7320508076; 00107 00108 dFoverds = DpoDs * dFoverdp + 00109 DqoDs * dFoverdq + 00110 DthetaoDs * dFoverdtheta; // dF/ds 00111 00112 return dFoverds; 00113 00114 } 00115 00116 00117 00118 //================================================================================ 00119 // double xi_s1 = dF/dS1 = dF/dalfa1 = I1 Derivative in terms of first scalar var 00120 //================================================================================ 00121 00122 double RMC01YieldSurface::xi_s1( const EPState *EPS ) const 00123 { 00124 double p = EPS->getStress().p_hydrostatic(); 00125 // double q = EPS->getStress().q_deviatoric(); 00126 // double theta = EPS->getStress().theta(); 00127 // double temp_phi = EPS->getScalarVar(1)*3.14159265358979/180.0; 00128 // double temp_cohesive = EPS->getScalarVar(2); 00129 // double e = (3.0-a1)/(3.0+a1); 00130 // double Frou = g_0(theta, e); 00131 // double temp1 = 3.0 - sin(temp_phi); 00132 // double temp2 = temp1 * temp1; 00133 // double temp3 = -18.0 * cos(temp_phi) / temp2; 00134 // double temp4 = -6.0 * temp_cohesive * (1.0 -3.0 * sin(temp_phi)) / temp2; 00135 // double temp = (temp3 * p + temp4)*3.14159265358979/180.0; 00136 // return temp; 00137 return p*(-3.0); 00138 } 00139 00140 //================================================================================ 00141 // double xi_s2 = dF/dS2 = dF/k = -1.0 Derivative in terms of second scalar var 00142 //================================================================================ 00143 00144 double RMC01YieldSurface::xi_s2( const EPState *EPS ) const 00145 { 00146 // double p = EPS->getStress().p_hydrostatic(); 00147 // double q = EPS->getStress().q_deviatoric(); 00148 // double theta = EPS->getStress().theta(); 00149 // double temp_phi = EPS->getScalarVar(1)*3.14159265358979/180.0; 00150 // double temp_cohesive = EPS->getScalarVar(2); 00151 // double e = (3.0-a1)/(3.0+a1); 00152 // double Frou = g_0(theta, e); 00153 // double temp1 = 3.0 - sin(temp_phi); 00154 // double temp2 = cos(temp_phi); 00155 // double temp3 = -6 * temp2 / temp1; 00156 // double temp = temp3; 00157 // return temp; 00158 return -1.0; 00159 } 00160 00161 00162 //================================================================================ 00163 // double xi_t1 = dF/dt1 Derivative in terms of first tensorial var 00164 //================================================================================ 00165 00166 //tensor RMC01YieldSurface::xi_t1( ) const 00167 //{ 00168 00169 00170 //} 00171 00172 //================================================================================ 00173 OPS_Stream& operator<< (OPS_Stream& os, const RMC01YieldSurface & YS) 00174 { 00175 os << "Rounded Mohr Coulomb Surface Parameters: " << endln; 00176 return os; 00177 } 00178 00179 #endif 00180 |