BUG: hierarchGeomDecomp, slidingInterface: mixing label and scalar
[OpenFOAM-1.7.x.git] / src / OpenFOAM / interpolations / patchToPatchInterpolation / PatchToPatchInterpolate.C
blob3d7b40c13804701a041973692e43ed8bc681fc41
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
4    \\    /   O peration     |
5     \\  /    A nd           | Copyright (C) 1991-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 Description
25     Patch to patch interpolation functions
27 \*---------------------------------------------------------------------------*/
29 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
31 namespace Foam
34 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
36 //- Interpolate point field
37 template<class FromPatch, class ToPatch>
38 template<class Type>
39 tmp<Field<Type> >
40 PatchToPatchInterpolation<FromPatch, ToPatch>::pointInterpolate
42     const Field<Type>& pf
43 ) const
45     if (pf.size() != fromPatch_.nPoints())
46     {
47         FatalErrorIn
48         (
49             "PatchToPatchInterpolation::pointInterpolate"
50             "(const Field<Type> pf)"
51         )   << "given field does not correspond to patch. Patch size: "
52             << fromPatch_.nPoints() << " field size: " << pf.size()
53             << abort(FatalError);
54     }
56     tmp<Field<Type> > tresult
57     (
58         new Field<Type>
59         (
60             toPatch_.nPoints(),
61             pTraits<Type>::zero
62         )
63     );
65     Field<Type>& result = tresult();
67     const List<typename FromPatch::FaceType>& fromPatchLocalFaces =
68         fromPatch_.localFaces();
70     const FieldField<Field, scalar>& weights = pointWeights();
72     const labelList& addr = pointAddr();
74     forAll (result, pointI)
75     {
76         const scalarField& curWeights = weights[pointI];
78         if (addr[pointI] > -1)
79         {
80             const labelList& hitFacePoints =
81                 fromPatchLocalFaces[addr[pointI]];
83             forAll (curWeights, wI)
84             {
85                 result[pointI] += curWeights[wI]*pf[hitFacePoints[wI]];
86             }
87         }
88     }
90     return tresult;
94 template<class FromPatch, class ToPatch>
95 template<class Type>
96 tmp<Field<Type> >
97 PatchToPatchInterpolation<FromPatch, ToPatch>::pointInterpolate
99     const tmp<Field<Type> >& tpf
100 ) const
102     tmp<Field<Type> > tint = pointInterpolate<Type>(tpf());
103     tpf.clear();
104     return tint;
108 //- Interpolate face field
109 template<class FromPatch, class ToPatch>
110 template<class Type>
111 tmp<Field<Type> >
112 PatchToPatchInterpolation<FromPatch, ToPatch>::faceInterpolate
114     const Field<Type>& ff
115 ) const
117     if (ff.size() != fromPatch_.size())
118     {
119         FatalErrorIn
120         (
121             "PatchToPatchInterpolation::faceInterpolate"
122             "(const Field<Type> ff)"
123         )   << "given field does not correspond to patch. Patch size: "
124             << fromPatch_.size() << " field size: " << ff.size()
125             << abort(FatalError);
126     }
128     tmp<Field<Type> > tresult
129     (
130         new Field<Type>
131         (
132             toPatch_.size(),
133             pTraits<Type>::zero
134         )
135     );
137     Field<Type>& result = tresult();
139     const labelListList& fromPatchFaceFaces = fromPatch_.faceFaces();
141     const FieldField<Field, scalar>& weights = faceWeights();
143     const labelList& addr = faceAddr();
145     forAll (result, faceI)
146     {
147         const scalarField& curWeights = weights[faceI];
149         if (addr[faceI] > -1)
150         {
151             const labelList& hitFaceFaces =
152                 fromPatchFaceFaces[addr[faceI]];
154             // first add the hit face
155             result[faceI] += ff[addr[faceI]]*curWeights[0];
157             for (label wI = 1; wI < curWeights.size(); wI++)
158             {
159                 result[faceI] += ff[hitFaceFaces[wI - 1]]*curWeights[wI];
160             }
161         }
162     }
164     return tresult;
168 template<class FromPatch, class ToPatch>
169 template<class Type>
170 tmp<Field<Type> >
171 PatchToPatchInterpolation<FromPatch, ToPatch>::faceInterpolate
173     const tmp<Field<Type> >& tff
174 ) const
176     tmp<Field<Type> > tint = faceInterpolate(tff());
177     tff.clear();
178     return tint;
182 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
184 } // End namespace Foam
186 // ************************************************************************* //