diff --git a/src/meshTools/Make/files b/src/meshTools/Make/files
index 4fcdeafb7a..8f9880af3b 100644
--- a/src/meshTools/Make/files
+++ b/src/meshTools/Make/files
@@ -134,6 +134,7 @@ searchableSurfaces/subTriSurfaceMesh/subTriSurfaceMesh.C
searchableSurfaces/triSurfaceMesh/triSurfaceMesh.C
topoSets = sets/topoSets
+$(topoSets)/cellBitSet.C
$(topoSets)/cellSet.C
$(topoSets)/topoSet.C
$(topoSets)/faceSet.C
diff --git a/src/meshTools/sets/topoSets/cellBitSet.C b/src/meshTools/sets/topoSets/cellBitSet.C
new file mode 100644
index 0000000000..4838b13a60
--- /dev/null
+++ b/src/meshTools/sets/topoSets/cellBitSet.C
@@ -0,0 +1,179 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2018 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 3 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, see .
+
+\*---------------------------------------------------------------------------*/
+
+#include "cellBitSet.H"
+#include "polyMesh.H"
+#include "Time.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+ defineTypeNameAndDebug(cellBitSet, 0);
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::cellBitSet::cellBitSet(const polyMesh& mesh)
+:
+ cellBitSet(mesh, false)
+{}
+
+
+Foam::cellBitSet::cellBitSet(const polyMesh& mesh, const bool val)
+:
+ topoSet
+ (
+ IOobject
+ (
+ "cellBitSet",
+ mesh.time().constant(),
+ mesh,
+ IOobject::NO_READ,
+ IOobject::NO_WRITE,
+ false
+ ),
+ 0 // zero-sized (unallocated) labelHashSet
+ ),
+ selected_(mesh.nCells(), val)
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
+
+bool Foam::cellBitSet::found(const label id) const
+{
+ return selected_.test(id);
+}
+
+
+bool Foam::cellBitSet::set(const label id)
+{
+ return selected_.set(id);
+}
+
+
+bool Foam::cellBitSet::unset(const label id)
+{
+ return selected_.unset(id);
+}
+
+
+void Foam::cellBitSet::set(const labelUList& labels)
+{
+ selected_.set(labels);
+}
+
+
+void Foam::cellBitSet::unset(const labelUList& labels)
+{
+ selected_.unset(labels);
+}
+
+
+void Foam::cellBitSet::invert(const label maxLen)
+{
+ selected_.resize(maxLen);
+ selected_.flip();
+}
+
+
+void Foam::cellBitSet::subset(const topoSet& set)
+{
+ // Only retain entries found in both sets
+ if (isA(set))
+ {
+ selected_ &= refCast(set).selected_;
+ }
+ else if (set.empty())
+ {
+ selected_.reset();
+ }
+ else
+ {
+ for (const label id : selected_)
+ {
+ if (!set.found(id))
+ {
+ selected_.unset(id);
+ }
+ }
+ }
+}
+
+
+void Foam::cellBitSet::addSet(const topoSet& set)
+{
+ // Add entries to the set
+ if (isA(set))
+ {
+ selected_ |= refCast(set).selected_;
+ }
+ else
+ {
+ for (const label id : set)
+ {
+ selected_.set(id);
+ }
+ }
+}
+
+
+void Foam::cellBitSet::subtractSet(const topoSet& set)
+{
+ // Subtract entries from the set
+ if (isA(set))
+ {
+ selected_ -= refCast(set).selected_;
+ }
+ else
+ {
+ for (const label id : set)
+ {
+ selected_.unset(id);
+ }
+ }
+}
+
+
+Foam::label Foam::cellBitSet::maxSize(const polyMesh& mesh) const
+{
+ return mesh.nCells();
+}
+
+
+void Foam::cellBitSet::writeDebug
+(
+ Ostream& os,
+ const primitiveMesh& mesh,
+ const label maxLen
+) const
+{
+ topoSet::writeDebug(os, mesh.cellCentres(), maxLen);
+}
+
+
+// ************************************************************************* //
diff --git a/src/meshTools/sets/topoSets/cellBitSet.H b/src/meshTools/sets/topoSets/cellBitSet.H
new file mode 100644
index 0000000000..ba64b40595
--- /dev/null
+++ b/src/meshTools/sets/topoSets/cellBitSet.H
@@ -0,0 +1,160 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2018 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 3 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, see .
+
+Class
+ Foam::cellBitSet
+
+Description
+ A special purpose topoSet with the cell labels stored as a bitSet.
+ It does not correspond to a cellSet either (no associated IOobject).
+
+SourceFiles
+ cellBitSet.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef cellBitSet_H
+#define cellBitSet_H
+
+#include "topoSet.H"
+#include "bitSet.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+/*---------------------------------------------------------------------------*\
+ Class cellBitSet Declaration
+\*---------------------------------------------------------------------------*/
+
+class cellBitSet
+:
+ public topoSet
+{
+ // Private data
+
+ bitSet selected_;
+
+public:
+
+ //- Runtime type information
+ TypeName("cellBitSet");
+
+
+ // Constructors
+
+ //- Construct with nCells elements, all elements unset
+ explicit cellBitSet(const polyMesh& mesh);
+
+ //- Construct with nCells elements, using initial val
+ cellBitSet(const polyMesh& mesh, const bool val);
+
+
+ //- Destructor
+ virtual ~cellBitSet() = default;
+
+
+ // Member Functions
+
+ //- Return the bitSet
+ const bitSet& addressing() const
+ {
+ return selected_;
+ }
+
+ //- Access the bitSet
+ bitSet& addressing()
+ {
+ return selected_;
+ }
+
+ //- Set values to false, leaving the size untouched
+ void reset()
+ {
+ selected_.reset();
+ }
+
+ //- Has the given index?
+ virtual bool found(const label id) const;
+
+ //- Set an index
+ virtual bool set(const label id);
+
+ //- Unset an index
+ virtual bool unset(const label id);
+
+ //- Set multiple indices
+ virtual void set(const labelUList& labels);
+
+ //- Unset multiple indices
+ virtual void unset(const labelUList& labels);
+
+ //- Invert contents.
+ // Insert all members [0,maxLen) which were not in set.
+ virtual void invert(const label maxLen);
+
+ //- Subset contents. Only elements present in both sets remain.
+ virtual void subset(const topoSet& set);
+
+ //- Add elements present in set.
+ virtual void addSet(const topoSet& set);
+
+ //- Subtract elements present in set.
+ virtual void subtractSet(const topoSet& set);
+
+ //- Sync cellBitSet across coupled patches.
+ virtual void sync(const polyMesh& mesh)
+ {}
+
+ //- Return max index+1.
+ virtual label maxSize(const polyMesh& mesh) const;
+
+ //- Update any stored data for new labels.
+ virtual void updateMesh(const mapPolyMesh& morphMap)
+ {}
+
+ //- Update any stored data for mesh redistribution.
+ virtual void distribute(const mapDistributePolyMesh& map)
+ {}
+
+ //- Write maxLen items with label and coordinates.
+ virtual void writeDebug
+ (
+ Ostream& os,
+ const primitiveMesh& mesh,
+ const label maxLen
+ ) const;
+
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/meshTools/sets/topoSets/topoSet.C b/src/meshTools/sets/topoSets/topoSet.C
index a7ddabcb7b..040eec3c0d 100644
--- a/src/meshTools/sets/topoSets/topoSet.C
+++ b/src/meshTools/sets/topoSets/topoSet.C
@@ -491,6 +491,12 @@ Foam::topoSet::topoSet(const IOobject& io, labelHashSet&& labels)
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
+bool Foam::topoSet::found(const label id) const
+{
+ return static_cast(*this).found(id);
+}
+
+
bool Foam::topoSet::set(const label id)
{
return static_cast(*this).set(id);
diff --git a/src/meshTools/sets/topoSets/topoSet.H b/src/meshTools/sets/topoSets/topoSet.H
index 7f4e1e9589..3fa955ab7b 100644
--- a/src/meshTools/sets/topoSets/topoSet.H
+++ b/src/meshTools/sets/topoSets/topoSet.H
@@ -313,6 +313,9 @@ public:
// Member Functions
+ //- Has the given index?
+ virtual bool found(const label id) const;
+
//- Set an index
virtual bool set(const label id);