using CoupledFields
using CoupledFields: ndgrid
function gauss3d(X::AbstractMatrix)
r = sum(abs2, X, dims=2)
return exp.(-r)
end
function gauss3d(X::Tuple)
r = reduce(+, [x.^2 for x in X])
return exp.(-r)
end
gauss3d (generic function with 2 methods)
# Irregular points in a cube
X = 4.0.*rand(300,3).-2
Y = gauss3d(X)
∇g = 1.2*gradient(X, Y[:,1:1])
size(∇g)
(300, 3)
# using Plots
quiver(eachcol(X)..., quiver=(∇g[:,1],∇g[:,2],∇g[:,3]), line_z=repeat(vec(Y), inner=4),
c=:viridis)

# Regular points in a cube
i = range(-2, 2, 6)
X2 = ndgrid(i, i, i)
Z = gauss3d(X2)
# if Z is an array, use `axs` for point range per dimension
∇g = gradient(Z, axs=(i,i,i))
size(∇g)
X3 = reduce(hcat, vec.(X2))
quiver(eachcol(X3)..., quiver=(∇g[:,1],∇g[:,2],∇g[:,3]), line_z=repeat(vec(Z), inner=4),
c=:viridis)
