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
00053 #include <J2AxiSymm.h>
00054 #include <Channel.h>
00055 #include <FEM_ObjectBroker.h>
00056
00057
00058 Vector J2AxiSymm :: strain_vec(4) ;
00059 Vector J2AxiSymm :: stress_vec(4) ;
00060 Matrix J2AxiSymm :: tangent_matrix(4,4) ;
00061
00062
00063
00064 J2AxiSymm :: J2AxiSymm( ) :
00065 J2Plasticity( )
00066 { }
00067
00068
00069
00070 J2AxiSymm ::
00071 J2AxiSymm( int tag,
00072 double K,
00073 double G,
00074 double yield0,
00075 double yield_infty,
00076 double d,
00077 double H,
00078 double viscosity ) :
00079 J2Plasticity( tag, ND_TAG_J2AxiSymm,
00080 K, G, yield0, yield_infty, d, H, viscosity )
00081 {
00082
00083 }
00084
00085
00086
00087 J2AxiSymm ::
00088 J2AxiSymm( int tag,
00089 double K,
00090 double G ) :
00091 J2Plasticity( tag, ND_TAG_J2AxiSymm, K, G )
00092 {
00093
00094 }
00095
00096
00097
00098
00099 J2AxiSymm :: ~J2AxiSymm( )
00100 { }
00101
00102
00103
00104 NDMaterial* J2AxiSymm :: getCopy( )
00105 {
00106 J2AxiSymm *clone;
00107 clone = new J2AxiSymm() ;
00108 *clone = *this ;
00109 return clone ;
00110 }
00111
00112
00113
00114 const char* J2AxiSymm :: getType( ) const
00115 {
00116 return "AxiSymmetric2D" ;
00117 }
00118
00119
00120
00121 int J2AxiSymm :: getOrder( ) const
00122 {
00123 return 4 ;
00124 }
00125
00126
00127
00128 int J2AxiSymm :: setTrialStrain( const Vector &strain_from_element)
00129 {
00130 strain.Zero( ) ;
00131
00132 strain(0,0) = strain_from_element(0) ;
00133 strain(1,1) = strain_from_element(1) ;
00134 strain(2,2) = strain_from_element(2) ;
00135
00136 strain(0,1) = 0.50 * strain_from_element(3) ;
00137 strain(1,0) = strain(0,1) ;
00138
00139 this->plastic_integrator( ) ;
00140
00141 return 0 ;
00142 }
00143
00144
00145
00146 int J2AxiSymm :: setTrialStrain( const Vector &v, const Vector &r )
00147 {
00148 return this->setTrialStrain( v ) ;
00149 }
00150
00151 int J2AxiSymm :: setTrialStrainIncr( const Vector &v )
00152 {
00153 return -1 ;
00154 }
00155
00156 int J2AxiSymm :: setTrialStrainIncr( const Vector &v, const Vector &r )
00157 {
00158 return -1 ;
00159 }
00160
00161
00162
00163
00164 const Vector& J2AxiSymm :: getStrain( )
00165 {
00166 strain_vec(0) = strain(0,0) ;
00167 strain_vec(1) = strain(1,1) ;
00168 strain_vec(2) = strain(2,2) ;
00169
00170 strain_vec(3) = 2.0 * strain(0,1) ;
00171
00172 return strain_vec ;
00173 }
00174
00175
00176
00177 const Vector& J2AxiSymm :: getStress( )
00178 {
00179 stress_vec(0) = stress(0,0) ;
00180 stress_vec(1) = stress(1,1) ;
00181 stress_vec(2) = stress(2,2) ;
00182
00183 stress_vec(3) = stress(0,1) ;
00184
00185 return stress_vec ;
00186 }
00187
00188
00189 const Matrix& J2AxiSymm :: getTangent( )
00190 {
00191
00192
00193
00194
00195
00196
00197
00198
00199 int ii, jj ;
00200 int i, j, k, l ;
00201
00202 for ( ii = 0; ii < 4; ii++ ) {
00203 for ( jj = 0; jj < 4; jj++ ) {
00204
00205 index_map( ii, i, j ) ;
00206 index_map( jj, k, l ) ;
00207
00208 tangent_matrix(ii,jj) = tangent[i][j][k][l] ;
00209
00210 }
00211 }
00212
00213 return tangent_matrix ;
00214 }
00215
00216
00217 const Matrix& J2AxiSymm :: getInitialTangent( )
00218 {
00219
00220
00221
00222
00223
00224
00225
00226
00227 this->doInitialTangent();
00228
00229 int ii, jj ;
00230 int i, j, k, l ;
00231
00232 for ( ii = 0; ii < 4; ii++ ) {
00233 for ( jj = 0; jj < 4; jj++ ) {
00234
00235 index_map( ii, i, j ) ;
00236 index_map( jj, k, l ) ;
00237
00238 tangent_matrix(ii,jj) = initialTangent[i][j][k][l] ;
00239
00240 }
00241 }
00242
00243 return tangent_matrix ;
00244 }
00245
00246
00247 int J2AxiSymm :: setTrialStrain(const Tensor &v)
00248 {
00249 return -1 ;
00250 }
00251
00252 int J2AxiSymm :: setTrialStrain(const Tensor &v, const Tensor &r)
00253 {
00254 return -1 ;
00255 }
00256
00257 int J2AxiSymm :: setTrialStrainIncr(const Tensor &v)
00258 {
00259 return -1 ;
00260 }
00261
00262 int J2AxiSymm :: setTrialStrainIncr(const Tensor &v, const Tensor &r)
00263 {
00264 return -1 ;
00265 }
00266
00267 const Tensor& J2AxiSymm :: getTangentTensor( )
00268 {
00269 return rank4 ;
00270 }
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283 int J2AxiSymm :: commitState( )
00284 {
00285 epsilon_p_n = epsilon_p_nplus1 ;
00286 xi_n = xi_nplus1 ;
00287
00288 return 0 ;
00289 }
00290
00291
00292
00293 int J2AxiSymm :: revertToLastCommit( )
00294 {
00295 return 0 ;
00296 }
00297
00298
00299 int J2AxiSymm :: revertToStart( )
00300
00301 {
00302 this->zero( ) ;
00303 return 0 ;
00304 }
00305
00306 int
00307 J2AxiSymm::sendSelf (int commitTag, Channel &theChannel)
00308 {
00309
00310
00311 static Vector data(9+9);
00312 int cnt = 0;
00313 data(cnt++) = this->getTag();
00314 data(cnt++) = bulk;
00315 data(cnt++) = shear;
00316 data(cnt++) = sigma_0;
00317 data(cnt++) = sigma_infty;
00318 data(cnt++) = delta;
00319 data(cnt++) = Hard;
00320 data(cnt++) = eta;
00321 data(cnt++) = xi_n;
00322 for (int i=0; i<3; i++)
00323 for (int j=0; j<3; j++)
00324 data(cnt++) = epsilon_p_n(i,j);
00325
00326
00327 if (theChannel.sendVector(this->getDbTag(), commitTag, data) < 0) {
00328 opserr << "J2AxiSymm::recvSelf - failed to send vector to channel\n";
00329 return -1;
00330 }
00331
00332 return 0;
00333 }
00334
00335 int
00336 J2AxiSymm::recvSelf (int commitTag, Channel &theChannel,
00337 FEM_ObjectBroker &theBroker)
00338 {
00339
00340
00341 static Vector data(9+9);
00342 if (theChannel.recvVector(this->getDbTag(), commitTag, data) < 0) {
00343 opserr << "J2AxiSymm::recvSelf - failed to recv vector from channel\n";
00344 return -1;
00345 }
00346
00347
00348 int cnt = 0;
00349 this->setTag(data(cnt++));
00350 bulk = data(cnt++);
00351 shear = data(cnt++);
00352 sigma_0 = data(cnt++);
00353 sigma_infty = data(cnt++);
00354 delta = data(cnt++);
00355 Hard = data(cnt++);
00356 eta = data(cnt++);
00357 xi_n = data(cnt++);
00358 for (int i=0; i<3; i++)
00359 for (int j=0; j<3; j++)
00360 epsilon_p_n(i,j) = data(cnt++);
00361
00362 epsilon_p_nplus1 = epsilon_p_n;
00363 xi_nplus1 = xi_n;
00364
00365 return 0;
00366 }
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378