2015-08-28 11:56:35 +02:00
|
|
|
from cpython cimport bool
|
|
|
|
from cython cimport view
|
|
|
|
from cython.parallel import prange, parallel
|
|
|
|
from libc.math cimport sin, cos, abs, floor, round, sqrt
|
|
|
|
import numpy as np
|
|
|
|
cimport numpy as npx
|
|
|
|
cimport cython
|
|
|
|
|
|
|
|
__all__=["fast_interp"]
|
|
|
|
|
|
|
|
|
|
|
|
@cython.boundscheck(False)
|
|
|
|
@cython.cdivision(True)
|
2015-09-29 16:34:46 +02:00
|
|
|
def fast_interp(xmin0, dx0, A0, y0, out0, beyond_val=np.nan):
|
2015-08-28 11:56:35 +02:00
|
|
|
cdef double rq, q
|
|
|
|
cdef int iq
|
|
|
|
cdef long i, Asize, ysize
|
2015-09-29 16:34:46 +02:00
|
|
|
cdef npx.float64_t xmin, dx
|
|
|
|
cdef npx.float64_t[:] out
|
|
|
|
cdef npx.float64_t[:] A, y
|
|
|
|
cdef npx.float64_t beyond
|
2015-08-28 11:56:35 +02:00
|
|
|
|
2015-09-29 16:34:46 +02:00
|
|
|
beyond=beyond_val
|
|
|
|
xmin = xmin0
|
|
|
|
dx = dx0
|
|
|
|
A = A0
|
|
|
|
y = y0
|
2015-08-28 11:56:35 +02:00
|
|
|
ysize = y.size
|
2015-09-29 16:34:46 +02:00
|
|
|
out = out0
|
2015-08-28 11:56:35 +02:00
|
|
|
Asize = A.size
|
|
|
|
|
2015-09-29 16:34:46 +02:00
|
|
|
if out.size != ysize:
|
|
|
|
raise ValueError("out and y must have the same size")
|
|
|
|
|
2015-08-28 11:56:35 +02:00
|
|
|
with nogil:
|
|
|
|
for i in prange(ysize):
|
|
|
|
q = (y[i] - xmin) / dx
|
|
|
|
iq = int(floor(q))
|
|
|
|
rq = (q-iq)
|
|
|
|
if iq+1 >= Asize or iq < 0:
|
2015-09-29 16:34:46 +02:00
|
|
|
out[i] = beyond
|
2015-08-28 11:56:35 +02:00
|
|
|
else:
|
2015-09-29 16:34:46 +02:00
|
|
|
out[i] = rq * A[iq+1] + (1-rq)*A[iq]
|