interp.py.html | ![]() |
Source file: interp.py | |
Directory: /Users/rjl/clawpack_src/clawpack_master/geoclaw/examples/tsunami/radial-ocean-island-fgmax | |
Converted: Mon Feb 10 2020 at 10:51:30 using clawcode2html | |
This documentation file will not reflect any later changes in the source file. |
""" Tools for interpolating data. Includes: pwcubic: piecewise cubic interpolation. pwlinear: piecewise linear interpolation. """ def pwcubic(xi, zl, zr, slopel, sloper, x): """ Construct a piecewise cubic function and evaluate at the points in x. The interpolation data consists of points xi, and values zl[i] = value of z in limit as x approaches xi[i] from the left, zr[i] = value of z in limit as x approaches xi[i] from the right, slopel[i] = value of z'(x) in limit as x approaches xi[i] from the left, sloper[i] = value of z'(x) in limit as x approaches xi[i] from the right. To the left of xi[0] the linear function based on zl[0] and slopel[0] is used. To the right of xi[-1] the linear function based on zr[-1] and sloper[-1] is used. In the interior intervals a cubic us used that interpolates the 4 values at the ends of the interval. Note that the function will be linear in the i'th interval if sloper[i] = (zl[i+1] - zr[i]) / (xi[i+1] - xi[i]) slopel[i+1] = (zl[i+1] - zr[i]) / (xi[i+1] - xi[i]) A piecewise linear interpolant can be created by setting this everywhere: slopel[1:] = (zl[1:]-zr[:-1]) / (xi[1:] - xi[:-1]) sloper[:-1] = (zl[1:]-zr[:-1]) / (xi[1:] - xi[:-1]) This can be done automatically with the pwlinear function defined below. Note that the pwcubic function is continuous if zl == zr and is C^1 if in addition slopel == sloper. """ from numpy import where, zeros dx = xi[1:] - xi[:-1] s = (zl[1:] - zr[:-1]) / dx c2 = (s - sloper[:-1]) / dx c3 = (slopel[1:] - 2.*s + sloper[:-1]) / (dx**2) # set to linear function for x= xi[-1] z = where(x < xi[0], zl[0] + (x-xi[0]) * slopel[0], zr[-1] + (x-xi[-1]) * sloper[-1]) # replace by appropriate cubic in intervals: for i in range(len(xi)-1): cubic = zr[i] + sloper[i]*(x - xi[i]) \ + (x-xi[i])**2 * (c2[i] + c3[i]*(x-xi[i+1])) z = where((x >= xi[i]) & (x < xi[i+1]), cubic, z) return z def pwlinear(xi, zl, zr, x, extrap=0): """ Construct a piecewise linear function and evaluate at the points in x. The interpolation data consists of points xi, and values zl[i] = value of z in limit as x approaches xi[i] from the left, zr[i] = value of z in limit as x approaches xi[i] from the right, Extrapolate outside the interval by: if extrap==0: slope = 0 outside of intervals if extrap==1: slope taken from neighboring interval. Note that the pwlinear function is continuous if zl == zr. """ from numpy import zeros slopel = zeros(len(zl)) sloper = zeros(len(zr)) dx = xi[1:] - xi[:-1] slopel[1:] = (zl[1:]-zr[:-1]) / dx sloper[:-1] = slopel[1:] if extrap==1: slopel[0] = sloper[0] sloper[-1] = slopel[-1] z = pwcubic(xi, zl, zr, slopel, sloper, x) return z