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 #include <ElasticMembranePlateSection.h>
00032 #include <Channel.h>
00033 #include <FEM_ObjectBroker.h>
00034
00035
00036 const double ElasticMembranePlateSection::five6 = 5.0/6.0 ;
00037
00038
00039 Vector ElasticMembranePlateSection::stress(8) ;
00040 Matrix ElasticMembranePlateSection::tangent(8,8) ;
00041 ID ElasticMembranePlateSection::array(8) ;
00042
00043
00044
00045 ElasticMembranePlateSection::ElasticMembranePlateSection( ) :
00046 SectionForceDeformation( 0, SEC_TAG_ElasticMembranePlateSection ),
00047 strain(8)
00048 {
00049
00050 }
00051
00052
00053
00054
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
00073 ElasticMembranePlateSection::~ElasticMembranePlateSection( )
00074 {
00075
00076 }
00077
00078
00079
00080
00081 SectionForceDeformation* ElasticMembranePlateSection::getCopy( )
00082 {
00083 ElasticMembranePlateSection *clone ;
00084
00085 clone = new ElasticMembranePlateSection(this->getTag(), E, nu, h, rhoH) ;
00086
00087
00088 clone->rhoH = this->rhoH ;
00089 clone->strain = this->strain;
00090
00091 return clone ;
00092 }
00093
00094
00095 double
00096 ElasticMembranePlateSection::getRho( )
00097 {
00098 return rhoH ;
00099 }
00100
00101
00102
00103 int ElasticMembranePlateSection::getOrder( ) const
00104 {
00105 return 8 ;
00106 }
00107
00108
00109
00110 const ID& ElasticMembranePlateSection::getType( )
00111 {
00112 return array ;
00113 }
00114
00115
00116
00117
00118 int ElasticMembranePlateSection::commitState( )
00119 {
00120 return 0 ;
00121 }
00122
00123
00124
00125
00126 int ElasticMembranePlateSection::revertToLastCommit( )
00127 {
00128 return 0 ;
00129 }
00130
00131
00132 int ElasticMembranePlateSection::revertToStart( )
00133 {
00134 return 0 ;
00135 }
00136
00137
00138
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
00149 const Vector& ElasticMembranePlateSection::getSectionDeformation( )
00150 {
00151 return this->strain ;
00152 }
00153
00154
00155
00156 const Vector& ElasticMembranePlateSection::getStressResultant( )
00157 {
00158
00159 double M = E / ( 1.0 - nu*nu ) ;
00160
00161 double G = 0.5 * E / ( 1.0 + nu ) ;
00162
00163 G *= h ;
00164 M *= h ;
00165
00166
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 ;
00177
00178 double D = E * (h*h*h) / 12.0 / ( 1.0 - nu*nu ) ;
00179
00180
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
00198 const Matrix& ElasticMembranePlateSection::getSectionTangent( )
00199 {
00200
00201 double M = E / ( 1.0 - nu*nu ) ;
00202
00203 double G = 0.5 * E / ( 1.0 + nu ) ;
00204
00205 G *= h ;
00206 M *= h ;
00207
00208 tangent.Zero() ;
00209
00210
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 ;
00223
00224 double D = E * (h*h*h) / 12.0 / ( 1.0 - nu*nu ) ;
00225
00226
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
00245 const Matrix& ElasticMembranePlateSection::getInitialTangent( )
00246 {
00247
00248 double M = E / ( 1.0 - nu*nu ) ;
00249
00250 double G = 0.5 * E / ( 1.0 + nu ) ;
00251
00252 G *= h ;
00253 M *= h ;
00254
00255 tangent.Zero() ;
00256
00257
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 ;
00270
00271 double D = E * (h*h*h) / 12.0 / ( 1.0 - nu*nu ) ;
00272
00273
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
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