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() << " with "
102  << returnReduce(cellLabels.size(), sumOp<label>())
103  << " cells on "
104  << faceActionNames_[option_] << " side" << endl;
105  }
106 
107  // NOTE could also handle both sides directly if required
108 
109  for (const label celli : cellLabels)
110  {
111  // Only do active cells
112  if (celli >= 0 && celli < mesh_.nCells())
113  {
114  addOrDelete(set, celli, add);
115  }
116  }
117  }
118 }
119 
120 
121 void Foam::faceZoneToCell::combine(topoSet& set, const bool add) const
122 {
123  if (zoneMatcher_.empty())
124  {
125  return; // Nothing to do
126  }
127 
128  const labelList matched(mesh_.faceZones().indices(zoneMatcher_));
129 
130  if (matched.empty())
131  {
133  << "Cannot find any faceZone matching "
134  << flatOutput(zoneMatcher_) << nl
135  << "Valid names: " << flatOutput(mesh_.faceZones().names())
136  << endl;
137 
138  return; // Nothing to do
139  }
140 
141  combine(set, matched, add, verbose_);
142 }
143 
144 
145 // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
146 
148 (
149  const polyMesh& mesh,
150  const wordRes& zoneSelector,
151  const faceAction option
152 )
153 :
155  zoneMatcher_(zoneSelector),
156  option_(option)
157 {}
158 
159 
161 (
162  const polyMesh& mesh,
163  const wordRe& zoneName,
164  const faceAction option
165 )
166 :
168  zoneMatcher_(one{}, zoneName),
169  option_(option)
170 {}
171 
172 
174 (
175  const polyMesh& mesh,
176  const dictionary& dict
177 )
178 :
179  topoSetCellSource(mesh),
180  zoneMatcher_(),
181  option_(faceActionNames_.get("option", dict))
182 {
183  // Look for 'zones' and 'zone', but accept 'name' as well
184  if (!dict.readIfPresent("zones", zoneMatcher_))
185  {
186  zoneMatcher_.resize(1);
187  zoneMatcher_.front() = 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_.front() = 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 & front()
Access first element of the list, position [0].
Definition: UListI.H:194
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...
T returnReduce(const T &value, const BinaryOp &bop, const int tag=UPstream::msgType(), const label comm=UPstream::worldComm)
Perform reduction on a copy, using specified binary operation.
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:78
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 entries in the list.
Definition: UPtrListI.H:113
setAction
Enumeration defining various actions.
A List of wordRe with additional matching capabilities.
Definition: wordRes.H:53
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:56
FlatOutput::OutputAdaptor< Container, Delimiters > flatOutput(const Container &obj, Delimiters delim)
Global flatOutput() function with specified output delimiters.
Definition: FlatOutput.H:225