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
00040
00041
00042
00043
00044
00045
00046
00047 #ifndef FaceCellWave_H
00048 #define FaceCellWave_H
00049
00050 #include <OpenFOAM/boolList.H>
00051 #include <OpenFOAM/labelList.H>
00052 #include <OpenFOAM/primitiveFieldsFwd.H>
00053
00054
00055
00056 namespace Foam
00057 {
00058
00059
00060 class polyMesh;
00061 class polyPatch;
00062
00063
00064
00065
00066
00067 TemplateName(FaceCellWave);
00068
00069
00070
00071
00072
00073
00074 template <class Type>
00075 class FaceCellWave
00076 :
00077 public FaceCellWaveName
00078 {
00079
00080
00081
00082 const polyMesh& mesh_;
00083
00084
00085 UList<Type>& allFaceInfo_;
00086
00087
00088 UList<Type>& allCellInfo_;
00089
00090
00091 boolList changedFace_;
00092
00093
00094 labelList changedFaces_;
00095
00096
00097 label nChangedFaces_;
00098
00099
00100 boolList changedCell_;
00101 labelList changedCells_;
00102 label nChangedCells_;
00103
00104
00105 bool hasCyclicPatches_;
00106
00107
00108 label nEvals_;
00109
00110
00111 label nUnvisitedCells_;
00112 label nUnvisitedFaces_;
00113
00114
00115 label iter_;
00116
00117
00118
00119
00120
00121 static Ostream& writeFaces
00122 (
00123 const label nFaces,
00124 const labelList& faceLabels,
00125 const List<Type>& faceInfo,
00126 Ostream& os
00127 );
00128
00129
00130 static Istream& readFaces
00131 (
00132 label& nFaces,
00133 labelList& faceLabels,
00134 List<Type>& faceInfo,
00135 Istream& is
00136 );
00137
00138
00139
00140
00141
00142 FaceCellWave(const FaceCellWave&);
00143
00144
00145 void operator=(const FaceCellWave&);
00146
00147
00148
00149
00150 bool updateCell
00151 (
00152 const label cellI,
00153 const label neighbourFaceI,
00154 const Type& neighbourInfo,
00155 const scalar tol,
00156 Type& cellInfo
00157 );
00158
00159
00160
00161 bool updateFace
00162 (
00163 const label faceI,
00164 const label neighbourCellI,
00165 const Type& neighbourInfo,
00166 const scalar tol,
00167 Type& faceInfo
00168 );
00169
00170
00171
00172 bool updateFace
00173 (
00174 const label faceI,
00175 const Type& neighbourInfo,
00176 const scalar tol,
00177 Type& faceInfo
00178 );
00179
00180
00181
00182
00183
00184 void checkCyclic(const polyPatch& pPatch) const;
00185
00186
00187 bool hasCyclicPatch() const;
00188
00189
00190 void mergeFaceInfo
00191 (
00192 const polyPatch& patch,
00193 const label nFaces,
00194 const labelList&,
00195 const List<Type>&,
00196 const bool isParallel
00197 );
00198
00199
00200 label getChangedPatchFaces
00201 (
00202 const polyPatch& patch,
00203 const label startFaceI,
00204 const label nFaces,
00205 labelList& changedPatchFaces,
00206 List<Type>& changedPatchFacesInfo
00207 ) const;
00208
00209
00210 void leaveDomain
00211 (
00212 const polyPatch& patch,
00213 const label nFaces,
00214 const labelList& faceLabels,
00215 List<Type>& faceInfo
00216 ) const;
00217
00218
00219 void enterDomain
00220 (
00221 const polyPatch& patch,
00222 const label nFaces,
00223 const labelList& faceLabels,
00224 List<Type>& faceInfo
00225 ) const;
00226
00227
00228 void sendPatchInfo
00229 (
00230 const label neighbour,
00231 const label nFaces,
00232 const labelList&,
00233 const List<Type>&
00234 ) const;
00235
00236
00237 label receivePatchInfo
00238 (
00239 const label neighbour,
00240 labelList&,
00241 List<Type>&
00242 ) const;
00243
00244
00245 static void offset
00246 (
00247 const polyPatch& patch,
00248 const label off,
00249 const label nFaces,
00250 labelList& faces
00251 );
00252
00253
00254 void transform
00255 (
00256 const tensorField& rotTensor,
00257 const label nFaces,
00258 List<Type>& faceInfo
00259 );
00260
00261
00262 void handleProcPatches();
00263
00264
00265 void handleCyclicPatches();
00266
00267
00268
00269
00270 static const scalar geomTol_;
00271 static scalar propagationTol_;
00272
00273 public:
00274
00275
00276
00277
00278 static scalar propagationTol()
00279 {
00280 return propagationTol_;
00281 }
00282
00283
00284 static void setPropagationTol(const scalar tol)
00285 {
00286 propagationTol_ = tol;
00287 }
00288
00289
00290
00291
00292
00293
00294 FaceCellWave
00295 (
00296 const polyMesh&,
00297 UList<Type>& allFaceInfo,
00298 UList<Type>& allCellInfo
00299 );
00300
00301
00302
00303
00304 FaceCellWave
00305 (
00306 const polyMesh&,
00307 const labelList& initialChangedFaces,
00308 const List<Type>& changedFacesInfo,
00309 UList<Type>& allFaceInfo,
00310 UList<Type>& allCellInfo,
00311 const label maxIter
00312 );
00313
00314
00315
00316
00317
00318
00319
00320 UList<Type>& allFaceInfo()
00321 {
00322 return allFaceInfo_;
00323 }
00324
00325
00326 UList<Type>& allCellInfo()
00327 {
00328 return allCellInfo_;
00329 }
00330
00331
00332 const polyMesh& mesh() const
00333 {
00334 return mesh_;
00335 }
00336
00337
00338
00339
00340
00341
00342 label getUnsetCells() const;
00343
00344
00345 label getUnsetFaces() const;
00346
00347
00348
00349
00350
00351 void setFaceInfo
00352 (
00353 const labelList& changedFaces,
00354 const List<Type>& changedFacesInfo
00355 );
00356
00357
00358
00359 label faceToCell();
00360
00361
00362
00363
00364 label cellToFace();
00365
00366
00367
00368 label iterate(const label maxIter);
00369
00370 };
00371
00372
00373
00374
00375 }
00376
00377
00378
00379
00380 #ifdef NoRepository
00381 # include <OpenFOAM/FaceCellWave.C>
00382 #endif
00383
00384
00385
00386 #endif
00387
00388