mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
ENH: revise patch group selection to ensightMesh
- supports inGroup while also respecting allow/deny semantics - support inGroup for cellZone/faceZone selection
This commit is contained in:
@ -6,7 +6,7 @@
|
|||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2011-2016 OpenFOAM Foundation
|
Copyright (C) 2011-2016 OpenFOAM Foundation
|
||||||
Copyright (C) 2016-2024 OpenCFD Ltd.
|
Copyright (C) 2016-2025 OpenCFD Ltd.
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -31,36 +31,13 @@ License
|
|||||||
#include "polyMesh.H"
|
#include "polyMesh.H"
|
||||||
#include "emptyPolyPatch.H"
|
#include "emptyPolyPatch.H"
|
||||||
#include "processorPolyPatch.H"
|
#include "processorPolyPatch.H"
|
||||||
#include "stringListOps.H" // For stringListOps::findMatching()
|
#include "ListOps.H"
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||||
|
|
||||||
const Foam::label Foam::ensightMesh::internalZone = -1;
|
const Foam::label Foam::ensightMesh::internalZone = -1;
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * Local Functions * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
namespace Foam
|
|
||||||
{
|
|
||||||
|
|
||||||
// Patch names without processor patches
|
|
||||||
static wordList nonProcessorPatchNames(const polyBoundaryMesh& bmesh)
|
|
||||||
{
|
|
||||||
#ifdef FULLDEBUG
|
|
||||||
// Patches are output. Check that they are synced.
|
|
||||||
bmesh.checkParallelSync(true);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
wordList patchNames(bmesh.names());
|
|
||||||
patchNames.resize(bmesh.nNonProcessor());
|
|
||||||
|
|
||||||
return patchNames;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
} // End namespace Foam
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
||||||
|
|
||||||
void Foam::ensightMesh::clear()
|
void Foam::ensightMesh::clear()
|
||||||
@ -141,63 +118,69 @@ void Foam::ensightMesh::correct()
|
|||||||
{
|
{
|
||||||
clear();
|
clear();
|
||||||
|
|
||||||
const wordRes& czMatcher = option().cellZoneSelection();
|
const auto& pbm = mesh_.boundaryMesh();
|
||||||
const wordRes& fzMatcher = option().faceZoneSelection();
|
|
||||||
|
|
||||||
// Possible cellZones
|
// Selected patch indices
|
||||||
const wordList czNames =
|
labelList patchIds;
|
||||||
(
|
|
||||||
|
if (option().useBoundaryMesh())
|
||||||
|
{
|
||||||
|
patchIds = pbm.indices
|
||||||
(
|
(
|
||||||
option().useCellZones()
|
|
||||||
&& (!czMatcher.empty() || option().useInternalMesh())
|
|
||||||
)
|
|
||||||
? mesh_.cellZones().names()
|
|
||||||
: wordList()
|
|
||||||
);
|
|
||||||
|
|
||||||
const labelList czoneIds =
|
|
||||||
(
|
|
||||||
czMatcher.empty()
|
|
||||||
? identity(czNames.size()) // All
|
|
||||||
: czMatcher.matching(czNames) // Selected names
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
// Possible faceZones
|
|
||||||
const wordList fzNames =
|
|
||||||
(
|
|
||||||
option().useFaceZones()
|
|
||||||
? mesh_.faceZones().names()
|
|
||||||
: wordList()
|
|
||||||
);
|
|
||||||
|
|
||||||
const labelList fzoneIds =
|
|
||||||
(
|
|
||||||
fzMatcher.empty()
|
|
||||||
? identity(fzNames.size()) // All
|
|
||||||
: fzMatcher.matching(fzNames) // Selected names
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
// Possible patchNames
|
|
||||||
const wordList patchNames =
|
|
||||||
(
|
|
||||||
option().useBoundaryMesh()
|
|
||||||
? nonProcessorPatchNames(mesh_.boundaryMesh())
|
|
||||||
: wordList()
|
|
||||||
);
|
|
||||||
|
|
||||||
const labelList patchIds =
|
|
||||||
(
|
|
||||||
option().useBoundaryMesh()
|
|
||||||
? stringListOps::findMatching
|
|
||||||
(
|
|
||||||
patchNames,
|
|
||||||
option().patchSelection(),
|
option().patchSelection(),
|
||||||
option().patchExclude()
|
option().patchExclude()
|
||||||
)
|
);
|
||||||
: labelList()
|
|
||||||
);
|
// Prune undesirable patches - empty and processor patches
|
||||||
|
label count = 0;
|
||||||
|
for (const label patchi : patchIds)
|
||||||
|
{
|
||||||
|
const auto& pp = pbm[patchi];
|
||||||
|
|
||||||
|
if (isType<emptyPolyPatch>(pp))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else if (isA<processorPolyPatch>(pp))
|
||||||
|
{
|
||||||
|
break; // No processor patches
|
||||||
|
}
|
||||||
|
|
||||||
|
patchIds[count] = patchi;
|
||||||
|
++count;
|
||||||
|
}
|
||||||
|
patchIds.resize(count);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Selection of cellZones
|
||||||
|
const auto& czMatcher = option().cellZoneSelection();
|
||||||
|
|
||||||
|
// Selected cell zone indices
|
||||||
|
labelList czoneIds;
|
||||||
|
|
||||||
|
if (option().useCellZones())
|
||||||
|
{
|
||||||
|
// Use allow/deny to have desired behaviour with empty selection
|
||||||
|
czoneIds = mesh_.cellZones().indices
|
||||||
|
(
|
||||||
|
option().cellZoneSelection(),
|
||||||
|
option().cellZoneExclude()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Selected face zone indices
|
||||||
|
labelList fzoneIds;
|
||||||
|
|
||||||
|
if (option().useFaceZones())
|
||||||
|
{
|
||||||
|
// Use allow/deny to have desired behaviour with empty selection
|
||||||
|
fzoneIds = mesh_.faceZones().indices
|
||||||
|
(
|
||||||
|
option().faceZoneSelection(),
|
||||||
|
option().faceZoneExclude()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Track which cells are in a zone or not
|
// Track which cells are in a zone or not
|
||||||
@ -210,8 +193,8 @@ void Foam::ensightMesh::correct()
|
|||||||
// cellZones first
|
// cellZones first
|
||||||
for (const label zoneId : czoneIds)
|
for (const label zoneId : czoneIds)
|
||||||
{
|
{
|
||||||
const word& zoneName = czNames[zoneId];
|
const auto& zn = mesh_.cellZones()[zoneId];
|
||||||
const cellZone& zn = mesh_.cellZones()[zoneId];
|
const auto& zoneName = zn.name();
|
||||||
|
|
||||||
if (returnReduceOr(!zn.empty()))
|
if (returnReduceOr(!zn.empty()))
|
||||||
{
|
{
|
||||||
@ -323,7 +306,7 @@ void Foam::ensightMesh::correct()
|
|||||||
// Ensure full mesh coverage
|
// Ensure full mesh coverage
|
||||||
excludeFace.resize(mesh_.nFaces());
|
excludeFace.resize(mesh_.nFaces());
|
||||||
|
|
||||||
for (const polyPatch& p : mesh_.boundaryMesh())
|
for (const polyPatch& p : pbm)
|
||||||
{
|
{
|
||||||
const auto* cpp = isA<coupledPolyPatch>(p);
|
const auto* cpp = isA<coupledPolyPatch>(p);
|
||||||
|
|
||||||
@ -344,8 +327,8 @@ void Foam::ensightMesh::correct()
|
|||||||
// Patches
|
// Patches
|
||||||
for (const label patchId : patchIds)
|
for (const label patchId : patchIds)
|
||||||
{
|
{
|
||||||
const word& patchName = patchNames[patchId];
|
const auto& p = pbm[patchId];
|
||||||
const polyPatch& p = mesh_.boundaryMesh()[patchId];
|
const auto& patchName = p.name();
|
||||||
|
|
||||||
if (isA<emptyPolyPatch>(p))
|
if (isA<emptyPolyPatch>(p))
|
||||||
{
|
{
|
||||||
@ -386,11 +369,10 @@ void Foam::ensightMesh::correct()
|
|||||||
|
|
||||||
|
|
||||||
// Face zones
|
// Face zones
|
||||||
|
|
||||||
for (const label zoneId : fzoneIds)
|
for (const label zoneId : fzoneIds)
|
||||||
{
|
{
|
||||||
const word& zoneName = fzNames[zoneId];
|
const auto& zn = mesh_.faceZones()[zoneId];
|
||||||
const faceZone& zn = mesh_.faceZones()[zoneId];
|
const auto& zoneName = zn.name();
|
||||||
|
|
||||||
ensightFaces& part = faceZoneParts_(zoneId);
|
ensightFaces& part = faceZoneParts_(zoneId);
|
||||||
|
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2011-2016 OpenFOAM Foundation
|
Copyright (C) 2011-2016 OpenFOAM Foundation
|
||||||
Copyright (C) 2016-2024 OpenCFD Ltd.
|
Copyright (C) 2016-2025 OpenCFD Ltd.
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -292,34 +292,46 @@ public:
|
|||||||
//- Using boundary?
|
//- Using boundary?
|
||||||
bool useBoundaryMesh() const noexcept;
|
bool useBoundaryMesh() const noexcept;
|
||||||
|
|
||||||
//- Using faceZones?
|
|
||||||
bool useFaceZones() const noexcept;
|
|
||||||
|
|
||||||
//- Using cellZones?
|
//- Using cellZones?
|
||||||
bool useCellZones() const noexcept;
|
bool useCellZones() const noexcept;
|
||||||
|
|
||||||
|
//- Using faceZones?
|
||||||
|
bool useFaceZones() const noexcept;
|
||||||
|
|
||||||
//- Selection of patches. Empty if unspecified.
|
//- Selection of patches. Empty if unspecified.
|
||||||
const wordRes& patchSelection() const noexcept
|
const wordRes& patchSelection() const noexcept
|
||||||
{
|
{
|
||||||
return patchInclude_;
|
return patchInclude_;
|
||||||
}
|
}
|
||||||
|
|
||||||
//- Selection of black listed patches. Empty if unspecified.
|
//- Excluded patches. Empty if unspecified.
|
||||||
const wordRes& patchExclude() const noexcept
|
const wordRes& patchExclude() const noexcept
|
||||||
{
|
{
|
||||||
return patchExclude_;
|
return patchExclude_;
|
||||||
}
|
}
|
||||||
|
|
||||||
//- Selection of faceZones. Empty if unspecified.
|
//- Selection of cell zones. Empty if unspecified.
|
||||||
|
const wordRes& cellZoneSelection() const noexcept
|
||||||
|
{
|
||||||
|
return cellZoneInclude_;
|
||||||
|
}
|
||||||
|
|
||||||
|
//- Excluded cell zones. Future use
|
||||||
|
const wordRes& cellZoneExclude() const noexcept
|
||||||
|
{
|
||||||
|
return wordRes::null();
|
||||||
|
}
|
||||||
|
|
||||||
|
//- Selection of face zones. Empty if unspecified.
|
||||||
const wordRes& faceZoneSelection() const noexcept
|
const wordRes& faceZoneSelection() const noexcept
|
||||||
{
|
{
|
||||||
return faceZoneInclude_;
|
return faceZoneInclude_;
|
||||||
}
|
}
|
||||||
|
|
||||||
//- Selection of faceZones. Empty if unspecified.
|
//- Excluded face zones. Future use
|
||||||
const wordRes& cellZoneSelection() const noexcept
|
const wordRes& faceZoneExclude() const noexcept
|
||||||
{
|
{
|
||||||
return cellZoneInclude_;
|
return wordRes::null();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -356,18 +368,18 @@ public:
|
|||||||
//- Define patch selection to exclude
|
//- Define patch selection to exclude
|
||||||
void patchExclude(List<wordRe>&& patterns);
|
void patchExclude(List<wordRe>&& patterns);
|
||||||
|
|
||||||
//- Define faceZone selection matcher
|
|
||||||
void faceZoneSelection(const UList<wordRe>& patterns);
|
|
||||||
|
|
||||||
//- Define faceZone selection matcher
|
|
||||||
void faceZoneSelection(List<wordRe>&& patterns);
|
|
||||||
|
|
||||||
//- Define cellZone selection matcher
|
//- Define cellZone selection matcher
|
||||||
void cellZoneSelection(const UList<wordRe>& patterns);
|
void cellZoneSelection(const UList<wordRe>& patterns);
|
||||||
|
|
||||||
//- Define cellZone selection matcher
|
//- Define cellZone selection matcher
|
||||||
void cellZoneSelection(List<wordRe>&& patterns);
|
void cellZoneSelection(List<wordRe>&& patterns);
|
||||||
|
|
||||||
|
//- Define faceZone selection matcher
|
||||||
|
void faceZoneSelection(const UList<wordRe>& patterns);
|
||||||
|
|
||||||
|
//- Define faceZone selection matcher
|
||||||
|
void faceZoneSelection(List<wordRe>&& patterns);
|
||||||
|
|
||||||
|
|
||||||
// Output
|
// Output
|
||||||
|
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
\\ / A nd | www.openfoam.com
|
\\ / A nd | www.openfoam.com
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2016-2023 OpenCFD Ltd.
|
Copyright (C) 2016-2025 OpenCFD Ltd.
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -122,29 +122,6 @@ Foam::functionObjects::ensightWrite::ensightWrite
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Foam::wordRes Foam::functionObjects::ensightWrite::patchNameSet
|
|
||||||
(
|
|
||||||
const UList<wordRe>& select
|
|
||||||
) const
|
|
||||||
{
|
|
||||||
const polyBoundaryMesh& pbm = mesh_.boundaryMesh();
|
|
||||||
|
|
||||||
const labelList patchIDs
|
|
||||||
(
|
|
||||||
pbm.patchSet(select).sortedToc()
|
|
||||||
);
|
|
||||||
|
|
||||||
wordRes names(patchIDs.size());
|
|
||||||
|
|
||||||
for (const label patchi : patchIDs)
|
|
||||||
{
|
|
||||||
names[patchi] = mesh_.boundary()[patchi].name();
|
|
||||||
}
|
|
||||||
|
|
||||||
return names;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||||
|
|
||||||
bool Foam::functionObjects::ensightWrite::read(const dictionary& dict)
|
bool Foam::functionObjects::ensightWrite::read(const dictionary& dict)
|
||||||
@ -175,27 +152,21 @@ bool Foam::functionObjects::ensightWrite::read(const dictionary& dict)
|
|||||||
<< "conversion of the boundaries" << endl;
|
<< "conversion of the boundaries" << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (wordRes list; dict.readIfPresent("patches", list))
|
||||||
|
{
|
||||||
|
list.uniq(); // usually a no-op
|
||||||
|
writeOpts_.patchSelection(std::move(list));
|
||||||
|
}
|
||||||
|
if (wordRes list; dict.readIfPresent("excludePatches", list))
|
||||||
|
{
|
||||||
|
list.uniq(); // usually a no-op
|
||||||
|
writeOpts_.patchExclude(std::move(list));
|
||||||
|
}
|
||||||
|
|
||||||
if (dict.found("patches"))
|
if (wordRes list; dict.readIfPresent("faceZones", list))
|
||||||
{
|
{
|
||||||
writeOpts_.patchSelection
|
list.uniq(); // usually a no-op
|
||||||
(
|
writeOpts_.faceZoneSelection(std::move(list));
|
||||||
wordRes::uniq(patchNameSet(dict.get<wordRes>("patches")))
|
|
||||||
);
|
|
||||||
}
|
|
||||||
if (dict.found("excludePatches"))
|
|
||||||
{
|
|
||||||
writeOpts_.patchExclude
|
|
||||||
(
|
|
||||||
wordRes::uniq(patchNameSet(dict.get<wordRes>("excludePatches")))
|
|
||||||
);
|
|
||||||
}
|
|
||||||
if (dict.found("faceZones"))
|
|
||||||
{
|
|
||||||
writeOpts_.faceZoneSelection
|
|
||||||
(
|
|
||||||
wordRes::uniq(dict.get<wordRes>("faceZones"))
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -233,11 +233,6 @@ class ensightWrite
|
|||||||
//- Update meshes, subMeshes etc.
|
//- Update meshes, subMeshes etc.
|
||||||
bool update();
|
bool update();
|
||||||
|
|
||||||
//- Return the set of names of available patches and patch groups
|
|
||||||
//- corresponding to the given names
|
|
||||||
// A convenience wrapper for \c polyBoundaryMesh::patchSet
|
|
||||||
wordRes patchNameSet(const UList<wordRe>& select) const;
|
|
||||||
|
|
||||||
|
|
||||||
// Write
|
// Write
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user