discretize.CurvilinearMesh.get_interpolation_matrix#

CurvilinearMesh.get_interpolation_matrix(loc, location_type='cell_centers', zeros_outside=False, **kwargs)[source]#

Construct a linear interpolation matrix from mesh.

This method constructs a linear interpolation matrix from tensor locations (nodes, cell-centers, faces, etc…) on the mesh to a set of arbitrary locations.

Parameters:
loc(`n_pts`, `dim`) `numpy.ndarray`

Location of points being to interpolate to. Must have same dimensions as the mesh.

location_type`str`, `optional`

Tensor locations on the mesh being interpolated from. location_type must be one of:

• ‘Ex’, ‘edges_x’ -> x-component of field defined on x edges

• ‘Ey’, ‘edges_y’ -> y-component of field defined on y edges

• ‘Ez’, ‘edges_z’ -> z-component of field defined on z edges

• ‘Fx’, ‘faces_x’ -> x-component of field defined on x faces

• ‘Fy’, ‘faces_y’ -> y-component of field defined on y faces

• ‘Fz’, ‘faces_z’ -> z-component of field defined on z faces

• ‘N’, ‘nodes’ -> scalar field defined on nodes

• ‘CC’, ‘cell_centers’ -> scalar field defined on cell centers

• ‘CCVx’, ‘cell_centers_x’ -> x-component of vector field defined on cell centers

• ‘CCVy’, ‘cell_centers_y’ -> y-component of vector field defined on cell centers

• ‘CCVz’, ‘cell_centers_z’ -> z-component of vector field defined on cell centers

zeros_outsidebool, `optional`

If False, nearest neighbour is used to compute the interpolate value at locations outside the mesh. If True , values at locations outside the mesh will be zero.

Returns:
(`n_pts`, `n_loc_type`) `scipy.sparse.csr_matrix`

A sparse matrix which interpolates the specified tensor quantity on mesh to the set of specified locations.

Examples

Here is a 1D example where a function evaluated on the nodes is interpolated to a set of random locations. To compare the accuracy, the function is evaluated at the set of random locations.

```>>> from discretize import TensorMesh
>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> np.random.seed(14)
```
```>>> locs = np.random.rand(50)*0.8+0.1
>>> dense = np.linspace(0, 1, 200)
>>> fun = lambda x: np.cos(2*np.pi*x)
```
```>>> hx = 0.125 * np.ones(8)
>>> mesh1D = TensorMesh([hx])
>>> Q = mesh1D.get_interpolation_matrix(locs, 'nodes')
```
```>>> plt.figure(figsize=(5, 3))
>>> plt.plot(dense, fun(dense), ':', c="C0", lw=3, label="True Function")
>>> plt.plot(mesh1D.nodes, fun(mesh1D.nodes), 's', c="C0", ms=8, label="True sampled")
>>> plt.plot(locs, Q*fun(mesh1D.nodes), 'o', ms=4, label="Interpolated")
>>> plt.legend()
>>> plt.show()
```

Here, demonstrate a similar example on a 2D mesh using a 2D Gaussian distribution. We interpolate the Gaussian from the nodes to cell centers and examine the relative error.

```>>> hx = np.ones(10)
>>> hy = np.ones(10)
>>> mesh2D = TensorMesh([hx, hy], x0='CC')
>>> def fun(x, y):
...     return np.exp(-(x**2 + y**2)/2**2)
```
```>>> nodes = mesh2D.nodes
>>> val_nodes = fun(nodes[:, 0], nodes[:, 1])
>>> centers = mesh2D.cell_centers
>>> val_centers = fun(centers[:, 0], centers[:, 1])
>>> A = mesh2D.get_interpolation_matrix(centers, 'nodes')
>>> val_interp = A.dot(val_nodes)
```
```>>> fig = plt.figure(figsize=(11,3.3))
>>> clim = (0., 1.)