FreeFOAM The Cross-Platform CFD Toolkit
cellFeatures.H
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) 1991-2010 OpenCFD Ltd.
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 Class
25  Foam::cellFeatures
26 
27 Description
28  Cell analysis class.
29 
30  Constructs feature edges and feature points, which are edges/points with
31  and angle > given specification.
32  Can be asked for 'superFaces' which can be used to see if a cell is a
33  'splitHex'.
34 
35 SourceFiles
36  cellFeatures.C
37 
38 \*---------------------------------------------------------------------------*/
39 
40 #ifndef cellFeatures_H
41 #define cellFeatures_H
42 
43 #include <OpenFOAM/faceList.H>
44 #include <OpenFOAM/labelList.H>
45 #include <OpenFOAM/boolList.H>
46 #include <OpenFOAM/HashSet.H>
47 #include <OpenFOAM/Map.H>
48 #include <OpenFOAM/DynamicList.H>
49 
50 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
51 
52 namespace Foam
53 {
54 
55 // Forward declaration of classes
56 class primitiveMesh;
57 
58 /*---------------------------------------------------------------------------*\
59  Class cellFeatures Declaration
60 \*---------------------------------------------------------------------------*/
61 
63 {
64  // Private data
65 
66  const primitiveMesh& mesh_;
67 
68  //- cos of angle between two connected faces or two connected edges on
69  // same face before edge/point is 'feature'.
70  scalar minCos_;
71 
72  label cellI_;
73 
74  //- Feature edges
75  labelHashSet featureEdge_;
76 
77  //- (demand driven) Faces after removing internal points&edges
78  mutable faceList* facesPtr_;
79 
80  //- New to old face mapping
81  mutable List<DynamicList<label> > faceMap_;
82 
83 
84  // Private Member Functions
85 
86  bool faceAlignedEdge(const label, const label) const;
87 
88  label nextEdge
89  (
90  const Map<label>& toSuperFace,
91  const label superFaceI,
92  const label thisEdgeI,
93  const label thisVertI
94  ) const;
95 
96  bool isCellFeatureEdge(const scalar, const label) const;
97 
98  void walkSuperFace
99  (
100  const label faceI,
101  const label superFaceI,
102  Map<label>& toSuperFace
103  ) const;
104 
105  void calcSuperFaces() const;
106 
107 
108  //- Disallow default bitwise copy construct
109  cellFeatures(const cellFeatures&);
110 
111  //- Disallow default bitwise assignment
112  void operator=(const cellFeatures&);
113 
114 public:
115 
116  // Constructors
117 
118  //- Construct from cell in mesh
120  (
121  const primitiveMesh&,
122  const scalar minCos, // angle to use for feature recognition.
123  const label cellI
124  );
125 
126 
127  // Destructor
128 
129  ~cellFeatures();
130 
131 
132  // Member Functions
133 
134  // Access
135 
136  const labelHashSet& featureEdge() const
137  {
138  return featureEdge_;
139  }
140 
141  const faceList& faces() const
142  {
143  if (!facesPtr_)
144  {
145  calcSuperFaces();
146  }
147  return *facesPtr_;
148  }
149 
150  //- New to old faceMap. Guaranteed to be shrunk.
152  {
153  if (!facesPtr_)
154  {
155  calcSuperFaces();
156  }
157  return faceMap_;
158  }
159 
160 
161  // Check
162 
163  //- Is edge a feature edge (uniquely determined since on cell
164  // only two faces sharing edge)
165  bool isFeatureEdge(const label edgeI) const
166  {
167  return featureEdge().found(edgeI);
168  }
169 
170  //- Are two edges connected at feature point?
171  // Is local to face since point might be seen as feature point
172  // from one face but not from another.
173  bool isFeaturePoint(const label edge0, const label edge1) const;
174 
175  //- Is vertexI on faceI used by two edges that form feature
176  // point
177  bool isFeatureVertex(const label faceI, const label vertI) const;
178 
179 };
180 
181 
182 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
183 
184 } // End namespace Foam
185 
186 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
187 
188 #endif
189 
190 // ************************ vim: set sw=4 sts=4 et: ************************ //