Single point evaluation

Setup

using DataInterpolationsND
using Random
Random.seed!(1)

interp_dims = (
    LinearInterpolationDimension(cumsum(0.5 .+ rand(5))),
    LinearInterpolationDimension(cumsum(0.5 .+ rand(10)))
)

t_eval_1 = range(
    first(interp_dims[1].t),
    last(interp_dims[1].t),
    length = 100
)
t_eval_2 = range(
    first(interp_dims[2].t),
    last(interp_dims[2].t),
    length = 100
)
1.2675180540873912:0.08653425606861634:9.83440940488041

Scalar output

using Plots

u = rand(5, 10)
itp = NDInterpolation(u, interp_dims)
out = itp.(t_eval_1, t_eval_2')
heatmap(out)
Example block output

Vector output, out of place

u = reshape(u, 5, 10, 1)
itp = NDInterpolation(u, interp_dims)
out = itp.(t_eval_1, t_eval_2')
heatmap(map(only, out))
Example block output

vector output, in place

out = zeros(100, 100)
for I in CartesianIndices(out)
    i, j = Tuple(I)
    itp(view(out, i, j:j), t_eval_1[i], t_eval_2[j])
end
heatmap(out)
Example block output

Single point derivative evaluation

Partial derivative w.r.t. first input (ForwardDiff)

using ForwardDiff

u = reshape(u, 5, 10)
itp = NDInterpolation(u, interp_dims)
∂₁itp = (t1, t2) -> ForwardDiff.derivative(t_ -> itp(t_, t2), t1)
out = ∂₁itp.(t_eval_1, t_eval_2')
heatmap(out)
Example block output

Partial derivative w.r.t. first input (analytic)

out = itp.(t_eval_1, t_eval_2'; derivative_orders = (1, 0))
heatmap(out)
Example block output

Multiple point evaluation (using KA)

Unstructured multi-point scalar evaluation (out of place)

using LinearAlgebra

interp_dims = (
    LinearInterpolationDimension(interp_dims[1].t; t_eval = t_eval_1),
    LinearInterpolationDimension(interp_dims[2].t; t_eval = t_eval_2)
)
itp = NDInterpolation(u, interp_dims)

out = eval_unstructured(itp)
heatmap(diagm(out))
Example block output

Grid vector evaluation (in place)

u = reshape(u, 5, 10, 1)
itp = NDInterpolation(u, interp_dims)
out = zeros(100, 100, 1)
eval_grid!(out, itp)
heatmap(out[:, :, 1])
Example block output