def test_interpolate_edge_case_upper(self): for i in range(10): grid, vv = random_grid() ii = pykonal.LinearInterpolator3D(grid, vv) v1, v2 = ii.interpolate(grid.max_coords), ii(grid.max_coords) self.assertEqual(v1, v2) self.assertEqual(v1, vv[-1, -1, -1])
def test_interpolate_2D(self): grid = pykonal.Grid3D(coord_sys='cartesian') grid.min_coords = 0, 0, 0 grid.node_intervals = 1, 1, 1 grid.npts = 10, 10, 1 vv = np.random.rand(10, 10, 1) interpolator = pykonal.LinearInterpolator3D(grid, vv) interpolator([5, 5, 5])
def test_periodic(self): grid = pykonal.Grid3D(coord_sys='spherical') grid.min_coords = 1, 0, 0 grid.node_intervals = 1, np.pi / 20, np.pi / 20 grid.npts = 2, 21, 40 vv = np.cos(grid.nodes[..., 2]) interpolator = pykonal.LinearInterpolator3D(grid, vv) interpolator([1.5, np.pi / 2, 39.5 * np.pi / 20])
def test_interpolate_OutOfBoundsError(self): for i in range(10): grid, vv = random_grid() delta = grid.max_coords - grid.min_coords ii = pykonal.LinearInterpolator3D(grid, vv) with self.assertRaises(pykonal.OutOfBoundsError): ii.interpolate(grid.max_coords + 2 * delta) with self.assertRaises(pykonal.OutOfBoundsError): ii(grid.max_coords + 2 * delta) with self.assertRaises(pykonal.OutOfBoundsError): ii.interpolate(grid.min_coords - 2 * delta) with self.assertRaises(pykonal.OutOfBoundsError): ii(grid.min_coords - 2 * delta)
def test_interpolate(self): for i in range(10): grid, vv = random_grid() vmin, vmax = vv.min(), vv.max() delta = grid.max_coords - grid.min_coords ii = pykonal.LinearInterpolator3D(grid, vv) for j in range(10): xyz = (grid.min_coords + np.random.rand(3) * delta).astype(pykonal.DTYPE_REAL) v1, v2 = ii.interpolate(xyz), ii(xyz) self.assertEqual(v1, v2) self.assertGreater(v1, vmin) self.assertLess(v1, vmax)
def test_interpolate_error_float(self): for i in range(10): grid, vv = random_grid() delta = grid.max_coords - grid.min_coords ii = pykonal.LinearInterpolator3D( grid, np.full(vv.shape, fill_value=pykonal.ERROR_REAL, dtype=pykonal.DTYPE_REAL)) for j in range(10): xyz = (grid.min_coords + np.random.rand(3) * delta).astype( pykonal.DTYPE_REAL) v1, v2 = ii.interpolate(xyz), ii(xyz) self.assertEqual(v1, v2) self.assertEqual(v1, pykonal.ERROR_REAL)
def forward_map(self, m): # input m should be velocity output = [] m = np.reshape(m, self.ngrids) self.solver_tomo.vv = m for isrc in range(len(self.sources)): source = self.sources[isrc] solver = copy.deepcopy(self.solver_tomo) solver.add_source(source.source_pos) solver.solve() ui = pykonal.LinearInterpolator3D(solver.pgrid, solver.uu) xrc = source.receivers['x'] yrc = source.receivers['z'] zrc = source.receivers['y'] rc = pd.DataFrame({'x': xrc, 'y': yrc, 'z': zrc}) rec_data = np.zeros([len(xrc), 1]) for irec in range(len(xrc)): rec_data[irec] = ui(rc.iloc[irec]) output.append(rec_data) return output