const Foam::labelListList& Foam::primitiveMesh::cellPoints() const { if (!cpPtr_) { if (debug) { Pout<< "primitiveMesh::cellPoints() : " << "calculating cellPoints" << endl; if (debug == -1) { // For checking calls:abort so we can quickly hunt down // origin of call FatalErrorIn("primitiveMesh::cellPoints()") << abort(FatalError); } } // Invert pointCells cpPtr_ = new labelListList(nCells()); invertManyToMany(nCells(), pointCells(), *cpPtr_); } return *cpPtr_; }
const Foam::labelListList& Foam::primitiveMesh::edgeFaces() const { if (!efPtr_) { if (debug) { Pout<< "primitiveMesh::edgeFaces() : calculating edgeFaces" << endl; if (debug == -1) { // For checking calls:abort so we can quickly hunt down // origin of call FatalErrorIn("primitiveMesh::edgeFaces()") << abort(FatalError); } } // Invert faceEdges efPtr_ = new labelListList(nEdges()); invertManyToMany(nEdges(), faceEdges(), *efPtr_); } return *efPtr_; }
void Foam::edgeMesh::calcPointEdges() const { if (pointEdgesPtr_.valid()) { FatalErrorInFunction << "pointEdges already calculated." << abort(FatalError); } pointEdgesPtr_.reset(new labelListList(points_.size())); labelListList& pointEdges = pointEdgesPtr_(); invertManyToMany(pointEdges.size(), edges_, pointEdges); }
const Foam::labelListList& Foam::primitiveMesh::pointFaces() const { if (!pfPtr_) { if (debug) { Pout<< "primitiveMesh::pointFaces() : " << "calculating pointFaces" << endl; } // Invert faces() pfPtr_ = new labelListList(nPoints()); invertManyToMany(nPoints(), faces(), *pfPtr_); } return *pfPtr_; }
void Foam::PrimitivePatch<Face, FaceList, PointField, PointType>:: calcPointEdges() const { if (debug) { Info<< "PrimitivePatch<Face, FaceList, PointField, PointType>::" << "calcPointEdges() : calculating pointEdges" << endl; } if (pointEdgesPtr_) { // it is considered an error to attempt to recalculate // if already allocated FatalErrorIn ( "PrimitivePatch<Face, FaceList, PointField, PointType>::" "calcPointEdges()" ) << "pointEdges already calculated" << abort(FatalError); } pointEdgesPtr_ = new labelListList(meshPoints().size()); labelListList& pe = *pointEdgesPtr_; invertManyToMany(pe.size(), edges(), pe); if (debug) { Info<< "PrimitivePatch<Face, FaceList, PointField, PointType>::" << "calcPointEdges() finished calculating pointEdges" << endl; } }
bool Foam::triSurfaceMesh::isSurfaceClosed() const { // Construct pointFaces. Let's hope surface has compact point // numbering ... labelListList pointFaces; invertManyToMany(points().size(), *this, pointFaces); // Loop over all faces surrounding point. Count edges emanating from point. // Every edge should be used by two faces exactly. // To prevent doing work twice per edge only look at edges to higher // point EdgeMap<label> facesPerEdge(100); forAll(pointFaces, pointI) { const labelList& pFaces = pointFaces[pointI]; facesPerEdge.clear(); forAll(pFaces, i) { const triSurface::FaceType& f = triSurface::operator[](pFaces[i]); label fp = findIndex(f, pointI); // Something weird: if I expand the code of addFaceToEdge in both // below instances it gives a segmentation violation on some // surfaces. Compiler (4.3.2) problem? // Forward edge label nextPointI = f[f.fcIndex(fp)]; if (nextPointI > pointI) { bool okFace = addFaceToEdge ( edge(pointI, nextPointI), facesPerEdge ); if (!okFace) { return false; } } // Reverse edge label prevPointI = f[f.rcIndex(fp)]; if (prevPointI > pointI) { bool okFace = addFaceToEdge ( edge(pointI, prevPointI), facesPerEdge ); if (!okFace) { return false; } } } // Check for any edges used only once. forAllConstIter(EdgeMap<label>, facesPerEdge, iter) { if (iter() != 2) { return false; } } } return true; }