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
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052 #include <J2PlaneStress.h>
00053 #include <Channel.h>
00054 #include <FEM_ObjectBroker.h>
00055
00056 Vector J2PlaneStress :: strain_vec(3) ;
00057 Vector J2PlaneStress :: stress_vec(3) ;
00058 Matrix J2PlaneStress :: tangent_matrix(3,3) ;
00059
00060
00061 J2PlaneStress :: J2PlaneStress( ) :
00062 J2Plasticity( )
00063 { }
00064
00065
00066
00067 J2PlaneStress ::
00068 J2PlaneStress( int tag,
00069 double K,
00070 double G,
00071 double yield0,
00072 double yield_infty,
00073 double d,
00074 double H,
00075 double viscosity ) :
00076 J2Plasticity(tag, ND_TAG_J2PlaneStress,
00077 K, G, yield0, yield_infty, d, H, viscosity )
00078 {
00079
00080 }
00081
00082
00083
00084 J2PlaneStress ::
00085 J2PlaneStress( int tag,
00086 double K,
00087 double G ) :
00088 J2Plasticity(tag, ND_TAG_J2PlaneStress, K, G )
00089 {
00090
00091 }
00092
00093
00094
00095 J2PlaneStress :: ~J2PlaneStress( )
00096 { }
00097
00098
00099
00100 NDMaterial* J2PlaneStress :: getCopy( )
00101 {
00102 J2PlaneStress *clone;
00103 clone = new J2PlaneStress( ) ;
00104 *clone = *this ;
00105 return clone ;
00106 }
00107
00108
00109
00110 const char* J2PlaneStress :: getType( ) const
00111 {
00112 return "PlaneStress" ;
00113 }
00114
00115
00116
00117 int J2PlaneStress :: getOrder( ) const
00118 {
00119 return 3 ;
00120 }
00121
00122
00123 int J2PlaneStress :: setTrialStrain( const Vector &strain_from_element )
00124 {
00125 const double tolerance = 1e-12 ;
00126
00127 const int max_iterations = 25 ;
00128 int iteration_counter = 0 ;
00129
00130 int i, j, k, l ;
00131 int ii, jj ;
00132
00133 double eps22 = strain(2,2) ;
00134 strain.Zero( ) ;
00135
00136 strain(0,0) = strain_from_element(0) ;
00137 strain(1,1) = strain_from_element(1) ;
00138 strain(0,1) = 0.50 * strain_from_element(2) ;
00139 strain(1,0) = strain(0,1) ;
00140
00141 strain(2,2) = eps22 ;
00142
00143
00144
00145 iteration_counter = 0 ;
00146 do {
00147
00148 this->plastic_integrator( ) ;
00149
00150 strain(2,2) -= stress(2,2) / tangent[2][2][2][2] ;
00151
00152 iteration_counter++ ;
00153 if ( iteration_counter > max_iterations ) {
00154 opserr << "More than " << max_iterations ;
00155 opserr << " iterations in setTrialStrain of J2PlaneStress \n" ;
00156 break ;
00157 }
00158
00159 } while ( fabs(stress(2,2)) > tolerance ) ;
00160
00161
00162 for ( ii = 0; ii < 3; ii++ ) {
00163 for ( jj = 0; jj < 3; jj++ ) {
00164
00165 index_map( ii, i, j ) ;
00166 index_map( jj, k, l ) ;
00167
00168 tangent[i][j][k][l] -= tangent[i][j][2][2]
00169 * tangent[2][2][k][l]
00170 / tangent[2][2][2][2] ;
00171
00172
00173 tangent [j][i][k][l] = tangent[i][j][k][l] ;
00174 tangent [i][j][l][k] = tangent[i][j][k][l] ;
00175 tangent [j][i][l][k] = tangent[i][j][k][l] ;
00176
00177 }
00178 }
00179
00180 return 0 ;
00181 }
00182
00183
00184
00185 int J2PlaneStress :: setTrialStrain( const Vector &v, const Vector &r )
00186 {
00187 return this->setTrialStrain( v ) ;
00188 }
00189
00190 int J2PlaneStress :: setTrialStrainIncr( const Vector &v )
00191 {
00192 static Vector newStrain(3);
00193 newStrain(0) = strain(0,0) + v(0);
00194 newStrain(1) = strain(1,1) + v(1);
00195 newStrain(2) = 2.0 * strain(0,1) + v(2);
00196
00197 return this->setTrialStrain(newStrain);
00198 }
00199
00200 int J2PlaneStress :: setTrialStrainIncr( const Vector &v, const Vector &r )
00201 {
00202 return this->setTrialStrainIncr(v);
00203 }
00204
00205
00206
00207 const Vector& J2PlaneStress :: getStrain( )
00208 {
00209 strain_vec(0) = strain(0,0) ;
00210 strain_vec(1) = strain(1,1) ;
00211 strain_vec(2) = 2.0 * strain(0,1) ;
00212
00213 return strain_vec ;
00214 }
00215
00216
00217
00218 const Vector& J2PlaneStress :: getStress( )
00219 {
00220 stress_vec(0) = stress(0,0) ;
00221 stress_vec(1) = stress(1,1) ;
00222 stress_vec(2) = stress(0,1) ;
00223
00224 return stress_vec ;
00225 }
00226
00227
00228 const Matrix& J2PlaneStress :: getTangent( )
00229 {
00230
00231
00232
00233
00234
00235
00236
00237
00238 tangent_matrix(0,0) = tangent [0][0] [0][0] ;
00239 tangent_matrix(1,1) = tangent [1][1] [1][1] ;
00240 tangent_matrix(2,2) = tangent [0][1] [0][1] ;
00241
00242 tangent_matrix(0,1) = tangent [0][0] [1][1] ;
00243 tangent_matrix(1,0) = tangent [1][1] [0][0] ;
00244
00245 tangent_matrix(0,2) = tangent [0][0] [0][1] ;
00246 tangent_matrix(2,0) = tangent [0][1] [0][0] ;
00247
00248 tangent_matrix(1,2) = tangent [1][1] [0][1] ;
00249 tangent_matrix(2,1) = tangent [0][1] [1][1] ;
00250
00251 return tangent_matrix ;
00252 }
00253
00254
00255
00256 const Matrix& J2PlaneStress :: getInitialTangent( )
00257 {
00258
00259
00260
00261
00262
00263
00264
00265
00266 this->doInitialTangent();
00267
00268 tangent_matrix(0,0) = initialTangent [0][0] [0][0] ;
00269 tangent_matrix(1,1) = initialTangent [1][1] [1][1] ;
00270 tangent_matrix(2,2) = initialTangent [0][1] [0][1] ;
00271
00272 tangent_matrix(0,1) = initialTangent [0][0] [1][1] ;
00273 tangent_matrix(1,0) = initialTangent [1][1] [0][0] ;
00274
00275 tangent_matrix(0,2) = initialTangent [0][0] [0][1] ;
00276 tangent_matrix(2,0) = initialTangent [0][1] [0][0] ;
00277
00278 tangent_matrix(1,2) = initialTangent [1][1] [0][1] ;
00279 tangent_matrix(2,1) = initialTangent [0][1] [1][1] ;
00280
00281 return tangent_matrix ;
00282 }
00283
00284
00285 int J2PlaneStress :: setTrialStrain(const Tensor &v)
00286 {
00287 return -1 ;
00288 }
00289
00290 int J2PlaneStress :: setTrialStrain(const Tensor &v, const Tensor &r)
00291 {
00292 return -1 ;
00293 }
00294
00295 int J2PlaneStress :: setTrialStrainIncr(const Tensor &v)
00296 {
00297 return -1 ;
00298 }
00299
00300 int J2PlaneStress :: setTrialStrainIncr(const Tensor &v, const Tensor &r)
00301 {
00302 return -1 ;
00303 }
00304
00305 const Tensor& J2PlaneStress :: getTangentTensor( )
00306 {
00307 return rank4 ;
00308 }
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320 int
00321 J2PlaneStress::commitState( )
00322 {
00323 epsilon_p_n = epsilon_p_nplus1 ;
00324 xi_n = xi_nplus1 ;
00325
00326 commitEps22 = strain(2,2);
00327
00328 return 0;
00329 }
00330
00331 int
00332 J2PlaneStress::revertToLastCommit( ) {
00333
00334 strain(2,2) = commitEps22;
00335
00336 return 0;
00337 }
00338
00339
00340 int
00341 J2PlaneStress::revertToStart( ) {
00342 commitEps22 = 0.0;
00343
00344 this->zero( ) ;
00345
00346 return 0;
00347 }
00348
00349 int
00350 J2PlaneStress::sendSelf(int commitTag, Channel &theChannel)
00351 {
00352
00353
00354 static Vector data(10+9);
00355 int cnt = 0;
00356 data(cnt++) = this->getTag();
00357 data(cnt++) = bulk;
00358 data(cnt++) = shear;
00359 data(cnt++) = sigma_0;
00360 data(cnt++) = sigma_infty;
00361 data(cnt++) = delta;
00362 data(cnt++) = Hard;
00363 data(cnt++) = eta;
00364 data(cnt++) = xi_n;
00365 data(cnt++) = commitEps22;
00366
00367 for (int i=0; i<3; i++)
00368 for (int j=0; j<3; j++)
00369 data(cnt++) = epsilon_p_n(i,j);
00370
00371
00372 if (theChannel.sendVector(this->getDbTag(), commitTag, data) < 0) {
00373 opserr << "J2PlaneStress::sendSelf - failed to send vector to channel\n";
00374 return -1;
00375 }
00376
00377 return 0;
00378 }
00379
00380 int
00381 J2PlaneStress::recvSelf (int commitTag, Channel &theChannel,
00382 FEM_ObjectBroker &theBroker)
00383 {
00384
00385
00386 static Vector data(10+9);
00387 if (theChannel.recvVector(this->getDbTag(), commitTag, data) < 0) {
00388 opserr << "J2PlaneStress::recvSelf - failed to recv vector from channel\n";
00389 return -1;
00390 }
00391
00392
00393 int cnt = 0;
00394 this->setTag(data(cnt++));
00395 bulk = data(cnt++);
00396 shear = data(cnt++);
00397 sigma_0 = data(cnt++);
00398 sigma_infty = data(cnt++);
00399 delta = data(cnt++);
00400 Hard = data(cnt++);
00401 eta = data(cnt++);
00402 xi_n = data(cnt++);
00403 commitEps22 = data(cnt++);
00404 for (int i=0; i<3; i++)
00405 for (int j=0; j<3; j++)
00406 epsilon_p_n(i,j) = data(cnt++);
00407
00408 epsilon_p_nplus1 = epsilon_p_n;
00409 xi_nplus1 = xi_n;
00410 strain(2,2) = commitEps22;
00411
00412 return 0;
00413 }
00414
00415
00416
00417
00418
00419 void
00420 J2PlaneStress :: index_map( int matrix_index, int &i, int &j )
00421 {
00422 switch ( matrix_index+1 ) {
00423
00424 case 1 :
00425 i = 1 ;
00426 j = 1 ;
00427 break ;
00428
00429 case 2 :
00430 i = 2 ;
00431 j = 2 ;
00432 break ;
00433
00434 case 3 :
00435 i = 1 ;
00436 j = 2 ;
00437 break ;
00438
00439 case 4 :
00440 i = 3 ;
00441 j = 3 ;
00442 break ;
00443
00444 case 5 :
00445 i = 2 ;
00446 j = 3 ;
00447 break ;
00448
00449 case 6 :
00450 i = 3 ;
00451 j = 1 ;
00452 break ;
00453
00454
00455 default :
00456 i = 1 ;
00457 j = 1 ;
00458 break ;
00459
00460 }
00461
00462 i-- ;
00463 j-- ;
00464
00465 return ;
00466 }
00467
00468