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 #include <beam3d02.h>
00036 #include <Domain.h>
00037 #include <Channel.h>
00038 #include <FEM_ObjectBroker.h>
00039
00040 #include <math.h>
00041 #include <stdlib.h>
00042
00043 Matrix beam3d02::m(12,12);
00044 Matrix beam3d02::d(12,12);
00045 Matrix beam3d02::k(12,12);
00046
00047
00048 beam3d02::beam3d02()
00049 :Element(0,ELE_TAG_beam3d02),
00050 A(0), E(0), G(0), Jx(0), Iy(0), Iz(0),theta(0),
00051 rForce(12), load(12),
00052 connectedExternalNodes(2), isStiffFormed(0)
00053 {
00054
00055 }
00056
00057 beam3d02::beam3d02(int tag, double a, double e, double g,
00058 double jx, double iy, double iz, int Nd1, int Nd2,
00059 double Theta)
00060
00061 :Element(tag,ELE_TAG_beam3d02),
00062 A(a), E(e), G(g), Jx(jx), Iy(iy), Iz(iz), theta(Theta), L(0),
00063 rForce(12), load(12),
00064 connectedExternalNodes(2), isStiffFormed(0)
00065 {
00066 connectedExternalNodes(0) = Nd1;
00067 connectedExternalNodes(1) = Nd2;
00068
00069 theNodes[0] = 0;
00070 theNodes[1] = 0;
00071 }
00072
00073
00074
00075
00076
00077 beam3d02::~beam3d02()
00078 {
00079
00080 }
00081
00082
00083
00084 int
00085 beam3d02::getNumExternalNodes(void) const
00086 {
00087 return 2;
00088 }
00089
00090 const ID &
00091 beam3d02::getExternalNodes(void)
00092 {
00093 return connectedExternalNodes;
00094 }
00095
00096
00097 Node **
00098 beam3d02::getNodePtrs(void)
00099 {
00100 return theNodes;
00101 }
00102
00103
00104 int
00105 beam3d02::getNumDOF(void) {
00106 int i =12;
00107 return i;
00108 }
00109
00110
00111 int
00112 beam3d02::revertToLastCommit()
00113 {
00114 return 0;
00115
00116 }
00117
00118 const Matrix &
00119 beam3d02::getTangentStiff(void)
00120 {
00121 return this->getStiff();
00122 }
00123
00124 const Matrix &
00125 beam3d02::getInitialStiff(void)
00126 {
00127 return this->getStiff();
00128 }
00129
00130
00131
00132
00133
00134
00135 void
00136 beam3d02::setDomain(Domain *theDomain)
00137 {
00138
00139 int Nd1, Nd2;
00140 Nd1 = connectedExternalNodes(0);
00141 Nd2 = connectedExternalNodes(1);
00142
00143 Node *end1Ptr = theDomain->getNode(Nd1);
00144 Node *end2Ptr = theDomain->getNode(Nd2);
00145 theNodes[0] = end1Ptr;
00146 theNodes[1] = end2Ptr;
00147
00148 if (end1Ptr == 0) {
00149 opserr << "beam3d02::getStiff: Nd1: ";
00150 opserr << Nd1 << "does not exist in model\n";
00151 exit(0);
00152 }
00153 if (end2Ptr == 0) {
00154 opserr << "beam3d02::getStiff: Nd2: ";
00155 opserr << Nd2 << "does not exist in model\n";
00156 exit(0);
00157 }
00158
00159
00160 this->DomainComponent::setDomain(theDomain);
00161
00162 const Vector &end1Crd = end1Ptr->getCrds();
00163 const Vector &end2Crd = end2Ptr->getCrds();
00164
00165 dx = end2Crd(0)-end1Crd(0);
00166 dy = end2Crd(1)-end1Crd(1);
00167 dz = end2Crd(2)-end1Crd(2);
00168
00169 L = sqrt(dx*dx + dy*dy + dz*dz);
00170 double L2 = L*L;
00171 double L3 = L*L*L;
00172 if (L == 0.0) {
00173 opserr << "Element: " << this->getTag();
00174 opserr << " beam3d02::getStiff: 0 length\n";
00175 exit(-1);
00176 }
00177
00178 EA = E*A/L;
00179 twoE = 2*E/L;
00180 fourE = 4*E/L;
00181 twelveE = 12*E/L3;
00182 sixE = 6*E/L2;
00183 }
00184
00185
00186 const Matrix &
00187 beam3d02::getStiff(void)
00188 {
00189 if (dy == 0.0 && dz == 0.0 && dx > 0.0 && theta == 90) {
00190 k(0,0) = EA;
00191 k(6,0) = -EA;
00192 k(1,0) = 0;
00193 k(2,0) = 0;
00194 k(3,0) = 0;
00195 k(4,0) = 0;
00196 k(5,0) = 0;
00197 k(7,0) = 0;
00198 k(8,0) = 0;
00199 k(9,0) = 0;
00200 k(10,0) = 0;
00201 k(11,0) = 0;
00202
00203 k(1,1) = twelveE*Iz;
00204 k(5,1) = sixE*Iz;
00205 k(7,1) = -twelveE*Iz;
00206 k(11,1) = sixE*Iz;
00207 k(0,1) = 0;
00208 k(2,1) = 0;
00209 k(3,1) = 0;
00210 k(4,1) = 0;
00211 k(6,1) = 0;
00212 k(8,1) = 0;
00213 k(9,1) = 0;
00214 k(10,1) = 0;
00215
00216 k(2,2) = twelveE*Iy;
00217 k(4,2) = -sixE*Iy;
00218 k(8,2) = -twelveE*Iy;
00219 k(10,2) = -sixE*Iy;
00220 k(0,2) = 0;
00221 k(1,2) = 0;
00222 k(3,2) = 0;
00223 k(5,2) = 0;
00224 k(6,2) = 0;
00225 k(7,2) = 0;
00226 k(9,2) = 0;
00227 k(11,2) = 0;
00228
00229 k(3,3) = G*Jx/L;
00230 k(9,3) = -G*Jx/L;
00231 k(0,3) = 0;
00232 k(1,3) = 0;
00233 k(2,3) = 0;
00234 k(4,3) = 0;
00235 k(5,3) = 0;
00236 k(6,3) = 0;
00237 k(7,3) = 0;
00238 k(8,3) = 0;
00239 k(10,3) = 0;
00240 k(11,3) = 0;
00241
00242 k(2,4) = -sixE*Iy;
00243 k(4,4) = fourE*Iy;
00244 k(8,4) = sixE*Iy;
00245 k(10,4) = twoE*Iy;
00246 k(0,4) = 0;
00247 k(1,4) = 0;
00248 k(3,4) = 0;
00249 k(5,4) = 0;
00250 k(6,4) = 0;
00251 k(7,4) = 0;
00252 k(9,4) = 0;
00253 k(11,4) = 0;
00254
00255 k(1,5) = sixE*Iz;
00256 k(5,5) = fourE*Iz;
00257 k(7,5) = -sixE*Iz;
00258 k(11,5) = twoE*Iz;
00259 k(0,5) = 0;
00260 k(2,5) = 0;
00261 k(3,5) = 0;
00262 k(4,5) = 0;
00263 k(6,5) = 0;
00264 k(8,5) = 0;
00265 k(9,5) = 0;
00266 k(10,5) = 0;
00267
00268 k(0,6) = -EA;
00269 k(6,6) = EA;
00270 k(1,6) = 0;
00271 k(2,6) = 0;
00272 k(3,6) = 0;
00273 k(4,6) = 0;
00274 k(5,6) = 0;
00275 k(7,6) = 0;
00276 k(8,6) = 0;
00277 k(9,6) = 0;
00278 k(10,6) = 0;
00279 k(11,6) = 0;
00280
00281 k(1,7) = -twelveE*Iz;
00282 k(5,7) = -sixE*Iz;
00283 k(7,7) = twelveE*Iz;
00284 k(11,7) = -sixE*Iz;
00285 k(0,7) = 0;
00286 k(2,7) = 0;
00287 k(3,7) = 0;
00288 k(4,7) = 0;
00289 k(6,7) = 0;
00290 k(8,7) = 0;
00291 k(9,7) = 0;
00292 k(10,7) = 0;
00293
00294 k(2,8) = -twelveE*Iy;
00295 k(4,8) = sixE*Iy;
00296 k(8,8) = twelveE*Iy;
00297 k(10,8) = sixE*Iy;
00298 k(0,8) = 0;
00299 k(1,8) = 0;
00300 k(3,8) = 0;
00301 k(5,8) = 0;
00302 k(6,8) = 0;
00303 k(7,8) = 0;
00304 k(9,8) = 0;
00305 k(11,8) = 0;
00306
00307 k(3,9) = -G*Jx/L;
00308 k(9,9) = G*Jx/L;
00309 k(0,9) = 0;
00310 k(1,9) = 0;
00311 k(2,9) = 0;
00312 k(4,9) = 0;
00313 k(5,9) = 0;
00314 k(6,9) = 0;
00315 k(7,9) = 0;
00316 k(8,9) = 0;
00317 k(10,9) = 0;
00318 k(11,9) = 0;
00319
00320 k(2,10) = -sixE*Iy;
00321 k(4,10) = twoE*Iy;
00322 k(8,10) = sixE*Iy;
00323 k(10,10) = fourE*Iy;
00324 k(0,10) = 0;
00325 k(1,10) = 0;
00326 k(3,10) = 0;
00327 k(5,10) = 0;
00328 k(6,10) = 0;
00329 k(7,10) = 0;
00330 k(9,10) = 0;
00331 k(11,10) = 0;
00332
00333 k(1,11) = sixE*Iz;
00334 k(5,11) = twoE*Iz;
00335 k(7,11) = -sixE*Iz;
00336 k(11,11) = fourE*Iz;
00337 k(0,11) = 0;
00338 k(2,11) = 0;
00339 k(3,11) = 0;
00340 k(4,11) = 0;
00341 k(6,11) = 0;
00342 k(8,11) = 0;
00343 k(9,11) = 0;
00344 k(10,11) = 0;
00345 }
00346
00347 else if (dx == 0.0 && dz == 0.0 && dy > 0.0 && theta == 90) {
00348
00349 k(0,0) = twelveE*Iz;
00350 k(5,0) = -sixE*Iz;
00351 k(6,0) = -twelveE*Iz;
00352 k(11,0) = -sixE*Iz;
00353 k(1,0) = 0;
00354 k(2,0) = 0;
00355 k(3,0) = 0;
00356 k(4,0) = 0;
00357 k(7,0) = 0;
00358 k(8,0) = 0;
00359 k(9,0) = 0;
00360 k(10,0) = 0;
00361
00362 k(1,1) = EA;
00363 k(7,1) = -EA;
00364 k(0,1) = 0;
00365 k(2,1) = 0;
00366 k(3,1) = 0;
00367 k(4,1) = 0;
00368 k(5,1) = 0;
00369 k(6,1) = 0;
00370 k(8,1) = 0;
00371 k(9,1) = 0;
00372 k(10,1) = 0;
00373 k(11,1) = 0;
00374
00375 k(2,2) = twelveE*Iy;
00376 k(3,2) = sixE*Iy;
00377 k(8,2) = -twelveE*Iy;
00378 k(9,2) = sixE*Iy;
00379 k(0,2) = 0;
00380 k(1,2) = 0;
00381 k(4,2) = 0;
00382 k(5,2) = 0;
00383 k(6,2) = 0;
00384 k(7,2) = 0;
00385 k(10,2) = 0;
00386 k(11,2) = 0;
00387
00388 k(2,3) = sixE*Iy;
00389 k(3,3) = fourE*Iy;
00390 k(8,3) = -sixE*Iy;
00391 k(9,3) = twoE*Iy;
00392 k(0,3) = 0;
00393 k(1,3) = 0;
00394 k(4,3) = 0;
00395 k(5,3) = 0;
00396 k(6,3) = 0;
00397 k(7,3) = 0;
00398 k(10,3) = 0;
00399 k(11,3) = 0;
00400
00401 k(4,4) = G*Jx/L;
00402 k(10,4) = -G*Jx/L;
00403 k(0,4) = 0;
00404 k(1,4) = 0;
00405 k(2,4) = 0;
00406 k(3,4) = 0;
00407 k(5,4) = 0;
00408 k(6,4) = 0;
00409 k(7,4) = 0;
00410 k(8,4) = 0;
00411 k(9,4) = 0;
00412 k(11,4) = 0;
00413
00414 k(0,5) = -sixE*Iz;
00415 k(5,5) = fourE*Iz;
00416 k(6,5) = sixE*Iz;
00417 k(11,5) = twoE*Iz;
00418 k(1,5) = 0;
00419 k(2,5) = 0;
00420 k(3,5) = 0;
00421 k(4,5) = 0;
00422 k(7,5) = 0;
00423 k(8,5) = 0;
00424 k(9,5) = 0;
00425 k(10,5) = 0;
00426
00427 k(0,6) = -twelveE*Iz;
00428 k(5,6) = sixE*Iz;
00429 k(6,6) = twelveE*Iz;
00430 k(11,6) = sixE*Iz;
00431 k(1,6) = 0;
00432 k(2,6) = 0;
00433 k(3,6) = 0;
00434 k(4,6) = 0;
00435 k(7,6) = 0;
00436 k(8,6) = 0;
00437 k(9,6) = 0;
00438 k(10,6) = 0;
00439
00440 k(1,7) = -EA;
00441 k(7,7) = EA;
00442 k(0,7) = 0;
00443 k(2,7) = 0;
00444 k(3,7) = 0;
00445 k(4,7) = 0;
00446 k(5,7) = 0;
00447 k(6,7) = 0;
00448 k(8,7) = 0;
00449 k(9,7) = 0;
00450 k(10,7) = 0;
00451 k(11,7) = 0;
00452
00453 k(2,8) = -twelveE*Iy;
00454 k(3,8) = -sixE*Iy;
00455 k(8,8) = twelveE*Iy;
00456 k(9,8) = -sixE*Iy;
00457 k(0,8) = 0;
00458 k(1,8) = 0;
00459 k(4,8) = 0;
00460 k(5,8) = 0;
00461 k(6,8) = 0;
00462 k(7,8) = 0;
00463 k(10,8) = 0;
00464 k(11,8) = 0;
00465
00466 k(2,9) = sixE*Iy;
00467 k(3,9) = twoE*Iy;
00468 k(8,9) = -sixE*Iy;
00469 k(9,9) = fourE*Iy;
00470 k(0,9) = 0;
00471 k(1,9) = 0;
00472 k(4,9) = 0;
00473 k(5,9) = 0;
00474 k(6,9) = 0;
00475 k(7,9) = 0;
00476 k(10,9) = 0;
00477 k(11,9) = 0;
00478
00479 k(4,10) = -G*Jx/L;
00480 k(10,10) = G*Jx/L;
00481 k(0,10) = 0;
00482 k(1,10) = 0;
00483 k(2,10) = 0;
00484 k(3,10) = 0;
00485 k(5,10) = 0;
00486 k(6,10) = 0;
00487 k(7,10) = 0;
00488 k(8,10) = 0;
00489 k(9,10) = 0;
00490 k(11,10) = 0;
00491
00492 k(0,11) = -sixE*Iz;
00493 k(5,11) = twoE*Iz;
00494 k(6,11) = sixE*Iz;
00495 k(11,11) = fourE*Iz;
00496 k(1,11) = 0;
00497 k(2,11) = 0;
00498 k(3,11) = 0;
00499 k(4,11) = 0;
00500 k(7,11) = 0;
00501 k(8,11) = 0;
00502 k(9,11) = 0;
00503 k(10,11) = 0;
00504 }
00505
00506 else if (dx == 0.0 && dy == 0.0 && dz > 0.0 && theta == 90) {
00507
00508 k.Zero();
00509 k(0,0) = twelveE*Iz;
00510 k(4,0) = sixE*Iz;
00511 k(6,0) = -twelveE*Iz;
00512 k(10,0) = sixE*Iz;
00513
00514 k(1,1) = twelveE*Iy;
00515 k(3,1) = -sixE*Iy;
00516 k(7,1) = -twelveE*Iy;
00517 k(9,1) = -sixE*Iy;
00518
00519 k(2,2) = EA;
00520 k(8,2) = -EA;
00521
00522 k(1,3) = -sixE*Iy;
00523 k(3,3) = fourE*Iy;
00524 k(7,3) = sixE*Iy;
00525 k(9,3) = twoE*Iy;
00526
00527 k(0,4) = sixE*Iz;
00528 k(4,4) = fourE*Iz;
00529 k(6,4) = -sixE*Iz;
00530 k(10,4) = twoE*Iz;
00531
00532 k(5,5) = G*Jx/L;
00533 k(11,5) = -G*Jx/L;
00534
00535 k(0,6) = -twelveE*Iz;
00536 k(4,6) = -sixE*Iz;
00537 k(6,6) = twelveE*Iz;
00538 k(10,6) = -sixE*Iz;
00539
00540 k(1,7) = -twelveE*Iy;
00541 k(3,7) = sixE*Iy;
00542 k(7,7) = twelveE*Iy;
00543 k(9,7) = sixE*Iy;
00544
00545 k(2,8) = -EA;
00546 k(8,8) = EA;
00547
00548 k(1,9) = -sixE*Iy;
00549 k(3,9) = twoE*Iy;
00550 k(7,9) = sixE*Iy;
00551 k(9,9) = fourE*Iy;
00552
00553 k(0,10) = sixE*Iz;
00554 k(4,10) = twoE*Iz;
00555 k(6,10) = -sixE*Iz;
00556 k(10,10) = fourE*Iz;
00557
00558 k(5,11) = -G*Jx/L;
00559 k(11,11) = G*Jx/L;
00560 }
00561
00562 else {
00563
00564 int Nd1, Nd2;
00565 Nd1 = connectedExternalNodes(0);
00566 Nd2 = connectedExternalNodes(1);
00567 Domain *theDomain = this->getDomain();
00568 Node *end1Ptr = theDomain->getNode(Nd1);
00569 Node *end2Ptr = theDomain->getNode(Nd2);
00570
00571 if (end1Ptr == 0) {
00572 opserr << "beam3d02::getStiff: Nd1: ";
00573 opserr << Nd1 << "does not exist in model\n";
00574 exit(0);
00575 }
00576 if (end2Ptr == 0) {
00577 opserr << "beam3d02::getStiff: Nd2: ";
00578 opserr << Nd2 << "does not exist in model\n";
00579 exit(0);
00580 }
00581
00582 opserr << "beam3d02::getStiff - NOT FINISHED";
00583 opserr << " members not located along global axis directions\n";
00584 exit(0);
00585
00586 }
00587
00588 return k;
00589 }
00590
00591 void
00592 beam3d02::zeroLoad(void)
00593 {
00594 load.Zero();
00595 }
00596
00597 int
00598 beam3d02::addLoad(ElementalLoad *theLoad, double loadFactor)
00599 {
00600 opserr << "beam3d02::addLoad() - beam " << this->getTag() << "load type unknown\n";
00601 return -1;
00602 }
00603
00604 int
00605 beam3d02::addInertiaLoadToUnbalance(const Vector &accel)
00606 {
00607 return 0;
00608 }
00609
00610 const Vector &
00611 beam3d02::getResistingForceIncInertia()
00612 {
00613 this->getResistingForce();
00614
00615
00616 if (betaK != 0.0 || betaK0 != 0.0 || betaKc != 0.0)
00617 rForce += this->getRayleighDampingForces();
00618
00619 return rForce;
00620 }
00621 const Vector &
00622 beam3d02::getResistingForce()
00623 {
00624
00625 int Nd1, Nd2;
00626 Nd1 = connectedExternalNodes(0);
00627 Nd2 = connectedExternalNodes(1);
00628 Domain *theDomain = this->getDomain();
00629 Node *end1Ptr = theDomain->getNode(Nd1);
00630 Node *end2Ptr = theDomain->getNode(Nd2);
00631
00632 const Vector &end1Disp = end1Ptr->getTrialDisp();
00633 const Vector &end2Disp = end2Ptr->getTrialDisp();
00634 rForce(0) = end1Disp(0);
00635 rForce(1) = end1Disp(1);
00636 rForce(2) = end1Disp(2);
00637 rForce(3) = end1Disp(3);
00638 rForce(4) = end1Disp(4);
00639 rForce(5) = end1Disp(5);
00640 rForce(6) = end2Disp(0);
00641 rForce(7) = end2Disp(1);
00642 rForce(8) = end2Disp(2);
00643 rForce(9) = end2Disp(3);
00644 rForce(10) = end2Disp(4);
00645 rForce(11) = end2Disp(5);
00646
00647 this->getStiff();
00648 rForce = k * rForce;
00649
00650
00651 rForce -= load;
00652
00653 return rForce;
00654 }
00655
00656
00657 int
00658 beam3d02::sendSelf(int commitTag, Channel &theChannel)
00659 {
00660 int dataTag = this->getDbTag();
00661 Vector data(10);
00662 data(0) = A; data(1) = E; data(2) = G;
00663 data(3) = Jx; data(4) = Iy; data(5) = Iz;
00664 data(6) = this->getTag();
00665 data(7) = connectedExternalNodes(0);
00666 data(8) = connectedExternalNodes(1);
00667 data(9) = theta;
00668 int result = 0;
00669 result = theChannel.sendVector(dataTag, commitTag, data);
00670 if (result < 0) {
00671 opserr << "beam3d02::sendSelf - failed to send data\n";
00672 return -1;
00673 }
00674
00675 return 0;
00676 }
00677
00678 int
00679 beam3d02::recvSelf(int commitTag, Channel &theChannel, FEM_ObjectBroker &theBroker)
00680 {
00681 int dataTag = this->getDbTag();
00682 Vector data(10);
00683 int result = 0;
00684
00685 result = theChannel.recvVector(dataTag, commitTag, data);
00686 if (result < 0) {
00687 opserr << "beam3d02::recvSelf - failed to recv data\n";
00688 return -1;
00689 }
00690
00691 A = data(0); E = data(1); G=data(2);
00692 Jx = data(3); Iy = data(4); Iz=data(5);
00693 theta = data(9);
00694 int tag = data(6);
00695 this->setTag(tag);
00696 int nd1 = data(7);
00697 int nd2 = data(8);
00698 connectedExternalNodes(0) = nd1;
00699 connectedExternalNodes(1) = nd2;
00700
00701 return 0;
00702 }
00703
00704
00705 void
00706 beam3d02::Print(OPS_Stream &s, int flag)
00707 {
00708 s << "\nElement: " << this->getTag() << " Type: beam3d02 ";
00709 s << "\tConnected Nodes: " << connectedExternalNodes ;
00710
00711 s << "\tResisting Force: " << rForce;
00712
00713 }
00714
00715
00716
00717
00718