ElasticMembranePlateSection.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 ** Developed by:                                                      **
00015 **   Frank McKenna (fmckenna@ce.berkeley.edu)                         **
00016 **   Gregory L. Fenves (fenves@ce.berkeley.edu)                       **
00017 **   Filip C. Filippou (filippou@ce.berkeley.edu)                     **
00018 **                                                                    **
00019 ** ****************************************************************** */
00020                                                                         
00021 // $Revision: 1.9 $
00022 // $Date: 2003/02/14 23:01:33 $
00023 // $Source: /usr/local/cvs/OpenSees/SRC/material/section/ElasticMembranePlateSection.cpp,v $
00024 
00025 // Ed "C++" Love
00026 //
00027 //  Elastic Plate Section with membrane
00028 //
00029 
00030 
00031 #include <ElasticMembranePlateSection.h>
00032 #include <Channel.h>
00033 #include <FEM_ObjectBroker.h>
00034 
00035 //parameters
00036 const double ElasticMembranePlateSection::five6 = 5.0/6.0 ; //shear correction
00037 
00038 //static vector and matrices
00039 Vector  ElasticMembranePlateSection::stress(8) ;
00040 Matrix  ElasticMembranePlateSection::tangent(8,8) ;
00041 ID      ElasticMembranePlateSection::array(8) ;
00042 
00043 
00044 //null constructor
00045 ElasticMembranePlateSection::ElasticMembranePlateSection( ) : 
00046 SectionForceDeformation( 0, SEC_TAG_ElasticMembranePlateSection ), 
00047 strain(8) 
00048 { 
00049 
00050 }
00051 
00052 
00053 
00054 //full constructor
00055 ElasticMembranePlateSection::ElasticMembranePlateSection(  
00056                                            int    tag, 
00057                                            double young,
00058                                            double poisson,
00059                                            double thickness,
00060                                            double r ) :
00061 SectionForceDeformation( tag, SEC_TAG_ElasticMembranePlateSection ),
00062 strain(8)
00063 {
00064   this->E  = young ;
00065   this->nu = poisson ;
00066   this->h  = thickness ;
00067   this->rhoH = r*thickness ;
00068 }
00069 
00070 
00071 
00072 //destructor
00073 ElasticMembranePlateSection::~ElasticMembranePlateSection( ) 
00074 { 
00075 
00076 } 
00077 
00078 
00079 
00080 //make a clone of this material
00081 SectionForceDeformation*  ElasticMembranePlateSection::getCopy( ) 
00082 {
00083   ElasticMembranePlateSection *clone ;   
00084 
00085   clone = new ElasticMembranePlateSection(this->getTag(), E, nu, h, rhoH) ; //new instance of this class
00086 
00087   //    *clone = *this ; //assignment to make copy
00088   clone->rhoH = this->rhoH ;
00089   clone->strain = this->strain;
00090 
00091   return clone ;
00092 }
00093 
00094 //density per unit area
00095 double
00096 ElasticMembranePlateSection::getRho( )
00097 {
00098   return rhoH ;
00099 }
00100 
00101 
00102 //send back order of strain in vector form
00103 int ElasticMembranePlateSection::getOrder( ) const
00104 {
00105   return 8 ;
00106 }
00107 
00108 
00109 //send back order of strain in vector form
00110 const ID& ElasticMembranePlateSection::getType( )
00111 {
00112   return array ;
00113 }
00114 
00115 
00116 
00117 //swap history variables
00118 int ElasticMembranePlateSection::commitState( ) 
00119 {
00120   return 0 ;
00121 }
00122 
00123 
00124 
00125 //revert to last saved state
00126 int ElasticMembranePlateSection::revertToLastCommit( )
00127 {
00128   return 0 ;
00129 }
00130 
00131 //revert to start
00132 int ElasticMembranePlateSection::revertToStart( )
00133 {
00134   return 0 ;
00135 }
00136 
00137 
00138 //get the strain 
00139 int ElasticMembranePlateSection ::
00140 setTrialSectionDeformation( const Vector &strain_from_element)
00141 {
00142   this->strain = strain_from_element ;
00143 
00144   return 0 ;
00145 }
00146 
00147 
00148 //send back the strain
00149 const Vector& ElasticMembranePlateSection::getSectionDeformation( )
00150 {
00151   return this->strain ;
00152 }
00153 
00154 
00155 //send back the stress 
00156 const Vector&  ElasticMembranePlateSection::getStressResultant( )
00157 {
00158 
00159   double M  = E / ( 1.0 - nu*nu ) ; //membrane modulus
00160 
00161   double G  =  0.5 * E / ( 1.0 + nu ) ; //shear modulus
00162  
00163   G *= h ;  //multiply by thickness
00164   M *= h ;
00165 
00166   //membrane resultants
00167 
00168   stress(0) =  M*strain(0) + (nu*M)*strain(1)  ;
00169  
00170   stress(1) =  (nu*M)*strain(0) +  M*strain(1)  ;
00171 
00172   stress(2) =  G*strain(2) ;
00173 
00174  
00175 
00176   G *= five6 ;  //multiply by shear correction factor
00177 
00178   double D  =  E * (h*h*h) / 12.0 / ( 1.0 - nu*nu ) ;  //bending modulus
00179 
00180   //bending resultants
00181 
00182   stress(3) = -( D*strain(3) + nu*D*strain(4) ) ;
00183  
00184   stress(4) = -( nu*D*strain(3) + D*strain(4) ) ;
00185 
00186   stress(5) = -0.5*D*( 1.0 - nu )*strain(5) ;
00187 
00188   stress(6) = G*strain(6) ;
00189 
00190   stress(7) = G*strain(7) ;
00191 
00192  
00193   return this->stress ;
00194 }
00195 
00196 
00197 //send back the tangent 
00198 const Matrix&  ElasticMembranePlateSection::getSectionTangent( )
00199 {
00200 
00201   double M  = E / ( 1.0 - nu*nu ) ; //membrane modulus
00202 
00203   double G  =  0.5 * E / ( 1.0 + nu ) ; //shear modulus
00204 
00205   G *= h ;  //multiply by thickness
00206   M *= h ;
00207 
00208   tangent.Zero() ;
00209 
00210   //membrane tangent terms
00211 
00212   tangent(0,0) = M ;
00213   tangent(1,1) = M ;
00214 
00215   tangent(0,1) = nu*M ;
00216   tangent(1,0) = tangent(0,1) ;
00217 
00218   tangent(2,2) = G ;
00219 
00220 
00221 
00222   G *= five6 ;  //multiply by shear correction factor
00223 
00224   double D  =  E * (h*h*h) / 12.0 / ( 1.0 - nu*nu ) ;  //bending modulus
00225 
00226   //bending tangent terms
00227 
00228   tangent(3,3) = -D ;
00229   tangent(4,4) = -D ;
00230 
00231   tangent(3,4) = -nu*D ;
00232   tangent(4,3) = tangent(3,4) ;
00233 
00234   tangent(5,5) = -0.5 * D * ( 1.0 - nu ) ;
00235 
00236   tangent(6,6) = G ;
00237 
00238   tangent(7,7) = G ;
00239 
00240   return this->tangent ;
00241 }
00242 
00243 
00244 //send back the initial tangent 
00245 const Matrix&  ElasticMembranePlateSection::getInitialTangent( )
00246 {
00247 
00248   double M  = E / ( 1.0 - nu*nu ) ; //membrane modulus
00249 
00250   double G  =  0.5 * E / ( 1.0 + nu ) ; //shear modulus
00251 
00252   G *= h ;  //multiply by thickness
00253   M *= h ;
00254 
00255   tangent.Zero() ;
00256 
00257   //membrane tangent terms
00258 
00259   tangent(0,0) = M ;
00260   tangent(1,1) = M ;
00261 
00262   tangent(0,1) = nu*M ;
00263   tangent(1,0) = tangent(0,1) ;
00264 
00265   tangent(2,2) = G ;
00266 
00267 
00268 
00269   G *= five6 ;  //multiply by shear correction factor
00270 
00271   double D  =  E * (h*h*h) / 12.0 / ( 1.0 - nu*nu ) ;  //bending modulus
00272 
00273   //bending tangent terms
00274 
00275   tangent(3,3) = -D ;
00276   tangent(4,4) = -D ;
00277 
00278   tangent(3,4) = -nu*D ;
00279   tangent(4,3) = tangent(3,4) ;
00280 
00281   tangent(5,5) = -0.5 * D * ( 1.0 - nu ) ;
00282 
00283   tangent(6,6) = G ;
00284 
00285   tangent(7,7) = G ;
00286 
00287   return this->tangent ;
00288 }
00289 
00290 
00291 //print out data
00292 void  ElasticMembranePlateSection::Print( OPS_Stream &s, int flag )
00293 {
00294   s << "ElasticMembranePlateSection: \n " ;
00295   s <<  "  Young's Modulus E = "  <<  E  <<  endln ;
00296   s <<  "  Poisson's Ratio nu = " <<  nu <<  endln ;
00297   s <<  "  Thickness h = "        <<  h  <<  endln ;
00298   s <<  "  Density rho = "        <<  (rhoH/h)  <<  endln ;
00299 
00300   return ;
00301 }
00302 
00303 int 
00304 ElasticMembranePlateSection::sendSelf(int cTag, Channel &theChannel) 
00305 {
00306   int res = 0;
00307   static Vector data(5);
00308   data(0) = this->getTag();
00309   data(1) = E;
00310   data(2) = nu;
00311   data(3) = h;
00312   data(4) = rhoH;
00313 
00314   res = theChannel.sendVector(this->getDbTag(), cTag, data);
00315   if (res < 0) 
00316     opserr << "ElasticMembranePlateSection::sendSelf() - failed to send data\n";
00317 
00318   return res;
00319 }
00320 
00321 
00322 int 
00323 ElasticMembranePlateSection::recvSelf(int cTag, Channel &theChannel, 
00324                                       FEM_ObjectBroker &theBroker)
00325 {
00326   int res = 0;
00327   static Vector data(5);
00328   res = theChannel.recvVector(this->getDbTag(), cTag, data);
00329   if (res < 0) 
00330     opserr << "ElasticMembranePlateSection::recvSelf() - failed to recv data\n";
00331   else {
00332     this->setTag(data(0));
00333     E    = data(1);
00334     nu   = data(2);
00335     h    = data(3);
00336     rhoH = data(4);
00337   }
00338 
00339   return res;
00340 }
00341  

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