00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 #ifndef face_H
00040 #define face_H
00041
00042 #include <OpenFOAM/pointField.H>
00043 #include <OpenFOAM/labelList.H>
00044 #include <OpenFOAM/edgeList.H>
00045 #include <OpenFOAM/vectorField.H>
00046 #include "faceListFwd.H"
00047 #include <OpenFOAM/intersection.H>
00048 #include <OpenFOAM/pointHit.H>
00049
00050
00051
00052 namespace Foam
00053 {
00054
00055
00056
00057 class face;
00058 class triFace;
00059
00060 template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
00061 class DynamicList;
00062
00063 inline bool operator==(const face& a, const face& b);
00064 inline bool operator!=(const face& a, const face& b);
00065 inline Istream& operator>>(Istream&, face&);
00066
00067
00068
00069
00070
00071 class face
00072 :
00073 public labelList
00074 {
00075
00076
00077
00078 inline label right(const label i) const;
00079
00080
00081 inline label left(const label i) const;
00082
00083
00084 tmp<vectorField> calcEdges
00085 (
00086 const pointField& points
00087 ) const;
00088
00089
00090 scalar edgeCos
00091 (
00092 const vectorField& edges,
00093 const label index
00094 ) const;
00095
00096
00097 label mostConcaveAngle
00098 (
00099 const pointField& points,
00100 const vectorField& edges,
00101 scalar& edgeCos
00102 ) const;
00103
00104
00105 enum splitMode
00106 {
00107 COUNTTRIANGLE,
00108 COUNTQUAD,
00109 SPLITTRIANGLE,
00110 SPLITQUAD
00111 };
00112
00113
00114
00115
00116 label split
00117 (
00118 const splitMode mode,
00119 const pointField& points,
00120 label& triI,
00121 label& quadI,
00122 faceList& triFaces,
00123 faceList& quadFaces
00124 ) const;
00125
00126
00127 public:
00128
00129
00130
00131 static const char* const typeName;
00132
00133
00134
00135
00136
00137 inline face();
00138
00139
00140 explicit inline face(label);
00141
00142
00143 explicit inline face(const UList<label>&);
00144
00145
00146 explicit inline face(const labelList&);
00147
00148
00149 explicit inline face(const Xfer<labelList>&);
00150
00151
00152 face(const triFace&);
00153
00154
00155 inline face(Istream&);
00156
00157
00158
00159
00160
00161
00162 label collapse();
00163
00164
00165 inline pointField points(const pointField& meshPoints) const;
00166
00167
00168 point centre(const pointField&) const;
00169
00170
00171 template<class Type>
00172 Type average(const pointField&, const Field<Type>&) const;
00173
00174
00175 inline scalar mag(const pointField&) const;
00176
00177
00178 vector normal(const pointField&) const;
00179
00180
00181 face reverseFace() const;
00182
00183
00184
00185
00186 label which(const label globalIndex) const;
00187
00188
00189 inline label nextLabel(const label i) const;
00190
00191
00192 inline label prevLabel(const label i) const;
00193
00194
00195
00196 scalar sweptVol
00197 (
00198 const pointField& oldPoints,
00199 const pointField& newPoints
00200 ) const;
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214 pointHit ray
00215 (
00216 const point& p,
00217 const vector& n,
00218 const pointField& meshPoints,
00219 const intersection::algorithm alg = intersection::FULL_RAY,
00220 const intersection::direction dir = intersection::VECTOR
00221 ) const;
00222
00223
00224
00225
00226 pointHit intersection
00227 (
00228 const point& p,
00229 const vector& q,
00230 const point& ctr,
00231 const pointField& meshPoints,
00232 const intersection::algorithm alg,
00233 const scalar tol = 0.0
00234 ) const;
00235
00236
00237 pointHit nearestPoint
00238 (
00239 const point& p,
00240 const pointField& meshPoints
00241 ) const;
00242
00243
00244 scalar contactSphereDiameter
00245 (
00246 const point& p,
00247 const vector& n,
00248 const pointField& meshPoints
00249 ) const;
00250
00251
00252 scalar areaInContact
00253 (
00254 const pointField& points,
00255 const scalarField& v
00256 ) const;
00257
00258
00259 inline label nEdges() const;
00260
00261
00262
00263 edgeList edges() const;
00264
00265
00266 inline edge faceEdge(const label n) const;
00267
00268
00269
00270
00271
00272 int edgeDirection(const edge&) const;
00273
00274
00275
00276
00277 inline label nTriangles() const;
00278
00279
00280 label nTriangles(const pointField& points) const;
00281
00282
00283
00284
00285
00286 label triangles
00287 (
00288 const pointField& points,
00289 label& triI,
00290 faceList& triFaces
00291 ) const;
00292
00293
00294
00295
00296 template<unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
00297 label triangles
00298 (
00299 const pointField& points,
00300 DynamicList<face, SizeInc, SizeMult, SizeDiv>& triFaces
00301 ) const;
00302
00303
00304
00305 label nTrianglesQuads
00306 (
00307 const pointField& points,
00308 label& nTris,
00309 label& nQuads
00310 ) const;
00311
00312
00313
00314
00315
00316 label trianglesQuads
00317 (
00318 const pointField& points,
00319 label& triI,
00320 label& quadI,
00321 faceList& triFaces,
00322 faceList& quadFaces
00323 ) const;
00324
00325
00326
00327
00328
00329 static int compare(const face&, const face&);
00330
00331
00332
00333
00334 friend bool operator==(const face& a, const face& b);
00335 friend bool operator!=(const face& a, const face& b);
00336
00337
00338
00339
00340 friend Istream& operator>>(Istream&, face&);
00341 };
00342
00343
00344
00345
00346 }
00347
00348
00349
00350 #include "faceI.H"
00351
00352 #ifdef NoRepository
00353 # include "faceTemplates.C"
00354 #endif
00355
00356
00357
00358 #endif
00359
00360