Vector Calculus

findiff implements the standard vector calculus operations

\[\nabla\;, \quad \nabla \cdot\;, \quad \nabla^2\;, \quad \nabla \times\]

via the convenience classes Gradient, Divergence, Laplacian and Curl, respectively.

Setup

import numpy as np
from findiff import Gradient, Divergence, Laplacian, Curl

x, y, z = [np.linspace(0, 10, 100)] * 3
dx, dy, dz = [c[1] - c[0] for c in (x, y, z)]
X, Y, Z = np.meshgrid(x, y, z, indexing='ij')
f = np.sin(X) * np.cos(Y) * np.sin(Z)

Gradient

The gradient of a scalar field yields a vector field:

grad = Gradient(h=[dx, dy, dz])
grad_f = grad(f)
grad_f.shape  # (3, 100, 100, 100)

Laplacian

The Laplacian of a scalar field yields a scalar field:

laplace = Laplacian(h=[dx, dy, dz])
laplace_f = laplace(f)
laplace_f.shape  # (100, 100, 100)

For non-uniform grids, pass coordinate arrays instead:

laplace = Laplacian(coords=[x, y, z])
laplace_f = laplace(f)

Divergence

Define a vector field and compute its divergence:

g = np.array([f, 2*f, 3*f])  # shape: (3, 100, 100, 100)

div = Divergence(h=[dx, dy, dz])
div_g = div(g)
div_g.shape  # (100, 100, 100)

Curl

The curl of a vector field yields another vector field:

curl = Curl(h=[dx, dy, dz])
curl_g = curl(g)
curl_g.shape  # (3, 100, 100, 100)

Note

The curl is only defined for three dimensions. Defining the operator on some other dimension raises an exception.