/usr/include/freefoam/meshTools/cellClassification.H is in libfreefoam-dev 0.1.0+dfsg-1build1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 | /*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-2010 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
Class
Foam::cellClassification
Description
'Cuts' a mesh with a surface.
Divides cells into three types
- cut, i.e. any of the edges of the cell is split or any edge of the
surface pierces any of the faces of the cell.
- outside: cell can be reached by Meshwave from any of the supplied
outside points (without crossing any cut cell)
- inside: all other.
Used in various meshing programs.
Has various utility functions to deal with 'features' on this level
where the mesh still has all inside and outside cells.
@par Concepts
- point classification:
- point used by meshType cells only
- point used by non-meshType cells only
- point used by both types ('mixed')
- hanging cells: meshType cells using mixed points only.
These cells would have all their vertices on the surface when
extracting the meshType cells.
- regionEdges: edges where the cells using it are of mixed type.
Or more precise when walking around the edge and looking at the
different types of the cells there are more than two regions with
same type.
Seen from above:
@verbatim
Ok:
A | A
|
--+---
|
B | B
Not ok:
A | B
|
---+---
|
B | A
@endverbatim
because this latter situation would cause the surface after subsetting
type A or B to be multiply connected across this edge. And also when
snapping the edge end points to the surface it might cause some twisted
faces if the surface is normal to the edge (and smoothing the surface
would not help since the points on the edge would be 'pulled' from two
different sides)
- regionPoints: like regionEdges but now for points.
Points where subsetting the mesh would cause a multiply connected
outside surface (connected across point, not edge)
SourceFiles
cellClassification.C
\*---------------------------------------------------------------------------*/
#ifndef cellClassification_H
#define cellClassification_H
#include <OpenFOAM/pointField.H>
#include <OpenFOAM/Map.H>
#include <OpenFOAM/boolList.H>
#include <OpenFOAM/labelList.H>
#include <OpenFOAM/faceList.H>
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
// Forward declaration of classes
class triSurfaceSearch;
class meshSearch;
class polyMesh;
class polyMesh;
class primitiveMesh;
class triSurface;
/*---------------------------------------------------------------------------*\
Class cellClassification Declaration
\*---------------------------------------------------------------------------*/
class cellClassification
:
public labelList
{
public:
// Public data types
//- Type of cell.
enum cType
{
NOTSET,
INSIDE, // Inside of surface
OUTSIDE, // Outside ,,
CUT // cut by surface
};
//- Enumeration defining the whether points are use by cells of
// a certain type.
enum pointStatus
{
UNSET,
MESH, // points used by meshType cells
NONMESH, // ,, non-mesh type cells
MIXED // ,, both types of cell
};
private:
// Private data
//- Reference to mesh
const polyMesh& mesh_;
// Private Static Functions
//- Count number of occurrences of elem in list
static label count(const labelList& elems, const label elem);
// Private Member Functions
//- Mark all faces intersected by or intersecting surface
boolList markFaces(const triSurfaceSearch&) const;
//- Divide cells into cut/inside/outside by using MeshWave from cut
// faces. No check is done on whether outsidePts are in different
// domains.
void markCells
(
const meshSearch& queryMesh,
const boolList& piercedFace,
const pointField& outsidePts
);
//- Use cell status to classify points as being internal to meshType,
// internal to non-meshType or on border of both.
void classifyPoints
(
const label meshType,
const labelList& cellType,
List<pointStatus>& pointSide
) const;
//- Return true if cell uses only points with status=mixed
bool usesMixedPointsOnly
(
const List<pointStatus>&,
const label cellI
) const;
//- Get faces (and its 'owner') inbetween cells of differing type
// (meshType and non-meshType).
void getMeshOutside(const label meshType, faceList&, labelList&) const;
public:
// Static data members
ClassName("cellClassification");
// Constructors
//- Construct from mesh and surface and point(s) on outside
cellClassification
(
const polyMesh& mesh,
const meshSearch& meshQuery,
const triSurfaceSearch& surfQuery,
const pointField& outsidePoints
);
//- Construct from mesh and type for every cell.
// Used to be able to reuse filling routines below.
cellClassification(const polyMesh& mesh, const labelList& cellType);
//- Construct as copy
cellClassification(const cellClassification&);
// Member Functions
const polyMesh& mesh() const
{
return mesh_;
}
label trimCutCells
(
const label nLayers,
const label meshType,
const label fillType
);
//- Sets vertex neighbours of meshType cells to fillType
label growSurface(const label meshType, const label fillType);
//- Find hanging cells (cells with all points on outside) and set their
// type to fillType.
// Iterate until nothing changed. Returns total number of cells
// changed (in all iterations)
label fillHangingCells
(
const label meshType,
const label fillType,
const label maxIter
);
//- Find regionEdges and fill one neighbour. Iterate until nothing
// changes. Returns total number of cells changed.
label fillRegionEdges
(
const label meshType,
const label fillType,
const label maxIter
);
//- Find regionPoints and fill all neighbours. Iterate until nothing
// changes. Returns total number of cells changed.
label fillRegionPoints
(
const label meshType,
const label fillType,
const label maxIter
);
//- Write statistics on cell types to Ostream
void writeStats(Ostream& os) const;
// Member Operators
void operator=(const cellClassification&);
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************ vim: set sw=4 sts=4 et: ************************ //
|