multiDirRefinement.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 | Copyright (C) 2011-2015 OpenFOAM Foundation
6  \\/ M anipulation | Copyright (C) 2015 OpenCFD Ltd.
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 \*---------------------------------------------------------------------------*/
25 
26 #include "multiDirRefinement.H"
27 #include "polyMesh.H"
28 #include "Time.H"
29 #include "undoableMeshCutter.H"
30 #include "hexCellLooper.H"
31 #include "geomCellLooper.H"
32 #include "directions.H"
33 #include "hexRef8.H"
34 #include "mapPolyMesh.H"
35 #include "polyTopoChange.H"
36 #include "cellModeller.H"
37 
38 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
39 
40 namespace Foam
41 {
42 defineTypeNameAndDebug(multiDirRefinement, 0);
43 }
44 
45 
46 // * * * * * * * * * * * * * Private Statc Functions * * * * * * * * * * * * //
47 
48 // Update refCells pattern for split cells. Note refCells is current
49 // list of cells to refine (these should all have been refined)
51 (
52  const Map<label>& splitMap,
53  List<refineCell>& refCells
54 )
55 {
56  label newRefI = refCells.size();
57 
58  label oldSize = refCells.size();
59 
60  refCells.setSize(newRefI + splitMap.size());
61 
62  for (label refI = 0; refI < oldSize; refI++)
63  {
64  const refineCell& refCell = refCells[refI];
65 
66  Map<label>::const_iterator iter = splitMap.find(refCell.cellNo());
67 
68  if (iter == splitMap.end())
69  {
71  << "Problem : cannot find added cell for cell "
72  << refCell.cellNo() << abort(FatalError);
73  }
74 
75  refCells[newRefI++] = refineCell(iter(), refCell.direction());
76  }
77 }
78 
79 
80 // Update vectorField for all the new cells. Takes over value of
81 // original cell.
83 (
84  const Map<label>& splitMap,
85  vectorField& field
86 )
87 {
88  field.setSize(field.size() + splitMap.size());
89 
90  forAllConstIter(Map<label>, splitMap, iter)
91  {
92  field[iter()] = field[iter.key()];
93  }
94 }
95 
96 
97 // Add added cells to labelList
99 (
100  const Map<label>& splitMap,
101  labelList& labels
102 )
103 {
104  label newCellI = labels.size();
105 
106  labels.setSize(labels.size() + splitMap.size());
107 
108  forAllConstIter(Map<label>, splitMap, iter)
109  {
110  labels[newCellI++] = iter();
111  }
112 }
113 
114 
115 // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
116 
118 (
119  const primitiveMesh& mesh,
120  const Map<label>& splitMap
121 )
122 {
123  // Construct inverse addressing: from new to original cell.
124  labelList origCell(mesh.nCells(), -1);
125 
126  forAll(addedCells_, cellI)
127  {
128  const labelList& added = addedCells_[cellI];
129 
130  forAll(added, i)
131  {
132  label slave = added[i];
133 
134  if (origCell[slave] == -1)
135  {
136  origCell[slave] = cellI;
137  }
138  else if (origCell[slave] != cellI)
139  {
141  << "Added cell " << slave << " has two different masters:"
142  << origCell[slave] << " , " << cellI
143  << abort(FatalError);
144  }
145  }
146  }
147 
148 
149  forAllConstIter(Map<label>, splitMap, iter)
150  {
151  label masterI = iter.key();
152  label newCellI = iter();
153 
154  while (origCell[masterI] != -1 && origCell[masterI] != masterI)
155  {
156  masterI = origCell[masterI];
157  }
158 
159  if (masterI >= addedCells_.size())
160  {
162  << "Map of added cells contains master cell " << masterI
163  << " which is not a valid cell number" << endl
164  << "This means that the mesh is not consistent with the"
165  << " done refinement" << endl
166  << "newCell:" << newCellI << abort(FatalError);
167  }
168 
169  labelList& added = addedCells_[masterI];
170 
171  if (added.empty())
172  {
173  added.setSize(2);
174  added[0] = masterI;
175  added[1] = newCellI;
176  }
177  else if (findIndex(added, newCellI) == -1)
178  {
179  label sz = added.size();
180  added.setSize(sz + 1);
181  added[sz] = newCellI;
182  }
183  }
184 }
185 
186 
188 {
189  const cellModel& hex = *(cellModeller::lookup("hex"));
190 
191  const cellShapeList& cellShapes = mesh.cellShapes();
192 
193  // Split cellLabels_ into two lists.
194 
195  labelList nonHexLabels(cellLabels_.size());
196  label nonHexI = 0;
197 
198  labelList hexLabels(cellLabels_.size());
199  label hexI = 0;
200 
201  forAll(cellLabels_, i)
202  {
203  label cellI = cellLabels_[i];
204 
205  if (cellShapes[cellI].model() == hex)
206  {
207  hexLabels[hexI++] = cellI;
208  }
209  else
210  {
211  nonHexLabels[nonHexI++] = cellI;
212  }
213  }
214 
215  nonHexLabels.setSize(nonHexI);
216 
217  cellLabels_.transfer(nonHexLabels);
218 
219  hexLabels.setSize(hexI);
220 
221  return hexLabels;
222 }
223 
224 
226 (
227  polyMesh& mesh,
228  const labelList& hexCells,
229  const bool writeMesh
230 )
231 {
232  if (debug)
233  {
234  Pout<< "multiDirRefinement : Refining hexes " << hexCells.size()
235  << endl;
236  }
237 
238  hexRef8 hexRefiner
239  (
240  mesh,
241  labelList(mesh.nCells(), 0), // cellLevel
242  labelList(mesh.nPoints(), 0), // pointLevel
244  (
245  IOobject
246  (
247  "refinementHistory",
250  mesh,
253  false
254  ),
256  labelList(0),
257  false
258  ) // refinement history
259  );
260 
261  polyTopoChange meshMod(mesh);
262 
263  labelList consistentCells
264  (
265  hexRefiner.consistentRefinement
266  (
267  hexCells,
268  true // buffer layer
269  )
270  );
271 
272  // Check that consistentRefinement hasn't added cells
273  {
274  // Create count 1 for original cells
275  Map<label> hexCellSet(2*hexCells.size());
276  forAll(hexCells, i)
277  {
278  hexCellSet.insert(hexCells[i], 1);
279  }
280 
281  // Increment count
282  forAll(consistentCells, i)
283  {
284  const label cellI = consistentCells[i];
285 
286  Map<label>::iterator iter = hexCellSet.find(cellI);
287 
288  if (iter == hexCellSet.end())
289  {
291  << "Resulting mesh would not satisfy 2:1 ratio"
292  << " when refining cell " << cellI << abort(FatalError);
293  }
294  else
295  {
296  iter() = 2;
297  }
298  }
299 
300  // Check if all been visited (should always be since
301  // consistentRefinement set up to extend set.
302  forAllConstIter(Map<label>, hexCellSet, iter)
303  {
304  if (iter() != 2)
305  {
307  << "Resulting mesh would not satisfy 2:1 ratio"
308  << " when refining cell " << iter.key()
309  << abort(FatalError);
310  }
311  }
312  }
313 
314 
315  hexRefiner.setRefinement(consistentCells, meshMod);
316 
317  // Change mesh, no inflation
318  autoPtr<mapPolyMesh> morphMapPtr = meshMod.changeMesh(mesh, false, true);
319  const mapPolyMesh& morphMap = morphMapPtr();
320 
321  if (morphMap.hasMotionPoints())
322  {
323  mesh.movePoints(morphMap.preMotionPoints());
324  }
325 
326  if (writeMesh)
327  {
328  mesh.write();
329  }
330 
331  if (debug)
332  {
333  Pout<< "multiDirRefinement : updated mesh at time "
334  << mesh.time().timeName() << endl;
335  }
336 
337  hexRefiner.updateMesh(morphMap);
338 
339  // Collect all cells originating from same old cell (original + 7 extra)
340 
341  forAll(consistentCells, i)
342  {
343  addedCells_[consistentCells[i]].setSize(8);
344  }
345  labelList nAddedCells(addedCells_.size(), 0);
346 
347  const labelList& cellMap = morphMap.cellMap();
348 
349  forAll(cellMap, cellI)
350  {
351  const label oldCellI = cellMap[cellI];
352 
353  if (addedCells_[oldCellI].size())
354  {
355  addedCells_[oldCellI][nAddedCells[oldCellI]++] = cellI;
356  }
357  }
358 }
359 
360 
362 (
363  polyMesh& mesh,
364  List<vectorField>& cellDirections,
365  const cellLooper& cellWalker,
366  undoableMeshCutter& cutter,
367  const bool writeMesh
368 )
369 {
370  // Iterator
371  refinementIterator refiner(mesh, cutter, cellWalker, writeMesh);
372 
373  forAll(cellDirections, dirI)
374  {
375  if (debug)
376  {
377  Pout<< "multiDirRefinement : Refining " << cellLabels_.size()
378  << " cells in direction " << dirI << endl
379  << endl;
380  }
381 
382  const vectorField& dirField = cellDirections[dirI];
383 
384  // Combine cell to be cut with direction to cut in.
385  // If dirField is only one element use this for all cells.
386 
387  List<refineCell> refCells(cellLabels_.size());
388 
389  if (dirField.size() == 1)
390  {
391  // Uniform directions.
392  if (debug)
393  {
394  Pout<< "multiDirRefinement : Uniform refinement:"
395  << dirField[0] << endl;
396  }
397 
398  forAll(refCells, refI)
399  {
400  label cellI = cellLabels_[refI];
401 
402  refCells[refI] = refineCell(cellI, dirField[0]);
403  }
404  }
405  else
406  {
407  // Non uniform directions.
408  forAll(refCells, refI)
409  {
410  const label cellI = cellLabels_[refI];
411 
412  refCells[refI] = refineCell(cellI, dirField[cellI]);
413  }
414  }
415 
416  // Do refine mesh (multiple iterations). Remember added cells.
417  Map<label> splitMap = refiner.setRefinement(refCells);
418 
419  // Update overall map of added cells
420  addCells(mesh, splitMap);
421 
422  // Add added cells to list of cells to refine in next iteration
423  addCells(splitMap, cellLabels_);
424 
425  // Update refinement direction for added cells.
426  if (dirField.size() != 1)
427  {
428  forAll(cellDirections, i)
429  {
430  update(splitMap, cellDirections[i]);
431  }
432  }
433 
434  if (debug)
435  {
436  Pout<< "multiDirRefinement : Done refining direction " << dirI
437  << " resulting in " << cellLabels_.size() << " cells" << nl
438  << endl;
439  }
440  }
441 }
442 
443 
445 (
446  polyMesh& mesh,
447  List<vectorField>& cellDirections,
448  const dictionary& dict,
449  const bool writeMesh
450 )
451 {
452  // How to walk cell circumference.
453  Switch pureGeomCut(dict.lookup("geometricCut"));
454 
455  autoPtr<cellLooper> cellWalker(NULL);
456  if (pureGeomCut)
457  {
458  cellWalker.reset(new geomCellLooper(mesh));
459  }
460  else
461  {
462  cellWalker.reset(new hexCellLooper(mesh));
463  }
464 
465  // Construct undoable refinement topology modifier.
466  //Note: undoability switched off.
467  // Might want to reconsider if needs to be possible. But then can always
468  // use other constructor.
469  undoableMeshCutter cutter(mesh, false);
470 
471  refineAllDirs(mesh, cellDirections, cellWalker(), cutter, writeMesh);
472 }
473 
474 
475 
476 // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
477 
478 // Construct from dictionary
480 (
481  polyMesh& mesh,
482  const labelList& cellLabels, // list of cells to refine
483  const dictionary& dict
484 )
485 :
486  cellLabels_(cellLabels),
487  addedCells_(mesh.nCells())
488 {
489  Switch useHex(dict.lookup("useHexTopology"));
490 
491  Switch writeMesh(dict.lookup("writeMesh"));
492 
493  wordList dirNames(dict.lookup("directions"));
494 
495  if (useHex && dirNames.size() == 3)
496  {
497  // Filter out hexes from cellLabels_
498  labelList hexCells(splitOffHex(mesh));
499 
500  refineHex8(mesh, hexCells, writeMesh);
501  }
502 
503  label nRemainingCells = cellLabels_.size();
504 
505  reduce(nRemainingCells, sumOp<label>());
506 
507  if (nRemainingCells > 0)
508  {
509  // Any cells to refine using meshCutter
510 
511  // Determine directions for every cell. Can either be uniform
512  // (size = 1) or non-uniform (one vector per cell)
513  directions cellDirections(mesh, dict);
514 
515  refineFromDict(mesh, cellDirections, dict, writeMesh);
516  }
517 }
518 
519 
520 // Construct from directionary and directions to refine.
522 (
523  polyMesh& mesh,
524  const labelList& cellLabels, // list of cells to refine
525  const List<vectorField>& cellDirs, // Explicitly provided directions
526  const dictionary& dict
527 )
528 :
529  cellLabels_(cellLabels),
530  addedCells_(mesh.nCells())
531 {
532  Switch useHex(dict.lookup("useHexTopology"));
533 
534  Switch writeMesh(dict.lookup("writeMesh"));
535 
536  wordList dirNames(dict.lookup("directions"));
537 
538  if (useHex && dirNames.size() == 3)
539  {
540  // Filter out hexes from cellLabels_
541  labelList hexCells(splitOffHex(mesh));
542 
543  refineHex8(mesh, hexCells, writeMesh);
544  }
545 
546  label nRemainingCells = cellLabels_.size();
547 
548  reduce(nRemainingCells, sumOp<label>());
549 
550  if (nRemainingCells > 0)
551  {
552  // Any cells to refine using meshCutter
553 
554  // Working copy of cells to refine
555  List<vectorField> cellDirections(cellDirs);
556 
557  refineFromDict(mesh, cellDirections, dict, writeMesh);
558  }
559 }
560 
561 
562 // Construct from components. Implies meshCutter since directions provided.
564 (
565  polyMesh& mesh,
566  undoableMeshCutter& cutter, // actual mesh modifier
567  const cellLooper& cellWalker, // how to cut a single cell with
568  // a plane
569  const labelList& cellLabels, // list of cells to refine
570  const List<vectorField>& cellDirs,
571  const bool writeMesh // write intermediate meshes
572 )
573 :
574  cellLabels_(cellLabels),
575  addedCells_(mesh.nCells())
576 {
577  // Working copy of cells to refine
578  List<vectorField> cellDirections(cellDirs);
579 
580  refineAllDirs(mesh, cellDirections, cellWalker, cutter, writeMesh);
581 }
582 
583 
584 // ************************************************************************* //
cellShapes
const cellShapeList & cellShapes
Definition: getFieldScalar.H:35
Foam::IOobject
IOobject defines the attributes of an object for which implicit objectRegistry management is supporte...
Definition: IOobject.H:91
Foam::Switch
A simple wrapper around bool so that it can be read as a word: true/false, on/off,...
Definition: Switch.H:60
Foam::hexRef8::consistentRefinement
labelList consistentRefinement(const labelList &cellsToRefine, const bool maxSet) const
Given valid mesh and current cell level and proposed.
Definition: hexRef4.C:2258
Foam::labelList
List< label > labelList
A List of labels.
Definition: labelList.H:56
Foam::multiDirRefinement::splitOffHex
labelList splitOffHex(const primitiveMesh &mesh)
Remove hexes from cellLabels_ and return these in a list.
Definition: multiDirRefinement.C:187
forAll
#define forAll(list, i)
Loop across all elements in list.
Definition: UList.H:406
Foam::findIndex
label findIndex(const ListType &, typename ListType::const_reference, const label start=0)
Find first occurence of given element and return index,.
Foam::polyTopoChange::changeMesh
autoPtr< mapPolyMesh > changeMesh(polyMesh &mesh, const bool inflate, const bool syncParallel=true, const bool orderCells=false, const bool orderPoints=false)
Inplace changes mesh without change of patches.
Definition: polyTopoChange.C:3039
Foam::multiDirRefinement::refineHex8
void refineHex8(polyMesh &mesh, const labelList &hexCells, const bool writeMesh)
Refine cells (hex only) in all 3 directions.
Definition: multiDirRefinement.C:226
Foam::refinementIterator::setRefinement
Map< label > setRefinement(const List< refineCell > &)
Try to refine cells in given direction. Constructs intermediate.
Definition: refinementIterator.C:73
mapPolyMesh.H
Foam::refinementIterator
Utility class to do iterating meshCutter until all requests satisfied.
Definition: refinementIterator.H:64
Foam::polyMesh::meshSubDir
static word meshSubDir
Return the mesh sub-directory name (usually "polyMesh")
Definition: polyMesh.H:309
polyTopoChange.H
Foam::dictionary::lookup
ITstream & lookup(const word &, bool recursive=false, bool patternMatch=true) const
Find and return an entry data stream.
Definition: dictionary.C:449
Foam::polyTopoChange
Direct mesh changes based on v1.3 polyTopoChange syntax.
Definition: polyTopoChange.H:97
Foam::List::transfer
void transfer(List< T > &)
Transfer the contents of the argument List into this list.
Foam::polyMesh::facesInstance
const fileName & facesInstance() const
Return the current instance directory for faces.
Definition: polyMesh.C:778
Foam::Map< label >
Foam::hexRef8::updateMesh
void updateMesh(const mapPolyMesh &)
Update local numbering for changed mesh.
Definition: hexRef4.C:4287
multiDirRefinement.H
Foam::fvMesh::movePoints
virtual tmp< scalarField > movePoints(const pointField &)
Move points, returns volumes swept by faces in motion.
Definition: fvMesh.C:726
Foam::endl
Ostream & endl(Ostream &os)
Add newline and flush stream.
Definition: Ostream.H:251
Foam::mapPolyMesh::preMotionPoints
const pointField & preMotionPoints() const
Pre-motion point positions.
Definition: mapPolyMesh.H:609
geomCellLooper.H
undoableMeshCutter.H
polyMesh.H
Foam::directions
Set of directions for each cell in the mesh. Either uniform and size=1 or one set of directions per c...
Definition: directions.H:63
Foam::polyMesh
Mesh consisting of general polyhedral cells.
Definition: polyMesh.H:74
Foam::IOobject::NO_WRITE
@ NO_WRITE
Definition: IOobject.H:118
forAllConstIter
forAllConstIter(PtrDictionary< phaseModel >, mixture.phases(), phase)
Definition: pEqn.H:39
Foam::primitiveMesh::nCells
label nCells() const
Definition: primitiveMeshI.H:64
Foam::fvMesh::write
virtual bool write() const
Write mesh using IO settings from time.
Definition: fvMesh.C:873
Foam::refinementHistory
All refinement history. Used in unrefinement.
Definition: refinementHistory.H:95
Foam::primitiveMesh::nPoints
label nPoints() const
Definition: primitiveMeshI.H:35
Foam::reduce
void reduce(const List< UPstream::commsStruct > &comms, T &Value, const BinaryOp &bop, const int tag, const label comm)
Definition: PstreamReduceOps.H:43
Foam::hexRef8::setRefinement
labelListList setRefinement(const labelList &cells, polyTopoChange &)
Insert refinement. All selected cells will be split into 8.
Definition: hexRef4.C:3242
cellModeller.H
Foam::multiDirRefinement::refineAllDirs
void refineAllDirs(polyMesh &mesh, List< vectorField > &cellDirections, const cellLooper &cellWalker, undoableMeshCutter &cutter, const bool writeMesh)
Refine cells in cellLabels_ in directions mentioned.
Definition: multiDirRefinement.C:362
Foam::label
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
Foam::Field
Pre-declare SubField and related Field type.
Definition: Field.H:57
Foam::IOobject::NO_READ
@ NO_READ
Definition: IOobject.H:111
Foam::nl
static const char nl
Definition: Ostream.H:260
hexRef8.H
Foam::multiDirRefinement::multiDirRefinement
multiDirRefinement(const multiDirRefinement &)
Disallow default bitwise copy construct.
Foam::cellModeller::lookup
static const cellModel * lookup(const word &)
Look up a model by name and return a pointer to the model or NULL.
Definition: cellModeller.C:91
directions.H
Foam::cellLooper
Abstract base class. Concrete implementations know how to cut a cell (i.e. determine a loop around th...
Definition: cellLooper.H:69
Foam::geomCellLooper
Implementation of cellLooper. Does pure geometric cut through cell.
Definition: geomCellLooper.H:63
dict
dictionary dict
Definition: searchingEngine.H:14
Foam::refineCell::direction
const vector & direction() const
Definition: refineCell.H:83
Foam::FatalError
error FatalError
Foam::dictionary
A list of keyword definitions, which are a keyword followed by any number of values (e....
Definition: dictionary.H:137
mesh
dynamicFvMesh & mesh
Definition: createDynamicFvMesh.H:18
Foam
Namespace for OpenFOAM.
Definition: combustionModel.C:30
Foam::multiDirRefinement::update
static void update(const Map< label > &, vectorField &)
Given map from original to added cell set the vectorField for.
Definition: multiDirRefinement.C:83
Foam::abort
errorManip< error > abort(error &err)
Definition: errorManip.H:131
Foam::hex
IOstream & hex(IOstream &io)
Definition: IOstream.H:564
Foam::multiDirRefinement::refineFromDict
void refineFromDict(polyMesh &mesh, List< vectorField > &cellDirections, const dictionary &dict, const bool writeMesh)
Refine based on dictionary. Calls refineAllDirs.
Definition: multiDirRefinement.C:445
Foam::multiDirRefinement::addCells
static void addCells(const Map< label > &, List< refineCell > &)
Given map from original to added cell set the refineCell for.
Definition: multiDirRefinement.C:51
Foam::List::setSize
void setSize(const label)
Reset size of List.
Foam::autoPtr
An auto-pointer similar to the STL auto_ptr but with automatic casting to a reference to the type and...
Definition: PtrList.H:117
Foam::refineCell
Container with cells to refine. Refinement given as single direction.
Definition: refineCell.H:52
Foam::multiDirRefinement::cellLabels_
labelList cellLabels_
Current set of cells to refine. Extended with added cells.
Definition: multiDirRefinement.H:79
FatalErrorInFunction
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
Definition: error.H:318
Foam::sumOp
Definition: ops.H:162
Foam::hexRef8
Refinement of (split) hexes using polyTopoChange.
Definition: hexRef4.H:64
Foam::Pout
prefixOSstream Pout(cout, "Pout")
Definition: IOstreams.H:53
Foam::Time::timeName
static word timeName(const scalar, const int precision=precision_)
Return time name of given scalar time.
Definition: Time.C:741
Foam::List< refineCell >
Foam::mapPolyMesh
Class containing mesh-to-mesh mapping information after a change in polyMesh topology.
Definition: mapPolyMesh.H:158
Foam::mapPolyMesh::hasMotionPoints
bool hasMotionPoints() const
Has valid preMotionPoints?
Definition: mapPolyMesh.H:615
Foam::autoPtr::reset
void reset(T *=0)
If object pointer already set, delete object and set to given.
Definition: autoPtrI.H:114
Foam::fvMesh::time
const Time & time() const
Return the top-level database.
Definition: fvMesh.H:243
Foam::refineCell::cellNo
label cellNo() const
Definition: refineCell.H:78
Foam::cellModel
Maps a geometry to a set of cell primitives, which enables geometric cell data to be calculated witho...
Definition: cellModel.H:64
Foam::List::size
void size(const label)
Override size to be inconsistent with allocated storage.
Foam::defineTypeNameAndDebug
defineTypeNameAndDebug(combustionModel, 0)
Foam::hexCellLooper
Implementation of cellLooper.
Definition: hexCellLooper.H:60
hexCellLooper.H
Foam::mapPolyMesh::cellMap
const labelList & cellMap() const
Old cell map.
Definition: mapPolyMesh.H:431
writeMesh
void writeMesh(const string &msg, const meshRefinement &meshRefiner, const meshRefinement::debugType debugLevel, const meshRefinement::writeType writeLevel)
Definition: snappyHexMesh.C:580
Foam::undoableMeshCutter
The main refinement handler. Gets cellCuts which is structure that describes which cells are to be cu...
Definition: undoableMeshCutter.H:93
Foam::primitiveMesh
Cell-face mesh analysis engine.
Definition: primitiveMesh.H:79