int TransformationFE::setID(void) { // determine number of DOF numTransformedDOF = 0; for (int ii=0; ii<numGroups; ii++) { DOF_Group *dofPtr = theDOFs[ii]; numTransformedDOF += dofPtr->getNumDOF(); } // create an ID to hold the array, cannot use existing as // may be different size if (modID != 0) delete modID; modID = 0; modID = new ID(numTransformedDOF); if (modID == 0 || modID->Size() == 0) { opserr << "TransformationFE::setID() "; opserr << " ran out of memory for ID of size :"; opserr << numTransformedDOF << endln; exit(-1); } // fill in the ID int current = 0; for (int i=0; i<numGroups; i++) { DOF_Group *dofPtr = theDOFs[i]; const ID &theDOFid = dofPtr->getID(); for (int j=0; j<theDOFid.Size(); j++) if (current < numTransformedDOF) (*modID)(current++) = theDOFid(j); else { opserr << "WARNING TransformationFE::setID() - numDOF and"; opserr << " number of dof at the DOF_Groups\n"; return -3; } } // set the pointers to the modified tangent matrix and residual vector if (numTransformedDOF <= MAX_NUM_DOF) { // use class wide objects if (modVectors[numTransformedDOF] == 0) { modVectors[numTransformedDOF] = new Vector(numTransformedDOF); modMatrices[numTransformedDOF] = new Matrix(numTransformedDOF,numTransformedDOF); modResidual = modVectors[numTransformedDOF]; modTangent = modMatrices[numTransformedDOF]; if (modResidual == 0 || modResidual->Size() != numTransformedDOF || modTangent == 0 || modTangent->noCols() != numTransformedDOF) { opserr << "TransformationFE::setID() "; opserr << " ran out of memory for vector/Matrix of size :"; opserr << numTransformedDOF << endln; exit(-1); } } else { modResidual = modVectors[numTransformedDOF]; modTangent = modMatrices[numTransformedDOF]; } } else { // create matrices and vectors for each object instance modResidual = new Vector(numTransformedDOF); modTangent = new Matrix(numTransformedDOF, numTransformedDOF); if (modResidual == 0 || modResidual->Size() ==0 || modTangent ==0 || modTangent->noRows() ==0) { opserr << "TransformationFE::setID() "; opserr << " ran out of memory for vector/Matrix of size :"; opserr << numTransformedDOF << endln; exit(-1); } } return 0; }