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