def interpolate(self, inputvars, locs, datavec, interpval=0.27, interpmethod='linear'): locations = range(len(inputvars) + 2) jj = 2 # search for the column locations of the desired variables for inputvar in inputvars: ii = 0 flag = 0 for title in self.gettitles(): if title == inputvar: locations[jj] = ii flag = 1 ii = ii + 1 if flag == 0: raise IOError( "user specified column header %s not found in specified data file %s" % (inputvar, self._sfile)) jj = jj + 1 locs[:] = locations[2:] # generate data matrix dataPy = np.genfromtxt(self._sfile, unpack=False, skip_header=2, delimiter="\t", usecols=locations) norows = dataPy.shape[0] nocols = dataPy.shape[1] datavec1 = np.zeros((nocols)) data = matrix.Matrix(norows, nocols) for i in range(norows): for j in range(nocols): data.SetVal(i, j, dataPy[i, j]) if interpmethod == 'linear': interp = interpolator.LinInterp() elif interpmethod == 'hermite': interp = interpolator.HermiteInterp() elif interpmethod == 'cubic': interp = interpolator.CubicInterp() else: raise IOError( "Specified interpolation method: %s not supported, use <linear>" % interpmethod) flag = 0 flag = interp.Interp(data, 0, interpval, datavec1) if flag == 1: raise RuntimeError( "Interpolation failed: interpolation value out of bounds") datavec[:] = datavec1[1:] return 0
def testCubicExtrap(self): # Test if cubic interpolator returns correct flag when attempting extrapolation data = matrix.Matrix(2, 2) for i in range(2): data.SetVal(i, 0, i) data.SetVal(i, 1, 3 * i) interp = interpolator.CubicInterp() icol = 0 cols = 2 vecout = np.zeros((cols)) self.assertEqual(interp.Interp(data, icol, -1.0, vecout), 1) # x < xmin self.assertEqual(interp.Interp(data, icol, 2.0, vecout), 1) # x > xmax
def testCubicNode(self): # Test if cubic interpolator gives node value when interpolating at node data = matrix.Matrix(10, 2) for i in range(10): data.SetVal(i, 0, i) data.SetVal(i, 1, np.cos(i)) interp = interpolator.CubicInterp() icol = 0 cols = 2 vecout = np.zeros((cols)) for i in range(10): flag = interp.Interp(data, icol, data.GetVal(i, 0), vecout) self.assertEqual(flag, 0) self.assertAlmostEqual(vecout[1], data.GetVal(i, 1))
def testCubicLinearfunc(self): # Test if cubic interpolator is exact for data generated by linear function def f(x): return 4.0 * x - 1.1 data = matrix.Matrix(10, 2) for i in range(10): data.SetVal(i, 0, i) data.SetVal(i, 1, f(i)) interp = interpolator.CubicInterp() icol = 0 cols = 2 vecout = np.zeros((cols)) for i in range(9): x = i + 0.2 flag = interp.Interp(data, icol, x, vecout) self.assertEqual(flag, 0) self.assertAlmostEqual(vecout[1], f(x))
def testCase(self): # Test if the interpolators return the correct answer for a specific case data = matrix.Matrix(4, 3) for i in range(4): data.SetVal(i, 0, i) data.SetVal(i, 1, i * i * i - 1) data.SetVal(i, 2, i * i + 1) interps = [ interpolator.LinInterp(), interpolator.CubicInterp(), interpolator.HermiteInterp() ] icol = 0 cols = 3 vecout = np.zeros((cols)) x = 1.5 yt = [[x, 3.5, 3.5], [x, 2.15, 3.2], [x, 2.375, 3.25]] for i in range(3): flag = interps[i].Interp(data, icol, x, vecout) self.assertEqual(flag, 0) np.testing.assert_array_almost_equal(vecout, yt[i])
# Run the fit to grid function to generate final data # Setup dim1 = 2 # w~ and c~ dim2 = ZmeanPoints # dimension of z~ dim3 = ZvarPoints # dimension of z_v dim4 = nofiles # number of files lcgrid = int(options["LCgrid"][0]) # length of cgrid cgrid = np.linspace(0.0, maxC * 1.5, lcgrid) interpmethod = options["InterpMethod"][0] if interpmethod == 'linear': # add more interpolation options later interp = interpolator.LinInterp() elif interpmethod == 'hermite': interp = interpolator.HermiteInterp() elif interpmethod == 'cubic': interp = interpolator.CubicInterp() else: raise IOError( "Specified interpolation method: %s not supported, use <linear>" % interpmethod) datain = matrix4d.Matrix4D(dim1, dim2, dim3, dim4) dataout = matrix3d.Matrix3D(dim2, dim3, lcgrid) print "Fitting final data to grid using %s interpolation" % interpmethod for i in range(2): for l in range(nofiles): for j in range(ZmeanPoints): for k in range(ZvarPoints): if i == 0: datain.SetVal(i, j, k, l, convolutedST[l].GetVal(k, j)) if i == 1: datain.SetVal(i, j, k, l, convolutedC[l].GetVal(k, j))