const Matrix& FiberSection3d::getInitialTangent(void) { static double kInitialData[9]; static Matrix kInitial(kInitialData, 3, 3); kInitialData[0] = 0.0; kInitialData[1] = 0.0; kInitialData[2] = 0.0; kInitialData[3] = 0.0; kInitialData[4] = 0.0; kInitialData[5] = 0.0; kInitialData[6] = 0.0; kInitialData[7] = 0.0; kInitialData[8] = 0.0; static double yLocs[10000]; static double zLocs[10000]; static double fiberArea[10000]; if (sectionIntegr != 0) { sectionIntegr->getFiberLocations(numFibers, yLocs, zLocs); sectionIntegr->getFiberWeights(numFibers, fiberArea); } else { for (int i = 0; i < numFibers; i++) { yLocs[i] = matData[3*i]; zLocs[i] = matData[3*i+1]; fiberArea[i] = matData[3*i+2]; } } for (int i = 0; i < numFibers; i++) { UniaxialMaterial *theMat = theMaterials[i]; double y = yLocs[i] - yBar; double z = zLocs[i] - zBar; double A = fiberArea[i]; double tangent = theMat->getInitialTangent(); double value = tangent * A; double vas1 = -y*value; double vas2 = z*value; double vas1as2 = vas1*z; kInitialData[0] += value; kInitialData[1] += vas1; kInitialData[2] += vas2; kInitialData[4] += vas1 * -y; kInitialData[5] += vas1as2; kInitialData[8] += vas2 * z; } kInitialData[3] = kInitialData[1]; kInitialData[6] = kInitialData[2]; kInitialData[7] = kInitialData[5]; return kInitial; }
const Matrix& FiberSection3dThermal::getInitialTangent(void) { static double kInitialData[9]; static Matrix kInitial(kInitialData, 3, 3); kInitialData[0] = 0.0; kInitialData[1] = 0.0; kInitialData[2] = 0.0; kInitialData[3] = 0.0; kInitialData[4] = 0.0; kInitialData[5] = 0.0; kInitialData[6] = 0.0; kInitialData[7] = 0.0; kInitialData[8] = 0.0; int loc = 0; for (int i = 0; i < numFibers; i++) { UniaxialMaterial *theMat = theMaterials[i]; double y = matData[loc++] - yBar; double z = matData[loc++] - zBar; double A = matData[loc++]; double tangent = theMat->getInitialTangent(); double value = tangent * A; double vas1 = y*value; double vas2 = z*value; double vas1as2 = vas1*z; kInitialData[0] += value; kInitialData[1] += vas1; kInitialData[2] += vas2; kInitialData[4] += vas1 * y; kInitialData[5] += vas1as2; kInitialData[8] += vas2 * z; } kInitialData[3] = kInitialData[1]; kInitialData[6] = kInitialData[2]; kInitialData[7] = kInitialData[5]; return kInitial; }
const Matrix& FiberSection2d::getInitialTangent(void) { static double kInitial[4]; static Matrix kInitialMatrix(kInitial, 2, 2); kInitial[0] = 0.0; kInitial[1] = 0.0; kInitial[2] = 0.0; kInitial[3] = 0.0; static double fiberLocs[10000]; static double fiberArea[10000]; if (sectionIntegr != 0) { sectionIntegr->getFiberLocations(numFibers, fiberLocs); sectionIntegr->getFiberWeights(numFibers, fiberArea); } else { for (int i = 0; i < numFibers; i++) { fiberLocs[i] = matData[2*i]; fiberArea[i] = matData[2*i+1]; } } for (int i = 0; i < numFibers; i++) { UniaxialMaterial *theMat = theMaterials[i]; double y = fiberLocs[i] - yBar; double A = fiberArea[i]; double tangent = theMat->getInitialTangent(); double ks0 = tangent * A; double ks1 = ks0 * -y; kInitial[0] += ks0; kInitial[1] += ks1; kInitial[3] += ks1 * -y; } kInitial[2] = kInitial[1]; return kInitialMatrix; }
// constructors: RCFTSTLFiberSection3D::RCFTSTLFiberSection3D(int tag, int num, Fiber **fibers, double gj): SectionForceDeformation(tag, SEC_TAG_RCFTSTLFiberSection3D), numFibers(num), theMaterials(0), matData(0), yBar(0.0), zBar(0.0), e(4), eCommit(4), GJ(gj) { ofstream stlfib; stlfib.open("stlfib.dat",ios::app); double EA = 0.0; double EQz = 0.0; double EQy = 0.0; double EIz = 0.0; double EIy = 0.0; double EIyz = 0.0; double Es = 0.0; if (numFibers != 0) { theMaterials = new UniaxialMaterial *[numFibers]; if (theMaterials == 0) { opserr << "RCFTSTLFiberSection3D::RCFTSTLFiberSection3D -- failed to allocate Material pointers\n"; exit(-1); } matData = new double [numFibers*3]; if (matData == 0) { opserr << "RCFTSTLFiberSection3D::RCFTSTLFiberSection3D -- failed to allocate double array for material data\n"; exit(-1); } double Qz = 0.0; double Qy = 0.0; double A = 0.0; for (int i = 0; i < numFibers; i++) { Fiber *theFiber = fibers[i]; double yLoc, zLoc, Area; theFiber->getFiberLocation(yLoc, zLoc); Area = theFiber->getArea(); UniaxialMaterial *theMat = theFiber->getMaterial(); stlfib<<i<<" "<<yLoc<<" "<<zLoc<<" "<<Area<<endl; Es = theMat->getInitialTangent(); Qz += yLoc*Area; Qy += zLoc*Area; A += Area; EQz += yLoc*Area*Es; EQy += zLoc*Area*Es; EA += Area*Es; EIz += yLoc*yLoc*Area*Es; EIy += zLoc*zLoc*Area*Es; EIyz += yLoc*zLoc*Area*Es; matData[i*3] = -yLoc; matData[i*3+1] = zLoc; matData[i*3+2] = Area; theMaterials[i] = theMat->getCopy(); if (theMaterials[i] == 0) { opserr << "RCFTSTLFiberSection3D::RCFTFiberSection3D -- failed to get copy of a Material\n"; exit(-1); } } yBar = -Qz/A; zBar = Qy/A; } ks.Zero(); ks(0,0) = EA; ks(0,1) = ks(1,0) = -EQz; ks(0,2) = ks(2,0) = -EQy; ks(1,1) = EIz; ks(2,2) = EIy; ks(2,1) = ks(1,2) = EIyz; ks(3,3) = GJ; //ks(0,0) = 449602.6; //ks(0,1) = ks(1,0) = 0.0; //ks(0,2) = ks(2,0) = 0.0; //ks(1,1) = 6968845.86; //ks(2,2) = 6968845.86; //ks(2,1) = ks(1,2) = 0.0; //ks(3,3) = GJ; //ks(0,0) = 1000.0; //ks(0,1) = ks(1,0) = 0.0; //ks(0,2) = ks(2,0) = 0.0; //ks(1,1) = 1.0; //ks(2,2) = 1.0; //ks(2,1) = ks(1,2) = 0.0; //ks(3,3) = GJ; //ks(0,0) = 300000.0; //ks(0,1) = ks(1,0) = 0.0; //ks(0,2) = ks(2,0) = 0.0; //ks(1,1) = 3000000.0; //ks(2,2) = 3000000.0; //ks(2,1) = ks(1,2) = 0.0; //ks(3,3) = GJ; //ks(0,0) = 43200000.0; //ks(0,1) = ks(1,0) = 0.0; //ks(0,2) = ks(2,0) = 0.0; //ks(1,1) = 14400000.0; //ks(2,2) = 14400000.0; //ks(2,1) = ks(1,2) = 0.0; //ks(3,3) = GJ; //ks(0,0) = 449509.3; //ks(0,1) = ks(1,0) = 0.0; //ks(0,2) = ks(2,0) = 0.0; //ks(1,1) = 6967684.16; //ks(2,2) = 6967684.16; //ks(2,1) = ks(1,2) = 0.0; //ks(3,3) = GJ; sData[0] = 0.0; sData[1] = 0.0; sData[2] = 0.0; kData[0] = EA; kData[1] = -EQz; kData[2] = EIyz; kData[3] = 0.0; kData[4] = -EQz; kData[5] = EIz; kData[6] = -EQy; kData[7] = 0.0; kData[8] = EIyz; kData[9] = -EQy; kData[10] = EIy; kData[11] = 0.0; kData[12] = 0.0; kData[13] = 0.0; kData[14] = 0.0; kData[15] = GJ; //kData[0] = 43200000.0; //kData[1] = 0.0; //kData[2] = 0.0; //kData[3] = 0.0; //kData[4] = 0.0; //kData[5] = 14400000.0; //kData[6] = 0.0; //kData[7] = 0.0; //kData[8] = 0.0; //kData[9] = 0.0; //kData[10] = 14400000.0; //kData[11] = 0.0; //kData[12] = 0.0; //kData[13] = 0.0; //kData[14] = 0.0; //kData[15] = GJ; code(0) = SECTION_RESPONSE_P; code(1) = SECTION_RESPONSE_MZ; code(2) = SECTION_RESPONSE_MY; code(3) = SECTION_RESPONSE_T; }
const Matrix& RCFTSTLFiberSection3D::getInitialTangent(void) { kData[0] = 0.0; kData[1] = 0.0; kData[2] = 0.0; kData[3] = 0.0; kData[4] = 0.0; kData[5] = 0.0; kData[6] = 0.0; kData[7] = 0.0; kData[8] = 0.0; kData[9] = 0.0; kData[10] = 0.0; kData[11] = 0.0; kData[12] = 0.0; kData[13] = 0.0; kData[14] = 0.0; kData[15] = 0.0; sData[0] = 0.0; sData[1] = 0.0; sData[2] = 0.0; int loc = 0; for (int i = 0; i < numFibers; i++) { UniaxialMaterial *theMat = theMaterials[i]; double y = matData[loc++]; //- yBar; double z = matData[loc++]; //- zBar; double A = matData[loc++]; double tangent = theMat->getInitialTangent(); double value = tangent * A; double vas1 = y*value; double vas2 = z*value; double vas1as2 = vas1*z; double vas2as2 = vas2*z; double vas1as1 = vas1*y; kData[0] += value; kData[1] -= vas1; kData[1] = 0.0; kData[2] -= vas2; kData[2] = 0.0; kData[3] = 0.0; kData[4] -= vas1; kData[4] = 0.0; kData[5] += vas1as1; kData[6] += vas1as2; kData[6] = 0.0; kData[7] = 0.0; kData[8] -= vas2; kData[8] = 0.0; kData[9] += vas1as2; kData[9] = 0.0; kData[10]+= vas2as2; kData[11] = 0.0; kData[12] = 0.0; kData[13] = 0.0; kData[14] = 0.0; kData[15] = GJ; } ks(0,0) = kData[0]; ks(0,1) = ks(1,0) = kData[1]; ks(0,2) = ks(2,0) = kData[2]; ks(1,1) = kData[5]; ks(1,2) = ks(2,1) = kData[6]; ks(2,2) = kData[10]; ks(3,3) = GJ; return ks; }