// set transformation matrix from local to basic system void TwoNodeLink::setTranLocalBasic() { // resize transformation matrix and zero it Tlb.resize(numDir,numDOF); Tlb.Zero(); for (int i=0; i<numDir; i++) { int dirID = (*dir)(i); // direction 0 to 5; Tlb(i,dirID) = -1.0; Tlb(i,dirID+numDOF/2) = 1.0; // switch on dimensionality of element switch (elemType) { case D2N6: if (dirID == 1) { Tlb(i,2) = -shearDistI(0)*L; Tlb(i,5) = -(1.0 - shearDistI(0))*L; } break; case D3N12: if (dirID == 1) { Tlb(i,5) = -shearDistI(0)*L; Tlb(i,11) = -(1.0-shearDistI(0))*L; } else if (dirID == 2) { Tlb(i,4) = shearDistI(1)*L; Tlb(i,10) = (1.0-shearDistI(1))*L; } break; default : // do nothing break; } } }
// set up the transformation matrix for orientation void YamamotoBiaxialHDR::setUp() { const Vector &end1Crd = theNodes[0]->getCrds(); const Vector &end2Crd = theNodes[1]->getCrds(); Vector oriXp = end2Crd - end1Crd; double elmLen = oriXp.Norm(); if (elmLen > DBL_EPSILON) { if (oriX.Size() == 0) { oriX.resize(3); oriX = oriXp; } else { opserr << "WARNING YamamotoBiaxialHDR::setUp() - " << "element: " << this->getTag() << endln << "ignoring nodes and using specified " << "local x vector to determine orientation\n"; } } // check that vectors for orientation are of correct size if (oriX.Size() != 3 || oriYp.Size() != 3) { opserr << "YamamotoBiaxialHDR::setUp() - " << "element: " << this->getTag() << endln << "incorrect dimension of orientation vectors\n"; exit(-1); } // establish orientation of element for the transformation matrix // z = x cross yp Vector oriZ(3); oriZ(0) = oriX(1)*oriYp(2) - oriX(2)*oriYp(1); oriZ(1) = oriX(2)*oriYp(0) - oriX(0)*oriYp(2); oriZ(2) = oriX(0)*oriYp(1) - oriX(1)*oriYp(0); // y = z cross x Vector oriY(3); oriY(0) = oriZ(1)*oriX(2) - oriZ(2)*oriX(1); oriY(1) = oriZ(2)*oriX(0) - oriZ(0)*oriX(2); oriY(2) = oriZ(0)*oriX(1) - oriZ(1)*oriX(0); // compute length(norm) of vectors double xn = oriX.Norm(); double yn = oriY.Norm(); double zn = oriZ.Norm(); // check valid x and y vectors, i.e. not parallel and of zero length if (xn == 0 || yn == 0 || zn == 0) { opserr << "YamamotoBiaxialHDR::setUp() - " << "element: " << this->getTag() << endln << "invalid orientation vectors\n"; exit(-1); } // create transformation matrix from global to local system Tgl.Zero(); Tgl(0,0) = Tgl(3,3) = Tgl(6,6) = Tgl(9,9) = oriX(0)/xn; Tgl(0,1) = Tgl(3,4) = Tgl(6,7) = Tgl(9,10) = oriX(1)/xn; Tgl(0,2) = Tgl(3,5) = Tgl(6,8) = Tgl(9,11) = oriX(2)/xn; Tgl(1,0) = Tgl(4,3) = Tgl(7,6) = Tgl(10,9) = oriY(0)/yn; Tgl(1,1) = Tgl(4,4) = Tgl(7,7) = Tgl(10,10) = oriY(1)/yn; Tgl(1,2) = Tgl(4,5) = Tgl(7,8) = Tgl(10,11) = oriY(2)/yn; Tgl(2,0) = Tgl(5,3) = Tgl(8,6) = Tgl(11,9) = oriZ(0)/zn; Tgl(2,1) = Tgl(5,4) = Tgl(8,7) = Tgl(11,10) = oriZ(1)/zn; Tgl(2,2) = Tgl(5,5) = Tgl(8,8) = Tgl(11,11) = oriZ(2)/zn; // create transformation matrix from local to basic system (linear) Tlb.Zero(); Tlb(0,0) = Tlb(1,1) = Tlb(2,2) = Tlb(3,3) = Tlb(4,4) = Tlb(5,5) = -1.0; Tlb(0,6) = Tlb(1,7) = Tlb(2,8) = Tlb(3,9) = Tlb(4,10) = Tlb(5,11) = 1.0; Tlb(1,5) = Tlb(1,11) = -0.5*elmLen; Tlb(2,4) = Tlb(2,10) = 0.5*elmLen; }
// set up the transformation matrix for orientation void ElastomericBearingBoucWen2d::setUp() { const Vector &end1Crd = theNodes[0]->getCrds(); const Vector &end2Crd = theNodes[1]->getCrds(); Vector xp = end2Crd - end1Crd; L = xp.Norm(); if (L > DBL_EPSILON) { if (x.Size() == 0) { x.resize(3); x(0) = xp(0); x(1) = xp(1); x(2) = 0.0; y.resize(3); y(0) = -x(1); y(1) = x(0); y(2) = 0.0; } else if (onP0) { opserr << "WARNING ElastomericBearingBoucWen2d::setUp() - " << "element: " << this->getTag() << " - ignoring nodes and using specified " << "local x vector to determine orientation.\n"; } } // check that vectors for orientation are of correct size if (x.Size() != 3 || y.Size() != 3) { opserr << "ElastomericBearingBoucWen2d::setUp() - " << "element: " << this->getTag() << " - incorrect dimension of orientation vectors.\n"; exit(-1); } // establish orientation of element for the tranformation matrix // z = x cross y static Vector z(3); z(0) = x(1)*y(2) - x(2)*y(1); z(1) = x(2)*y(0) - x(0)*y(2); z(2) = x(0)*y(1) - x(1)*y(0); // y = z cross x y(0) = z(1)*x(2) - z(2)*x(1); y(1) = z(2)*x(0) - z(0)*x(2); y(2) = z(0)*x(1) - z(1)*x(0); // compute length(norm) of vectors double xn = x.Norm(); double yn = y.Norm(); double zn = z.Norm(); // check valid x and y vectors, i.e. not parallel and of zero length if (xn == 0 || yn == 0 || zn == 0) { opserr << "ElastomericBearingBoucWen2d::setUp() - " << "element: " << this->getTag() << " - invalid orientation vectors.\n"; exit(-1); } // create transformation matrix from global to local system Tgl.Zero(); Tgl(0,0) = Tgl(3,3) = x(0)/xn; Tgl(0,1) = Tgl(3,4) = x(1)/xn; Tgl(1,0) = Tgl(4,3) = y(0)/yn; Tgl(1,1) = Tgl(4,4) = y(1)/yn; Tgl(2,2) = Tgl(5,5) = z(2)/zn; // create transformation matrix from local to basic system (linear) Tlb.Zero(); Tlb(0,0) = Tlb(1,1) = Tlb(2,2) = -1.0; Tlb(0,3) = Tlb(1,4) = Tlb(2,5) = 1.0; Tlb(1,2) = -shearDistI*L; Tlb(1,5) = -(1.0 - shearDistI)*L; }