RMC01_YS.cpp

Go 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 

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