Merge branch 'master' of ssh://git.code.sf.net/p/foam-extend/foam-extend-3.2
[foam-extend-3.2.git] / src / finiteVolume / fvMesh / fvPatches / constraint / regionCouple / regionCoupleFvPatch.H
blob1aa2deafebed86ce97533b5d8eb8f2140463eafb
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     regionCoupleFvPatch
27 Description
28     Region couple patch coupled two mesh regions for a solution in the same
29     linear system.
31 Author
32     Hrvoje Jasak, Wikki Ltd.  All rights reserved
34 SourceFiles
35     regionCoupleFvPatch.C
37 \*---------------------------------------------------------------------------*/
39 #ifndef regionCoupleFvPatch_H
40 #define regionCoupleFvPatch_H
42 #include "coupledFvPatch.H"
43 #include "ggiLduInterface.H"
44 #include "regionCouplePolyPatch.H"
46 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
48 namespace Foam
51 class fvMesh;
53 /*---------------------------------------------------------------------------*\
54                      Class regionCoupleFvPatch Declaration
55 \*---------------------------------------------------------------------------*/
57 class regionCoupleFvPatch
59     public coupledFvPatch,
60     public ggiLduInterface
62     // Private Data
64         //- Reference to polyPatch
65         const regionCouplePolyPatch& rcPolyPatch_;
68 protected:
70     // Protected Member functions
72         //- Make patch weighting factors
73         virtual void makeWeights(scalarField&) const;
75         //- Make patch face - neighbour cell distances
76         virtual void makeDeltaCoeffs(scalarField&) const;
78         //- Make patch face non-orthogonality correction vectors
79         virtual void makeCorrVecs(vectorField&) const;
82 public:
84     //- Runtime type information
85     TypeName(regionCouplePolyPatch::typeName_());
88     // Constructors
90         //- Construct from components
91         regionCoupleFvPatch(const polyPatch& patch, const fvBoundaryMesh& bm)
92         :
93             coupledFvPatch(patch, bm),
94             rcPolyPatch_(refCast<const regionCouplePolyPatch>(patch))
95         {}
98     // Destructor
100         virtual ~regionCoupleFvPatch();
103     // Member functions
105         // Access
107             //- Return true if coupled
108             virtual bool coupled() const;
110             //- Return shadow patch
111             const fvMesh& shadowRegion() const;
113             //- Return shadow patch
114             const regionCoupleFvPatch& shadow() const;
116             //- Use bridging to fix overlap error in interpolation
117             bool bridgeOverlap() const
118             {
119                 return rcPolyPatch_.bridgeOverlap();
120             }
122             //- Return delta (P to N) vectors across coupled patch
123             virtual tmp<vectorField> delta() const;
126         // Interpolation
128             //- Interpolate face field
129             template<class Type>
130             tmp<Field<Type> > interpolate(const Field<Type>& pf) const
131             {
132                 return rcPolyPatch_.interpolate(pf);
133             }
135             template<class Type>
136             tmp<Field<Type> > interpolate(const tmp<Field<Type> >& tpf) const
137             {
138                 return rcPolyPatch_.interpolate(tpf);
139             }
141             //- Bridge interpolated face field for uncovered faces
142             template<class Type>
143             void bridge
144             (
145                 const Field<Type>& bridgeField,
146                 Field<Type>& ff
147             ) const
148             {
149                 return rcPolyPatch_.bridge(bridgeField, ff);
150             }
153         // Interface transfer functions
155             //- Is this the master side?
156             virtual bool master() const;
158             //- Is this the fine level?
159             virtual bool fineLevel() const;
161             //- Return shadow patch index
162             virtual label shadowIndex() const;
164             //- Return shadow interface
165             virtual const ggiLduInterface& shadowInterface() const;
167             //- Return zone size
168             virtual label zoneSize() const;
170             //- Return zone addressing
171             virtual const labelList& zoneAddressing() const;
173             //- Return addressing.  Master side returns own addressing and
174             //  slave side returns addressing from master
175             virtual const labelListList& addressing() const;
177             //- Is the patch localised on a single processor
178             virtual bool localParallel() const;
180             //- Return weights.  Master side returns own weights and
181             //  slave side returns weights from master
182             virtual const scalarListList& weights() const;
184             //- Return face transformation tensor
185             virtual const tensorField& forwardT() const
186             {
187                 return coupledFvPatch::forwardT();
188             }
190             //- Return neighbour-cell transformation tensor
191             virtual const tensorField& reverseT() const
192             {
193                 return coupledFvPatch::reverseT();
194             }
196             //- Return the values of the given internal data adjacent to
197             //  the interface as a field
198             virtual tmp<labelField> interfaceInternalField
199             (
200                 const unallocLabelList& internalData
201             ) const;
203             //- Initialise interface data transfer
204             virtual void initTransfer
205             (
206                 const Pstream::commsTypes commsType,
207                 const unallocLabelList& interfaceData
208             ) const;
210             //- Transfer and return neighbour field
211             virtual tmp<labelField> transfer
212             (
213                 const Pstream::commsTypes commsType,
214                 const unallocLabelList& interfaceData
215             ) const;
217             //- Initialise transfer of internal field adjacent to the interface
218             virtual void initInternalFieldTransfer
219             (
220                 const Pstream::commsTypes commsType,
221                 const unallocLabelList& iF
222             ) const;
224             //- Return neighbour field
225             virtual tmp<labelField> internalFieldTransfer
226             (
227                 const Pstream::commsTypes commsType,
228                 const unallocLabelList& internalData
229             ) const;
233 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
235 } // End namespace Foam
237 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
239 #endif
241 // ************************************************************************* //