int DispBeamColumn2d::recvSelf(int commitTag, Channel &theChannel, FEM_ObjectBroker &theBroker) { // // receive the integer data containing tag, numSections and coord transformation info // int dbTag = this->getDbTag(); int i; static Vector data(14); if (theChannel.recvVector(dbTag, commitTag, data) < 0) { opserr << "DispBeamColumn2d::recvSelf() - failed to recv data Vector\n"; return -1; } this->setTag((int)data(0)); connectedExternalNodes(0) = (int)data(1); connectedExternalNodes(1) = (int)data(2); int nSect = (int)data(3); int crdTransfClassTag = (int)data(4); int crdTransfDbTag = (int)data(5); int beamIntClassTag = (int)data(6); int beamIntDbTag = (int)data(7); rho = data(8); cMass = (int)data(9); alphaM = data(10); betaK = data(11); betaK0 = data(12); betaKc = data(13); // create a new crdTransf object if one needed if (crdTransf == 0 || crdTransf->getClassTag() != crdTransfClassTag) { if (crdTransf != 0) delete crdTransf; crdTransf = theBroker.getNewCrdTransf(crdTransfClassTag); if (crdTransf == 0) { opserr << "DispBeamColumn2d::recvSelf() - failed to obtain a CrdTrans object with classTag " << crdTransfClassTag << endln; return -2; } } crdTransf->setDbTag(crdTransfDbTag); // invoke recvSelf on the crdTransf object if (crdTransf->recvSelf(commitTag, theChannel, theBroker) < 0) { opserr << "DispBeamColumn2d::sendSelf() - failed to recv crdTranf\n"; return -3; } // create a new beamInt object if one needed if (beamInt == 0 || beamInt->getClassTag() != beamIntClassTag) { if (beamInt != 0) delete beamInt; beamInt = theBroker.getNewBeamIntegration(beamIntClassTag); if (beamInt == 0) { opserr << "DispBeamColumn2d::recvSelf() - failed to obtain the beam integration object with classTag" << beamIntClassTag << endln; exit(-1); } } beamInt->setDbTag(beamIntDbTag); // invoke recvSelf on the beamInt object if (beamInt->recvSelf(commitTag, theChannel, theBroker) < 0) { opserr << "DispBeamColumn2d::sendSelf() - failed to recv beam integration\n"; return -3; } // // recv an ID for the sections containing each sections dbTag and classTag // ID idSections(2*nSect); int loc = 0; if (theChannel.recvID(dbTag, commitTag, idSections) < 0) { opserr << "DispBeamColumn2d::recvSelf() - failed to recv ID data\n"; return -1; } // // now receive the sections // if (numSections != nSect) { // // we do not have correct number of sections, must delete the old and create // new ones before can recvSelf on the sections // // delete the old if (numSections != 0) { for (int i=0; i<numSections; i++) delete theSections[i]; delete [] theSections; } // create a new array to hold pointers theSections = new SectionForceDeformation *[nSect]; if (theSections == 0) { opserr << "DispBeamColumn2d::recvSelf() - out of memory creating sections array of size " << nSect << endln; return -1; } // create a section and recvSelf on it numSections = nSect; loc = 0; for (i=0; i<numSections; i++) { int sectClassTag = idSections(loc); int sectDbTag = idSections(loc+1); loc += 2; theSections[i] = theBroker.getNewSection(sectClassTag); if (theSections[i] == 0) { opserr << "DispBeamColumn2d::recvSelf() - Broker could not create Section of class type " << sectClassTag << endln; exit(-1); } theSections[i]->setDbTag(sectDbTag); if (theSections[i]->recvSelf(commitTag, theChannel, theBroker) < 0) { opserr << "DispBeamColumn2d::recvSelf() - section " << i << " failed to recv itself\n"; return -1; } } } else { // // for each existing section, check it is of correct type // (if not delete old & create a new one) then recvSelf on it // loc = 0; for (i=0; i<numSections; i++) { int sectClassTag = idSections(loc); int sectDbTag = idSections(loc+1); loc += 2; // check of correct type if (theSections[i]->getClassTag() != sectClassTag) { // delete the old section[i] and create a new one delete theSections[i]; theSections[i] = theBroker.getNewSection(sectClassTag); if (theSections[i] == 0) { opserr << "DispBeamColumn2d::recvSelf() - Broker could not create Section of class type " << sectClassTag << endln; exit(-1); } } // recvSelf on it theSections[i]->setDbTag(sectDbTag); if (theSections[i]->recvSelf(commitTag, theChannel, theBroker) < 0) { opserr << "DispBeamColumn2d::recvSelf() - section " << i << " failed to recv itself\n"; return -1; } } } return 0; }
int TrussSection::recvSelf(int commitTag, Channel &theChannel, FEM_ObjectBroker &theBroker) { int res; int dataTag = this->getDbTag(); // truss creates a Vector, receives the Vector and then sets the // internal data with the data in the Vector static Vector data(11); res = theChannel.recvVector(dataTag, commitTag, data); if (res < 0) { opserr << "WARNING TrussSection::recvSelf() - failed to receive Vector\n"; return -1; } this->setTag((int)data(0)); dimension = (int)data(1); numDOF = (int)data(2); rho = data(5); doRayleighDamping = (int)data(6); cMass = (int)data(7); initialDisp = new double[dimension]; for (int i=0; i<dimension; i++) initialDisp[i] = 0.0; int initial = 0; for (int i=0; i<dimension; i++) { if (data(8+i) != 0.0) { initial = 1; } } if (initial != 0) { for (int i=0; i<dimension; i++) { initialDisp[i] = data(8+i); } } // truss now receives the tags of it's two external nodes res = theChannel.recvID(dataTag, commitTag, connectedExternalNodes); if (res < 0) { opserr << "WARNING TrussSection::recvSelf() - " << this->getTag() << " failed to receive ID\n"; return -2; } // finally truss creates a new section object of the correct type, // sets its database tag and asks this new object to recveive itself. int sectClass = (int)data(3); int sectDb = (int)data(4); // Get new section if null if (theSection == 0) theSection = theBroker.getNewSection(sectClass); // Check that section is of right type else if (theSection->getClassTag() != sectClass) { delete theSection; theSection = theBroker.getNewSection(sectClass); } // Check if either allocation failed if (theSection == 0) { opserr << "WARNING TrussSection::recvSelf() - " << this->getTag() << " failed to get a blank Section of type " << sectClass << endln; return -3; } theSection->setDbTag(sectDb); // note: we set the dbTag before we receive the Section res = theSection->recvSelf(commitTag, theChannel, theBroker); if (res < 0) { opserr << "WARNING TrussSection::recvSelf() - " << this->getTag() << " failed to receive its Section\n"; return -3; } return 0; }
int ShellMITC9::recvSelf (int commitTag,Channel &theChannel, FEM_ObjectBroker &theBroker) { int res = 0; int dataTag = this->getDbTag(); static ID idData(27); // Quad now receives the tags of its four external nodes res += theChannel.recvID(dataTag, commitTag, idData); if (res < 0) { opserr << "WARNING ShellMITC9::recvSelf() - " << this->getTag() << " failed to receive ID\n"; return res; } this->setTag(idData(18)); connectedExternalNodes(0) = idData(19); connectedExternalNodes(1) = idData(20); connectedExternalNodes(2) = idData(21); connectedExternalNodes(3) = idData(22); connectedExternalNodes(4) = idData(23); connectedExternalNodes(5) = idData(24); connectedExternalNodes(6) = idData(25); connectedExternalNodes(7) = idData(26); connectedExternalNodes(8) = idData(27); static Vector vectData(5); res += theChannel.recvVector(dataTag, commitTag, vectData); if (res < 0) { opserr << "WARNING ShellMITC9::sendSelf() - " << this->getTag() << " failed to send ID\n"; return res; } Ktt = vectData(0); alphaM = vectData(1); betaK = vectData(2); betaK0 = vectData(3); betaKc = vectData(4); int i; if (materialPointers[0] == 0) { for (i = 0; i < 9; i++) { int matClassTag = idData(i); int matDbTag = idData(i+9); // Allocate new material with the sent class tag materialPointers[i] = theBroker.getNewSection(matClassTag); if (materialPointers[i] == 0) { opserr << "ShellMITC9::recvSelf() - Broker could not create NDMaterial of class type" << matClassTag << endln;; return -1; } // Now receive materials into the newly allocated space materialPointers[i]->setDbTag(matDbTag); res += materialPointers[i]->recvSelf(commitTag, theChannel, theBroker); if (res < 0) { opserr << "ShellMITC9::recvSelf() - material " << i << "failed to recv itself\n"; return res; } } } // Number of materials is the same, receive materials into current space else { for (i = 0; i < 9; i++) { int matClassTag = idData(i); int matDbTag = idData(i+9); // Check that material is of the right type; if not, // delete it and create a new one of the right type if (materialPointers[i]->getClassTag() != matClassTag) { delete materialPointers[i]; materialPointers[i] = theBroker.getNewSection(matClassTag); if (materialPointers[i] == 0) { opserr << "ShellMITC9::recvSelf() - Broker could not create NDMaterial of class type" << matClassTag << endln; exit(-1); } } // Receive the material materialPointers[i]->setDbTag(matDbTag); res += materialPointers[i]->recvSelf(commitTag, theChannel, theBroker); if (res < 0) { opserr << "ShellMITC9::recvSelf() - material " << i << "failed to recv itself\n"; return res; } } } return res; }
int SectionAggregator::recvSelf(int cTag, Channel &theChannel, FEM_ObjectBroker &theBroker) { int res = 0; // Create an ID and receive tag and section order static ID data(5); res += theChannel.recvID(this->getDbTag(), cTag, data); if (res < 0) { opserr << "SectionAggregator::recvSelf -- could not receive data ID\n"; return res; } this->setTag(data(0)); otherDbTag = data(1); int order = data(2); int theSectionOrder = data(3); numMats = data(4); if (order > 0) { if (e == 0 || e->Size() != order) { if (e != 0) { delete e; delete s; delete ks; delete fs; delete theCode; } e = new Vector(workArea, order); s = new Vector(&workArea[maxOrder], order); ks = new Matrix(&workArea[2*maxOrder], order, order); fs = new Matrix(&workArea[maxOrder*(maxOrder+2)], order, order); theCode = new ID(codeArea, order); } } if (numMats > 0) { if (matCodes == 0 || matCodes->Size() != numMats) { if (matCodes != 0) delete matCodes; matCodes = new ID(numMats); } } // Determine how many classTags there are and allocate ID vector int numTags = (theSectionOrder == 0) ? numMats : numMats + 1; ID classTags(numTags*2 + numMats); // Receive the material class and db tags res += theChannel.recvID(otherDbTag, cTag, classTags); if (res < 0) { opserr << "SectionAggregator::recvSelf -- could not receive classTags ID\n"; return res; } // Check if null pointer, allocate if so if (theAdditions == 0) { theAdditions = new UniaxialMaterial *[numMats]; if (theAdditions == 0) { opserr << "SectionAggregator::recvSelf -- could not allocate UniaxialMaterial array\n"; return -1; } // Set pointers to null ... will get allocated by theBroker for (int j = 0; j < numMats; j++) theAdditions[j] = 0; } // Loop over the UniaxialMaterials int i, classTag; for (i = 0; i < numMats; i++) { classTag = classTags(i); // Check if the UniaxialMaterial is null; if so, get a new one if (theAdditions[i] == 0) theAdditions[i] = theBroker.getNewUniaxialMaterial(classTag); // Check that the UniaxialMaterial is of the right type; if not, delete // the current one and get a new one of the right type else if (theAdditions[i]->getClassTag() != classTag) { delete theAdditions[i]; theAdditions[i] = theBroker.getNewUniaxialMaterial(classTag); } // Check if either allocation failed if (theAdditions[i] == 0) { opserr << "SectionAggregator::recvSelf -- could not get UniaxialMaterial, i = " << i << endln; return -1; } // Now, receive the UniaxialMaterial theAdditions[i]->setDbTag(classTags(i+numTags)); res += theAdditions[i]->recvSelf(cTag, theChannel, theBroker); if (res < 0) { opserr << "SectionAggregator::recvSelf -- could not receive UniaxialMaterial, i = " << i << endln; return res; } } // If there is no Section to receive, return if (theSectionOrder == 0) return res; classTag = classTags(numTags-1); // Check if the Section is null; if so, get a new one if (theSection == 0) theSection = theBroker.getNewSection(classTag); // Check that the Section is of the right type; if not, delete // the current one and get a new one of the right type else if (theSection->getClassTag() != classTag) { delete theSection; theSection = theBroker.getNewSection(classTag); } // Check if either allocation failed if (theSection == 0) { opserr << "SectionAggregator::recvSelf -- could not get a SectionForceDeformation\n"; return -1; } // Now, receive the Section theSection->setDbTag(classTags(2*numTags-1)); res += theSection->recvSelf(cTag, theChannel, theBroker); if (res < 0) { opserr << "SectionAggregator::recvSelf -- could not receive SectionForceDeformation\n"; return res; } // Fill in the section code int j = 2*numTags; for (i = 0; i < numMats; i++, j++) (*matCodes)(i) = classTags(j); return res; }
int ZeroLengthSection::recvSelf(int commitTag, Channel &theChannel, FEM_ObjectBroker &theBroker) { int res = 0; int dataTag = this->getDbTag(); // ZeroLengthSection creates an ID, receives the ID and then sets the // internal data with the data in the ID static ID idData(9); res += theChannel.recvID(dataTag, commitTag, idData); if (res < 0) { opserr << "ZeroLengthSection::recvSelf -- failed to receive ID data\n"; return res; } res += theChannel.recvMatrix(dataTag, commitTag, transformation); if (res < 0) { opserr << "ZeroLengthSection::recvSelf -- failed to receive transformation Matrix\n"; return res; } this->setTag(idData(0)); dimension = idData(1); numDOF = idData(2); connectedExternalNodes(0) = idData(4); connectedExternalNodes(1) = idData(5); useRayleighDamping =idData(8); // Check that there is correct number of materials, reallocate if needed if (order != idData(3)) { order = idData(3); // Allocate transformation matrix if (A != 0) delete A; A = new Matrix(order, numDOF); if (A == 0) { opserr << "ZeroLengthSection::recvSelf -- failed to allocate transformation Matrix\n"; exit(-1); } // Allocate section deformation vector if (v != 0) delete v; v = new Vector(order); if (v == 0) { opserr << "ZeroLengthSection::recvSelf -- failed to allocate deformation Vector\n"; exit(-1); } if (numDOF == 6) { P = &P6; K = &K6; } else { P = &P12; K = &K12; } } int secClassTag = idData(6); // If null, get a new one from the broker if (theSection == 0) theSection = theBroker.getNewSection(secClassTag); // If wrong type, get a new one from the broker if (theSection->getClassTag() != secClassTag) { delete theSection; theSection = theBroker.getNewSection(secClassTag); } // Check if either allocation failed from broker if (theSection == 0) { opserr << "ZeroLengthSection::recvSelf -- failed to allocate new Section\n"; return -1; } // Receive the section theSection->setDbTag(idData(7)); res += theSection->recvSelf(commitTag, theChannel, theBroker); if (res < 0) { opserr << "ZeroLengthSection::recvSelf -- failed to receive Section\n"; return res; } return res; }