/*---------------------------------------------------------------------------*\ ========= | \\ / F ield | foam-extend: Open Source CFD \\ / O peration | Version: 3.2 \\ / A nd | Web: http://www.foam-extend.org \\/ M anipulation | For copyright notice see file Copyright ------------------------------------------------------------------------------- License This file is part of foam-extend. foam-extend is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. foam-extend is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with foam-extend. If not, see . \*---------------------------------------------------------------------------*/ #include "edgeMesh.H" #include "mergePoints.H" #include "StaticHashTable.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // void Foam::edgeMesh::calcPointEdges() const { if (pointEdgesPtr_.valid()) { FatalErrorIn("edgeMesh::calcPointEdges() const") << "pointEdges already calculated." << abort(FatalError); } pointEdgesPtr_.reset(new labelListList(points_.size())); labelListList& pointEdges = pointEdgesPtr_(); // Count labelList nEdgesPerPoint(points_.size(), 0); forAll(edges_, edgeI) { const edge& e = edges_[edgeI]; nEdgesPerPoint[e[0]]++; nEdgesPerPoint[e[1]]++; } // Size forAll(pointEdges, pointI) { pointEdges[pointI].setSize(nEdgesPerPoint[pointI]); } // Fill nEdgesPerPoint = 0; forAll(edges_, edgeI) { const edge& e = edges_[edgeI]; label p0 = e[0]; pointEdges[p0][nEdgesPerPoint[p0]++] = edgeI; label p1 = e[1]; pointEdges[p1][nEdgesPerPoint[p1]++] = edgeI; } } // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // // construct from components Foam::edgeMesh::edgeMesh(const pointField& points, const edgeList& edges) : points_(points), edges_(edges) {} // construct as copy Foam::edgeMesh::edgeMesh(const edgeMesh& em) : points_(em.points_), edges_(em.edges_), pointEdgesPtr_(NULL) {} // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // Foam::label Foam::edgeMesh::regions(labelList& edgeRegion) const { edgeRegion.setSize(edges_.size()); edgeRegion = -1; label startEdgeI = 0; label currentRegion = 0; while (true) { while (startEdgeI < edges_.size() && edgeRegion[startEdgeI] != -1) { startEdgeI++; } if (startEdgeI == edges_.size()) { break; } // Found edge that has not yet been assigned a region. // Mark connected region with currentRegion starting at startEdgeI. edgeRegion[startEdgeI] = currentRegion; labelList edgesToVisit(1, startEdgeI); while (edgesToVisit.size()) { // neighbours of current edgesToVisit DynamicList