cellZoneSet.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-2017 OpenFOAM Foundation
9 Copyright (C) 2018-2020 OpenCFD Ltd.
10-------------------------------------------------------------------------------
11License
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 "cellZoneSet.H"
30#include "mapPolyMesh.H"
31#include "polyMesh.H"
32
34
35// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
36
37namespace Foam
38{
43}
44
45// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
46
48{
49 labelList order(sortedOrder(addressing_));
50 inplaceReorder(order, addressing_);
51
53 cellSet::resize(2*addressing_.size());
54 cellSet::set(addressing_);
55}
56
57
58// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
59
61(
62 const polyMesh& mesh,
63 const word& name,
64 readOption r,
66)
67:
68 cellSet(mesh, name, 1024), // do not read cellSet
69 mesh_(mesh),
70 addressing_()
71{
72 const cellZoneMesh& cellZones = mesh.cellZones();
73 label zoneID = cellZones.findZoneID(name);
74
75 if
76 (
79 || (r == IOobject::READ_IF_PRESENT && zoneID != -1)
80 )
81 {
82 const cellZone& fz = cellZones[zoneID];
83 addressing_ = fz;
84 }
85
86 updateSet();
87
88 check(mesh.nCells());
89}
90
91
93(
94 const polyMesh& mesh,
95 const word& name,
96 const label size,
98)
99:
100 cellSet(mesh, name, size, w),
101 mesh_(mesh),
102 addressing_()
103{
104 updateSet();
105}
106
107
109(
110 const polyMesh& mesh,
111 const word& name,
112 const topoSet& set,
114)
115:
116 cellSet(mesh, name, set.size(), w),
117 mesh_(mesh),
118 addressing_(refCast<const cellZoneSet>(set).addressing())
119{
120 updateSet();
121}
122
123
124// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
125
126void Foam::cellZoneSet::invert(const label maxLen)
127{
128 // Count
129 label n = 0;
130
131 for (label celli = 0; celli < maxLen; ++celli)
132 {
133 if (!found(celli))
134 {
135 ++n;
136 }
137 }
138
139 // Fill
140 addressing_.setSize(n);
141 n = 0;
142
143 for (label celli = 0; celli < maxLen; ++celli)
144 {
145 if (!found(celli))
146 {
147 addressing_[n] = celli;
148 ++n;
149 }
150 }
151
152 updateSet();
153}
154
155
157{
158 DynamicList<label> newAddressing(addressing_.size());
159
160 const cellZoneSet& zoneSet = refCast<const cellZoneSet>(set);
161
162 for (const label celli : zoneSet.addressing())
163 {
164 if (found(celli))
165 {
166 newAddressing.append(celli);
167 }
168 }
169
170 addressing_.transfer(newAddressing);
171 updateSet();
172}
173
174
176{
177 DynamicList<label> newAddressing(addressing_);
178
179 const cellZoneSet& zoneSet = refCast<const cellZoneSet>(set);
180
181 for (const label celli : zoneSet.addressing())
182 {
183 if (!found(celli))
184 {
185 newAddressing.append(celli);
186 }
187 }
188
189 addressing_.transfer(newAddressing);
190 updateSet();
191}
192
193
195{
196 DynamicList<label> newAddressing(addressing_.size());
197
198 const cellZoneSet& zoneSet = refCast<const cellZoneSet>(set);
199
200 for (const label celli : addressing_)
201 {
202 if (!zoneSet.found(celli))
203 {
204 // Not found in zoneSet so add
205 newAddressing.append(celli);
206 }
207 }
208
209 addressing_.transfer(newAddressing);
210 updateSet();
211}
212
213
215{
217
218 // Take over contents of cellSet into addressing.
219 addressing_ = sortedToc();
220 updateSet();
221}
222
223
224Foam::label Foam::cellZoneSet::maxSize(const polyMesh& mesh) const
225{
226 return mesh.nCells();
227}
228
229
231(
232 IOstreamOption streamOpt,
233 const bool valid
234) const
235{
236 // Write shadow cellSet
237 word oldTypeName = typeName;
238 const_cast<word&>(type()) = cellSet::typeName;
239 bool ok = cellSet::writeObject(streamOpt, valid);
240 const_cast<word&>(type()) = oldTypeName;
241
242 // Modify cellZone
243 cellZoneMesh& cellZones = const_cast<polyMesh&>(mesh_).cellZones();
244 label zoneID = cellZones.findZoneID(name());
245
246 if (zoneID == -1)
247 {
248 zoneID = cellZones.size();
249
250 cellZones.setSize(zoneID+1);
251 cellZones.set
252 (
253 zoneID,
254 new cellZone
255 (
256 name(),
257 addressing_,
258 zoneID,
259 cellZones
260 )
261 );
262 }
263 else
264 {
265 cellZones[zoneID] = addressing_;
266 }
267 cellZones.clearAddressing();
268
269 return ok && cellZones.write(valid);
270}
271
272
274{
275 // cellZone
276 labelList newAddressing(addressing_.size());
277
278 label n = 0;
279 for (const label celli : addressing_)
280 {
281 label newCelli = morphMap.reverseCellMap()[celli];
282 if (newCelli >= 0)
283 {
284 newAddressing[n] = newCelli;
285 ++n;
286 }
287 }
288 newAddressing.resize(n);
289
290 addressing_.transfer(newAddressing);
291
292 updateSet();
293}
294
295
297(
298 Ostream& os,
299 const primitiveMesh& mesh,
300 const label maxLen
301) const
302{
303 cellSet::writeDebug(os, mesh, maxLen);
304}
305
306
307// ************************************************************************* //
bool found
label n
Macros for easy insertion into run-time selection tables.
#define addToRunTimeSelectionTable(baseType, thisType, argNames)
Add to construction table with typeName as the key.
label maxSize() const
The max row length used.
void invert()
Return the matrix inverse into itself if no elem is equal to zero.
A 1D vector of objects of type <T> that resizes itself as necessary to accept the new objects.
Definition: DynamicList.H:72
void append(const T &val)
Copy append an element to the end of this list.
Definition: DynamicListI.H:503
virtual bool resize()
Resize the ODE solver.
Definition: Euler.C:53
const word & name() const noexcept
Return the object name.
Definition: IOobjectI.H:65
writeOption
Enumeration defining the write options.
Definition: IOobject.H:186
readOption
Enumeration defining the read options.
Definition: IOobject.H:177
@ MUST_READ_IF_MODIFIED
Definition: IOobject.H:180
The IOstreamOption is a simple container for options an IOstream can normally have.
void resize(const label len)
Adjust allocated size of list.
Definition: ListI.H:139
An Ostream is an abstract base class for all output systems (streams, files, token lists,...
Definition: Ostream.H:62
void clearStorage()
Clear the list and delete storage.
Definition: PackedListI.H:520
const T * set(const label i) const
Definition: PtrList.H:138
void setSize(const label newLen)
Same as resize()
Definition: PtrList.H:151
void size(const label n)
Older name for setAddressableSize.
Definition: UList.H:114
label size() const noexcept
The number of elements in the list.
Definition: UPtrListI.H:106
label findZoneID(const word &zoneName) const
Find zone index by name, return -1 if not found.
Definition: ZoneMesh.C:525
void clearAddressing()
Clear addressing.
Definition: ZoneMesh.C:715
A collection of cell labels.
Definition: cellSet.H:54
Like cellSet but -reads data from cellZone -updates cellZone when writing.
Definition: cellZoneSet.H:54
virtual void subtractSet(const topoSet &set)
Subtract elements present in set.
Definition: cellZoneSet.C:194
const labelList & addressing() const
Definition: cellZoneSet.H:104
virtual bool writeObject(IOstreamOption streamOpt, const bool valid) const
Write cellZone using stream options.
Definition: cellZoneSet.C:231
virtual void addSet(const topoSet &set)
Add elements present in set.
Definition: cellZoneSet.C:175
virtual void subset(const topoSet &set)
Subset contents. Only elements present in both sets remain.
Definition: cellZoneSet.C:156
void updateSet()
Sort addressing and make cellSet part consistent with addressing.
Definition: cellZoneSet.C:47
A subset of mesh cells.
Definition: cellZone.H:65
virtual bool writeObject(IOstreamOption streamOpt, const bool valid) const
Write using stream options.
void sync()
Do all: synchronise all IOFields and objectRegistry.
Definition: syncObjects.C:70
Class containing mesh-to-mesh mapping information after a change in polyMesh topology.
Definition: mapPolyMesh.H:162
const labelList & reverseCellMap() const
Reverse cell map.
Definition: mapPolyMesh.H:532
void updateMesh()
Update for new mesh topology.
Mesh consisting of general polyhedral cells.
Definition: polyMesh.H:81
const cellZoneMesh & cellZones() const noexcept
Return cell zone mesh.
Definition: polyMesh.H:504
Cell-face mesh analysis engine.
Definition: primitiveMesh.H:79
label nCells() const noexcept
Number of mesh cells.
void writeDebug() const
Debug write.
virtual bool write(const bool valid=true) const
Write using setting from DB.
General set of labels of mesh quantity (points, cells, faces).
Definition: topoSet.H:67
virtual bool found(const label id) const
Has the given index?
Definition: topoSet.C:508
virtual void check(const label maxSize)
Check limits on addressable range.
Definition: topoSet.C:203
bool set() const
Are all the vector set.
Definition: triadI.H:76
A class for handling words, derived from Foam::string.
Definition: word.H:68
#define defineTypeNameAndDebug(Type, DebugSwitch)
Define the typeName and debug information.
Definition: className.H:121
dynamicFvMesh & mesh
OBJstream os(runTime.globalPath()/outputName)
const labelIOList & zoneID
Namespace for OpenFOAM.
To & refCast(From &r)
Reference type cast template function.
Definition: typeInfo.H:131
fileName::Type type(const fileName &name, const bool followLink=true)
Return the file type: DIRECTORY or FILE, normally following symbolic links.
Definition: MSwindows.C:598
void inplaceReorder(const labelUList &oldToNew, ListType &input, const bool prune=false)
Inplace reorder the elements of a list.
labelList sortedOrder(const UList< T > &input)
Return the (stable) sort order for the list.
word name(const expressions::valueTypeCode typeCode)
A word representation of a valueTypeCode. Empty for INVALID.
Definition: exprTraits.C:59
static const char *const typeName
The type name used in ensight case files.