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)
Exemple #7
0
    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