J2PlateFiber.cpp

Go to the documentation of this file.
00001 /* ****************************************************************** **
00002 **    OpenSees - Open System for Earthquake Engineering Simulation    **
00003 **          Pacific Earthquake Engineering Research Center            **
00004 **                                                                    **
00005 **                                                                    **
00006 ** (C) Copyright 1999, The Regents of the University of California    **
00007 ** All Rights Reserved.                                               **
00008 **                                                                    **
00009 ** Commercial use of this program without express permission of the   **
00010 ** University of California, Berkeley, is strictly prohibited.  See   **
00011 ** file 'COPYRIGHT'  in main directory for information on usage and   **
00012 ** redistribution,  and for a DISCLAIMER OF ALL WARRANTIES.           **
00013 **                                                                    **
00014 ** ****************************************************************** */
00015                                                                         
00016 // $Revision: 1.5 $
00017 // $Date: 2003/02/14 23:01:25 $
00018 // $Source: /usr/local/cvs/OpenSees/SRC/material/nD/J2PlateFiber.cpp,v $
00019 
00020 // Written: Ed "C++" Love
00021 //
00022 // J2PlateFiber isotropic hardening material class
00023 // 
00024 //  Elastic Model
00025 //  sigma = K*trace(epsilion_elastic) + (2*G)*dev(epsilon_elastic)
00026 //
00027 //  Yield Function
00028 //  phi(sigma,q) = || dev(sigma) ||  - sqrt(2/3)*q(xi) 
00029 //
00030 //  Saturation Isotropic Hardening with linear term
00031 //  q(xi) = simga_infty + (sigma_0 - sigma_infty)*exp(-delta*xi) + H*xi 
00032 //
00033 //  Flow Rules
00034 //  \dot{epsilon_p} =  gamma * d_phi/d_sigma
00035 //  \dot{xi}        = -gamma * d_phi/d_q 
00036 //
00037 //  Linear Viscosity 
00038 //  gamma = phi / eta  ( if phi > 0 ) 
00039 //
00040 //  Backward Euler Integration Routine 
00041 //  Yield condition enforced at time n+1 
00042 //
00043 //  Send strains in following format :
00044 // 
00045 //     strain_vec = {   eps_00
00046 //                      eps_11
00047 //                    2 eps_01   }   <--- note the 2
00048 // 
00049 //  set eta := 0 for rate independent case
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 //null constructor
00061 J2PlateFiber ::  J2PlateFiber( ) : 
00062 J2Plasticity( ) 
00063 {
00064   commitEps22 =0.0;
00065 }
00066 
00067 
00068 //full constructor
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 //elastic constructor
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 //destructor
00097 J2PlateFiber :: ~J2PlateFiber( ) 
00098 {  
00099 
00100 } 
00101 
00102 
00103 //make a clone of this material
00104 NDMaterial* J2PlateFiber :: getCopy( ) 
00105 { 
00106   J2PlateFiber  *clone;
00107   clone = new J2PlateFiber( ) ;   //new instance of this class
00108   *clone = *this ;          //asignment to make copy
00109   return clone ;
00110 }
00111 
00112 
00113 //send back type of material
00114 const char* J2PlateFiber :: getType( ) const 
00115 {
00116   return "PlateFiber" ;
00117 }
00118 
00119 
00120 //send back order of strain in vector form
00121 int J2PlateFiber :: getOrder( ) const 
00122 { 
00123   return 5 ; 
00124 } 
00125 
00126 //get the strain and integrate plasticity equations
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   //enforce the plane stress condition sigma_22 = 0 
00155   //solve for epsilon_22 
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      //opserr << stress(2,2) << endln ;
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      }// end if 
00171 
00172   } while ( fabs(stress(2,2)) > tolerance ) ;
00173 
00174   //modify tangent for plane stress 
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           //minor symmetries 
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     } // end for jj
00191   } // end for ii 
00192 
00193   return 0 ;
00194 }
00195 
00196 
00197 //unused trial strain functions
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 //send back the strain
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 //send back the stress 
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 //send back the tangent 
00249 const Matrix& J2PlateFiber :: getTangent( ) 
00250 {
00251 
00252   // matrix to tensor mapping
00253   //  Matrix      Tensor
00254   // -------     -------
00255   //   0           0 0
00256   //   1           1 1
00257   //   2           0 1  ( or 1 0 )
00258   //   3           1 2  ( or 2 1 )
00259   //   4           2 0  ( or 0 2 ) 
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     } //end for j
00273   } //end for i
00274        
00275 
00276   return tangent_matrix ;
00277 } 
00278 
00279 
00280 //send back the tangent 
00281 const Matrix& J2PlateFiber :: getInitialTangent( ) 
00282 {
00283 
00284   // matrix to tensor mapping
00285   //  Matrix      Tensor
00286   // -------     -------
00287   //   0           0 0
00288   //   1           1 1
00289   //   2           0 1  ( or 1 0 )
00290   //   3           1 2  ( or 2 1 )
00291   //   4           2 0  ( or 0 2 ) 
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     } //end for j
00307   } //end for i
00308        
00309 
00310   return tangent_matrix ;
00311 } 
00312 
00313 //this is mike's problem
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 //jeremic@ucdavis.edu 22jan2001const Tensor& J2PlateFiber :: getStressTensor( ) 
00340 //jeremic@ucdavis.edu 22jan2001{
00341 //jeremic@ucdavis.edu 22jan2001  return rank2 ;
00342 //jeremic@ucdavis.edu 22jan2001}
00343 //jeremic@ucdavis.edu 22jan2001
00344 //jeremic@ucdavis.edu 22jan2001const Tensor& J2PlateFiber :: getStrainTensor( ) 
00345 //jeremic@ucdavis.edu 22jan2001{
00346 //jeremic@ucdavis.edu 22jan2001  return rank2 ;
00347 //jeremic@ucdavis.edu 22jan2001}
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   // we place all the data needed to define material and it's state
00382   // int a vector object
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   // send the vector object to the channel
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   // recv the vector object from the channel which defines material param and state
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   // set the material parameters and state variables
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 //matrix_index ---> tensor indices i,j
00447 // plane stress different because of condensation on tangent
00448 // case 3 switched to 1-2 and case 4 to 3-3 
00449 void J2PlateFiber :: index_map( int matrix_index, int &i, int &j )
00450 {
00451   switch ( matrix_index+1 ) { //add 1 for standard tensor indices
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   } //end switch
00490 
00491 i-- ; //subtract 1 for C-indexing
00492 j-- ;
00493 
00494 return ; 
00495 }
00496 

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