00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include <ElasticIsotropic3D.h>
00029
00030
00031 Matrix ElasticIsotropic3D::D(6,6);
00032 Vector ElasticIsotropic3D::sigma(6);
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
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
00158
00159 Strain = Strain + v;
00160
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
00248 tensor I2("I", 2, def_dim_2);
00249
00250 tensor I_ijkl = I2("ij")*I2("kl");
00251
00252
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
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