correction to d4edb38234db8268907f04836d49bb93461b8a88
[OpenFOAM-1.5.x.git] / src / OpenFOAM / interpolations / interpolateXY / interpolateXY.C
bloba17c2443b1f6792ad4dbf728c81a64517c28d365
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
4    \\    /   O peration     |
5     \\  /    A nd           | Copyright (C) 1991-2008 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 the
13     Free Software Foundation; either version 2 of the License, or (at your
14     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, write to the Free Software Foundation,
23     Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
25 \*---------------------------------------------------------------------------*/
27 #include "interpolateXY.H"
28 #include "primitiveFields.H"
30 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
32 namespace Foam
35 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
37 template<class Type>
38 Field<Type> interpolateXY
40     const scalarField& xNew,
41     const scalarField& xOld,
42     const Field<Type>& yOld
45     scalarField yNew(xNew.size());
47     forAll(xNew, i)
48     {
49         yNew[i] = interpolateXY(xNew[i], xOld, yOld);
50     }
52     return yNew;
56 template<class Type>
57 Type interpolateXY
59     const scalar x,
60     const scalarField& xOld,
61     const Field<Type>& yOld
64     label n = xOld.size();
66     label lo = 0;
67     for (lo=0; lo<n && xOld[lo]>x; ++lo)
68     {}
70     label low = lo;
71     if (low < n)
72     {
73         for (label i=low; i<n; ++i)
74         {
75             if (xOld[i] > xOld[lo] && xOld[i] <= x)
76             {
77                 lo = i;
78             }
79         }
80     }
82     label hi = 0;
83     for (hi=0; hi<n && xOld[hi]<x; ++hi)
84     {}
86     label high = hi;
87     if (high < n)
88     {
89         for (label i=high; i<n; ++i)
90         {
91             if (xOld[i] < xOld[hi] && xOld[i] >= x)
92             {
93                 hi = i;
94             }
95         }
96     }
99     if (lo<n && hi<n && lo != hi)
100     {
101         return yOld[lo]
102             + ((x - xOld[lo])/(xOld[hi] - xOld[lo]))*(yOld[hi] - yOld[lo]);
103     }
104     else if (lo == hi)
105     {
106         return yOld[lo];
107     }
108     else if (lo == n)
109     {
110         return yOld[hi];
111     }
112     else
113     {
114         return yOld[lo];
115     }
119 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
121 } // End namespace Foam
123 // ************************************************************************* //