Report patch name instead of index in debug
[foam-extend-3.2.git] / src / foam / interpolations / patchToPatchInterpolation / PatchToPatchInterpolate.C
blob686b5ac70186ec71524d2b0c2141167aa08f1dd6
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 Description
25     Patch to patch interpolation functions
27 Author
28     Hrvoje Jasak, Wikki Ltd.  All rights reserved
30 \*---------------------------------------------------------------------------*/
32 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
34 namespace Foam
37 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
39 //- Interpolate point field
40 template<class FromPatch, class ToPatch>
41 template<class Type>
42 tmp<Field<Type> >
43 PatchToPatchInterpolation<FromPatch, ToPatch>::pointInterpolate
45     const Field<Type>& pf
46 ) const
48     if (pf.size() != fromPatch_.nPoints())
49     {
50         FatalErrorIn
51         (
52             "PatchToPatchInterpolation::pointInterpolate"
53             "(const Field<Type> pf)"
54         )   << "given field does not correspond to patch. Patch size: "
55             << fromPatch_.nPoints() << " field size: " << pf.size()
56             << abort(FatalError);
57     }
59     tmp<Field<Type> > tresult
60     (
61         new Field<Type>
62         (
63             toPatch_.nPoints(),
64             pTraits<Type>::zero
65         )
66     );
68     // Escape the interpolation if there are no faces in the target patch
69     if (toPatch_.nPoints() == 0)
70     {
71         return tresult;
72     }
74     Field<Type>& result = tresult();
76     const List<typename FromPatch::FaceType>& fromPatchLocalFaces =
77         fromPatch_.localFaces();
79     const FieldField<Field, scalar>& weights = pointWeights();
81     const labelList& addr = pointAddr();
83     forAll (result, pointI)
84     {
85         const scalarField& curWeights = weights[pointI];
87         if (addr[pointI] > -1)
88         {
89             const labelList& hitFacePoints =
90                 fromPatchLocalFaces[addr[pointI]];
92             forAll (curWeights, wI)
93             {
94                 result[pointI] += curWeights[wI]*pf[hitFacePoints[wI]];
95             }
96         }
97     }
99     return tresult;
103 template<class FromPatch, class ToPatch>
104 template<class Type>
105 tmp<Field<Type> >
106 PatchToPatchInterpolation<FromPatch, ToPatch>::pointInterpolate
108     const tmp<Field<Type> >& tpf
109 ) const
111     tmp<Field<Type> > tint = pointInterpolate<Type>(tpf());
112     tpf.clear();
113     return tint;
117 //- Interpolate face field
118 template<class FromPatch, class ToPatch>
119 template<class Type>
120 tmp<Field<Type> >
121 PatchToPatchInterpolation<FromPatch, ToPatch>::faceInterpolate
123     const Field<Type>& ff
124 ) const
126     if (ff.size() != fromPatch_.size())
127     {
128         FatalErrorIn
129         (
130             "PatchToPatchInterpolation::faceInterpolate"
131             "(const Field<Type> ff)"
132         )   << "given field does not correspond to patch. Patch size: "
133             << fromPatch_.size() << " field size: " << ff.size()
134             << abort(FatalError);
135     }
137     tmp<Field<Type> > tresult
138     (
139         new Field<Type>
140         (
141             toPatch_.size(),
142             pTraits<Type>::zero
143         )
144     );
146     // Escape the interpolation if there are no faces in the target patch
147     if (toPatch_.size() == 0)
148     {
149         return tresult;
150     }
152     Field<Type>& result = tresult();
154     const labelListList& fromPatchFaceFaces = fromPatch_.faceFaces();
156     const FieldField<Field, scalar>& weights = faceWeights();
158     const labelList& addr = faceAddr();
160     forAll (result, faceI)
161     {
162         const scalarField& curWeights = weights[faceI];
164         if (addr[faceI] > -1)
165         {
166             const labelList& hitFaceFaces =
167                 fromPatchFaceFaces[addr[faceI]];
169             // First add the hit face
170             result[faceI] += ff[addr[faceI]]*curWeights[0];
172             for (label wI = 1; wI < curWeights.size(); wI++)
173             {
174                 result[faceI] += ff[hitFaceFaces[wI - 1]]*curWeights[wI];
175             }
176         }
177     }
179     return tresult;
183 template<class FromPatch, class ToPatch>
184 template<class Type>
185 tmp<Field<Type> >
186 PatchToPatchInterpolation<FromPatch, ToPatch>::faceInterpolate
188     const tmp<Field<Type> >& tff
189 ) const
191     tmp<Field<Type> > tint = faceInterpolate(tff());
192     tff.clear();
193     return tint;
197 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
199 } // End namespace Foam
201 // ************************************************************************* //