int ON_Mesh::GetConnectedComponents( bool bUseVertexConnections, bool bTopologicalConnections, ON_SimpleArray<int>& facet_component_labels ) const { int i, facecount = m_F.Count(), meshidx = 0; //This array will act as an associative array to m_F since ON_MeshFace do not have something //like m_trim_user_i on a ON_BrepTrim. It will have the indice of the final mesh the face //belongs to. if (facecount != facet_component_labels.Count()) { facet_component_labels.Reserve(facecount); facet_component_labels.SetCount(facecount); } //initialize to 0 facet_component_labels.MemSet(0); ON_SimpleArray<int> DupFaceArray(facecount); DupFaceArray.SetCount(facecount); const ON_MeshTopology& Top = Topology(); if (!Top.IsValid()) return 0; ON_SimpleArray<int> FacesToCheck; FacesToCheck.Reserve(64); i = 0; while (i < facecount) { meshidx++; FacesToCheck.Append(i); while(0 != FacesToCheck.Count()) { //Figure out which faces are connected to each other FindAdjacentFaces(Top, FacesToCheck, facet_component_labels, DupFaceArray, bUseVertexConnections, bTopologicalConnections); int j; for (j=0;j<FacesToCheck.Count();j++) facet_component_labels[FacesToCheck[j]] = meshidx; } for(;i<facecount;i++) { if (0 == facet_component_labels[i]) break; } } return meshidx; }
void TPZHierarquicalGrid::CreateGeometricElement(int n, int iel,int eldim, int elmatid, int &elid) { int jump = fBase->NNodes(); int dim = fBase->Dimension(); TPZGeoEl *gel = fBase->ElementVec()[iel]; int gelNodes = gel->NNodes(); // Computing current topology TPZManVector<int64_t,10> CTopology(gelNodes); for(int inode = 0; inode < CTopology.size(); inode++) { CTopology[inode] = gel->Node(inode).Id(); } bool Is1D = false; bool Is2D = false; bool Is3D = false; for(int il = 1; il < (n+1); il++ ) { switch (eldim) { case 0: { //Defining boundaries if (dim==0) { if (il==1){ TPZVec<int64_t> Topology(gelNodes); Topology[0]=fComputedGeomesh->NodeVec()[CTopology[0] + (il - 1) * jump].Id(); new TPZGeoElRefPattern < pzgeom::TPZGeoPoint > (elid++, Topology, ffrontMatID,*fComputedGeomesh); } if (il==n) { TPZVec<int64_t> Topology(gelNodes); Topology[0]=fComputedGeomesh->NodeVec()[CTopology[0] + (il - 0) * jump].Id(); new TPZGeoElRefPattern < pzgeom::TPZGeoPoint > (elid++, Topology, fbackMatID,*fComputedGeomesh); } } // if (dim==1) { // if (il==1){ // TPZVec<int64_t> Topology(gelNodes+1); // Topology[0]=fComputedGeomesh->NodeVec()[CTopology[0] + (il - 1) * jump].Id(); // Topology[1]=fComputedGeomesh->NodeVec()[CTopology[0] + (il - 0) * jump].Id(); // new TPZGeoElRefPattern < pzgeom::TPZGeoLinear > (elid++, Topology, elmatid,*fComputedGeomesh); // } // if (il==n) // { // TPZVec<int64_t> Topology(gelNodes+1); // Topology[0]=fComputedGeomesh->NodeVec()[CTopology[0] + (il - 1) * jump].Id(); // Topology[1]=fComputedGeomesh->NodeVec()[CTopology[0] + (il - 0) * jump].Id(); // new TPZGeoElRefPattern < pzgeom::TPZGeoLinear > (elid++, Topology, elmatid,*fComputedGeomesh); // // } // } TPZVec<int64_t> Topology(gelNodes+1); Topology[0]=fComputedGeomesh->NodeVec()[CTopology[0] + (il - 1) * jump].Id(); Topology[1]=fComputedGeomesh->NodeVec()[CTopology[0] + (il - 0) * jump].Id(); new TPZGeoElRefPattern < pzgeom::TPZGeoLinear > (elid++, Topology, elmatid,*fComputedGeomesh); Is1D = true; } break; case 1: { if (dim==1) { if (il==1){ TPZVec<int64_t> Topology(gelNodes+1); Topology[0]=fComputedGeomesh->NodeVec()[CTopology[0] + (il - 1) * jump].Id(); Topology[1]=fComputedGeomesh->NodeVec()[CTopology[1] + (il - 1) * jump].Id(); new TPZGeoElRefPattern < pzgeom::TPZGeoLinear > (elid++, Topology, ffrontMatID,*fComputedGeomesh); } if (il==n) { TPZVec<int64_t> Topology(gelNodes+1); Topology[0]=fComputedGeomesh->NodeVec()[CTopology[0] + (il - 0) * jump].Id(); Topology[1]=fComputedGeomesh->NodeVec()[CTopology[1] + (il - 0) * jump].Id(); new TPZGeoElRefPattern < pzgeom::TPZGeoLinear > (elid++, Topology, fbackMatID,*fComputedGeomesh); } } if (fIsQuad) { // quadrilateras TPZVec<int64_t> Topology(gelNodes+2); Topology[0]=fComputedGeomesh->NodeVec()[CTopology[0] + (il - 1) * jump].Id(); Topology[1]=fComputedGeomesh->NodeVec()[CTopology[1] + (il - 1) * jump].Id(); Topology[2]=fComputedGeomesh->NodeVec()[CTopology[1] + (il - 0) * jump].Id(); Topology[3]=fComputedGeomesh->NodeVec()[CTopology[0] + (il - 0) * jump].Id(); new TPZGeoElRefPattern < pzgeom::TPZGeoQuad > (elid++, Topology, elmatid,*fComputedGeomesh); } else { // triangles TPZVec<int64_t> Topology(gelNodes+1); Topology[0]=fComputedGeomesh->NodeVec()[CTopology[0] + (il - 1) * jump].Id(); Topology[1]=fComputedGeomesh->NodeVec()[CTopology[1] + (il - 1) * jump].Id(); Topology[2]=fComputedGeomesh->NodeVec()[CTopology[0] + (il - 0) * jump].Id(); new TPZGeoElRefPattern < pzgeom::TPZGeoTriangle > (elid++, Topology, elmatid,*fComputedGeomesh); Topology[0]=fComputedGeomesh->NodeVec()[CTopology[1] + (il - 1) * jump].Id(); Topology[1]=fComputedGeomesh->NodeVec()[CTopology[1] + (il - 0) * jump].Id(); Topology[2]=fComputedGeomesh->NodeVec()[CTopology[0] + (il - 0) * jump].Id(); new TPZGeoElRefPattern < pzgeom::TPZGeoTriangle > (elid++, Topology, elmatid,*fComputedGeomesh); } Is2D = true; } break; case 2: { if (dim==2) { if (il==1){ if (gel->Type() == EQuadrilateral) { // quadrilateras TPZVec<int64_t> Topology(gelNodes+2); Topology[0]=fComputedGeomesh->NodeVec()[CTopology[0] + (il - 1) * jump].Id(); Topology[1]=fComputedGeomesh->NodeVec()[CTopology[1] + (il - 1) * jump].Id(); Topology[2]=fComputedGeomesh->NodeVec()[CTopology[2] + (il - 1) * jump].Id(); Topology[3]=fComputedGeomesh->NodeVec()[CTopology[3] + (il - 1) * jump].Id(); new TPZGeoElRefPattern < pzgeom::TPZGeoQuad > (elid++, Topology, ffrontMatID,*fComputedGeomesh); } else{ // triangles TPZVec<int64_t> Topology(gelNodes+1); Topology[0]=fComputedGeomesh->NodeVec()[CTopology[0] + (il - 1) * jump].Id(); Topology[1]=fComputedGeomesh->NodeVec()[CTopology[1] + (il - 1) * jump].Id(); Topology[2]=fComputedGeomesh->NodeVec()[CTopology[2] + (il - 1) * jump].Id(); new TPZGeoElRefPattern < pzgeom::TPZGeoTriangle > (elid++, Topology, ffrontMatID,*fComputedGeomesh); } } if (il==n) { if (gel->Type() == EQuadrilateral) { // quadrilateras TPZVec<int64_t> Topology(gelNodes+2); Topology[0]=fComputedGeomesh->NodeVec()[CTopology[0] + (il - 0) * jump].Id(); Topology[1]=fComputedGeomesh->NodeVec()[CTopology[1] + (il - 0) * jump].Id(); Topology[2]=fComputedGeomesh->NodeVec()[CTopology[2] + (il - 0) * jump].Id(); Topology[3]=fComputedGeomesh->NodeVec()[CTopology[3] + (il - 0) * jump].Id(); new TPZGeoElRefPattern < pzgeom::TPZGeoQuad > (elid++, Topology, fbackMatID,*fComputedGeomesh); } else{ // triangles TPZVec<int64_t> Topology(gelNodes+1); Topology[0]=fComputedGeomesh->NodeVec()[CTopology[0] + (il - 0) * jump].Id(); Topology[1]=fComputedGeomesh->NodeVec()[CTopology[1] + (il - 0) * jump].Id(); Topology[2]=fComputedGeomesh->NodeVec()[CTopology[2] + (il - 0) * jump].Id(); new TPZGeoElRefPattern < pzgeom::TPZGeoTriangle > (elid++, Topology, fbackMatID,*fComputedGeomesh); } } } if (!fIsTetrahedron) { if (fIsPrism) { // Prisms TPZVec<int64_t> Topology(2*gelNodes); Topology[0]=fComputedGeomesh->NodeVec()[CTopology[0] + (il - 1) * jump].Id(); Topology[1]=fComputedGeomesh->NodeVec()[CTopology[1] + (il - 1) * jump].Id(); Topology[2]=fComputedGeomesh->NodeVec()[CTopology[2] + (il - 1) * jump].Id(); Topology[3]=fComputedGeomesh->NodeVec()[CTopology[0] + (il - 0) * jump].Id(); Topology[4]=fComputedGeomesh->NodeVec()[CTopology[1] + (il - 0) * jump].Id(); Topology[5]=fComputedGeomesh->NodeVec()[CTopology[2] + (il - 0) * jump].Id(); new TPZGeoElRefPattern < pzgeom::TPZGeoPrism > (elid++, Topology, elmatid,*fComputedGeomesh); } else { // Cubes TPZVec<int64_t> Topology(gelNodes+4); Topology[0]=fComputedGeomesh->NodeVec()[CTopology[0] + (il - 1) * jump].Id(); Topology[1]=fComputedGeomesh->NodeVec()[CTopology[1] + (il - 1) * jump].Id(); Topology[2]=fComputedGeomesh->NodeVec()[CTopology[2] + (il - 1) * jump].Id(); Topology[3]=fComputedGeomesh->NodeVec()[CTopology[3] + (il - 1) * jump].Id(); Topology[4]=fComputedGeomesh->NodeVec()[CTopology[0] + (il - 0) * jump].Id(); Topology[5]=fComputedGeomesh->NodeVec()[CTopology[1] + (il - 0) * jump].Id(); Topology[6]=fComputedGeomesh->NodeVec()[CTopology[2] + (il - 0) * jump].Id(); Topology[7]=fComputedGeomesh->NodeVec()[CTopology[3] + (il - 0) * jump].Id(); new TPZGeoElRefPattern < pzgeom::TPZGeoCube > (elid++, Topology, elmatid,*fComputedGeomesh); } } else { if (fIsPrism) { // Prisms TPZVec<int64_t> Topology(2*gelNodes); Topology[0]=fComputedGeomesh->NodeVec()[CTopology[0] + (il - 1) * jump].Id(); Topology[1]=fComputedGeomesh->NodeVec()[CTopology[1] + (il - 1) * jump].Id(); Topology[2]=fComputedGeomesh->NodeVec()[CTopology[2] + (il - 1) * jump].Id(); Topology[3]=fComputedGeomesh->NodeVec()[CTopology[0] + (il - 0) * jump].Id(); Topology[4]=fComputedGeomesh->NodeVec()[CTopology[1] + (il - 0) * jump].Id(); Topology[5]=fComputedGeomesh->NodeVec()[CTopology[2] + (il - 0) * jump].Id(); new TPZGeoElRefPattern < pzgeom::TPZGeoPrism > (elid++, Topology, elmatid,*fComputedGeomesh); } else{ // Tetrahedron TPZVec<int64_t> Topology(gelNodes+1); Topology[0]=fComputedGeomesh->NodeVec()[CTopology[0] + (il - 1) * jump].Id(); Topology[1]=fComputedGeomesh->NodeVec()[CTopology[1] + (il - 1) * jump].Id(); Topology[2]=fComputedGeomesh->NodeVec()[CTopology[0] + (il - 0) * jump].Id(); Topology[3]=fComputedGeomesh->NodeVec()[CTopology[2] + (il - 1) * jump].Id(); new TPZGeoElRefPattern < pzgeom::TPZGeoTetrahedra > (elid++, Topology, elmatid,*fComputedGeomesh); Topology[0]=fComputedGeomesh->NodeVec()[CTopology[1] + (il - 1) * jump].Id(); Topology[1]=fComputedGeomesh->NodeVec()[CTopology[1] + (il - 0) * jump].Id(); Topology[2]=fComputedGeomesh->NodeVec()[CTopology[0] + (il - 0) * jump].Id(); Topology[3]=fComputedGeomesh->NodeVec()[CTopology[2] + (il - 1) * jump].Id(); new TPZGeoElRefPattern < pzgeom::TPZGeoTetrahedra > (elid++, Topology, elmatid,*fComputedGeomesh); Topology[0]=fComputedGeomesh->NodeVec()[CTopology[0] + (il - 0) * jump].Id(); Topology[1]=fComputedGeomesh->NodeVec()[CTopology[1] + (il - 0) * jump].Id(); Topology[2]=fComputedGeomesh->NodeVec()[CTopology[2] + (il - 0) * jump].Id(); Topology[3]=fComputedGeomesh->NodeVec()[CTopology[2] + (il - 1) * jump].Id(); new TPZGeoElRefPattern < pzgeom::TPZGeoTetrahedra > (elid++, Topology, elmatid,*fComputedGeomesh); } } Is3D = true; } break; default: { std::cout << "Connection not implemented " << std::endl; DebugStop(); } break; } } if (Is1D) { fComputedGeomesh->SetDimension(1); } if (Is2D) { fComputedGeomesh->SetDimension(2); } if (Is3D) { fComputedGeomesh->SetDimension(3); } }