PenaltyMP_FE::PenaltyMP_FE(int tag, Domain &theDomain, MP_Constraint &TheMP, double Alpha) :FE_Element(tag, 2,(TheMP.getConstrainedDOFs()).Size()+ (TheMP.getRetainedDOFs()).Size()), theMP(&TheMP), theConstrainedNode(0) , theRetainedNode(0), tang(0), resid(0), C(0), alpha(Alpha) { int size; const ID &id1 = theMP->getConstrainedDOFs(); size = id1.Size(); const ID &id2 = theMP->getRetainedDOFs(); size += id2.Size(); tang = new Matrix(size,size); resid = new Vector(size); C = new Matrix(id1.Size(),size); if (tang == 0 || resid == 0 || C == 0 || tang->noCols() != size || C->noCols() != size || resid->Size() != size) { opserr << "FATAL PenaltyMP_FE::PenaltyMP_FE() - out of memory\n"; exit(-1); } theRetainedNode = theDomain.getNode(theMP->getNodeRetained()); theConstrainedNode = theDomain.getNode(theMP->getNodeConstrained()); if (theRetainedNode == 0 || theConstrainedNode == 0) { opserr << "FATAL PenaltyMP_FE::PenaltyMP_FE() - Constrained or Retained"; opserr << " Node does not exist in Domain\n"; opserr << theMP->getNodeRetained() << " " << theMP->getNodeConstrained() << endln; exit(-1); } // set up the dof groups tags DOF_Group *dofGrpPtr = 0; dofGrpPtr = theRetainedNode->getDOF_GroupPtr(); if (dofGrpPtr != 0) myDOF_Groups(0) = dofGrpPtr->getTag(); else opserr << "WARNING PenaltyMP_FE::PenaltyMP_FE() - node no Group yet?\n"; dofGrpPtr = theConstrainedNode->getDOF_GroupPtr(); if (dofGrpPtr != 0) myDOF_Groups(1) = dofGrpPtr->getTag(); else opserr << "WARNING PenaltyMP_FE::PenaltyMP_FE() - node no Group yet?\n"; if (theMP->isTimeVarying() == false) { this->determineTangent(); // we can free up the space taken by C as it is no longer needed if (C != 0) delete C; C = 0; } }
LagrangeSP_FE::LagrangeSP_FE(int tag, Domain &theDomain, SP_Constraint &TheSP, DOF_Group &theGroup, double Alpha) :FE_Element(tag, 2,2), alpha(Alpha), tang(0), resid(0), theSP(&TheSP), theDofGroup(&theGroup) { // create a Matrix and a Vector for the tangent and residual tang = new Matrix(2,2); resid = new Vector(2); if ((tang == 0) || (tang->noCols() == 0) || (resid == 0) || (resid->Size() == 0)) { opserr << "WARNING LagrangeSP_FE::LagrangeSP_FE()"; opserr << "- ran out of memory\n"; exit(-1); } // zero the Matrix and Vector resid->Zero(); tang->Zero(); theNode = theDomain.getNode(theSP->getNodeTag()); if (theNode == 0) { opserr << "WARNING LagrangeSP_FE::LagrangeSP_FE()"; opserr << "- no asscoiated Node\n"; exit(-1); } // set the tangent (*tang)(0,1) = alpha; (*tang)(1,0) = alpha; // set the myDOF_Groups tags indicating the attached id's of the // DOF_Group objects DOF_Group *theNodesDOFs = theNode->getDOF_GroupPtr(); if (theNodesDOFs == 0) { opserr << "WARNING LagrangeSP_FE::LagrangeSP_FE()"; opserr << " - no DOF_Group with Constrained Node\n"; exit(-1); } myDOF_Groups(0) = theNodesDOFs->getTag(); myDOF_Groups(1) = theDofGroup->getTag(); }
// void setID(int index, int value); // Method to set the correMPonding index of the ID to value. int PenaltyMP_FE::setID(void) { int result = 0; // first determine the IDs in myID for those DOFs marked // as constrained DOFs, this is obtained from the DOF_Group // associated with the constrained node DOF_Group *theConstrainedNodesDOFs = theConstrainedNode->getDOF_GroupPtr(); if (theConstrainedNodesDOFs == 0) { opserr << "WARNING PenaltyMP_FE::setID(void)"; opserr << " - no DOF_Group with Constrained Node\n"; return -2; } const ID &constrainedDOFs = theMP->getConstrainedDOFs(); const ID &theConstrainedNodesID = theConstrainedNodesDOFs->getID(); int size1 = constrainedDOFs.Size(); for (int i=0; i<size1; i++) { int constrained = constrainedDOFs(i); if (constrained < 0 || constrained >= theConstrainedNode->getNumberDOF()) { opserr << "WARNING PenaltyMP_FE::setID(void) - unknown DOF "; opserr << constrained << " at Node\n"; myID(i) = -1; // modify so nothing will be added to equations result = -3; } else { if (constrained >= theConstrainedNodesID.Size()) { opserr << "WARNING PenaltyMP_FE::setID(void) - "; opserr << " Nodes DOF_Group too small\n"; myID(i) = -1; // modify so nothing will be added to equations result = -4; } else myID(i) = theConstrainedNodesID(constrained); } } // now determine the IDs for the retained dof's DOF_Group *theRetainedNodesDOFs = theRetainedNode->getDOF_GroupPtr(); if (theRetainedNodesDOFs == 0) { opserr << "WARNING PenaltyMP_FE::setID(void)"; opserr << " - no DOF_Group with Retained Node\n"; return -2; } const ID &RetainedDOFs = theMP->getRetainedDOFs(); const ID &theRetainedNodesID = theRetainedNodesDOFs->getID(); int size2 = RetainedDOFs.Size(); for (int j=0; j<size2; j++) { int retained = RetainedDOFs(j); if (retained < 0 || retained >= theRetainedNode->getNumberDOF()) { opserr << "WARNING PenaltyMP_FE::setID(void) - unknown DOF "; opserr << retained << " at Node\n"; myID(j+size1) = -1; // modify so nothing will be added result = -3; } else { if (retained >= theRetainedNodesID.Size()) { opserr << "WARNING PenaltyMP_FE::setID(void) - "; opserr << " Nodes DOF_Group too small\n"; myID(j+size1) = -1; // modify so nothing will be added result = -4; } else myID(j+size1) = theRetainedNodesID(retained); } } myDOF_Groups(0) = theConstrainedNodesDOFs->getTag(); myDOF_Groups(1) = theRetainedNodesDOFs->getTag(); return result; }
Graph & AnalysisModel::getDOFGroupGraph(void) { if (myGroupGraph == 0) { int numVertex = this->getNumDOF_Groups(); if (numVertex == 0) { opserr << "WARNING AnalysisMode::getGroupGraph"; opserr << " - 0 vertices, has the Domain been populated?\n"; exit(-1); } // myGroupGraph = new Graph(numVertex); MapOfTaggedObjects *graphStorage = new MapOfTaggedObjects(); myGroupGraph = new Graph(*graphStorage); if (numVertex == 0) { opserr << "WARNING AnalysisMode::getGroupGraph"; opserr << " - out of memory\n"; exit(-1); } DOF_Group *dofPtr; // now create the vertices with a reference equal to the DOF_Group number. // and a tag which ranges from 0 through numVertex-1 DOF_GrpIter &dofIter2 = this->getDOFs(); int count = START_VERTEX_NUM; while ((dofPtr = dofIter2()) != 0) { int DOF_GroupTag = dofPtr->getTag(); int DOF_GroupNodeTag = dofPtr->getNodeTag(); int numDOF = dofPtr->getNumFreeDOF(); Vertex *vertexPtr = new Vertex(DOF_GroupTag, DOF_GroupNodeTag, 0, numDOF); if (vertexPtr == 0) { opserr << "WARNING DOF_GroupGraph::DOF_GroupGraph"; opserr << " - Not Enough Memory to create "; opserr << count << "th Vertex\n"; return *myGroupGraph; } myGroupGraph->addVertex(vertexPtr); } // now add the edges, by looping over the Elements, getting their // IDs and adding edges between DOFs for equation numbers >= START_EQN_NUM FE_Element *elePtr; FE_EleIter &eleIter = this->getFEs(); while((elePtr = eleIter()) != 0) { const ID &id = elePtr->getDOFtags(); int size = id.Size(); for (int i=0; i<size; i++) { int dof1 = id(i); for (int j=0; j<size; j++) if (i != j) { int dof2 = id(j); myGroupGraph->addEdge(dof1,dof2); } } } } return *myGroupGraph; }