diff --git a/applications/utilities/mesh/manipulation/cellSet/cellSetDict b/applications/utilities/mesh/manipulation/cellSet/cellSetDict index 3bda8ccd01..9589b484eb 100644 --- a/applications/utilities/mesh/manipulation/cellSet/cellSetDict +++ b/applications/utilities/mesh/manipulation/cellSet/cellSetDict @@ -82,7 +82,7 @@ topoSetSources // Cells in cell zone zoneToCell { - name cellZone; // name of cellZone + name ".*Zone"; // name of cellZone, wildcards allowed. } // values of field within certain range diff --git a/applications/utilities/mesh/manipulation/faceSet/faceSetDict b/applications/utilities/mesh/manipulation/faceSet/faceSetDict index 4f6c0d1509..4d5abe2a5e 100644 --- a/applications/utilities/mesh/manipulation/faceSet/faceSetDict +++ b/applications/utilities/mesh/manipulation/faceSet/faceSetDict @@ -56,13 +56,13 @@ topoSetSources // All faces of patch patchToFace { - name movingWall; + name ".*Wall"; // Name of patch, regular expressions allowed } // All faces of faceZone zoneToFace { - name faceZone1; // Name of faceZone + name ".*Zone1"; // Name of faceZone, regular expressions allowed } // Faces with face centre within box diff --git a/applications/utilities/mesh/manipulation/pointSet/pointSetDict b/applications/utilities/mesh/manipulation/pointSet/pointSetDict index 27a43d3ad9..5c19ea60fe 100644 --- a/applications/utilities/mesh/manipulation/pointSet/pointSetDict +++ b/applications/utilities/mesh/manipulation/pointSet/pointSetDict @@ -57,6 +57,12 @@ topoSetSources box (0 0 0) (1 1 1); } + // All points in pointzone + zoneToPoint + { + name ".*Zone"; // name of pointZone, wildcards allowed. + } + // Select based on surface surfaceToPoint { diff --git a/src/meshTools/Make/files b/src/meshTools/Make/files index 1d67c48877..98c7bf0640 100644 --- a/src/meshTools/Make/files +++ b/src/meshTools/Make/files @@ -55,6 +55,7 @@ indexedOctree/treeDataTriSurface.C searchableSurface = searchableSurface $(searchableSurface)/distributedTriSurfaceMesh.C $(searchableSurface)/searchableBox.C +$(searchableSurface)/searchablePlane.C $(searchableSurface)/searchablePlate.C $(searchableSurface)/searchableSphere.C $(searchableSurface)/searchableSurface.C diff --git a/src/meshTools/searchableSurface/searchablePlane.C b/src/meshTools/searchableSurface/searchablePlane.C new file mode 100644 index 0000000000..cb2a4e2fb9 --- /dev/null +++ b/src/meshTools/searchableSurface/searchablePlane.C @@ -0,0 +1,231 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 1991-2009 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 + +\*---------------------------------------------------------------------------*/ + +#include "searchablePlane.H" +#include "addToRunTimeSelectionTable.H" +#include "SortableList.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ + +defineTypeNameAndDebug(searchablePlane, 0); +addToRunTimeSelectionTable(searchableSurface, searchablePlane, dict); + +} + + +// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // + +Foam::pointIndexHit Foam::searchablePlane::findLine +( + const point& start, + const point& end +) const +{ + pointIndexHit info(true, vector::zero, 0); + + linePointRef l(start, end); + + scalar t = lineIntersect(l); + + if (t < 0 || t > 1) + { + info.setMiss(); + info.setIndex(-1); + } + else + { + info.setPoint(start+t*l.vec()); + } + + return info; +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::searchablePlane::searchablePlane +( + const IOobject& io, + const point& basePoint, + const vector& normal +) +: + searchableSurface(io), + plane(basePoint, normal) +{} + + +Foam::searchablePlane::searchablePlane +( + const IOobject& io, + const dictionary& dict +) +: + searchableSurface(io), + plane(dict) +{} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::searchablePlane::~searchablePlane() +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +const Foam::wordList& Foam::searchablePlane::regions() const +{ + if (regions_.empty()) + { + regions_.setSize(1); + regions_[0] = "region0"; + } + return regions_; +} + + +void Foam::searchablePlane::findNearest +( + const pointField& samples, + const scalarField& nearestDistSqr, + List& info +) const +{ + info.setSize(samples.size()); + + forAll(samples, i) + { + info[i].setPoint(nearestPoint(samples[i])); + + if (magSqr(samples[i]-info[i].rawPoint()) > nearestDistSqr[i]) + { + info[i].setIndex(-1); + info[i].setMiss(); + } + else + { + info[i].setIndex(0); + info[i].setHit(); + } + } +} + + +void Foam::searchablePlane::findLine +( + const pointField& start, + const pointField& end, + List& info +) const +{ + info.setSize(start.size()); + + forAll(start, i) + { + info[i] = findLine(start[i], end[i]); + } +} + + +void Foam::searchablePlane::findLineAny +( + const pointField& start, + const pointField& end, + List& info +) const +{ + findLine(start, end, info); +} + + +void Foam::searchablePlane::findLineAll +( + const pointField& start, + const pointField& end, + List >& info +) const +{ + List nearestInfo; + findLine(start, end, nearestInfo); + + info.setSize(start.size()); + forAll(info, pointI) + { + if (nearestInfo[pointI].hit()) + { + info[pointI].setSize(1); + info[pointI][0] = nearestInfo[pointI]; + } + else + { + info[pointI].clear(); + } + } +} + + +void Foam::searchablePlane::getRegion +( + const List& info, + labelList& region +) const +{ + region.setSize(info.size()); + region = 0; +} + + +void Foam::searchablePlane::getNormal +( + const List& info, + vectorField& n +) const +{ + n.setSize(info.size()); + n = normal(); +} + + +void Foam::searchablePlane::getVolumeType +( + const pointField& points, + List& volType +) const +{ + FatalErrorIn + ( + "searchableCollection::getVolumeType(const pointField&" + ", List&) const" + ) << "Volume type not supported for plane." + << exit(FatalError); +} + + +// ************************************************************************* // diff --git a/src/meshTools/searchableSurface/searchablePlane.H b/src/meshTools/searchableSurface/searchablePlane.H new file mode 100644 index 0000000000..87777e3209 --- /dev/null +++ b/src/meshTools/searchableSurface/searchablePlane.H @@ -0,0 +1,199 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 1991-2009 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 + +Class + Foam::searchablePlane + +Description + Searching on plane. See plane.H + +SourceFiles + searchablePlane.C + +\*---------------------------------------------------------------------------*/ + +#ifndef searchablePlane_H +#define searchablePlane_H + +#include "searchableSurface.H" +#include "plane.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// Forward declaration of classes + +/*---------------------------------------------------------------------------*\ + Class searchablePlane Declaration +\*---------------------------------------------------------------------------*/ + +class searchablePlane +: + public searchableSurface, + public plane +{ +private: + + // Private Member Data + + mutable wordList regions_; + + + // Private Member Functions + + pointIndexHit findLine + ( + const point& start, + const point& end + ) const; + + + //- Disallow default bitwise copy construct + searchablePlane(const searchablePlane&); + + //- Disallow default bitwise assignment + void operator=(const searchablePlane&); + + +public: + + //- Runtime type information + TypeName("searchablePlane"); + + + // Constructors + + //- Construct from components + searchablePlane + ( + const IOobject& io, + const point& basePoint, + const vector& normal + ); + + //- Construct from dictionary (used by searchableSurface) + searchablePlane + ( + const IOobject& io, + const dictionary& dict + ); + + // Destructor + + virtual ~searchablePlane(); + + + // Member Functions + + virtual const wordList& regions() const; + + //- Whether supports volume type below + virtual bool hasVolumeType() const + { + return false; + } + + //- Range of local indices that can be returned. + virtual label size() const + { + return 1; + } + + + // Multiple point queries. + + virtual void findNearest + ( + const pointField& sample, + const scalarField& nearestDistSqr, + List& + ) const; + + virtual void findLine + ( + const pointField& start, + const pointField& end, + List& + ) const; + + virtual void findLineAny + ( + const pointField& start, + const pointField& end, + List& + ) const; + + //- Get all intersections in order from start to end. + virtual void findLineAll + ( + const pointField& start, + const pointField& end, + List >& + ) const; + + //- From a set of points and indices get the region + virtual void getRegion + ( + const List&, + labelList& region + ) const; + + //- From a set of points and indices get the normal + virtual void getNormal + ( + const List&, + vectorField& normal + ) const; + + //- Determine type (inside/outside/mixed) for point. unknown if + // cannot be determined (e.g. non-manifold surface) + virtual void getVolumeType + ( + const pointField&, + List& + ) const; + + + // regIOobject implementation + + bool writeData(Ostream&) const + { + notImplemented("searchablePlane::writeData(Ostream&) const"); + return false; + } + +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/meshTools/searchableSurface/searchablePlate.C b/src/meshTools/searchableSurface/searchablePlate.C index 8d61564287..c72e28a7de 100644 --- a/src/meshTools/searchableSurface/searchablePlate.C +++ b/src/meshTools/searchableSurface/searchablePlate.C @@ -218,7 +218,16 @@ Foam::searchablePlate::searchablePlate origin_(origin), span_(span), normalDir_(calcNormal(span_)) -{} +{ + if (debug) + { + Info<< "searchablePlate::searchablePlate :" + << " origin:" << origin_ + << " origin+span:" << origin_+span_ + << " normal:" << vector::componentNames[normalDir_] + << endl; + } +} Foam::searchablePlate::searchablePlate @@ -231,7 +240,16 @@ Foam::searchablePlate::searchablePlate origin_(dict.lookup("origin")), span_(dict.lookup("span")), normalDir_(calcNormal(span_)) -{} +{ + if (debug) + { + Info<< "searchablePlate::searchablePlate :" + << " origin:" << origin_ + << " origin+span:" << origin_+span_ + << " normal:" << vector::componentNames[normalDir_] + << endl; + } +} // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // diff --git a/src/meshTools/searchableSurface/searchablePlate.H b/src/meshTools/searchableSurface/searchablePlate.H index 957f51ee91..7bc900f554 100644 --- a/src/meshTools/searchableSurface/searchablePlate.H +++ b/src/meshTools/searchableSurface/searchablePlate.H @@ -27,7 +27,14 @@ Class Description Searching on finite plate. Plate has to be aligned with coordinate - axes! + axes. + Plate defined as origin and span. One of the components of span has + to be 0 which defines the normal direction. E.g. + + span = (Sx Sy 0) // plate in x-y plane + origin = (Ox Oy Oz) + + now plane is from (Ox Oy Oz) to (Ox+Sx Oy+Sy Oz) SourceFiles searchablePlate.C diff --git a/src/meshTools/sets/cellSources/nbrToCell/nbrToCell.C b/src/meshTools/sets/cellSources/nbrToCell/nbrToCell.C index 5b1ae0ae69..208a913f5d 100644 --- a/src/meshTools/sets/cellSources/nbrToCell/nbrToCell.C +++ b/src/meshTools/sets/cellSources/nbrToCell/nbrToCell.C @@ -22,8 +22,6 @@ License along with OpenFOAM; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -Description - \*---------------------------------------------------------------------------*/ #include "nbrToCell.H" @@ -58,22 +56,46 @@ Foam::topoSetSource::addToUsageTable Foam::nbrToCell::usage_ void Foam::nbrToCell::combine(topoSet& set, const bool add) const { const cellList& cells = mesh().cells(); + const polyBoundaryMesh& patches = mesh_.boundaryMesh(); + + boolList isCoupled(mesh_.nFaces()-mesh_.nInternalFaces(), false); + + forAll(patches, patchI) + { + const polyPatch& pp = patches[patchI]; + + if (pp.coupled()) + { + label faceI = pp.start(); + forAll(pp, i) + { + isCoupled[faceI-mesh_.nInternalFaces()] = true; + faceI++; + } + } + } forAll(cells, cellI) { - const cell& cll = cells[cellI]; + const cell& cFaces = cells[cellI]; - label nInternalFaces = 0; + label nNbrCells = 0; - forAll(cll, i) + forAll(cFaces, i) { - if (mesh().isInternalFace(cll[i])) + label faceI = cFaces[i]; + + if (mesh_.isInternalFace(faceI)) { - nInternalFaces++; + nNbrCells++; + } + else if (isCoupled[faceI-mesh_.nInternalFaces()]) + { + nNbrCells++; } } - if (nInternalFaces <= minNbrs_) + if (nNbrCells <= minNbrs_) { addOrDelete(set, cellI, add); } diff --git a/src/meshTools/sets/cellSources/nbrToCell/nbrToCell.H b/src/meshTools/sets/cellSources/nbrToCell/nbrToCell.H index a30a48ebde..708c38c11e 100644 --- a/src/meshTools/sets/cellSources/nbrToCell/nbrToCell.H +++ b/src/meshTools/sets/cellSources/nbrToCell/nbrToCell.H @@ -27,7 +27,7 @@ Class Description A topoSetSource to select cells based on number of neighbouring cells - (i.e. number of internal faces) + (i.e. number of internal or coupled faces) SourceFiles nbrToCell.C diff --git a/src/meshTools/sets/faceSources/cellToFace/cellToFace.C b/src/meshTools/sets/faceSources/cellToFace/cellToFace.C index ae75c3d207..59d3e2e9eb 100644 --- a/src/meshTools/sets/faceSources/cellToFace/cellToFace.C +++ b/src/meshTools/sets/faceSources/cellToFace/cellToFace.C @@ -22,14 +22,13 @@ License along with OpenFOAM; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -Description - \*---------------------------------------------------------------------------*/ #include "cellToFace.H" #include "polyMesh.H" #include "cellSet.H" #include "Time.H" +#include "syncTools.H" #include "addToRunTimeSelectionTable.H" // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // @@ -102,48 +101,58 @@ void Foam::cellToFace::combine(topoSet& set, const bool add) const { // Add all faces whose both neighbours are in set. - // Count number of cells using face. - Map