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 / coupledInfo.H
blobb81ea2e7bef5d6e45515663bb8578ab6bbcaee31
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     coupledInfo
27 Description
28     An interface class that provides patch coupling functionality
30 Author
31     Sandeep Menon
32     University of Massachusetts Amherst
33     All rights reserved
35 SourceFiles
36     coupledInfo.C
38 \*---------------------------------------------------------------------------*/
40 #ifndef coupledInfo_H
41 #define coupledInfo_H
43 #include "autoPtr.H"
44 #include "coupleMap.H"
45 #include "volFieldsFwd.H"
46 #include "fvPatchFieldMapper.H"
48 namespace Foam
51 // Class forward declarations
52 class fvBoundaryMesh;
54 /*---------------------------------------------------------------------------*\
55                          Class coupledInfo Declaration
56 \*---------------------------------------------------------------------------*/
58 template <class MeshType>
59 class coupledInfo
62     // Private data
64         // Reference to the parent mesh
65         const MeshType& mesh_;
67         // Auto pointer to a subMesh
68         autoPtr<MeshType> subMesh_;
70         // Flag to determine whether maps have been built.
71         bool builtMaps_;
73         // For locally coupled patches,
74         // specify a master / slave index
75         coupleMap map_;
77         // Zone IDs for patches associated with faceZones
78         label masterFaceZone_;
79         label slaveFaceZone_;
81     // Private member functions
83         // Disallow default bitwise assignment
84         inline void operator=(const coupledInfo&);
86 public:
88     //- Constructors
90         // Construct given mesh, coupleMap and master / slave indices
91         inline coupledInfo
92         (
93             const MeshType& mesh,
94             const coupleMap& cMap,
95             const label mfzIndex = -1,
96             const label sfzIndex = -1
97         );
99         // Construct from components
100         inline coupledInfo
101         (
102             const MeshType& mesh,
103             const bool isTwoDMesh,
104             const bool isLocal,
105             const bool isSend,
106             const label patchIndex,
107             const label mPatch,
108             const label sPatch,
109             const label mfzIndex = -1,
110             const label sfzIndex = -1
111         );
113     //- Access
115         // Return a const reference to the parent mesh
116         inline const MeshType& baseMesh() const;
118         // Set a new subMesh
119         inline void setMesh(label index, MeshType* mesh);
121         // Return a reference to the subMesh
122         inline MeshType& subMesh();
124         // Return a const reference to the subMesh
125         inline const MeshType& subMesh() const;
127         // Return if maps have been built
128         inline bool builtMaps() const;
130         // Set internal state of maps as built
131         inline void setBuiltMaps();
133         // Return a reference to the coupleMap
134         inline coupleMap& map();
136         // Return a const reference to the coupleMap
137         inline const coupleMap& map() const;
139         // Return the master face zone ID
140         inline label masterFaceZone() const;
142         // Return the slave face zone ID
143         inline label slaveFaceZone() const;
145     //- Interpolation
147         //- Generic subMesh mapper
148         class subMeshMapper
149         :
150             public fvPatchFieldMapper
151         {
152             label sizeBeforeMapping_;
154             labelField directAddressing_;
156         public:
158             // Constructors
160                 //- Construct from components
161                 inline subMeshMapper
162                 (
163                     const label sbm,
164                     const labelList& da
165                 )
166                 :
167                     sizeBeforeMapping_(sbm),
168                     directAddressing_(da)
169                 {}
171                 //- Construct given addressing
172                 inline subMeshMapper
173                 (
174                     const coupledInfo& cInfo,
175                     const label patchI
176                 );
178             // Destructor
180                 virtual ~subMeshMapper()
181                 {}
183             // Member Functions
185                 label size() const
186                 {
187                     return directAddressing_.size();
188                 }
190                 label sizeBeforeMapping() const
191                 {
192                     return sizeBeforeMapping_;
193                 }
195                 bool direct() const
196                 {
197                     return true;
198                 }
200                 const unallocLabelList& directAddressing() const
201                 {
202                     return directAddressing_;
203                 }
204         };
206         // Subset geometric field
207         template <class GeomField, class ZeroType>
208         tmp<GeomField>
209         subSetField
210         (
211             const GeomField& f,
212             const ZeroType& zeroValue,
213             const labelList& internalMapper
214         ) const;
216         // Subset geometric fields from registry to output stream
217         template <class GeomField, class ZeroType>
218         void send
219         (
220             const wordList& fieldNames,
221             const word& fieldType,
222             const ZeroType& zeroValue,
223             const labelList& internalMapper,
224             OSstream& strStream
225         ) const;
227         // Set geometric field pointers from input dictionary
228         template <class GeomField>
229         void setField
230         (
231             const wordList& fieldNames,
232             const dictionary& fieldDicts,
233             const label internalSize,
234             PtrList<GeomField>& fields
235         ) const;
237         // Resize map for individual field
238         template <class GeomField>
239         static void resizeMap
240         (
241             const label srcIndex,
242             const subMeshMapper& internalMapper,
243             const List<labelList>& internalReverseMaps,
244             const PtrList<subMeshMapper>& boundaryMapper,
245             const List<labelListList>& boundaryReverseMaps,
246             const List<PtrList<GeomField> >& srcFields,
247             GeomField& field
248         );
250         // Resize map for all fields in registry
251         template <class GeomField>
252         static void resizeMap
253         (
254             const wordList& fieldNames,
255             const objectRegistry& mesh,
256             const subMeshMapper& internalMapper,
257             const List<labelList>& internalReverseMaps,
258             const PtrList<subMeshMapper>& boundaryMapper,
259             const List<labelListList>& boundaryReverseMaps,
260             const List<PtrList<GeomField> >& srcFields
261         );
263         // Resize boundaryFields for all fields in the registry
264         template <class GeomField>
265         static void resizeBoundaries
266         (
267             const objectRegistry& mesh,
268             const fvBoundaryMesh& boundary
269         );
272 } // End namespace Foam
274 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
276 #ifdef NoRepository
277 #    include "coupledInfo.C"
278 #endif
280 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
282 #endif
284 // ************************************************************************* //