meshOctreeAutomaticRefinementRef.C
Go to the documentation of this file.
1 /*---------------------------------------------------------------------------*\
2  ========= |
3  \\ / F ield | cfMesh: A library for mesh generation
4  \\ / O peration |
5  \\ / A nd | Author: Franjo Juretic (franjo.juretic@c-fields.com)
6  \\/ M anipulation | Copyright (C) Creative Fields, Ltd.
7 -------------------------------------------------------------------------------
8 License
9  This file is part of cfMesh.
10 
11  cfMesh is free software; you can redistribute it and/or modify it
12  under the terms of the GNU General Public License as published by the
13  Free Software Foundation; either version 3 of the License, or (at your
14  option) any later version.
15 
16  cfMesh 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 cfMesh. If not, see <http://www.gnu.org/licenses/>.
23 
24 Description
25 
26 \*---------------------------------------------------------------------------*/
27 
29 #include "triSurface.H"
30 #include "demandDrivenData.H"
31 #include "triSurfacePartitioner.H"
33 #include "meshOctreeAddressing.H"
34 #include "triSurf.H"
35 #include "helperFunctions.H"
36 #include "meshOctreeModifier.H"
37 
38 #include "Map.H"
39 
40 # ifdef USE_OMP
41 #include <omp.h>
42 # endif
43 
44 //#define DEBUGAutoRef
45 
46 # ifdef DEBUGAutoRef
47 #include "pointSet.H"
48 #include "IOdictionary.H"
49 #include "objectRegistry.H"
50 #include "Time.H"
51 # endif
52 
53 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
54 
55 namespace Foam
56 {
57 
58 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
59 
61 {
62  hexRefinement_ = true;
63 }
64 
66 {
67  Info << "Performing automatic refinement" << endl;
68 
69  if( !maxRefLevel_ )
70  return;
71 
73 
75 
76  Info << "Finished with automatic refinement" << endl;
77 }
78 
80 {
81  labelList refineBox(octree_.numberOfLeaves(), direction(0));
82  labelLongList refinementCandidates;
83  forAll(refineBox, i)
84  refinementCandidates.append(i);
85  while( refineBasedOnCurvature(refineBox, refinementCandidates) )
86  {
87  refineSelectedBoxes(refineBox, refinementCandidates);
88  }
89 
90  return false;
91 }
92 
94 {
95  bool refine(false);
96  labelList refineBox(octree_.numberOfLeaves(), direction(0));
97  labelLongList refinementCandidates;
98  forAll(refineBox, i)
99  refinementCandidates.append(i);
100  while( refineBasedOnContainedCorners(refineBox, refinementCandidates) )
101  {
102  refineSelectedBoxes(refineBox, refinementCandidates);
103  refine = true;
104  }
105 
106  refinementCandidates.clear();
107  forAll(refineBox, i)
108  refinementCandidates.append(i);
109  while( refineBasedOnContainedPartitions(refineBox, refinementCandidates) )
110  {
111  refineSelectedBoxes(refineBox, refinementCandidates);
112  refine = true;
113  }
114 
115  refinementCandidates.clear();
116  forAll(refineBox, i)
117  refinementCandidates.append(i);
118  while( refineBasedOnProximityTests(refineBox, refinementCandidates) )
119  {
120  refineSelectedBoxes(refineBox, refinementCandidates);
121  refine = true;
122  }
123 
124  return refine;
125 }
126 
128 (
129  labelList& refineBox,
130  const labelLongList& refCandidates
131 )
132 {
133  meshOctreeModifier octreeModifier(octree_);
134  const LongList<meshOctreeCube*>& leaves = octreeModifier.leavesAccess();
135  const boundBox& rootBox = octree_.rootBox();
136  const triSurf& surface = octree_.surface();
137  const pointField& points = surface.points();
138  const triSurfacePartitioner& sPart = this->partitioner();
139 
140  //- find leaves which contains corner nodes
141  labelList cornerInLeaf(refineBox.size(), -1);
142  const labelList& corners = sPart.corners();
143 
144  label nMarked(0);
145 
146  forAll(corners, cornerI)
147  {
148  const label cLabel =
149  octree_.findLeafContainingVertex(points[corners[cornerI]]);
150 
151  if( cLabel < 0 )
152  continue;
153 
154  if( cornerInLeaf[cLabel] != -1 )
155  {
156  // refine this box because it already contains some other corner
157  ++nMarked;
158  refineBox[cLabel] = 1;
159  }
160  else
161  {
162  cornerInLeaf[cLabel] = corners[cornerI];
163  }
164  }
165 
166  DynList<label> leavesInBox;
167  # ifdef USE_OMP
168  # pragma omp parallel for if( refCandidates.size() > 1000 ) \
169  private(leavesInBox) shared(cornerInLeaf) \
170  reduction(+ : nMarked) schedule(dynamic, 20)
171  # endif
172  forAll(refCandidates, refI)
173  {
174  const label leafI = refCandidates[refI];
175  if( leaves[leafI]->level() >= maxRefLevel_ )
176  continue;
177  if( cornerInLeaf[leafI] == -1 )
178  continue;
179 
180  // check if there exist some corners in the neighbour boxes
181  // refine the box if some corners are found in the neighbouring boxes
182  const point c = leaves[leafI]->centre(rootBox);
183  const scalar r = 1.732 * leaves[leafI]->size(rootBox);
184 
185  boundBox bb(c - point(r, r, r), c + point(r, r, r));
186 
187  leavesInBox.clear();
188  octree_.findLeavesContainedInBox(bb, leavesInBox);
189 
190  forAll(leavesInBox, i)
191  {
192  const label nei = leavesInBox[i];
193 
194  if( nei < 0 )
195  continue;
196 
197  if( nei == leafI )
198  continue;
199  if( cornerInLeaf[nei] == -1 )
200  continue;
201 
202  if( mag(points[cornerInLeaf[nei]] - c) < r )
203  {
204  ++nMarked;
205  refineBox[nei] = 1;
206  refineBox[leafI] = 1;
207  break;
208  }
209  }
210  }
211 
212  reduce(nMarked, sumOp<label>());
213  Info << nMarked << " boxes marked by the corner criteria" << endl;
214 
215  if( nMarked )
216  return true;
217 
218  return false;
219 }
220 
222 (
223  labelList& refineBox,
224  const labelLongList& refCandidates
225 )
226 {
227  const boundBox& rootBox = octree_.rootBox();
228  const triSurfacePartitioner& sPart = this->partitioner();
229 
230  //- find leaves which contains corner nodes
231  const List<labelHashSet>& pPatches = sPart.patchPatches();
232  const labelList& edgeGroups = sPart.edgeGroups();
233  const List<labelHashSet>& eNeiGroups = sPart.edgeGroupEdgeGroups();
234 
235  # ifdef DEBUGAutoRef
236  Info << "pPart " << pPart << endl;
237  # endif
238 
239  label nMarked(0);
240 
241  meshOctreeModifier octreeModifier(octree_);
242  const triSurf& surf = octree_.surface();
243  const LongList<meshOctreeCube*>& leaves = octreeModifier.leavesAccess();
244 
245  DynList<label> patches, eGroups, helper;
246  # ifdef USE_OMP
247  # pragma omp parallel for if( refCandidates.size() > 1000 ) \
248  private(patches, eGroups, helper) \
249  reduction(+ : nMarked) schedule(dynamic, 20)
250  # endif
251  forAll(refCandidates, refI)
252  {
253  const label leafI = refCandidates[refI];
254  if( !leaves[leafI]->hasContainedElements() )
255  continue;
256  if( leaves[leafI]->level() >= maxRefLevel_ )
257  continue;
258 
259  const meshOctreeCubeBasic& oc = *leaves[leafI];
260  const point c = oc.centre(rootBox);
261  const scalar s = 1.733 * oc.size(rootBox);
262  const boundBox bb(c - point(s, s, s), c + point(s, s, s));
263 
264  //- find triangle patches contained in this box
265  octree_.findTrianglesInBox(bb, helper);
266  patches.clear();
267  forAll(helper, i)
268  patches.appendIfNotIn(surf[helper[i]].region());
269 
270  //- find edge partitions contained in this box
271  helper.clear();
272  octree_.findEdgesInBox(bb, helper);
273  eGroups.clear();
274  forAll(helper, i)
275  eGroups.appendIfNotIn(edgeGroups[helper[i]]);
276 
277  # ifdef DEBUGAutoRef
278  Info << "patches for leaf " << leafI << " are " << patches << endl;
279  # endif
280 
281  bool refine(false);
282  forAll(patches, patchI)
283  {
284  for(label patchJ=(patchI+1);patchJ<patches.size();++patchJ)
285  if( !pPatches[patches[patchI]].found(patches[patchJ]) )
286  {
287  # ifdef DEBUGAutoRef
288  Info << "2.Here" << endl;
289  # endif
290 
291  refine = true;
292  break;
293  }
294  }
295 
296  forAll(eGroups, egI)
297  {
298  for(label egJ=egI+1;egJ<eGroups.size();++egJ)
299  if( !eNeiGroups[eGroups[egI]].found(eGroups[egJ]) )
300  {
301  refine = true;
302  break;
303  }
304  }
305 
306  if( refine )
307  {
308  # ifdef DEBUGAutoRef
309  Info << "Selecting leaf " << leafI
310  << " for auto-refinement" << endl;
311  # endif
312 
313  ++nMarked;
314  refineBox[leafI] = 1;
315  }
316  }
317 
318  reduce(nMarked, sumOp<label>());
319  Info << nMarked << " boxed marked by partitioning criteria" << endl;
320 
321  if( nMarked )
322  return true;
323 
324  return false;
325 }
326 
328 (
329  labelList& refineBox,
330  const labelLongList& refCandidates
331 )
332 {
333  const triSurfaceCurvatureEstimator& curv = curvature();
334 
335  const boundBox& rootBox = octree_.rootBox();
336 
337  label nMarked(0);
338  DynList<label> containedTrias;
339  # ifdef USE_OMP
340  # pragma omp parallel for if( refCandidates.size() > 10000 ) \
341  private(containedTrias) \
342  reduction(+ : nMarked) schedule(dynamic, 100)
343  # endif
344  forAll(refCandidates, refI)
345  {
346  const label leafI = refCandidates[refI];
347 
348  if( !octree_.hasContainedTriangles(leafI) )
349  continue;
350 
351  const meshOctreeCubeBasic& oc = octree_.returnLeaf(leafI);
352  if( oc.level() >= maxRefLevel_ )
353  continue;
354 
355  //- search for the minimum curvature radius at surface triangles
356  octree_.containedTriangles(leafI, containedTrias);
357 
358  scalar maxCurv(0.0);
359  forAll(containedTrias, i)
360  maxCurv =
361  Foam::max
362  (
363  maxCurv,
364  mag(curv.meanCurvatureAtTriangle(containedTrias[i]))
365  );
366 
367  //- check the edge curvature
368  if( octree_.hasContainedEdges(leafI) )
369  {
370  octree_.containedEdges(leafI, containedTrias);
371 
372  forAll(containedTrias, i)
373  {
374  maxCurv =
375  Foam::max
376  (
377  maxCurv,
378  mag(curv.curvatureAtEdge(containedTrias[i]))
379  );
380  }
381  }
382 
383  if( oc.size(rootBox) > 0.2835 / (maxCurv + SMALL) )
384  {
385  refineBox[leafI] = 1;
386  ++nMarked;
387  }
388  }
389 
390  reduce(nMarked, sumOp<label>());
391  Info << nMarked << " boxes marked by curvature criteria!" << endl;
392 
393  if( nMarked )
394  return true;
395 
396  return false;
397 }
398 
400 (
401  labelList& refineBox,
402  const labelLongList& refCandidates
403 )
404 {
405  const boundBox& rootBox = octree_.rootBox();
406  const triSurf& surf = octree_.surface();
407 
408  label nMarked(0);
409  DynList<label> helper;
410  # ifdef USE_OMP
411  # pragma omp parallel for if( refCandidates.size() > 1000 ) \
412  private(helper) reduction(+ : nMarked) schedule(dynamic, 20)
413  # endif
414  forAll(refCandidates, refI)
415  {
416  const label leafI = refCandidates[refI];
417 
418  if( !octree_.hasContainedTriangles(leafI) )
419  continue;
420 
421  const meshOctreeCubeBasic& oc = octree_.returnLeaf(leafI);
422  if( oc.level() >= maxRefLevel_ )
423  continue;
424 
425  const point c = oc.centre(rootBox);
426  const scalar s = 1.732 * oc.size(rootBox);
427  boundBox bb(c - point(s, s, s), c + point(s, s, s));
428 
429  labelHashSet triaInRange(100), edgesInRange(100);
430  //- find triangles in range
431  helper.clear();
432  octree_.findTrianglesInBox(bb, helper);
433  forAll(helper, i)
434  triaInRange.insert(helper[i]);
435 
436  //- find edges contained in the neighbourhood
437  helper.clear();
438  octree_.findEdgesInBox(bb, helper);
439  forAll(helper, i)
440  edgesInRange.insert(helper[i]);
441 
442  //- refine boxes with more than two face groups
443  if
444  (
445  (help::numberOfFaceGroups(triaInRange, c, s, surf) > 1) ||
446  (help::numberOfEdgeGroups(edgesInRange, c, s, surf) > 1)
447  )
448  {
449  ++nMarked;
450  refineBox[leafI] = 1;
451  }
452  }
453 
454  reduce(nMarked, sumOp<label>());
455  Info << nMarked << " boxed marked by proximity criteria" << endl;
456 
457  if( nMarked != 0 )
458  return true;
459 
460  return false;
461 }
462 
464 (
465  labelList& refineBox,
466  labelLongList& refCandidates
467 )
468 {
469  deleteDemandDrivenData(octreeAddressingPtr_);
470 
471  meshOctreeModifier octreeModifier(octree_);
472  LongList<meshOctreeCube*> leaves = octreeModifier.leavesAccess();
473 
474  octreeModifier.markAdditionalLayers(refineBox, 1);
475  octreeModifier.refineSelectedBoxes(refineBox, hexRefinement_);
476 
477  //- find the cubes which have been marked for refinement
479  forAll(refineBox, i)
480  {
481  if( refineBox[i] )
482  refinedCubes.append(leaves[i]->coordinates());
483  }
484  leaves.setSize(0);
485 
486  //- perform load distribution in case od parallel runs
487  octreeModifier.loadDistribution();
488 
489  //- communicate the cubes selected for refinement with other processors
490  LongList<meshOctreeCubeCoordinates> receivedCoordinates;
491  if( Pstream::parRun() )
492  {
493  octree_.exchangeRequestsWithNeighbourProcessors
494  (
495  refinedCubes,
496  receivedCoordinates
497  );
498  }
499 
500  forAll(refinedCubes, i)
501  receivedCoordinates.append(refinedCubes[i]);
502  refinedCubes.setSize(0);
503 
504  //- find the cubes which shall checked in the next iteration
505  refCandidates.clear();
506  forAll(receivedCoordinates, i)
507  {
508  const meshOctreeCubeCoordinates& cc = receivedCoordinates[i];
509 
510  for(label scI=0;scI<8;++scI)
511  {
512  const meshOctreeCubeCoordinates child = cc.refineForPosition(scI);
513 
514  meshOctreeCube* oc = octreeModifier.findCubeForPosition(child);
515 
516  if( !oc || !oc->isLeaf() )
517  continue;
518 
519  refCandidates.append(oc->cubeLabel());
520  }
521  }
522 
523  refineBox.setSize(octree_.numberOfLeaves());
524  refineBox = direction(0);
525 }
526 
527 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
528 
529 } // End namespace Foam
530 
531 // ************************************************************************* //
Foam::surface::surface
surface(const surface &)
Disallow default bitwise copy construct.
Foam::triSurfacePartitioner::edgeGroupEdgeGroups
const List< labelHashSet > & edgeGroupEdgeGroups() const
Edge group - edge groups addressing.
Definition: triSurfacePartitioner.C:84
Foam::meshOctreeModifier::findCubeForPosition
meshOctreeCube * findCubeForPosition(const meshOctreeCubeCoordinates &) const
return the pointer to the meshOctreeCube at the given position
Definition: meshOctreeModifierI.H:78
Foam::help::numberOfFaceGroups
label numberOfFaceGroups(const labelHashSet &containedElements, const point &centre, const scalar range, const triSurf &surface)
find number of face groups within a given range
Definition: helperFunctionsGeometryQueriesI.H:1670
Foam::triSurfacePartitioner
Definition: triSurfacePartitioner.H:53
Foam::LongList::append
void append(const T &e)
Append an element at the end of the list.
Definition: LongListI.H:265
triSurf.H
Foam::meshOctreeAutomaticRefinement::proximityRefinement
bool proximityRefinement()
Definition: meshOctreeAutomaticRefinementRef.C:93
forAll
#define forAll(list, i)
Loop across all elements in list.
Definition: UList.H:406
Foam::meshOctreeCubeCoordinates
Definition: meshOctreeCubeCoordinates.H:55
triSurfacePartitioner.H
Foam::meshOctreeCubeCoordinates::centre
point centre(const boundBox &) const
return centre
Definition: meshOctreeCubeCoordinatesI.H:203
Foam::meshOctreeAutomaticRefinement::refineBasedOnContainedPartitions
bool refineBasedOnContainedPartitions(labelList &, const labelLongList &)
Definition: meshOctreeAutomaticRefinementRef.C:222
demandDrivenData.H
Template functions to aid in the implementation of demand driven data.
Foam::meshOctreeCube::cubeLabel
label cubeLabel() const
position of the cube in the list of leaves
Definition: meshOctreeCubeI.H:76
Foam::LongList::clear
void clear()
Clear the list, i.e. set next free to zero.
Definition: LongListI.H:230
Foam::UPstream::parRun
static bool & parRun()
Is this a parallel run?
Definition: UPstream.H:377
objectRegistry.H
Foam::endl
Ostream & endl(Ostream &os)
Add newline and flush stream.
Definition: Ostream.H:251
Foam::LongList::size
label size() const
Size of the active part of the list.
Definition: LongListI.H:203
Foam::meshOctreeAutomaticRefinement::refineBasedOnContainedCorners
bool refineBasedOnContainedCorners(labelList &, const labelLongList &)
refine boxes based on the number of contained surface corners
Definition: meshOctreeAutomaticRefinementRef.C:128
triSurfaceCurvatureEstimator.H
Foam::mag
dimensioned< scalar > mag(const dimensioned< Type > &)
Foam::HashSet< label, Hash< label > >
Foam::meshOctreeAutomaticRefinement::octree_
meshOctree & octree_
reference to meshOctree
Definition: meshOctreeAutomaticRefinement.H:60
Foam::meshOctreeModifier
Definition: meshOctreeModifier.H:48
meshOctreeModifier.H
meshOctreeAutomaticRefinement.H
Foam::LongList::setSize
void setSize(const label)
Reset size of List.
Definition: LongListI.H:223
Foam::meshOctreeModifier::refineSelectedBoxes
void refineSelectedBoxes(labelList &refineBox, const bool hexRefinement=false)
Definition: meshOctreeModifierRefineSelectedBoxes.C:428
Foam::meshOctree::numberOfLeaves
label numberOfLeaves() const
return leaves of the octree
Definition: meshOctreeI.H:48
Foam::meshOctreeAutomaticRefinement::curvatureRefinement
bool curvatureRefinement()
refine DATA boxes based on curvature
Definition: meshOctreeAutomaticRefinementRef.C:79
Foam::meshOctreeAutomaticRefinement::maxRefLevel_
direction maxRefLevel_
maximum allowed refinement level
Definition: meshOctreeAutomaticRefinement.H:95
Foam::LongList< label >
Foam::deleteDemandDrivenData
void deleteDemandDrivenData(DataPtr &dataPtr)
Definition: demandDrivenData.H:40
Map.H
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::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::meshOctreeModifier::loadDistribution
void loadDistribution(const direction usedType=0)
move octree cubes from one processor to another
Definition: meshOctreeModifierLoadDistribution.C:51
Foam::Info
messageStream Info
Foam::triSurfaceCurvatureEstimator::meanCurvatureAtTriangle
scalar meanCurvatureAtTriangle(const label) const
Definition: triSurfaceCurvatureEstimator.C:102
Foam::meshOctreeCube::isLeaf
bool isLeaf() const
check if the cube is a leaf
Definition: meshOctreeCubeI.H:63
Foam::DynList::appendIfNotIn
void appendIfNotIn(const T &e)
Definition: DynListI.H:324
Foam::meshOctreeCubeCoordinates::refineForPosition
meshOctreeCubeCoordinates refineForPosition(const label) const
return the coordinates of child cube at the given position
Definition: meshOctreeCubeCoordinatesI.H:95
Foam::triSurfacePartitioner::patchPatches
const List< labelHashSet > & patchPatches() const
return patch-patches addressing
Definition: triSurfacePartitioner.C:74
coordinates
PtrList< coordinateSystem > coordinates(solidRegions.size())
Foam::meshOctreeAutomaticRefinement::refineSelectedBoxes
void refineSelectedBoxes(labelList &, labelLongList &)
refine selected boxes
Definition: meshOctreeAutomaticRefinementRef.C:464
Foam
Namespace for OpenFOAM.
Definition: combustionModel.C:30
meshOctreeAddressing.H
s
gmvFile<< "tracers "<< particles.size()<< nl;forAllConstIter(Cloud< passiveParticle >, particles, iter){ gmvFile<< iter().position().x()<< " ";}gmvFile<< nl;forAllConstIter(Cloud< passiveParticle >, particles, iter){ gmvFile<< iter().position().y()<< " ";}gmvFile<< nl;forAllConstIter(Cloud< passiveParticle >, particles, iter){ gmvFile<< iter().position().z()<< " ";}gmvFile<< nl;forAll(lagrangianScalarNames, i){ word name=lagrangianScalarNames[i];IOField< scalar > s(IOobject(name, runTime.timeName(), cloud::prefix, mesh, IOobject::MUST_READ, IOobject::NO_WRITE))
Foam::DynList< label >
Foam::help::numberOfEdgeGroups
label numberOfEdgeGroups(const labelHashSet &containedEdges, const point &centre, const scalar range, const triSurf &surface)
find the number of edge groups within the given range
Definition: helperFunctionsGeometryQueriesI.H:1758
Foam::meshOctreeAutomaticRefinement::refineBasedOnCurvature
bool refineBasedOnCurvature(labelList &, const labelLongList &)
Definition: meshOctreeAutomaticRefinementRef.C:328
Foam::max
dimensioned< Type > max(const dimensioned< Type > &, const dimensioned< Type > &)
found
bool found
Definition: TABSMDCalcMethod2.H:32
Foam::meshOctreeCubeCoordinates::size
scalar size(const boundBox &) const
return size
Definition: meshOctreeCubeCoordinatesI.H:213
IOdictionary.H
Foam::List::setSize
void setSize(const label)
Reset size of List.
Foam::sumOp
Definition: ops.H:162
Foam::meshOctreeCubeCoordinates::level
direction level() const
return level
Definition: meshOctreeCubeCoordinatesI.H:74
Foam::meshOctreeAutomaticRefinement::refineBasedOnProximityTests
bool refineBasedOnProximityTests(labelList &, const labelLongList &)
Definition: meshOctreeAutomaticRefinementRef.C:400
helperFunctions.H
Foam::meshOctreeModifier::markAdditionalLayers
void markAdditionalLayers(labelList &refineBox, const label nLayers=1) const
mark additional layers around the leaves selected for refinement
Definition: meshOctreeModifierRefineSelectedBoxes.C:53
Foam::Vector< scalar >
Foam::List
A 1D array of objects of type <T>, where the size of the vector is known and used for subscript bound...
Definition: HashTable.H:59
Foam::meshOctreeAutomaticRefinement::activateHexRefinement
void activateHexRefinement()
activate hex refinement
Definition: meshOctreeAutomaticRefinementRef.C:60
Foam::meshOctreeCube
Definition: meshOctreeCube.H:56
points
const pointField & points
Definition: gmvOutputHeader.H:1
Foam::surface
Definition: surface.H:55
Foam::HashSet::insert
bool insert(const Key &key)
Insert a new entry.
Definition: HashSet.H:116
Foam::triSurfaceCurvatureEstimator::curvatureAtEdge
scalar curvatureAtEdge(const label) const
Definition: triSurfaceCurvatureEstimator.C:76
Foam::direction
unsigned char direction
Definition: direction.H:43
Foam::triSurfacePartitioner::corners
const labelList & corners() const
return corner nodes
Definition: triSurfacePartitioner.C:64
Foam::boundBox
A bounding box defined in terms of the points at its extremities.
Definition: boundBox.H:55
Foam::constant::universal::c
const dimensionedScalar c
Speed of light in a vacuum.
patches
patches[0]
Definition: createSingleCellMesh.H:36
Foam::DynList::size
label size() const
Definition: DynListI.H:235
Foam::List::size
void size(const label)
Override size to be inconsistent with allocated storage.
Foam::point
vector point
Point is a vector.
Definition: point.H:41
Foam::triSurfacePartitioner::edgeGroups
const labelList & edgeGroups() const
Definition: triSurfacePartitioner.C:79
Foam::triSurf
Definition: triSurf.H:59
Foam::triSurfaceCurvatureEstimator
Definition: triSurfaceCurvatureEstimator.H:51
Foam::DynList::clear
void clear()
Clear the list, i.e. set next free to zero.
Definition: DynListI.H:279
Foam::meshOctreeAutomaticRefinement::automaticRefinement
void automaticRefinement()
Definition: meshOctreeAutomaticRefinementRef.C:65
Foam::meshOctreeCubeBasic
Definition: meshOctreeCubeBasic.H:49
Foam::meshOctreeModifier::leavesAccess
LongList< meshOctreeCube * > & leavesAccess()
return leaves
Definition: meshOctreeModifierI.H:95
pointSet.H
Foam::meshOctreeAutomaticRefinement::hexRefinement_
bool hexRefinement_
a flag for activating paired refinement
Definition: meshOctreeAutomaticRefinement.H:69