From e41580f0b55d009d0b82109f60a430fd3fa1a0cf Mon Sep 17 00:00:00 2001 From: mattijs Date: Wed, 10 Sep 2008 12:38:14 +0100 Subject: [PATCH 1/7] comparison operator --- .../containers/HashTables/HashSet/HashSet.H | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/OpenFOAM/containers/HashTables/HashSet/HashSet.H b/src/OpenFOAM/containers/HashTables/HashSet/HashSet.H index 654b743add..3985e574fb 100644 --- a/src/OpenFOAM/containers/HashTables/HashSet/HashSet.H +++ b/src/OpenFOAM/containers/HashTables/HashSet/HashSet.H @@ -100,6 +100,17 @@ public: { return HashTable::insert(key, empty()); } + + + // Member Operators + + //- Equality. Two hashtables are equal if all contents of first are + // also in second and vice versa. So does not depend on table size or + // order! + bool operator==(const HashSet&) const; + + //- The opposite of the equality operation. + bool operator!=(const HashSet&) const; }; @@ -112,6 +123,12 @@ typedef HashSet<> wordHashSet; // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // +#ifdef NoRepository +# include "HashSet.C" +#endif + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + #endif // ************************************************************************* // From 1b2c360e15349ba4b3eec56ca05e38ec1629b9d1 Mon Sep 17 00:00:00 2001 From: mattijs Date: Wed, 10 Sep 2008 12:39:07 +0100 Subject: [PATCH 2/7] write access to size --- src/OpenFOAM/containers/Lists/List/List.C | 21 ++++++++++++--------- src/OpenFOAM/containers/Lists/List/List.H | 7 +++++++ src/OpenFOAM/containers/Lists/List/ListI.H | 14 ++++++++++++++ 3 files changed, 33 insertions(+), 9 deletions(-) diff --git a/src/OpenFOAM/containers/Lists/List/List.C b/src/OpenFOAM/containers/Lists/List/List.C index ed38924cf7..249d1fcf2b 100644 --- a/src/OpenFOAM/containers/Lists/List/List.C +++ b/src/OpenFOAM/containers/Lists/List/List.C @@ -321,7 +321,7 @@ List::List(const BiIndirectList& idl) template List::~List() { - if (this->size_) delete[] this->v_; + if (this->v_) delete[] this->v_; } @@ -367,9 +367,8 @@ void List::setSize(const label newSize) register T* av = &nv[i]; while (i--) *--av = *--vv; } - - delete[] this->v_; } + if (this->v_) delete[] this->v_; this->size_ = newSize; this->v_ = nv; @@ -400,7 +399,7 @@ void List::setSize(const label newSize, const T& a) template void List::clear() { - if (this->size_) delete[] this->v_; + if (this->v_) delete[] this->v_; this->size_ = 0; this->v_ = 0; } @@ -411,7 +410,7 @@ void List::clear() template void List::transfer(List& a) { - if (this->size_) delete[] this->v_; + if (this->v_) delete[] this->v_; this->size_ = a.size_; this->v_ = a.v_; @@ -457,7 +456,8 @@ void List::operator=(const UList& a) { if (a.size_ != this->size_) { - if (this->size_) delete[] this->v_; + if (this->v_) delete[] this->v_; + this->v_ = 0; this->size_ = a.size_; if (this->size_) this->v_ = new T[this->size_]; } @@ -503,7 +503,8 @@ void List::operator=(const SLList& sll) { if (sll.size() != this->size_) { - if (this->size_) delete[] this->v_; + if (this->v_) delete[] this->v_; + this->v_ = 0; this->size_ = sll.size(); if (this->size_) this->v_ = new T[this->size_]; } @@ -530,7 +531,8 @@ void List::operator=(const IndirectList& idl) { if (idl.size() != this->size_) { - if (this->size_) delete[] this->v_; + if (this->v_) delete[] this->v_; + this->v_ = 0; this->size_ = idl.size(); if (this->size_) this->v_ = new T[this->size_]; } @@ -551,7 +553,8 @@ void List::operator=(const BiIndirectList& idl) { if (idl.size() != this->size_) { - if (this->size_) delete[] this->v_; + if (this->v_) delete[] this->v_; + this->v_ = 0; this->size_ = idl.size(); if (this->size_) this->v_ = new T[this->size_]; } diff --git a/src/OpenFOAM/containers/Lists/List/List.H b/src/OpenFOAM/containers/Lists/List/List.H index 02130ce706..3ee814a0f6 100644 --- a/src/OpenFOAM/containers/Lists/List/List.H +++ b/src/OpenFOAM/containers/Lists/List/List.H @@ -137,6 +137,9 @@ public: //- Return a null List static const List& null(); + //- Return the number of elements in the UList. + inline label size() const; + // Edit @@ -156,6 +159,10 @@ public: //- Return subscript-checked element of UList. inline T& newElmt(const label); + //- Override size to be inconsistent with allocated storage. + // Use with care. + inline label& size(); + // Member operators diff --git a/src/OpenFOAM/containers/Lists/List/ListI.H b/src/OpenFOAM/containers/Lists/List/ListI.H index a7a9ffa4cf..d39b19f884 100644 --- a/src/OpenFOAM/containers/Lists/List/ListI.H +++ b/src/OpenFOAM/containers/Lists/List/ListI.H @@ -52,6 +52,20 @@ inline T& Foam::List::newElmt(const label i) } +template +inline Foam::label Foam::List::size() const +{ + return UList::size_; +} + + +template +inline Foam::label& Foam::List::size() +{ + return UList::size_; +} + + // * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * // template From 79593777e63fe66032e9e06b2209ff8fa63e69af Mon Sep 17 00:00:00 2001 From: mattijs Date: Wed, 10 Sep 2008 12:40:00 +0100 Subject: [PATCH 3/7] avoid cellEdges --- .../polyPatches/polyPatch/polyPatch.C | 3 +- .../meshes/polyMesh/zones/faceZone/faceZone.C | 34 +++++++----- .../PrimitivePatch/PrimitivePatch.H | 11 +++- .../PrimitivePatch/PrimitivePatchMeshEdges.C | 54 +++++++++++++++++++ 4 files changed, 87 insertions(+), 15 deletions(-) diff --git a/src/OpenFOAM/meshes/polyMesh/polyPatches/polyPatch/polyPatch.C b/src/OpenFOAM/meshes/polyMesh/polyPatches/polyPatch/polyPatch.C index 59f67a08f5..18ebdeba95 100644 --- a/src/OpenFOAM/meshes/polyMesh/polyPatches/polyPatch/polyPatch.C +++ b/src/OpenFOAM/meshes/polyMesh/polyPatches/polyPatch/polyPatch.C @@ -282,8 +282,7 @@ const Foam::labelList& Foam::polyPatch::meshEdges() const primitivePatch::meshEdges ( boundaryMesh().mesh().edges(), - boundaryMesh().mesh().cellEdges(), - faceCells() + boundaryMesh().mesh().pointEdges() ) ); } diff --git a/src/OpenFOAM/meshes/polyMesh/zones/faceZone/faceZone.C b/src/OpenFOAM/meshes/polyMesh/zones/faceZone/faceZone.C index 0ce9de38a8..acc3b0dcf9 100644 --- a/src/OpenFOAM/meshes/polyMesh/zones/faceZone/faceZone.C +++ b/src/OpenFOAM/meshes/polyMesh/zones/faceZone/faceZone.C @@ -362,16 +362,27 @@ const Foam::labelList& Foam::faceZone::meshEdges() const { if (!mePtr_) { - labelList faceCells(size()); - - const labelList& own = zoneMesh().mesh().faceOwner(); - - const labelList& faceLabels = *this; - - forAll (faceCells, faceI) - { - faceCells[faceI] = own[faceLabels[faceI]]; - } + //labelList faceCells(size()); + // + //const labelList& own = zoneMesh().mesh().faceOwner(); + // + //const labelList& faceLabels = *this; + // + //forAll (faceCells, faceI) + //{ + // faceCells[faceI] = own[faceLabels[faceI]]; + //} + // + //mePtr_ = + // new labelList + // ( + // operator()().meshEdges + // ( + // zoneMesh().mesh().edges(), + // zoneMesh().mesh().cellEdges(), + // faceCells + // ) + // ); mePtr_ = new labelList @@ -379,8 +390,7 @@ const Foam::labelList& Foam::faceZone::meshEdges() const operator()().meshEdges ( zoneMesh().mesh().edges(), - zoneMesh().mesh().cellEdges(), - faceCells + zoneMesh().mesh().pointEdges() ) ); } diff --git a/src/OpenFOAM/meshes/primitiveMesh/PrimitivePatch/PrimitivePatch.H b/src/OpenFOAM/meshes/primitiveMesh/PrimitivePatch/PrimitivePatch.H index 49b3be8260..e7d4a410fa 100644 --- a/src/OpenFOAM/meshes/primitiveMesh/PrimitivePatch/PrimitivePatch.H +++ b/src/OpenFOAM/meshes/primitiveMesh/PrimitivePatch/PrimitivePatch.H @@ -348,7 +348,8 @@ public: // index in the edge list. If the edge is not found, return -1 label whichEdge(const edge& e) const; - //- Return labels of patch edges in the global edge list + //- Return labels of patch edges in the global edge list using + // cell addressing labelList meshEdges ( const edgeList& allEdges, @@ -356,6 +357,14 @@ public: const labelList& faceCells ) const; + //- Return labels of patch edges in the global edge list using + // basic edge addressing. + labelList meshEdges + ( + const edgeList& allEdges, + const labelListList& pointEdges + ) const; + //- Return face normals for patch const Field& faceNormals() const; diff --git a/src/OpenFOAM/meshes/primitiveMesh/PrimitivePatch/PrimitivePatchMeshEdges.C b/src/OpenFOAM/meshes/primitiveMesh/PrimitivePatch/PrimitivePatchMeshEdges.C index be5c6adb9e..96c017fbdc 100644 --- a/src/OpenFOAM/meshes/primitiveMesh/PrimitivePatch/PrimitivePatchMeshEdges.C +++ b/src/OpenFOAM/meshes/primitiveMesh/PrimitivePatch/PrimitivePatchMeshEdges.C @@ -111,6 +111,60 @@ labelList PrimitivePatch::meshEdges } +template +< + class Face, + template class FaceList, + class PointField, + class PointType +> + +labelList PrimitivePatch::meshEdges +( + const edgeList& allEdges, + const labelListList& pointEdges +) const +{ + if (debug) + { + Info<< "labelList PrimitivePatch" + << "::meshEdges() : " + << "calculating labels of patch edges in mesh edge list" + << endl; + } + + // get reference to the list of edges on the patch + const edgeList& PatchEdges = edges(); + + // create the storage + labelList meshEdges(PatchEdges.size()); + + // get reference to the points on the patch + const labelList& pp = meshPoints(); + + // WARNING: Remember that local edges address into local point list; + // local-to-global point label translation is necessary + forAll (PatchEdges, edgeI) + { + const label globalPointI = pp[PatchEdges[edgeI].start()]; + const edge curEdge(globalPointI, pp[PatchEdges[edgeI].end()]); + + const labelList& pe = pointEdges[globalPointI]; + + forAll (pe, i) + { + if (allEdges[pe[i]] == curEdge) + { + meshEdges[edgeI] = pe[i]; + break; + } + } + } + + return meshEdges; +} + + // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // template From e716b6e1400ec92f69f2d41c87e73d67b7422ca4 Mon Sep 17 00:00:00 2001 From: mattijs Date: Wed, 10 Sep 2008 12:51:16 +0100 Subject: [PATCH 4/7] on-the-fly addressing --- .../meshes/primitiveMesh/primitiveMesh.C | 6 + .../meshes/primitiveMesh/primitiveMesh.H | 70 +++++++++- .../primitiveMesh/primitiveMeshCellCells.C | 47 +++++++ .../primitiveMesh/primitiveMeshCellPoints.C | 46 +++++++ .../primitiveMeshCheck/primitiveMeshCheck.C | 7 +- .../primitiveMesh/primitiveMeshEdgeCells.C | 80 +++++++++++ .../primitiveMesh/primitiveMeshEdgeFaces.C | 53 ++++++++ .../meshes/primitiveMesh/primitiveMeshEdges.C | 125 ++++++++++++++++++ .../meshes/primitiveMesh/primitiveMeshI.H | 102 ++++++++++++++ .../primitiveMesh/primitiveMeshPointCells.C | 64 +++++++++ .../primitiveMesh/primitiveMeshPointPoints.C | 34 +++++ .../polyTopoChange/polyTopoChange.C | 4 +- src/meshTools/meshTools/meshTools.C | 20 +-- 13 files changed, 636 insertions(+), 22 deletions(-) diff --git a/src/OpenFOAM/meshes/primitiveMesh/primitiveMesh.C b/src/OpenFOAM/meshes/primitiveMesh/primitiveMesh.C index dcbf6d0b16..8c21017269 100644 --- a/src/OpenFOAM/meshes/primitiveMesh/primitiveMesh.C +++ b/src/OpenFOAM/meshes/primitiveMesh/primitiveMesh.C @@ -66,6 +66,9 @@ primitiveMesh::primitiveMesh() ppPtr_(NULL), cpPtr_(NULL), + allocSize_(0), + labels_(0), + cellCentresPtr_(NULL), faceCentresPtr_(NULL), cellVolumesPtr_(NULL), @@ -106,6 +109,9 @@ primitiveMesh::primitiveMesh ppPtr_(NULL), cpPtr_(NULL), + allocSize_(0), + labels_(0), + cellCentresPtr_(NULL), faceCentresPtr_(NULL), cellVolumesPtr_(NULL), diff --git a/src/OpenFOAM/meshes/primitiveMesh/primitiveMesh.H b/src/OpenFOAM/meshes/primitiveMesh/primitiveMesh.H index 0609c453d3..3868ba2b25 100644 --- a/src/OpenFOAM/meshes/primitiveMesh/primitiveMesh.H +++ b/src/OpenFOAM/meshes/primitiveMesh/primitiveMesh.H @@ -155,6 +155,17 @@ class primitiveMesh mutable labelListList* cpPtr_; + // On-the-fly edge addresing storage + + //- Temporary storage for addressing. allocSize is the real size + // of the labelList. + mutable label allocSize_; + mutable labelList labels_; + + //- Temporary storage for addressing + mutable labelHashSet labelSet_; + + // Geometric data //- Cell centres @@ -209,8 +220,14 @@ class primitiveMesh ( List >&, DynamicList&, - const label pA, - const label pB + const label, + const label + ); + //- For on-the-fly addressing calculation + static label findFirstCommonElementFromSortedLists + ( + const labelList&, + const labelList& ); @@ -667,6 +684,55 @@ public: //- Print a list of all the currently allocated mesh data void printAllocated() const; + // Per storage whether allocated + inline bool hasCellShapes() const; + inline bool hasEdges() const; + inline bool hasCellCells() const; + inline bool hasEdgeCells() const; + inline bool hasPointCells() const; + inline bool hasCells() const; + inline bool hasEdgeFaces() const; + inline bool hasPointFaces() const; + inline bool hasCellEdges() const; + inline bool hasFaceEdges() const; + inline bool hasPointEdges() const; + inline bool hasPointPoints() const; + inline bool hasCellPoints() const; + inline bool hasCellCentres() const; + inline bool hasFaceCentres() const; + inline bool hasCellVolumes() const; + inline bool hasFaceAreas() const; + + // On-the-fly addressing calculation. These functions return either + // a reference to the full addressing (if already calculated) or + // a reference to member data labels_ so be careful when not storing + // result. + + //- cellCells using cells + const labelList& cellCells(const label cellI) const; + + //- cellPoints using cells + const labelList& cellPoints(const label cellI) const; + + //- pointCells using pointFaces + const labelList& pointCells(const label pointI) const; + + //- pointPoints using edges, pointEdges + const labelList& pointPoints(const label pointI) const; + + //- faceEdges using pointFaces, edges, pointEdges + const labelList& faceEdges(const label faceI) const; + + //- edgeFaces using pointFaces, edges, pointEdges + const labelList& edgeFaces(const label edgeI) const; + + //- edgeCells using pointFaces, edges, pointEdges + const labelList& edgeCells(const label edgeI) const; + + //- cellEdges using cells, pointFaces, edges, pointEdges + const labelList& cellEdges(const label cellI) const; + + //- Clear geometry void clearGeom(); diff --git a/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshCellCells.C b/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshCellCells.C index d17228c7bd..3c8f896bbe 100644 --- a/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshCellCells.C +++ b/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshCellCells.C @@ -105,6 +105,53 @@ const labelListList& primitiveMesh::cellCells() const } +const labelList& primitiveMesh::cellCells(const label cellI) const +{ + if (hasCellCells()) + { + return cellCells()[cellI]; + } + else + { + const labelList& own = faceOwner(); + const labelList& nei = faceNeighbour(); + const cell& cFaces = cells()[cellI]; + + labels_.size() = allocSize_; + + if (cFaces.size() > allocSize_) + { + labels_.clear(); + allocSize_ = cFaces.size(); + labels_.setSize(allocSize_); + } + + label n = 0; + + forAll(cFaces, i) + { + label faceI = cFaces[i]; + + if (faceI < nInternalFaces()) + { + if (own[faceI] == cellI) + { + labels_[n++] = nei[faceI]; + } + else + { + labels_[n++] = own[faceI]; + } + } + } + + labels_.size() = n; + + return labels_; + } +} + + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // } // End namespace Foam diff --git a/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshCellPoints.C b/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshCellPoints.C index 542952019b..c8f63e1eef 100644 --- a/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshCellPoints.C +++ b/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshCellPoints.C @@ -53,6 +53,52 @@ const labelListList& primitiveMesh::cellPoints() const } +const labelList& primitiveMesh::cellPoints(const label cellI) const +{ + if (hasCellPoints()) + { + return cellPoints()[cellI]; + } + else + { + const faceList& fcs = faces(); + const labelList& cFaces = cells()[cellI]; + + labelSet_.clear(); + + forAll(cFaces, i) + { + const labelList& f = fcs[cFaces[i]]; + + forAll(f, fp) + { + labelSet_.insert(f[fp]); + } + } + + labels_.size() = allocSize_; + + if (labelSet_.size() > allocSize_) + { + labels_.clear(); + allocSize_ = labelSet_.size(); + labels_.setSize(allocSize_); + } + + label n = 0; + + forAllConstIter(labelHashSet, labelSet_, iter) + { + labels_[n++] = iter.key(); + } + + labels_.size() = n; + + return labels_; + } +} + + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // } // End namespace Foam diff --git a/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshCheck/primitiveMeshCheck.C b/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshCheck/primitiveMeshCheck.C index fd56846ebb..47360d4cf1 100644 --- a/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshCheck/primitiveMeshCheck.C +++ b/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshCheck/primitiveMeshCheck.C @@ -771,11 +771,12 @@ bool primitiveMesh::checkPoints } } - const labelListList& pc = pointCells(); - forAll (pc, pointI) + forAll (pf, pointI) { - if (pc[pointI].size() == 0) + const labelList& pc = pointCells(pointI); + + if (pc.size() == 0) { if (setPtr) { diff --git a/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshEdgeCells.C b/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshEdgeCells.C index 46173628d8..6a2f309dd3 100644 --- a/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshEdgeCells.C +++ b/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshEdgeCells.C @@ -51,6 +51,86 @@ const labelListList& primitiveMesh::edgeCells() const } +const labelList& primitiveMesh::edgeCells(const label edgeI) const +{ + if (hasEdgeCells()) + { + return edgeCells()[edgeI]; + } + else + { + const labelList& own = faceOwner(); + const labelList& nei = faceNeighbour(); + + // edge faces can either return labels_ or reference in edgeLabels. + labelList labelsCopy; + if (!hasEdgeFaces()) + { + labelsCopy = edgeFaces(edgeI); + } + + const labelList& eFaces = + ( + hasEdgeFaces() + ? edgeFaces()[edgeI] + : labelsCopy + ); + + labels_.size() = allocSize_; + + // labels_ should certainly be big enough for edge cells. + label n = 0; + + // Do quadratic insertion. + forAll(eFaces, i) + { + label faceI = eFaces[i]; + + { + label ownCellI = own[faceI]; + + // Check if not already in labels_ + for (label j = 0; j < n; j++) + { + if (labels_[j] == ownCellI) + { + ownCellI = -1; + break; + } + } + + if (ownCellI != -1) + { + labels_[n++] = ownCellI; + } + } + + if (isInternalFace(faceI)) + { + label neiCellI = nei[faceI]; + + for (label j = 0; j < n; j++) + { + if (labels_[j] == neiCellI) + { + neiCellI = -1; + break; + } + } + + if (neiCellI != -1) + { + labels_[n++] = neiCellI; + } + } + } + + labels_.size() = n; + + return labels_; + } +} + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // diff --git a/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshEdgeFaces.C b/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshEdgeFaces.C index 30390ce4eb..99536bcd33 100644 --- a/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshEdgeFaces.C +++ b/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshEdgeFaces.C @@ -51,6 +51,59 @@ const labelListList& primitiveMesh::edgeFaces() const return *efPtr_; } + +const labelList& primitiveMesh::edgeFaces(const label edgeI) const +{ + if (hasEdgeFaces()) + { + return edgeFaces()[edgeI]; + } + else + { + // Use the fact that pointEdges are sorted in incrementing edge order + const edge& e = edges()[edgeI]; + const labelList& pFaces0 = pointFaces()[e[0]]; + const labelList& pFaces1 = pointFaces()[e[1]]; + + label i0 = 0; + label i1 = 0; + label n = 0; + + labels_.size() = allocSize_; + + while (i0 < pFaces0.size() && i1 < pFaces1.size()) + { + if (pFaces0[i0] < pFaces1[i1]) + { + ++i0; + } + else if (pFaces0[i0] > pFaces1[i1]) + { + ++i1; + } + else + { + // Equal. Append. + if (n == allocSize_) + { + // Have setSize copy contents so far + labels_.size() = n; + allocSize_ = allocSize_*2 + 1; + labels_.setSize(allocSize_); + } + labels_[n++] = pFaces0[i0]; + ++i0; + ++i1; + } + } + + labels_.size() = n; + + return labels_; + } +} + + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // } // End namespace Foam diff --git a/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshEdges.C b/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshEdges.C index 6b3039ff30..b60b366079 100644 --- a/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshEdges.C +++ b/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshEdges.C @@ -461,6 +461,46 @@ void primitiveMesh::calcEdges(const bool doFaceEdges) const } +label primitiveMesh::findFirstCommonElementFromSortedLists +( + const labelList& list1, + const labelList& list2 +) +{ + label result = -1; + + labelList::const_iterator iter1 = list1.begin(); + labelList::const_iterator iter2 = list2.begin(); + + while (iter1 != list1.end() && iter2 != list2.end()) + { + if( *iter1 < *iter2) + { + ++iter1; + } + else if (*iter1 > *iter2) + { + ++iter2; + } + else + { + result = *iter1; + break; + } + } + if (result == -1) + { + FatalErrorIn + ( + "primitiveMesh::findFirstCommonElementFromSortedLists" + "(const labelList&, const labelList&)" + ) << "No common elements in lists " << list1 << " and " << list2 + << abort(FatalError); + } + return result; +} + + // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // const edgeList& primitiveMesh::edges() const @@ -542,6 +582,91 @@ void primitiveMesh::clearOutEdges() deleteDemandDrivenData(edgesPtr_); deleteDemandDrivenData(pePtr_); deleteDemandDrivenData(fePtr_); + labels_.clear(); + allocSize_ = 0; +} + + +const labelList& primitiveMesh::faceEdges(const label faceI) const +{ + if (hasFaceEdges()) + { + return faceEdges()[faceI]; + } + else + { + const labelListList& pointEs = pointEdges(); + const face& f = faces()[faceI]; + + labels_.size() = allocSize_; + + if (f.size() > allocSize_) + { + labels_.clear(); + allocSize_ = f.size(); + labels_.setSize(allocSize_); + } + + label n = 0; + + forAll(f, fp) + { + labels_[n++] = findFirstCommonElementFromSortedLists + ( + pointEs[f[fp]], + pointEs[f.nextLabel(fp)] + ); + } + + labels_.size() = n; + + return labels_; + } +} + + +const labelList& primitiveMesh::cellEdges(const label cellI) const +{ + if (hasCellEdges()) + { + return cellEdges()[cellI]; + } + else + { + const labelList& cFaces = cells()[cellI]; + + labelSet_.clear(); + + forAll(cFaces, i) + { + const labelList& fe = faceEdges(cFaces[i]); + + forAll(fe, feI) + { + labelSet_.insert(fe[feI]); + } + } + + labels_.size() = allocSize_; + + if (labelSet_.size() > allocSize_) + { + labels_.clear(); + allocSize_ = labelSet_.size(); + labels_.setSize(allocSize_); + } + + label n =0; + + forAllConstIter(labelHashSet, labelSet_, iter) + { + labels_[n++] = iter.key(); + } + + labels_.size() = n; + + return labels_; + } } diff --git a/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshI.H b/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshI.H index fdaea6d1fc..98b32af1fc 100644 --- a/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshI.H +++ b/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshI.H @@ -104,6 +104,108 @@ inline bool primitiveMesh::isInternalFace(const label faceIndex) const } +inline bool primitiveMesh::hasCellShapes() const +{ + return cellShapesPtr_; +} + + +inline bool primitiveMesh::hasEdges() const +{ + return edgesPtr_; +} + + +inline bool primitiveMesh::hasCellCells() const +{ + return ccPtr_; +} + + +inline bool primitiveMesh::hasEdgeCells() const +{ + return ecPtr_; +} + + +inline bool primitiveMesh::hasPointCells() const +{ + return pcPtr_; +} + + +inline bool primitiveMesh::hasCells() const +{ + return cfPtr_; +} + + +inline bool primitiveMesh::hasEdgeFaces() const +{ + return efPtr_; +} + + +inline bool primitiveMesh::hasPointFaces() const +{ + return pfPtr_; +} + + +inline bool primitiveMesh::hasCellEdges() const +{ + return cePtr_; +} + + +inline bool primitiveMesh::hasFaceEdges() const +{ + return fePtr_; +} + + +inline bool primitiveMesh::hasPointEdges() const +{ + return pePtr_; +} + + +inline bool primitiveMesh::hasPointPoints() const +{ + return ppPtr_; +} + + +inline bool primitiveMesh::hasCellPoints() const +{ + return cpPtr_; +} + + +inline bool primitiveMesh::hasCellCentres() const +{ + return cellCentresPtr_; +} + + +inline bool primitiveMesh::hasFaceCentres() const +{ + return faceCentresPtr_; +} + + +inline bool primitiveMesh::hasCellVolumes() const +{ + return cellVolumesPtr_; +} + + +inline bool primitiveMesh::hasFaceAreas() const +{ + return faceAreasPtr_; +} + + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // } // End namespace Foam diff --git a/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshPointCells.C b/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshPointCells.C index 55d877902a..6d7af72e0b 100644 --- a/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshPointCells.C +++ b/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshPointCells.C @@ -114,6 +114,70 @@ const labelListList& primitiveMesh::pointCells() const } +const labelList& primitiveMesh::pointCells(const label pointI) const +{ + if (hasPointCells()) + { + return pointCells()[pointI]; + } + else + { + const labelList& own = faceOwner(); + const labelList& nei = faceNeighbour(); + const labelList& pFaces = pointFaces()[pointI]; + + labels_.size() = allocSize_; + + label n = 0; + + forAll(pFaces, i) + { + const label faceI = pFaces[i]; + + // Append owner + if (n == allocSize_) + { + labels_.size() = n; + allocSize_ = allocSize_*2 + 1; + labels_.setSize(allocSize_); + } + labels_[n++] = own[faceI]; + + // Append neighbour + if (faceI < nInternalFaces()) + { + if (n == allocSize_) + { + labels_.size() = n; + allocSize_ = allocSize_*2 + 1; + labels_.setSize(allocSize_); + } + labels_[n++] = nei[faceI]; + } + } + labels_.size() = n; + + + // Filter duplicates + sort(labels_); + + n = 1; + + for (label i = 1; i < labels_.size(); i++) + { + if (labels_[i] != labels_[i-1]) + { + labels_[n++] = labels_[i]; + } + } + + labels_.size() = n; + + return labels_; + } +} + + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // } // End namespace Foam diff --git a/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshPointPoints.C b/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshPointPoints.C index c5df74a4fa..099e266941 100644 --- a/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshPointPoints.C +++ b/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshPointPoints.C @@ -97,6 +97,40 @@ const labelListList& primitiveMesh::pointPoints() const } +const labelList& primitiveMesh::pointPoints(const label pointI) const +{ + if (hasPointPoints()) + { + return pointPoints()[pointI]; + } + else + { + const edgeList& edges = this->edges(); + const labelList& pEdges = pointEdges()[pointI]; + + labels_.size() = allocSize_; + + if (pEdges.size() > allocSize_) + { + // Set size() so memory allocation behaves as normal. + labels_.clear(); + allocSize_ = pEdges.size(); + labels_.setSize(allocSize_); + } + + label n = 0; + + forAll(pEdges, i) + { + labels_[n++] = edges[pEdges[i]].otherVertex(pointI); + } + + labels_.size() = n; + + return labels_; + } +} + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // diff --git a/src/dynamicMesh/polyTopoChange/polyTopoChange/polyTopoChange.C b/src/dynamicMesh/polyTopoChange/polyTopoChange/polyTopoChange.C index bfe18f3363..08e9566e48 100644 --- a/src/dynamicMesh/polyTopoChange/polyTopoChange/polyTopoChange.C +++ b/src/dynamicMesh/polyTopoChange/polyTopoChange/polyTopoChange.C @@ -1295,7 +1295,7 @@ void Foam::polyTopoChange::calcFaceInflationMaps selectFaces ( mesh, - mesh.edgeFaces()[iter()], + mesh.edgeFaces(iter()), true ) ); @@ -1309,7 +1309,7 @@ void Foam::polyTopoChange::calcFaceInflationMaps selectFaces ( mesh, - mesh.edgeFaces()[iter()], + mesh.edgeFaces(iter()), false ) ); diff --git a/src/meshTools/meshTools/meshTools.C b/src/meshTools/meshTools/meshTools.C index 49a06cf868..352de0feec 100644 --- a/src/meshTools/meshTools/meshTools.C +++ b/src/meshTools/meshTools/meshTools.C @@ -182,7 +182,7 @@ Foam::vectorField Foam::meshTools::calcBoxPointNormals(const primitivePatch& pp) "Foam::meshTools::calcBoxPointNormals" "(const primitivePatch& pp)" ) << "No visible octant for point:" << pp.meshPoints()[pointI] - << " cooord:" << pp.localPoints()[pointI] << nl + << " cooord:" << pp.points()[pp.meshPoints()[pointI]] << nl << "Normal set to " << pn[pointI] << endl; } } @@ -299,7 +299,7 @@ bool Foam::meshTools::edgeOnCell const label edgeI ) { - return findIndex(mesh.edgeCells()[edgeI], cellI) != -1; + return findIndex(mesh.edgeCells(edgeI), cellI) != -1; } @@ -310,7 +310,7 @@ bool Foam::meshTools::edgeOnFace const label edgeI ) { - return findIndex(mesh.faceEdges()[faceI], edgeI) != -1; + return findIndex(mesh.faceEdges(faceI), edgeI) != -1; } @@ -403,7 +403,6 @@ Foam::label Foam::meshTools::getSharedEdge const labelList& f0Edges = mesh.faceEdges()[f0]; const labelList& f1Edges = mesh.faceEdges()[f1]; - forAll(f0Edges, f0EdgeI) { label edge0 = f0Edges[f0EdgeI]; @@ -481,7 +480,7 @@ void Foam::meshTools::getEdgeFaces label& face1 ) { - const labelList& eFaces = mesh.edgeFaces()[edgeI]; + const labelList& eFaces = mesh.edgeFaces(edgeI); face0 = -1; face1 = -1; @@ -619,7 +618,7 @@ Foam::label Foam::meshTools::walkFace const label nEdges ) { - const labelList& fEdges = mesh.faceEdges()[faceI]; + const labelList& fEdges = mesh.faceEdges(faceI); label edgeI = startEdgeI; @@ -790,13 +789,4 @@ Foam::label Foam::meshTools::cutDirToEdge } -// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * // - - -// * * * * * * * * * * * * * * * Friend Functions * * * * * * * * * * * * * // - - -// * * * * * * * * * * * * * * * Friend Operators * * * * * * * * * * * * * // - - // ************************************************************************* // From 58fa3c407467cac8a6f20f930d4001e9e78a1bb9 Mon Sep 17 00:00:00 2001 From: mattijs Date: Wed, 10 Sep 2008 12:51:43 +0100 Subject: [PATCH 5/7] comparison operator --- .../containers/HashTables/HashSet/HashSet.C | 90 +++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 src/OpenFOAM/containers/HashTables/HashSet/HashSet.C diff --git a/src/OpenFOAM/containers/HashTables/HashSet/HashSet.C b/src/OpenFOAM/containers/HashTables/HashSet/HashSet.C new file mode 100644 index 0000000000..b5c199e9be --- /dev/null +++ b/src/OpenFOAM/containers/HashTables/HashSet/HashSet.C @@ -0,0 +1,90 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 1991-2008 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM 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 2 of the License, or (at your + option) any later version. + + OpenFOAM 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 OpenFOAM; if not, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +\*---------------------------------------------------------------------------*/ + +#ifndef HashSet_C +#define HashSet_C + +#include "HashSet.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * // + +template +bool HashSet::operator==(const HashSet& ht) const +{ + const HashTable& a = *this; + + // Are all my elements in ht? + for + ( + typename HashTable::const_iterator iter = a.begin(); + iter != a.end(); + ++iter + ) + { + if (!ht.found(iter.key())) + { + return false; + } + } + + // Are all ht elements in me? + for + ( + typename HashTable::const_iterator iter = ht.begin(); + iter != ht.end(); + ++iter + ) + { + if (!found(iter.key())) + { + return false; + } + } + return true; +} + + +template +bool HashSet::operator!=(const HashSet& ht) const +{ + return !(operator==(ht)); +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * Friend Operators * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // From 764cfa2ffe4bb5c30c0f9e01a625297ef6de42fb Mon Sep 17 00:00:00 2001 From: mattijs Date: Wed, 10 Sep 2008 13:57:48 +0100 Subject: [PATCH 6/7] consistent numbering with postChannel tutorial --- .../miscellaneous/postChannel/postChannelDict | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/applications/utilities/postProcessing/miscellaneous/postChannel/postChannelDict b/applications/utilities/postProcessing/miscellaneous/postChannel/postChannelDict index 1785207adc..4c528ea243 100644 --- a/applications/utilities/postProcessing/miscellaneous/postChannel/postChannelDict +++ b/applications/utilities/postProcessing/miscellaneous/postChannel/postChannelDict @@ -15,11 +15,13 @@ FoamFile // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // -Nx 40; -Ny -( - 50 -); -Nz 30; +Nx 40; +Ny +( + 25 + 25 +); +Nz 30; + // ************************************************************************* // From b1ddfaddd4b42ebe8be83bcf3baf98652d2ef2aa Mon Sep 17 00:00:00 2001 From: mattijs Date: Wed, 10 Sep 2008 13:58:02 +0100 Subject: [PATCH 7/7] no space after block code --- .../fluent3DMeshToFoam/fluent3DMeshToFoam.L | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/applications/utilities/mesh/conversion/fluent3DMeshToFoam/fluent3DMeshToFoam.L b/applications/utilities/mesh/conversion/fluent3DMeshToFoam/fluent3DMeshToFoam.L index a8cb5dbb98..46eb810e05 100644 --- a/applications/utilities/mesh/conversion/fluent3DMeshToFoam/fluent3DMeshToFoam.L +++ b/applications/utilities/mesh/conversion/fluent3DMeshToFoam/fluent3DMeshToFoam.L @@ -187,21 +187,21 @@ time ({digit}{digit}":"{digit}{digit}":"{digit}{digit}) versionNumber ({digit}|".")* -header {spaceNl}"(1"{some_space} -dimension {spaceNl}"(2"{some_space} -points {spaceNl}"(10"{some_space} -faces {spaceNl}"(13"{some_space} -cells {spaceNl}"(12"{some_space} -zoneVariant1 {spaceNl}"(39"{some_space} -zoneVariant2 {spaceNl}"(45"{some_space} -faceTree {spaceNl}"(59"{some_space} +header {spaceNl}"(1"{space} +dimension {spaceNl}"(2"{space} +points {spaceNl}"(10"{space} +faces {spaceNl}"(13"{space} +cells {spaceNl}"(12"{space} +zoneVariant1 {spaceNl}"(39"{space} +zoneVariant2 {spaceNl}"(45"{space} +faceTree {spaceNl}"(59"{space} -comment "0"{some_space} -unknownPeriodicFace "17"{some_space} -periodicFace "18"{some_space} -cellTree "58"{some_space} -faceParents "61"{some_space} -ignoreBlocks ("4"|"37"|"38"|"41"|"60"|"64"){some_space} +comment "0"{space} +unknownPeriodicFace "17"{space} +periodicFace "18"{space} +cellTree "58"{space} +faceParents "61"{space} +ignoreBlocks ("4"|"37"|"38"|"41"|"60"|"64"){space} redundantBlock {spaceNl}({comment}|{unknownPeriodicFace}|{periodicFace}|{cellTree}|{faceParents}|{ignoreBlocks}){space}