Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "interpolateXY.H"
00027 #include <OpenFOAM/primitiveFields.H>
00028
00029
00030
00031 namespace Foam
00032 {
00033
00034
00035
00036 template<class Type>
00037 Field<Type> interpolateXY
00038 (
00039 const scalarField& xNew,
00040 const scalarField& xOld,
00041 const Field<Type>& yOld
00042 )
00043 {
00044 Field<Type> yNew(xNew.size());
00045
00046 forAll(xNew, i)
00047 {
00048 yNew[i] = interpolateXY(xNew[i], xOld, yOld);
00049 }
00050
00051 return yNew;
00052 }
00053
00054
00055 template<class Type>
00056 Type interpolateXY
00057 (
00058 const scalar x,
00059 const scalarField& xOld,
00060 const Field<Type>& yOld
00061 )
00062 {
00063 label n = xOld.size();
00064
00065 label lo = 0;
00066 for (lo=0; lo<n && xOld[lo]>x; ++lo)
00067 {}
00068
00069 label low = lo;
00070 if (low < n)
00071 {
00072 for (label i=low; i<n; ++i)
00073 {
00074 if (xOld[i] > xOld[lo] && xOld[i] <= x)
00075 {
00076 lo = i;
00077 }
00078 }
00079 }
00080
00081 label hi = 0;
00082 for (hi=0; hi<n && xOld[hi]<x; ++hi)
00083 {}
00084
00085 label high = hi;
00086 if (high < n)
00087 {
00088 for (label i=high; i<n; ++i)
00089 {
00090 if (xOld[i] < xOld[hi] && xOld[i] >= x)
00091 {
00092 hi = i;
00093 }
00094 }
00095 }
00096
00097
00098 if (lo<n && hi<n && lo != hi)
00099 {
00100 return yOld[lo]
00101 + ((x - xOld[lo])/(xOld[hi] - xOld[lo]))*(yOld[hi] - yOld[lo]);
00102 }
00103 else if (lo == hi)
00104 {
00105 return yOld[lo];
00106 }
00107 else if (lo == n)
00108 {
00109 return yOld[hi];
00110 }
00111 else
00112 {
00113 return yOld[lo];
00114 }
00115 }
00116
00117
00118
00119
00120 }
00121
00122