topoSet.C
Go to the documentation of this file.
1 /*---------------------------------------------------------------------------*\
2  ========= |
3  \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
4  \\ / O peration | Website: https://openfoam.org
5  \\ / A nd | Copyright (C) 2011-2023 OpenFOAM Foundation
6  \\/ M anipulation |
7 -------------------------------------------------------------------------------
8 License
9  This file is part of OpenFOAM.
10 
11  OpenFOAM is free software: you can redistribute it and/or modify it
12  under the terms of the GNU General Public License as published by
13  the Free Software Foundation, either version 3 of the License, or
14  (at your option) any later version.
15 
16  OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
17  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18  FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
19  for more details.
20 
21  You should have received a copy of the GNU General Public License
22  along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
23 
24 Application
25  topoSet
26 
27 Description
28  Executes the sequence of topoSet actions specified in the topoSetDict.
29 
30 Usage
31 
32 \*---------------------------------------------------------------------------*/
33 
34 #include "argList.H"
35 #include "Time.H"
36 #include "polyMesh.H"
37 #include "topoSetSource.H"
38 #include "globalMeshData.H"
39 #include "timeSelector.H"
40 #include "IOobjectList.H"
41 #include "cellZoneSet.H"
42 #include "faceZoneSet.H"
43 #include "pointZoneSet.H"
44 #include "systemDict.H"
45 
46 using namespace Foam;
47 
48 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
49 
50 void printMesh(const Time& runTime, const polyMesh& mesh)
51 {
52  Info<< "Time:" << runTime.name()
53  << " cells:" << mesh.globalData().nTotalCells()
54  << " faces:" << mesh.globalData().nTotalFaces()
55  << " points:" << mesh.globalData().nTotalPoints()
56  << " patches:" << mesh.boundaryMesh().size()
57  << " bb:" << mesh.bounds() << nl;
58 }
59 
60 
61 template<class ZoneType>
62 void removeZone
63 (
65  const word& setName
66 )
67 {
68  label zoneID = zones.findZoneID(setName);
69 
70  if (zoneID != -1)
71  {
72  Info<< "Removing zone " << setName << " at index " << zoneID << endl;
73  // Shuffle to last position
74  labelList oldToNew(zones.size());
75  label newI = 0;
76  forAll(oldToNew, i)
77  {
78  if (i != zoneID)
79  {
80  oldToNew[i] = newI++;
81  }
82  }
83  oldToNew[zoneID] = newI;
84  zones.reorder(oldToNew);
85  // Remove last element
86  zones.setSize(zones.size()-1);
87  zones.clearAddressing();
88  zones.write();
89  fileHandler().flush();
90  }
91 }
92 
93 
94 // Physically remove a set
95 void removeSet
96 (
97  const polyMesh& mesh,
98  const word& setType,
99  const word& setName
100 )
101 {
102  // Remove the file
104  (
105  mesh,
106  mesh.time().findInstance
107  (
108  polyMesh::meshSubDir/"sets",
109  word::null,
111  mesh.facesInstance()
112  ),
113  polyMesh::meshSubDir/"sets"
114  );
115 
116  if (objects.found(setName))
117  {
118  // Remove file
119  const fileName object = objects[setName]->objectPath(false);
120  Info<< "Removing file " << object << endl;
121  rm(object);
122  }
123 
124  // See if zone
125  if (setType == cellZoneSet::typeName)
126  {
127  removeZone
128  (
129  const_cast<meshCellZones&>(mesh.cellZones()),
130  setName
131  );
132  }
133  else if (setType == faceZoneSet::typeName)
134  {
135  removeZone
136  (
137  const_cast<meshFaceZones&>(mesh.faceZones()),
138  setName
139  );
140  }
141  else if (setType == pointZoneSet::typeName)
142  {
143  removeZone
144  (
145  const_cast<meshPointZones&>(mesh.pointZones()),
146  setName
147  );
148  }
149 }
150 
151 
152 polyMesh::readUpdateState meshReadUpdate(polyMesh& mesh)
153 {
155 
156  switch(stat)
157  {
158  case polyMesh::UNCHANGED:
159  {
160  Info<< " mesh not changed." << endl;
161  break;
162  }
164  {
165  Info<< " points moved; topology unchanged." << endl;
166  break;
167  }
169  {
170  Info<< " topology changed; patches unchanged." << nl
171  << " ";
172  printMesh(mesh.time(), mesh);
173  break;
174  }
176  {
177  Info<< " topology changed and patches changed." << nl
178  << " ";
179  printMesh(mesh.time(), mesh);
180 
181  break;
182  }
183  default:
184  {
186  << "Illegal mesh update state "
187  << stat << abort(FatalError);
188  break;
189  }
190  }
191  return stat;
192 }
193 
194 
195 
196 int main(int argc, char *argv[])
197 {
198  timeSelector::addOptions(true, false);
199  #include "addDictOption.H"
200  #include "addRegionOption.H"
202  (
203  "noSync",
204  "do not synchronise selection across coupled patches"
205  );
206 
207  #include "setRootCase.H"
208  #include "createTime.H"
209 
211 
212  #include "createNamedPolyMesh.H"
213 
214  const bool noSync = args.optionFound("noSync");
215 
216  const dictionary topoSetDict(systemDict("topoSetDict", args, mesh));
217 
218  // Read set construct info from dictionary
219  PtrList<dictionary> actions(topoSetDict.lookup("actions"));
220 
221  forAll(timeDirs, timei)
222  {
223  runTime.setTime(timeDirs[timei], timei);
224  Info<< "Time = " << runTime.userTimeName() << endl;
225 
226  // Optionally re-read mesh
227  meshReadUpdate(mesh);
228 
229  // Execute all actions
230  forAll(actions, i)
231  {
232  const dictionary& dict = actions[i];
233 
234  const word setName(dict.lookup("name"));
235  const word actionName(dict.lookup("action"));
236  const word setType(dict.lookup("type"));
237 
239  (
240  actionName
241  );
242 
243  autoPtr<topoSet> currentSet;
244  if
245  (
246  (action == topoSetSource::NEW)
247  || (action == topoSetSource::CLEAR)
248  )
249  {
250  currentSet = topoSet::New(setType, mesh, setName, 10000);
251  Info<< "Created " << currentSet().type() << " "
252  << setName << endl;
253  }
254  else if (action == topoSetSource::REMOVE)
255  {
256  //?
257  }
258  else
259  {
260  currentSet = topoSet::New
261  (
262  setType,
263  mesh,
264  setName,
266  );
267  Info<< "Read set " << currentSet().type() << " "
268  << setName << " with size "
269  << returnReduce(currentSet().size(), sumOp<label>())
270  << endl;
271  }
272 
273 
274  // Handle special actions (clear, invert) locally, rest through
275  // sources.
276  switch (action)
277  {
278  case topoSetSource::NEW:
279  case topoSetSource::ADD:
281  {
282  Info<< " Applying source " << word(dict.lookup("source"))
283  << endl;
285  (
286  dict.lookup("source"),
287  mesh,
288  dict.optionalSubDict("sourceInfo")
289  );
290 
291  source().applyToSet(action, currentSet());
292  // Synchronise for coupled patches.
293  if (!noSync) currentSet().sync(mesh);
294  currentSet().write();
295  fileHandler().flush();
296  }
297  break;
298 
300  {
301  Info<< " Applying source " << word(dict.lookup("source"))
302  << endl;
304  (
305  dict.lookup("source"),
306  mesh,
307  dict.optionalSubDict("sourceInfo")
308  );
309 
310  // Backup current set.
311  autoPtr<topoSet> oldSet
312  (
314  (
315  setType,
316  mesh,
317  currentSet().name() + "_old2",
318  currentSet()
319  )
320  );
321 
322  currentSet().clear();
323  source().applyToSet(topoSetSource::NEW, currentSet());
324 
325  // Combine new value of currentSet with old one.
326  currentSet().subset(oldSet());
327  // Synchronise for coupled patches.
328  if (!noSync) currentSet().sync(mesh);
329  currentSet().write();
330  fileHandler().flush();
331  }
332  break;
333 
335  Info<< " Clearing " << currentSet().type() << endl;
336  currentSet().clear();
337  currentSet().write();
338  fileHandler().flush();
339  break;
340 
342  Info<< " Inverting " << currentSet().type() << endl;
343  currentSet().invert(currentSet().maxSize(mesh));
344  currentSet().write();
345  fileHandler().flush();
346  break;
347 
349  Info<< " Removing set" << endl;
350  removeSet(mesh, setType, setName);
351  break;
352 
353 
354  default:
356  << "Unhandled action " << action << endl;
357  break;
358  }
359 
360  if (currentSet.valid())
361  {
362  Info<< " " << currentSet().type() << " "
363  << currentSet().name()
364  << " now size "
365  << returnReduce(currentSet().size(), sumOp<label>())
366  << endl;
367  }
368  }
369  }
370 
371  Info<< "End\n" << endl;
372 
373  return 0;
374 }
375 
376 
377 // ************************************************************************* //
#define forAll(list, i)
Loop across all elements in list.
Definition: UList.H:434
List of IOobjects with searching and retrieving facilities.
Definition: IOobjectList.H:53
A list of mesh zones.
Definition: MeshZones.H:66
label findZoneID(const word &zoneName) const
Find zone index given a name.
Definition: MeshZones.C:341
void clearAddressing()
Clear addressing.
Definition: MeshZones.C:387
A templated 1D list of pointers to objects of type <T>, where the size of the array is known and used...
Definition: PtrList.H:75
void reorder(const labelUList &oldToNew)
Reorders elements. Ordering does not have to be done in.
Definition: PtrList.C:197
void setSize(const label)
Reset size of PtrList. If extending the PtrList, new entries are.
Definition: PtrList.C:131
Class to control time during OpenFOAM simulations that is also the top-level objectRegistry.
Definition: Time.H:76
virtual void setTime(const Time &)
Reset the time and time-index to those of the given time.
Definition: Time.C:939
word findInstance(const fileName &dir, const word &name=word::null, const IOobject::readOption rOpt=IOobject::MUST_READ, const word &stopInstance=word::null) const
Return the location of "dir" containing the file "name".
Definition: Time.C:647
word userTimeName() const
Return current user time name with units.
Definition: Time.C:836
label size() const
Return the number of elements in the UPtrList.
Definition: UPtrListI.H:29
static void addBoolOption(const word &opt, const string &usage="")
Add to a bool option to validOptions with usage information.
Definition: argList.C:118
bool optionFound(const word &opt) const
Return true if the named option is found.
Definition: argListI.H:114
An auto-pointer similar to the STL auto_ptr but with automatic casting to a reference to the type and...
Definition: autoPtr.H:51
bool valid() const
Return true if the autoPtr valid (ie, the pointer is set)
Definition: autoPtrI.H:83
void clear()
Delete object (if the pointer is valid) and set pointer to.
Definition: autoPtrI.H:126
A list of keyword definitions, which are a keyword followed by any number of values (e....
Definition: dictionary.H:160
ITstream & lookup(const word &, bool recursive=false, bool patternMatch=true) const
Find and return an entry data stream.
Definition: dictionary.C:860
const dictionary & optionalSubDict(const word &) const
Find and return a sub-dictionary if found.
Definition: dictionary.C:1076
const word & name() const
Return const reference to name.
A class for handling file names.
Definition: fileName.H:82
virtual void flush() const
Forcibly wait until all output done. Flush any cached data.
label nTotalFaces() const
Return total number of faces in decomposed mesh. Not.
label nTotalPoints() const
Return total number of points in decomposed mesh. Not.
label nTotalCells() const
Return total number of cells in decomposed mesh.
const Time & time() const
Return time.
Mesh consisting of general polyhedral cells.
Definition: polyMesh.H:80
const fileName & facesInstance() const
Return the current instance directory for faces.
Definition: polyMesh.C:1025
const meshFaceZones & faceZones() const
Return face zones.
Definition: polyMesh.H:447
readUpdateState
Enumeration defining the state of the mesh after a read update.
Definition: polyMesh.H:91
@ TOPO_PATCH_CHANGE
Definition: polyMesh.H:95
const globalMeshData & globalData() const
Return parallel info.
Definition: polyMesh.C:1562
const meshPointZones & pointZones() const
Return point zones.
Definition: polyMesh.H:441
readUpdateState readUpdate()
Update the mesh based on the mesh files saved in.
Definition: polyMeshIO.C:99
const polyBoundaryMesh & boundaryMesh() const
Return boundary mesh.
Definition: polyMesh.H:405
static word meshSubDir
Return the mesh sub-directory name (usually "polyMesh")
Definition: polyMesh.H:271
const boundBox & bounds() const
Return mesh bounding box.
Definition: polyMesh.H:411
const meshCellZones & cellZones() const
Return cell zones.
Definition: polyMesh.H:453
virtual bool write(const bool write=true) const
Write using setting from DB.
static void addOptions(const bool constant=true, const bool withZero=false)
Add the options handled by timeSelector to argList::validOptions.
Definition: timeSelector.C:114
static instantList selectIfPresent(Time &runTime, const argList &args)
If any time option provided return the set of times (as select0)
Definition: timeSelector.C:283
static setAction toAction(const word &actionName)
Convert string to action.
setAction
Enumeration defining the valid actions.
Definition: topoSetSource.H:83
static autoPtr< topoSetSource > New(const word &topoSetSourceType, const polyMesh &mesh, const dictionary &dict)
Return a reference to the selected topoSetSource.
Definition: topoSetSource.C:70
static autoPtr< topoSet > New(const word &setType, const polyMesh &mesh, const word &name, readOption r=MUST_READ, writeOption w=NO_WRITE)
Return a pointer to a toposet read from file.
A class for handling words, derived from string.
Definition: word.H:62
static const word null
An empty word.
Definition: word.H:77
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
Definition: error.H:306
int main(int argc, char *argv[])
Definition: financialFoam.C:44
static instantList timeDirs
Definition: globalFoam.H:44
#define WarningInFunction
Report a warning using Foam::Warning.
Namespace for OpenFOAM.
const fileOperation & fileHandler()
Get current file handler.
intWM_LABEL_SIZE_t label
A label is an int32_t or int64_t as specified by the pre-processor macro WM_LABEL_SIZE.
Definition: label.H:59
bool rm(const fileName &)
Remove a file, returning true if successful otherwise false.
Definition: POSIX.C:1017
IOdictionary systemDict(const word &dictName, const argList &args, const objectRegistry &ob, const word &regionName=polyMesh::defaultRegion)
Definition: systemDict.C:92
Ostream & endl(Ostream &os)
Add newline and flush stream.
Definition: Ostream.H:251
word name(const bool)
Return a word representation of a bool.
Definition: boolIO.C:39
errorManip< error > abort(error &err)
Definition: errorManip.H:131
messageStream Info
T returnReduce(const T &Value, const BinaryOp &bop, const int tag=Pstream::msgType(), const label comm=UPstream::worldComm)
error FatalError
static const char nl
Definition: Ostream.H:260
objects
dictionary dict
Foam::argList args(argc, argv)