ElasticIsotropic3D.cpp

Go to the documentation of this file.
00001 //===============================================================================
00002 //# COPYRIGHT (C): Woody's license (by BJ):
00003 //                 ``This    source  code is Copyrighted in
00004 //                 U.S.,  for  an  indefinite  period,  and anybody
00005 //                 caught  using it without our permission, will be
00006 //                 mighty good friends of ourn, cause we don't give
00007 //                 a  darn.  Hack it. Compile it. Debug it. Run it.
00008 //                 Yodel  it.  Enjoy it. We wrote it, that's all we
00009 //                 wanted to do.''
00010 //
00011 //# PROJECT:           Object Oriented Finite Element Program
00012 //# PURPOSE:           Elastic Isotropic Material implementation:
00013 //# CLASS:             ElasticIsotropic3D
00014 //#
00015 //# VERSION:           0.61803398874989 (golden section)
00016 //# LANGUAGE:          C++
00017 //# TARGET OS:         all...
00018 //# DESIGN:            Zhaohui Yang, Boris Jeremic (jeremic@ucdavis.edu)
00019 //# PROGRAMMER(S):     Zhaohui Yang, Boris Jeremic
00020 //#
00021 //#
00022 //# DATE:              10Oct2000
00023 //# UPDATE HISTORY:    22Nov2002 small fixes 
00024 //#                    Aug2006   Z.Cheng
00025 //#
00026 //===============================================================================
00027                                                                         
00028 #include <ElasticIsotropic3D.h>
00029 
00030 
00031 Matrix ElasticIsotropic3D::D(6,6);        // global for ElasticIsotropic3D only
00032 Vector ElasticIsotropic3D::sigma(6);     // global for ElasticIsotropic3D onyl
00033 
00034 Tensor ElasticIsotropic3D::Dt(4, def_dim_4, 0.0);
00035 stresstensor ElasticIsotropic3D::Stress;
00036 
00037 ElasticIsotropic3D::ElasticIsotropic3D
00038 (int tag, double E, double nu, double rho):
00039  ElasticIsotropicMaterial (tag, ND_TAG_ElasticIsotropic3D, E, nu, rho),
00040  epsilon(6) 
00041 {
00042         // Set up the elastic constant matrix for 3D elastic isotropic 
00043         D.Zero();
00044 }
00045 
00046 ElasticIsotropic3D::ElasticIsotropic3D():
00047  ElasticIsotropicMaterial (0, ND_TAG_ElasticIsotropic3D, 0.0, 0.0, 0.0),
00048  epsilon(6)
00049 {
00050 
00051 }
00052 
00053 ElasticIsotropic3D::~ElasticIsotropic3D ()
00054 {
00055 
00056 }
00057 
00058 int
00059 ElasticIsotropic3D::setTrialStrain (const Vector &v)
00060 {
00061         epsilon = v;
00062 
00063         return 0;
00064 }
00065 
00066 int
00067 ElasticIsotropic3D::setTrialStrain (const Vector &v, const Vector &r)
00068 {
00069         epsilon = v;
00070 
00071         return 0;
00072 }
00073 
00074 int
00075 ElasticIsotropic3D::setTrialStrainIncr (const Vector &v)
00076 {
00077         epsilon += v;
00078 
00079         return 0;
00080 }
00081 
00082 int
00083 ElasticIsotropic3D::setTrialStrainIncr (const Vector &v, const Vector &r)
00084 {
00085         epsilon += v;
00086 
00087         return 0;
00088 }
00089 
00090 const Matrix&
00091 ElasticIsotropic3D::getTangent (void)
00092 {
00093    double mu2 = E/(1.0+v);
00094    double lam = v*mu2/(1.0-2.0*v);
00095    double mu  = 0.50*mu2;
00096 
00097    mu2 += lam;
00098 
00099    D(0,0) = D(1,1) = D(2,2) = mu2;
00100    D(0,1) = D(1,0) = lam;
00101    D(0,2) = D(2,0) = lam;
00102    D(1,2) = D(2,1) = lam;
00103    D(3,3) = mu;
00104    D(4,4) = mu;
00105    D(5,5) = mu;
00106 
00107    return D;
00108 }
00109 
00110 const Vector&
00111 ElasticIsotropic3D::getStress (void)
00112 {
00113        double mu2 = E/(1.0+v);
00114        double lam = v*mu2/(1.0-2.0*v);
00115        double mu  = 0.50*mu2;
00116 
00117        mu2 += lam;
00118        
00119        double eps0 = epsilon(0);
00120        double eps1 = epsilon(1);
00121        double eps2 = epsilon(2);
00122 
00123        sigma(0) = mu2*eps0 + lam*(eps1+eps2);
00124        sigma(1) = mu2*eps1 + lam*(eps2+eps0);
00125        sigma(2) = mu2*eps2 + lam*(eps0+eps1);
00126 
00127        sigma(3) = mu*epsilon(3);
00128        sigma(4) = mu*epsilon(4);
00129        sigma(5) = mu*epsilon(5);
00130 
00131         return sigma;
00132 }
00133 
00134 const Vector&
00135 ElasticIsotropic3D::getStrain (void)
00136 {
00137   return epsilon;
00138 }
00139 
00140 int
00141 ElasticIsotropic3D::setTrialStrain (const Tensor &v)
00142 {
00143     Strain = v;
00144     return 0;
00145 }
00146 
00147 int
00148 ElasticIsotropic3D::setTrialStrain (const Tensor &v, const Tensor &r)
00149 {
00150     Strain = v;
00151     return 0;
00152 }
00153 
00154 int
00155 ElasticIsotropic3D::setTrialStrainIncr (const Tensor &v)
00156 {
00157     //opserr << " before set Tri St Incr " << Strain;
00158     //opserr << " Strain Incr " << v << endlnn;
00159     Strain = Strain + v;
00160     //opserr << " after setTrialStrainIncr  " << Strain << endlnn;
00161     return 0;
00162 }
00163 
00164 int
00165 ElasticIsotropic3D::setTrialStrainIncr (const Tensor &v, const Tensor &r)
00166 {
00167     Strain = Strain + v;
00168     return 0;
00169 }
00170 
00171 const Tensor&
00172 ElasticIsotropic3D::getTangentTensor (void)
00173 {
00174   setInitElasticStiffness();  
00175   return Dt;
00176 }
00177 
00178 const stresstensor&
00179 ElasticIsotropic3D::getStressTensor (void)
00180 {
00181   setInitElasticStiffness();
00182   Stress = Dt("ijkl") * Strain("kl");
00183   return Stress;
00184 }
00185 
00186 const straintensor&
00187 ElasticIsotropic3D::getStrainTensor (void)
00188 {
00189     return Strain;
00190 }
00191 
00192 int
00193 ElasticIsotropic3D::commitState (void)
00194 {
00195     return 0;
00196 }
00197 
00198 int
00199 ElasticIsotropic3D::revertToLastCommit (void)
00200 {
00201         return 0;
00202 }
00203 
00204 int
00205 ElasticIsotropic3D::revertToStart (void)
00206 {
00207         return 0;
00208 }
00209 
00210 NDMaterial*
00211 ElasticIsotropic3D::getCopy (void)
00212 {
00213         ElasticIsotropic3D *theCopy =
00214                 new ElasticIsotropic3D (this->getTag(), E, v, rho);
00215         theCopy->epsilon = this->epsilon;
00216         theCopy->Strain = this->Strain;
00217 
00218         return theCopy;
00219 }
00220 
00221 const char*
00222 ElasticIsotropic3D::getType (void) const
00223 {
00224         return "ThreeDimensional";
00225 }
00226 
00227 int
00228 ElasticIsotropic3D::getOrder (void) const
00229 {
00230         return 6;
00231 }
00232 
00233 void
00234 ElasticIsotropic3D::Print(OPS_Stream &s, int flag)
00235 {
00236         s << "ElasticIsotropic3D" << endln;
00237         s << "\ttag: " << this->getTag() << endln;
00238         s << "\tE: " << E << endln;
00239         s << "\tv: " << v << endln;
00240         s << "\trho: " << rho << endln;
00241 }
00242 
00243 
00244 //================================================================================
00245 void ElasticIsotropic3D::setInitElasticStiffness(void)
00246 {                                              
00247     // Kronecker delta tensor
00248     tensor I2("I", 2, def_dim_2);
00249 
00250     tensor I_ijkl = I2("ij")*I2("kl");
00251 
00252     //I_ijkl.null_indices();
00253     tensor I_ikjl = I_ijkl.transpose0110();
00254     tensor I_iljk = I_ijkl.transpose0111();
00255     tensor I4s = (I_ikjl+I_iljk)*0.5;
00256     
00257     // Building elasticity tensor
00258     Dt = I_ijkl*( E*v / ( (1.0+v)*(1.0 - 2.0*v) ) ) + I4s*( E / (1.0 + v) );
00259 
00260     return;
00261 
00262 }
00263 
00264 

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