All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
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-2021 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.timeName()
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 
210  instantList timeDirs = timeSelector::selectIfPresent(runTime, args);
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 // ************************************************************************* //
const polyBoundaryMesh & boundaryMesh() const
Return boundary mesh.
Definition: polyMesh.H:453
void reorder(const labelUList &oldToNew)
Reorders elements. Ordering does not have to be done in.
Definition: PtrList.C:197
label findZoneID(const word &zoneName) const
Find zone index given a name.
Definition: MeshZones.C:341
#define forAll(list, i)
Loop across all elements in list.
Definition: UList.H:434
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 file names.
Definition: fileName.H:79
List of IOobjects with searching and retrieving facilities.
Definition: IOobjectList.H:50
const fileName & facesInstance() const
Return the current instance directory for faces.
Definition: polyMesh.C:888
const meshCellZones & cellZones() const
Return cell zones.
Definition: polyMesh.H:501
error FatalError
A list of keyword definitions, which are a keyword followed by any number of values (e...
Definition: dictionary.H:156
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
Definition: error.H:306
label nTotalPoints() const
Return total number of points in decomposed mesh. Not.
static word meshSubDir
Return the mesh sub-directory name (usually "polyMesh")
Definition: polyMesh.H:328
Ostream & endl(Ostream &os)
Add newline and flush stream.
Definition: Ostream.H:251
bool optionFound(const word &opt) const
Return true if the named option is found.
Definition: argListI.H:114
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:689
label nTotalCells() const
Return total number of cells in decomposed mesh.
fvMesh & mesh
IOdictionary systemDict(const word &dictName, const argList &args, const objectRegistry &ob, const word &regionName=polyMesh::defaultRegion)
Definition: systemDict.C:92
Class to control time during OpenFOAM simulations that is also the top-level objectRegistry.
Definition: Time.H:69
const meshPointZones & pointZones() const
Return point zones.
Definition: polyMesh.H:489
void clear()
Delete object (if the pointer is valid) and set pointer to.
Definition: autoPtrI.H:126
label nTotalFaces() const
Return total number of faces in decomposed mesh. Not.
const dictionary & optionalSubDict(const word &) const
Find and return a sub-dictionary if found.
Definition: dictionary.C:1060
static word timeName(const scalar, const int precision=curPrecision_)
Return time name of given scalar time.
Definition: Time.C:666
A class for handling words, derived from string.
Definition: word.H:59
setAction
Enumeration defining the valid actions.
Definition: topoSetSource.H:82
static const word null
An empty word.
Definition: word.H:77
const globalMeshData & globalData() const
Return parallel info.
Definition: polyMesh.C:1435
static instantList selectIfPresent(Time &runTime, const argList &args)
If any time option provided return the set of times (as select0)
Definition: timeSelector.C:283
virtual void setTime(const Time &)
Reset the time and time-index to those of the given time.
Definition: Time.C:959
const fileOperation & fileHandler()
Get current file handler.
bool valid() const
Return true if the autoPtr valid (ie, the pointer is set)
Definition: autoPtrI.H:83
errorManip< error > abort(error &err)
Definition: errorManip.H:131
void setSize(const label)
Reset size of PtrList. If extending the PtrList, new entries are.
Definition: PtrList.C:131
A list of mesh zones.
static const char nl
Definition: Ostream.H:260
objects
const Time & time() const
Return time.
static autoPtr< topoSetSource > New(const word &topoSetSourceType, const polyMesh &mesh, const dictionary &dict)
Return a reference to the selected topoSetSource.
Definition: topoSetSource.C:70
word name(const complex &)
Return a string representation of a complex.
Definition: complex.C:47
virtual void flush() const
Forcibly wait until all output done. Flush any cached data.
label size() const
Return the number of elements in the UPtrList.
Definition: UPtrListI.H:29
const boundBox & bounds() const
Return mesh bounding box.
Definition: polyMesh.H:459
#define WarningInFunction
Report a warning using Foam::Warning.
A templated 1D list of pointers to objects of type <T>, where the size of the array is known and used...
Definition: List.H:70
word userTimeName() const
Return current user time name with units.
Definition: Time.C:863
const meshFaceZones & faceZones() const
Return face zones.
Definition: polyMesh.H:495
messageStream Info
static setAction toAction(const word &actionName)
Convert string to action.
T returnReduce(const T &Value, const BinaryOp &bop, const int tag=Pstream::msgType(), const label comm=UPstream::worldComm)
An auto-pointer similar to the STL auto_ptr but with automatic casting to a reference to the type and...
Definition: PtrList.H:52
Mesh consisting of general polyhedral cells.
Definition: polyMesh.H:76
static void addBoolOption(const word &opt, const string &usage="")
Add to a bool option to validOptions with usage information.
Definition: argList.C:118
readUpdateState
Enumeration defining the state of the mesh after a read update.
Definition: polyMesh.H:90
virtual bool write(const bool write=true) const
Write using setting from DB.
readUpdateState readUpdate()
Update the mesh based on the mesh files saved in.
Definition: polyMeshIO.C:98
bool rm(const fileName &)
Remove a file, returning true if successful otherwise false.
Definition: POSIX.C:1017
Foam::argList args(argc, argv)
void clearAddressing()
Clear addressing.
Definition: MeshZones.C:387
static void addOptions(const bool constant=true, const bool withZero=false)
Add the options handled by timeSelector to argList::validOptions.
Definition: timeSelector.C:114
Namespace for OpenFOAM.
ITstream & lookup(const word &, bool recursive=false, bool patternMatch=true) const
Find and return an entry data stream.
Definition: dictionary.C:864