ENH: autoLayerDriver: better layering information message
[OpenFOAM-2.0.x.git] / src / meshTools / PatchEdgeFaceWave / PatchEdgeFaceWave.H
blob1551152c13bf8563dab3d781a8ae5b3c6988bc7e
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
4    \\    /   O peration     |
5     \\  /    A nd           | Copyright (C) 2004-2010 OpenCFD Ltd.
6      \\/     M anipulation  |
7 -------------------------------------------------------------------------------
8 License
9     This file is part of OpenFOAM.
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.
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.
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/>.
24 Class
25     Foam::PatchEdgeFaceWave
27 Description
28     Wave propagation of information along patch. Every iteration
29     information goes through one layer of faces. Templated on information
30     that is transferred.
32 SourceFiles
33     PatchEdgeFaceWave.C
35 \*---------------------------------------------------------------------------*/
37 #ifndef PatchEdgeFaceWave_H
38 #define PatchEdgeFaceWave_H
40 #include "scalarField.H"
41 #include "PackedBoolList.H"
42 #include "PrimitivePatch.H"
43 #include "vectorTensorTransform.H"
45 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
47 namespace Foam
50 // Forward declaration of classes
51 class polyMesh;
53 /*---------------------------------------------------------------------------*\
54                     Class PatchEdgeFaceWaveName Declaration
55 \*---------------------------------------------------------------------------*/
57 TemplateName(PatchEdgeFaceWave);
60 /*---------------------------------------------------------------------------*\
61                            Class PatchEdgeFaceWave Declaration
62 \*---------------------------------------------------------------------------*/
64 template
66     class PrimitivePatchType,
67     class Type,
68     class TrackingData = int
70 class PatchEdgeFaceWave
72     public PatchEdgeFaceWaveName
74   // Private static data
76         //- Relative tolerance. Stop propagation if relative changes
77         //  less than this tolerance (responsability for checking this is
78         //  up to Type implementation)
79         static scalar propagationTol_;
81         //- Used as default trackdata value to satisfy default template
82         //  argument.
83         static label dummyTrackData_;
86     // Private data
88         //- Reference to mesh
89         const polyMesh& mesh_;
91         //- Reference to patch
92         const PrimitivePatchType& patch_;
94         //- Wall information for all edges
95         UList<Type>& allEdgeInfo_;
97         //- Information on all patch faces
98         UList<Type>& allFaceInfo_;
100         //- Additional data to be passed into container
101         TrackingData& td_;
103         //- Has edge changed
104         PackedBoolList changedEdge_;
106         //- List of changed edges
107         DynamicList<label> changedEdges_;
109         //- Has face changed
110         PackedBoolList changedFace_;
112         //- List of changed faces
113         DynamicList<label> changedFaces_;
115         //- Number of evaluations
116         label nEvals_;
118         //- Number of unvisited faces/edges
119         label nUnvisitedEdges_;
120         label nUnvisitedFaces_;
123         // Addressing between edges of patch_ and globalData.coupledPatch()
124         labelList patchEdges_;
125         labelList coupledEdges_;
126         PackedBoolList sameEdgeOrientation_;
129     // Private Member Functions
131         //- Updates edgeInfo with information from neighbour. Updates all
132         //  statistics.
133         bool updateEdge
134         (
135             const label edgeI,
136             const label neighbourFaceI,
137             const Type& neighbourInfo,
138             Type& edgeInfo
139         );
141         //- Updates faceInfo with information from neighbour. Updates all
142         //  statistics.
143         bool updateFace
144         (
145             const label faceI,
146             const label neighbourEdgeI,
147             const Type& neighbourInfo,
148             Type& faceInfo
149         );
151         //- Update coupled edges
152         void syncEdges();
154         //- Disallow default bitwise copy construct
155         PatchEdgeFaceWave(const PatchEdgeFaceWave&);
157         //- Disallow default bitwise assignment
158         void operator=(const PatchEdgeFaceWave&);
161 public:
163     // Static Functions
165         //- Access to tolerance
166         static scalar propagationTol()
167         {
168             return propagationTol_;
169         }
171         //- Change tolerance
172         static void setPropagationTol(const scalar tol)
173         {
174             propagationTol_ = tol;
175         }
178     // Constructors
180         //- Construct from patch, list of changed edges with the Type
181         //  for these edges. Gets work arrays to operate on, one of size
182         //  number of patch edges, the other number of patch faces.
183         //  Iterates until nothing changes or maxIter reached.
184         //  (maxIter can be 0)
185         PatchEdgeFaceWave
186         (
187             const polyMesh& mesh,
188             const PrimitivePatchType& patch,
189             const labelList& initialEdges,
190             const List<Type>& initialEdgesInfo,
191             UList<Type>& allEdgeInfo,
192             UList<Type>& allFaceInfo,
193             const label maxIter,
194             TrackingData& td = dummyTrackData_
195         );
197         //- Construct from patch. Use setEdgeInfo and iterate() to do
198         //  actual calculation
199         PatchEdgeFaceWave
200         (
201             const polyMesh& mesh,
202             const PrimitivePatchType& patch,
203             UList<Type>& allEdgeInfo,
204             UList<Type>& allFaceInfo,
205             TrackingData& td = dummyTrackData_
206         );
209     // Member Functions
211         //- Access allEdgeInfo
212         UList<Type>& allEdgeInfo() const
213         {
214             return allEdgeInfo_;
215         }
217         //- Access allFaceInfo
218         UList<Type>& allFaceInfo() const
219         {
220             return allFaceInfo_;
221         }
223         //- Additional data to be passed into container
224         const TrackingData& data() const
225         {
226             return td_;
227         }
229         //- Get number of unvisited faces, i.e. faces that were not (yet)
230         //  reached from walking across patch. This can happen from
231         //  - not enough iterations done
232         //  - a disconnected patch
233         //  - a patch without walls in it
234         label getUnsetFaces() const;
236         label getUnsetEdges() const;
238         //- Copy initial data into allEdgeInfo_
239         void setEdgeInfo
240         (
241             const labelList& changedEdges,
242             const List<Type>& changedEdgesInfo
243         );
245         //- Propagate from edge to face. Returns total number of faces
246         //  (over all processors) changed.
247         label edgeToFace();
249         //- Propagate from face to edge. Returns total number of edges
250         //  (over all processors) changed.
251         label faceToEdge();
253         //- Iterate until no changes or maxIter reached. Returns actual
254         //  number of iterations.
255         label iterate(const label maxIter);
259 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
261 //- Update operation
262 template
264     class PrimitivePatchType,
265     class Type,
266     class TrackingData = int
268 class updateOp
270     //- Additional data to be passed into container
271     const polyMesh& mesh_;
272     const PrimitivePatchType& patch_;
273     const scalar tol_;
274     TrackingData& td_;
276 public:
277     updateOp
278     (
279         const polyMesh& mesh,
280         const PrimitivePatchType& patch,
281         const scalar tol,
282         TrackingData& td
283     )
284     :
285         mesh_(mesh),
286         patch_(patch),
287         tol_(tol),
288         td_(td)
289     {}
291     void operator()(Type& x, const Type& y) const
292     {
293         if (y.valid(td_))
294         {
295             x.updateEdge(mesh_, patch_, y, true, tol_, td_);
296         }
297     }
301 //- Transform operation
302 template
304     class PrimitivePatchType,
305     class Type,
306     class TrackingData = int
308 class transformOp
310     //- Additional data to be passed into container
311     const polyMesh& mesh_;
312     const PrimitivePatchType& patch_;
313     const scalar tol_;
314     TrackingData& td_;
316 public:
317     transformOp
318     (
319         const polyMesh& mesh,
320         const PrimitivePatchType& patch,
321         const scalar tol,
322         TrackingData& td
323     )
324     :
325         mesh_(mesh),
326         patch_(patch),
327         tol_(tol),
328         td_(td)
329     {}
331     void operator()
332     (
333         const vectorTensorTransform& vt,
334         const bool forward,
335         List<Type>& fld
336     ) const
337     {
338         if (forward)
339         {
340             forAll(fld, i)
341             {
342                 fld[i].transform(mesh_, patch_, vt.R(), tol_, td_);
343             }
344         }
345         else
346         {
347             forAll(fld, i)
348             {
349                 fld[i].transform(mesh_, patch_, vt.R().T(), tol_, td_);
350             }
351         }
352     }
355 } // End namespace Foam
358 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
360 #ifdef NoRepository
361 #   include "PatchEdgeFaceWave.C"
362 #endif
364 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
366 #endif
368 // ************************************************************************* //