In [18]:
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
In [69]:
Nx = 8
Ny = 6
x = np.linspace(0,10,Nx)
y = np.linspace(0,5, Ny)
f = np.zeros((Nx,Ny))
for i in range(Nx):
    for j in range(Ny):
        f[i,j] = np.sin(x[i])*np.cos(y[j])
In [5]:
def LI_1D(x, f, xi, Lgeneric=True):
    
    if Lgeneric:
        ilo  = int(xi/(x[1]-x[0]))
        if ilo < 0:
            ilo = 0
        elif ilo >= len(x)-1:
            ilo = len(x)-2
        ihi  = ilo + 1
        return f[ilo] + (xi - x[ilo]) * (f[ihi]-f[ilo])/(x[ihi]-x[ilo])
    else:
        return f[0] + (xi - x[0]) * (f[1]-f[0])/(x[1]-x[0])
    
In [6]:
def LI_2D(x,y, f, xP, yP):
    dx   = x[1]-x[0]
    
    ilo  = int(xP/dx)
    if ilo < 0:
        ilo = 0
    elif ilo >= len(x)-1:
        ilo = len(x)-2
    ihi  = ilo + 1
    
    #---------- interpolate grid to yP
    
    flo = LI_1D(y, f[ilo,:], yP)       # f at yP, x[ilo]
    fhi = LI_1D(y, f[ihi,:], yP)       # f at yP, x[ihi]
    
    #---------- interpolate final x direction
    
    return LI_1D( np.array([x[ilo], x[ihi]]), np.array([flo, fhi]), xP, False)
In [7]:
def LI_3D(x,y,z, f, xP, yP, zP):
    
    dx   = x[1]-x[0]
    
    ilo  = int(xP/dx)
    if ilo < 0:
        ilo = 0
    elif ilo >= len(x)-1:
        ilo = len(x)-2
    ihi  = ilo + 1
    
    #---------- interpolate grid to yP, zP
    
    flo = LI_2D(y,z, f[ilo,:,:], yP,zP)    # f at yP,zP, x[ilo]
    fhi = LI_2D(y,z, f[ihi,:,:], yP,zP)    # f at yP,zP, x[ihi]
    
    #---------- interpolate final x direction
    
    return LI_1D( np.array([x[ilo], x[ihi]]), np.array([flo, fhi]), xP, False)
    
In [8]:
def LI_4D(x,y,z,w, f, xP, yP, zP, wP):
    
    dx   = x[1]-x[0]
    
    ilo  = int(xP/dx)
    if ilo < 0:
        ilo = 0
    elif ilo >= len(x)-1:
        ilo = len(x)-2
    ihi  = ilo + 1
    
    #---------- interpolate grid to yP, zP
    
    flo = LI_3D(y,z,w, f[ilo,:,:,:], yP,zP,wP)    # f at yP,zP,wP, x[ilo]
    fhi = LI_3D(y,z,w, f[ihi,:,:,:], yP,zP,wP)    # f at yP,zP,wP x[ihi]
    
    #---------- interpolate final x direction
    
    return LI_1D( np.array([x[ilo], x[ihi]]), np.array([flo, fhi]), xP, False)
    
In [100]:
def LI_5D(x,y,z,w,a, f, xP, yP, zP, wP, aP):
    
    dx   = x[1]-x[0]
    
    ilo  = int(xP/dx)
    if ilo < 0:
        ilo = 0
    elif ilo >= len(x)-1:
        ilo = len(x)-2
    ihi  = ilo + 1
    
    #---------- interpolate grid to yP, zP
    
    flo = LI_4D(y,z,w,a, f[ilo,:,:,:,:], yP,zP,wP,aP)    # f at yP,zP,wP,aP x[ilo]
    fhi = LI_4D(y,z,w,a, f[ihi,:,:,:,:], yP,zP,wP,aP)    # f at yP,zP,wP,aP x[ihi]
    
    #---------- interpolate final x direction
    
    return LI_1D( np.array([x[ilo], x[ihi]]), np.array([flo, fhi]), xP, False)
    
In [ ]: