BUGFIX: Illegal use of uninitialised value (backport)
[foam-extend-3.2.git] / src / dynamicMesh / dynamicFvMesh / dynamicTopoFvMesh / coupleMap.H
blobbdb35616593dff3e3bf0880912a193821cd9cd41
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
4    \\    /   O peration     |
5     \\  /    A nd           | Copyright held by original author
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 the
13     Free Software Foundation; either version 2 of the License, or (at your
14     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, write to the Free Software Foundation,
23     Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
25 Class
26     coupleMap
28 Description
29     Coupled patch information with registry support.
31 Author
32     Sandeep Menon
33     University of Massachusetts Amherst
34     All rights reserved
36 SourceFiles
37     coupleMapI.H
38     coupleMap.C
40 \*---------------------------------------------------------------------------*/
42 #ifndef coupleMap_H
43 #define coupleMap_H
45 #include "regIOobject.H"
46 #include "labelList.H"
47 #include "pointField.H"
48 #include "fieldTypes.H"
49 #include "edgeList.H"
50 #include "faceList.H"
51 #include "cellList.H"
52 #include "labelPair.H"
53 #include "Map.H"
55 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
57 namespace Foam
60 /*---------------------------------------------------------------------------*\
61                            Class coupleMap Declaration
62 \*---------------------------------------------------------------------------*/
64 class coupleMap
66     public regIOobject
69 public:
71     // Public data types
73         //- Enumerants for entity-types
74         enum entityType
75         {
76             // Buffers and sizes
77             POINT = 0,
78             EDGE = 1,
79             FACE = 2,
80             // Sizes only
81             CELL = 3,
82             INTERNAL_EDGE = 4,
83             INTERNAL_FACE = 5,
84             SHARED_POINT = 6,
85             GLOBAL_POINT = 7,
86             NFE_SIZE = 8,
87             NBDY = 9,
88             // Buffers only
89             OWNER = 3,
90             NEIGHBOUR = 4,
91             FACE_EDGE = 5,
92             NFE_BUFFER = 6,
93             FACE_STARTS = 7,
94             FACE_SIZES = 8,
95             EDGE_STARTS = 9,
96             EDGE_SIZES = 10,
97             PATCH_ID = 11
98         };
100         //- Enumerants for operations
101         enum opType
102         {
103             BISECTION = 0,
104             COLLAPSE_FIRST = 1,
105             COLLAPSE_SECOND = 2,
106             COLLAPSE_MIDPOINT = 3,
107             REMOVE_CELL = 4,
108             MOVE_POINT = 5,
109             CONVERT_PATCH = 6,
110             INVALID
111         };
113 private:
115     // Private data
117         mutable bool twoDMesh_;
119         // Flags for coupled entities
120         mutable bool isLocal_;
121         mutable bool isSend_;
123         // Patch index for coupled entities
124         mutable label patchIndex_;
126         // Master / slave indices
127         mutable label masterIndex_;
128         mutable label slaveIndex_;
130         // Point buffers
131         mutable pointField pointBuffer_;
132         mutable pointField oldPointBuffer_;
134         // List of points that are required
135         // during patch sub-mesh creation
136         mutable labelList subMeshPoints_;
137         mutable List<labelPair> globalProcPoints_;
139         // Entity sizes (as specified by the entityType enumerant)
140         mutable FixedList<label,10> nEntities_;
142         // Maps for entities
143         mutable FixedList<Map<label>,4> entityMap_;
144         mutable FixedList<Map<label>,4> reverseEntityMap_;
146         // Entity Buffers (as specified by the entityType enumerant)
147         mutable FixedList<labelList,12> entityBuffer_;
149         // List of entity indices with topological operations
150         mutable labelList entityIndices_;
152         // List of operations performed on entities
153         mutable List<opType> entityOperations_;
155         // List of point-locations to move points to
156         mutable pointField moveNewPoints_;
157         mutable pointField moveOldPoints_;
159         // Addressing for field mapping
160         mutable labelList faceMap_;
161         mutable labelList cellMap_;
163         //- Demand-driven connectivity data.
164         mutable edgeList* edgesPtr_;
165         mutable faceList* facesPtr_;
166         mutable labelListList* faceEdgesPtr_;
168         void makeEdges() const;
169         void makeFaces() const;
171         void makeFaceMap() const;
172         void makeCellMap() const;
174         void clearAddressing() const;
176         //- Disallow default bitwise assignment
177         void operator=(const coupleMap&);
179 public:
181     // Static data members
183         //- The set of names corresponding to the operationType enumeration
184         //  Includes an extra entry for "invalid".
185         static const char* names[INVALID + 1];
187         //- Runtime type information
188         TypeName("coupleMap");
190     // Static Member Functions
192         //- Return a text representation of an opType
193         static const char* asText(const opType);
195     // Constructors
197         //- Construct from components
198         coupleMap
199         (
200             const IOobject& io,
201             const bool twoDMesh,
202             const bool isLocal,
203             const bool isSend,
204             const label patchIndex,
205             const label masterIndex,
206             const label slaveIndex
207         );
209         //- Construct as copy
210         coupleMap(const coupleMap&);
212     // Destructor
214         virtual ~coupleMap();
216     //- Interpolation functions
218         //- Interpolate point field
219         template<class Type>
220         tmp<Field<Type> > pointInterpolate
221         (
222             const Map<label>& mPointMap,
223             const Map<label>& sPointMap,
224             const Field<Type>& pf,
225             bool reverse = false
226         ) const;
228         template<class Type>
229         tmp<Field<Type> > pointInterpolate
230         (
231             const Map<label>& mPointMap,
232             const Map<label>& sPointMap,
233             const tmp<Field<Type> >& tpf,
234             bool reverse = false
235         ) const;
237         //- Interpolate face field
238         template<class Type>
239         tmp<Field<Type> > faceInterpolate
240         (
241             const label mStart,
242             const label sStart,
243             const Field<Type>& pf,
244             bool reverse = false
245         ) const;
247         template<class Type>
248         tmp<Field<Type> > faceInterpolate
249         (
250             const label mStart,
251             const label sStart,
252             const tmp<Field<Type> >& tpf,
253             bool reverse = false
254         ) const;
256     //- Access
258         inline label& patchIndex() const;
260         inline label masterIndex() const;
261         inline label slaveIndex() const;
263         inline bool isTwoDMesh() const;
264         inline bool isLocal() const;
265         inline bool isProcessor() const;
266         inline bool isSend() const;
267         inline bool isRecv() const;
269         pointField& pointBuffer() const;
270         pointField& oldPointBuffer() const;
272         labelList& subMeshPoints() const;
273         List<labelPair>& globalProcPoints() const;
275         void allocateBuffers() const;
277         label findSlave
278         (
279             const label eType,
280             const label Index
281         ) const;
283         label findMaster
284         (
285             const label eType,
286             const label Index
287         ) const;
289         void removeSlave
290         (
291             const label eType,
292             const label Index
293         ) const;
295         void removeMaster
296         (
297             const label eType,
298             const label Index
299         ) const;
301         void mapSlave
302         (
303             const label eType,
304             const label master,
305             const label slave
306         ) const;
308         void mapMaster
309         (
310             const label eType,
311             const label slave,
312             const label master
313         ) const;
315         inline FixedList<label,10>& nEntities() const;
316         inline label& nEntities(const label eType) const;
318         inline Map<label>& entityMap(const label eType) const;
319         inline Map<label>& reverseEntityMap(const label eType) const;
321         inline FixedList<labelList,12>& entityBuffer() const;
322         inline labelList& entityBuffer(const label eType) const;
324         inline labelList& entityIndices() const;
325         inline List<opType>& entityOperations() const;
327         inline pointField& moveNewPoints() const;
328         inline pointField& moveOldPoints() const;
330         void pushOperation
331         (
332             const label index,
333             const opType oType,
334             const point& newPoint = vector::zero,
335             const point& oldPoint = vector::zero
336         ) const;
338         //- Demand-driven data
339         label nInternalFaces() const;
340         const labelList& owner() const;
341         const labelList& neighbour() const;
342         const edgeList& edges() const;
343         const faceList& faces() const;
344         const labelListList& faceEdges() const;
346         const labelList& faceMap() const;
347         const labelList& cellMap() const;
349         void transferMaps
350         (
351             const label eType,
352             Map<label>& newEntityMap,
353             Map<label>& newReverseEntityMap
354         ) const;
356         void clearMaps() const;
358         void clearBuffers() const;
360         bool readData(Istream&);
362         bool writeData(Ostream&) const;
365 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
367 } // End namespace Foam
369 #include "coupleMapI.H"
371 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
373 #endif
375 // ************************************************************************* //