#!/usr/bin/env python # coding: utf-8 # In[18]: import numpy as np import matplotlib.pyplot as plt get_ipython().run_line_magic('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[ ]: