faceZoneToCell.C
Go to the documentation of this file.
1 /*---------------------------------------------------------------------------*\
2  ========= |
3  \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
4  \\ / O peration |
5  \\ / A nd | www.openfoam.com
6  \\/ M anipulation |
7 -------------------------------------------------------------------------------
8  Copyright (C) 2011-2016 OpenFOAM Foundation
9  Copyright (C) 2016-2021 OpenCFD Ltd.
10 -------------------------------------------------------------------------------
11 License
12  This file is part of OpenFOAM.
13 
14  OpenFOAM is free software: you can redistribute it and/or modify it
15  under the terms of the GNU General Public License as published by
16  the Free Software Foundation, either version 3 of the License, or
17  (at your option) any later version.
18 
19  OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
20  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
21  FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
22  for more details.
23 
24  You should have received a copy of the GNU General Public License
25  along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
26 
27 \*---------------------------------------------------------------------------*/
28 
29 #include "faceZoneToCell.H"
30 #include "polyMesh.H"
32 
33 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
34 
35 namespace Foam
36 {
37  defineTypeNameAndDebug(faceZoneToCell, 0);
38  addToRunTimeSelectionTable(topoSetSource, faceZoneToCell, word);
39  addToRunTimeSelectionTable(topoSetSource, faceZoneToCell, istream);
40  addToRunTimeSelectionTable(topoSetCellSource, faceZoneToCell, word);
41  addToRunTimeSelectionTable(topoSetCellSource, faceZoneToCell, istream);
42 }
43 
44 
45 Foam::topoSetSource::addToUsageTable Foam::faceZoneToCell::usage_
46 (
47  faceZoneToCell::typeName,
48  "\n Usage: faceZoneToCell zone master|slave\n\n"
49  " Select master or slave side of the faceZone."
50  " Note:accepts wildcards for zone.\n\n"
51 );
52 
53 
54 const Foam::Enum
55 <
57 >
58 Foam::faceZoneToCell::faceActionNames_
59 ({
60  { faceAction::MASTER, "master" },
61  { faceAction::SLAVE, "slave" },
62  //TBD: { faceAction::BOTH, "attached" },
63 });
64 
65 
66 // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
67 
68 void Foam::faceZoneToCell::combine
69 (
70  topoSet& set,
71  const labelUList& zoneIDs,
72  const bool add,
73  const bool verbosity
74 ) const
75 {
76  const label nZones = mesh_.faceZones().size();
77 
78  if (zoneIDs.empty() || !nZones)
79  {
80  return; // Nothing to do
81  }
82 
83  for (const label zonei : zoneIDs)
84  {
85  if (zonei < 0 || zonei >= nZones)
86  {
87  continue;
88  }
89 
90  const auto& zone = mesh_.faceZones()[zonei];
91 
92  const labelList& cellLabels =
93  (
94  option_ == MASTER
95  ? zone.masterCells()
96  : zone.slaveCells()
97  );
98 
99  if (verbosity)
100  {
101  Info<< " Using matching zone " << zone.name()
102  << " with " << cellLabels.size() << " cells on "
103  << faceActionNames_[option_] << " side" << endl;
104  }
105 
106  // NOTE could also handle both sides directly if required
107 
108  for (const label celli : cellLabels)
109  {
110  // Only do active cells
111  if (celli >= 0 && celli < mesh_.nCells())
112  {
113  addOrDelete(set, celli, add);
114  }
115  }
116  }
117 }
118 
119 
120 void Foam::faceZoneToCell::combine(topoSet& set, const bool add) const
121 {
122  if (zoneMatcher_.empty())
123  {
124  return; // Nothing to do
125  }
126 
127  const labelList matched(mesh_.faceZones().indices(zoneMatcher_));
128 
129  if (matched.empty())
130  {
132  << "Cannot find any faceZone matching "
133  << flatOutput(zoneMatcher_) << nl
134  << "Valid names are " << flatOutput(mesh_.faceZones().names())
135  << endl;
136 
137  return; // Nothing to do
138  }
139 
140  combine(set, matched, add, verbose_);
141 }
142 
143 
144 // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
145 
147 (
148  const polyMesh& mesh,
149  const wordRes& zoneSelector,
150  const faceAction option
151 )
152 :
154  zoneMatcher_(zoneSelector),
155  option_(option)
156 {}
157 
158 
160 (
161  const polyMesh& mesh,
162  const wordRe& zoneName,
163  const faceAction option
164 )
165 :
167  zoneMatcher_(one{}, zoneName),
168  option_(option)
169 {}
170 
171 
173 (
174  const polyMesh& mesh,
175  const dictionary& dict
176 )
177 :
178  topoSetCellSource(mesh),
179  zoneMatcher_(),
180  option_(faceActionNames_.get("option", dict))
181 {
182  // Look for 'zones' and 'zone', but accept 'name' as well
183  if (!dict.readIfPresent("zones", zoneMatcher_))
184  {
185  zoneMatcher_.resize(1);
186  zoneMatcher_.first() =
187  dict.getCompat<wordRe>("zone", {{"name", 1806}});
188  }
189 }
190 
191 
193 (
194  const polyMesh& mesh,
195  Istream& is
196 )
197 :
198  topoSetCellSource(mesh),
199  zoneMatcher_(one{}, wordRe(checkIs(is))),
200  option_(faceActionNames_.read(checkIs(is)))
201 {}
202 
203 
204 // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
207 {
208  return zoneMatcher_;
209 }
210 
212 void Foam::faceZoneToCell::zones(const wordRes& zonesSelector)
213 {
214  zoneMatcher_ = zonesSelector;
215 }
216 
217 
218 void Foam::faceZoneToCell::zones(const wordRe& zoneName)
219 {
220  zoneMatcher_.resize(1);
221  zoneMatcher_.first() = zoneName;
222 }
223 
224 
226 (
227  const topoSetSource::setAction action,
228  topoSet& set
229 ) const
230 {
231  if (action == topoSetSource::ADD || action == topoSetSource::NEW)
232  {
233  if (verbose_ && !zoneMatcher_.empty())
234  {
235  Info<< " Adding all " << faceActionNames_[option_]
236  << " cells of face zones "
237  << flatOutput(zoneMatcher_) << " ..." << endl;
238  }
239 
240  combine(set, true);
241  }
242  else if (action == topoSetSource::SUBTRACT)
243  {
244  if (verbose_ && !zoneMatcher_.empty())
245  {
246  Info<< " Removing all " << faceActionNames_[option_]
247  << " cells of face zones "
248  << flatOutput(zoneMatcher_) << " ..." << endl;
249  }
250 
251  combine(set, false);
252  }
253 }
254 
255 
256 // ************************************************************************* //
List< ReturnType > get(const UPtrList< T > &list, const AccessOp &aop)
List of values generated by applying the access operation to each list item.
dictionary dict
const labelIOList & zoneIDs
Definition: correctPhi.H:59
void resize(const label len)
Adjust allocated size of list.
Definition: ListI.H:132
Create a new set and ADD elements to it.
Add elements to current set.
const wordRes & zones() const noexcept
Return the current zones selector.
constexpr char nl
The newline &#39;\n&#39; character (0x0a)
Definition: Ostream.H:49
faceZoneToCell(const polyMesh &mesh, const wordRes &zoneSelector, const faceAction option)
Construct from mesh, zones selector and selection option.
T & first()
Access first element of the list, position [0].
Definition: UList.H:798
Ostream & endl(Ostream &os)
Add newline and flush stream.
Definition: Ostream.H:487
virtual void applyToSet(const topoSetSource::setAction action, topoSet &set) const
Apply specified action to the topoSet.
The topoSetCellSource is a intermediate class for handling topoSet sources for selecting cells...
void addOrDelete(topoSet &set, const label id, const bool add) const
Add or delete id from set. Add when &#39;add&#39; is true.
Macros for easy insertion into run-time selection tables.
UList< label > labelUList
A UList of labels.
Definition: UList.H:80
faceAction
Enumeration defining the valid options.
AccessType combine(const UList< T > &lists, AccessOp aop=accessOp< T >())
Combines sub-lists into a single list.
Definition: ListListOps.C:62
dynamicFvMesh & mesh
label size() const noexcept
The number of elements in the list.
Definition: UPtrListI.H:99
setAction
Enumeration defining various actions.
A List of wordRe with additional matching capabilities.
Definition: wordRes.H:47
A wordRe is a Foam::word, but can contain a regular expression for matching words or strings...
Definition: wordRe.H:78
const polyMesh & mesh_
Reference to the mesh.
const direction noexcept
Definition: Scalar.H:258
void add(FieldField< Field1, typename typeOfSum< Type1, Type2 >::type > &f, const FieldField< Field1, Type1 > &f1, const FieldField< Field2, Type2 > &f2)
const faceZoneMesh & faceZones() const noexcept
Return face zone mesh.
Definition: polyMesh.H:646
defineTypeNameAndDebug(combustionModel, 0)
General set of labels of mesh quantity (points, cells, faces).
Definition: topoSet.H:59
addToRunTimeSelectionTable(decompositionMethod, kahipDecomp, dictionary)
Subtract elements from current set.
#define WarningInFunction
Report a warning using Foam::Warning.
Enum is a wrapper around a list of names/values that represent particular enumeration (or int) values...
Class with constructor to add usage string to table.
label nCells() const noexcept
Number of mesh cells.
messageStream Info
Information stream (stdout output on master, null elsewhere)
Mesh consisting of general polyhedral cells.
Definition: polyMesh.H:73
List< label > labelList
A List of labels.
Definition: List.H:62
Namespace for OpenFOAM.
A class representing the concept of 1 (one) that can be used to avoid manipulating objects known to b...
Definition: one.H:57
FlatOutput::OutputAdaptor< Container, Delimiters > flatOutput(const Container &obj, Delimiters delim)
Global flatOutput() function with specified output delimiters.
Definition: FlatOutput.H:225