ENH: cellToFaceZone: new topoSetSource

This commit is contained in:
mattijs
2022-09-12 16:51:11 +01:00
committed by Andrew Heather
parent c439968390
commit d0061d6f54
4 changed files with 487 additions and 0 deletions

View File

@ -224,6 +224,7 @@ $(faceZoneSources)/setToFaceZone/setToFaceZone.C
$(faceZoneSources)/setAndNormalToFaceZone/setAndNormalToFaceZone.C
$(faceZoneSources)/searchableSurfaceToFaceZone/searchableSurfaceToFaceZone.C
$(faceZoneSources)/planeToFaceZone/planeToFaceZone.C
$(faceZoneSources)/cellToFaceZone/cellToFaceZone.C
cellZoneSources = topoSet/cellZoneSources
$(cellZoneSources)/topoSetCellZoneSource/topoSetCellZoneSource.C

View File

@ -0,0 +1,287 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | www.openfoam.com
\\/ M anipulation |
-------------------------------------------------------------------------------
Copyright (C) 2022 OpenCFD Ltd.
-------------------------------------------------------------------------------
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 <http://www.gnu.org/licenses/>.
\*---------------------------------------------------------------------------*/
#include "cellToFaceZone.H"
#include "polyMesh.H"
#include "faceZoneSet.H"
#include "cellSet.H"
#include "syncTools.H"
#include "addToRunTimeSelectionTable.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
namespace Foam
{
defineTypeNameAndDebug(cellToFaceZone, 0);
addToRunTimeSelectionTable(topoSetSource, cellToFaceZone, word);
addToRunTimeSelectionTable(topoSetSource, cellToFaceZone, istream);
addToRunTimeSelectionTable(topoSetFaceZoneSource, cellToFaceZone, word);
addToRunTimeSelectionTable(topoSetFaceZoneSource, cellToFaceZone, istream);
}
Foam::topoSetSource::addToUsageTable Foam::cellToFaceZone::usage_
(
cellToFaceZone::typeName,
"\n Usage: cellToFaceZone <slaveCellSet>\n\n"
" Select all outside faces in the cellSet."
" Orientated so slave side is in cellSet.\n\n"
);
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
void Foam::cellToFaceZone::selectFaces
(
const cellSet& cSet,
bitSet& selectedFace,
bitSet& doFlip
) const
{
selectedFace.setSize(mesh_.nFaces());
selectedFace = false;
doFlip.setSize(mesh_.nFaces());
doFlip = false;
// Add all faces whose both neighbours are in set.
const label nInt = mesh_.nInternalFaces();
const labelList& own = mesh_.faceOwner();
const labelList& nei = mesh_.faceNeighbour();
const polyBoundaryMesh& patches = mesh_.boundaryMesh();
// Check all internal faces
for (label facei = 0; facei < nInt; ++facei)
{
const bool ownFound = cSet.found(own[facei]);
const bool neiFound = cSet.found(nei[facei]);
if (ownFound && !neiFound)
{
selectedFace.set(facei);
doFlip.set(facei, flip_);
}
else if (!ownFound && neiFound)
{
selectedFace.set(facei);
doFlip.set(facei, !flip_);
}
}
// Get coupled cell status
boolList neiInSet(mesh_.nBoundaryFaces(), false);
for (const polyPatch& pp : patches)
{
if (pp.coupled())
{
label facei = pp.start();
forAll(pp, i)
{
neiInSet[facei-nInt] = cSet.found(own[facei]);
++facei;
}
}
}
syncTools::swapBoundaryFaceList(mesh_, neiInSet);
// Check all boundary faces
for (const polyPatch& pp : patches)
{
label facei = pp.start();
forAll(pp, i)
{
const bool ownFound = cSet.found(own[facei]);
const bool neiFound = neiInSet[facei-nInt];
if (ownFound && !neiFound)
{
selectedFace.set(facei);
doFlip.set(facei, flip_);
}
else if (!ownFound && neiFound)
{
selectedFace.set(facei);
doFlip.set(facei, !flip_);
}
++facei;
}
}
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::cellToFaceZone::cellToFaceZone
(
const polyMesh& mesh,
const word& setName,
const bool flip
)
:
topoSetFaceZoneSource(mesh),
names_(one{}, setName),
flip_(flip)
{}
Foam::cellToFaceZone::cellToFaceZone
(
const polyMesh& mesh,
const dictionary& dict
)
:
topoSetFaceZoneSource(mesh),
names_(),
flip_(dict.getOrDefault("flip", false))
{
// Look for 'sets' or 'set'
if (!dict.readIfPresent("sets", names_))
{
names_.resize(1);
dict.readEntry("set", names_.first());
}
}
Foam::cellToFaceZone::cellToFaceZone
(
const polyMesh& mesh,
Istream& is
)
:
topoSetFaceZoneSource(mesh),
names_(one{}, word(checkIs(is))),
flip_(false)
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
void Foam::cellToFaceZone::applyToSet
(
const topoSetSource::setAction action,
topoSet& set
) const
{
if (!isA<faceZoneSet>(set))
{
WarningInFunction
<< "Operation only allowed on a faceZoneSet." << endl;
return;
}
else
{
faceZoneSet& zoneSet = refCast<faceZoneSet>(set);
if (action == topoSetSource::ADD || action == topoSetSource::NEW)
{
if (verbose_)
{
if (flip_)
{
Info<< " Adding all faces on outside of cellSet "
<< flatOutput(names_)
<< "; orientation pointing into cellSet" << endl;
}
else
{
Info<< " Adding all faces on outside of cellSet "
<< flatOutput(names_)
<< "; orientation pointing away from cellSet" << endl;
}
}
bitSet selectedFace(mesh_.nFaces());
bitSet doFlip(mesh_.nFaces());
for (const word& setName : names_)
{
// Load the sets
cellSet cSet(mesh_, setName);
// Select outside faces
selectFaces(cSet, selectedFace, doFlip);
}
// Start off from copy
DynamicList<label> newAddressing(zoneSet.addressing());
DynamicList<bool> newFlipMap(zoneSet.flipMap());
for (const label facei : selectedFace)
{
if (!zoneSet.found(facei))
{
newAddressing.append(facei);
newFlipMap.append(doFlip[facei]);
}
}
zoneSet.addressing().transfer(newAddressing);
zoneSet.flipMap().transfer(newFlipMap);
zoneSet.updateSet();
}
else if (action == topoSetSource::SUBTRACT)
{
if (verbose_)
{
Info<< " Removing all faces on outside of cellSet "
<< flatOutput(names_)
<< " ..." << endl;
}
bitSet selectedFace(mesh_.nFaces());
bitSet doFlip(mesh_.nFaces());
for (const word& setName : names_)
{
// Load the sets
cellSet cSet(mesh_, setName);
// Select outside faces
selectFaces(cSet, selectedFace, doFlip);
}
// Start off empty
DynamicList<label> newAddressing(zoneSet.addressing().size());
DynamicList<bool> newFlipMap(zoneSet.flipMap().size());
for (const label facei : selectedFace)
{
newAddressing.append(facei);
newFlipMap.append(doFlip[facei]);
}
zoneSet.addressing().transfer(newAddressing);
zoneSet.flipMap().transfer(newFlipMap);
zoneSet.updateSet();
}
}
}
// ************************************************************************* //

View File

@ -0,0 +1,190 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | www.openfoam.com
\\/ M anipulation |
-------------------------------------------------------------------------------
Copyright (C) 2022 OpenCFD Ltd.
-------------------------------------------------------------------------------
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 <http://www.gnu.org/licenses/>.
Class
Foam::cellToFaceZone
Description
A \c topoSetSource to select faces with only one
neighbour (i.e. outside) in a specified \c cellSet.
This is just a shortcut for
- extracting outside faces as a \c faceSet (\c cellToFace with \c outside).
- using \c setsToFaceZone to convert \c faceSet
and \c cellSet to oriented \c faceZone.
Operands:
\table
Operand | Type | Location
input | cellSet(s) | constant/polyMesh/sets/\<set\>
output | faceZone | constant/polyMesh/faceZones
\endtable
Usage
Minimal example by using \c system/topoSetDict.actions:
\verbatim
{
// Mandatory entries
name <name>;
type faceZoneSet;
action <action>;
source cellToFaceZone;
// Select either of the below
// Option-1
sets
(
<word>
<word>
...
);
// Option-2
set <word>;
// Optional entries
flip <bool>;
}
\endverbatim
where the entries mean:
\table
Property | Description | Type | Reqd | Deflt
name | Name of faceZone | word | yes | -
type | Type name: faceZoneSet | word | yes | -
action | Action applied on faces - see below | word | yes | -
source | Source name: cellToFaceZone | word | yes | -
set(s) | Name of input cellSet(s) containing the slave cells <!--
--> | word | yes | -
flip | Flag to select master/slave cells | bool | no | false
\endtable
Options for the \c action entry:
\verbatim
new | Create a new faceZone from selected faces
add | Add selected faces of a faceZoneSet into this faceZone
subtract | Remove selected faces of a faceZoneSet from this faceZone
\endverbatim
Notes
- \c flip=true sets the orientation of faces
pointing into the \c cellSet, and vice versa.
SourceFiles
cellToFaceZone.C
\*---------------------------------------------------------------------------*/
#ifndef Foam_cellToFaceZone_H
#define Foam_cellToFaceZone_H
#include "topoSetFaceZoneSource.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
// Forward Declarations
class cellSet;
/*---------------------------------------------------------------------------*\
Class cellToFaceZone Declaration
\*---------------------------------------------------------------------------*/
class cellToFaceZone
:
public topoSetFaceZoneSource
{
// Private Data
//- Add usage string
static addToUsageTable usage_;
//- Names of cellSets to use
wordList names_;
//- Whether cellSet is slave cells or master cells
const bool flip_;
// Private Member Functions
//- Select outside faces of cellSet
void selectFaces
(
const cellSet& cSet,
bitSet& selectedFace,
bitSet& doFlip
) const;
public:
//- Runtime type information
TypeName("cellToFaceZone");
// Constructors
//- Construct from components
cellToFaceZone
(
const polyMesh& mesh,
const word& cellSetName,
const bool flip
);
//- Construct from dictionary
cellToFaceZone(const polyMesh& mesh, const dictionary& dict);
//- Construct from Istream
cellToFaceZone(const polyMesh& mesh, Istream& is);
//- Destructor
virtual ~cellToFaceZone() = default;
// Member Functions
virtual void applyToSet
(
const topoSetSource::setAction action,
topoSet& set
) const;
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View File

@ -439,6 +439,15 @@ actions
// flip true;
// }
{
name cellToFaceZone1;
type faceZoneSet;
action new;
source cellToFaceZone;
set cylinder1;
flip true;
}
{
name pointBox1;
type pointSet;