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 #include <Vector.h>
00041 #include <Matrix.h>
00042 #include <Node.h>
00043 #include <Channel.h>
00044
00045 #include <iomanip.h>
00046
00047 #include <LinearCrdTransf2d.h>
00048
00049
00050 LinearCrdTransf2d::LinearCrdTransf2d(int tag):
00051 CrdTransf2d(tag, CRDTR_TAG_LinearCrdTransf2d),
00052 nodeIPtr(0), nodeJPtr(0),
00053 nodeIOffset(0), nodeJOffset(0),
00054 cosTheta(0), sinTheta(0), L(0)
00055 {
00056
00057 }
00058
00059
00060 LinearCrdTransf2d::LinearCrdTransf2d(int tag,
00061 const Vector &rigJntOffset1,
00062 const Vector &rigJntOffset2):
00063 CrdTransf2d(tag, CRDTR_TAG_LinearCrdTransf2d),
00064 nodeIPtr(0), nodeJPtr(0),
00065 nodeIOffset(0), nodeJOffset(0),
00066 cosTheta(0), sinTheta(0), L(0)
00067 {
00068
00069 if (&rigJntOffset1 == 0 || rigJntOffset1.Size() != 2 ) {
00070 cerr << "LinearCrdTransf2d::LinearCrdTransf2d: Invalid rigid joint offset vector for node I\n";
00071 cerr << "Size must be 2\n";
00072 }
00073 else {
00074 nodeIOffset = new double[2];
00075 nodeIOffset[0] = rigJntOffset1(0);
00076 nodeIOffset[1] = rigJntOffset1(1);
00077 }
00078
00079
00080 if (&rigJntOffset2 == 0 || rigJntOffset2.Size() != 2 ) {
00081 cerr << "LinearCrdTransf2d::LinearCrdTransf2d: Invalid rigid joint offset vector for node J\n";
00082 cerr << "Size must be 2\n";
00083 }
00084 else {
00085 nodeJOffset = new double[2];
00086 nodeJOffset[0] = rigJntOffset2(0);
00087 nodeJOffset[1] = rigJntOffset2(1);
00088 }
00089 }
00090
00091
00092
00093
00094
00095
00096 LinearCrdTransf2d::LinearCrdTransf2d():
00097 CrdTransf2d(0, CRDTR_TAG_LinearCrdTransf2d),
00098 nodeIPtr(0), nodeJPtr(0),
00099 nodeIOffset(0), nodeJOffset(0),
00100 cosTheta(0), sinTheta(0), L(0)
00101 {
00102
00103 }
00104
00105
00106
00107
00108 LinearCrdTransf2d::~LinearCrdTransf2d()
00109 {
00110 if (nodeIOffset)
00111 delete [] nodeIOffset;
00112 if (nodeJOffset)
00113 delete [] nodeJOffset;
00114 }
00115
00116
00117 int
00118 LinearCrdTransf2d::commitState(void)
00119 {
00120 return 0;
00121 }
00122
00123
00124 int
00125 LinearCrdTransf2d::revertToLastCommit(void)
00126 {
00127 return 0;
00128 }
00129
00130
00131 int
00132 LinearCrdTransf2d::revertToStart(void)
00133 {
00134 return 0;
00135 }
00136
00137
00138 int
00139 LinearCrdTransf2d::initialize(Node *nodeIPointer, Node *nodeJPointer)
00140 {
00141 int error;
00142
00143 nodeIPtr = nodeIPointer;
00144 nodeJPtr = nodeJPointer;
00145
00146 if ((!nodeIPtr) || (!nodeJPtr))
00147 {
00148 cerr << "\nLinearCrdTransf2d::initialize";
00149 cerr << "\ninvalid pointers to the element nodes\n";
00150 return -1;
00151 }
00152
00153
00154 if ((error = this->computeElemtLengthAndOrient()))
00155 return error;
00156
00157 return 0;
00158 }
00159
00160
00161 int
00162 LinearCrdTransf2d::update(void)
00163 {
00164 return 0;
00165 }
00166
00167
00168 int
00169 LinearCrdTransf2d::computeElemtLengthAndOrient()
00170 {
00171
00172 static Vector dx(2);
00173
00174 const Vector &ndICoords = nodeIPtr->getCrds();
00175 const Vector &ndJCoords = nodeJPtr->getCrds();
00176
00177 if (nodeIOffset == 0) {
00178 dx(0) = ndJCoords(0) - ndICoords(0);
00179 dx(1) = ndJCoords(1) - ndICoords(1);
00180 }
00181 else {
00182 dx(0) = ndJCoords(0) + nodeJOffset[0] - ndICoords(0) - nodeIOffset[0];
00183 dx(1) = ndJCoords(1) + nodeJOffset[1] - ndICoords(1) - nodeIOffset[1];
00184 }
00185
00186
00187 L = dx.Norm();
00188
00189 if (L == 0.0)
00190 {
00191 cerr << "\nLinearCrdTransf2d::computeElemtLengthAndOrien: 0 length\n";
00192 return -2;
00193 }
00194
00195
00196
00197 cosTheta = dx(0)/L;
00198 sinTheta = dx(1)/L;
00199
00200 return 0;
00201 }
00202
00203
00204
00205
00206
00207 double
00208 LinearCrdTransf2d::getInitialLength(void)
00209 {
00210 return L;
00211 }
00212
00213
00214 double
00215 LinearCrdTransf2d::getDeformedLength(void)
00216 {
00217 return L;
00218 }
00219
00220
00221 const Vector &
00222 LinearCrdTransf2d::getBasicTrialDisp (void)
00223 {
00224
00225 const Vector &disp1 = nodeIPtr->getTrialDisp();
00226 const Vector &disp2 = nodeJPtr->getTrialDisp();
00227
00228 static double ug[6];
00229 for (int i = 0; i < 3; i++) {
00230 ug[i] = disp1(i);
00231 ug[i+3] = disp2(i);
00232 }
00233
00234 static Vector ub(3);
00235
00236 double oneOverL = 1.0/L;
00237 double sl = sinTheta*oneOverL;
00238 double cl = cosTheta*oneOverL;
00239
00240 if (nodeIOffset == 0) {
00241 ub(0) = -cosTheta*ug[0] - sinTheta*ug[1] +
00242 cosTheta*ug[3] + sinTheta*ug[4];
00243
00244 ub(1) = -sl*ug[0] + cl*ug[1] + ug[2] +
00245 sl*ug[3] - cl*ug[4];
00246
00247
00248
00249 ub(2) = ub(1) + ug[5] - ug[2];
00250 }
00251 else {
00252 double t02 = -cosTheta*nodeIOffset[1] + sinTheta*nodeIOffset[0];
00253 double t12 = sinTheta*nodeIOffset[1] + cosTheta*nodeIOffset[0];
00254 double t35 = -cosTheta*nodeJOffset[1] + sinTheta*nodeJOffset[0];
00255 double t45 = sinTheta*nodeJOffset[1] + cosTheta*nodeJOffset[0];
00256
00257 ub(0) = -cosTheta*ug[0] - sinTheta*ug[1] - t02*ug[2] +
00258 cosTheta*ug[3] + sinTheta*ug[4] + t35*ug[5];
00259
00260 ub(1) = -sl*ug[0] + cl*ug[1] + (1.0+oneOverL*t12)*ug[2] +
00261 sl*ug[3] - cl*ug[4] - oneOverL*t45*ug[5];
00262
00263
00264
00265 ub(2) = ub(1) + ug[5] - ug[2];
00266 }
00267
00268 return ub;
00269 }
00270
00271
00272 const Vector &
00273 LinearCrdTransf2d::getBasicIncrDisp (void)
00274 {
00275
00276 const Vector &disp1 = nodeIPtr->getIncrDisp();
00277 const Vector &disp2 = nodeJPtr->getIncrDisp();
00278
00279 static double dug[6];
00280 for (int i = 0; i < 3; i++) {
00281 dug[i] = disp1(i);
00282 dug[i+3] = disp2(i);
00283 }
00284
00285 static Vector dub(3);
00286
00287 double oneOverL = 1.0/L;
00288 double sl = sinTheta*oneOverL;
00289 double cl = cosTheta*oneOverL;
00290
00291 if (nodeIOffset == 0) {
00292 dub(0) = -cosTheta*dug[0] - sinTheta*dug[1] +
00293 cosTheta*dug[3] + sinTheta*dug[4];
00294
00295 dub(1) = -sl*dug[0] + cl*dug[1] + dug[2] +
00296 sl*dug[3] - cl*dug[4];
00297
00298
00299
00300 dub(2) = dub(1) + dug[5] - dug[2];
00301 }
00302 else {
00303 double t02 = -cosTheta*nodeIOffset[1] + sinTheta*nodeIOffset[0];
00304 double t12 = sinTheta*nodeIOffset[1] + cosTheta*nodeIOffset[0];
00305 double t35 = -cosTheta*nodeJOffset[1] + sinTheta*nodeJOffset[0];
00306 double t45 = sinTheta*nodeJOffset[1] + cosTheta*nodeJOffset[0];
00307
00308 dub(0) = -cosTheta*dug[0] - sinTheta*dug[1] - t02*dug[2] +
00309 cosTheta*dug[3] + sinTheta*dug[4] + t35*dug[5];
00310
00311 dub(1) = -sl*dug[0] + cl*dug[1] + (1.0+oneOverL*t12)*dug[2] +
00312 sl*dug[3] - cl*dug[4] - oneOverL*t45*dug[5];
00313
00314
00315
00316 dub(2) = dub(1) + dug[5] - dug[2];
00317 }
00318
00319 return dub;
00320 }
00321
00322
00323 const Vector &
00324 LinearCrdTransf2d::getBasicIncrDeltaDisp(void)
00325 {
00326
00327 const Vector &disp1 = nodeIPtr->getIncrDeltaDisp();
00328 const Vector &disp2 = nodeJPtr->getIncrDeltaDisp();
00329
00330 static double Dug[6];
00331 for (int i = 0; i < 3; i++) {
00332 Dug[i] = disp1(i);
00333 Dug[i+3] = disp2(i);
00334 }
00335
00336 static Vector Dub(3);
00337
00338 double oneOverL = 1.0/L;
00339 double sl = sinTheta*oneOverL;
00340 double cl = cosTheta*oneOverL;
00341
00342 if (nodeIOffset == 0) {
00343 Dub(0) = -cosTheta*Dug[0] - sinTheta*Dug[1] +
00344 cosTheta*Dug[3] + sinTheta*Dug[4];
00345
00346 Dub(1) = -sl*Dug[0] + cl*Dug[1] + Dug[2] +
00347 sl*Dug[3] - cl*Dug[4];
00348
00349
00350
00351 Dub(2) = Dub(1) + Dug[5] - Dug[2];
00352 }
00353 else {
00354 double t02 = -cosTheta*nodeIOffset[1] + sinTheta*nodeIOffset[0];
00355 double t12 = sinTheta*nodeIOffset[1] + cosTheta*nodeIOffset[0];
00356 double t35 = -cosTheta*nodeJOffset[1] + sinTheta*nodeJOffset[0];
00357 double t45 = sinTheta*nodeJOffset[1] + cosTheta*nodeJOffset[0];
00358
00359 Dub(0) = -cosTheta*Dug[0] - sinTheta*Dug[1] - t02*Dug[2] +
00360 cosTheta*Dug[3] + sinTheta*Dug[4] + t35*Dug[5];
00361
00362 Dub(1) = -sl*Dug[0] + cl*Dug[1] + (1.0+oneOverL*t12)*Dug[2] +
00363 sl*Dug[3] - cl*Dug[4] - oneOverL*t45*Dug[5];
00364
00365
00366
00367 Dub(2) = Dub(1) + Dug[5] - Dug[2];
00368 }
00369
00370 return Dub;
00371 }
00372
00373
00374 const Vector &
00375 LinearCrdTransf2d::getGlobalResistingForce(const Vector &pb, const Vector &unifLoad)
00376 {
00377
00378 static double pl[6];
00379
00380 double q0 = pb(0);
00381 double q1 = pb(1);
00382 double q2 = pb(2);
00383
00384 double oneOverL = 1.0/L;
00385
00386 pl[0] = -q0;
00387 pl[1] = oneOverL*(q1+q2);
00388 pl[2] = q1;
00389 pl[3] = q0;
00390
00391 pl[4] = -pl[1];
00392 pl[5] = q2;
00393
00394
00395
00396 pl[0] -= unifLoad(0)*L;
00397 double V = 0.5*unifLoad(1)*L;
00398 pl[1] -= V;
00399 pl[4] -= V;
00400
00401
00402 static Vector pg(6);
00403
00404 pg(0) = cosTheta*pl[0] - sinTheta*pl[1];
00405 pg(1) = sinTheta*pl[0] + cosTheta*pl[1];
00406
00407 pg(3) = cosTheta*pl[3] - sinTheta*pl[4];
00408 pg(4) = sinTheta*pl[3] + cosTheta*pl[4];
00409
00410 if (nodeIOffset == 0) {
00411 pg(2) = pl[2];
00412 pg(5) = pl[5];
00413 }
00414 else {
00415 double t02 = -cosTheta*nodeIOffset[1] + sinTheta*nodeIOffset[0];
00416 double t12 = sinTheta*nodeIOffset[1] + cosTheta*nodeIOffset[0];
00417 double t35 = -cosTheta*nodeJOffset[1] + sinTheta*nodeJOffset[0];
00418 double t45 = sinTheta*nodeJOffset[1] + cosTheta*nodeJOffset[0];
00419
00420 pg(2) = t02*pl[0] + t12*pl[1] + pl[2];
00421 pg(5) = t35*pl[3] + t45*pl[4] + pl[5];
00422 }
00423
00424 return pg;
00425 }
00426
00427 const Matrix &
00428 LinearCrdTransf2d::getGlobalStiffMatrix (const Matrix &kb, const Vector &pb)
00429 {
00430 static Matrix kg(6,6);
00431 static double tmp [6][6];
00432 static double tmp2[6][6];
00433
00434 double oneOverL = 1.0/L;
00435
00436 double kb00, kb01, kb02, kb10, kb11, kb12, kb20, kb21, kb22;
00437
00438 kb00 = kb(0,0); kb01 = kb(0,1); kb02 = kb(0,2);
00439 kb10 = kb(1,0); kb11 = kb(1,1); kb12 = kb(1,2);
00440 kb20 = kb(2,0); kb21 = kb(2,1); kb22 = kb(2,2);
00441
00442 double t02 = 0.0;
00443 double t12 = 1.0;
00444 double t22 = 0.0;
00445
00446 if (nodeIOffset != 0) {
00447 t02 = cosTheta*nodeIOffset[1] - sinTheta*nodeIOffset[0];
00448 t12 = oneOverL*(sinTheta*nodeIOffset[1]+cosTheta*nodeIOffset[0]) + 1.0;
00449 t22 = oneOverL*(sinTheta*nodeIOffset[1]+cosTheta*nodeIOffset[0]);
00450 }
00451
00452 double t05 = 0.0;
00453 double t15 = 0.0;
00454 double t25 = 1.0;
00455
00456 if (nodeJOffset != 0) {
00457 t05 = -cosTheta*nodeJOffset[1] + sinTheta*nodeJOffset[0];
00458 t15 = -oneOverL*(sinTheta*nodeJOffset[1]+cosTheta*nodeJOffset[0]);
00459 t25 = -oneOverL*(sinTheta*nodeJOffset[1]+cosTheta*nodeJOffset[0]) + 1.0;
00460 }
00461
00462 double sl = sinTheta*oneOverL;
00463 double cl = cosTheta*oneOverL;
00464
00465 tmp[0][0] = -cosTheta*kb00 - sl*(kb01+kb02);
00466 tmp[0][1] = -sinTheta*kb00 + cl*(kb01+kb02);
00467 tmp[0][2] = (nodeIOffset) ? t02*kb00 + t12*kb01 + t22*kb02 : kb01;
00468 tmp[0][3] = -tmp[0][0];
00469 tmp[0][4] = -tmp[0][1];
00470 tmp[0][5] = (nodeJOffset) ? t05*kb00 + t15*kb01 + t25*kb02 : kb02;
00471
00472 tmp[1][0] = -cosTheta*kb10 - sl*(kb11+kb12);
00473 tmp[1][1] = -sinTheta*kb10 + cl*(kb11+kb12);
00474 tmp[1][2] = (nodeIOffset) ? t02*kb10 + t12*kb11 + t22*kb12 : kb11;
00475 tmp[1][3] = -tmp[1][0];
00476 tmp[1][4] = -tmp[1][1];
00477 tmp[1][5] = (nodeJOffset) ? t05*kb10 + t15*kb11 + t25*kb12 : kb12;
00478
00479 tmp[2][0] = -cosTheta*kb20 - sl*(kb21+kb22);
00480 tmp[2][1] = -sinTheta*kb20 + cl*(kb21+kb22);
00481 tmp[2][2] = (nodeIOffset) ? t02*kb20 + t12*kb21 + t22*kb22 : kb21;
00482 tmp[2][3] = -tmp[2][0];
00483 tmp[2][4] = -tmp[2][1];
00484 tmp[2][5] = (nodeJOffset) ? t05*kb20 + t15*kb21 + t25*kb22 : kb22;
00485
00486 kg(0,0) = -cosTheta*tmp[0][0] - sl*(tmp[1][0]+tmp[2][0]);
00487 kg(0,1) = -cosTheta*tmp[0][1] - sl*(tmp[1][1]+tmp[2][1]);
00488 kg(0,2) = -cosTheta*tmp[0][2] - sl*(tmp[1][2]+tmp[2][2]);
00489 kg(0,3) = -cosTheta*tmp[0][3] - sl*(tmp[1][3]+tmp[2][3]);
00490 kg(0,4) = -cosTheta*tmp[0][4] - sl*(tmp[1][4]+tmp[2][4]);
00491 kg(0,5) = -cosTheta*tmp[0][5] - sl*(tmp[1][5]+tmp[2][5]);
00492
00493 kg(1,0) = -sinTheta*tmp[0][0] + cl*(tmp[1][0]+tmp[2][0]);
00494 kg(1,1) = -sinTheta*tmp[0][1] + cl*(tmp[1][1]+tmp[2][1]);
00495 kg(1,2) = -sinTheta*tmp[0][2] + cl*(tmp[1][2]+tmp[2][2]);
00496 kg(1,3) = -sinTheta*tmp[0][3] + cl*(tmp[1][3]+tmp[2][3]);
00497 kg(1,4) = -sinTheta*tmp[0][4] + cl*(tmp[1][4]+tmp[2][4]);
00498 kg(1,5) = -sinTheta*tmp[0][5] + cl*(tmp[1][5]+tmp[2][5]);
00499
00500 if (nodeIOffset) {
00501 kg(2,0) = t02*tmp[0][0] + t12*tmp[1][0] + t22*tmp[2][0];
00502 kg(2,1) = t02*tmp[0][1] + t12*tmp[1][1] + t22*tmp[2][1];
00503 kg(2,2) = t02*tmp[0][2] + t12*tmp[1][2] + t22*tmp[2][2];
00504 kg(2,3) = t02*tmp[0][3] + t12*tmp[1][3] + t22*tmp[2][3];
00505 kg(2,4) = t02*tmp[0][4] + t12*tmp[1][4] + t22*tmp[2][4];
00506 kg(2,5) = t02*tmp[0][5] + t12*tmp[1][5] + t22*tmp[2][5];
00507 }
00508 else {
00509 kg(2,0) = tmp[1][0];
00510 kg(2,1) = tmp[1][1];
00511 kg(2,2) = tmp[1][2];
00512 kg(2,3) = tmp[1][3];
00513 kg(2,4) = tmp[1][4];
00514 kg(2,5) = tmp[1][5];
00515 }
00516
00517 kg(3,0) = -kg(0,0);
00518 kg(3,1) = -kg(0,1);
00519 kg(3,2) = -kg(0,2);
00520 kg(3,3) = -kg(0,3);
00521 kg(3,4) = -kg(0,4);
00522 kg(3,5) = -kg(0,5);
00523
00524 kg(4,0) = -kg(1,0);
00525 kg(4,1) = -kg(1,1);
00526 kg(4,2) = -kg(1,2);
00527 kg(4,3) = -kg(1,3);
00528 kg(4,4) = -kg(1,4);
00529 kg(4,5) = -kg(1,5);
00530
00531 if (nodeJOffset) {
00532 kg(5,0) = t05*tmp[0][0] + t15*tmp[1][0] + t25*tmp[2][0];
00533 kg(5,1) = t05*tmp[0][1] + t15*tmp[1][1] + t25*tmp[2][1];
00534 kg(5,2) = t05*tmp[0][2] + t15*tmp[1][2] + t25*tmp[2][2];
00535 kg(5,3) = t05*tmp[0][3] + t15*tmp[1][3] + t25*tmp[2][3];
00536 kg(5,4) = t05*tmp[0][4] + t15*tmp[1][4] + t25*tmp[2][4];
00537 kg(5,5) = t05*tmp[0][5] + t15*tmp[1][5] + t25*tmp[2][5];
00538 }
00539 else {
00540 kg(5,0) = tmp[2][0];
00541 kg(5,1) = tmp[2][1];
00542 kg(5,2) = tmp[2][2];
00543 kg(5,3) = tmp[2][3];
00544 kg(5,4) = tmp[2][4];
00545 kg(5,5) = tmp[2][5];
00546 }
00547
00548 return kg;
00549 }
00550
00551
00552
00553
00554 CrdTransf2d *
00555 LinearCrdTransf2d::getCopy(void)
00556 {
00557
00558
00559 LinearCrdTransf2d *theCopy;
00560
00561 if (nodeIOffset) {
00562 Vector offsetI(nodeIOffset, 2);
00563 Vector offsetJ(nodeJOffset, 2);
00564
00565 theCopy = new LinearCrdTransf2d(this->getTag(), offsetI, offsetJ);
00566 }
00567 else
00568 theCopy = new LinearCrdTransf2d(this->getTag());
00569
00570 theCopy->nodeIPtr = nodeIPtr;
00571 theCopy->nodeJPtr = nodeJPtr;
00572 theCopy->cosTheta = cosTheta;
00573 theCopy->sinTheta = sinTheta;
00574 theCopy->L = L;
00575
00576 return theCopy;
00577 }
00578
00579
00580 int
00581 LinearCrdTransf2d::sendSelf(int cTag, Channel &theChannel)
00582 {
00583 int res = 0;
00584
00585 static Vector data(9);
00586
00587 data(0) = this->getTag();
00588 data(6) = L;
00589 data(7) = cosTheta;
00590 data(8) = sinTheta;
00591
00592 res += theChannel.sendVector(this->getDbTag(), cTag, data);
00593 if (res < 0) {
00594 g3ErrorHandler->warning("%s - failed to send Vector",
00595 "LinearCrdTransf2d::sendSelf");
00596 return res;
00597 }
00598
00599 return res;
00600 }
00601
00602
00603
00604 int
00605 LinearCrdTransf2d::recvSelf(int cTag, Channel &theChannel, FEM_ObjectBroker &theBroker)
00606 {
00607 int res = 0;
00608
00609 static Vector data(9);
00610
00611 res += theChannel.recvVector(this->getDbTag(), cTag, data);
00612 if (res < 0) {
00613 g3ErrorHandler->warning("%s - failed to receive Vector",
00614 "LinearCrdTransf2d::recvSelf");
00615 return res;
00616 }
00617
00618 this->setTag((int)data(0));
00619 L = data(6);
00620 cosTheta = data(7);
00621 sinTheta = data(8);
00622
00623 return res;
00624 }
00625
00626
00627 const Vector &
00628 LinearCrdTransf2d::getPointGlobalCoordFromLocal(const Vector &xl)
00629 {
00630 static Vector xg(2);
00631
00632 const Vector &nodeICoords = nodeIPtr->getCrds();
00633 xg(0) = nodeICoords(0);
00634 xg(1) = nodeICoords(1);
00635
00636 if (nodeIOffset) {
00637 xg(0) += nodeIOffset[0];
00638 xg(1) += nodeIOffset[1];
00639 }
00640
00641
00642 xg(0) += cosTheta*xl(0) - sinTheta*xl(1);
00643 xg(1) += sinTheta*xl(0) + cosTheta*xl(1);
00644
00645 return xg;
00646 }
00647
00648
00649 const Vector &
00650 LinearCrdTransf2d::getPointGlobalDisplFromBasic (double xi, const Vector &uxb)
00651 {
00652
00653 const Vector &disp1 = nodeIPtr->getTrialDisp();
00654 const Vector &disp2 = nodeJPtr->getTrialDisp();
00655
00656 static Vector ug(6);
00657 for (int i = 0; i < 3; i++)
00658 {
00659 ug(i) = disp1(i);
00660 ug(i+3) = disp2(i);
00661 }
00662
00663
00664 static Vector ul(6);
00665
00666 ul(0) = cosTheta*ug(0) + sinTheta*ug(1);
00667 ul(1) = -sinTheta*ug(0) + cosTheta*ug(1);
00668 ul(2) = ug(2);
00669 ul(3) = cosTheta*ug(3) + sinTheta*ug(4);
00670 ul(4) = -sinTheta*ug(3) + cosTheta*ug(4);
00671 ul(5) = ug(5);
00672
00673 if (nodeIOffset != 0) {
00674 double t02 = -cosTheta*nodeIOffset[1] + sinTheta*nodeIOffset[0];
00675 double t12 = sinTheta*nodeIOffset[1] + cosTheta*nodeIOffset[0];
00676 double t35 = -cosTheta*nodeJOffset[1] + sinTheta*nodeJOffset[0];
00677 double t45 = sinTheta*nodeJOffset[1] + cosTheta*nodeJOffset[0];
00678
00679 ul(0) += t02*ug(2);
00680 ul(1) += t12*ug(2);
00681 ul(3) += t35*ug(5);
00682 ul(4) += t45*ug(5);
00683 }
00684
00685
00686 static Vector uxl(2), uxg(2);
00687
00688 uxl(0) = uxb(0) + ul(0);
00689 uxl(1) = uxb(1) + (1-xi)*ul(1) + xi*ul(4);
00690
00691
00692
00693 uxg(0) = cosTheta*uxl(0) - sinTheta*uxl(1);
00694 uxg(1) = sinTheta*uxl(0) + cosTheta*uxl(1);
00695
00696 return uxg;
00697 }
00698
00699
00700
00701
00702 void
00703 LinearCrdTransf2d::Print(ostream &s, int flag)
00704 {
00705 s << "\nCrdTransf: " << this->getTag() << " Type: LinearCrdTransf2d";
00706 s << "\tnodeI Offset: " << nodeIOffset;
00707 s << "\tnodeJ Offset: " << nodeJOffset;
00708 }
00709
00710
00711
00712
00713
00714
00715
00716