bool ASMs1D::getElementNodalRotations (TensorVec& T, size_t iel) const { #ifdef INDEX_CHECK if (iel >= MNPC.size()) { std::cerr <<" *** ASMs1D::getElementNodalRotations: Element index "<< iel <<" out of range [0,"<< MNPC.size() <<">."<< std::endl; return false; } #endif T.clear(); if (nodalT.empty()) return true; const IntVec& mnpc = MNPC[iel]; Tensor Tgl(elmCS[iel],true); T.reserve(mnpc.size()); for (size_t i = 0; i < mnpc.size(); i++) T.push_back(Tgl*nodalT[mnpc[i]]); return true; }
// 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; }
void ElasticTimoshenkoBeam2d::setUp() { // element projection static Vector dx(2); const Vector &ndICoords = theNodes[0]->getCrds(); const Vector &ndJCoords = theNodes[1]->getCrds(); dx = ndJCoords - ndICoords; //if (nodeIInitialDisp != 0) { // dx(0) -= nodeIInitialDisp[0]; // dx(1) -= nodeIInitialDisp[1]; //} //if (nodeJInitialDisp != 0) { // dx(0) += nodeJInitialDisp[0]; // dx(1) += nodeJInitialDisp[1]; //} //if (nodeJOffset != 0) { // dx(0) += nodeJOffset[0]; // dx(1) += nodeJOffset[1]; //} //if (nodeIOffset != 0) { // dx(0) -= nodeIOffset[0]; // dx(1) -= nodeIOffset[1]; //} // determine the element length L = dx.Norm(); if (L == 0.0) { opserr << "ElasticTimoshenkoBeam2d::setUp() - " << "element: " << this->getTag() << " has zero length.\n"; return; } // create transformation matrix from global to local system Tgl.Zero(); Tgl(0,0) = Tgl(1,1) = Tgl(3,3) = Tgl(4,4) = dx(0)/L; Tgl(0,1) = Tgl(3,4) = dx(1)/L; Tgl(1,0) = Tgl(4,3) = -dx(1)/L; Tgl(2,2) = Tgl(5,5) = 1.0; // determine ratio of bending to shear stiffness phi = 12.0*E*Iz/(L*L*G*Avy); // compute initial stiffness matrix in local system kl.Zero(); kl(0,0) = kl(3,3) = E*A/L; kl(0,3) = kl(3,0) = -kl(0,0); double a1z = E*Iz/(1.0 + phi); kl(1,1) = kl(4,4) = 12.0*a1z/(L*L*L); kl(1,4) = kl(4,1) = -kl(1,1); kl(2,2) = kl(5,5) = (4.0 + phi)*a1z/L; kl(2,5) = kl(5,2) = (2.0 - phi)*a1z/L; kl(1,2) = kl(2,1) = kl(1,5) = kl(5,1) = 6.0*a1z/(L*L); kl(2,4) = kl(4,2) = kl(4,5) = kl(5,4) = -kl(1,2); // compute geometric stiffness matrix in local system klgeo.Zero(); if (nlGeo == 1) { double b1z = 1.0/(30.0*L*pow(1.0 + phi,2)); klgeo(1,1) = klgeo(4,4) = b1z*(30.0*phi*phi + 60.0*phi + 36.0); klgeo(1,4) = klgeo(4,1) = -klgeo(1,1); klgeo(2,2) = klgeo(5,5) = b1z*L*L*(2.5*phi*phi + 5.0*phi + 4.0); klgeo(2,5) = klgeo(5,2) = -b1z*L*L*(2.5*phi*phi + 5.0*phi + 1.0); klgeo(1,2) = klgeo(2,1) = klgeo(1,5) = klgeo(5,1) = 3.0*L; klgeo(2,4) = klgeo(4,2) = klgeo(4,5) = klgeo(5,4) = -klgeo(1,2); } // compute initial stiffness matrix in global system Ki.addMatrixTripleProduct(0.0, Tgl, kl, 1.0); // compute mass matrix in global system M.Zero(); if (rho > 0.0) { if (cMass == 0) { // lumped mass matrix double m = 0.5*rho*L; for (int i=0; i<2; i++) { M(i,i) = m; M(i+3,i+3) = m; } } else { // consistent mass matrix Matrix mlTrn(6,6), mlRot(6,6), ml(6,6); mlTrn.Zero(); mlRot.Zero(); ml.Zero(); double c1x = rho*L/210.0; mlTrn(0,0) = mlTrn(3,3) = c1x*70.0; mlTrn(0,3) = mlTrn(3,0) = c1x*35.0; double c1z = c1x/pow(1.0 + phi,2); mlTrn(1,1) = mlTrn(4,4) = c1z*(70.0*phi*phi + 147.0*phi + 78.0); mlTrn(1,4) = mlTrn(4,1) = c1z*(35.0*phi*phi + 63.0*phi + 27.0); mlTrn(2,2) = mlTrn(5,5) = c1z*L*L/4.0*(7.0*phi*phi + 14.0*phi + 8.0); mlTrn(2,5) = mlTrn(5,2) = -c1z*L*L/4.0*(7.0*phi*phi + 14.0*phi + 6.0); mlTrn(1,2) = mlTrn(2,1) = c1z*L/4.0*(35.0*phi*phi + 77.0*phi + 44.0); mlTrn(4,5) = mlTrn(5,4) = -mlTrn(1,2); mlTrn(1,5) = mlTrn(5,1) = -c1z*L/4.0*(35.0*phi*phi + 63.0*phi + 26.0); mlTrn(2,4) = mlTrn(4,2) = -mlTrn(1,5); double c2z = rho/A*Iz/(30.0*L*pow(1.0 + phi,2)); mlRot(1,1) = mlRot(4,4) = c2z*36.0; mlRot(1,4) = mlRot(4,1) = -mlRot(1,1); mlRot(2,2) = mlRot(5,5) = c2z*L*L*(10.0*phi*phi + 5.0*phi + 4.0); mlRot(2,5) = mlRot(5,2) = c2z*L*L*(5.0*phi*phi - 5.0*phi - 1.0); mlRot(1,2) = mlRot(2,1) = mlRot(1,5) = mlRot(5,1) = -c2z*L*(15.0*phi - 3.0); mlRot(2,4) = mlRot(4,2) = mlRot(4,5) = mlRot(5,4) = -mlRot(1,2); // add translational and rotational parts ml = mlTrn + mlRot; // transform from local to global system M.addMatrixTripleProduct(0.0, Tgl, ml, 1.0); } } }
// set transformation matrix from global to local system void TwoNodeLink::setTranGlobalLocal() { // resize transformation matrix and zero it Tgl.resize(numDOF,numDOF); Tgl.Zero(); // switch on dimensionality of element switch (elemType) { case D1N2: Tgl(0,0) = Tgl(1,1) = trans(0,0); break; case D2N4: Tgl(0,0) = Tgl(2,2) = trans(0,0); Tgl(0,1) = Tgl(2,3) = trans(0,1); Tgl(1,0) = Tgl(3,2) = trans(1,0); Tgl(1,1) = Tgl(3,3) = trans(1,1); break; case D2N6: Tgl(0,0) = Tgl(3,3) = trans(0,0); Tgl(0,1) = Tgl(3,4) = trans(0,1); Tgl(1,0) = Tgl(4,3) = trans(1,0); Tgl(1,1) = Tgl(4,4) = trans(1,1); Tgl(2,2) = Tgl(5,5) = trans(2,2); break; case D3N6: Tgl(0,0) = Tgl(3,3) = trans(0,0); Tgl(0,1) = Tgl(3,4) = trans(0,1); Tgl(0,2) = Tgl(3,5) = trans(0,2); Tgl(1,0) = Tgl(4,3) = trans(1,0); Tgl(1,1) = Tgl(4,4) = trans(1,1); Tgl(1,2) = Tgl(4,5) = trans(1,2); Tgl(2,0) = Tgl(5,3) = trans(2,0); Tgl(2,1) = Tgl(5,4) = trans(2,1); Tgl(2,2) = Tgl(5,5) = trans(2,2); break; case D3N12: Tgl(0,0) = Tgl(3,3) = Tgl(6,6) = Tgl(9,9) = trans(0,0); Tgl(0,1) = Tgl(3,4) = Tgl(6,7) = Tgl(9,10) = trans(0,1); Tgl(0,2) = Tgl(3,5) = Tgl(6,8) = Tgl(9,11) = trans(0,2); Tgl(1,0) = Tgl(4,3) = Tgl(7,6) = Tgl(10,9) = trans(1,0); Tgl(1,1) = Tgl(4,4) = Tgl(7,7) = Tgl(10,10) = trans(1,1); Tgl(1,2) = Tgl(4,5) = Tgl(7,8) = Tgl(10,11) = trans(1,2); Tgl(2,0) = Tgl(5,3) = Tgl(8,6) = Tgl(11,9) = trans(2,0); Tgl(2,1) = Tgl(5,4) = Tgl(8,7) = Tgl(11,10) = trans(2,1); Tgl(2,2) = Tgl(5,5) = Tgl(8,8) = Tgl(11,11) = trans(2,2); break; } }