Merge branch 'master' of ssh://git.code.sf.net/p/foam-extend/foam-extend-3.2
[foam-extend-3.2.git] / src / dynamicMesh / dynamicTopoFvMesh / coupledMesh / coupleMap.H
blobd5342361e108f92d3d4a8b5aa099720993ab7791
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | foam-extend: Open Source CFD
4    \\    /   O peration     | Version:     3.2
5     \\  /    A nd           | Web:         http://www.foam-extend.org
6      \\/     M anipulation  | For copyright notice see file Copyright
7 -------------------------------------------------------------------------------
8 License
9     This file is part of foam-extend.
11     foam-extend 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 3 of the License, or (at your
14     option) any later version.
16     foam-extend is distributed in the hope that it will be useful, but
17     WITHOUT ANY WARRANTY; without even the implied warranty of
18     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19     General Public License for more details.
21     You should have received a copy of the GNU General Public License
22     along with foam-extend.  If not, see <http://www.gnu.org/licenses/>.
24 Class
25     coupleMap
27 Description
28     Coupled patch information with registry support.
30 Author
31     Sandeep Menon
32     University of Massachusetts Amherst
33     All rights reserved
35 SourceFiles
36     coupleMapI.H
37     coupleMap.C
39 \*---------------------------------------------------------------------------*/
41 #ifndef coupleMap_H
42 #define coupleMap_H
44 #include "regIOobject.H"
45 #include "labelList.H"
46 #include "pointField.H"
47 #include "fieldTypes.H"
48 #include "edgeList.H"
49 #include "faceList.H"
50 #include "cellList.H"
51 #include "labelPair.H"
52 #include "Map.H"
54 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
56 namespace Foam
59 /*---------------------------------------------------------------------------*\
60                            Class coupleMap Declaration
61 \*---------------------------------------------------------------------------*/
63 class coupleMap
65     public regIOobject
68 public:
70     // Public data types
72         //- Enumerants for entity-types
73         enum entityType
74         {
75             // Buffers and sizes
76             POINT         = 0,
77             EDGE          = 1,
78             FACE          = 2,
79             // Sizes only
80             CELL          = 3,
81             MAX_ENTITIES  = 4,
82             INTERNAL_EDGE = 4,
83             INTERNAL_FACE = 5,
84             SHARED_POINT  = 6,
85             GLOBAL_POINT  = 7,
86             NFE_SIZE      = 8,
87             NBDY          = 9,
88             MAX_SIZES     = 10,
89             // Buffers only
90             OWNER         = 3,
91             NEIGHBOUR     = 4,
92             FACE_EDGE     = 5,
93             NFE_BUFFER    = 6,
94             FACE_STARTS   = 7,
95             FACE_SIZES    = 8,
96             EDGE_STARTS   = 9,
97             EDGE_SIZES    = 10,
98             PATCH_ID      = 11,
99             MAX_BUFFERS   = 12
100         };
102         //- Enumerants for operations
103         enum opType
104         {
105             BISECTION         = 0,
106             COLLAPSE_FIRST    = 1,
107             COLLAPSE_SECOND   = 2,
108             COLLAPSE_MIDPOINT = 3,
109             REMOVE_CELL       = 4,
110             MOVE_POINT        = 5,
111             CONVERT_PATCH     = 6,
112             CONVERT_PHYSICAL  = 7,
113             INVALID
114         };
116         //- Public typedefs
117         typedef FixedList<label, MAX_SIZES> EntitySizeList;
118         typedef FixedList<Map<label>, MAX_ENTITIES> EntityMapList;
119         typedef FixedList<labelList, MAX_BUFFERS> EntityBufferList;
121 private:
123     // Private data
125         mutable bool twoDMesh_;
127         // Flags for coupled entities
128         mutable bool isLocal_;
129         mutable bool isSend_;
131         // Patch index for coupled entities
132         mutable label patchIndex_;
134         // Master / slave indices
135         mutable label masterIndex_;
136         mutable label slaveIndex_;
138         // Point buffers
139         mutable pointField pointBuffer_;
140         mutable pointField oldPointBuffer_;
142         // List of points that are required
143         // during patch sub-mesh creation
144         mutable labelList subMeshPoints_;
145         mutable List<labelPair> globalProcPoints_;
147         // Entity sizes (as specified by the entityType enumerant)
148         mutable EntitySizeList nEntities_;
150         // Maps for entities
151         mutable EntityMapList entityMap_;
152         mutable EntityMapList reverseEntityMap_;
154         // Entity Buffers (as specified by the entityType enumerant)
155         mutable EntityBufferList entityBuffer_;
157         // List of entity indices with topological operations
158         mutable labelList entityIndices_;
160         // List of operations performed on entities
161         mutable List<opType> entityOperations_;
163         // Physical patch conversion indices
164         mutable labelList patchIndices_;
166         // List of point-locations to move points to
167         mutable pointField moveNewPoints_;
168         mutable pointField moveOldPoints_;
170         // Addressing for field mapping
171         mutable labelList faceMap_;
172         mutable labelList cellMap_;
173         mutable labelList internalFaceMap_;
175         // Processor point and edge mapping
176         mutable Map<labelList> subMeshPointMap_;
177         mutable Map<labelList> subMeshEdgeMap_;
179         //- Demand-driven connectivity data.
180         mutable edgeList* edgesPtr_;
181         mutable faceList* facesPtr_;
182         mutable labelListList* faceEdgesPtr_;
184     // Private Member Functions
186         void makeEdges() const;
187         void makeFaces() const;
189         void makeFaceMap() const;
190         void makeCellMap() const;
191         void makeInternalFaceMap() const;
193         void clearAddressing() const;
195         //- Disallow default bitwise assignment
196         void operator=(const coupleMap&);
198 public:
200     // Static data members
202         //- The set of names corresponding to the operationType enumeration
203         //  Includes an extra entry for "invalid".
204         static const char* names[INVALID + 1];
206         //- Runtime type information
207         TypeName("coupleMap");
209     // Static Member Functions
211         //- Return a text representation of an opType
212         static const char* asText(const opType);
214     // Constructors
216         //- Construct from components
217         coupleMap
218         (
219             const IOobject& io,
220             const bool twoDMesh,
221             const bool isLocal,
222             const bool isSend,
223             const label patchIndex,
224             const label masterIndex,
225             const label slaveIndex
226         );
228         //- Construct as copy
229         coupleMap(const coupleMap&);
231     // Destructor
233         virtual ~coupleMap();
235     //- Interpolation functions
237         //- Interpolate point field
238         template<class Type>
239         tmp<Field<Type> > pointInterpolate
240         (
241             const Map<label>& mPointMap,
242             const Map<label>& sPointMap,
243             const Field<Type>& pf,
244             bool reverse = false
245         ) const;
247         template<class Type>
248         tmp<Field<Type> > pointInterpolate
249         (
250             const Map<label>& mPointMap,
251             const Map<label>& sPointMap,
252             const tmp<Field<Type> >& tpf,
253             bool reverse = false
254         ) const;
256         //- Interpolate face field
257         template<class Type>
258         tmp<Field<Type> > faceInterpolate
259         (
260             const label mStart,
261             const label sStart,
262             const Field<Type>& pf,
263             bool reverse = false
264         ) const;
266         template<class Type>
267         tmp<Field<Type> > faceInterpolate
268         (
269             const label mStart,
270             const label sStart,
271             const tmp<Field<Type> >& tpf,
272             bool reverse = false
273         ) const;
275     //- Access
277         inline label& patchIndex() const;
279         inline label masterIndex() const;
280         inline label slaveIndex() const;
282         inline bool isTwoDMesh() const;
283         inline bool isLocal() const;
284         inline bool isProcessor() const;
285         inline bool isSend() const;
286         inline bool isRecv() const;
288         pointField& pointBuffer() const;
289         pointField& oldPointBuffer() const;
291         labelList& subMeshPoints() const;
292         List<labelPair>& globalProcPoints() const;
294         void allocateBuffers() const;
296         label findSlave
297         (
298             const label eType,
299             const label Index
300         ) const;
302         label findMaster
303         (
304             const label eType,
305             const label Index
306         ) const;
308         void removeSlave
309         (
310             const label eType,
311             const label Index
312         ) const;
314         void removeMaster
315         (
316             const label eType,
317             const label Index
318         ) const;
320         void mapSlave
321         (
322             const label eType,
323             const label master,
324             const label slave
325         ) const;
327         void mapMaster
328         (
329             const label eType,
330             const label slave,
331             const label master
332         ) const;
334         inline EntitySizeList& nEntities() const;
335         inline label& nEntities(const label eType) const;
337         inline Map<label>& entityMap(const label eType) const;
338         inline Map<label>& reverseEntityMap(const label eType) const;
340         inline EntityBufferList& entityBuffer() const;
341         inline labelList& entityBuffer(const label eType) const;
343         inline labelList& entityIndices() const;
344         inline List<opType>& entityOperations() const;
346         inline labelList& patchIndices() const;
347         inline pointField& moveNewPoints() const;
348         inline pointField& moveOldPoints() const;
350         inline Map<labelList>& subMeshPointMap() const;
351         inline Map<labelList>& subMeshEdgeMap() const;
353         void pushOperation
354         (
355             const label index,
356             const opType oType
357         ) const;
359         void pushOperation
360         (
361             const label index,
362             const opType oType,
363             const label pIndex
364         ) const;
366         void pushOperation
367         (
368             const label index,
369             const opType oType,
370             const point& newPoint,
371             const point& oldPoint
372         ) const;
374         //- Demand-driven data
375         label nInternalFaces() const;
376         const labelList& owner() const;
377         const labelList& neighbour() const;
378         const edgeList& edges() const;
379         const faceList& faces() const;
380         const labelListList& faceEdges() const;
382         const labelList& faceMap() const;
383         const labelList& cellMap() const;
384         const labelList& internalFaceMap() const;
386         void transferMaps
387         (
388             const label eType,
389             Map<label>& newEntityMap,
390             Map<label>& newReverseEntityMap
391         ) const;
393         void clearMaps() const;
395         void clearBuffers() const;
397         bool readData(Istream&);
399         bool writeData(Ostream&) const;
402 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
404 } // End namespace Foam
406 #include "coupleMapI.H"
408 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
410 #endif
412 // ************************************************************************* //