perf(polint): add uniform-grid fast path for barycentric n=6

This commit is contained in:
2026-03-01 13:26:39 +08:00
committed by ianchb
parent 8dad910c6c
commit e7a02e8f72

View File

@@ -1189,8 +1189,10 @@ end subroutine d2dump
real*8, intent(out) :: y, dy real*8, intent(out) :: y, dy
integer :: i, j integer :: i, j
logical :: is_uniform
real*8, dimension(6) :: lambda real*8, dimension(6) :: lambda
real*8 :: dx, den_i, term, num, den real*8 :: dx, den_i, term, num, den, step, tol
real*8, parameter :: c_uniform(6) = (/ -1.d0, 5.d0, -10.d0, 10.d0, -5.d0, 1.d0 /)
do i = 1, 6 do i = 1, 6
if (x == xa(i)) then if (x == xa(i)) then
@@ -1200,6 +1202,31 @@ end subroutine d2dump
end if end if
end do end do
step = xa(2) - xa(1)
is_uniform = (step /= 0.d0)
if (is_uniform) then
tol = 64.d0 * epsilon(1.d0) * max(1.d0, abs(step))
do i = 3, 6
if (abs((xa(i) - xa(i-1)) - step) > tol) then
is_uniform = .false.
exit
end if
end do
end if
if (is_uniform) then
num = 0.d0
den = 0.d0
do i = 1, 6
term = c_uniform(i) / (x - xa(i))
num = num + term * ya(i)
den = den + term
end do
y = num / den
dy = 0.d0
return
end if
do i = 1, 6 do i = 1, 6
den_i = 1.d0 den_i = 1.d0
do j = 1, 6 do j = 1, 6