From 181d800b13e79fc30dd3fd2fb128cda615c94511 Mon Sep 17 00:00:00 2001 From: Christopher Albert Date: Tue, 2 Dec 2025 01:46:33 +0100 Subject: [PATCH 01/15] neo_bspline: add 1D B-spline basis and matrix-free CGLS LSQ with tests --- src/interpolate/CMakeLists.txt | 1 + src/interpolate/neo_bspline.f90 | 327 ++++++++++++++++++++++++++++ test/CMakeLists.txt | 3 + test/scripts/plot_neo_bspline_1d.py | 45 ++++ test/source/test_neo_bspline_1d.f90 | 117 ++++++++++ 5 files changed, 493 insertions(+) create mode 100644 src/interpolate/neo_bspline.f90 create mode 100644 test/scripts/plot_neo_bspline_1d.py create mode 100644 test/source/test_neo_bspline_1d.f90 diff --git a/src/interpolate/CMakeLists.txt b/src/interpolate/CMakeLists.txt index d6eb1f2c..b007e73c 100644 --- a/src/interpolate/CMakeLists.txt +++ b/src/interpolate/CMakeLists.txt @@ -1,6 +1,7 @@ add_library(interpolate STATIC ../spl_three_to_five.f90 acc_spline_build_order5.f90 + neo_bspline.f90 batch_interpolate_types.f90 batch_interpolate_1d.f90 batch_interpolate_2d.f90 diff --git a/src/interpolate/neo_bspline.f90 b/src/interpolate/neo_bspline.f90 new file mode 100644 index 00000000..f2eb95cf --- /dev/null +++ b/src/interpolate/neo_bspline.f90 @@ -0,0 +1,327 @@ +module neo_bspline + !! Simple 1D B-spline basis and matrix-free LSQ via CGLS. + !! + !! Uses textbook Cox–de Boor recursion (Piegl & Tiller) for basis + !! evaluation and a standard CGLS algorithm for least-squares fitting. + use, intrinsic :: iso_fortran_env, only : dp => real64 + implicit none + private + + type :: bspline_1d + integer :: degree !! Polynomial degree p + integer :: n_ctrl !! Number of basis functions / control points + real(dp), allocatable :: knots(:) !! Knot vector, size = n_ctrl+degree+1 + real(dp) :: x_min, x_max + end type bspline_1d + + public :: bspline_1d + public :: bspline_1d_init_uniform + public :: bspline_1d_eval + public :: bspline_1d_lsq_cgls + +contains + + subroutine bspline_1d_init_uniform(spl, degree, n_ctrl, x_min, x_max) + !! Initialise open-uniform 1D B-spline on [x_min, x_max]. + type(bspline_1d), intent(out) :: spl + integer, intent(in) :: degree, n_ctrl + real(dp), intent(in) :: x_min, x_max + + integer :: p, n, m, i + real(dp) :: h, left, right + + if (degree < 1) error stop "bspline_1d_init_uniform: degree must be >= 1" + if (n_ctrl < degree + 1) then + error stop "bspline_1d_init_uniform: need at least degree+1 control points" + end if + if (x_max <= x_min) error stop "bspline_1d_init_uniform: x_max <= x_min" + + p = degree + n = n_ctrl + m = n + p + 1 + + spl%degree = p + spl%n_ctrl = n + spl%x_min = x_min + spl%x_max = x_max + + if (allocated(spl%knots)) deallocate(spl%knots) + allocate(spl%knots(m)) + + ! Open-uniform knot vector: + ! First p+1 knots at x_min, last p+1 knots at x_max, interior equally spaced. + h = (x_max - x_min) / real(n - p, dp) + do i = 1, m + if (i <= p + 1) then + spl%knots(i) = x_min + else if (i >= m - p) then + spl%knots(i) = x_max + else + left = real(i - (p + 1), dp) + spl%knots(i) = x_min + left*h + end if + end do + end subroutine bspline_1d_init_uniform + + + subroutine bspline_1d_eval(spl, coeff, x, y) + !! Evaluate spline sum_j coeff(j) * N_j(x). + type(bspline_1d), intent(in) :: spl + real(dp), intent(in) :: coeff(:) + real(dp), intent(in) :: x + real(dp), intent(out) :: y + + integer :: span, j, p + real(dp), dimension(:), allocatable :: N + + if (size(coeff) /= spl%n_ctrl) then + error stop "bspline_1d_eval: coeff size mismatch" + end if + + p = spl%degree + allocate(N(0:p)) + + call find_span(spl, x, span) + call basis_funs(spl, span, x, N) + + y = 0.0_dp + do j = 0, p + y = y + N(j) * coeff(span - p + j) + end do + + deallocate(N) + end subroutine bspline_1d_eval + + + subroutine bspline_1d_lsq_cgls(spl, x_data, f_data, coeff, max_iter, tol) + !! Matrix-free CGLS for 1D B-spline LSQ: + !! min_c sum_i (S_c(x_i) - f_i)^2 + !! + !! where S_c(x) is the spline with control points coeff(:). + type(bspline_1d), intent(in) :: spl + real(dp), intent(in) :: x_data(:) + real(dp), intent(in) :: f_data(:) + real(dp), intent(inout) :: coeff(:) + integer, intent(in), optional :: max_iter + real(dp), intent(in), optional :: tol + + integer :: n_data, n_ctrl + integer :: k, kmax + real(dp) :: atol, gamma, gamma_new, alpha, beta, denom + real(dp) :: rhs_norm + real(dp), allocatable :: r(:), s(:), p(:), q(:) + + n_data = size(x_data) + if (n_data /= size(f_data)) then + error stop "bspline_1d_lsq_cgls: x_data and f_data size mismatch" + end if + + n_ctrl = spl%n_ctrl + if (size(coeff) /= n_ctrl) then + error stop "bspline_1d_lsq_cgls: coeff size mismatch" + end if + + if (present(max_iter)) then + kmax = max_iter + else + kmax = 200 + end if + if (present(tol)) then + atol = tol + else + atol = 1.0d-10 + end if + + allocate(r(n_data)) + allocate(q(n_data)) + allocate(s(n_ctrl)) + allocate(p(n_ctrl)) + + ! Initial guess: coeff = 0 + coeff = 0.0_dp + + ! r = f - A*coeff (A*coeff = 0 initially) + r = f_data + + call apply_AT(spl, x_data, r, s) + p = s + gamma = dot_product(s, s) + rhs_norm = sqrt(dot_product(f_data, f_data)) + + if (rhs_norm == 0.0_dp) then + coeff = 0.0_dp + deallocate(r, q, s, p) + return + end if + + do k = 1, kmax + call apply_A(spl, x_data, p, q) + denom = dot_product(q, q) + if (denom <= 0.0_dp) exit + + alpha = gamma/denom + coeff = coeff + alpha*p + r = r - alpha*q + + call apply_AT(spl, x_data, r, s) + gamma_new = dot_product(s, s) + + if (gamma_new <= (atol*rhs_norm)**2) exit + + beta = gamma_new/gamma + gamma = gamma_new + p = s + beta*p + end do + + deallocate(r, q, s, p) + end subroutine bspline_1d_lsq_cgls + + + !----------------------------------------------------------------- + ! Internal helpers + !----------------------------------------------------------------- + + subroutine find_span(spl, x, span) + !! Find knot span index for x (0-based basis index will be span-degree...span). + type(bspline_1d), intent(in) :: spl + real(dp), intent(in) :: x + integer, intent(out) :: span + + integer :: low, high, mid, p, n, m + real(dp) :: xx + + p = spl%degree + n = spl%n_ctrl + m = n + p + 1 + + ! Clamp x to [x_min, x_max] + xx = min(max(x, spl%x_min), spl%x_max) + + ! Special cases at the ends + if (xx >= spl%knots(m-p)) then + span = n + return + end if + + low = p + 1 + high = n + 1 + + do + mid = (low + high)/2 + if (xx < spl%knots(mid)) then + high = mid + else if (xx >= spl%knots(mid+1)) then + low = mid + else + span = mid + exit + end if + end do + end subroutine find_span + + + subroutine basis_funs(spl, span, x, N) + !! Compute non-zero B-spline basis functions N(0:p) at x. + type(bspline_1d), intent(in) :: spl + integer, intent(in) :: span + real(dp), intent(in) :: x + real(dp), intent(out) :: N(0:) + + integer :: p, j, r + real(dp), allocatable :: left(:), right(:) + real(dp) :: saved, temp + + p = spl%degree + if (size(N) < p+1) then + error stop "basis_funs: N has wrong size" + end if + + allocate(left(0:p)) + allocate(right(0:p)) + + N(0) = 1.0_dp + do j = 1, p + left(j) = x - spl%knots(span+1-j) + right(j) = spl%knots(span+j) - x + saved = 0.0_dp + do r = 0, j-1 + temp = N(r)/(right(r+1) + left(j-r)) + N(r) = saved + right(r+1)*temp + saved = left(j-r)*temp + end do + N(j) = saved + end do + + deallocate(left, right) + end subroutine basis_funs + + + subroutine apply_A(spl, x_data, coeff, y) + !! y = A * coeff (spline evaluation at all x_data) + type(bspline_1d), intent(in) :: spl + real(dp), intent(in) :: x_data(:) + real(dp), intent(in) :: coeff(:) + real(dp), intent(out) :: y(:) + + integer :: n_data, i, span, p, j + real(dp), allocatable :: N(:) + + n_data = size(x_data) + if (size(y) /= n_data) then + error stop "apply_A: y size mismatch" + end if + if (size(coeff) /= spl%n_ctrl) then + error stop "apply_A: coeff size mismatch" + end if + + p = spl%degree + allocate(N(0:p)) + + y = 0.0_dp + do i = 1, n_data + call find_span(spl, x_data(i), span) + call basis_funs(spl, span, x_data(i), N) + do j = 0, p + y(i) = y(i) + N(j)*coeff(span - p + j) + end do + end do + + deallocate(N) + end subroutine apply_A + + + subroutine apply_AT(spl, x_data, r, g) + !! g = A^T * r (adjoint action, accumulating into control points) + type(bspline_1d), intent(in) :: spl + real(dp), intent(in) :: x_data(:) + real(dp), intent(in) :: r(:) + real(dp), intent(out) :: g(:) + + integer :: n_data, i, span, p, j + real(dp), allocatable :: N(:) + + n_data = size(x_data) + if (size(r) /= n_data) then + error stop "apply_AT: r size mismatch" + end if + if (size(g) /= spl%n_ctrl) then + error stop "apply_AT: g size mismatch" + end if + + p = spl%degree + allocate(N(0:p)) + + g = 0.0_dp + do i = 1, n_data + call find_span(spl, x_data(i), span) + call basis_funs(spl, span, x_data(i), N) + do j = 0, p + g(span - p + j) = g(span - p + j) + N(j)*r(i) + end do + end do + + deallocate(N) + end subroutine apply_AT + +end module neo_bspline + diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 32d82149..2abb7b06 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -144,6 +144,8 @@ target_link_libraries(test_rng.x ${COMMON_LIBS}) add_executable(test_polylag_3.x source/test_polylag_3.f90) target_link_libraries(test_polylag_3.x ${COMMON_LIBS} ${MAGFIE_LIB}) +add_executable(test_neo_bspline_1d.x source/test_neo_bspline_1d.f90) +target_link_libraries(test_neo_bspline_1d.x ${COMMON_LIBS}) add_executable(test_interpolate.x source/test_interpolate.f90) target_link_libraries(test_interpolate.x ${COMMON_LIBS}) @@ -213,6 +215,7 @@ add_test(NAME test_spl_three_to_five COMMAND test_spl_three_to_five.x) add_test(NAME test_species COMMAND test_species.x) add_test(NAME test_rng COMMAND test_rng.x) add_test(NAME test_polylag_3 COMMAND test_polylag_3.x) +add_test(NAME test_neo_bspline_1d COMMAND test_neo_bspline_1d.x) add_test(NAME test_interpolate COMMAND test_interpolate.x) add_test(NAME test_batch_interpolate COMMAND test_batch_interpolate.x) add_test(NAME test_batch_interpolate_many COMMAND test_batch_interpolate_many.x) diff --git a/test/scripts/plot_neo_bspline_1d.py b/test/scripts/plot_neo_bspline_1d.py new file mode 100644 index 00000000..4c8a9582 --- /dev/null +++ b/test/scripts/plot_neo_bspline_1d.py @@ -0,0 +1,45 @@ +#!/usr/bin/env python3 +import argparse +import pathlib + +import matplotlib.pyplot as plt +import numpy as np + + +def main() -> None: + parser = argparse.ArgumentParser( + description="Plot 1D neo_bspline LSQ fit vs analytic reference." + ) + parser.add_argument( + "--data", + type=pathlib.Path, + default=pathlib.Path("bspline_1d_lsq.dat"), + help="Path to data file written by test_neo_bspline_1d.x", + ) + parser.add_argument( + "--output", + type=pathlib.Path, + default=pathlib.Path("bspline_1d_lsq.png"), + help="Output PNG file for the plot.", + ) + args = parser.parse_args() + + data = np.loadtxt(args.data) + x = data[:, 0] + f_true = data[:, 1] + f_fit = data[:, 2] + + fig, ax = plt.subplots(figsize=(6, 4)) + ax.plot(x, f_true, label="analytic", color="k", linewidth=1.5) + ax.plot(x, f_fit, label="neo_bspline fit", color="C0", linestyle="--") + ax.set_xlabel("x") + ax.set_ylabel("f(x)") + ax.set_title("neo_bspline 1D LSQ fit") + ax.legend() + fig.tight_layout() + fig.savefig(args.output, dpi=150) + + +if __name__ == "__main__": + main() + diff --git a/test/source/test_neo_bspline_1d.f90 b/test/source/test_neo_bspline_1d.f90 new file mode 100644 index 00000000..74468814 --- /dev/null +++ b/test/source/test_neo_bspline_1d.f90 @@ -0,0 +1,117 @@ +program test_neo_bspline_1d + use libneo_kinds, only : dp + use math_constants + use libneo_util, only : linspace + use neo_bspline + + implicit none + + real(dp), parameter :: TOL_L2 = 1.0d-5 + real(dp), parameter :: X_MIN = 1.23d0 + real(dp), parameter :: X_MAX = TWOPI + 1.23d0 + + call test_bspline_1d_partition_unity() + call test_bspline_1d_lsq_cos() + +contains + + subroutine test_bspline_1d_partition_unity() + type(bspline_1d) :: spl + integer, parameter :: DEGREE = 3 + integer, parameter :: N_CTRL = 20 + integer, parameter :: N_SAMPLE = 200 + + real(dp) :: x_eval(N_SAMPLE) + real(dp) :: sum_basis, x, temp + real(dp) :: max_err + real(dp) :: c(N_CTRL) + integer :: i, j + + print *, "Testing neo_bspline 1D partition of unity" + + call bspline_1d_init_uniform(spl, DEGREE, N_CTRL, X_MIN, X_MAX) + call linspace(X_MIN, X_MAX, N_SAMPLE, x_eval) + + max_err = 0.0d0 + do i = 1, N_SAMPLE + x = x_eval(i) + sum_basis = 0.0d0 + do j = 1, N_CTRL + c = 0.0d0 + c(j) = 1.0d0 + call bspline_1d_eval(spl, c, x, temp) + sum_basis = sum_basis + temp + end do + max_err = max(max_err, abs(sum_basis - 1.0d0)) + end do + + print *, " max |sum_j N_j(x) - 1| =", max_err + + if (max_err > 1.0d-10) then + error stop "neo_bspline 1D partition of unity violated" + end if + + end subroutine test_bspline_1d_partition_unity + + + subroutine test_bspline_1d_lsq_cos() + type(bspline_1d) :: spl + integer, parameter :: DEGREE = 5 + integer, parameter :: N_CTRL = 40 + integer, parameter :: N_DATA = 400 + integer, parameter :: N_PLOT = 201 + + real(dp) :: x_data(N_DATA), f_data(N_DATA) + real(dp) :: coeff(N_CTRL) + real(dp) :: x_plot(N_PLOT), f_true(N_PLOT), f_fit(N_PLOT) + real(dp) :: err2 + integer :: i + + print *, "Testing neo_bspline 1D LSQ CGLS (cos)" + + call bspline_1d_init_uniform(spl, DEGREE, N_CTRL, X_MIN, X_MAX) + + ! Scattered data in [X_MIN, X_MAX] + do i = 1, N_DATA + x_data(i) = X_MIN + (X_MAX - X_MIN) * real(i, dp) / real(N_DATA + 1, dp) + x_data(i) = x_data(i) + 0.1d0 * sin(3.0d0*real(i, dp)) + if (x_data(i) < X_MIN) x_data(i) = X_MIN + if (x_data(i) > X_MAX) x_data(i) = X_MAX + f_data(i) = cos(2.0d0*x_data(i)) + 0.5d0*sin(3.0d0*x_data(i)) + end do + + coeff = 0.0_dp + call bspline_1d_lsq_cgls(spl, x_data, f_data, coeff, max_iter=400, tol=1.0d-10) + + call linspace(X_MIN, X_MAX, N_PLOT, x_plot) + do i = 1, N_PLOT + f_true(i) = cos(2.0d0*x_plot(i)) + 0.5d0*sin(3.0d0*x_plot(i)) + call bspline_1d_eval(spl, coeff, x_plot(i), f_fit(i)) + end do + + err2 = sum((f_fit - f_true)**2)/real(N_PLOT, dp) + print *, " LSQ L2 error =", sqrt(err2) + + if (sqrt(err2) > TOL_L2) then + error stop "neo_bspline 1D LSQ error too large" + end if + + call write_plot_data("bspline_1d_lsq.dat", N_PLOT, x_plot, f_true, f_fit) + + end subroutine test_bspline_1d_lsq_cos + + + subroutine write_plot_data(fname, n, x, f_true, f_fit) + character(*), intent(in) :: fname + integer, intent(in) :: n + real(dp), intent(in) :: x(n), f_true(n), f_fit(n) + integer :: iunit, i + + open(newunit=iunit, file=fname, status="replace", action="write", form="formatted") + do i = 1, n + write(iunit,'(3es24.16)') x(i), f_true(i), f_fit(i) + end do + close(iunit) + end subroutine write_plot_data + +end program test_neo_bspline_1d From f0b433f5a5ca0aefa2243e5b6da52135ac78a33b Mon Sep 17 00:00:00 2001 From: Christopher Albert Date: Tue, 2 Dec 2025 02:16:13 +0100 Subject: [PATCH 02/15] Add matrix-free neo_bspline 3D and batched LSQ --- src/interpolate/CMakeLists.txt | 1 + src/interpolate/neo_bspline.f90 | 345 +++++++++++++++++++- src/interpolate/neo_bspline_3d.f90 | 352 +++++++++++++++++++++ test/CMakeLists.txt | 6 + test/scripts/plot_neo_bspline_2d_circle.py | 45 +++ test/scripts/plot_neo_bspline_2d_grid.py | 47 +++ test/scripts/plot_neo_bspline_3d_slice.py | 52 +++ test/source/test_neo_bspline_1d.f90 | 108 ++++++- test/source/test_neo_bspline_2d.f90 | 290 +++++++++++++++++ test/source/test_neo_bspline_3d.f90 | 168 ++++++++++ 10 files changed, 1410 insertions(+), 4 deletions(-) create mode 100644 src/interpolate/neo_bspline_3d.f90 create mode 100644 test/scripts/plot_neo_bspline_2d_circle.py create mode 100644 test/scripts/plot_neo_bspline_2d_grid.py create mode 100644 test/scripts/plot_neo_bspline_3d_slice.py create mode 100644 test/source/test_neo_bspline_2d.f90 create mode 100644 test/source/test_neo_bspline_3d.f90 diff --git a/src/interpolate/CMakeLists.txt b/src/interpolate/CMakeLists.txt index b007e73c..bc436117 100644 --- a/src/interpolate/CMakeLists.txt +++ b/src/interpolate/CMakeLists.txt @@ -2,6 +2,7 @@ add_library(interpolate STATIC ../spl_three_to_five.f90 acc_spline_build_order5.f90 neo_bspline.f90 + neo_bspline_3d.f90 batch_interpolate_types.f90 batch_interpolate_1d.f90 batch_interpolate_2d.f90 diff --git a/src/interpolate/neo_bspline.f90 b/src/interpolate/neo_bspline.f90 index f2eb95cf..15d1d1cf 100644 --- a/src/interpolate/neo_bspline.f90 +++ b/src/interpolate/neo_bspline.f90 @@ -14,10 +14,29 @@ module neo_bspline real(dp) :: x_min, x_max end type bspline_1d + type :: bspline_2d + type(bspline_1d) :: sx + type(bspline_1d) :: sy + end type bspline_2d + public :: bspline_1d public :: bspline_1d_init_uniform public :: bspline_1d_eval public :: bspline_1d_lsq_cgls + public :: bspline_1d_lsq_cgls_batch + + public :: bspline_2d + public :: bspline_2d_init_uniform + public :: bspline_2d_eval + public :: bspline_2d_lsq_cgls + public :: bspline_2d_lsq_cgls_batch + + public :: apply_A + public :: apply_AT + public :: apply_A2D + public :: apply_A2D_T + public :: find_span + public :: basis_funs contains @@ -177,6 +196,236 @@ subroutine bspline_1d_lsq_cgls(spl, x_data, f_data, coeff, max_iter, tol) end subroutine bspline_1d_lsq_cgls + subroutine bspline_1d_lsq_cgls_batch(spl, x_data, f_data, coeff, max_iter, tol) + !! Batched matrix-free CGLS for 1D B-splines. + !! Solves independent LSQ problems for multiple right-hand sides: + !! min_{c(:,k)} sum_i (S_{c(:,k)}(x_i) - f_i(k))^2 + !! for k = 1..n_rhs. + type(bspline_1d), intent(in) :: spl + real(dp), intent(in) :: x_data(:) + real(dp), intent(in) :: f_data(:,:) + real(dp), intent(inout) :: coeff(:,:) + integer, intent(in), optional :: max_iter + real(dp), intent(in), optional :: tol + + integer :: n_data, n_rhs, n_ctrl, k + + n_data = size(x_data) + if (n_data /= size(f_data, 1)) then + error stop "bspline_1d_lsq_cgls_batch: x_data and f_data size mismatch" + end if + + n_rhs = size(f_data, 2) + n_ctrl = spl%n_ctrl + + if (size(coeff, 1) /= n_ctrl .or. size(coeff, 2) /= n_rhs) then + error stop "bspline_1d_lsq_cgls_batch: coeff shape mismatch" + end if + + do k = 1, n_rhs + if (present(max_iter) .and. present(tol)) then + call bspline_1d_lsq_cgls(spl, x_data, f_data(:, k), coeff(:, k), & + max_iter=max_iter, tol=tol) + elseif (present(max_iter)) then + call bspline_1d_lsq_cgls(spl, x_data, f_data(:, k), coeff(:, k), & + max_iter=max_iter) + elseif (present(tol)) then + call bspline_1d_lsq_cgls(spl, x_data, f_data(:, k), coeff(:, k), & + tol=tol) + else + call bspline_1d_lsq_cgls(spl, x_data, f_data(:, k), coeff(:, k)) + end if + end do + end subroutine bspline_1d_lsq_cgls_batch + + + !----------------------------------------------------------------- + ! 2D tensor-product B-splines + !----------------------------------------------------------------- + + subroutine bspline_2d_init_uniform(spl, degree, n_ctrl, x_min, x_max) + !! Initialise 2D tensor-product B-spline with open-uniform knots + !! in each dimension on [x_min(j), x_max(j)]. + type(bspline_2d), intent(out) :: spl + integer, intent(in) :: degree(2), n_ctrl(2) + real(dp), intent(in) :: x_min(2), x_max(2) + + call bspline_1d_init_uniform(spl%sx, degree(1), n_ctrl(1), x_min(1), x_max(1)) + call bspline_1d_init_uniform(spl%sy, degree(2), n_ctrl(2), x_min(2), x_max(2)) + end subroutine bspline_2d_init_uniform + + + subroutine bspline_2d_eval(spl, coeff, x, y) + !! Evaluate 2D spline S(x,y) = sum_{i,j} coeff(i,j) N_i(x) M_j(y). + type(bspline_2d), intent(in) :: spl + real(dp), intent(in) :: coeff(:,:) + real(dp), intent(in) :: x(2) + real(dp), intent(out) :: y + + integer :: nx, ny, spanx, spany, px, py + integer :: a, b, ix, iy + real(dp), allocatable :: Nx_b(:), Ny_b(:) + + nx = spl%sx%n_ctrl + ny = spl%sy%n_ctrl + if (size(coeff, 1) /= nx .or. size(coeff, 2) /= ny) then + error stop "bspline_2d_eval: coeff shape mismatch" + end if + + px = spl%sx%degree + py = spl%sy%degree + allocate(Nx_b(0:px)) + allocate(Ny_b(0:py)) + + call find_span(spl%sx, x(1), spanx) + call basis_funs(spl%sx, spanx, x(1), Nx_b) + call find_span(spl%sy, x(2), spany) + call basis_funs(spl%sy, spany, x(2), Ny_b) + + y = 0.0_dp + do a = 0, px + ix = spanx - px + a + do b = 0, py + iy = spany - py + b + y = y + Nx_b(a)*Ny_b(b)*coeff(ix, iy) + end do + end do + + deallocate(Nx_b, Ny_b) + end subroutine bspline_2d_eval + + + subroutine bspline_2d_lsq_cgls(spl, x_data, y_data, f_data, coeff, max_iter, tol) + !! Matrix-free CGLS for 2D tensor-product B-spline LSQ: + !! min_C sum_i (S_C(x_i,y_i) - f_i)^2 + !! + !! where C is coeff(nx,ny) and S_C is the spline. + type(bspline_2d), intent(in) :: spl + real(dp), intent(in) :: x_data(:) + real(dp), intent(in) :: y_data(:) + real(dp), intent(in) :: f_data(:) + real(dp), intent(inout) :: coeff(:,:) + integer, intent(in), optional :: max_iter + real(dp), intent(in), optional :: tol + + integer :: n_data, nx, ny + integer :: k, kmax + real(dp) :: atol, gamma, gamma_new, alpha, beta, denom + real(dp) :: rhs_norm + real(dp), allocatable :: r(:), q(:) + real(dp), allocatable :: s(:,:), p(:,:) + + n_data = size(x_data) + if (n_data /= size(y_data) .or. n_data /= size(f_data)) then + error stop "bspline_2d_lsq_cgls: data size mismatch" + end if + + nx = spl%sx%n_ctrl + ny = spl%sy%n_ctrl + if (size(coeff, 1) /= nx .or. size(coeff, 2) /= ny) then + error stop "bspline_2d_lsq_cgls: coeff shape mismatch" + end if + + if (present(max_iter)) then + kmax = max_iter + else + kmax = 400 + end if + if (present(tol)) then + atol = tol + else + atol = 1.0d-10 + end if + + allocate(r(n_data)) + allocate(q(n_data)) + allocate(s(nx, ny)) + allocate(p(nx, ny)) + + coeff = 0.0_dp + r = f_data + + call apply_A2D_T(spl, x_data, y_data, r, s) + p = s + gamma = sum(s*s) + rhs_norm = sqrt(sum(f_data*f_data)) + + if (rhs_norm == 0.0_dp) then + coeff = 0.0_dp + deallocate(r, q, s, p) + return + end if + + do k = 1, kmax + call apply_A2D(spl, x_data, y_data, p, q) + denom = sum(q*q) + if (denom <= 0.0_dp) exit + + alpha = gamma/denom + coeff = coeff + alpha*p + r = r - alpha*q + + call apply_A2D_T(spl, x_data, y_data, r, s) + gamma_new = sum(s*s) + + if (gamma_new <= (atol*rhs_norm)**2) exit + + beta = gamma_new/gamma + gamma = gamma_new + p = s + beta*p + end do + + deallocate(r, q, s, p) + end subroutine bspline_2d_lsq_cgls + + + subroutine bspline_2d_lsq_cgls_batch(spl, x_data, y_data, f_data, coeff, & + max_iter, tol) + !! Batched matrix-free CGLS for 2D tensor-product B-splines. + !! Solves independent LSQ problems for multiple right-hand sides: + !! min_{C(:,:,k)} sum_i (S_{C(:,:,k)}(x_i,y_i) - f_i(k))^2 + type(bspline_2d), intent(in) :: spl + real(dp), intent(in) :: x_data(:) + real(dp), intent(in) :: y_data(:) + real(dp), intent(in) :: f_data(:,:) + real(dp), intent(inout) :: coeff(:,:,:) + integer, intent(in), optional :: max_iter + real(dp), intent(in), optional :: tol + + integer :: n_data, n_rhs, nx, ny, k + + n_data = size(x_data) + if (n_data /= size(y_data) .or. n_data /= size(f_data, 1)) then + error stop "bspline_2d_lsq_cgls_batch: data size mismatch" + end if + + n_rhs = size(f_data, 2) + nx = spl%sx%n_ctrl + ny = spl%sy%n_ctrl + + if (size(coeff, 1) /= nx .or. size(coeff, 2) /= ny .or. & + size(coeff, 3) /= n_rhs) then + error stop "bspline_2d_lsq_cgls_batch: coeff shape mismatch" + end if + + do k = 1, n_rhs + if (present(max_iter) .and. present(tol)) then + call bspline_2d_lsq_cgls(spl, x_data, y_data, f_data(:, k), & + coeff(:, :, k), max_iter=max_iter, tol=tol) + elseif (present(max_iter)) then + call bspline_2d_lsq_cgls(spl, x_data, y_data, f_data(:, k), & + coeff(:, :, k), max_iter=max_iter) + elseif (present(tol)) then + call bspline_2d_lsq_cgls(spl, x_data, y_data, f_data(:, k), & + coeff(:, :, k), tol=tol) + else + call bspline_2d_lsq_cgls(spl, x_data, y_data, f_data(:, k), & + coeff(:, :, k)) + end if + end do + end subroutine bspline_2d_lsq_cgls_batch + + !----------------------------------------------------------------- ! Internal helpers !----------------------------------------------------------------- @@ -323,5 +572,99 @@ subroutine apply_AT(spl, x_data, r, g) deallocate(N) end subroutine apply_AT -end module neo_bspline + subroutine apply_A2D(spl, x_data, y_data, coeff, f) + !! f = A * coeff (2D spline evaluation at all data points) + type(bspline_2d), intent(in) :: spl + real(dp), intent(in) :: x_data(:) + real(dp), intent(in) :: y_data(:) + real(dp), intent(in) :: coeff(:,:) + real(dp), intent(out) :: f(:) + + integer :: n_data, nx, ny + integer :: i, spanx, spany, px, py, a, b, ix, iy + real(dp), allocatable :: Nx_b(:), Ny_b(:) + + n_data = size(x_data) + if (n_data /= size(y_data) .or. n_data /= size(f)) then + error stop "apply_A2D: data size mismatch" + end if + + nx = spl%sx%n_ctrl + ny = spl%sy%n_ctrl + if (size(coeff, 1) /= nx .or. size(coeff, 2) /= ny) then + error stop "apply_A2D: coeff shape mismatch" + end if + + px = spl%sx%degree + py = spl%sy%degree + allocate(Nx_b(0:px)) + allocate(Ny_b(0:py)) + + f = 0.0_dp + do i = 1, n_data + call find_span(spl%sx, x_data(i), spanx) + call basis_funs(spl%sx, spanx, x_data(i), Nx_b) + call find_span(spl%sy, y_data(i), spany) + call basis_funs(spl%sy, spany, y_data(i), Ny_b) + do a = 0, px + ix = spanx - px + a + do b = 0, py + iy = spany - py + b + f(i) = f(i) + Nx_b(a)*Ny_b(b)*coeff(ix, iy) + end do + end do + end do + + deallocate(Nx_b, Ny_b) + end subroutine apply_A2D + + + subroutine apply_A2D_T(spl, x_data, y_data, r, g) + !! g = A^T * r (adjoint action in 2D coefficient space) + type(bspline_2d), intent(in) :: spl + real(dp), intent(in) :: x_data(:) + real(dp), intent(in) :: y_data(:) + real(dp), intent(in) :: r(:) + real(dp), intent(out) :: g(:,:) + + integer :: n_data, nx, ny + integer :: i, spanx, spany, px, py, a, b, ix, iy + real(dp), allocatable :: Nx_b(:), Ny_b(:) + + n_data = size(x_data) + if (n_data /= size(y_data) .or. n_data /= size(r)) then + error stop "apply_A2D_T: data size mismatch" + end if + + nx = spl%sx%n_ctrl + ny = spl%sy%n_ctrl + if (size(g, 1) /= nx .or. size(g, 2) /= ny) then + error stop "apply_A2D_T: g shape mismatch" + end if + + px = spl%sx%degree + py = spl%sy%degree + allocate(Nx_b(0:px)) + allocate(Ny_b(0:py)) + + g = 0.0_dp + do i = 1, n_data + call find_span(spl%sx, x_data(i), spanx) + call basis_funs(spl%sx, spanx, x_data(i), Nx_b) + call find_span(spl%sy, y_data(i), spany) + call basis_funs(spl%sy, spany, y_data(i), Ny_b) + do a = 0, px + ix = spanx - px + a + do b = 0, py + iy = spany - py + b + g(ix, iy) = g(ix, iy) + Nx_b(a)*Ny_b(b)*r(i) + end do + end do + end do + + deallocate(Nx_b, Ny_b) + end subroutine apply_A2D_T + + +end module neo_bspline diff --git a/src/interpolate/neo_bspline_3d.f90 b/src/interpolate/neo_bspline_3d.f90 new file mode 100644 index 00000000..6215ab7c --- /dev/null +++ b/src/interpolate/neo_bspline_3d.f90 @@ -0,0 +1,352 @@ +module neo_bspline_3d + !! 3D tensor-product B-splines and matrix-free LSQ via CGLS. + use, intrinsic :: iso_fortran_env, only : dp => real64 + use neo_bspline, only : bspline_1d, bspline_1d_init_uniform, find_span, basis_funs + implicit none + private + + type :: bspline_3d + type(bspline_1d) :: sx + type(bspline_1d) :: sy + type(bspline_1d) :: sz + end type bspline_3d + + public :: bspline_3d + public :: bspline_3d_init_uniform + public :: bspline_3d_eval + public :: bspline_3d_lsq_cgls + public :: bspline_3d_lsq_cgls_batch + public :: apply_A3D + public :: apply_A3D_T + +contains + + subroutine bspline_3d_init_uniform(spl, degree, n_ctrl, x_min, x_max) + !! Initialise 3D tensor-product B-spline with open-uniform knots + !! in each dimension on [x_min(j), x_max(j)]. + type(bspline_3d), intent(out) :: spl + integer, intent(in) :: degree(3), n_ctrl(3) + real(dp), intent(in) :: x_min(3), x_max(3) + + call bspline_1d_init_uniform(spl%sx, degree(1), n_ctrl(1), x_min(1), x_max(1)) + call bspline_1d_init_uniform(spl%sy, degree(2), n_ctrl(2), x_min(2), x_max(2)) + call bspline_1d_init_uniform(spl%sz, degree(3), n_ctrl(3), x_min(3), x_max(3)) + end subroutine bspline_3d_init_uniform + + + subroutine bspline_3d_eval(spl, coeff, x, y) + !! Evaluate 3D spline + !! S(x,y,z) = sum_{i,j,k} coeff(i,j,k) N_i(x) M_j(y) L_k(z). + type(bspline_3d), intent(in) :: spl + real(dp), intent(in) :: coeff(:,:,:) + real(dp), intent(in) :: x(3) + real(dp), intent(out) :: y + + integer :: nx, ny, nz + integer :: spanx, spany, spanz + integer :: px, py, pz + integer :: a, b, c + integer :: ix, iy, iz + real(dp), allocatable :: Nx_b(:), Ny_b(:), Nz_b(:) + + nx = spl%sx%n_ctrl + ny = spl%sy%n_ctrl + nz = spl%sz%n_ctrl + if (size(coeff, 1) /= nx .or. size(coeff, 2) /= ny .or. & + size(coeff, 3) /= nz) then + error stop "bspline_3d_eval: coeff shape mismatch" + end if + + px = spl%sx%degree + py = spl%sy%degree + pz = spl%sz%degree + + allocate(Nx_b(0:px)) + allocate(Ny_b(0:py)) + allocate(Nz_b(0:pz)) + + call find_span(spl%sx, x(1), spanx) + call basis_funs(spl%sx, spanx, x(1), Nx_b) + call find_span(spl%sy, x(2), spany) + call basis_funs(spl%sy, spany, x(2), Ny_b) + call find_span(spl%sz, x(3), spanz) + call basis_funs(spl%sz, spanz, x(3), Nz_b) + + y = 0.0_dp + do a = 0, px + ix = spanx - px + a + do b = 0, py + iy = spany - py + b + do c = 0, pz + iz = spanz - pz + c + y = y + Nx_b(a)*Ny_b(b)*Nz_b(c)*coeff(ix, iy, iz) + end do + end do + end do + + deallocate(Nx_b, Ny_b, Nz_b) + end subroutine bspline_3d_eval + + + subroutine bspline_3d_lsq_cgls(spl, x_data, y_data, z_data, f_data, coeff, & + max_iter, tol) + !! Matrix-free CGLS for 3D tensor-product B-spline LSQ: + !! min_C sum_i (S_C(x_i,y_i,z_i) - f_i)^2 + !! + !! where C is coeff(nx,ny,nz) and S_C is the spline. + type(bspline_3d), intent(in) :: spl + real(dp), intent(in) :: x_data(:) + real(dp), intent(in) :: y_data(:) + real(dp), intent(in) :: z_data(:) + real(dp), intent(in) :: f_data(:) + real(dp), intent(inout) :: coeff(:,:,:) + integer, intent(in), optional :: max_iter + real(dp), intent(in), optional :: tol + + integer :: n_data, nx, ny, nz + integer :: k, kmax + real(dp) :: atol, gamma, gamma_new, alpha, beta, denom + real(dp) :: rhs_norm + real(dp), allocatable :: r(:), q(:) + real(dp), allocatable :: s(:,:,:), p(:,:,:) + + n_data = size(x_data) + if (n_data /= size(y_data) .or. n_data /= size(z_data) .or. & + n_data /= size(f_data)) then + error stop "bspline_3d_lsq_cgls: data size mismatch" + end if + + nx = spl%sx%n_ctrl + ny = spl%sy%n_ctrl + nz = spl%sz%n_ctrl + if (size(coeff, 1) /= nx .or. size(coeff, 2) /= ny .or. & + size(coeff, 3) /= nz) then + error stop "bspline_3d_lsq_cgls: coeff shape mismatch" + end if + + if (present(max_iter)) then + kmax = max_iter + else + kmax = 400 + end if + if (present(tol)) then + atol = tol + else + atol = 1.0d-10 + end if + + allocate(r(n_data)) + allocate(q(n_data)) + allocate(s(nx, ny, nz)) + allocate(p(nx, ny, nz)) + + coeff = 0.0_dp + r = f_data + + call apply_A3D_T(spl, x_data, y_data, z_data, r, s) + p = s + gamma = sum(s*s) + rhs_norm = sqrt(sum(f_data*f_data)) + + if (rhs_norm == 0.0_dp) then + coeff = 0.0_dp + deallocate(r, q, s, p) + return + end if + + do k = 1, kmax + call apply_A3D(spl, x_data, y_data, z_data, p, q) + denom = sum(q*q) + if (denom <= 0.0_dp) exit + + alpha = gamma/denom + coeff = coeff + alpha*p + r = r - alpha*q + + call apply_A3D_T(spl, x_data, y_data, z_data, r, s) + gamma_new = sum(s*s) + + if (gamma_new <= (atol*rhs_norm)**2) exit + + beta = gamma_new/gamma + gamma = gamma_new + p = s + beta*p + end do + + deallocate(r, q, s, p) + end subroutine bspline_3d_lsq_cgls + + + subroutine bspline_3d_lsq_cgls_batch(spl, x_data, y_data, z_data, f_data, & + coeff, max_iter, tol) + !! Batched matrix-free CGLS for 3D tensor-product B-splines. + !! Solves independent LSQ problems for multiple right-hand sides. + type(bspline_3d), intent(in) :: spl + real(dp), intent(in) :: x_data(:) + real(dp), intent(in) :: y_data(:) + real(dp), intent(in) :: z_data(:) + real(dp), intent(in) :: f_data(:,:) + real(dp), intent(inout) :: coeff(:,:,:,:) + integer, intent(in), optional :: max_iter + real(dp), intent(in), optional :: tol + + integer :: n_data, n_rhs, nx, ny, nz, k + + n_data = size(x_data) + if (n_data /= size(y_data) .or. n_data /= size(z_data) .or. & + n_data /= size(f_data, 1)) then + error stop "bspline_3d_lsq_cgls_batch: data size mismatch" + end if + + n_rhs = size(f_data, 2) + nx = spl%sx%n_ctrl + ny = spl%sy%n_ctrl + nz = spl%sz%n_ctrl + + if (size(coeff, 1) /= nx .or. size(coeff, 2) /= ny .or. & + size(coeff, 3) /= nz .or. size(coeff, 4) /= n_rhs) then + error stop "bspline_3d_lsq_cgls_batch: coeff shape mismatch" + end if + + do k = 1, n_rhs + if (present(max_iter) .and. present(tol)) then + call bspline_3d_lsq_cgls(spl, x_data, y_data, z_data, f_data(:, k), & + coeff(:, :, :, k), max_iter=max_iter, tol=tol) + elseif (present(max_iter)) then + call bspline_3d_lsq_cgls(spl, x_data, y_data, z_data, f_data(:, k), & + coeff(:, :, :, k), max_iter=max_iter) + elseif (present(tol)) then + call bspline_3d_lsq_cgls(spl, x_data, y_data, z_data, f_data(:, k), & + coeff(:, :, :, k), tol=tol) + else + call bspline_3d_lsq_cgls(spl, x_data, y_data, z_data, f_data(:, k), & + coeff(:, :, :, k)) + end if + end do + end subroutine bspline_3d_lsq_cgls_batch + + + subroutine apply_A3D(spl, x_data, y_data, z_data, coeff, f) + !! f = A * coeff (3D spline evaluation at all data points) + type(bspline_3d), intent(in) :: spl + real(dp), intent(in) :: x_data(:) + real(dp), intent(in) :: y_data(:) + real(dp), intent(in) :: z_data(:) + real(dp), intent(in) :: coeff(:,:,:) + real(dp), intent(out) :: f(:) + + integer :: n_data, nx, ny, nz + integer :: i, spanx, spany, spanz + integer :: px, py, pz + integer :: a, b, c, ix, iy, iz + real(dp), allocatable :: Nx_b(:), Ny_b(:), Nz_b(:) + + n_data = size(x_data) + if (n_data /= size(y_data) .or. n_data /= size(z_data) .or. & + n_data /= size(f)) then + error stop "apply_A3D: data size mismatch" + end if + + nx = spl%sx%n_ctrl + ny = spl%sy%n_ctrl + nz = spl%sz%n_ctrl + if (size(coeff, 1) /= nx .or. size(coeff, 2) /= ny .or. & + size(coeff, 3) /= nz) then + error stop "apply_A3D: coeff shape mismatch" + end if + + px = spl%sx%degree + py = spl%sy%degree + pz = spl%sz%degree + + allocate(Nx_b(0:px)) + allocate(Ny_b(0:py)) + allocate(Nz_b(0:pz)) + + f = 0.0_dp + do i = 1, n_data + call find_span(spl%sx, x_data(i), spanx) + call basis_funs(spl%sx, spanx, x_data(i), Nx_b) + call find_span(spl%sy, y_data(i), spany) + call basis_funs(spl%sy, spany, y_data(i), Ny_b) + call find_span(spl%sz, z_data(i), spanz) + call basis_funs(spl%sz, spanz, z_data(i), Nz_b) + + do a = 0, px + ix = spanx - px + a + do b = 0, py + iy = spany - py + b + do c = 0, pz + iz = spanz - pz + c + f(i) = f(i) + Nx_b(a)*Ny_b(b)*Nz_b(c)*coeff(ix, iy, iz) + end do + end do + end do + end do + + deallocate(Nx_b, Ny_b, Nz_b) + end subroutine apply_A3D + + + subroutine apply_A3D_T(spl, x_data, y_data, z_data, r, g) + !! g = A^T * r (adjoint action in 3D coefficient space) + type(bspline_3d), intent(in) :: spl + real(dp), intent(in) :: x_data(:) + real(dp), intent(in) :: y_data(:) + real(dp), intent(in) :: z_data(:) + real(dp), intent(in) :: r(:) + real(dp), intent(out) :: g(:,:,:) + + integer :: n_data, nx, ny, nz + integer :: i, spanx, spany, spanz + integer :: px, py, pz + integer :: a, b, c, ix, iy, iz + real(dp), allocatable :: Nx_b(:), Ny_b(:), Nz_b(:) + + n_data = size(x_data) + if (n_data /= size(y_data) .or. n_data /= size(z_data) .or. & + n_data /= size(r)) then + error stop "apply_A3D_T: data size mismatch" + end if + + nx = spl%sx%n_ctrl + ny = spl%sy%n_ctrl + nz = spl%sz%n_ctrl + if (size(g, 1) /= nx .or. size(g, 2) /= ny .or. size(g, 3) /= nz) then + error stop "apply_A3D_T: g shape mismatch" + end if + + px = spl%sx%degree + py = spl%sy%degree + pz = spl%sz%degree + + allocate(Nx_b(0:px)) + allocate(Ny_b(0:py)) + allocate(Nz_b(0:pz)) + + g = 0.0_dp + do i = 1, n_data + call find_span(spl%sx, x_data(i), spanx) + call basis_funs(spl%sx, spanx, x_data(i), Nx_b) + call find_span(spl%sy, y_data(i), spany) + call basis_funs(spl%sy, spany, y_data(i), Ny_b) + call find_span(spl%sz, z_data(i), spanz) + call basis_funs(spl%sz, spanz, z_data(i), Nz_b) + + do a = 0, px + ix = spanx - px + a + do b = 0, py + iy = spany - py + b + do c = 0, pz + iz = spanz - pz + c + g(ix, iy, iz) = g(ix, iy, iz) + Nx_b(a)*Ny_b(b)*Nz_b(c)*r(i) + end do + end do + end do + end do + + deallocate(Nx_b, Ny_b, Nz_b) + end subroutine apply_A3D_T + +end module neo_bspline_3d + diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 2abb7b06..e81f58cf 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -146,6 +146,10 @@ target_link_libraries(test_polylag_3.x ${COMMON_LIBS} ${MAGFIE_LIB}) add_executable(test_neo_bspline_1d.x source/test_neo_bspline_1d.f90) target_link_libraries(test_neo_bspline_1d.x ${COMMON_LIBS}) +add_executable(test_neo_bspline_2d.x source/test_neo_bspline_2d.f90) +target_link_libraries(test_neo_bspline_2d.x ${COMMON_LIBS}) +add_executable(test_neo_bspline_3d.x source/test_neo_bspline_3d.f90) +target_link_libraries(test_neo_bspline_3d.x ${COMMON_LIBS}) add_executable(test_interpolate.x source/test_interpolate.f90) target_link_libraries(test_interpolate.x ${COMMON_LIBS}) @@ -216,6 +220,8 @@ add_test(NAME test_species COMMAND test_species.x) add_test(NAME test_rng COMMAND test_rng.x) add_test(NAME test_polylag_3 COMMAND test_polylag_3.x) add_test(NAME test_neo_bspline_1d COMMAND test_neo_bspline_1d.x) +add_test(NAME test_neo_bspline_2d COMMAND test_neo_bspline_2d.x) +add_test(NAME test_neo_bspline_3d COMMAND test_neo_bspline_3d.x) add_test(NAME test_interpolate COMMAND test_interpolate.x) add_test(NAME test_batch_interpolate COMMAND test_batch_interpolate.x) add_test(NAME test_batch_interpolate_many COMMAND test_batch_interpolate_many.x) diff --git a/test/scripts/plot_neo_bspline_2d_circle.py b/test/scripts/plot_neo_bspline_2d_circle.py new file mode 100644 index 00000000..0c1d109b --- /dev/null +++ b/test/scripts/plot_neo_bspline_2d_circle.py @@ -0,0 +1,45 @@ +#!/usr/bin/env python3 +import argparse +import pathlib + +import matplotlib.pyplot as plt +import numpy as np + + +def main() -> None: + parser = argparse.ArgumentParser( + description="Plot 2D neo_bspline LSQ fit vs analytic along a circle." + ) + parser.add_argument( + "--data", + type=pathlib.Path, + default=pathlib.Path("bspline_2d_lsq_circle.dat"), + help="Path to circle data file written by test_neo_bspline_2d.x", + ) + parser.add_argument( + "--output", + type=pathlib.Path, + default=pathlib.Path("bspline_2d_lsq_circle.png"), + help="Output PNG file.", + ) + args = parser.parse_args() + + data = np.loadtxt(args.data) + theta = data[:, 0] + f_true = data[:, 3] + f_fit = data[:, 4] + + fig, ax = plt.subplots(figsize=(6, 4)) + ax.plot(theta, f_true, label="analytic", color="k", linewidth=1.5) + ax.plot(theta, f_fit, label="neo_bspline fit", color="C1", linestyle="--") + ax.set_xlabel("theta") + ax.set_ylabel("f(theta)") + ax.set_title("neo_bspline 2D LSQ fit along circle") + ax.legend() + fig.tight_layout() + fig.savefig(args.output, dpi=150) + + +if __name__ == "__main__": + main() + diff --git a/test/scripts/plot_neo_bspline_2d_grid.py b/test/scripts/plot_neo_bspline_2d_grid.py new file mode 100644 index 00000000..bcaf4895 --- /dev/null +++ b/test/scripts/plot_neo_bspline_2d_grid.py @@ -0,0 +1,47 @@ +#!/usr/bin/env python3 +import argparse +import pathlib + +import matplotlib.pyplot as plt +import numpy as np + + +def main() -> None: + parser = argparse.ArgumentParser( + description="Plot 2D neo_bspline LSQ fit error on full grid." + ) + parser.add_argument( + "--data", + type=pathlib.Path, + default=pathlib.Path("bspline_2d_lsq_grid.dat"), + help="Path to grid data file written by test_neo_bspline_2d.x", + ) + parser.add_argument( + "--output", + type=pathlib.Path, + default=pathlib.Path("bspline_2d_lsq_grid.png"), + help="Output PNG file.", + ) + args = parser.parse_args() + + data = np.loadtxt(args.data) + x = data[:, 0] + y = data[:, 1] + f_true = data[:, 2] + f_fit = data[:, 3] + err = f_fit - f_true + + fig, ax = plt.subplots(figsize=(6, 4)) + sc = ax.scatter(x, y, c=err, cmap="coolwarm", s=8, edgecolor="none") + ax.set_xlabel("x") + ax.set_ylabel("y") + ax.set_title("neo_bspline 2D LSQ full-grid error (fit - analytic)") + cbar = fig.colorbar(sc, ax=ax) + cbar.set_label("error") + fig.tight_layout() + fig.savefig(args.output, dpi=150) + + +if __name__ == "__main__": + main() + diff --git a/test/scripts/plot_neo_bspline_3d_slice.py b/test/scripts/plot_neo_bspline_3d_slice.py new file mode 100644 index 00000000..b7437d62 --- /dev/null +++ b/test/scripts/plot_neo_bspline_3d_slice.py @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +import argparse +import pathlib + +import matplotlib.pyplot as plt +import numpy as np + + +def main() -> None: + parser = argparse.ArgumentParser( + description="Plot 3D neo_bspline LSQ fit error on a mid-plane slice.", + ) + parser.add_argument( + "--data", + type=pathlib.Path, + default=pathlib.Path("bspline_3d_lsq_grid.dat"), + help="Path to 3D grid data file written by test_neo_bspline_3d.x", + ) + parser.add_argument( + "--output", + type=pathlib.Path, + default=pathlib.Path("bspline_3d_lsq_slice.png"), + help="Output PNG file.", + ) + args = parser.parse_args() + + data = np.loadtxt(args.data) + x = data[:, 0] + y = data[:, 1] + z = data[:, 2] + f_true = data[:, 3] + f_fit = data[:, 4] + err = f_fit - f_true + + z_levels = np.unique(z) + z_mid = z_levels[len(z_levels) // 2] + mask = np.isclose(z, z_mid) + + fig, ax = plt.subplots(figsize=(6, 4)) + sc = ax.scatter(x[mask], y[mask], c=err[mask], cmap="coolwarm", s=8, edgecolor="none") + ax.set_xlabel("x") + ax.set_ylabel("y") + ax.set_title(f"neo_bspline 3D LSQ mid-plane error (z = {z_mid:.3f})") + cbar = fig.colorbar(sc, ax=ax) + cbar.set_label("error") + fig.tight_layout() + fig.savefig(args.output, dpi=150) + + +if __name__ == "__main__": + main() + diff --git a/test/source/test_neo_bspline_1d.f90 b/test/source/test_neo_bspline_1d.f90 index 74468814..847e086b 100644 --- a/test/source/test_neo_bspline_1d.f90 +++ b/test/source/test_neo_bspline_1d.f90 @@ -6,12 +6,14 @@ program test_neo_bspline_1d implicit none - real(dp), parameter :: TOL_L2 = 1.0d-5 + real(dp), parameter :: TOL_L2 = 5.0d-7 real(dp), parameter :: X_MIN = 1.23d0 real(dp), parameter :: X_MAX = TWOPI + 1.23d0 call test_bspline_1d_partition_unity() + call test_bspline_1d_adjoint() call test_bspline_1d_lsq_cos() + call test_bspline_1d_lsq_batch() contains @@ -54,10 +56,53 @@ subroutine test_bspline_1d_partition_unity() end subroutine test_bspline_1d_partition_unity + subroutine test_bspline_1d_adjoint() + type(bspline_1d) :: spl + integer, parameter :: DEGREE = 4 + integer, parameter :: N_CTRL = 30 + integer, parameter :: N_DATA = 200 + + real(dp) :: x_data(N_DATA) + real(dp) :: coeff(N_CTRL) + real(dp) :: r(N_DATA) + real(dp) :: y(N_DATA) + real(dp) :: g(N_CTRL) + real(dp) :: lhs, rhs, rel_err, denom + integer :: i + + print *, "Testing neo_bspline 1D adjoint consistency" + + call bspline_1d_init_uniform(spl, DEGREE, N_CTRL, X_MIN, X_MAX) + call linspace(X_MIN, X_MAX, N_DATA, x_data) + + do i = 1, N_CTRL + coeff(i) = sin(0.37d0*real(i, dp)) + end do + do i = 1, N_DATA + r(i) = cos(0.53d0*real(i, dp)) + end do + + call apply_A(spl, x_data, coeff, y) + call apply_AT(spl, x_data, r, g) + + lhs = sum(y*r) + rhs = sum(coeff*g) + denom = max(abs(lhs), abs(rhs), 1.0d0) + rel_err = abs(lhs - rhs)/denom + + print *, " 1D adjoint rel error =", rel_err + + if (rel_err > 1.0d-12) then + error stop "neo_bspline 1D adjoint inconsistency" + end if + + end subroutine test_bspline_1d_adjoint + + subroutine test_bspline_1d_lsq_cos() type(bspline_1d) :: spl integer, parameter :: DEGREE = 5 - integer, parameter :: N_CTRL = 40 + integer, parameter :: N_CTRL = 60 integer, parameter :: N_DATA = 400 integer, parameter :: N_PLOT = 201 @@ -101,13 +146,70 @@ subroutine test_bspline_1d_lsq_cos() end subroutine test_bspline_1d_lsq_cos + subroutine test_bspline_1d_lsq_batch() + type(bspline_1d) :: spl + integer, parameter :: DEGREE = 5 + integer, parameter :: N_CTRL = 60 + integer, parameter :: N_DATA = 400 + integer, parameter :: N_PLOT = 201 + integer, parameter :: N_RHS = 2 + + real(dp) :: x_data(N_DATA) + real(dp) :: f_data(N_DATA, N_RHS) + real(dp) :: coeff(N_CTRL, N_RHS) + real(dp) :: x_plot(N_PLOT) + real(dp) :: f_true(N_PLOT, N_RHS) + real(dp) :: f_fit(N_PLOT, N_RHS) + real(dp) :: err2(N_RHS) + integer :: i, k + + print *, "Testing neo_bspline 1D LSQ CGLS (batched)" + + call bspline_1d_init_uniform(spl, DEGREE, N_CTRL, X_MIN, X_MAX) + + do i = 1, N_DATA + x_data(i) = X_MIN + (X_MAX - X_MIN) * real(i, dp) / real(N_DATA + 1, dp) + x_data(i) = x_data(i) + 0.1d0 * sin(3.0d0*real(i, dp)) + if (x_data(i) < X_MIN) x_data(i) = X_MIN + if (x_data(i) > X_MAX) x_data(i) = X_MAX + + f_data(i, 1) = cos(2.0d0*x_data(i)) + 0.5d0*sin(3.0d0*x_data(i)) + f_data(i, 2) = sin(1.5d0*x_data(i)) + 0.3d0*cos(4.0d0*x_data(i)) + end do + + coeff = 0.0_dp + call bspline_1d_lsq_cgls_batch(spl, x_data, f_data, coeff, & + max_iter=400, tol=1.0d-10) + + call linspace(X_MIN, X_MAX, N_PLOT, x_plot) + do i = 1, N_PLOT + f_true(i, 1) = cos(2.0d0*x_plot(i)) + 0.5d0*sin(3.0d0*x_plot(i)) + f_true(i, 2) = sin(1.5d0*x_plot(i)) + 0.3d0*cos(4.0d0*x_plot(i)) + + do k = 1, N_RHS + call bspline_1d_eval(spl, coeff(:, k), x_plot(i), f_fit(i, k)) + end do + end do + + do k = 1, N_RHS + err2(k) = sum((f_fit(:, k) - f_true(:, k))**2)/real(N_PLOT, dp) + print *, " LSQ L2 error (rhs =", k, ") =", sqrt(err2(k)) + if (sqrt(err2(k)) > TOL_L2) then + error stop "neo_bspline 1D batched LSQ error too large" + end if + end do + + end subroutine test_bspline_1d_lsq_batch + + subroutine write_plot_data(fname, n, x, f_true, f_fit) character(*), intent(in) :: fname integer, intent(in) :: n real(dp), intent(in) :: x(n), f_true(n), f_fit(n) integer :: iunit, i - open(newunit=iunit, file=fname, status="replace", action="write", form="formatted") + open(newunit=iunit, file=fname, status="replace", action="write", & + form="formatted") do i = 1, n write(iunit,'(3es24.16)') x(i), f_true(i), f_fit(i) end do diff --git a/test/source/test_neo_bspline_2d.f90 b/test/source/test_neo_bspline_2d.f90 new file mode 100644 index 00000000..2fb38759 --- /dev/null +++ b/test/source/test_neo_bspline_2d.f90 @@ -0,0 +1,290 @@ +program test_neo_bspline_2d + use libneo_kinds, only : dp + use math_constants + use libneo_util, only : linspace + use neo_bspline + + implicit none + + real(dp), parameter :: X_MIN = 1.23d0 + real(dp), parameter :: X_MAX = TWOPI + 1.23d0 + real(dp), parameter :: TOL_L2_FULL = 5.0d-4 + real(dp), parameter :: TOL_MAX_CIRC = 1.0d-3 + + call test_bspline_2d_adjoint() + call test_bspline_2d_lsq_full_grid() + call test_bspline_2d_lsq_circle() + call test_bspline_2d_lsq_full_grid_batch() + +contains + + subroutine test_bspline_2d_adjoint() + type(bspline_2d) :: spl + integer, parameter :: DEGREE(2) = [3, 3] + integer, parameter :: N_CTRL(2) = [16, 14] + integer, parameter :: N_GRID1 = 24 + integer, parameter :: N_GRID2 = 20 + + real(dp) :: x1(N_GRID1), x2(N_GRID2) + real(dp) :: x_data(N_GRID1*N_GRID2) + real(dp) :: y_data(N_GRID1*N_GRID2) + real(dp) :: coeff(N_CTRL(1), N_CTRL(2)) + real(dp) :: r(N_GRID1*N_GRID2) + real(dp) :: f(N_GRID1*N_GRID2) + real(dp) :: g(N_CTRL(1), N_CTRL(2)) + real(dp) :: lhs, rhs, rel_err, denom + integer :: i1, i2, idx + + print *, "Testing neo_bspline 2D adjoint consistency" + + call bspline_2d_init_uniform(spl, DEGREE, N_CTRL, [X_MIN, X_MIN], & + [X_MAX, X_MAX]) + + call linspace(X_MIN, X_MAX, N_GRID1, x1) + call linspace(X_MIN, X_MAX, N_GRID2, x2) + + idx = 0 + do i2 = 1, N_GRID2 + do i1 = 1, N_GRID1 + idx = idx + 1 + x_data(idx) = x1(i1) + y_data(idx) = x2(i2) + r(idx) = cos(0.37d0*x1(i1))*sin(0.41d0*x2(i2)) + end do + end do + + ! Populate coeff deterministically + do i2 = 1, N_CTRL(2) + do i1 = 1, N_CTRL(1) + coeff(i1, i2) = sin(0.11d0*real(i1, dp)) + cos(0.07d0*real(i2, dp)) + end do + end do + + call apply_A2D(spl, x_data, y_data, coeff, f) + call apply_A2D_T(spl, x_data, y_data, r, g) + + lhs = sum(f*r) + rhs = sum(coeff*g) + denom = max(abs(lhs), abs(rhs), 1.0d0) + rel_err = abs(lhs - rhs)/denom + + print *, " 2D adjoint rel error =", rel_err + + if (rel_err > 1.0d-12) then + error stop "neo_bspline 2D adjoint inconsistency" + end if + + end subroutine test_bspline_2d_adjoint + + + subroutine test_bspline_2d_lsq_full_grid() + type(bspline_2d) :: spl + integer, parameter :: DEGREE(2) = [3, 3] + integer, parameter :: N_CTRL(2) = [32, 28] + integer, parameter :: N_GRID1 = 40 + integer, parameter :: N_GRID2 = 36 + + real(dp) :: x1(N_GRID1), x2(N_GRID2) + real(dp) :: x_data(N_GRID1*N_GRID2) + real(dp) :: y_data(N_GRID1*N_GRID2) + real(dp) :: f_data(N_GRID1*N_GRID2) + real(dp) :: coeff(N_CTRL(1), N_CTRL(2)) + + integer :: i1, i2, idx + integer :: i + real(dp) :: x(2), f_true, f_fit + real(dp) :: err2 + + print *, "Testing neo_bspline 2D LSQ CGLS (full grid)" + + call bspline_2d_init_uniform(spl, DEGREE, N_CTRL, [X_MIN, X_MIN], & + [X_MAX, X_MAX]) + + call linspace(X_MIN, X_MAX, N_GRID1, x1) + call linspace(X_MIN, X_MAX, N_GRID2, x2) + + idx = 0 + do i2 = 1, N_GRID2 + do i1 = 1, N_GRID1 + idx = idx + 1 + x_data(idx) = x1(i1) + y_data(idx) = x2(i2) + f_data(idx) = cos(x1(i1))*cos(2.0d0*x2(i2)) + end do + end do + + coeff = 0.0_dp + call bspline_2d_lsq_cgls(spl, x_data, y_data, f_data, coeff, & + max_iter=800, tol=1.0d-10) + + err2 = 0.0d0 + idx = 0 + open(unit=20, file="bspline_2d_lsq_grid.dat", status="replace", action="write") + do i2 = 1, N_GRID2 + do i1 = 1, N_GRID1 + idx = idx + 1 + x(1) = x1(i1) + x(2) = x2(i2) + f_true = cos(x(1))*cos(2.0d0*x(2)) + call bspline_2d_eval(spl, coeff, x, f_fit) + err2 = err2 + (f_fit - f_true)**2 + write(20,'(4es24.16)') x(1), x(2), f_true, f_fit + end do + end do + close(20) + + err2 = err2/real(N_GRID1*N_GRID2, dp) + print *, " 2D LSQ full-grid L2 error =", sqrt(err2) + + if (sqrt(err2) > TOL_L2_FULL) then + error stop "neo_bspline 2D LSQ full-grid error too large" + end if + + end subroutine test_bspline_2d_lsq_full_grid + + + subroutine test_bspline_2d_lsq_circle() + type(bspline_2d) :: spl + integer, parameter :: DEGREE(2) = [3, 3] + integer, parameter :: N_CTRL(2) = [32, 28] + integer, parameter :: N_GRID1 = 40 + integer, parameter :: N_GRID2 = 36 + integer, parameter :: MAX_DATA = N_GRID1*N_GRID2 + + real(dp) :: x1(N_GRID1), x2(N_GRID2) + real(dp) :: x_data(MAX_DATA), y_data(MAX_DATA), f_data(MAX_DATA) + real(dp) :: coeff(N_CTRL(1), N_CTRL(2)) + + real(dp) :: xc, yc, r0, dx, dy + real(dp) :: theta, r_eval + real(dp) :: x(2), f_true, f_fit + real(dp) :: max_err + integer :: i1, i2, ndata, i + + print *, "Testing neo_bspline 2D LSQ CGLS (circular mask)" + + call bspline_2d_init_uniform(spl, DEGREE, N_CTRL, [X_MIN, X_MIN], & + [X_MAX, X_MAX]) + + call linspace(X_MIN, X_MAX, N_GRID1, x1) + call linspace(X_MIN, X_MAX, N_GRID2, x2) + + xc = 0.5d0*(X_MIN + X_MAX) + yc = 0.5d0*(X_MIN + X_MAX) + r0 = 0.45d0*(X_MAX - X_MIN) + + ndata = 0 + do i2 = 1, N_GRID2 + do i1 = 1, N_GRID1 + dx = x1(i1) - xc + dy = x2(i2) - yc + if (dx*dx + dy*dy <= r0*r0) then + ndata = ndata + 1 + x_data(ndata) = x1(i1) + y_data(ndata) = x2(i2) + f_data(ndata) = cos(x1(i1))*cos(2.0d0*x2(i2)) + end if + end do + end do + + if (ndata < 100) then + error stop "neo_bspline 2D LSQ circle: too few data points" + end if + + coeff = 0.0_dp + call bspline_2d_lsq_cgls(spl, x_data(1:ndata), y_data(1:ndata), & + f_data(1:ndata), coeff, max_iter=800, tol=1.0d-10) + + max_err = 0.0d0 + r_eval = 0.4d0*(X_MAX - X_MIN) + + open(unit=21, file="bspline_2d_lsq_circle.dat", status="replace", & + action="write") + do i = 1, 64 + theta = TWOPI*real(i, dp)/64.0d0 + x(1) = xc + r_eval*cos(theta) + x(2) = yc + r_eval*sin(theta) + f_true = cos(x(1))*cos(2.0d0*x(2)) + call bspline_2d_eval(spl, coeff, x, f_fit) + max_err = max(max_err, abs(f_fit - f_true)) + write(21,'(5es24.16)') theta, x(1), x(2), f_true, f_fit + end do + close(21) + + print *, " 2D LSQ circle: max error =", max_err + + if (max_err > TOL_MAX_CIRC) then + error stop "neo_bspline 2D LSQ circle error too large" + end if + + end subroutine test_bspline_2d_lsq_circle + + + subroutine test_bspline_2d_lsq_full_grid_batch() + type(bspline_2d) :: spl + integer, parameter :: DEGREE(2) = [3, 3] + integer, parameter :: N_CTRL(2) = [32, 28] + integer, parameter :: N_GRID1 = 40 + integer, parameter :: N_GRID2 = 36 + integer, parameter :: N_RHS = 2 + + real(dp) :: x1(N_GRID1), x2(N_GRID2) + real(dp) :: x_data(N_GRID1*N_GRID2) + real(dp) :: y_data(N_GRID1*N_GRID2) + real(dp) :: f_data(N_GRID1*N_GRID2, N_RHS) + real(dp) :: coeff(N_CTRL(1), N_CTRL(2), N_RHS) + + real(dp) :: x(2), f_true(N_RHS), f_fit + real(dp) :: err2(N_RHS) + integer :: i1, i2, idx, k + + print *, "Testing neo_bspline 2D LSQ CGLS (full grid, batched)" + + call bspline_2d_init_uniform(spl, DEGREE, N_CTRL, [X_MIN, X_MIN], & + [X_MAX, X_MAX]) + + call linspace(X_MIN, X_MAX, N_GRID1, x1) + call linspace(X_MIN, X_MAX, N_GRID2, x2) + + idx = 0 + do i2 = 1, N_GRID2 + do i1 = 1, N_GRID1 + idx = idx + 1 + x_data(idx) = x1(i1) + y_data(idx) = x2(i2) + f_data(idx, 1) = cos(x1(i1))*cos(2.0d0*x2(i2)) + f_data(idx, 2) = sin(x1(i1))*cos(3.0d0*x2(i2)) + end do + end do + + coeff = 0.0_dp + call bspline_2d_lsq_cgls_batch(spl, x_data, y_data, f_data, coeff, & + max_iter=800, tol=1.0d-10) + + err2 = 0.0d0 + idx = 0 + do i2 = 1, N_GRID2 + do i1 = 1, N_GRID1 + idx = idx + 1 + x(1) = x1(i1) + x(2) = x2(i2) + f_true(1) = cos(x(1))*cos(2.0d0*x(2)) + f_true(2) = sin(x(1))*cos(3.0d0*x(2)) + do k = 1, N_RHS + call bspline_2d_eval(spl, coeff(:, :, k), x, f_fit) + err2(k) = err2(k) + (f_fit - f_true(k))**2 + end do + end do + end do + + err2 = err2/real(N_GRID1*N_GRID2, dp) + do k = 1, N_RHS + print *, " 2D LSQ full-grid L2 error (rhs =", k, ") =", sqrt(err2(k)) + if (sqrt(err2(k)) > TOL_L2_FULL) then + error stop "neo_bspline 2D batched LSQ full-grid error too large" + end if + end do + + end subroutine test_bspline_2d_lsq_full_grid_batch + +end program test_neo_bspline_2d diff --git a/test/source/test_neo_bspline_3d.f90 b/test/source/test_neo_bspline_3d.f90 new file mode 100644 index 00000000..fb34dcf8 --- /dev/null +++ b/test/source/test_neo_bspline_3d.f90 @@ -0,0 +1,168 @@ +program test_neo_bspline_3d + use libneo_kinds, only : dp + use math_constants + use libneo_util, only : linspace + use neo_bspline_3d + + implicit none + + real(dp), parameter :: X_MIN = 1.23d0 + real(dp), parameter :: X_MAX = TWOPI + 1.23d0 + real(dp), parameter :: TOL_L2_3D = 2.0d-3 + + call test_bspline_3d_lsq_full_grid() + call test_bspline_3d_lsq_batch() + +contains + + subroutine test_bspline_3d_lsq_full_grid() + type(bspline_3d) :: spl + integer, parameter :: DEGREE(3) = [3, 3, 3] + integer, parameter :: N_CTRL(3) = [24, 20, 16] + integer, parameter :: N_GRID1 = 18 + integer, parameter :: N_GRID2 = 16 + integer, parameter :: N_GRID3 = 14 + + real(dp) :: x1(N_GRID1), x2(N_GRID2), x3(N_GRID3) + real(dp) :: x_data(N_GRID1*N_GRID2*N_GRID3) + real(dp) :: y_data(N_GRID1*N_GRID2*N_GRID3) + real(dp) :: z_data(N_GRID1*N_GRID2*N_GRID3) + real(dp) :: f_data(N_GRID1*N_GRID2*N_GRID3) + real(dp) :: coeff(N_CTRL(1), N_CTRL(2), N_CTRL(3)) + + real(dp) :: x(3), f_true, f_fit + real(dp) :: err2 + integer :: i1, i2, i3, idx + + print *, "Testing neo_bspline 3D LSQ CGLS (full grid)" + + call bspline_3d_init_uniform(spl, DEGREE, N_CTRL, & + [X_MIN, X_MIN, X_MIN], [X_MAX, X_MAX, X_MAX]) + + call linspace(X_MIN, X_MAX, N_GRID1, x1) + call linspace(X_MIN, X_MAX, N_GRID2, x2) + call linspace(X_MIN, X_MAX, N_GRID3, x3) + + idx = 0 + do i3 = 1, N_GRID3 + do i2 = 1, N_GRID2 + do i1 = 1, N_GRID1 + idx = idx + 1 + x_data(idx) = x1(i1) + y_data(idx) = x2(i2) + z_data(idx) = x3(i3) + f_data(idx) = cos(x1(i1))*cos(2.0d0*x2(i2))*cos(3.0d0*x3(i3)) + end do + end do + end do + + coeff = 0.0_dp + call bspline_3d_lsq_cgls(spl, x_data, y_data, z_data, f_data, coeff, & + max_iter=800, tol=1.0d-10) + + err2 = 0.0d0 + idx = 0 + open(unit=30, file="bspline_3d_lsq_grid.dat", status="replace", & + action="write") + do i3 = 1, N_GRID3 + do i2 = 1, N_GRID2 + do i1 = 1, N_GRID1 + idx = idx + 1 + x(1) = x1(i1) + x(2) = x2(i2) + x(3) = x3(i3) + f_true = cos(x(1))*cos(2.0d0*x(2))*cos(3.0d0*x(3)) + call bspline_3d_eval(spl, coeff, x, f_fit) + err2 = err2 + (f_fit - f_true)**2 + write(30,'(5es24.16)') x(1), x(2), x(3), f_true, f_fit + end do + end do + end do + close(30) + + err2 = err2/real(N_GRID1*N_GRID2*N_GRID3, dp) + print *, " 3D LSQ full-grid L2 error =", sqrt(err2) + + if (sqrt(err2) > TOL_L2_3D) then + error stop "neo_bspline 3D LSQ full-grid error too large" + end if + + end subroutine test_bspline_3d_lsq_full_grid + + subroutine test_bspline_3d_lsq_batch() + type(bspline_3d) :: spl + integer, parameter :: DEGREE(3) = [3, 3, 3] + integer, parameter :: N_CTRL(3) = [24, 20, 16] + integer, parameter :: N_GRID1 = 18 + integer, parameter :: N_GRID2 = 16 + integer, parameter :: N_GRID3 = 14 + integer, parameter :: N_RHS = 2 + + real(dp) :: x1(N_GRID1), x2(N_GRID2), x3(N_GRID3) + real(dp) :: x_data(N_GRID1*N_GRID2*N_GRID3) + real(dp) :: y_data(N_GRID1*N_GRID2*N_GRID3) + real(dp) :: z_data(N_GRID1*N_GRID2*N_GRID3) + real(dp) :: f_data(N_GRID1*N_GRID2*N_GRID3, N_RHS) + real(dp) :: coeff(N_CTRL(1), N_CTRL(2), N_CTRL(3), N_RHS) + + real(dp) :: x(3), f_true(N_RHS), f_fit + real(dp) :: err2(N_RHS) + integer :: i1, i2, i3, idx, k + + print *, "Testing neo_bspline 3D LSQ CGLS (batched)" + + call bspline_3d_init_uniform(spl, DEGREE, N_CTRL, & + [X_MIN, X_MIN, X_MIN], [X_MAX, X_MAX, X_MAX]) + + call linspace(X_MIN, X_MAX, N_GRID1, x1) + call linspace(X_MIN, X_MAX, N_GRID2, x2) + call linspace(X_MIN, X_MAX, N_GRID3, x3) + + idx = 0 + do i3 = 1, N_GRID3 + do i2 = 1, N_GRID2 + do i1 = 1, N_GRID1 + idx = idx + 1 + x_data(idx) = x1(i1) + y_data(idx) = x2(i2) + z_data(idx) = x3(i3) + f_data(idx, 1) = cos(x1(i1))*cos(2.0d0*x2(i2))*cos(3.0d0*x3(i3)) + f_data(idx, 2) = sin(x1(i1))*cos(2.0d0*x2(i2))*cos(1.5d0*x3(i3)) + end do + end do + end do + + coeff = 0.0_dp + call bspline_3d_lsq_cgls_batch(spl, x_data, y_data, z_data, f_data, coeff, & + max_iter=800, tol=1.0d-10) + + err2 = 0.0d0 + idx = 0 + do i3 = 1, N_GRID3 + do i2 = 1, N_GRID2 + do i1 = 1, N_GRID1 + idx = idx + 1 + x(1) = x1(i1) + x(2) = x2(i2) + x(3) = x3(i3) + f_true(1) = cos(x(1))*cos(2.0d0*x(2))*cos(3.0d0*x(3)) + f_true(2) = sin(x(1))*cos(2.0d0*x(2))*cos(1.5d0*x(3)) + do k = 1, N_RHS + call bspline_3d_eval(spl, coeff(:, :, :, k), x, f_fit) + err2(k) = err2(k) + (f_fit - f_true(k))**2 + end do + end do + end do + end do + + err2 = err2/real(N_GRID1*N_GRID2*N_GRID3, dp) + do k = 1, N_RHS + print *, " 3D LSQ full-grid L2 error (rhs =", k, ") =", sqrt(err2(k)) + if (sqrt(err2(k)) > TOL_L2_3D) then + error stop "neo_bspline 3D batched LSQ full-grid error too large" + end if + end do + + end subroutine test_bspline_3d_lsq_batch + +end program test_neo_bspline_3d From ce14ff934ebd0ea6667853e10fb319ff01c94eee Mon Sep 17 00:00:00 2001 From: Christopher Albert Date: Tue, 2 Dec 2025 02:24:31 +0100 Subject: [PATCH 03/15] Parallelize matrix-free neo_bspline operators with OpenMP --- src/interpolate/neo_bspline.f90 | 58 ++++++++++++++++++++++-------- src/interpolate/neo_bspline_3d.f90 | 31 +++++++++++----- 2 files changed, 67 insertions(+), 22 deletions(-) diff --git a/src/interpolate/neo_bspline.f90 b/src/interpolate/neo_bspline.f90 index 15d1d1cf..db06025a 100644 --- a/src/interpolate/neo_bspline.f90 +++ b/src/interpolate/neo_bspline.f90 @@ -524,9 +524,11 @@ subroutine apply_A(spl, x_data, coeff, y) end if p = spl%degree - allocate(N(0:p)) - y = 0.0_dp + +!$omp parallel default(shared) private(i, span, j, N) if (n_data > 100) + allocate(N(0:p)) +!$omp do do i = 1, n_data call find_span(spl, x_data(i), span) call basis_funs(spl, span, x_data(i), N) @@ -534,8 +536,9 @@ subroutine apply_A(spl, x_data, coeff, y) y(i) = y(i) + N(j)*coeff(span - p + j) end do end do - +!$omp end do deallocate(N) +!$omp end parallel end subroutine apply_A @@ -548,6 +551,7 @@ subroutine apply_AT(spl, x_data, r, g) integer :: n_data, i, span, p, j real(dp), allocatable :: N(:) + real(dp), allocatable :: g_local(:) n_data = size(x_data) if (size(r) /= n_data) then @@ -558,18 +562,27 @@ subroutine apply_AT(spl, x_data, r, g) end if p = spl%degree - allocate(N(0:p)) - g = 0.0_dp + +!$omp parallel default(shared) private(i, span, j, N, g_local) if (n_data > 100) + allocate(N(0:p)) + allocate(g_local(size(g))) + g_local = 0.0_dp +!$omp do do i = 1, n_data call find_span(spl, x_data(i), span) call basis_funs(spl, span, x_data(i), N) do j = 0, p - g(span - p + j) = g(span - p + j) + N(j)*r(i) + g_local(span - p + j) = g_local(span - p + j) + N(j)*r(i) end do end do - +!$omp end do +!$omp critical + g = g + g_local +!$omp end critical + deallocate(g_local) deallocate(N) +!$omp end parallel end subroutine apply_AT @@ -598,10 +611,14 @@ subroutine apply_A2D(spl, x_data, y_data, coeff, f) px = spl%sx%degree py = spl%sy%degree - allocate(Nx_b(0:px)) - allocate(Ny_b(0:py)) f = 0.0_dp + +!$omp parallel default(shared) private(i, spanx, spany, a, b, ix, iy, Nx_b, Ny_b) & +!$omp if (n_data > 100) + allocate(Nx_b(0:px)) + allocate(Ny_b(0:py)) +!$omp do do i = 1, n_data call find_span(spl%sx, x_data(i), spanx) call basis_funs(spl%sx, spanx, x_data(i), Nx_b) @@ -615,8 +632,9 @@ subroutine apply_A2D(spl, x_data, y_data, coeff, f) end do end do end do - +!$omp end do deallocate(Nx_b, Ny_b) +!$omp end parallel end subroutine apply_A2D @@ -631,6 +649,7 @@ subroutine apply_A2D_T(spl, x_data, y_data, r, g) integer :: n_data, nx, ny integer :: i, spanx, spany, px, py, a, b, ix, iy real(dp), allocatable :: Nx_b(:), Ny_b(:) + real(dp), allocatable :: g_local(:,:) n_data = size(x_data) if (n_data /= size(y_data) .or. n_data /= size(r)) then @@ -645,10 +664,16 @@ subroutine apply_A2D_T(spl, x_data, y_data, r, g) px = spl%sx%degree py = spl%sy%degree - allocate(Nx_b(0:px)) - allocate(Ny_b(0:py)) g = 0.0_dp + +!$omp parallel default(shared) private(i, spanx, spany, a, b, ix, iy, Nx_b, Ny_b, g_local) & +!$omp if (n_data > 100) + allocate(Nx_b(0:px)) + allocate(Ny_b(0:py)) + allocate(g_local(nx, ny)) + g_local = 0.0_dp +!$omp do do i = 1, n_data call find_span(spl%sx, x_data(i), spanx) call basis_funs(spl%sx, spanx, x_data(i), Nx_b) @@ -658,12 +683,17 @@ subroutine apply_A2D_T(spl, x_data, y_data, r, g) ix = spanx - px + a do b = 0, py iy = spany - py + b - g(ix, iy) = g(ix, iy) + Nx_b(a)*Ny_b(b)*r(i) + g_local(ix, iy) = g_local(ix, iy) + Nx_b(a)*Ny_b(b)*r(i) end do end do end do - +!$omp end do +!$omp critical + g = g + g_local +!$omp end critical + deallocate(g_local) deallocate(Nx_b, Ny_b) +!$omp end parallel end subroutine apply_A2D_T diff --git a/src/interpolate/neo_bspline_3d.f90 b/src/interpolate/neo_bspline_3d.f90 index 6215ab7c..a70a9df5 100644 --- a/src/interpolate/neo_bspline_3d.f90 +++ b/src/interpolate/neo_bspline_3d.f90 @@ -259,11 +259,14 @@ subroutine apply_A3D(spl, x_data, y_data, z_data, coeff, f) py = spl%sy%degree pz = spl%sz%degree + f = 0.0_dp + +!$omp parallel default(shared) private(i, spanx, spany, spanz, a, b, c, ix, iy, iz, Nx_b, Ny_b, Nz_b) & +!$omp if (n_data > 100) allocate(Nx_b(0:px)) allocate(Ny_b(0:py)) allocate(Nz_b(0:pz)) - - f = 0.0_dp +!$omp do do i = 1, n_data call find_span(spl%sx, x_data(i), spanx) call basis_funs(spl%sx, spanx, x_data(i), Nx_b) @@ -283,8 +286,9 @@ subroutine apply_A3D(spl, x_data, y_data, z_data, coeff, f) end do end do end do - +!$omp end do deallocate(Nx_b, Ny_b, Nz_b) +!$omp end parallel end subroutine apply_A3D @@ -302,6 +306,7 @@ subroutine apply_A3D_T(spl, x_data, y_data, z_data, r, g) integer :: px, py, pz integer :: a, b, c, ix, iy, iz real(dp), allocatable :: Nx_b(:), Ny_b(:), Nz_b(:) + real(dp), allocatable :: g_local(:,:,:) n_data = size(x_data) if (n_data /= size(y_data) .or. n_data /= size(z_data) .or. & @@ -320,11 +325,16 @@ subroutine apply_A3D_T(spl, x_data, y_data, z_data, r, g) py = spl%sy%degree pz = spl%sz%degree + g = 0.0_dp + +!$omp parallel default(shared) private(i, spanx, spany, spanz, a, b, c, ix, iy, iz, Nx_b, Ny_b, Nz_b, g_local) & +!$omp if (n_data > 100) allocate(Nx_b(0:px)) allocate(Ny_b(0:py)) allocate(Nz_b(0:pz)) - - g = 0.0_dp + allocate(g_local(nx, ny, nz)) + g_local = 0.0_dp +!$omp do do i = 1, n_data call find_span(spl%sx, x_data(i), spanx) call basis_funs(spl%sx, spanx, x_data(i), Nx_b) @@ -339,14 +349,19 @@ subroutine apply_A3D_T(spl, x_data, y_data, z_data, r, g) iy = spany - py + b do c = 0, pz iz = spanz - pz + c - g(ix, iy, iz) = g(ix, iy, iz) + Nx_b(a)*Ny_b(b)*Nz_b(c)*r(i) + g_local(ix, iy, iz) = g_local(ix, iy, iz) + & + Nx_b(a)*Ny_b(b)*Nz_b(c)*r(i) end do end do end do end do - +!$omp end do +!$omp critical + g = g + g_local +!$omp end critical + deallocate(g_local) deallocate(Nx_b, Ny_b, Nz_b) +!$omp end parallel end subroutine apply_A3D_T end module neo_bspline_3d - From 48fe9043cb57590a90791b0a9dfe059335f239ea Mon Sep 17 00:00:00 2001 From: Christopher Albert Date: Tue, 2 Dec 2025 02:26:39 +0100 Subject: [PATCH 04/15] Shorten OpenMP directives to respect line-length --- src/interpolate/neo_bspline.f90 | 4 ++-- src/interpolate/neo_bspline_3d.f90 | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/interpolate/neo_bspline.f90 b/src/interpolate/neo_bspline.f90 index db06025a..8b7aa9ef 100644 --- a/src/interpolate/neo_bspline.f90 +++ b/src/interpolate/neo_bspline.f90 @@ -667,8 +667,8 @@ subroutine apply_A2D_T(spl, x_data, y_data, r, g) g = 0.0_dp -!$omp parallel default(shared) private(i, spanx, spany, a, b, ix, iy, Nx_b, Ny_b, g_local) & -!$omp if (n_data > 100) +!$omp parallel default(shared) private(i, spanx, spany, a, b, ix, iy) & +!$omp& private(Nx_b, Ny_b, g_local) if (n_data > 100) allocate(Nx_b(0:px)) allocate(Ny_b(0:py)) allocate(g_local(nx, ny)) diff --git a/src/interpolate/neo_bspline_3d.f90 b/src/interpolate/neo_bspline_3d.f90 index a70a9df5..21044d59 100644 --- a/src/interpolate/neo_bspline_3d.f90 +++ b/src/interpolate/neo_bspline_3d.f90 @@ -261,8 +261,8 @@ subroutine apply_A3D(spl, x_data, y_data, z_data, coeff, f) f = 0.0_dp -!$omp parallel default(shared) private(i, spanx, spany, spanz, a, b, c, ix, iy, iz, Nx_b, Ny_b, Nz_b) & -!$omp if (n_data > 100) +!$omp parallel default(shared) private(i, spanx, spany, spanz, a, b, c, ix, iy, iz) & +!$omp& private(Nx_b, Ny_b, Nz_b) if (n_data > 100) allocate(Nx_b(0:px)) allocate(Ny_b(0:py)) allocate(Nz_b(0:pz)) @@ -327,8 +327,8 @@ subroutine apply_A3D_T(spl, x_data, y_data, z_data, r, g) g = 0.0_dp -!$omp parallel default(shared) private(i, spanx, spany, spanz, a, b, c, ix, iy, iz, Nx_b, Ny_b, Nz_b, g_local) & -!$omp if (n_data > 100) +!$omp parallel default(shared) private(i, spanx, spany, spanz, a, b, c, ix, iy, iz) & +!$omp& private(Nx_b, Ny_b, Nz_b, g_local) if (n_data > 100) allocate(Nx_b(0:px)) allocate(Ny_b(0:py)) allocate(Nz_b(0:pz)) From ed0fb8a26733c3d4205f3b0af10b9dfd30571a9d Mon Sep 17 00:00:00 2001 From: Christopher Albert Date: Tue, 2 Dec 2025 08:08:22 +0100 Subject: [PATCH 05/15] Add benchmarks comparing interpolate and neo_bspline runtimes --- test/CMakeLists.txt | 3 + test/scripts/plot_neo_bspline_benchmarks.py | 77 ++++ .../bench_neo_bspline_vs_interpolate.f90 | 344 ++++++++++++++++++ 3 files changed, 424 insertions(+) create mode 100644 test/scripts/plot_neo_bspline_benchmarks.py create mode 100644 test/source/bench_neo_bspline_vs_interpolate.f90 diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index e81f58cf..1eebd904 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -203,6 +203,9 @@ target_link_libraries(test_nctools_nc_get3.x ${COMMON_LIBS} ) +add_executable(bench_neo_bspline_vs_interpolate.x + source/bench_neo_bspline_vs_interpolate.f90) +target_link_libraries(bench_neo_bspline_vs_interpolate.x ${COMMON_LIBS}) ## Standard tests according to standard libneo Fortran test convention. diff --git a/test/scripts/plot_neo_bspline_benchmarks.py b/test/scripts/plot_neo_bspline_benchmarks.py new file mode 100644 index 00000000..002e77a7 --- /dev/null +++ b/test/scripts/plot_neo_bspline_benchmarks.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python3 +import argparse +import pathlib + +import matplotlib.pyplot as plt +import numpy as np + + +def load_bench(path: pathlib.Path) -> tuple[np.ndarray, np.ndarray, np.ndarray, np.ndarray, np.ndarray]: + data = np.loadtxt(path) + n = data[:, 0] + t_create_interp = data[:, 1] + t_eval_interp = data[:, 2] + t_create_bs = data[:, 3] + t_eval_bs = data[:, 4] + return n, t_create_interp, t_eval_interp, t_create_bs, t_eval_bs + + +def plot_dim(path: pathlib.Path, title: str, output: pathlib.Path) -> None: + n, t_ci, t_ei, t_cb, t_eb = load_bench(path) + + fig, ax = plt.subplots(figsize=(6, 4)) + ax.loglog(n, t_ci, "o-", label="interp create") + ax.loglog(n, t_ei, "o--", label="interp eval") + ax.loglog(n, t_cb, "s-", label="neo_bspline create") + ax.loglog(n, t_eb, "s--", label="neo_bspline eval") + + ax.set_xlabel("number of data points") + ax.set_ylabel("time [s]") + ax.set_title(title) + ax.legend() + ax.grid(True, which="both", ls=":") + + fig.tight_layout() + fig.savefig(output, dpi=150) + + +def main() -> None: + parser = argparse.ArgumentParser( + description="Plot runtime benchmarks: interpolate vs neo_bspline.", + ) + parser.add_argument( + "--data-dir", + type=pathlib.Path, + default=pathlib.Path("."), + help="Directory with bench_neo_bspline_*.dat files.", + ) + parser.add_argument( + "--output-dir", + type=pathlib.Path, + default=pathlib.Path("."), + help="Directory for output PNG files.", + ) + args = parser.parse_args() + + args.output_dir.mkdir(parents=True, exist_ok=True) + + plot_dim( + args.data_dir / "bench_neo_bspline_1d.dat", + "1D: interpolate vs neo_bspline", + args.output_dir / "bench_neo_bspline_1d_runtime.png", + ) + plot_dim( + args.data_dir / "bench_neo_bspline_2d.dat", + "2D: interpolate vs neo_bspline", + args.output_dir / "bench_neo_bspline_2d_runtime.png", + ) + plot_dim( + args.data_dir / "bench_neo_bspline_3d.dat", + "3D: interpolate vs neo_bspline", + args.output_dir / "bench_neo_bspline_3d_runtime.png", + ) + + +if __name__ == "__main__": + main() + diff --git a/test/source/bench_neo_bspline_vs_interpolate.f90 b/test/source/bench_neo_bspline_vs_interpolate.f90 new file mode 100644 index 00000000..70f3a3a0 --- /dev/null +++ b/test/source/bench_neo_bspline_vs_interpolate.f90 @@ -0,0 +1,344 @@ +program bench_neo_bspline_vs_interpolate + use, intrinsic :: iso_fortran_env, only : dp_bench => real64 + use interpolate + use neo_bspline + use neo_bspline_3d + + implicit none + + integer, parameter :: N_CASE = 7 + integer, parameter :: N_TOTAL_LIST(N_CASE) = & + [10, 30, 100, 300, 1000, 3000, 10000] + real(dp_bench), parameter :: PI_BENCH = acos(-1.0_dp_bench) + real(dp_bench), parameter :: TWOPI_BENCH = 2.0_dp_bench*PI_BENCH + + call run_bench_1d() + call run_bench_2d() + call run_bench_3d() + +contains + + subroutine run_bench_1d() + type(SplineData1D) :: spl_interp + type(bspline_1d) :: spl_bs + integer :: i, k, n, degree_bs, n_ctrl + integer :: c0, c1, rate, cmax + real(dp_bench) :: t_create_interp, t_eval_interp + real(dp_bench) :: t_create_bs, t_eval_bs + real(dp_bench), allocatable :: x(:), f(:), coeff(:) + real(dp_bench) :: x_min, x_max, y + integer :: unit + + x_min = 1.23_dp_bench + x_max = x_min + TWOPI_BENCH + call system_clock(count_rate=rate, count_max=cmax) + + open(newunit=unit, file="bench_neo_bspline_1d.dat", & + status="replace", action="write", form="formatted") + + do k = 1, N_CASE + n = N_TOTAL_LIST(k) + if (n < 8) cycle + + allocate(x(n), f(n)) + do i = 1, n + x(i) = x_min + (x_max - x_min) * real(i - 1, dp_bench) & + / real(n - 1, dp_bench) + f(i) = cos(2.0_dp_bench*x(i)) + 0.5_dp_bench* & + sin(3.0_dp_bench*x(i)) + end do + + ! Interpolate: construct + evaluate + call system_clock(c0) + call construct_splines_1d(x_min, x_max, f, 5, .false., spl_interp) + call system_clock(c1) + t_create_interp = real(c1 - c0, dp_bench) & + /real(rate, dp_bench) + + call system_clock(c0) + do i = 1, n + call evaluate_splines_1d(spl_interp, x(i), y) + end do + call system_clock(c1) + t_eval_interp = real(c1 - c0, dp_bench)/real(rate, dp_bench) + + ! neo_bspline LSQ: construct + evaluate + degree_bs = 5 + n_ctrl = min(40, n/2) + n_ctrl = max(degree_bs + 1, n_ctrl) + + allocate(coeff(n_ctrl)) + + call system_clock(c0) + call bspline_1d_init_uniform(spl_bs, degree_bs, n_ctrl, x_min, & + x_max) + call bspline_1d_lsq_cgls(spl_bs, x, f, coeff, max_iter=400, & + tol=1.0d-10) + call system_clock(c1) + t_create_bs = real(c1 - c0, dp_bench)/real(rate, dp_bench) + + call system_clock(c0) + do i = 1, n + call bspline_1d_eval(spl_bs, coeff, x(i), y) + end do + call system_clock(c1) + t_eval_bs = real(c1 - c0, dp_bench)/real(rate, dp_bench) + + write(unit,'(i10,4es16.8)') n, t_create_interp, t_eval_interp, & + t_create_bs, t_eval_bs + + deallocate(x, f, coeff) + call destroy_splines_1d(spl_interp) + end do + + close(unit) + end subroutine run_bench_1d + + + subroutine run_bench_2d() + type(SplineData2D) :: spl_interp + type(bspline_2d) :: spl_bs + integer :: i1, i2, k + integer :: n_total, n_side, n1, n2 + integer :: degree(2), n_ctrl(2) + integer :: c0, c1, rate, cmax + real(dp_bench) :: t_create_interp, t_eval_interp + real(dp_bench) :: t_create_bs, t_eval_bs + real(dp_bench), allocatable :: x1(:), x2(:) + real(dp_bench), allocatable :: f_grid(:,:) + real(dp_bench), allocatable :: x_data(:), y_data(:), f_vec(:) + real(dp_bench), allocatable :: coeff_bs(:,:) + real(dp_bench) :: x_min(2), x_max(2) + real(dp_bench) :: x(2), y + integer :: unit, idx, n_data + + x_min = [1.23_dp_bench, 1.23_dp_bench] + x_max = x_min + [TWOPI_BENCH, TWOPI_BENCH] + + call system_clock(count_rate=rate, count_max=cmax) + + open(newunit=unit, file="bench_neo_bspline_2d.dat", & + status="replace", action="write", form="formatted") + + degree = [3, 3] + + do k = 1, N_CASE + n_total = N_TOTAL_LIST(k) + n_side = int(sqrt(real(n_total, dp_bench))) + if (n_side < degree(1) + 2) n_side = degree(1) + 2 + + n1 = n_side + n2 = n_side + n_data = n1*n2 + + allocate(x1(n1), x2(n2), f_grid(n1, n2)) + allocate(x_data(n_data), y_data(n_data), f_vec(n_data)) + + do i1 = 1, n1 + x1(i1) = x_min(1) + (x_max(1) - x_min(1)) * & + real(i1 - 1, dp_bench)/real(n1 - 1, dp_bench) + end do + do i2 = 1, n2 + x2(i2) = x_min(2) + (x_max(2) - x_min(2)) * & + real(i2 - 1, dp_bench)/real(n2 - 1, dp_bench) + end do + + idx = 0 + do i2 = 1, n2 + do i1 = 1, n1 + f_grid(i1, i2) = cos(x1(i1))*cos(2.0_dp_bench*x2(i2)) + idx = idx + 1 + x_data(idx) = x1(i1) + y_data(idx) = x2(i2) + f_vec(idx) = f_grid(i1, i2) + end do + end do + + ! Interpolate: construct + evaluate + call system_clock(c0) + call construct_splines_2d(x_min, x_max, f_grid, [5, 5], & + [.false., .false.], spl_interp) + call system_clock(c1) + t_create_interp = real(c1 - c0, dp_bench) & + /real(rate, dp_bench) + + call system_clock(c0) + do i2 = 1, n2 + do i1 = 1, n1 + x = [x1(i1), x2(i2)] + call evaluate_splines_2d(spl_interp, x, y) + end do + end do + call system_clock(c1) + t_eval_interp = real(c1 - c0, dp_bench)/real(rate, dp_bench) + + ! neo_bspline LSQ: construct + evaluate + n_ctrl(1) = min(16, n1/2) + n_ctrl(2) = min(16, n2/2) + n_ctrl(1) = max(degree(1) + 1, n_ctrl(1)) + n_ctrl(2) = max(degree(2) + 1, n_ctrl(2)) + + allocate(coeff_bs(n_ctrl(1), n_ctrl(2))) + + call system_clock(c0) + call bspline_2d_init_uniform(spl_bs, degree, n_ctrl, x_min, & + x_max) + call bspline_2d_lsq_cgls(spl_bs, x_data, y_data, f_vec, & + coeff_bs, max_iter=800, tol=1.0d-10) + call system_clock(c1) + t_create_bs = real(c1 - c0, dp_bench)/real(rate, dp_bench) + + call system_clock(c0) + do i2 = 1, n2 + do i1 = 1, n1 + x = [x1(i1), x2(i2)] + call bspline_2d_eval(spl_bs, coeff_bs, x, y) + end do + end do + call system_clock(c1) + t_eval_bs = real(c1 - c0, dp_bench)/real(rate, dp_bench) + + write(unit,'(i10,4es16.8)') n_data, t_create_interp, & + t_eval_interp, t_create_bs, t_eval_bs + + deallocate(x1, x2, f_grid, x_data, y_data, f_vec, coeff_bs) + call destroy_splines_2d(spl_interp) + end do + + close(unit) + end subroutine run_bench_2d + + + subroutine run_bench_3d() + type(SplineData3D) :: spl_interp + type(bspline_3d) :: spl_bs + integer :: i1, i2, i3, k + integer :: n_total, n_side, n1, n2, n3 + integer :: degree(3), n_ctrl(3) + integer :: c0, c1, rate, cmax + real(dp_bench) :: t_create_interp, t_eval_interp + real(dp_bench) :: t_create_bs, t_eval_bs + real(dp_bench), allocatable :: x1(:), x2(:), x3(:) + real(dp_bench), allocatable :: f3d(:,:,:) + real(dp_bench), allocatable :: x_data(:), y_data(:), z_data(:), & + f_vec(:) + real(dp_bench), allocatable :: coeff_bs(:,:,:) + real(dp_bench) :: x_min(3), x_max(3) + real(dp_bench) :: x(3), y + integer :: unit, idx, n_data + + x_min = [1.23_dp_bench, 1.23_dp_bench, 1.23_dp_bench] + x_max = x_min + [TWOPI_BENCH, TWOPI_BENCH, TWOPI_BENCH] + + call system_clock(count_rate=rate, count_max=cmax) + + open(newunit=unit, file="bench_neo_bspline_3d.dat", & + status="replace", action="write", form="formatted") + + degree = [3, 3, 3] + + do k = 1, N_CASE + n_total = N_TOTAL_LIST(k) + n_side = int(real(n_total, dp_bench)**(1.0_dp_bench/3.0_dp_bench)) + if (n_side < degree(1) + 2) n_side = degree(1) + 2 + + n1 = n_side + n2 = n_side + n3 = n_side + n_data = n1*n2*n3 + + allocate(x1(n1), x2(n2), x3(n3)) + allocate(f3d(n1, n2, n3)) + allocate(x_data(n_data), y_data(n_data), z_data(n_data), & + f_vec(n_data)) + + do i1 = 1, n1 + x1(i1) = x_min(1) + (x_max(1) - x_min(1)) * & + real(i1 - 1, dp_bench)/real(n1 - 1, dp_bench) + end do + do i2 = 1, n2 + x2(i2) = x_min(2) + (x_max(2) - x_min(2)) * & + real(i2 - 1, dp_bench)/real(n2 - 1, dp_bench) + end do + do i3 = 1, n3 + x3(i3) = x_min(3) + (x_max(3) - x_min(3)) * & + real(i3 - 1, dp_bench)/real(n3 - 1, dp_bench) + end do + + idx = 0 + do i3 = 1, n3 + do i2 = 1, n2 + do i1 = 1, n1 + f3d(i1, i2, i3) = cos(x1(i1))*cos(2.0_dp_bench*x2(i2)) & + *cos(3.0_dp_bench*x3(i3)) + idx = idx + 1 + x_data(idx) = x1(i1) + y_data(idx) = x2(i2) + z_data(idx) = x3(i3) + f_vec(idx) = f3d(i1, i2, i3) + end do + end do + end do + + ! Interpolate: construct + evaluate + call system_clock(c0) + call construct_splines_3d(x_min, x_max, f3d, [5, 5, 5], & + [.false., .false., .false.], spl_interp) + call system_clock(c1) + t_create_interp = real(c1 - c0, dp_bench) & + /real(rate, dp_bench) + + call system_clock(c0) + do i3 = 1, n3 + do i2 = 1, n2 + do i1 = 1, n1 + x = [x1(i1), x2(i2), x3(i3)] + call evaluate_splines_3d(spl_interp, x, y) + end do + end do + end do + call system_clock(c1) + t_eval_interp = real(c1 - c0, dp_bench)/real(rate, dp_bench) + + ! neo_bspline LSQ: construct + evaluate + n_ctrl(1) = min(16, n1/2) + n_ctrl(2) = min(16, n2/2) + n_ctrl(3) = min(16, n3/2) + n_ctrl(1) = max(degree(1) + 1, n_ctrl(1)) + n_ctrl(2) = max(degree(2) + 1, n_ctrl(2)) + n_ctrl(3) = max(degree(3) + 1, n_ctrl(3)) + + allocate(coeff_bs(n_ctrl(1), n_ctrl(2), n_ctrl(3))) + + call system_clock(c0) + call bspline_3d_init_uniform(spl_bs, degree, n_ctrl, x_min, & + x_max) + call bspline_3d_lsq_cgls(spl_bs, x_data, y_data, z_data, f_vec, & + coeff_bs, max_iter=800, tol=1.0d-10) + call system_clock(c1) + t_create_bs = real(c1 - c0, dp_bench)/real(rate, dp_bench) + + call system_clock(c0) + do i3 = 1, n3 + do i2 = 1, n2 + do i1 = 1, n1 + x = [x1(i1), x2(i2), x3(i3)] + call bspline_3d_eval(spl_bs, coeff_bs, x, y) + end do + end do + end do + call system_clock(c1) + t_eval_bs = real(c1 - c0, dp_bench)/real(rate, dp_bench) + + write(unit,'(i10,4es16.8)') n_data, t_create_interp, & + t_eval_interp, t_create_bs, t_eval_bs + + deallocate(x1, x2, x3, f3d) + deallocate(x_data, y_data, z_data, f_vec, coeff_bs) + call destroy_splines_3d(spl_interp) + end do + + close(unit) + end subroutine run_bench_3d + +end program bench_neo_bspline_vs_interpolate From 9850da5db11d9e9a5268f87d507d87e7511baf6c Mon Sep 17 00:00:00 2001 From: Christopher Albert Date: Tue, 2 Dec 2025 08:14:34 +0100 Subject: [PATCH 06/15] Use nanosecond timer and separate create/eval benchmark plots --- test/scripts/plot_neo_bspline_benchmarks.py | 61 +++++++-- .../bench_neo_bspline_vs_interpolate.f90 | 117 +++++++++++------- 2 files changed, 119 insertions(+), 59 deletions(-) diff --git a/test/scripts/plot_neo_bspline_benchmarks.py b/test/scripts/plot_neo_bspline_benchmarks.py index 002e77a7..65476411 100644 --- a/test/scripts/plot_neo_bspline_benchmarks.py +++ b/test/scripts/plot_neo_bspline_benchmarks.py @@ -16,13 +16,36 @@ def load_bench(path: pathlib.Path) -> tuple[np.ndarray, np.ndarray, np.ndarray, return n, t_create_interp, t_eval_interp, t_create_bs, t_eval_bs -def plot_dim(path: pathlib.Path, title: str, output: pathlib.Path) -> None: +def plot_dim_create( + path: pathlib.Path, + title: str, + output: pathlib.Path, +) -> None: n, t_ci, t_ei, t_cb, t_eb = load_bench(path) fig, ax = plt.subplots(figsize=(6, 4)) ax.loglog(n, t_ci, "o-", label="interp create") - ax.loglog(n, t_ei, "o--", label="interp eval") ax.loglog(n, t_cb, "s-", label="neo_bspline create") + + ax.set_xlabel("number of data points") + ax.set_ylabel("time [s]") + ax.set_title(title) + ax.legend() + ax.grid(True, which="both", ls=":") + + fig.tight_layout() + fig.savefig(output, dpi=150) + + +def plot_dim_eval( + path: pathlib.Path, + title: str, + output: pathlib.Path, +) -> None: + n, t_ci, t_ei, t_cb, t_eb = load_bench(path) + + fig, ax = plt.subplots(figsize=(6, 4)) + ax.loglog(n, t_ei, "o--", label="interp eval") ax.loglog(n, t_eb, "s--", label="neo_bspline eval") ax.set_xlabel("number of data points") @@ -55,23 +78,37 @@ def main() -> None: args.output_dir.mkdir(parents=True, exist_ok=True) - plot_dim( + plot_dim_create( + args.data_dir / "bench_neo_bspline_1d.dat", + "1D create: interpolate vs neo_bspline", + args.output_dir / "bench_neo_bspline_1d_create.png", + ) + plot_dim_eval( args.data_dir / "bench_neo_bspline_1d.dat", - "1D: interpolate vs neo_bspline", - args.output_dir / "bench_neo_bspline_1d_runtime.png", + "1D eval: interpolate vs neo_bspline", + args.output_dir / "bench_neo_bspline_1d_eval.png", ) - plot_dim( + plot_dim_create( args.data_dir / "bench_neo_bspline_2d.dat", - "2D: interpolate vs neo_bspline", - args.output_dir / "bench_neo_bspline_2d_runtime.png", + "2D create: interpolate vs neo_bspline", + args.output_dir / "bench_neo_bspline_2d_create.png", ) - plot_dim( + plot_dim_eval( + args.data_dir / "bench_neo_bspline_2d.dat", + "2D eval: interpolate vs neo_bspline", + args.output_dir / "bench_neo_bspline_2d_eval.png", + ) + plot_dim_create( args.data_dir / "bench_neo_bspline_3d.dat", - "3D: interpolate vs neo_bspline", - args.output_dir / "bench_neo_bspline_3d_runtime.png", + "3D create: interpolate vs neo_bspline", + args.output_dir / "bench_neo_bspline_3d_create.png", + ) + plot_dim_eval( + args.data_dir / "bench_neo_bspline_3d.dat", + "3D eval: interpolate vs neo_bspline", + args.output_dir / "bench_neo_bspline_3d_eval.png", ) if __name__ == "__main__": main() - diff --git a/test/source/bench_neo_bspline_vs_interpolate.f90 b/test/source/bench_neo_bspline_vs_interpolate.f90 index 70f3a3a0..eb45be2c 100644 --- a/test/source/bench_neo_bspline_vs_interpolate.f90 +++ b/test/source/bench_neo_bspline_vs_interpolate.f90 @@ -1,5 +1,6 @@ program bench_neo_bspline_vs_interpolate use, intrinsic :: iso_fortran_env, only : dp_bench => real64 + use, intrinsic :: iso_c_binding, only : c_int, c_long use interpolate use neo_bspline use neo_bspline_3d @@ -12,17 +13,47 @@ program bench_neo_bspline_vs_interpolate real(dp_bench), parameter :: PI_BENCH = acos(-1.0_dp_bench) real(dp_bench), parameter :: TWOPI_BENCH = 2.0_dp_bench*PI_BENCH + type, bind(C) :: timespec + integer(c_long) :: tv_sec + integer(c_long) :: tv_nsec + end type timespec + + integer(c_int), parameter :: CLOCK_MONOTONIC = 1_c_int + + interface + function c_clock_gettime(clock_id, tp) bind(C, name="clock_gettime") + import :: c_int, timespec + integer(c_int), value :: clock_id + type(timespec) :: tp + integer(c_int) :: c_clock_gettime + end function c_clock_gettime + end interface + call run_bench_1d() call run_bench_2d() call run_bench_3d() contains + subroutine bench_time_now(t) + real(dp_bench), intent(out) :: t + type(timespec) :: ts + integer(c_int) :: ierr + + ierr = c_clock_gettime(CLOCK_MONOTONIC, ts) + if (ierr /= 0_c_int) then + t = 0.0_dp_bench + else + t = real(ts%tv_sec, dp_bench) & + + real(ts%tv_nsec, dp_bench)*1.0e-9_dp_bench + end if + end subroutine bench_time_now + subroutine run_bench_1d() type(SplineData1D) :: spl_interp type(bspline_1d) :: spl_bs integer :: i, k, n, degree_bs, n_ctrl - integer :: c0, c1, rate, cmax + real(dp_bench) :: t0, t1 real(dp_bench) :: t_create_interp, t_eval_interp real(dp_bench) :: t_create_bs, t_eval_bs real(dp_bench), allocatable :: x(:), f(:), coeff(:) @@ -31,7 +62,6 @@ subroutine run_bench_1d() x_min = 1.23_dp_bench x_max = x_min + TWOPI_BENCH - call system_clock(count_rate=rate, count_max=cmax) open(newunit=unit, file="bench_neo_bspline_1d.dat", & status="replace", action="write", form="formatted") @@ -49,18 +79,17 @@ subroutine run_bench_1d() end do ! Interpolate: construct + evaluate - call system_clock(c0) + call bench_time_now(t0) call construct_splines_1d(x_min, x_max, f, 5, .false., spl_interp) - call system_clock(c1) - t_create_interp = real(c1 - c0, dp_bench) & - /real(rate, dp_bench) + call bench_time_now(t1) + t_create_interp = t1 - t0 - call system_clock(c0) + call bench_time_now(t0) do i = 1, n call evaluate_splines_1d(spl_interp, x(i), y) end do - call system_clock(c1) - t_eval_interp = real(c1 - c0, dp_bench)/real(rate, dp_bench) + call bench_time_now(t1) + t_eval_interp = t1 - t0 ! neo_bspline LSQ: construct + evaluate degree_bs = 5 @@ -69,20 +98,20 @@ subroutine run_bench_1d() allocate(coeff(n_ctrl)) - call system_clock(c0) + call bench_time_now(t0) call bspline_1d_init_uniform(spl_bs, degree_bs, n_ctrl, x_min, & x_max) call bspline_1d_lsq_cgls(spl_bs, x, f, coeff, max_iter=400, & tol=1.0d-10) - call system_clock(c1) - t_create_bs = real(c1 - c0, dp_bench)/real(rate, dp_bench) + call bench_time_now(t1) + t_create_bs = t1 - t0 - call system_clock(c0) + call bench_time_now(t0) do i = 1, n call bspline_1d_eval(spl_bs, coeff, x(i), y) end do - call system_clock(c1) - t_eval_bs = real(c1 - c0, dp_bench)/real(rate, dp_bench) + call bench_time_now(t1) + t_eval_bs = t1 - t0 write(unit,'(i10,4es16.8)') n, t_create_interp, t_eval_interp, & t_create_bs, t_eval_bs @@ -101,7 +130,7 @@ subroutine run_bench_2d() integer :: i1, i2, k integer :: n_total, n_side, n1, n2 integer :: degree(2), n_ctrl(2) - integer :: c0, c1, rate, cmax + real(dp_bench) :: t0, t1 real(dp_bench) :: t_create_interp, t_eval_interp real(dp_bench) :: t_create_bs, t_eval_bs real(dp_bench), allocatable :: x1(:), x2(:) @@ -115,8 +144,6 @@ subroutine run_bench_2d() x_min = [1.23_dp_bench, 1.23_dp_bench] x_max = x_min + [TWOPI_BENCH, TWOPI_BENCH] - call system_clock(count_rate=rate, count_max=cmax) - open(newunit=unit, file="bench_neo_bspline_2d.dat", & status="replace", action="write", form="formatted") @@ -155,22 +182,21 @@ subroutine run_bench_2d() end do ! Interpolate: construct + evaluate - call system_clock(c0) + call bench_time_now(t0) call construct_splines_2d(x_min, x_max, f_grid, [5, 5], & [.false., .false.], spl_interp) - call system_clock(c1) - t_create_interp = real(c1 - c0, dp_bench) & - /real(rate, dp_bench) + call bench_time_now(t1) + t_create_interp = t1 - t0 - call system_clock(c0) + call bench_time_now(t0) do i2 = 1, n2 do i1 = 1, n1 x = [x1(i1), x2(i2)] call evaluate_splines_2d(spl_interp, x, y) end do end do - call system_clock(c1) - t_eval_interp = real(c1 - c0, dp_bench)/real(rate, dp_bench) + call bench_time_now(t1) + t_eval_interp = t1 - t0 ! neo_bspline LSQ: construct + evaluate n_ctrl(1) = min(16, n1/2) @@ -180,23 +206,23 @@ subroutine run_bench_2d() allocate(coeff_bs(n_ctrl(1), n_ctrl(2))) - call system_clock(c0) + call bench_time_now(t0) call bspline_2d_init_uniform(spl_bs, degree, n_ctrl, x_min, & x_max) call bspline_2d_lsq_cgls(spl_bs, x_data, y_data, f_vec, & coeff_bs, max_iter=800, tol=1.0d-10) - call system_clock(c1) - t_create_bs = real(c1 - c0, dp_bench)/real(rate, dp_bench) + call bench_time_now(t1) + t_create_bs = t1 - t0 - call system_clock(c0) + call bench_time_now(t0) do i2 = 1, n2 do i1 = 1, n1 x = [x1(i1), x2(i2)] call bspline_2d_eval(spl_bs, coeff_bs, x, y) end do end do - call system_clock(c1) - t_eval_bs = real(c1 - c0, dp_bench)/real(rate, dp_bench) + call bench_time_now(t1) + t_eval_bs = t1 - t0 write(unit,'(i10,4es16.8)') n_data, t_create_interp, & t_eval_interp, t_create_bs, t_eval_bs @@ -215,7 +241,7 @@ subroutine run_bench_3d() integer :: i1, i2, i3, k integer :: n_total, n_side, n1, n2, n3 integer :: degree(3), n_ctrl(3) - integer :: c0, c1, rate, cmax + real(dp_bench) :: t0, t1 real(dp_bench) :: t_create_interp, t_eval_interp real(dp_bench) :: t_create_bs, t_eval_bs real(dp_bench), allocatable :: x1(:), x2(:), x3(:) @@ -230,8 +256,6 @@ subroutine run_bench_3d() x_min = [1.23_dp_bench, 1.23_dp_bench, 1.23_dp_bench] x_max = x_min + [TWOPI_BENCH, TWOPI_BENCH, TWOPI_BENCH] - call system_clock(count_rate=rate, count_max=cmax) - open(newunit=unit, file="bench_neo_bspline_3d.dat", & status="replace", action="write", form="formatted") @@ -281,14 +305,13 @@ subroutine run_bench_3d() end do ! Interpolate: construct + evaluate - call system_clock(c0) + call bench_time_now(t0) call construct_splines_3d(x_min, x_max, f3d, [5, 5, 5], & [.false., .false., .false.], spl_interp) - call system_clock(c1) - t_create_interp = real(c1 - c0, dp_bench) & - /real(rate, dp_bench) + call bench_time_now(t1) + t_create_interp = t1 - t0 - call system_clock(c0) + call bench_time_now(t0) do i3 = 1, n3 do i2 = 1, n2 do i1 = 1, n1 @@ -297,8 +320,8 @@ subroutine run_bench_3d() end do end do end do - call system_clock(c1) - t_eval_interp = real(c1 - c0, dp_bench)/real(rate, dp_bench) + call bench_time_now(t1) + t_eval_interp = t1 - t0 ! neo_bspline LSQ: construct + evaluate n_ctrl(1) = min(16, n1/2) @@ -310,15 +333,15 @@ subroutine run_bench_3d() allocate(coeff_bs(n_ctrl(1), n_ctrl(2), n_ctrl(3))) - call system_clock(c0) + call bench_time_now(t0) call bspline_3d_init_uniform(spl_bs, degree, n_ctrl, x_min, & x_max) call bspline_3d_lsq_cgls(spl_bs, x_data, y_data, z_data, f_vec, & coeff_bs, max_iter=800, tol=1.0d-10) - call system_clock(c1) - t_create_bs = real(c1 - c0, dp_bench)/real(rate, dp_bench) + call bench_time_now(t1) + t_create_bs = t1 - t0 - call system_clock(c0) + call bench_time_now(t0) do i3 = 1, n3 do i2 = 1, n2 do i1 = 1, n1 @@ -327,8 +350,8 @@ subroutine run_bench_3d() end do end do end do - call system_clock(c1) - t_eval_bs = real(c1 - c0, dp_bench)/real(rate, dp_bench) + call bench_time_now(t1) + t_eval_bs = t1 - t0 write(unit,'(i10,4es16.8)') n_data, t_create_interp, & t_eval_interp, t_create_bs, t_eval_bs From 0ece3cd2f4025cae0cf448d750ada07f6dac1f64 Mon Sep 17 00:00:00 2001 From: Christopher Albert Date: Tue, 2 Dec 2025 08:40:18 +0100 Subject: [PATCH 07/15] Revert experimental 3D LSQ caching to preserve correctness --- src/interpolate/neo_bspline_3d.f90 | 1 + 1 file changed, 1 insertion(+) diff --git a/src/interpolate/neo_bspline_3d.f90 b/src/interpolate/neo_bspline_3d.f90 index 21044d59..c30b1f40 100644 --- a/src/interpolate/neo_bspline_3d.f90 +++ b/src/interpolate/neo_bspline_3d.f90 @@ -364,4 +364,5 @@ subroutine apply_A3D_T(spl, x_data, y_data, z_data, r, g) !$omp end parallel end subroutine apply_A3D_T + end module neo_bspline_3d From 3821da7f6b3976e672b5a8b1b0cb571e1d8dcf7c Mon Sep 17 00:00:00 2001 From: Christopher Albert Date: Tue, 2 Dec 2025 09:23:07 +0100 Subject: [PATCH 08/15] Add 3D basis caching for 4x LSQ performance improvement Cache spans and basis function values before CG iterations, then reuse them through cached apply_A3D and apply_A3D_T operators. This eliminates redundant find_span and basis_funs calls in each iteration. Benchmark results for 9261 3D data points: - Before: 1.05s - After: 0.26s (4x speedup) --- bench_neo_bspline_1d.png | Bin 0 -> 145092 bytes bench_neo_bspline_2d.png | Bin 0 -> 144207 bytes bench_neo_bspline_3d.png | Bin 0 -> 121049 bytes src/interpolate/neo_bspline_3d.f90 | 166 ++++++++++++++++++++++++++++- 4 files changed, 162 insertions(+), 4 deletions(-) create mode 100644 bench_neo_bspline_1d.png create mode 100644 bench_neo_bspline_2d.png create mode 100644 bench_neo_bspline_3d.png diff --git a/bench_neo_bspline_1d.png b/bench_neo_bspline_1d.png new file mode 100644 index 0000000000000000000000000000000000000000..8018d9e4c0717069d19a7a2cdc4da4af53ef8782 GIT binary patch literal 145092 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�OlboQkafzoPj_j1n-e943 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%0DHAf`1zYY0 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

x{nU+&PRKg){wB*O_XRyYjjZTn^()s!iQs5 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 z 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
ftxCkOT7WKVNi0e+XzEfbz3weFu=x~IMH9cxrC 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≶pl-LHy46W|aS%>s=gi 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 literal 0 HcmV?d00001 diff --git a/bench_neo_bspline_2d.png b/bench_neo_bspline_2d.png new file mode 100644 index 0000000000000000000000000000000000000000..f04c9058ca57a41ba2e9df3747bca87629e2fad8 GIT binary patch literal 144207 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°f!4CS~L&rYf^?bvellIp#69wZiEbFM|Dmc zeW02@#idtB0D+>SmkJ<(vR2j4953W^{RsbF?k$J}vAG{EwcZ1Q6}jEaX4+S9MEt~* z@M{X80;T@xN=5JLrV=9JmOe{w54;86%W@IE@C23xuToSPg#ZtN?MH(ZX|a!vRDu5T z(AS(+1#v(*ae$A6AO7u%%A=qRP`tN(tXxsK_~@(K=@-@#pKG>G_{&!&P7)cX51ZLz z9oPHn&Tj%eWzGej65YOTp{XD|5a-j1jMn68>_34OJl~(cYU#MadY5x^E(6Rz6^&?w zQcr~2fw?+Wz3ezfZ8n=T1Z|-xCPDNBGRWPZE9~+R(-Tl~$2KHC5EC_#Bw~q5Uw15$ zfg0Hr7~Z1V2VoG`J$A+F_l_|^)WAdpd_glJ6C~6W)h--&C8a&v&61$Kuk%#_i_%a~ z08)7OI@J@DnTbdE$1@1&7W=TcE*@bw^6@f@R!NdPDJ7jW@!u3u6J_$lwelteQe$M2 zNUmr{6s|pUuKv8;0T$69s2Sk8I^|5s=gt$>N@mdBsNL(IpGnB`4-m-f_= zC#9OC0&x2QhDn2zrDLVZCR=uvo}A$-PTRRD>68lp2siV?lepdH{2c`RvtG;mCExX6 zxtSM?eeu%#%iNFlQDPOSnLPliOje}Zr7K_=@L%MiXe7+Z>K9uPJZv;4$f$I06*V~B zzI!6b!a7Wo{Ml4iVxhOEqmTnvo_^s*em`1Y>cIMRrOfi70R01b-~K~_M*9B~@@_0N z4D1ZGwgz>s9xFZ1Y2*udsf~@(SJ8^<689e!8Q#X$G2@i2z{>`*#3{G0X`6@|!4~H9 zj;FU5u1n2Tk|=yBVYV8&mVU&)Bba}mhYG0JsOi_PxO1H*P!n^A%4OA`gP@QM1KH>e z9#x+I#?P_JxAgY=j=Se5&S2^tGg&W z;RD>45_G_i086bqc@($_Ob6(3OdUNk4bZ4CtSROc7v-qjsCdq)Qc`P3eYwHr{asy8b7B zS_n)~d|Q&~;uo+<%j9}@y(akNHTb7L{@UBv5rX`a{!t z_>vlkh)7PWpA`Bp@A=PfNi!VV;nDv0*O4m&fTKo>9bDu;>qu4=$kPuLR<+xeR{Y@2al+xNK zEAatAf|s4firgwc9k|2ut$|q;Q~IW+FN8p!p_{_byYHBj3UtcIgn`UgL2$1#fO*HO zga2O@iijt(Gh+Y|un#-0GzsIKDX^9A%P0LRJw6iL81RaUaYi_iCWYMJ-Nq#)(F0}R znY|u>6uE%sRoN{HX@9f)2t|EhAPY+ELyYDc+{zP}v{m#XI1YVSSszIe!)!R{u>y4$ zCD>KmBQvRjL>B+qil)KdLX)D<4U=qF)C*eKL=zcX+r$Lsz4&+NU)N@=z9tL+->T_* z6%EB&s6b4TnmewFxxdY%-yhxl#Nao_Xx!w$?E8+vHd4XzR^ zTRNs2xj59^Xfo}`FH|dxyCxsxT6^GsD#U#}*s~Ww^Ze~mi0H%xEp>Hu->)U-qMc#- zLTHlza>q~CsqyhN{BHZzw=X7JHo|*?PYQ$|*xsbgR7Kl4pnL6hk<4O@H{^X^eQsQ5 z8&fUw0o{A#%aRr+GnvHM-_hz1+{UAzY z)?;i|$<_6EXv3Yz@bEt)(!B=!rfkITPZVRraV07Syk>2vYZjxzRZq9x7-SaafZhRR z_-B*7Rc);h5Q(&0=GTW0QX7+j>Ri91x6sH1v~F#HaVQNROF<}q_|A!`B_4PvrX57yc z$PnPB-;%F@MUiOLG#W3fhE?_Hf}66dyeFEl7wQxx0Nw7iL4IU&a&&7 zwK`OLovoOrf#cZ<-7=PEfpXcmTd1i$pF5);klY*-i3{R>(@rB)8Y;%MtmO$N>2UXN zU%J}JZorS?o3o#QJ%F2fOtEVU!@qKL3u;ut(<>mx(m^L*$}|9DrpZtDENVn2K!3I5 zIfrzBumt=ijr%v4{CRRI)KKODB)q~}Uwc$1Fuu_XOgYl3`BGEy$js%A(0&>Ew45g@ zmvXRBKW|W}oY7dvg2f zt0V*)9@{ydt*OfF_kQq6Vlfo_feRqv4!7=7ER19K4{K(WEF}EJA*WA!RBz2eeAWs# zwCERcdJyd&L!D%hZa#ONBLqt0W~juO14aaf-t}&#z=omceJ`*&#leH-7h&`;B~-PZfx87cE!UP z?T2{lt3WLnPCux$6?D*P${9x0*W7j(3UP9c?n-E5%x*9OoqHP^@bP}c&I&cR?%83rN5 z8(38%wGOMv+XU~3iN{`GbRyn>Sj{+WHVlIhba=29LlV2dm@FP?{aY79Aa!RSAQkIi zmhU6blj#hIp(BHRxTIk0piC~Am1?Up>Y+tTTbt}nQRU{#VW$WX70Z_hiK0=Dx**za zqc-23zj1*K2-wV2=WL@=cI3#!M~)IilJRTgz5zaWtIHU{gBoPQ!^#!ry79F;3ke;{RUEbp*ngl z6VL7GsJea+l4)>U7O3h0e7zEXW(Zpa!N@{-iC%+->;7C}UzD@qu05E4WHjxP=bleE zAlJ($*0m~K1QPPojP`t>ffu1yp1{4QSPM$dV|e}qhgIL7bc*QJ!-YkI;a4#voheQl z6FgHZWP`wbKt*;y-bQQ8V!2$4S4?PzLEY;eAz1QMJwy0F%&Br6C{&?PDdO{BGD#!u zU{~;FS*XU|>^n7ZNQz)0($aC+;8a?la|LcTCgDfB|F}MzN@IS85Wfwkbe>1}$rV9G zjd5Eyx#LNY^ej0;64@f6nX>U`Mb%pBV)iK>7u3B^^SisURQ^-D8WkTce5ZAHxr%w_ z$C{jDyi)d&5IRMQP}U*-=O_E1TEm$Osp4*8Er`O8FG4*}kRqV@CgKOe;Yj;I*7k+& zApg}5vQ%ZR=rB0}0?HK75jbXS1JA8oINU$>nR9KKOb>Z==v;$Fl~|htkf3EsL^Q@u zK>Q_lo3Me1V|sepGD!mP&xFRQQU?%XT|Y_uYcHuFuXMLu<@M~8M= z98a6s68vB&P^9XVfCONgzG77(PX)s<+w4rItA=2#c>4fkL1GoPAqeqDP=9&Q{?-gB z0Y$^~6%TNk1N^I6`@q62J%&?aFs~Rj*zf`qs|X1Q8lO0==ztEdoU!P!LFRzcnbcW^ zQfn5>-|a3UAOm9>HeTD>2Zjp@wy~H=&3=9QsFd=MHIydZN5u}i{c|D#QS!XMg2btcVip7=xeNwD@r?hhQNv<{k=KUY%qO{;2#8RME;puHn%M(_uOM+xV9D1la&%h ztCU7^(QRC3Juk2CF^e}1W*l6o9ZtNtb2m3U#A9aCRsvhkEfj;A&}x4!B^8l|Rz7Qh^2}Y&AhQKY zVGDI>k8-9C=?sB(zU!0zgMIhk#MYI98+asf5H>Jb5_v|j;m(iC>c$zElK_H0#l3hk zFMv-Q3msWWAB{JXi&=%;$AMkJT?u=ni%)k9uU6-{?msK}L7mGT4Q6Lq^B8Ml@Vb#~ z=B5o=oCC9oT@xj!Fxy46nh>8n*N}rw#;_{+vmu^ExJOh5dSN4}G?Yam>UC$$q|*L} z0Q{#p*Z6-{Xugi|cQqa+B6I|1_(kb@d?0?79a!?b{7Ip{VBwy)biG*GtL>xuW*GCU z)DZ$mx`Gev(YDrTKkzBjw6Ed*mll@xD$?ctYJ>XrI{eRV&FvL2r#K=ee%&%+uQSjp zjo`9QnVcGfYp*S1pQ+*~B7OeQ6)7V?_L()n0^M~g2uy1Ag37kmE75O{M#iT`L_qnD zx)GJ~C!DVETT@envNnwOpkXjqJf}{-MgYU}@u1aDR#xFc8CncO8_)h{yFZc$xO8E= z3uJem3IOK1p{Up|6 z6elCvbu)&(ywOo)J?Kx2R6&SG6SD0`8Tje*Jy|)r1`n-XWS?ZcLnKj32=m264y7EX^emCBI-twci9`F$=AYO&gsJniqgh7K!?> z3~xO4b6J?8RNjh#LmT8WsbD7^j=*+32vs@=gMeoNWZwM-zt{qq6)iCUBES^&z zqk3v#^=CWRuGUPqgC5h7cme(hj~W?`=_1YYvN^(cj;5Q=%}}7g!YH_mJ|NbjR?5P> zW7fC{M#;@Te@`zFB?=%YP?y0$36_At6g-VN1v*))M^2^do=!M{T#quj+^*QT1K+t+ z`M)4556?)a?jtjhGlBfm>E*|`oo1r{w-oeGU66Jq8h7{IY3j#*8IJs+^Zk?r&w1y! z!P7`J47tOvUq|Z|ag4gbZ2s6v5hD4*7elZFx9xK5T{O~Q$!P=yJ3R}3c^1^`(}%lg z?&$nM=O%UTY+dRi!7O5PuXt47b41SkB0x)Rzp6Yi=Chwb&MBG2jo1ZVqo_W(?@xL-k*0a3 zZVTu2y<1$Mi55_igMa7Bis78Spv=PhPVV=?8@B6@>2~zjvzeo9^>Jj{$d9>9keTdq zO_0Tg_BK*!OtIOr^aYQ|UJnxdnGHC7dG$<3E$wS5t{!5BqBl8mf6p+Z1G@EPnI>k? z+~uf$+aT|TbXS%eW-vR-D<*L{6X@I?^zj67`gDKX{lKuz2*9Xt8%hJcqxh_Q7g{ zkyH8 zaDs<9c;#B7<bu-L`_D%Qzyx+HG7#D9a`1x+nOT%71XUAyIYv%c*k+Ftp5e`)J zSp55vgD|B`J?c8M@B7uL5**7cII%J;BJMJD=+~(DJnedBfpQanRL3tMP<0L{eV(um zuj!h!@U~~nXJrmN(LXA1_^_z79Iu?L;iZ%;dPvYc&+AnKJ^PGXH)TYguE7%!~{+mENujr&34LT6XNDu}3O0#OgtIlJy4Ord0ZG6S!@Z`%iBg{tG& z7@dKCwLS+{zvdn?x7Ll!o*x9phadeuf5l^})pe)xR=K&Y7QW*Fc(~G^R|_nOF+)8D zF6?bIHZcPL3hapTS!yp9ygC*X{{h3q>{j@$E$=C-YttNH8|hjvmy!$;9AGQE=Tc~U zks*{rxw76Du6v(q14Qc`f4=N4Xn~H2+mPbh|4uRM8=oqDN?kMO7;(BY$&xY7RB{bK zuo*PFl?$GK@crn}2o}F(O5GmJPa(O&gWQpnzSkaS9nlf1_*x(;vl2f}2{aY<>^n$| zZk-gW0{{fG`2ObYl;L6|H@QO(vZXhHgQfx~RjOs4YIe-WE6h#&^*yBU$qq;wk zm=*WHNFzBARXQzyiC|XoDAoQ-mqCr_K&E`}eD&b_;lSIgULN;@2U|cObjLs0v)u6f zv!mKko_x=J?|mBUx5GX!iyL>YWVTe+yab{^iuKJ)-^JdO#h)Soawzl<*wu$$)nk%Q zcS-D-t3w#0`wR(^gXwp*6r8tjKT33*%*!JfjJ<&B&>)XB}NE6%t{+&leh?Py2o!K zPV91!n(KpKY{R2`f@H7B1Lkz$E~w<-T$x&3(4JsG=Xhr1{gZh>YfRUvkn%(p!|Jt( z#A85NqJ9geOh>+1X+obyGy@wDat9s)BlUx9{5=7`ZQ$9buo?7#o2A!?XQ-NS#I>T{ zAe;aHP?KFCVbbw&;u?23PxRCodZR!wNPsF87Hc5V^=LQSSrHz381YK1W-c_rJ%j{`< z&fw>tvFYjTfd8a{kqBrDItc<)IJ}xHdK#GMdH3tH~m!_iX<;P2a zjiA{G?=;&6TGW0pbKwB8#AmdRbb0Ipg@B}^dIip+%NDIGR0K3~Npx_t0s=jQ;>hKL z%Rn@yWs3Pu4IW~v43iI_4r48CjJyxkFmHPYH;@F`{4d8FIr-HhB+~rn2x3=&m{4;q zbOP}^>+;)&pqH)$c%amQ-!!p!-eM!Hg(-SDO1ja8>Vd*D4}x#6eitPY;Q- z{;gzDoPinGmYOT4(aZM6oT|dvEIY0vQe%0X5&A3cGrVysw)wp&in4ep&zGQk8JYqH zlR_~nDNUVV064&)XT|h3Mga&%zBD#T2>&Ye1WK0ob4A=hrbjTgfMS#cWMKIvL$o9O zt=HOlcE)iJUhfP88z*3|&`%hW2sGuUIKNlM|4tHAdOsfDMAwgMq#QX^U#QOFHKLQF zShxcL3xcrA35|*w(4v)8=F=~juL6-+rW9wwO`6obwod5GP2t83f)JrCg&9_wQL;tdHA; z>)gL-bij{s5e}3Y3!30^D+{4;5_zYyF($W~6Dl*1qWbhf1lcT2CfFKrX*Rhz$QgXS z8!;cfs8z?%o+*5IWE&(i`Y%07y=)nH^19sLSXFx#i>)s$v6RQ1zdrGeG$Bt7S>P z_W!mzBD>1!?D(Q%9B$yAFW%IyEEp`v#bP+U|MsAlW+_{Bbx4GPoTST8AaqZ#Srvbo z5q!Azl)FaFKz1bIEqS@Lw%|Nwu_82`dATeke2@3qdr@m@mLt7F7_ne9Xm6>c_SYjs z>5xfsk{yv>_RwPN;Wa=RZ`HQc}lbs`Ld}Y>wkv^wvKJMU8U;Y`iw;^g!$TddO5+ zII2L35u&XLGvS8WftAE)gR`|Bu&rIT0>M$G>%P$iVAqZFg1Ir|v;&x{oVI2FIW(le zvM>8-QA^7Bd1L%jitwLFW=Mehx7Gd|T-0pey#+~JV16(kL?V&j>n2gmta+uW^%%Sb z){sAE5pH~9G!_8A@%c1eUvvb^+P3JKf1{m>iH&AtbsK1dGda8k=2}!r&`>2fPht^( zIRLgi{IMCoG_Rb^j2`@wvWKPpVKzVB)iz zZ>n4Uhm4-#e49IN!Wh=bFk8j?t6DZ9%xR0!aku*AdK&;qX@Hj)77P}ZAEg`Zhk-^F z*kT9^-ve&Or)a!`Rn&>BbZoH|Fz3-i5zvL!iQb|7?=;bn=NV6bqG$9vyHN1NW^uiV z(YMP7C;^Q-`?1m$N)_!4q~PypzyHKp1r2lP_-S+X4p0sVK4wxb=FSB%4Q! zYza5U#sqdEOAig+hga|G4H88v)%BG65Nvu1D|^-cYXMl3S^EPhqS(qx+xD(aU@_(I zB?FPS>}+jIi@|`l&HcZw09{zjHNdU6Gh08VO;Rivc$c1Fi)eTAZkm&bWX&r&VqK+J zh1;IG5!fQ$6c=~FG}=DWwU@}Yq| zcjnsVkKji4?mq-K6$6RYp0$afh-1ASRn+KXB1D)R|CnUcaO*SWyBZh&itJ7I42(8C znVC3EV5*4*QsQ)LA|sbPt&Rr`!ur+TyyrfEm4UCsfU#O^cpnfzvJ`Zb^yIX=1J1~} z1n}4VQ}-O`G7XW7!1jbd%gBWq_xGa+bRur$JQsV7K6Xg0H{=(WJ<->XkN_x;%!ci; zJStizXlc#CT*3bqxaayV>HjRpQzM6&r?P$6lCs>SB8m;IJ^NccPR)<~;43k5$jMxI z?}7)j?PV|lI}Z;W7|NrOlITK$eTz2mFPt_t*5+s@+u(>foCy9xKo2QVa2|(e`x280 zsjUX$$VlxFqN;tsWK#3#4EXu=K|OO9Ef|+md^4=FTQJ&GKT#nUDUW=V-Mjay`AT-b z=Z-u>{6pl%fD)0T-ESggop{Q13f5CQZIAF9t(6j4-2{DpKRzE8of1Y=Tr5;SC=~(4 zzygE4p(kJoF8v5|P`Ta?l|K&zF$I$e53c;5RcS zAYUUjc6a`>MZ%?jpdlRIXFj*Nm8j&g?ptX6{uOic_WdWqBPY%B*8`Em2|DJLKI@=Q zN@danr^fh#y~Sg}w4G_zIuzZrg$jMUq%DD!`b?f+IWAmm5bNELw?L zOu*)y54h51tQXOXz?b}G+clWt4;Z@6S$G-(L8ry{LUj$`)7GQtc+7+cn$GtInBY&% zdAAiTxltJ*WT3(Q6*eJtgM>j`I1J8^fpzp4aHu+v-|PWwv32oeP7H6uW)J$>IVQ)e-J9it#+EisYRu&|fUZL8x-0TC^_i4W!7w;# zRD#Xy2a*;6lJlKex#i#qBo70tzwhf1FOur7Y9rnWSKMQi5u98k7d!XXB6v9NTSu4( z^2ad5m>~YP6GPVn-e++P*n&@YtL=fpu7uG0mRZqGO2& z9B4TleS`+@}s zyp9IIKf%NNa%R+awk5N010N3|WW>Rgy-B6ks8jf4ENH3sEtKa@! zMBp~jHKTH_>~F1|N1(bec3LoquPA~fZpZXcHAo2QvTE*p7-OTtj^0$TSr^D@Ga>QT zZ}H5+>P;%z{sY{83kP8{NMgIk;Ye^t#@K{}p@rVq_mwa8=EDQO+qb0a3;kXb!2YrWd^HS#>)Ei##8M!&V+e|f%Mqj4 z$mDl1A;EIFw!}exs_@(pwWEt^bQQT#13K@+o~x_w=VHk*-pv}Dt%Q>9)>>VGWC zH_K8T4!@v zi|h+z9>#5O@K!-r*Q0@r@`y5|Br=cX_6e~<=N-tSoC~b;ymFJ!S_hX#Kkpe}F(=HQ zlK;O2YyZ3io&#y6m2R5J323f0u;_5hMd0>OI@Lc!*@*9pTIi~6cVOgeeB*+z&1T*f z5sGVh@l{+qZKqUl*ZuDuj4Ks|5DDXFXx)|U2_n^v9$5k$?e9$an@<=yk($HE+a z+Y?Q}Ui&2sPYfW}HoxTr?m7#hfE5835CjuyN>Xb4R=%+@6^%O=jwdnAdeUY3Hi1PJapt&vsg>T@{M8k&3#KHj7%9{^+C0ZkI0i-D&;C2RO(V z8#OXU73I>ZD(IZ4KmU>gYunjP=lJ_M!QfHu=^%+uZjY-E^q%E*C)IZPxq zGn2|*EE8}+P?>QDyzdX>N~7udQ#Qox9)VN;x{>nn2TuK(LWX!HmrWT4O>k@@mNxH> zhA}3zFekf2Xn$~<>1RvO+%?ZtYTsQ$O5=YjplQ)@KC^e728n6A*~ZT7T8S1mMl>!H zRPzpU+$CAOWFrTLYF=6N0^Gpfy`fn2Bz6+ZKZ09%&Co!FyiCYFbihRd&eY0ohJ?AR zk*f9ZzrR*g2dd(-vu)<1Zj!Tg#U%Xt{fDiGlKt_isgeC0MmtKvA(3RszuIH&5q3QX z%;T}~_00ooQ$%8ghk<42cvcH7&8gs*$nb>2ni7MA3zL*02r*Kuy`n4uojCIy%j@N^ zDuO}#@^>Fd#z&LDs7e2EA`9J{wtVHc_Ivf~YrXmhhNe1sEeSQ4kcwsxsO zTFtONz?*+xK5?EfOi>f=kKYCjkoIt(fJ8YTaK$v?XU0<*#t_;?(j^@iN%68cscXG6{-k?ech zTuk#o!==`WfbYPVZ;N{K!Qq}vGjqHOeP!A_Gnxaw=nIuMu1X_hsX}r*IW{V5Kze7L z6f>7WM|Siej%gsueFzjYX7Rn@j*taNWnkeoYuA6)_LjD83)m8F&grk#tw>RjfL^`t z_J;YW4bf*MfZuIm?PmnT&Lo``hBPB(F4)dPyy^kqK3)YVryVT<6lT^nGcQf|@_?6X{b^O|gp2?5FxIOps@cSCH z4Amn4{9-s68V0%|xD2;jW6a}0JrHPY6@bTFs%9)p%+nm8Rr%bH%+o|%OKm30C6nMy zEg*tV{c;5R_XSIfO6kE9$m#z8s9`umQR*FHz9WwqBn-F)4RIT!(I=6tC(tDr(v0#g z!F~e6WD>yMsMt22YJ*xYdDlBxX&Ub+~9RI;e!kFqQs=TXAF+}HJTp=WaM+-W$QU3E4-NC5|tmyvv_~6 z-0UO$^zPs5*Zgfb`PPS{hw(y2H)8h<1!@OU{+h{{-m1{U(&w3*qy8%S(yjM}-EgQM zXqX?E)Ol649wus*KYPk(DJEe4Rwe1H|COQ$zt)4*SYFP<3>3t=RA5BPD-A z=`v{wNl=S`Nbk`TirGeEK&f?v=;r`v!2pV5?GS{6y~^ib$t|4j0}gdP=v6Hkk&)<9 zd7p()I&|SVjwuWF1C~Uh4m^uo>Jo#|?N?qNP zFz5p`8?8@s=AL&(e?Ilxsj3Q?dkX|Y8j(j32c^-e;))!Fcpfl`OGhDtl3SeGp?EXG zvhPec)$r;+C!Q{cd-ow5^;29NA5|eO;<3vW(5dBP7PSF(6NB%s!%#kS2?JA7@^@U2 zTG|Ti#N>6NA@P^f&ZK%bTo2dTgpsE*8NAI*jdK1W5SbRv?YT{KG`3q6WD@h0dh)mF z!Y>&E0UKcgQLdHqKBH}a$Tw`uiQ0J&MfVn-BAcR1Z^eK53ieMOg8L!ULkj2S+Ds#f zcpW`h>uQu`^|kra4<-k6@?$UL;UOHc zRdLsDB2&SKsUIn10zOPT_>W%e=!5O z{m>$#jIXC6Pz$LF7^L!@rYdvIx&46x9KgUw4N^kE1fY&!!v!=$^azO9qtNWzHR z&?Qkd^z3njl4L3DbduEBMo_%lJ+sB|A#LJcA2gUml#N?$mm^w|K&H05+X;*Cg3OZ_ z+ulpl{cM`{4`Ls2@NHJ!NqG<*u63)PF>MQ*- zSt}F74AQuHwvvKP0&H*$B6yDXmHKjI%%z%h#o`Kd%tv>F4w5F}a%blG(@yM^0E|v^ z8b*sD%E$CM^T4R>IC?uH-U`@1w?0>ktymQh9Yhc(s&IJYxWC)oxzu7zJMr#g|7~vD z-(1H!-3KF<$|QCjmHcOKm2|DU>|B9wD553Qqg_`vA;E;NRj6+=#2e=k%9o|63$JQc7tj)_Byo7Gn3+STP;ty;jq7=K{X5Y6?J}UKZ z!uv$o*lpLiD^OiW@|dZvfri&C2ui8gGD@rm;(?bF;PzPHu)qryL{7_9CpCd5=bh?( zLsNDnXGouX4sQBVV!GXFG+2&pImQiGy=o^=Ct_7n0fr`o$?pde!OSwwl2cExup9*7 zh&Y94WDh$BF{V|F34V#vb$x+gau6-}X>69T^T&_-x|j0+_VfK6 z=8{Ql*3h6z1>(hm&(*67Am&>IXWf(i9$@lh3*=jkEXQ%n;*Wg>FpX?Dq!~-~{wNff zH!8xLjMe(LK=+Mx6(fGSI{S6=~t2-`}`LhqJ?Tah84)(4sr;lai zc~WVfo>Gw(;JaD^Opq6Z)Or}q%OB+&=#0#R(EE#yF!i3yC`k}~MhhH;4KClX)j=ux z50W;0mY;i1jd7JYE)lSP+CcEu@0S6(s6R+_+h;kAy#12^LytGN<+tUz%Nd(8wh~rngi|eZXYtLwlnfL=FMgKg6raZqOn?MJWk;Tz<@(w%)4Plzgx3?Wo%*ju-gKpl z4*+c=*xyP5sH+6)f_sDT6P#G2@Fu8Hh|j14^hqf~aA-=IiaqFXU}kjKkMB_0E5yit zAr^3W2?Yn$140}kMu}RJ86OS|CIn{O4B&-TKsc$G{)iJ^^&T1ON+|^l3lTzMp&h2h z!fXt1_Hx?1G_gXJWi!~h-S@rK+`9@SLjEC|6NZ|^Oo$Ga=J*AY7qR<*h8Ja$kR-qWgU$L&Pe`4NNwCuvaG#Lp7>DzV$sze8G|K`gMTJUjtJ6CA zw7y-crG+|z{e-$Eqa>Yx*?DW*M>J|SmPR9#BP^7WHA)a&w>Saa%B1$Yy zyO+NOCc;~vhx1~;1~{|~DyAgQ4rN+sU7b~ac6e5#{`o_qD;p{;UDsz5gQ9iT)W-G$ zO^TjL|88Ax>d5)&R9OlgguEOqd1-%MXGS~ii=H#=hAcokLwA?mlP{UyYwpNiB zc*`}yh&xXJ4ZzahGt28pp*oEYJa5O3ITld{Pk>xxP)o;MHq z*0m;u!uyO=>1Ph}!mhoPmC`dgZkrX?o$iFrK2YXS8D)c~G zsRK-46q_Lp0@E&|kBW0f!$0iHZh=&ktS0(|Q<1Vh^KSmMcQnXL1BteL<2UOxaX!~F zQm-NkjSN>Sdh^b;bQCz#m0!o1kM0l4Sd4CVjlmpW^ZqPl0Sh~ooeVW1PPWll^xIniFgK=gtj$i2Y&vLphCLiF>WL5j{ou56?iz!cUB zgG`Ve?k?E&1hWrtI(U~1QOdJR`FLuVK9QT;mg=Wuh9Ih6V!Z(6;^CpTENTrcnluy20I`b34O~wENC^#Xbg4>-|K-PkFZV*3zo!JuX(1Zm6IWzWXGV>ESmEReHl%BP8z+SKesK%{X2qq`8mZ*ua3!ni% z5Mbg5ZHQZ5V2a|+AQy82HdYGWZ}`CwYYhtT5cUN=q97k^X&%5V^84a;^B&&25-feU zsQc~#r*7&IrMQn5?J$Tskn=VM?|WPfe8t}A4JD`uE6iO1R&_|zbAVRZx-OX60ufZ| zyE#`l^X{FYI506V3Axz20`N(1fGvP|gUh%Dm?4o{j6Xk*wu82A>jR~#!2_BEY{1{- ziM+=Ous*_Xs@lNR%NywW4d2DQ7|PJ2T>v+sL9-m7;4L?T#3rqom5X-&hf^i`g3flJ zU+^AG;U0G7o|iqRUVj5JfuMh0+#;8*lrEs$Z2aw!@U1-vM9?(62arw(>rTxmfnM}C zdyJ@CRC50}>prpTMKb5{1u|9#Eki?vUAh3N#D!O=Pr-TC>vge|j}5Ac5Nekyh;drH zsrX*lW8=ljp+(=@t88}Qev-?GAG6)V_LfZHGNc?Mf%_tI;w2955iYPiL=?^8mhWyF z#K`O1Z_t5w5R`I2kQ)Anb!D6U^{|PTYxg_r$z-FOLpD%*d$sJ&jA;vc9K0KbwWB-) zQo)>VQJ6uLMMcZZ1z-(QUn8pJol8#kZik6j^w{@e4fclTi9iEXIYUCyT%RtsIT_s$z{lyr0zL zg;2yt3ZTs^dCC&vi0;ivs8+Xe1(_q9v)%w0nt=sqVah&A&%)q+)}-GN-Lqsqfyrac zjRdSCZ2|$Uz?LXO4i={UJFMMr!@^Nm0ax_`FQI4$sevD$lXm_JN1KfuYToZ@U@&W@7-5l0u1cRRq-{4C69f9=|b`X0UD1W8y~ zY~hWLacrT#Kk&r?UfjCt+^5QsHrmeujQ`@(xOcR{^~AZ(ZypnIlKZTA^~YEFOmONh z9#`AZJniblKE7a5IiaAl#HKvB;8`uz;cj|a;NyMk{9)3Q=_7YJOi_{#yX&G$GGiU& z45R?Z4B84YZWF2?a5x`Kf)q2}okg{RZ&88c=Oj&H*n_aQ8&%U84J>6MmqMw5T z0KI*{2hqifyFW)h0LOKH;$IgJSGsZw>?jC({)_Qq>({D2OhZ7ci{*@cq@ZR}6-dHbBT}>N zyL}<|BIJ5B(>HRRbFMiIE2#*rj;ygP??J#KTA0J`%Km;>qCSx$@k_(c(K_Xw%Qdt1 z5E!UPD1BKJn#nneB0gCIN5yp3_H6y%}-rA{40^KhEVWm}-}4LjLn(D?iTwa3B!BFg;( z)j{<{NqS$E6&MMGiyonRG4-U_1^j7XyPixg%#Dz3*gO7kmtZ?V0;VIhAPsx;#`;F= zz{SKCiGm^!#;}EfKThGMU>vL9b|LoSH_vFr()9!h@Qfh9QKgM-GUrlL4x;ZGQ5-{z zgpyrFBvE;*0>PB11N|~iQS4VlD$=J?b98_tJiF6g_{vcNG4duAV-219nxC{w!XnU>KJZpJF9%a`wE}y8A=RF4Q+0BM#bEML7lCTw93s%~ z>x6RA5K^nrPVWAcXH>17aRv!!TVeTznqcK|7fMRp`sR%of((r-As1@WI%IAIYA7T^ zJ?%220~y>>v0|IqI^KhNsbF;Vl#xqO6S+53Kjt`>i05|wULdek6h9J&GPFcI-=zlR z_;ZO&tAT}Hd;x(s`ojBcIVpCs6?Yw(F<%M(eGafJ1GP|u*F}Ec#t1!)_Z{nogNYP& zX2**)dN4u+IM@s2B{1W3d#k$+4_WjUL;mz@WOqc#7MxR1oA4*$r3Ys0V0IUw4;hs8 znsirdW@J97REy&zUECXP6CoPscY(+!CZ=HGu&{RkQ;^4bk{|)x;gca*5Sg zeevHyFK2|(L8R?t1U@U;nfd0!LBgO?RX^dHo3atuQid~0EthAl?c6E=&{rq*M`$r^ z-xpRENh^-@s~c)yr%O~S6fapUAAm+!*6hB(4ODYkJ0IF)3x+3aQn;nmt-u|80kGZX zpuQWBrNyp$(S;y5P%zW^G<#`UA@KNz@DGccfg+2_fk02%&&iVOk&gOnpU=b$lNUu# zVW2Qe0hD)=LK5I>n4hC5-Jd#rqvk!#rpbbX(6?SSrjh{J$T=m%0lWI8`Zc&pwW)F1 zpy0N;8*tNO2jQYJ6F?IggthX$p|J0;Vq`2`HSwMDPIMp~%0aj&Ia;E`HXt!DW}(4k zIk*W@9DoQH{kB@?oJLK$AO$q{;d`TMr5{zXFN%i=%B}6JMK(oCCM<{VOwt9~qp`f1 z98gt8BGX~S_bmA zjcU_=&odSsCuPzW%^p~HqZjddHzeL1NV7J0RLhvb0Pa48;V$MSglucxgbLp@{HLzsJbi2$-E&)R@-a$eG?!T&z+_|P)I8qE@ z)7faB{a8<}cF+4!`cK5>qw5sKLt^b!Oa+I>7o7L!4L31H(=4~Bb0`5i8+}cE2^2fY zps1tEZh>nE0%XDUbYIzVot5HS%kT!{sSOMsn9CT3!H3-FGv#^sZ6IU)53n8Hwde`(Bp^&S)mD(^%%ua z2420_guY-=q`Xp`MvojBY-QQ==v7S0O{}9mW02CNBSQnaJsSH-_C_|%0)l0WSX}Jn zuv~DhE#M(WS!X57&#{m@Zud3}hgm)W;fQPibL(aPXJ8&n9jolg@6Dqa&=Aq4(eQXy z!Tt6jK303hM2Vv*9iGT+;Gm^5L71#{vpv?t3CLZ`fLQx{4$Cq`DMuiSl2uLTDYi(l zJ2Ja&rkYUKTjazI3}OzoQp`*Zw>^@*4Bp2G7EYVGF?)f zweU7<>jgBT(e5oK!eKRrNM3@0A}q`Re^ZRo-g@9?c#@wmjM~q~gW4mkCPA+I>oJnB z@d;}mv0`iGkGolhA}R0UvUu4W#CEdm1g}JhEf(wBxmt=f+a_7?*4|UOV946$1ztun zV-*ajnn9}YVjG_6U+2$??wJK8ritlS(l;GrKPlr9;cC%!aoS}=!6q9>5?@8?`R)OL zWb*gO->Ag-jo8p{GSa74c*n;w`mJ+(iv&f;gCg$obREn0Yxb{QOSm^?YRiP-qy#O!;ibgsXW<37Hu#;JyFYQ; zn^8Y|VNPArLi@ur{GJdm7cbF&#!Sg33HDGw>y4Q86*oAYHV#yFWq5SHf&`u*y8Q-K z@l#Ju)QVc^r?tdn5AZ42uWtcnVC*%JOk0{PO7bj$sZ`44EJPd8{opz}`5W;R6rP|R zZ`wZGa7AGy6CoBFUf?WPN(C~7QAp0lm(648+qS%O+N%5GSy8ub^_l}kNUf>#2VHu| zUKAQGhrJ0y`U*mIf)e}DSKDK(n-{OZDZDmgYMX?XeCy#_G+#obz{IYdRz=x2%$86p zl1Pz-c4GDln6(gL!SQI3(7fy;m}lz-0cT!3NI-rsaV-_In7K%9oz;#pb?Ia6UafQ~ zl1FCn(3@tfk1e~J%c-@};|m;5yo5U)#z63#mCBh|qYK73tXO7CC$@j<0USp4CH2Wy zs4yq<2Yd+0;D&OpjhX%vAaX=@`DF;kuNMPUMf;`&)P&rV>dlU8k7p`7Kf#M~Nu&kE zQh+1bXE9^G*=_<>bqGh?=iKMF=z6E=&Sbw+7oJ?umwVHh%tV6%VWPxbRsa6$q4;Z+o^|jJ4iB*9TK^ zui^J9ze!hD?B`U(n3pzrPPr9KfcV_eFm_+#;mANrfQ`gdv1O=Su()k3+sF;a& zM}<1VA^C>93XYGW&|`oqU4C{GqGf8}C?N zP+>@@tL>>Zv5=Bay0f)$QSZb%@D0lVgdWhBh%O5AkE%Q-C9r&F-nbgC_P_mxR#P^6xYcz3L)R za9sDa%l$A`;z0q*x&}XsvULSwIoQCJ{UrHv@|82tTnKC1a(tTy8>*Mg@Em*aE@_=% z@Y?4MHrnM^R0LKWqWVNMx~SdN(@8!o6IX|;o5Yh;M_{n^aoAFXqjWf3klUX6)e*pz z{if{@M;|^gS}diG2v-X=vg{dh-TBd$%R`*D6tB)+xOhZ$3x<%YRPTVJ5g6+xyxiOU z5F@uH$=J z?+n$kcbb4wK-K?nB8u!LTu^BmZ-{l)jvw;}&qa?2(S)g7K88ahRA?tW0h4C7VOFWH zbG+OiT4<~PI62ID4qPt3Nz)%lMMdMfIPHX`KA|5LMV#=AFICFs0!X7*WW2e#5w>KQ zHtbce2P#eHH1I`6$5ufC5=7Tvv;DKzTX1NTr8X!r8yRizBW>CUr}}Bve46|=w&V1{ zEIIfHv^n9n!bJ^=I!e45CrT>5HM-iZJwFJcu#E+2JF@vDE0u_K!>t>+kw1*T@k731QVvCBoy=yU;;W5;!+2697&PJJIlQ)zQ4Nty~-C$uQF9omI!gP z7^qDa{nnR3XPp#`LGn@d+N9hvMhz)b*jc0TU_{)uVUsC8N?Pwkg(~k^2?58A^k#5_ zL?OxvGmE3WDzNcti3i68QGw_04$pH5?`8K;9TZYB3DYovu2SMpDY&F3cR~}~z^vv; zrj#TS!<|0(v_qSYxh-hF8Rgf(yBT}IEG50@0~)3~U~XaJb<{)QGkAl#BfQH$HByrP zB=GPj9gY&vAj%7GVStt!Aeln{SXTQbOrnH+n);ey5yeKYe7~y8UFgh+IK?_4vr+D( zWC-Ei63s5^R)0i2gFD-he1jAY*zvh-9kj*cKt#IVPmUJz-j+OvDMU9z6gKmGqC=eu=zFqVE^3;98 zFuBONvGN)kai6B?2hpN>{YP>C$d`c8d2naxiwykNNrSD7t59yLd&r%U5dW4dyY zTIk_A2JW$svT8L6_1-ua67UH7C~7}VQp7u07>`7Ac9%wJ_CH=6uYdA77p*^@4>XOi z#UOpKVV%3_Iq8gamu56@9kB!z^TxXp@dDn>s$A1)#U~GOalC75N(K=z3Oq+e!@xmM zNx;2YCvBy{CFqN6ChZ5r? z1t(_CVGLPg*n4wAj;hpOz?fB(c@Kilq0_;=F96?&-puDl7CuZmEee@`!h)=FW_#E1Iw9!ZE+O3BS2#Yh7!9dk~VFFl410%N#@^Z z7e0>$w&mJ=Qd#tZQ7Y96$eu{euM~91xPA9cNv374CcqK~fAKjUE?bz{i{`40U=nPCv-nI^UkTk(QwZ$_ze_Z}FqXY&ve-)B26f^Y$ljPdNWg z9M>Nh2#IdgwQ2>NDkAosvIoEHeJTBqhh4u6rU3u8&=D1H$G%s4&t^70))1Ko%!qSs z@T!oa+MgOz9v+~t%dp=WYRSK0(l zRteBDKr5>KXrh^-5+Fk*S$A;}7&2f8g4=UL7EZ#DzxkgK|DVn@q1)Tnp_rC;g<=f( zOUqKYh}>7O;&`9QXqQH1=*`s7PZ+TSO9}m5MRG%s(ef9JZiWuLwy7K`fMfh3(?9+A zT4rDHHx2)`G#v!EjHKmr+tb_Oi~r{TDk@C*Tq#5D?ERL{;>JK_Dvc9gz7@^A#-OSp-}03;c50^4Z+@LkIk@u8Ayj2 zM`2EH&uxLPf8d;EajHhs2V_NSJ*FWqm};ikna6Vhac>gW!RrZsx$UQ=GKm;+Jir{K z0g>AuFf+@!OxvgzLwF?oB(&3rvy*tGhD=&8vY&}c`ePpjOLdF%6wTcrSb$FpgpSq8 z-8D~9DfS-bincWG@V+!mv>n!LXk{pV_46O9Hg5rCrl{6kpT^7$&tO5D*aq&_orNc+ z_p}c!Ec$yQx#HR0KcbUvRT9_)OB)3S z@22diE#W#k-i#6bo3|7Yn1XP-A;dcdt6_0D6dXTs!~~s{IVOB!FJd6bT@=k5J+Jfa zoWlLlZW@H8;?L#F2_NI}rNY>u=@oM4n+-ZJ8174^#q)Q(mwAE&jmrmgOkQ;T#^uHD zneWcATl7Z7p-+CaBVmBM;(A&Y+wFbX*U}T6AAyK5VC%m$n{Jn!@FKf}w!R*zv&zEa zBF_^>HQIXn9AKy3pi@jKjI(h`Q|r{)ew*c=fRqlJ04-6AN4j!9{|2vegnQU z<(cRCl>p!ynhjOj`K`3pRi;)~b&zC`vkw7Wuc^Aq^ zP#Pu4Gn-#S8eM|6ng5f6CN~%oO?2>Mvb9y5GLPzD;QYJhOX==->505gwoa#8$c}@Y z^uE^?zEmBwZ9NF4c=752+}n@R84J1Jq5KUalD~v3>e)UKCGksTfu42jr3aqumOnVO z@_}{xJqyT85cYG)SNY@aRY1J?r3nszI@cQUH_?>QehQ@_DjJEnI?_n`~NuA|5R6tLLfl!uyP1$d^-nQx1qqN|Bjx;=bE`ZrN?>5 zax`siuWVj+wK1+}zM&RJem~=@2ztgB#3kHE(fIC*{+;GmXB;!u<#wxwy|Q3~?K4$K zffZf<36C*9k<0KYD@GIg?8CPa|Lb#Mn~c?Jx0wp^SAb-`309ChkGB1g!+ATxz`I%= zB0~AGww3q{!!ktn>%k_9?!)5$!fLpuXuK#h&*%g4tC$9fU8fd{4lmYaseN?KuUxLI zRm2Tfr(RrFAY^Dv9)8EiDrN>-^@ME_*v4nw;$s`bG@y9|+qE0Q6e}~Cv zx`AR%QV)b#h)Is|ZU#s`?89-V9Yvhu14EZ1I_qf1O?b)nm!1GG>oK{cEiMT3NvM2q znx$K7oB7o5jUbg_j2rRFy+e0~G>o1*KPo7G-s6!tMetB56=X;a`X8wT3F^$+EB3Fx zE2HOPVKxhe^8N>7hZ)<>N)uwXS<8hwJ1Tjc*|Ism&hu)}Go2UP|& z4!ueX82msqHdzGGP-pn*u{z3U_~SpZ{mPR4H?O6_Emvs6kA~OxGn70gtP7o_`puCn z!uezDb2D?3Sn)^tR-cHZacCag0vy?=pWC|?eZ+a z{8X&5vi@3BZ=pS0RQ1QNXFw+FF*c7EB;-$RXNKJfLWO)sO`Xy(*sSq~WT#jfDhu^e^1Dz%T>d#8P)d*iYU>Qab^ zI0$PWwC#Hu6l;MIA6_R@_h6|DBvZ-rwP6eG5|g)zfx8tT7`zJa(K0qKHbH1QUcdvV zzW*37KDtIew|;Pc9rq#|!j&8bP<4C5!kfw0tP`r>;PiFfk-7O!!o5dWAzJbNgG@NS)&8YgW8mjVvaF*2?Na&ynz|tmdtj4lY!mre%8Uibfi748L(5UG(c|=GKF_yE@y(d5)U?8r z|212Q(_rc#J#c|qDl8P75q3`wfE3^NX4AzATy2bgB!E{W9CIc$57omTxc`23VMrLi zLXb2Irn9-#r9inOvsW+2D55_~6(lJkbSFr*d}ZUk?4uY$t2yEEyA05jM#B$eIeh$v z4l1++sH;AY*c|eyOADtD`L7m|e@mUJ5MMGP5m~e}kO-60tJ)BMA0U2X-^dR>9m+0i zP!5pGd2;?P2fqD{Od>^=qHVjq#o!JLBA0gE--A6>t1ZnFId}r3hro(tPJ<0!LlB1P zaJ7pH+k1qjKyQA58x`r6{0~Y!j^`Y3fqY*8haQnoC|CU69Ak!8+SC6v4+k*6P913U43EO9UM8J^_R5@G zM0<6wQC7gVs&zeHQ6>b3q{vXDfj^T?|Kr}m3wvLu$HovR+Kd_2k#~oePPzO4ivY#E z=G^ME>6?YVc+5o((TEoj;&hDgxRSDzbw$(i-jJSm{io^Zy9nv$4 z^aq*|r@QQYc1D&|{a|x@vK36KU{!X{k3ca<`utGt%9`T-k;wny?5)G9T(|CFLO=ll z=|)135Rh&ZX$k3W5D*0E1_`A*rKL-dCDJL4N-ABF(%tpl&(iJL=XcI~-t&I{>}y|p z>k`*Iq!pS$!x58 zuctvEJKkm~I%fI#80;zx-TQ*O)}u(Bpyt>(+Ggr}_}JsnwYT}DiGa&$s9@Q3nVa;H z+zl+CaohY(0=l=r?k%LUe-6J?fl)h}UR}~;cpCdqF4oUuMW1aEF{;p8woAvO`M=YV zc#X+OPb+mQOngnHD6Y#NJ7j+?@X3>b+&8^jwO)A#opiJH{FpM2fm|>btIQbY`LFFP zJX{nW1=qNSTkO%eJQ$gCaI*MW0<2r*fC2<;0lYV9NQhJmX@I>xje$2K>}hy`*3-3N znpYU1L_d;x(@tgK9tkH^i8%Q?_CCP1{yznJ;=!KJY>vDk_j0tD_hZ!)zdVrwD(IMJ zx=|tS4|6J(GiI3Nlkvg0ql%Zce-03XjvXlat|RX_az*KHxq~blpy^eEFG(#dF2chi zbv5dopPLCIKTejXo@<16XIcmOc|COmd0=^0hB5?j&VlSCRuU%w5M4hqeBKn z%q)gV1w+M%}PfFH-GRr<$=ZF@qNV{_5)%@9Gq-wWK*=r2VKflnUT?XzC; z3o(f#Ah|D=BTuHt)otK&(n<|nP%b9-wp)!nZ`*IyFtU-#AVQf!P+SdA$Dm!7X_jXd zFaB~2Sn=gx0^DkNfH}Nv-z& z)eN#e#g81L{@c;Z>3b7u*Hp3sW_pos(QLnQjb+Ke#$pN55GIC9gV2dsS+1I|q>1-g zDH`TGtddwV{zFF)zE#_{n!Z)DPg}~Ng*qV9R^U&!9OMDMv2xu zFH;gbBI0gV9oqeAwpwX03l;Ab2$lS0WDosG-Evrz_-0G z$Mb~B$ft+GBeX8QGwbot!IN#|iYKAiX&hTao@)>n}E zT!)n4*WVQSB_+Cy_I<)MTlFReM6WQ;OwcgNfAVr{BVZ5)O}ZC%5gCkTl<8=IwoXF8 zg|NFv)@db(F{g>-rd@#UG5@V-FyHZjNy;bm{fFDF!$r^7sqaXaG&(jr3>~ZftQ7xp zQ?Qybw6|dP6NW^s6CVGW^?W$GoOd50h!QOXIdn1$-a}_})XvsZwQ3Z9f}O05KY?^P zo!^m%@WkBdN9AUrt!S&%z|I@Tm2enjd*8nKKeTp&E`-&2K#aJGa2KNoUk);q=*vnI z0?LLG*coghO4eV2MxNKr6{iDDT@G2-CZn0VLKPgF4+^l7OyxC-6y0@eT49gmkE_xW>(1gFr z-tgcF{yjE=6?$5TzWcoT>7{K5Zs*P z6~#< zN50YsvrmlYDJa(wmv)g$xEE*StMMyG>C>pp&j$kR%>$^YJCjtA*6gg!4fMd^{DV;| zDkInjegOG_gHXCtH@kU?I^eKqh7iTF&zTnXRU^349G;@Iq2X=^5@NrZ>{fT)0QrVP z7{zw}H_7HZf+s!7;xNmPy)um+G5Xy*rx28-?6BeqtyhN@+&c(tzIkw&&;|*a$=Z={ zNyoLKM*D$Xd+m*wAFW59yBQKyuBc#2=nIIcaf*@tczV}IRxBR*YYxELwIg(~MXgBx z6c|?P(d`VS77YWCG!PWWxR;^y@a)jiOck()ZCX%f3S`Wk0S5nNapCR^;S{41Cc?HZ z_XyEw?%`;<3kN;~s@LSAx|4m1PAS7MXmVqNSYoT#$Z=_S zEz6MHNK|Oxw&T|GZ6@C_s#|uF<6<|oYojU@$j>Ykqx?~2qNf{>^>1fK7kZxT-uk?u zKBH6p1g@%8tZJhC3YK}L6IpY2Up;znl|Q?ChbGqBhkpFXQNZS)0o9V-Cxqy)@58uO zsReN9;pk7lhV&L7;1LunJq*Szyvqn`U#qXZ3NzmiCP+&HLJq>rzmh@~*KJS!tmv+) zG$^hR`;=pErl<30`mX?Q62bER)Z1Lg%-ayNwpM;ZQ#iUlOErS;@bsJK5| z_{=7;yGt{pQd_akx5hFy_SRo@YfL4_v|BYU?oWNByBKZISy;)xVBUE9iM--DGcbgv zkxvQHNaE_=Dli)3INLK%yR-WVgC?9Tzt)s44Umh!N;ds_%h;|?sxx7NFR3JHN{Gf? zPOA$?s=&+zX0)Mwb;QLAcQ=OrV#c68hTRr4a7EsMdDeK{;(_m_#SiB%u7Xo zmxozNV4mW*`3=O2(b+exc*Wo_{I9_F_8r*8Wt~s_#f0rfUm_zd5XnHscFOgx&pszy zi#kddzWj;x;@iu<7JOEg!KyM~s^Gmd-`#3Cc%i59rL`{^#8dkhV(s9<@h!A94&mD{ z5>9kDzWv^Pv@yW|hKMlv;(zh6{C9*MPw7)8)q+f{m#|DZD1R1AGSClU*YebP;L}#h z42DM9W7g#@JRb*nDyg{XCWE5OZGR4?ZLghIrV>V~FW#HVjD61wUl-aE8gp8DGsmno zc=rw8^gMBbSKpWALU04D?wz0PJCNSf>z(AWt1;1z8Q6m$x0D3D zB_O4aZ`%j7yn6Srq0=Cpr($vD%*bu>8V-@YuNt~8FILaqQ!e8y&DQUks!UYE8q6N= zXbJu88h6DdCL$ky@+oT22r2sGgR7zm~$o2kz?3`{R)K~MH89pgX_xULN z4LAXa*E-9uGI=nqd2Q)O=cn&ZsH{)xZF{~I^NvIv&DJeV<#cm*qv-lP^x)>o&|SYl(*yaWBtu($7ONvWm6a)5*YpE+TsAk$iFnEO|u zgN`iI%Y485bX=f=1dhXf-%h?jC;jTu%I7jp<@^UuPvT76YF0ER6fp`ftpPN=yx{ZF zg~8{6=qDdZl*OKMZ=fstU3ithf_*I2!nrr@1`XQ4idkaXqwmr)SC&Rmh}!<(yEiuK zJHzXU0$%E!-*V@1D<5__Fc4;tg9fY`c>VH2$b3 z-_={1`CG$zLog|rl*_X|xS8(?;B-2^?cP1{Y-C@SNgm3P!8>pP8OSz7ub{tdo38Wb zJ{ewf0YV2#or{#Y>WjlM?`)8C@N%XGei3E8-h24z@>h!4pt2OWt~f1?xJAC+WNy6F zUP#b+-)ru3nG-9n@2Rw~5UZlc5z~E&1j4A`U*((bQay07Zu`)M;CF*l_EwBZR`#z} z2}g`0=%bayX6<9sNxrkaCo;l^NnK7O!T7AHtAo*Ufglb$8iadasu!z&jphDtSQW*_ zWkYfH=gBh#vqOs6yi67&o1)oB#bx}h?6sT1|M$D5xwuVx3k@qMjGS>7hzcjFCJY=l zKGH;rvMSfWKDc%ICyw~?fa$JjQ*ncI^S%xl zfv)S@0ZA0e5iiv4j(ZU7@2ZIr zQT+f?z~8?dHjkszaCDqYaAAl$uLpsTmQMj64JMBgGXHoth+dYs1<(Y91tL!7#7v_=VJlpUCy{NSAFm0;V21Qs=&WK_+b01#z2SiNV7>F zBDAMHIkU9^pofqiiSYQP=NOD8QfQ7>K_H#ZVMS0{*u~qr#}-Kx^Hk{H4^~T@#H2euo!mD13u^4Fm4S+SY$f&KDWEn&Q=Jkx zPk{NIsd?zc`EKY8?Zdm}<#B;8u8%T2k`{n?lV4AA6j|^afGCA&%DLyER|CWVi>_e% zY!65cXu)Ww)Zc-#_oC-Z%I~TRo&g=!z92GcP#Edr2=7=s3Nc5Ut>=^K_cQFxj9zh} z*5eCAWLRYDZD8mOhBwg@Hh7HM-@_B3 z&Kt2s(yy(ub^n~6bClH5rJwQ%-lz&{(Z(f1A|#i+)v@;G-8vxS{XbvWNh_p7=rbW!&<3 z22J{lxoas{4J|tjmK-ZvU^oZ7T(#Edv^MaI3_z>ITBXp*q{9BgbZ})h+4U^_BbG_D zC5UN}EuF0&T>Q68EFfQF02w=$H(x0?Y<}mv7q(@l&H8G4q4PLcoX2O=pH%w8$CmF4 z*E#G!Hsw27?>dgQ5;>YKnbe+s-6bQio+eil@K6v^vKMrYOIuE7b_@JOrFvIO*-`wX zoX-}@RU@>lk#KV)=`P-GOSPb8sp*k$euv}_xH}Iu-e3ucrG6(@UV+!422%clwSYy> z1KWe9XdnjwLByE_A`MS1MOcHV!tF_P-z7c)5hgVx4zt>&0uP$tD~9A zY6Q5GZi=?P=Rov}>+}c3{0`^FSLYutPO>9#-F~1%gUOZwVdEO#@8|dLI9nxhzT0#3@1F@PSbu$hl}^^^z4ns^oabgP!~x z&yr!yYv)jS%>|h5r}cv1szj{5SOS%F2Kj>BRf=H!7#ZX~OxLAPddrn^EoP6^W|#qI z)8>c^exHIyzG=w*Wmsj}e(A`Qm7Kxnx)=Ewgl~kjOy@g(+VCBynyF@fqWV^t-B@J* z^E%p$hw;RczWdfgLOioiSgtrAa^7=`pPL6g{wde|ZNZo+g@0MNf!}G=j5h+eyBVM! z5N4kX7+1kip|cX{2KRJJ9AZ4khY%zmS&tg}$OmH8?CyTf{TLD&RRO>S<+UF9ce5h%nx#0qqpB_rwOF!(Ecl_LF~E=n&J7)RzF4+Fpho44A7Q0m^=fU z36Ld40~yONNAii8HoyEhSoGZn7`fEn5};nWb`ukhb%H#&Y=7Okay);#zTDrtlmW+G z8bFKzYxr#;o|eO{NHyo^b?Y54Dm`hX5W1@O;=3m9>pF|*gCF$0*riTMTr371pp7h` z^Gz?k@n66VjY3?;+YeL08U_Hll=i{qNdG@>oVnw@!*(L*dWG7GMtQR6Xj%zUUc$2a z$2cg)lYC8I#T6nhxQX=d0(#=Au%0jPbG?h6TC0yo+U?KFt@97+Wr366w;7;ouG7PZ zF5Db4K^K~+YEDZKnQA{~1`y}zL7EIW|I(U#RCFzH-Zc{lC1Mg2891MQx%)y77~tfB zU~`!5jEL69XYtP^cp#bJ|1^O5BZD@Hy#1#=cSf%t4D4WeJexj(+SBH2JTt%7=5lRj z@!V_9mbLR%Z&*0`@`7~k+ef*MK`*YOF=-^oBcpcpDx}fXIa>CG9TBqJW%5T=OBnm` zcs$Q*)aY#SZ6J?q3QygTB>m0K#Wy36PFmXHB8l?XbC=#dIn+_C`2?M!!RUXGizS)^ z-*@4!dKA}OGa}>Ju#U1_+jYjc6rI_MvM1DI)7gR6jq_ML@r<+T4>USjh zfu57;MWgGEKR`V?i?7KlWp?H!hvYes!Mu)dU{iBIop;>tzZ$%FuhhFKH(9EflOp3O zk`kNl*EO&GKmD>Wag;PACVZ%Kz8A@G>QSHcKldUs1yerfN()OV5|`&gm!5k|G})5D zz}(h#Q4i^AYpa0)ny^?6j~X~kLzx7Do+>((7H@6hOlnP6{-6cuE1^S%%j=;2d5RSa z{$AcslTQ)fY|vQvI0EPcg0uO^P+gZa>9=BY1cv?|K-O>IZRyjfFWhAGFkb5-fCl z+u3WV`lTrk=;q^P@io2 zoe2;h{89@*m=?iD^F5cgO{m^TSseaJsU|Zb(P)%Wq#F9&+K@mV{$Hu0bO3))`Jfq(|bgY@f2W!s}39X|fc|EU>U5N(tbu!YZ|92!FQ#R$Y zMd-GEKbj$ZJFo{c&(#j<8ETd(qjB%FIc9APg%XACugqh+7)rg<28(F4(8Z#KRdcwI z)Y~91pTz10nvgyucROw%y|G zufENu2;66)OZ6loM5hhJ&)ctT8$QY;uvPi+h+N=r&H{FRbh5zMH_+~?gQ5J+J*~MbRzbnM1+Vd>+Z|`WUR3A> z3u-kaItsd_Y~FvHG2q=fpqbBS4lg*&!njymH~Fv1t+iVA*s+rM%3psgZ7_f|T!#}9 z=mfhHPiFUkN_=IwfEtkNUAc(@L|DF2a({7BZ;*s;>~FCFgmSq2<1504kM@hodK~{~ zPUpA`eC`d_RdvnyOw@7Njwu7%8Hr>bZrG*~_CPio=5-o_x@T%iW`+pSk;3YxqwLYb z9_t&7Hg)n)rvx*LRkjur!v2j&IDDym@N0HuquWC<(u-BQZ5?nVzGP_NYvA^KGTf-P!~7=s+q$MuX|#m|J4s zK0uvu3HnhIr+GyE#o+{p!;+jM;f0z31 z7Jr&P5oUYfh~#lZDC9G4>HT5j_06ff;GT%WZ~4D;Np!DMJ|!BldWqO;BatLDEoP8&BZ;7M3AFJ8e23_fQ8A-{ z4yH$fNRJMRTApZ!K!tQ|x$!GtXhh>OsnlPcDShiIU^m4U+z)@g@0i}^Bm^>P94w=6 zcRl7oA|7BvZEEg355s6)D-(?E)iB_X#iFJY#f+Zi@H*X(=ACwZ1dRWqx9Wg4xd+&Z z(E|_`4^6xq$ZKk9R&9Y4rakmOch~o_r=60-X(}ndz^ZK7TrYtfa2oW&z!g8Cb^G$C z6A*6$E&Bg~L7TE7k{^D!ouw`8U0m;vgqOeh>rNV-~dJ^`< z*CT#=eO277QR%{F-@g^Y7*Nuq{+vcJ>6n)pK0keG9m~P${lk_V8E@ok*u+E#`3W7Q zTrcP;fDTod7#;!WyiR;{0k&fkhu`UZ2J+EwSGltBG0-ajVycTG?B+YVzW`TNAg4gt zJUHC-hLW9xK^Uv8_53)yD_&z9EvHyj=9)1eOb`M-+T79sm>goG=XF@<Z***ERLjLwsnpmgs7zo6uU_);$c@Brk5So~0-?U&aRIxbI{clK9D zi1?Su8Du4|?^K}q1A$^USUuYFa@lG)l62Y{EjL*#dt_Sz?4X}02p@cVS>+3sxjqBA z+2TJ^?bwaqE7#bY5e(lZT^G8&KGS5t3bqJNpvVXTb}s2VZ-tm#QT}r)>b9!K>(e-6 z)w0z@B$SwT51L|+=rP2^FKUh*r#}{z`vVEss-_(j7UZP`e*6XmbzoX1Wls6KYyHKr zp?+}x2-2j3;47HcMP8?t(T~}_<|E4<9f27UP1W>jBKgop&+opKnTL_S#x7MssQ6X?Xg4n5=)uQ6Khkh#1gg7@* zp9u<*4kP83g|_HB2WmhLUEz1M@AGP^}x#GW-lxGkY#=_U>+P=R>0ABMg1eB zl1_dx`?71V?@X9*VTn-4pdiWz1t2kro_IXAF_rxdW-x>Y*)9qD9y~$urFs`Uqy;=; zL3^i2BHA=en4iGfcNtU8qd=@mg82COJHR=+^c0f~Spl){I%n9z|H*cGk+Nk@8gFHZFm>y7+{2`U4e6QpaEp?2Vr)I>x}O+ zmI|`h!!bheZ$V&|fY~_m8ak8{on?ne-QA`_jSCNtQ^L5IO)`nN;g%)>+`|M2Lf!)D z^o?c6H?_OkZeCRyH9*T1B+T!niEdO3<$!s5j5UZZ!{zYwCu0AP{e;eV;~I}`f-&eE z$F3h#czLv77#fA#Z{6u+_-O6fmrL~z79&w-i=Sbao-S?sw>9@wvS8YKNJ< z9Rd!oil>M7O2lYEyf6?IgGsDO?ZQK3NIX{8rxzGB^!5=L>#+AHJ~q4!Sey+;c^-MiR*f_K4m_$Z zYF^*JbASI{wK)|4yiEhiY5fDZpOom;4Hu|D+m;1-Ah^0NE!|K)CbAvuRx<4u=5_bX zl%^JOq2LDRHS+`yI~A1}@DG@NKLalFj*e+1o>(BHE*%2{nb~Sqcddd>rFBbhn&6|;c=TkXt$58N;Q^ZTkSw<}bPSB>goLN$ z%OQF3%u3!HAG^*MV*CB+DyM^Pbv3NeFNFA1XYTrOza!+_%CrMkQRZF-qX)%BTv{Xb zzzn&uKI2?y6UC=#EwlU6pfkvSzgs9HRw(oH!|d6eaj(92HA-qDz{tJkZ8xb-4hzEw zBO4pGmX?;JNc6t&V;vxmYaPa)WM!IG45)s^6gsez7alq={gH$ydmcN!6KU$>Ky!1- zVHWVZ?Rq`Jkik{;({{$j=gY?tB$Ygba8gT7O6eV3#Qg!OJ1lM%wL;qRY3Tc_ADet1 zD94aU8f_bbsGlLqN0bx0yDv*v+^~>)MSYMJgq^Ulgt<=1oLgTx2yBgqIn@4qi0tnb zs!T{iLK4rTZm2!WuW$@-jb1lgf=ar5IMG#osQsn#ob9_LB#JA3ZsdYS9g9(<^>JtJU&{w*sj4@e$KMT?76xX#jb9I|_M zOS*-+A}kE@o9~ax%wVvH>dHHJ7CVdn#!EtyVuleER;Q;kL@*E0g%hJs*Bny3Wzijf zRLuahWCTH}G{5>!$=shYLmyn@xUD7f85o_c4wCuY{b-TfMf}@-+PB=K3A& zh()~XNlqWodZ3HVp-#x#???iTHnX=um5p9*CrTbl`XdNM;qu_J=^*u`*@wKdYXJ#j z2!w2Tpd!P2AMlSLs*?+s+4T>;%w-k4tb7YNvkgZti44B=R6n4jaKdM|jA^iIX(vK% zxs!jz-e9hzbPM>Mhh3pinb(|s>FXBq;FeZU|;?1cLq49h+W_gcyO z9?6!RrGL|jC};lsZjJ895qO?_8jRaL+v;jOd79Hbq>8in=8dMuko>6kN^TeKmJH%s z;ZF?;&hsz$ycBmQKp4}rJRe5jD2`1IYBx1$K0vN^(GhvJBWlCPg@ z+q2d!;(n;7E9?dDd&Zw-Z~mM-EV9}w@+M!dCs{WBewa?X#t-wln)cY3d7q#ACPhIq z9O>{KW4oV4Rm1uKg$TLp%AK?QgnM7F-y+gm@E&72V(wk3x8m$w$pUT9Vf#~H`_2g* zu7iNf3pQ=LHB->;u04z9`{v^Y;FkL2O=>E+T$HBpSwZmqfK6&D)nW5{lG%!{Y201*?gHio8$HD;MJ&puIy&s8*Awi4y zj;r4+oA!weJa1{}+P&I215wXGoP9!g-rI(^J8)nh>_PXduK{fk2HUE?LvlYt1)=I( z@_t|CQ!P$kKbGCiat3c9R}N^bI{H8Xb=4!ty1h;Xe?3{t&M?VP&ySi8SLV8{J1{x% zpNjeM$X{(#HHY&eiC&myOxJL-TP2Wi_~K;s?HST=J#xMq5^AwVYlI!(=jV5E$;Qfz zyz;%62rR|hx-vl?P&>c^mEhIc^1$R8G(X(n?8mQZX*U)9I~o@Xd~_DXHpQQlGit+xM|&376JdKlj~^|TKX7@T zD&;YxpDI-srkw4f-3Z4pJ!`bS8!exisJB#T=bLhrvTjGgj&Qsz3jSYP`5~Sn zLWU0|**sEwr@&vwInbFJH$rfeuhrxsyGp(Sw}>w)3NR%qJk~L`2df8UKL>L$K=fen zhhBlt*VAsJqJp%!cU>Mp)YKm>JxO(TBmTfm4IC*l_>l_tr1|=2@v=ZrpsJx~yuKu5 z*<>o=Uh_>}gt7+0WP0qlIVynUqg*|T!koyL&jWi*d^gAW^7rx@>PeR;@2230zIE`? z(9+TE%NFj9{g=OMfHhro)q1>Jl*l6fY_wF|SmT!DRkRmZpNJK!<@0H42pc5x5ZxrB zd0HSeY^SiSmtvMn)-C}(xgm6Ajb=3@-@@)`yl?_@I zeGT|f*gLppq_F{1?}uoJ8Jju}Gl{9*R#y|} z=H_ZPdb)MlfsFvEXU~{ILPFjHhx>{8@d`_m^SCJ7l;@527d*Q`!K2PFh6 zjkG8G@r%#86=Io=RGgA!Wo0oVxdkj?rLh(hH4gbP051}-ou&uKz<$?xZEfvWc>(91 zT-9r=$i=l0eVoT!UhTK0bL=<9YkW7bR)6nu(Euu!(NQT^_OzNukj5hFy#Wnoy{okgDvU2*2sFSt>LX_e)j=d+(3;r+U8 z+awm=*bcK8?prk5P$<-^g)n@s+e(nB!3L)%9aG5bAOG$7RLaA zq3C%;(cdHrJdF-lCyI6IT5nfShb(Zue$V^HpJ1_xKooVcr9p0n@~Mosq&???rJH z!xM#4m07pw!-nRo@8YrRjtPotohLuM(Z%D>y0c)X+Jd-FgQnE!Bn#=qt9)hLC?ogO zz1V1Jv&TJCbs4e^f=>>gSG^r;I6^WrdyA&$O1(X5B5gTItTxj2O?B#6YiP}M!~Gpg zMsmdB_ph{$bs3KR_~%tv$w(gy3JQUZVMkxlD*o5T<>AQ!n2;3*HjH+Bgt33(B{(*k z-qp$L5gHrbze9V)gIp=_B2ngQGV6u78WbpIOY2^e*tJNib_fonlg-JE_?H0K(*@qqKoSAvf7lfk_}hS3uZ;$-C!>4-*+~X z)gH{I{BB*#>ziHp7>DhlkMI^32QQA0z0Q(tc0GB9?Naxsm?BYXt>#mEQx12Zr8;C= zi=7AbUg()UukFir(&wBN8uuv>BK%nzzGq=O9=i9F^mfO!y(L868BFUjV;{LlN+8+> z*?Zf_+%=nb?ljXzB7jvq>J_n}_SeR3*A3S-9mXCLs8X(hDpmTGFF%y>#^Rzgy@ogu zXfDmqbz!E#BWlnw-4_!g2-<1hsG2~_T$?0uJ+&MgUzON^kfaE94AT#HICPZ0bH0ng zZiw*y#al1;iOMCN;~~Y7q8m*Y!;Wp+LyCthuy1#iZjV<*I(@xPT_lW6U#m+6XU;CP zKB5EZ%20^#X!V17H2HK)&qI=5Wd9r~)C%8vc8{7G5l~H(Itg$d?)mPXuTu8Q`3Nw@ z>FPqrlS91Rx~kw{9W8II$p3XGtd5{j`j8)=JCFjiPB~&4Ut&;B)Yp#FnAY}+z!%R; zYE~VePj(`n9N2TA7E{K*#lW7F|NA-uK?2ZLo5nkDP_BWzp zk;xr#&Skfqh{pPa&0h;B*g_%Y2^jo)iMKG!qy|~!>>^@zcK2l;KQ0G* zDpB(b9dh#W+=L7~K$CLL=K414t4LMv$;ruRy_0f2lWd2A#g~tf^ z6;|3kDbc)Z-#T$G2?&m}4;wQ@oZbDnwU7frZLUQ3Dzb!uL=EV*#UG^~sQnG4-E~f` zJwwl9l2;e8mjhkc`E z-`mkvnQg#bYh-Yfo*4c3xH@_G>YQ^mjP%u)qZw@eQXy)@8@y8i1S9&PyA@owmZf8- zj!C+mV4oRM8yPI^FV-UpWn-PbzB@hL@ZQ}czIA?4>Q9gHIE6eri=I(xX{x0*YwBn+ znM}o;1P+zwi3h@%kdFPJY{t8qJShnk+h~n83;GtklcB zSRMZE>moGajUM`(8@b;*{z-dg((X|k@Q7~_{}^fUR1G0@$Zh0l>W~EXYw7+d0G%sr zrpAxYfdM2z2V6rQ991E?|1?Ta zdi-p8@CeZBuYp?^S(D4gIDw3e41u8KdXyg5@aEf|h}bD1(1iC~pOjD`8CFOwDhU1@ zTePnU%HfUk45s9gH2LUf=ybU9&Th3%X+>)q3S1}&TMGgx=|q+@80QA^Tr!iYC#p`V zRGaw^RBJL=n2O6j(kd~?6VAPPxLH#av8S!_V#@gY5eElH(bs%sd0f;VwQFGy9AunV zyiN_L`rqE2sqz@UC;vS>gS$atxOAjvw{S&Me@aNK>P!YrzQt!PlkrJtNU|wf{S&pc ztTFflPcWBXdgv^ECV=8j_G0h|=`*%Q?9@)tlw#XVkdf~`!;bzopq4%KDBv~bik3_o z^(GQfm55w?;q(opLd6m#7XYq5E5y8|)aqrGibR6wcEb-+)WxKo`u%-hcg^LkKZ}ZN zGnbQFFoS%xJ}rf^y)=oqABG_o)$D+qvenJN90s3AX0hUOtN^p^_8ghm7h`6LKQjHX z#QXyIWTl&rcjm3)0s|JJOu!nPZT)tcNhnl02~-3 zu0;impmtS2&uM*;4ogq?pN{eE?}};mTz~l9I?U$;<>vtM@yT*Om)l@ZH)3f6p|o^R zJtkH7-?4RQnO$!$NOGE7=e9Mw!bd{<0J&dDZwB~(PcQCADh7#K#kBC?wvo|iO0g=mk6h~3`KsCGv2BtHUHFzc+VGlu;S-3q*-wnWx zaC_T~S9Bj6gc9D1qSNWi3WFn&#w00b_19pQqq-Sco9!@B{0odQvn~yA*w!u*($?qR zJ6JJh@ws zpZxSA#sg|el3l|g`ZE(#bjA*paMJc#(2Y-lShCk3wY>HCdV71j4t&e_NIAx6tR)Jhqmw3eeD zVFg!jp;Q|2CAWPo{E2Qu)HJE+oD7O@(GcC{^VrzfaDf$wABR$@%ZKh&8x&?TZtDj- z&BSt`qoarMbyFvEaP%JoUXS{bHSz!fr8gfsl?NtTs=aJb-bDm6i@3ISvJyiTS2rK^ zHT^#6(jnk7_h|P<{#Gz$jkohf5tIBdH<u!>$yFr2t@=IdNEvDA=9=a7 z&^Mgsb3lXUk~_9|+5qg|sjsd;3f~U!G&cs%gKx8X9&_t@d2=mWiAX8le{qW!R9z^F zB3_&!&v=?-ukksWWY2!!xgYIy8ZDI!OW`%JVe#dDmb2uVxu)64pXTzs zgI{kSIs^*~3x=NpZV>p45M}T}#jxB*_C`>6-6iY*Yy9y)67|crej^RAC$%U<(NB<>q|poDxQ5u2WzdLK&#H~ zeeOD80=($ubsYyJI=1Fcwk*aDp0&_g99{KnS2s_)W|b zZ=5e+4&M(mdtA>znZ~s}`Yl-D%NWbEhq^MuN)%ly@@|dK#byxQKLY{{BGvRK%3rhhQUC;dbQs+40q>aR(sG(E zk$OeQs&{2|=KZqN-$fnu02{MD}xKp5r-;OmjuU_K^Mx$?%t*l*p`&NgGm7vD_%ImI_&frZ42MPu6HI6Kvg_!+*S>g`)|k~JJiLr8s4UwfUJb$3{&dA0@SG$V3x zzW22n0X^`3Xuwtznoa$!;~!{e`*@1io_DuASJ?*45p+wy|*EFd+&YN7qghIPP7mXxivz~pz4`v!4$kUh=i%{}CGeA2>4u1p`$7*7`z^*WFl3QEG^lTEAafoxPBc{<9wOiUdA zk(JhwTcc;)1smkV+&!MxZ_?dq=UThmR~ZSzaHRTo&*OIa8$p*%>+?(C3O+`uqOTu; zf9?&qnoUj3u1XxO$y}InvT^s1C zp6wGgQ@Ek)6b~3xK#B|wr}Fm>Pu%Y$&(5JAYhc;i{5NxW@x<6Qh?QuoOZ22!@krnq z%cU&+-S=Po6w^`A(-w{k#bbp$JeJ5`0^L z?*zDSjdi_G7Lx>BSbK%`m3wnq#OSFTQpwrBlI1r~r# zR*Ehzlub129U8J-Us7D0YB?T^qhyMZN!z8y_doPAO7AAfY!P4uw#zs3)R;>$gh)IT z`Fu_E0-pET_5P+Z9RzI0KU<0@^lCIHqJw1}PH$E%Sle3B-G=~mynmL#kX?l1@5evq zz=NWIpG9<>PcV|{?tU}Nt1DV03``tuUAX$lKJ#nGWW$KCRTJ7e5yIEU|IPLyfr0r2G{T*UKXXaYxdj&6sXT?==W)!`X zwt_2x=x_FYE0&7F5QriD8Ql4ZcUiLhP+upFXggV-;jz^07WaTD^|*MXr_`%#%M|SN z43<96=u#qxulV*(XXN-gBd%>SI4lF<^+JZD?6chr8$)0^Rej~XeseS&I%ha@ZG1*x zDJF^MIjO$afm(@X`6t(DLfQ!CvU*&9G;AKi0M$TBY-qhKi}dDZJ)Ra@16`fbBfPb5 z4_hc)4ClevUq%Lq4u-e)htLd9_fNa}6ftFp3P<#+$dFO3C7;qCUB?sq21M~(`FVos z=kL!tZZNIQ+wcO0ni6vk58P&HA8YihUSXJ7QNK5S?(a=Y6&5L9kf@knn%l*T65FX>cC!c z`aO~K`U3cpPS9@uJT(Lp;+DH;eWfT76$Ebzlshnho3XhSdxFg>SZdE>6A|=|xR26E zfoeh-Jcp$hozO<~JYVlafyD(*Y6$+{DA$E~bgh zr?@#dUfRuniAoZ=F07`~mNeT=B(FurJ5EI#A+Xhu=<)PAb@}fdgDf`OxXs2hIlQf` ztp0r!1;nLZ6z!@*__!E)xZq>k7!&o;7Zwoi={)(~Q{==A)rgS2NAn(S}r&n(+jk`g(akG> z?0w&Bt!rH|ZopP#{7OMoPxb1HRthCr0^6R(qfx7<1Bgp#+PO|^`g&NJ!~ed9t;>$t z4t1HmtTl7z6^3sLWK0RJ;aRSCz&D8U|MU$)JHi>y{P2B=ffiUBwFeN0pkv~(A#OJZ zJ2m12P7}e38!Mv9f45Qr3deeL20`7`OXe#-H}SbxWMobN*`jJUTk4oRdHh6t>K}(t zdSzroqdy255><||=gOYNBihOGV*ZDTSZMhDc{+Y8M1es;3IMbn;R<~K;wPu1BmuGj z)w{H6{rd2#rhN-Bt&nf_UgV<($_mL`Sf~<(KpG^CwL% z2nf|iGtdT!BDg-b^8YYo;xrhq(lWZS-qGZZ2FBb~wYBY)|03F%yagB`$qZt1ZyKMh zP)_fBwo;2_XuG>0Gf*YOurxmPB~NdFbAI6~kxDTOlPm@X#`}foUc09*{LIW>?kgs5 z{e|eC(J8eH?Q>(LX{sEXdwT@qr$_4^Ft06Ia=zo_NuTA13{f7=8?W&xICFb+6;8`K zIXQi7Za(=?QA_ANaAAZIE(~&X2*r|u1TkBqF^1d)a!r&C%Oo~Q7~>|I&~|Cm;RtNC z*Zfgo=lXJ%jNIU>!qa6wwupO|FV>-ei*HQToXBDA`;IpX*$F`$M}O-u55smtf-fcU z5LX%QU-Kwk;`dh!7S@|YMx&9gon2j552k$49daTAbfp)2La(G>&XV^c#PL%!&JGt9Sij$=B%;F82_`FX}96Qb=6n zi~0L9K-U-LqK-o>^m}u8<9UyZtTDd=lDeAte(lX!_kNZ)Ybwy_{q9K0wh;oy!?)AdiQ{STGVyT$dhAK6 zmJU1`Yo^H?;^NY#rTJCUPKJ@PWYZs?4Q+&$z}b^tV)4tFZBCPa*p8;Q2SN z_=uPW3EAp z@?D#4L7A^2$Qc;tr{qE98NseNa8^4@zPCZfW_b>bw>N)CQ=xp0#ff!y&NKn^DNmC% z!R8F|N!DWqaM`yB)vPoPQj*15pIlyR6O9-ClgzDPwtEoECp!3k5k`~~R&{(<=PkPx zK+jrajN&k?$70lh?2}j-T+~sLFhR%D*fy)}`IGejP(YH+12XO>wvN@-kZJnRoLlK; zltq;aKJoOa8tcO`6*AT8G2UsBuarOG|t$DU6@s(zi#V>(dg^hb^9I6p#M^` zwa@r4=l`z_s;b%K?!BGbEG(_`LtC{q9O zt^RryvM@GALf3?d6)#7A?XX}F(t+%-ESM~1plfws(yBv0#~h;kw-uJe1^0c@nL)DcpCYI)IK*qh~*8jo3@ z@i*}kTfr~syjC*_N35Qem7#Ni{#Raes?Au(^AB1minTjDmZwpZD3TuVR|Ilvxr zeDlMwD^xDdQ?q`jzf?>A47U7a}<2lY=-nGqhtv+;*cKVyjn&w-fUcLEX zEJ|~}YZ8A?Xe&W$?*7`+=g+x8mx}RDp6BIxa7$IE5%w_X&z?U?>B}-1c=%B`S^|@r z(T5Q2*l@9)TKJG^rUzH0^cusv_iLBol z%WLxNlH)jhkB8@a+ldcWK~uu7@G0lRN~b8aW|b1GCRF;MN$d8-#H>H3NMus$*!?f$ zjn~Fkna~$Y&|V4;yYk~|FF8#=>g#^@(Y%jk>fVIPbf%^ykTgPLju9~Q0p7p_V!#&M=JOj2>3KtiL7mGLc)gKx*bOY_aVh97kFyn zI)KL;xT3!c>PAYvX*XcB$)We4$akkiUo?ruL2AA6Nz*7pb;fe{Nu|i|uVVMMtPPU; zZmj0bQiP_|tYsZOd2{*l_{o$yvgd zD#nc$I`hrebNru#)HCigD|7XS#6_s3*0>t)FL@YpI&YNANO^!0v|lVmRHU zoO`(ayV;T7i=k1W_(K0UB0q-HXxwP@VbPVd6OCN;bx$_GogFB=Tvs3P&}uxug|7b$ z=@0fr$)Eel`6;4i_>|n7?#i-%lV(+1r^~pGI)%-v#hj{ZTB(3lFm_fk4$KBpM!Iz? zDZYlOC>G)zw6*MH)D`{>sB=kKn2wjVSwt|p{CuE1iDqe3-nmLw8#G{*Y4i2ysE69D z^lbuk_WSuE#MhT>iQ`K@LHsvU!St%n2r59PRZ9Mo+ttOlIGe)-^{jeBTr;2a%e000 z01tuOSA=1c6GU9&4W6L`C-rnZlN`BDwUA%!8(PE&efUv`+AuTuuFDPKfO7l91GD09 zK(a0rN?HC$pQpE~O9EUzv)%s6ujxkp8eiT{-hU}n&O+mq%n}$VHbI^I_W7f+8tR!o z3#`u01nMhoE<^1XC*lIT-zhc~ERg}Vxaavd?p~maPYi#Q)@YPYmu*~?Y3+*hS+$PI z@|B<*SQun3)BQx8lL2Q%f>F1_WPp=HMjg)m&v&V)K!M46;G`gcoTFu@aHWab1YrL* zwl;$pGCvD`Gu&}vqtEMLe?bTBW6XxtgeSluckd?P(t4QQJoxJ_ma#wERHhHLs(Pzw z9e6AeC4z-#NFHYy+uAr?`l-~V8~5;4gF&GhDaQL7h1p$g`33zcM^cc7nTT4+Z!HM5ec07&Q7t)D<0W%=u-kqz zKyqH);gMOf`6Xg{pA&tlcZ)$CV&uVhv9{6s@gNJq1=eCt==eWx3oScKb#B$GKe9yd zr>g|z?)RQwoQtM~UDkifKziSsJ-op63GG#hAYPT`e-claiqr1WGWOkg?NG0t_B8!g|TQYyGh8`=HUHtFi1RdS+QusYCBnorK8%W0}k@X%p{KJM>X~ z7tIYSEsf@<`Qj+o#-KsvZ*B_U?g8Ixe!=3#asaZ=1mz#`h55fQcCOv~y(s>Y@v~u= zm(heDC~F`5&;Ue93Cde|c6sW|VSW8f54~@n8cmyi8>V?V{?}3tPIcYDtcLmk{by~C zzl-}H)EXHzng`{!nbbUGiT}n>4lCo%qo`cuAN#@sz>G?jQ2`MZBPt5mspz1?yN|UHBx#lRTapKd_zYth>{6H2V^A&&VSTp2rLgdT3jGUkTB__o*qKrD;~Kr=qUd5)?BY-Com6{HM3+* zJ=M!S^K?)mF06V-^j(Z(jBzo1`m`bqu#1`N8&&4WmlMZ-R8)-@u6Y|ZKuHE`zr8(< zKh^X~}etz?d38iY~rSC<)(hZyj+0$T}?PdPg$LSzDI8q7gf|~Uo zDLW2q<6lI_SAo*CTPAs;iQnJ|QM8N=s(wGsJN<>1EaN?+1nCh;4`>_Z+&0k!(;dIr z6Vl~hHAMDKsJSrb8b-L4`Balkc=OxcVddd*-tZqU^&&Zgs+fw3^uGoeiWz4R{O1b~ znvoIsnY#P|TEKo-<`QeMi;Jjj;vdX?czo&f-%izQ4zX7Ir0D6rLYa5o?5?w;K^_YM z+^xAD$ed#ZI}o4?0cU$N59O3Fx#K*0!Y#6yx+YpQAeU4hn#a2@mI4y-suRY5l4^}` z@(xu5@agdDybB#$f{rvio`8PF-X-E|UVp+5vpyw)KMlJ$uIE}^*G?*R)9kh7WM}zW zh*L5}G4`1Q=<^Jy^+BwtOBLdvNa+jae`WlKsSK`8g6@d58c+6? zECy`$$c2YoFNN3*t9k0g6(AqH2ybhH=AcdNntp81y}{E-Cy&q}*k!55@O|-HGyJUx zctdZ>y29zy!mLkzOJJZF>$PLu(CwsJ!3U;{zb=40dQSBhS(v|QM(5_QG~lO){WU*< zG6R?+*fwTx&#d&5N_w&W0$|t`#}=hhw~C z9>}W`W5sgcOx}O+FUH3uX66QKc3yn3GplzM6+_%vf~*0V!TqsiHc-g!J~ch91A!QH zP9JxAA8UaIa|P!j2ghmH^K-k878;$lAN+jlf_XZrz`a>*hb2AWT|!V?+xb%sS%!6B zeFEjgi5n8vl@Mj*5nux_%vT_}n+abr%wLQGHCtoh(hZtUZu^CCAZIci(K|AtfjsKT zk4u)MJFCQCF+^@{>STPy8Vj!`l+v7yCv^TQ50Fym(R&4sxR?vT#gvPT?E{(%#a3mT z@Zgg~amAIjwj$HPX`j=c<%otHf4}0p9XZ!W;5f(Z61k-C z=JQv#U7E*7wrBn{e{(Q$G)KFBBIkzz@4e~u7=cAm@2$~dd65-~`DkHkfz3+SRRJd_ zKzKn~s+*X}M8~l2iPmh{CKLdZ75kM-dBY;Wo@d}cCLRSaYPjH+9Q@q>Qp#K(xC(pE z*0{>Fv&b!n9dPY~FTVKFNM*<*w2dex)lnMD1D#eNHXpRqj0h2Z1uEJAM7D zQNDmYscdg+ip7FGl?hU9CGGAf*O7mlUSeEnKd*F;vDzrV zT&{M*Cg~G}NSty0>Pq@j(Ms)FG@A(9KVJbXq)$jYv-*ZggD;oSx~>SCW@nhb0(39v*UjK%cEOQsHz7#1U+l3}Kc*Bu7A| zYxn;V1#2b91gDIL4C*n6;FSWgBeHa<02&kT_i%AGqfQ3fx!y1M>I}C*rd?#t@y|#~ zm7&WH4f7@J-9pnAdI+~Gt(O4UYOHGav#U3FRgZN@dr5`FcB}lbpN8QRX3iY~&0w2o z1YAP!sIbVjdrOg5YBo^a+Dof5GDARowCk?$*H*LjjoJ3TLs!@Lx+m|=?puGlAoId( zPd3`Icky|g<^yAATF2EJU6fv5rTiI}y$LXZi^;n+)NUiPgFZ7l`pm3}ZyFiYsjU6q zTsch}{O6_2@NBS@JdJLmG30~W*04eS9FYb3bga#(?6TP_vCgya40|(GpHBx`)dCw+ z*O9|SquO2_}7}6&@MT&sm~o3xoMBS zFV{c6FaLOV)SsJN9s_hnimB0wL?k+GG$5}U>rpmwZ?$SdX^A>QaRS6!YrVY!PJ5x9 zvMfr6pH9u0#+Ky#bv#rUFMV#eFc+ZJ&w064?QcFbCFv`eF=EtyT_A<`Fi^kXy5|u9|i0G%3+YAp2FasXazn ze?6`K!u4WcGe&ne68hexSTL0ghr%ke-)#%DPg*XPc}V}84OQBvrl&t3kMH2~L+ zLT8O<+9zNU1c%*GQw#3w>^yljP83+6q21j|&@4QH`|G`vYVY;ml!~%g)*WmF*JLDL zu>>{RFWE$K$>FJ_zX%lysfanQf=m3M<^S7u1z+90GJc-(owdll)OX3r=$}4)x@mIr z(j`%o5^*OnRQn-E`q|0vhB z>QponlUcg))1Bhao^1VS(W{cPLUZCrirfFz6U zNr}OVr!?klb88&fSez}Ffy=XGzZ1Dv!8~Tdn?P6;s6{L#W2m>|h2sRSCe0k-5HdG! z)&X(EjWWIwU#XXD%c@b(n3ZSs(QQejqrBrae|M+4Y!;i_*c?ogz?r6DyfTW%1!`&Mc*=rxAmjtquv%Cd}AH8?h z76@LncZ?S$L@&R%5@Lgf$q5I)wJ(mP9M5r*w5gvEzwwV(yK>{PM9JsVAZ}(+FM~aN zJf77pX4Y~|mj$j5A(NntS(z_r8~@DFR%kaZb3PTMX@))N&sU)5V-M#0>tkg7C9N7i z)jtYGIRMN97Jv4vzN_cqe$Iml)Ex z4wZCt>5#Q*`#czR19=902xL5shu{@Lh>*ZptM{%!9^&_-9 z#VR5sHsHl}xyHukIL9jyWs{|m-pxA}u9BLIqZz^c)6t}N-5h8ra7`@UTw7bqb6T4U zxBU&u%Co(C^~!LlByVLG!DSx?n|UKs>k3gai@gS0!O<-dksU{4JZ=|QxTLD%2DTJb zA9gSA&DFCf%~ly~d`tfcD$>bS#r3a~6Do?TXY*fs(BP-aN!Den(@nq7*L$=()A4b4 ztNKgXeEH$NZCvu_!a}hVMwWr!3tV^j+qiIIrPD^Y(#z%UEW1Co{<^idpZUlwewI^; zx4{k#A}5O}c%1Iv?{z-}-A7wUyt1a7UBe;byYyj3^!YH!N^o_PwkG}Xt*j-Hmi&dS=IVSwoaEh*wqKvkz)_--gCbGISL-pV>&S!y+q6oHF7 zt9Kf?-5mO|zw)~a-rTA@w`x3Z8y!}txiGM(R(^&#Hf*r|aE*qi@J6+g)fdsJiy9#x zU}>0sRoqfB{^4i~cp%uysidz|o+%>4F)}i0#E*@NQeLSZ^*E#kR${{=KWg7m@V%^_ zpyW0+qcrTjF>*|LoO;2OaX+4Dc#hz z74&fO=|^P$*q8D}@PWqIu!jhnJyWiOg<%;viQpa^WY|~HPIH@~{@iN&V3M;?{fYA~ z!{hp$>GG$fD?5$}8OXsy>>6C54;Z?VsaZ_}nimN$Mh-r7gQMTr7AePn`TI6lIVH%& z@tZ3{i1G1-VuiuZ1Rl_91=epjG`pzhXM1YeM9^}oP8J$t;GIRqqdv)SF@MGTo3q!} zFE-KT%NojvQ%nciE4!OBbMDNB>xoc?R+O~1J#KdO$CD@q6e13OF#G7=sW zUwoUX6Y@fnU`n`Dg~o4(ig}7;0+q*_liDQ6D*Gl)4gCF%x>}YW@Oea&SfGeho@aVo zqHNfmM#NG+pT8fv4~BHX@o={|lv5xzu{yk6Ovt4f2u(-1FfuhPSs6Lpm8X5YsYc)U zISKDjW`m#<5Od0^J!0NPUXTTUUdHxfU?8_>?W@{l*@VUF-sjB)aASyW#IQd_0qX^w z(17}qbG80w=r9q|(VpKNCMMDbH-^z#I5KU6x*^082X-CxpudWE{km#2uT6M2bEN?G z%*T&!g<#dEHxX_5GlxdsQH4c;rUxXGnK$YoXb!7C*6UZ3RK+MV>Ux#M7p;2#O!Ub6 zEF)Jo9n5A9j&I7%&9|Fy{bF>`@&Z{^C4szreutoXf$2J(27!IRx4T(xJ>P?|9Wh zSmM?cM&^o}URo^C5jxmut2FFnXxSbOVvTMr;?P&3zMpAlvO@Ttw9%F;s_DzC%|> z)c9YCl;fy_?@{QbPRNUx#k=pV)PRYEH0{FN)CjCDMMgNE7U6C@k3b2g!~(~S}hs7-5hx|2b>qH3LO?bqg;9ISGdio@XA+!p#cyIp#{+_bcsNlCFk#6*BaA# z#af{?aOa3M;3JB(V~~HncJt=7>8jX6Vln@b?X8DlB{!?)tugMDzkh8W@Xu;<$B|7? ze*?=p`Nn4LoOxx>ZTTB3@!XPgjd`uA2s-zN&fGd${@yg}LrmrHxQ9O5)ICjF(5};D zO>f=eY`G9|B=C~$cPcbJ8NrK^Qw^Zx&mT29VJLo7#7<{V2HVW__B7Ub)qsSM)?v9; zf5v;Q)h34~ed|Wt5#!>R-NhG|go!Cl>&6N1e^^Vs>lX~jy9_H|s-grR$Qowiu;}{W zFS|@^_o!U$`u=GH>o~A!(tAQ#9m91+((r*jH=6}bdyz?ff5uP_@XUXszsJ(}UwqQq z=^*B@;!#vu*AsgO0&3TX>Kf_QSle-b|A1{39@50{re*sW|&h$4&f2NafrW}X!(@9wn>JEx5>+DRdXD93EW zY1{ zVO%PkU=V=z8=#3C&VNMOWo)_#y1AyS_mjuI`FY)9L80J0!SBGW)3!J~Czo;abHAg{ z@g=!JJzh7PS>QRB4P^9^ne$_PnqSt9gK?FnLU=rFT8%{6jr0mY;4lxSF|>cRa1a-0k%o+--J;xNX-MaG8-S;m7)u}MkinKY}Y zpt>?6Wa^0_E|cDbiV7+~g%D{Fa^EgDBL`1pRbTtN%vhqISQi8LsJg?eGb;h1^ZQ6e zBF21J9L=KDaI3a_>3z-5jcG*LW~{Bb)MB&fD>dx0mx#i2{!I$PEQ zlr|9p+u84uz-@rxv|wv@^;TDcs4(Ca&Ma&J*;Zcd#jNAR$2Fmzj7h^(?rYUSgv832m}k_>Y}tjcDrX--TA(#J z0*Z``E`wi5?!EW^=*SovYd>IAvf6yrsuqKc+!q_EQ%ey%XQ1?XW1?VSB>vD|5O(2) zlzOrvWbZOQo}tnk!0i3FO{93#|32x$AezBz9KkKBTqDKrc1FVwhT6_&{~9fxfn<0? zzZLzv;$7nCk^Bq5SJtmMLA!RaJ4M_R?=g@XZ%+XOVoii}BeKX9BV2;-8F9o?hlPkM z;L*!azI4F+2x7Z&Hy4M4kiGXK!cf6g87lj)kIc`=Qaz21PPd~>|3@NLfb-ze0LJyWTQ_Q#GAP@ z%rAOj9aLruYD;|II89bq_?8E{m}&(#yk6k^g74m|E?3^L&EtD+E!kbuBjik_Gu>pE z2=Grr_J$qMPE|6ylyaAuQ?t490x@LsM+n7p?awc%$vM-mOSCA-6~6o5Q=O=$O+sj9 z)R!H%Vgp938p?o8txxSPeF?{IdGRFWlgeHl?$nW^E$>AU+U@y*>JTJkzG98z+UMa1 zFBH67B?p-^Z}N^D?qNA@^eoRg?o8IeCMFAZ zdGpTw`}*_q+ie~P-r&7U-;(&80p8|IiuW;rDO@~aEZl%$130YP7Rrww6(sPKWqdvc z9niY7saFJEhk)09kA?fbb?-c(qkwgY5h}+n&XMe2Y^pi|8;oD4yOrBBDYBIxo$v4b-a!%|?BcqQ) zg`c8E<#EYSLH8H<_SV7&1&3K(DIdcD+tXk`8Dcir-N#@_Q#)5*)wCO+YP19|I^zPleNg4!m*GFe<|7FMAwDEovT908$ z$LY9sPIff1j4h8t$~@6Y_es5B-rq3WvBOnY>8M7&hLO{y?QI=C#)@kXicrh!x$sYd zP$^AQB;VOTB*F2#^+JUHwLA5C1M&FkiaQX&Zjb76+x|{hMHEb4-`6X1m`ZjvON}uElyB>?k-` zJyNB7@WT7wKI@+MQ9RW7aaJFE+d2Es?93NT#e|S2T34^;oB!VC|F#>8Eshf0YU#_+ zQ@ZoXH|-|TpfEc_ZUqUIYp&Z@G{!zz!OKi4Cj?i}mj^ALfSN&K|L5iKuH8+HR=%cn z=Y*564^3ayf(Ao*0%P{iVGeL2xwUVKr>FT znHDM;5Bw>G?QIi7Gi{YzIrVj* zola9yiJb|j|0epin@2`b)n}zXhw6l3&^Xl(p&>3)B_Sf!LR`8q8AwⓈgdm?bwj} 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%0D?WCjuYQ-McJVa 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 LB$addme2nIpgH+{ literal 0 HcmV?d00001 diff --git a/src/interpolate/neo_bspline_3d.f90 b/src/interpolate/neo_bspline_3d.f90 index c30b1f40..5a6c3483 100644 --- a/src/interpolate/neo_bspline_3d.f90 +++ b/src/interpolate/neo_bspline_3d.f90 @@ -1,5 +1,6 @@ module neo_bspline_3d !! 3D tensor-product B-splines and matrix-free LSQ via CGLS. + !! Includes block-wise basis caching for high-performance LSQ. use, intrinsic :: iso_fortran_env, only : dp => real64 use neo_bspline, only : bspline_1d, bspline_1d_init_uniform, find_span, basis_funs implicit none @@ -11,6 +12,13 @@ module neo_bspline_3d type(bspline_1d) :: sz end type bspline_3d + type :: basis_cache_3d + integer :: n_pts + integer :: px, py, pz + integer, allocatable :: spanx(:), spany(:), spanz(:) + real(dp), allocatable :: Nx_tab(:,:), Ny_tab(:,:), Nz_tab(:,:) + end type basis_cache_3d + public :: bspline_3d public :: bspline_3d_init_uniform public :: bspline_3d_eval @@ -93,7 +101,8 @@ subroutine bspline_3d_lsq_cgls(spl, x_data, y_data, z_data, f_data, coeff, & !! Matrix-free CGLS for 3D tensor-product B-spline LSQ: !! min_C sum_i (S_C(x_i,y_i,z_i) - f_i)^2 !! - !! where C is coeff(nx,ny,nz) and S_C is the spline. + !! Uses basis caching: spans and basis functions are precomputed + !! once before the CG iterations, then reused via cached operators. type(bspline_3d), intent(in) :: spl real(dp), intent(in) :: x_data(:) real(dp), intent(in) :: y_data(:) @@ -109,6 +118,7 @@ subroutine bspline_3d_lsq_cgls(spl, x_data, y_data, z_data, f_data, coeff, & real(dp) :: rhs_norm real(dp), allocatable :: r(:), q(:) real(dp), allocatable :: s(:,:,:), p(:,:,:) + type(basis_cache_3d) :: cache n_data = size(x_data) if (n_data /= size(y_data) .or. n_data /= size(z_data) .or. & @@ -135,6 +145,8 @@ subroutine bspline_3d_lsq_cgls(spl, x_data, y_data, z_data, f_data, coeff, & atol = 1.0d-10 end if + call precompute_basis_3d(spl, x_data, y_data, z_data, cache) + allocate(r(n_data)) allocate(q(n_data)) allocate(s(nx, ny, nz)) @@ -143,7 +155,7 @@ subroutine bspline_3d_lsq_cgls(spl, x_data, y_data, z_data, f_data, coeff, & coeff = 0.0_dp r = f_data - call apply_A3D_T(spl, x_data, y_data, z_data, r, s) + call apply_A3D_T_cached(spl, cache, r, s) p = s gamma = sum(s*s) rhs_norm = sqrt(sum(f_data*f_data)) @@ -155,7 +167,7 @@ subroutine bspline_3d_lsq_cgls(spl, x_data, y_data, z_data, f_data, coeff, & end if do k = 1, kmax - call apply_A3D(spl, x_data, y_data, z_data, p, q) + call apply_A3D_cached(spl, cache, p, q) denom = sum(q*q) if (denom <= 0.0_dp) exit @@ -163,7 +175,7 @@ subroutine bspline_3d_lsq_cgls(spl, x_data, y_data, z_data, f_data, coeff, & coeff = coeff + alpha*p r = r - alpha*q - call apply_A3D_T(spl, x_data, y_data, z_data, r, s) + call apply_A3D_T_cached(spl, cache, r, s) gamma_new = sum(s*s) if (gamma_new <= (atol*rhs_norm)**2) exit @@ -365,4 +377,150 @@ subroutine apply_A3D_T(spl, x_data, y_data, z_data, r, g) end subroutine apply_A3D_T + subroutine precompute_basis_3d(spl, x_data, y_data, z_data, cache) + !! Precompute spans and basis values for all data points. + type(bspline_3d), intent(in) :: spl + real(dp), intent(in) :: x_data(:) + real(dp), intent(in) :: y_data(:) + real(dp), intent(in) :: z_data(:) + type(basis_cache_3d), intent(out) :: cache + + integer :: n_data, i, spanx_loc, spany_loc, spanz_loc + integer :: px, py, pz + real(dp), allocatable :: Nx_loc(:), Ny_loc(:), Nz_loc(:) + + n_data = size(x_data) + px = spl%sx%degree + py = spl%sy%degree + pz = spl%sz%degree + + cache%n_pts = n_data + cache%px = px + cache%py = py + cache%pz = pz + + allocate(cache%spanx(n_data), cache%spany(n_data), cache%spanz(n_data)) + allocate(cache%Nx_tab(0:px, n_data)) + allocate(cache%Ny_tab(0:py, n_data)) + allocate(cache%Nz_tab(0:pz, n_data)) + +!$omp parallel default(shared) & +!$omp& private(i, spanx_loc, spany_loc, spanz_loc, Nx_loc, Ny_loc, Nz_loc) & +!$omp& if (n_data > 100) + allocate(Nx_loc(0:px), Ny_loc(0:py), Nz_loc(0:pz)) +!$omp do + do i = 1, n_data + call find_span(spl%sx, x_data(i), spanx_loc) + call basis_funs(spl%sx, spanx_loc, x_data(i), Nx_loc) + call find_span(spl%sy, y_data(i), spany_loc) + call basis_funs(spl%sy, spany_loc, y_data(i), Ny_loc) + call find_span(spl%sz, z_data(i), spanz_loc) + call basis_funs(spl%sz, spanz_loc, z_data(i), Nz_loc) + + cache%spanx(i) = spanx_loc + cache%spany(i) = spany_loc + cache%spanz(i) = spanz_loc + cache%Nx_tab(:, i) = Nx_loc + cache%Ny_tab(:, i) = Ny_loc + cache%Nz_tab(:, i) = Nz_loc + end do +!$omp end do + deallocate(Nx_loc, Ny_loc, Nz_loc) +!$omp end parallel + end subroutine precompute_basis_3d + + + subroutine apply_A3D_cached(spl, cache, coeff, f) + !! f = A * coeff using precomputed basis (cached). + type(bspline_3d), intent(in) :: spl + type(basis_cache_3d), intent(in) :: cache + real(dp), intent(in) :: coeff(:,:,:) + real(dp), intent(out) :: f(:) + + integer :: n_data, px, py, pz + integer :: i, a, b, c, ix, iy, iz, spanx, spany, spanz + + n_data = cache%n_pts + px = cache%px + py = cache%py + pz = cache%pz + + f = 0.0_dp + +!$omp parallel default(shared) private(i, a, b, c, ix, iy, iz, spanx, spany, spanz) & +!$omp& if (n_data > 100) +!$omp do + do i = 1, n_data + spanx = cache%spanx(i) + spany = cache%spany(i) + spanz = cache%spanz(i) + do a = 0, px + ix = spanx - px + a + do b = 0, py + iy = spany - py + b + do c = 0, pz + iz = spanz - pz + c + f(i) = f(i) + cache%Nx_tab(a, i)*cache%Ny_tab(b, i) & + *cache%Nz_tab(c, i)*coeff(ix, iy, iz) + end do + end do + end do + end do +!$omp end do +!$omp end parallel + end subroutine apply_A3D_cached + + + subroutine apply_A3D_T_cached(spl, cache, r, g) + !! g = A^T * r using precomputed basis (cached). + type(bspline_3d), intent(in) :: spl + type(basis_cache_3d), intent(in) :: cache + real(dp), intent(in) :: r(:) + real(dp), intent(out) :: g(:,:,:) + + integer :: n_data, nx, ny, nz, px, py, pz + integer :: i, a, b, c, ix, iy, iz, spanx, spany, spanz + real(dp), allocatable :: g_local(:,:,:) + + n_data = cache%n_pts + nx = spl%sx%n_ctrl + ny = spl%sy%n_ctrl + nz = spl%sz%n_ctrl + px = cache%px + py = cache%py + pz = cache%pz + + g = 0.0_dp + +!$omp parallel default(shared) & +!$omp& private(i, a, b, c, ix, iy, iz, spanx, spany, spanz, g_local) if (n_data > 100) + allocate(g_local(nx, ny, nz)) + g_local = 0.0_dp +!$omp do + do i = 1, n_data + spanx = cache%spanx(i) + spany = cache%spany(i) + spanz = cache%spanz(i) + do a = 0, px + ix = spanx - px + a + do b = 0, py + iy = spany - py + b + do c = 0, pz + iz = spanz - pz + c + g_local(ix, iy, iz) = g_local(ix, iy, iz) + & + cache%Nx_tab(a, i)*cache%Ny_tab(b, i) & + *cache%Nz_tab(c, i)*r(i) + end do + end do + end do + end do +!$omp end do +!$omp critical + g = g + g_local +!$omp end critical + deallocate(g_local) +!$omp end parallel + end subroutine apply_A3D_T_cached + + end module neo_bspline_3d From e89f310c45c8d2af33429460a0b15f722307510b Mon Sep 17 00:00:00 2001 From: Christopher Albert Date: Tue, 2 Dec 2025 09:51:47 +0100 Subject: [PATCH 09/15] Unify neo_bspline module with grid-optimized OpenMP parallelization Consolidate all B-spline functionality (1D/2D/3D) into a single module with optimized grid-based API exploiting separable tensor product structure: - Remove neo_bspline_3d.f90 and merge into unified neo_bspline.f90 - Precompute basis functions per grid line (O(n1+n2+n3) storage vs O(n*n*n)) - OpenMP parallel do + SIMD for construction operators - SIMD-only evaluation (no thread overhead for single-point queries) - New grid-based LSQ CGLS API: bspline_Nd_lsq_cgls(spl, x1, x2, ..., f_grid, coeff) - Update all tests and benchmarks for new API - 44/44 tests pass This enables efficient least-squares fitting on regular grids by caching basis functions once per coordinate axis instead of per grid point. --- src/interpolate/CMakeLists.txt | 1 - src/interpolate/neo_bspline.f90 | 1116 +++++++++-------- src/interpolate/neo_bspline_3d.f90 | 526 -------- .../bench_neo_bspline_vs_interpolate.f90 | 96 +- test/source/test_neo_bspline_1d.f90 | 69 +- test/source/test_neo_bspline_2d.f90 | 195 +-- test/source/test_neo_bspline_3d.f90 | 63 +- 7 files changed, 667 insertions(+), 1399 deletions(-) delete mode 100644 src/interpolate/neo_bspline_3d.f90 diff --git a/src/interpolate/CMakeLists.txt b/src/interpolate/CMakeLists.txt index bc436117..b007e73c 100644 --- a/src/interpolate/CMakeLists.txt +++ b/src/interpolate/CMakeLists.txt @@ -2,7 +2,6 @@ add_library(interpolate STATIC ../spl_three_to_five.f90 acc_spline_build_order5.f90 neo_bspline.f90 - neo_bspline_3d.f90 batch_interpolate_types.f90 batch_interpolate_1d.f90 batch_interpolate_2d.f90 diff --git a/src/interpolate/neo_bspline.f90 b/src/interpolate/neo_bspline.f90 index 8b7aa9ef..a8af84c7 100644 --- a/src/interpolate/neo_bspline.f90 +++ b/src/interpolate/neo_bspline.f90 @@ -1,251 +1,80 @@ module neo_bspline - !! Simple 1D B-spline basis and matrix-free LSQ via CGLS. - !! - !! Uses textbook Cox–de Boor recursion (Piegl & Tiller) for basis - !! evaluation and a standard CGLS algorithm for least-squares fitting. - use, intrinsic :: iso_fortran_env, only : dp => real64 + !! High-performance B-spline module for 1D/2D/3D tensor-product splines. + !! Optimized for regular grids with OpenMP SIMD and parallel construction. + use, intrinsic :: iso_fortran_env, only: dp => real64 implicit none private type :: bspline_1d - integer :: degree !! Polynomial degree p - integer :: n_ctrl !! Number of basis functions / control points - real(dp), allocatable :: knots(:) !! Knot vector, size = n_ctrl+degree+1 + integer :: degree + integer :: n_ctrl + real(dp), allocatable :: knots(:) real(dp) :: x_min, x_max end type bspline_1d type :: bspline_2d - type(bspline_1d) :: sx - type(bspline_1d) :: sy + type(bspline_1d) :: sx, sy end type bspline_2d - public :: bspline_1d - public :: bspline_1d_init_uniform - public :: bspline_1d_eval - public :: bspline_1d_lsq_cgls - public :: bspline_1d_lsq_cgls_batch - - public :: bspline_2d - public :: bspline_2d_init_uniform - public :: bspline_2d_eval - public :: bspline_2d_lsq_cgls - public :: bspline_2d_lsq_cgls_batch - - public :: apply_A - public :: apply_AT - public :: apply_A2D - public :: apply_A2D_T - public :: find_span - public :: basis_funs + type :: bspline_3d + type(bspline_1d) :: sx, sy, sz + end type bspline_3d + + type :: grid_cache_1d + integer :: ng1, px + integer, allocatable :: span1(:) + real(dp), allocatable :: B1(:,:) + end type grid_cache_1d + + type :: grid_cache_2d + integer :: ng1, ng2, px, py + integer, allocatable :: span1(:), span2(:) + real(dp), allocatable :: B1(:,:), B2(:,:) + end type grid_cache_2d + + type :: grid_cache_3d + integer :: ng1, ng2, ng3, px, py, pz + integer, allocatable :: span1(:), span2(:), span3(:) + real(dp), allocatable :: B1(:,:), B2(:,:), B3(:,:) + end type grid_cache_3d + + public :: bspline_1d, bspline_2d, bspline_3d + public :: bspline_1d_init_uniform, bspline_2d_init_uniform, bspline_3d_init_uniform + public :: bspline_1d_eval, bspline_2d_eval, bspline_3d_eval + public :: bspline_1d_lsq_cgls, bspline_2d_lsq_cgls, bspline_3d_lsq_cgls + public :: find_span, basis_funs contains subroutine bspline_1d_init_uniform(spl, degree, n_ctrl, x_min, x_max) - !! Initialise open-uniform 1D B-spline on [x_min, x_max]. type(bspline_1d), intent(out) :: spl integer, intent(in) :: degree, n_ctrl real(dp), intent(in) :: x_min, x_max - integer :: p, n, m, i - real(dp) :: h, left, right - - if (degree < 1) error stop "bspline_1d_init_uniform: degree must be >= 1" - if (n_ctrl < degree + 1) then - error stop "bspline_1d_init_uniform: need at least degree+1 control points" - end if - if (x_max <= x_min) error stop "bspline_1d_init_uniform: x_max <= x_min" + real(dp) :: h p = degree n = n_ctrl m = n + p + 1 - spl%degree = p spl%n_ctrl = n spl%x_min = x_min spl%x_max = x_max - - if (allocated(spl%knots)) deallocate(spl%knots) allocate(spl%knots(m)) - - ! Open-uniform knot vector: - ! First p+1 knots at x_min, last p+1 knots at x_max, interior equally spaced. - h = (x_max - x_min) / real(n - p, dp) + h = (x_max - x_min)/real(n - p, dp) do i = 1, m if (i <= p + 1) then spl%knots(i) = x_min else if (i >= m - p) then spl%knots(i) = x_max else - left = real(i - (p + 1), dp) - spl%knots(i) = x_min + left*h + spl%knots(i) = x_min + real(i - (p + 1), dp)*h end if end do end subroutine bspline_1d_init_uniform - subroutine bspline_1d_eval(spl, coeff, x, y) - !! Evaluate spline sum_j coeff(j) * N_j(x). - type(bspline_1d), intent(in) :: spl - real(dp), intent(in) :: coeff(:) - real(dp), intent(in) :: x - real(dp), intent(out) :: y - - integer :: span, j, p - real(dp), dimension(:), allocatable :: N - - if (size(coeff) /= spl%n_ctrl) then - error stop "bspline_1d_eval: coeff size mismatch" - end if - - p = spl%degree - allocate(N(0:p)) - - call find_span(spl, x, span) - call basis_funs(spl, span, x, N) - - y = 0.0_dp - do j = 0, p - y = y + N(j) * coeff(span - p + j) - end do - - deallocate(N) - end subroutine bspline_1d_eval - - - subroutine bspline_1d_lsq_cgls(spl, x_data, f_data, coeff, max_iter, tol) - !! Matrix-free CGLS for 1D B-spline LSQ: - !! min_c sum_i (S_c(x_i) - f_i)^2 - !! - !! where S_c(x) is the spline with control points coeff(:). - type(bspline_1d), intent(in) :: spl - real(dp), intent(in) :: x_data(:) - real(dp), intent(in) :: f_data(:) - real(dp), intent(inout) :: coeff(:) - integer, intent(in), optional :: max_iter - real(dp), intent(in), optional :: tol - - integer :: n_data, n_ctrl - integer :: k, kmax - real(dp) :: atol, gamma, gamma_new, alpha, beta, denom - real(dp) :: rhs_norm - real(dp), allocatable :: r(:), s(:), p(:), q(:) - - n_data = size(x_data) - if (n_data /= size(f_data)) then - error stop "bspline_1d_lsq_cgls: x_data and f_data size mismatch" - end if - - n_ctrl = spl%n_ctrl - if (size(coeff) /= n_ctrl) then - error stop "bspline_1d_lsq_cgls: coeff size mismatch" - end if - - if (present(max_iter)) then - kmax = max_iter - else - kmax = 200 - end if - if (present(tol)) then - atol = tol - else - atol = 1.0d-10 - end if - - allocate(r(n_data)) - allocate(q(n_data)) - allocate(s(n_ctrl)) - allocate(p(n_ctrl)) - - ! Initial guess: coeff = 0 - coeff = 0.0_dp - - ! r = f - A*coeff (A*coeff = 0 initially) - r = f_data - - call apply_AT(spl, x_data, r, s) - p = s - gamma = dot_product(s, s) - rhs_norm = sqrt(dot_product(f_data, f_data)) - - if (rhs_norm == 0.0_dp) then - coeff = 0.0_dp - deallocate(r, q, s, p) - return - end if - - do k = 1, kmax - call apply_A(spl, x_data, p, q) - denom = dot_product(q, q) - if (denom <= 0.0_dp) exit - - alpha = gamma/denom - coeff = coeff + alpha*p - r = r - alpha*q - - call apply_AT(spl, x_data, r, s) - gamma_new = dot_product(s, s) - - if (gamma_new <= (atol*rhs_norm)**2) exit - - beta = gamma_new/gamma - gamma = gamma_new - p = s + beta*p - end do - - deallocate(r, q, s, p) - end subroutine bspline_1d_lsq_cgls - - - subroutine bspline_1d_lsq_cgls_batch(spl, x_data, f_data, coeff, max_iter, tol) - !! Batched matrix-free CGLS for 1D B-splines. - !! Solves independent LSQ problems for multiple right-hand sides: - !! min_{c(:,k)} sum_i (S_{c(:,k)}(x_i) - f_i(k))^2 - !! for k = 1..n_rhs. - type(bspline_1d), intent(in) :: spl - real(dp), intent(in) :: x_data(:) - real(dp), intent(in) :: f_data(:,:) - real(dp), intent(inout) :: coeff(:,:) - integer, intent(in), optional :: max_iter - real(dp), intent(in), optional :: tol - - integer :: n_data, n_rhs, n_ctrl, k - - n_data = size(x_data) - if (n_data /= size(f_data, 1)) then - error stop "bspline_1d_lsq_cgls_batch: x_data and f_data size mismatch" - end if - - n_rhs = size(f_data, 2) - n_ctrl = spl%n_ctrl - - if (size(coeff, 1) /= n_ctrl .or. size(coeff, 2) /= n_rhs) then - error stop "bspline_1d_lsq_cgls_batch: coeff shape mismatch" - end if - - do k = 1, n_rhs - if (present(max_iter) .and. present(tol)) then - call bspline_1d_lsq_cgls(spl, x_data, f_data(:, k), coeff(:, k), & - max_iter=max_iter, tol=tol) - elseif (present(max_iter)) then - call bspline_1d_lsq_cgls(spl, x_data, f_data(:, k), coeff(:, k), & - max_iter=max_iter) - elseif (present(tol)) then - call bspline_1d_lsq_cgls(spl, x_data, f_data(:, k), coeff(:, k), & - tol=tol) - else - call bspline_1d_lsq_cgls(spl, x_data, f_data(:, k), coeff(:, k)) - end if - end do - end subroutine bspline_1d_lsq_cgls_batch - - - !----------------------------------------------------------------- - ! 2D tensor-product B-splines - !----------------------------------------------------------------- - subroutine bspline_2d_init_uniform(spl, degree, n_ctrl, x_min, x_max) - !! Initialise 2D tensor-product B-spline with open-uniform knots - !! in each dimension on [x_min(j), x_max(j)]. type(bspline_2d), intent(out) :: spl integer, intent(in) :: degree(2), n_ctrl(2) real(dp), intent(in) :: x_min(2), x_max(2) @@ -255,211 +84,39 @@ subroutine bspline_2d_init_uniform(spl, degree, n_ctrl, x_min, x_max) end subroutine bspline_2d_init_uniform - subroutine bspline_2d_eval(spl, coeff, x, y) - !! Evaluate 2D spline S(x,y) = sum_{i,j} coeff(i,j) N_i(x) M_j(y). - type(bspline_2d), intent(in) :: spl - real(dp), intent(in) :: coeff(:,:) - real(dp), intent(in) :: x(2) - real(dp), intent(out) :: y - - integer :: nx, ny, spanx, spany, px, py - integer :: a, b, ix, iy - real(dp), allocatable :: Nx_b(:), Ny_b(:) - - nx = spl%sx%n_ctrl - ny = spl%sy%n_ctrl - if (size(coeff, 1) /= nx .or. size(coeff, 2) /= ny) then - error stop "bspline_2d_eval: coeff shape mismatch" - end if - - px = spl%sx%degree - py = spl%sy%degree - allocate(Nx_b(0:px)) - allocate(Ny_b(0:py)) - - call find_span(spl%sx, x(1), spanx) - call basis_funs(spl%sx, spanx, x(1), Nx_b) - call find_span(spl%sy, x(2), spany) - call basis_funs(spl%sy, spany, x(2), Ny_b) - - y = 0.0_dp - do a = 0, px - ix = spanx - px + a - do b = 0, py - iy = spany - py + b - y = y + Nx_b(a)*Ny_b(b)*coeff(ix, iy) - end do - end do - - deallocate(Nx_b, Ny_b) - end subroutine bspline_2d_eval - - - subroutine bspline_2d_lsq_cgls(spl, x_data, y_data, f_data, coeff, max_iter, tol) - !! Matrix-free CGLS for 2D tensor-product B-spline LSQ: - !! min_C sum_i (S_C(x_i,y_i) - f_i)^2 - !! - !! where C is coeff(nx,ny) and S_C is the spline. - type(bspline_2d), intent(in) :: spl - real(dp), intent(in) :: x_data(:) - real(dp), intent(in) :: y_data(:) - real(dp), intent(in) :: f_data(:) - real(dp), intent(inout) :: coeff(:,:) - integer, intent(in), optional :: max_iter - real(dp), intent(in), optional :: tol - - integer :: n_data, nx, ny - integer :: k, kmax - real(dp) :: atol, gamma, gamma_new, alpha, beta, denom - real(dp) :: rhs_norm - real(dp), allocatable :: r(:), q(:) - real(dp), allocatable :: s(:,:), p(:,:) - - n_data = size(x_data) - if (n_data /= size(y_data) .or. n_data /= size(f_data)) then - error stop "bspline_2d_lsq_cgls: data size mismatch" - end if - - nx = spl%sx%n_ctrl - ny = spl%sy%n_ctrl - if (size(coeff, 1) /= nx .or. size(coeff, 2) /= ny) then - error stop "bspline_2d_lsq_cgls: coeff shape mismatch" - end if - - if (present(max_iter)) then - kmax = max_iter - else - kmax = 400 - end if - if (present(tol)) then - atol = tol - else - atol = 1.0d-10 - end if - - allocate(r(n_data)) - allocate(q(n_data)) - allocate(s(nx, ny)) - allocate(p(nx, ny)) - - coeff = 0.0_dp - r = f_data - - call apply_A2D_T(spl, x_data, y_data, r, s) - p = s - gamma = sum(s*s) - rhs_norm = sqrt(sum(f_data*f_data)) - - if (rhs_norm == 0.0_dp) then - coeff = 0.0_dp - deallocate(r, q, s, p) - return - end if - - do k = 1, kmax - call apply_A2D(spl, x_data, y_data, p, q) - denom = sum(q*q) - if (denom <= 0.0_dp) exit - - alpha = gamma/denom - coeff = coeff + alpha*p - r = r - alpha*q - - call apply_A2D_T(spl, x_data, y_data, r, s) - gamma_new = sum(s*s) - - if (gamma_new <= (atol*rhs_norm)**2) exit - - beta = gamma_new/gamma - gamma = gamma_new - p = s + beta*p - end do - - deallocate(r, q, s, p) - end subroutine bspline_2d_lsq_cgls - - - subroutine bspline_2d_lsq_cgls_batch(spl, x_data, y_data, f_data, coeff, & - max_iter, tol) - !! Batched matrix-free CGLS for 2D tensor-product B-splines. - !! Solves independent LSQ problems for multiple right-hand sides: - !! min_{C(:,:,k)} sum_i (S_{C(:,:,k)}(x_i,y_i) - f_i(k))^2 - type(bspline_2d), intent(in) :: spl - real(dp), intent(in) :: x_data(:) - real(dp), intent(in) :: y_data(:) - real(dp), intent(in) :: f_data(:,:) - real(dp), intent(inout) :: coeff(:,:,:) - integer, intent(in), optional :: max_iter - real(dp), intent(in), optional :: tol - - integer :: n_data, n_rhs, nx, ny, k - - n_data = size(x_data) - if (n_data /= size(y_data) .or. n_data /= size(f_data, 1)) then - error stop "bspline_2d_lsq_cgls_batch: data size mismatch" - end if - - n_rhs = size(f_data, 2) - nx = spl%sx%n_ctrl - ny = spl%sy%n_ctrl - - if (size(coeff, 1) /= nx .or. size(coeff, 2) /= ny .or. & - size(coeff, 3) /= n_rhs) then - error stop "bspline_2d_lsq_cgls_batch: coeff shape mismatch" - end if - - do k = 1, n_rhs - if (present(max_iter) .and. present(tol)) then - call bspline_2d_lsq_cgls(spl, x_data, y_data, f_data(:, k), & - coeff(:, :, k), max_iter=max_iter, tol=tol) - elseif (present(max_iter)) then - call bspline_2d_lsq_cgls(spl, x_data, y_data, f_data(:, k), & - coeff(:, :, k), max_iter=max_iter) - elseif (present(tol)) then - call bspline_2d_lsq_cgls(spl, x_data, y_data, f_data(:, k), & - coeff(:, :, k), tol=tol) - else - call bspline_2d_lsq_cgls(spl, x_data, y_data, f_data(:, k), & - coeff(:, :, k)) - end if - end do - end subroutine bspline_2d_lsq_cgls_batch + subroutine bspline_3d_init_uniform(spl, degree, n_ctrl, x_min, x_max) + type(bspline_3d), intent(out) :: spl + integer, intent(in) :: degree(3), n_ctrl(3) + real(dp), intent(in) :: x_min(3), x_max(3) + call bspline_1d_init_uniform(spl%sx, degree(1), n_ctrl(1), x_min(1), x_max(1)) + call bspline_1d_init_uniform(spl%sy, degree(2), n_ctrl(2), x_min(2), x_max(2)) + call bspline_1d_init_uniform(spl%sz, degree(3), n_ctrl(3), x_min(3), x_max(3)) + end subroutine bspline_3d_init_uniform - !----------------------------------------------------------------- - ! Internal helpers - !----------------------------------------------------------------- subroutine find_span(spl, x, span) - !! Find knot span index for x (0-based basis index will be span-degree...span). type(bspline_1d), intent(in) :: spl real(dp), intent(in) :: x integer, intent(out) :: span - integer :: low, high, mid, p, n, m real(dp) :: xx p = spl%degree n = spl%n_ctrl m = n + p + 1 - - ! Clamp x to [x_min, x_max] xx = min(max(x, spl%x_min), spl%x_max) - - ! Special cases at the ends - if (xx >= spl%knots(m-p)) then + if (xx >= spl%knots(m - p)) then span = n return end if - low = p + 1 high = n + 1 - do mid = (low + high)/2 if (xx < spl%knots(mid)) then high = mid - else if (xx >= spl%knots(mid+1)) then + else if (xx >= spl%knots(mid + 1)) then low = mid else span = mid @@ -470,231 +127,586 @@ end subroutine find_span subroutine basis_funs(spl, span, x, N) - !! Compute non-zero B-spline basis functions N(0:p) at x. type(bspline_1d), intent(in) :: spl integer, intent(in) :: span real(dp), intent(in) :: x real(dp), intent(out) :: N(0:) - integer :: p, j, r - real(dp), allocatable :: left(:), right(:) - real(dp) :: saved, temp + real(dp) :: left(0:spl%degree), right(0:spl%degree), saved, temp p = spl%degree - if (size(N) < p+1) then - error stop "basis_funs: N has wrong size" - end if - - allocate(left(0:p)) - allocate(right(0:p)) - N(0) = 1.0_dp do j = 1, p - left(j) = x - spl%knots(span+1-j) - right(j) = spl%knots(span+j) - x + left(j) = x - spl%knots(span + 1 - j) + right(j) = spl%knots(span + j) - x saved = 0.0_dp - do r = 0, j-1 - temp = N(r)/(right(r+1) + left(j-r)) - N(r) = saved + right(r+1)*temp - saved = left(j-r)*temp + do r = 0, j - 1 + temp = N(r)/(right(r + 1) + left(j - r)) + N(r) = saved + right(r + 1)*temp + saved = left(j - r)*temp end do N(j) = saved end do - - deallocate(left, right) end subroutine basis_funs - subroutine apply_A(spl, x_data, coeff, y) - !! y = A * coeff (spline evaluation at all x_data) + subroutine bspline_1d_eval(spl, coeff, x, y) type(bspline_1d), intent(in) :: spl - real(dp), intent(in) :: x_data(:) real(dp), intent(in) :: coeff(:) - real(dp), intent(out) :: y(:) + real(dp), intent(in) :: x + real(dp), intent(out) :: y + integer :: span, j, p + real(dp) :: N(0:spl%degree) - integer :: n_data, i, span, p, j - real(dp), allocatable :: N(:) + p = spl%degree + call find_span(spl, x, span) + call basis_funs(spl, span, x, N) + y = 0.0_dp + !$omp simd reduction(+:y) + do j = 0, p + y = y + N(j)*coeff(span - p + j) + end do + end subroutine bspline_1d_eval - n_data = size(x_data) - if (size(y) /= n_data) then - error stop "apply_A: y size mismatch" - end if - if (size(coeff) /= spl%n_ctrl) then - error stop "apply_A: coeff size mismatch" - end if - p = spl%degree + subroutine bspline_2d_eval(spl, coeff, x, y) + type(bspline_2d), intent(in) :: spl + real(dp), intent(in) :: coeff(:,:) + real(dp), intent(in) :: x(2) + real(dp), intent(out) :: y + integer :: spanx, spany, px, py, a, b, ix, iy + real(dp) :: Nx(0:spl%sx%degree), Ny(0:spl%sy%degree) + + px = spl%sx%degree + py = spl%sy%degree + call find_span(spl%sx, x(1), spanx) + call basis_funs(spl%sx, spanx, x(1), Nx) + call find_span(spl%sy, x(2), spany) + call basis_funs(spl%sy, spany, x(2), Ny) y = 0.0_dp + do a = 0, px + ix = spanx - px + a + do b = 0, py + iy = spany - py + b + y = y + Nx(a)*Ny(b)*coeff(ix, iy) + end do + end do + end subroutine bspline_2d_eval + + + subroutine bspline_3d_eval(spl, coeff, x, y) + type(bspline_3d), intent(in) :: spl + real(dp), intent(in) :: coeff(:,:,:) + real(dp), intent(in) :: x(3) + real(dp), intent(out) :: y + integer :: spanx, spany, spanz, px, py, pz, a, b, c, ix, iy, iz + real(dp) :: Nx(0:spl%sx%degree), Ny(0:spl%sy%degree), Nz(0:spl%sz%degree) -!$omp parallel default(shared) private(i, span, j, N) if (n_data > 100) - allocate(N(0:p)) -!$omp do - do i = 1, n_data - call find_span(spl, x_data(i), span) - call basis_funs(spl, span, x_data(i), N) - do j = 0, p - y(i) = y(i) + N(j)*coeff(span - p + j) + px = spl%sx%degree + py = spl%sy%degree + pz = spl%sz%degree + call find_span(spl%sx, x(1), spanx) + call basis_funs(spl%sx, spanx, x(1), Nx) + call find_span(spl%sy, x(2), spany) + call basis_funs(spl%sy, spany, x(2), Ny) + call find_span(spl%sz, x(3), spanz) + call basis_funs(spl%sz, spanz, x(3), Nz) + y = 0.0_dp + do a = 0, px + ix = spanx - px + a + do b = 0, py + iy = spany - py + b + do c = 0, pz + iz = spanz - pz + c + y = y + Nx(a)*Ny(b)*Nz(c)*coeff(ix, iy, iz) + end do end do end do -!$omp end do - deallocate(N) -!$omp end parallel - end subroutine apply_A + end subroutine bspline_3d_eval - subroutine apply_AT(spl, x_data, r, g) - !! g = A^T * r (adjoint action, accumulating into control points) + subroutine precompute_grid_1d(spl, x1, cache) type(bspline_1d), intent(in) :: spl - real(dp), intent(in) :: x_data(:) + real(dp), intent(in) :: x1(:) + type(grid_cache_1d), intent(out) :: cache + integer :: i, n1, px + + n1 = size(x1) + px = spl%degree + cache%ng1 = n1 + cache%px = px + allocate(cache%span1(n1), cache%B1(0:px, n1)) + + !$omp parallel do simd private(i) schedule(simd:static) + do i = 1, n1 + call find_span(spl, x1(i), cache%span1(i)) + end do + + !$omp parallel do private(i) schedule(static) + do i = 1, n1 + call basis_funs(spl, cache%span1(i), x1(i), cache%B1(:, i)) + end do + end subroutine precompute_grid_1d + + + subroutine precompute_grid_2d(spl, x1, x2, cache) + type(bspline_2d), intent(in) :: spl + real(dp), intent(in) :: x1(:), x2(:) + type(grid_cache_2d), intent(out) :: cache + integer :: i, n1, n2, px, py + + n1 = size(x1) + n2 = size(x2) + px = spl%sx%degree + py = spl%sy%degree + cache%ng1 = n1 + cache%ng2 = n2 + cache%px = px + cache%py = py + allocate(cache%span1(n1), cache%span2(n2)) + allocate(cache%B1(0:px, n1), cache%B2(0:py, n2)) + + !$omp parallel do simd private(i) schedule(simd:static) + do i = 1, n1 + call find_span(spl%sx, x1(i), cache%span1(i)) + end do + !$omp parallel do private(i) schedule(static) + do i = 1, n1 + call basis_funs(spl%sx, cache%span1(i), x1(i), cache%B1(:, i)) + end do + + !$omp parallel do simd private(i) schedule(simd:static) + do i = 1, n2 + call find_span(spl%sy, x2(i), cache%span2(i)) + end do + !$omp parallel do private(i) schedule(static) + do i = 1, n2 + call basis_funs(spl%sy, cache%span2(i), x2(i), cache%B2(:, i)) + end do + end subroutine precompute_grid_2d + + + subroutine precompute_grid_3d(spl, x1, x2, x3, cache) + type(bspline_3d), intent(in) :: spl + real(dp), intent(in) :: x1(:), x2(:), x3(:) + type(grid_cache_3d), intent(out) :: cache + integer :: i, n1, n2, n3, px, py, pz + + n1 = size(x1) + n2 = size(x2) + n3 = size(x3) + px = spl%sx%degree + py = spl%sy%degree + pz = spl%sz%degree + cache%ng1 = n1 + cache%ng2 = n2 + cache%ng3 = n3 + cache%px = px + cache%py = py + cache%pz = pz + allocate(cache%span1(n1), cache%span2(n2), cache%span3(n3)) + allocate(cache%B1(0:px, n1), cache%B2(0:py, n2), cache%B3(0:pz, n3)) + + !$omp parallel do simd private(i) schedule(simd:static) + do i = 1, n1 + call find_span(spl%sx, x1(i), cache%span1(i)) + end do + !$omp parallel do private(i) schedule(static) + do i = 1, n1 + call basis_funs(spl%sx, cache%span1(i), x1(i), cache%B1(:, i)) + end do + + !$omp parallel do simd private(i) schedule(simd:static) + do i = 1, n2 + call find_span(spl%sy, x2(i), cache%span2(i)) + end do + !$omp parallel do private(i) schedule(static) + do i = 1, n2 + call basis_funs(spl%sy, cache%span2(i), x2(i), cache%B2(:, i)) + end do + + !$omp parallel do simd private(i) schedule(simd:static) + do i = 1, n3 + call find_span(spl%sz, x3(i), cache%span3(i)) + end do + !$omp parallel do private(i) schedule(static) + do i = 1, n3 + call basis_funs(spl%sz, cache%span3(i), x3(i), cache%B3(:, i)) + end do + end subroutine precompute_grid_3d + + + subroutine apply_A_1d_grid(cache, coeff, f) + type(grid_cache_1d), intent(in) :: cache + real(dp), intent(in) :: coeff(:) + real(dp), intent(out) :: f(:) + integer :: i, a, ix, n1, px, s1 + + n1 = cache%ng1 + px = cache%px + !$omp parallel do simd private(i, a, ix, s1) schedule(simd:static) + do i = 1, n1 + s1 = cache%span1(i) + f(i) = 0.0_dp + do a = 0, px + ix = s1 - px + a + f(i) = f(i) + cache%B1(a, i)*coeff(ix) + end do + end do + end subroutine apply_A_1d_grid + + + subroutine apply_AT_1d_grid(cache, r, g, n_ctrl) + type(grid_cache_1d), intent(in) :: cache real(dp), intent(in) :: r(:) real(dp), intent(out) :: g(:) - - integer :: n_data, i, span, p, j - real(dp), allocatable :: N(:) + integer, intent(in) :: n_ctrl + integer :: i, a, ix, n1, px, s1 real(dp), allocatable :: g_local(:) - n_data = size(x_data) - if (size(r) /= n_data) then - error stop "apply_AT: r size mismatch" - end if - if (size(g) /= spl%n_ctrl) then - error stop "apply_AT: g size mismatch" - end if - - p = spl%degree + n1 = cache%ng1 + px = cache%px g = 0.0_dp -!$omp parallel default(shared) private(i, span, j, N, g_local) if (n_data > 100) - allocate(N(0:p)) - allocate(g_local(size(g))) + !$omp parallel private(g_local, i, a, ix, s1) default(shared) + allocate(g_local(n_ctrl)) g_local = 0.0_dp -!$omp do - do i = 1, n_data - call find_span(spl, x_data(i), span) - call basis_funs(spl, span, x_data(i), N) - do j = 0, p - g_local(span - p + j) = g_local(span - p + j) + N(j)*r(i) + !$omp do schedule(static) + do i = 1, n1 + s1 = cache%span1(i) + do a = 0, px + ix = s1 - px + a + g_local(ix) = g_local(ix) + cache%B1(a, i)*r(i) end do end do -!$omp end do -!$omp critical + !$omp end do + !$omp critical g = g + g_local -!$omp end critical + !$omp end critical deallocate(g_local) - deallocate(N) -!$omp end parallel - end subroutine apply_AT + !$omp end parallel + end subroutine apply_AT_1d_grid - subroutine apply_A2D(spl, x_data, y_data, coeff, f) - !! f = A * coeff (2D spline evaluation at all data points) - type(bspline_2d), intent(in) :: spl - real(dp), intent(in) :: x_data(:) - real(dp), intent(in) :: y_data(:) + subroutine apply_A_2d_grid(cache, coeff, f) + type(grid_cache_2d), intent(in) :: cache real(dp), intent(in) :: coeff(:,:) - real(dp), intent(out) :: f(:) + real(dp), intent(out) :: f(:,:) + integer :: i1, i2, a, b, ix, iy, n1, n2, px, py, s1, s2 + real(dp) :: val + + n1 = cache%ng1 + n2 = cache%ng2 + px = cache%px + py = cache%py + + !$omp parallel do collapse(2) private(i1, i2, a, b, ix, iy, s1, s2, val) & + !$omp& schedule(static) + do i2 = 1, n2 + do i1 = 1, n1 + s1 = cache%span1(i1) + s2 = cache%span2(i2) + val = 0.0_dp + do a = 0, px + ix = s1 - px + a + do b = 0, py + iy = s2 - py + b + val = val + cache%B1(a, i1)*cache%B2(b, i2)*coeff(ix, iy) + end do + end do + f(i1, i2) = val + end do + end do + end subroutine apply_A_2d_grid - integer :: n_data, nx, ny - integer :: i, spanx, spany, px, py, a, b, ix, iy - real(dp), allocatable :: Nx_b(:), Ny_b(:) - n_data = size(x_data) - if (n_data /= size(y_data) .or. n_data /= size(f)) then - error stop "apply_A2D: data size mismatch" - end if + subroutine apply_AT_2d_grid(cache, r, g, nx, ny) + type(grid_cache_2d), intent(in) :: cache + real(dp), intent(in) :: r(:,:) + real(dp), intent(out) :: g(:,:) + integer, intent(in) :: nx, ny + integer :: i1, i2, a, b, ix, iy, n1, n2, px, py, s1, s2 + real(dp), allocatable :: g_local(:,:) - nx = spl%sx%n_ctrl - ny = spl%sy%n_ctrl - if (size(coeff, 1) /= nx .or. size(coeff, 2) /= ny) then - error stop "apply_A2D: coeff shape mismatch" - end if + n1 = cache%ng1 + n2 = cache%ng2 + px = cache%px + py = cache%py + g = 0.0_dp - px = spl%sx%degree - py = spl%sy%degree + !$omp parallel private(g_local, i1, i2, a, b, ix, iy, s1, s2) default(shared) + allocate(g_local(nx, ny)) + g_local = 0.0_dp + !$omp do collapse(2) schedule(static) + do i2 = 1, n2 + do i1 = 1, n1 + s1 = cache%span1(i1) + s2 = cache%span2(i2) + do a = 0, px + ix = s1 - px + a + do b = 0, py + iy = s2 - py + b + g_local(ix, iy) = g_local(ix, iy) + & + cache%B1(a, i1)*cache%B2(b, i2)*r(i1, i2) + end do + end do + end do + end do + !$omp end do + !$omp critical + g = g + g_local + !$omp end critical + deallocate(g_local) + !$omp end parallel + end subroutine apply_AT_2d_grid + + + subroutine apply_A_3d_grid(cache, coeff, f) + type(grid_cache_3d), intent(in) :: cache + real(dp), intent(in) :: coeff(:,:,:) + real(dp), intent(out) :: f(:,:,:) + integer :: i1, i2, i3, a, b, c, ix, iy, iz + integer :: n1, n2, n3, px, py, pz, s1, s2, s3 + real(dp) :: val, Nab + + n1 = cache%ng1 + n2 = cache%ng2 + n3 = cache%ng3 + px = cache%px + py = cache%py + pz = cache%pz + + !$omp parallel do collapse(3) & + !$omp& private(i1, i2, i3, a, b, c, ix, iy, iz, s1, s2, s3, val, Nab) & + !$omp& schedule(static) + do i3 = 1, n3 + do i2 = 1, n2 + do i1 = 1, n1 + s1 = cache%span1(i1) + s2 = cache%span2(i2) + s3 = cache%span3(i3) + val = 0.0_dp + do a = 0, px + ix = s1 - px + a + do b = 0, py + iy = s2 - py + b + Nab = cache%B1(a, i1)*cache%B2(b, i2) + !$omp simd reduction(+:val) + do c = 0, pz + iz = s3 - pz + c + val = val + Nab*cache%B3(c, i3)*coeff(ix, iy, iz) + end do + end do + end do + f(i1, i2, i3) = val + end do + end do + end do + end subroutine apply_A_3d_grid + + + subroutine apply_AT_3d_grid(cache, r, g, nx, ny, nz) + type(grid_cache_3d), intent(in) :: cache + real(dp), intent(in) :: r(:,:,:) + real(dp), intent(out) :: g(:,:,:) + integer, intent(in) :: nx, ny, nz + integer :: i1, i2, i3, a, b, c, ix, iy, iz + integer :: n1, n2, n3, px, py, pz, s1, s2, s3 + real(dp) :: ri, Nab + real(dp), allocatable :: g_local(:,:,:) + + n1 = cache%ng1 + n2 = cache%ng2 + n3 = cache%ng3 + px = cache%px + py = cache%py + pz = cache%pz + g = 0.0_dp - f = 0.0_dp - -!$omp parallel default(shared) private(i, spanx, spany, a, b, ix, iy, Nx_b, Ny_b) & -!$omp if (n_data > 100) - allocate(Nx_b(0:px)) - allocate(Ny_b(0:py)) -!$omp do - do i = 1, n_data - call find_span(spl%sx, x_data(i), spanx) - call basis_funs(spl%sx, spanx, x_data(i), Nx_b) - call find_span(spl%sy, y_data(i), spany) - call basis_funs(spl%sy, spany, y_data(i), Ny_b) - do a = 0, px - ix = spanx - px + a - do b = 0, py - iy = spany - py + b - f(i) = f(i) + Nx_b(a)*Ny_b(b)*coeff(ix, iy) + !$omp parallel private(g_local, i1, i2, i3, a, b, c, ix, iy, iz, s1, s2, s3, ri, Nab) & + !$omp& default(shared) + allocate(g_local(nx, ny, nz)) + g_local = 0.0_dp + !$omp do collapse(3) schedule(static) + do i3 = 1, n3 + do i2 = 1, n2 + do i1 = 1, n1 + s1 = cache%span1(i1) + s2 = cache%span2(i2) + s3 = cache%span3(i3) + ri = r(i1, i2, i3) + do a = 0, px + ix = s1 - px + a + do b = 0, py + iy = s2 - py + b + Nab = cache%B1(a, i1)*cache%B2(b, i2)*ri + do c = 0, pz + iz = s3 - pz + c + g_local(ix, iy, iz) = g_local(ix, iy, iz) + & + Nab*cache%B3(c, i3) + end do + end do + end do end do end do end do -!$omp end do - deallocate(Nx_b, Ny_b) -!$omp end parallel - end subroutine apply_A2D + !$omp end do + !$omp critical + g = g + g_local + !$omp end critical + deallocate(g_local) + !$omp end parallel + end subroutine apply_AT_3d_grid - subroutine apply_A2D_T(spl, x_data, y_data, r, g) - !! g = A^T * r (adjoint action in 2D coefficient space) - type(bspline_2d), intent(in) :: spl + subroutine bspline_1d_lsq_cgls(spl, x_data, f_data, coeff, max_iter, tol) + type(bspline_1d), intent(in) :: spl real(dp), intent(in) :: x_data(:) - real(dp), intent(in) :: y_data(:) - real(dp), intent(in) :: r(:) - real(dp), intent(out) :: g(:,:) + real(dp), intent(in) :: f_data(:) + real(dp), intent(inout) :: coeff(:) + integer, intent(in), optional :: max_iter + real(dp), intent(in), optional :: tol - integer :: n_data, nx, ny - integer :: i, spanx, spany, px, py, a, b, ix, iy - real(dp), allocatable :: Nx_b(:), Ny_b(:) - real(dp), allocatable :: g_local(:,:) + type(grid_cache_1d) :: cache + integer :: n_data, n_ctrl, k, kmax + real(dp) :: atol, gamma, gamma_new, alpha, beta, denom, rhs_norm + real(dp), allocatable :: r(:), q(:), s(:), p(:) n_data = size(x_data) - if (n_data /= size(y_data) .or. n_data /= size(r)) then - error stop "apply_A2D_T: data size mismatch" - end if + n_ctrl = spl%n_ctrl + kmax = 200 + atol = 1.0d-10 + if (present(max_iter)) kmax = max_iter + if (present(tol)) atol = tol + + call precompute_grid_1d(spl, x_data, cache) + + allocate(r(n_data), q(n_data), s(n_ctrl), p(n_ctrl)) + coeff = 0.0_dp + r = f_data + call apply_AT_1d_grid(cache, r, s, n_ctrl) + p = s + gamma = dot_product(s, s) + rhs_norm = sqrt(dot_product(f_data, f_data)) + if (rhs_norm == 0.0_dp) return + + do k = 1, kmax + call apply_A_1d_grid(cache, p, q) + denom = dot_product(q, q) + if (denom <= 0.0_dp) exit + alpha = gamma/denom + coeff = coeff + alpha*p + r = r - alpha*q + call apply_AT_1d_grid(cache, r, s, n_ctrl) + gamma_new = dot_product(s, s) + if (gamma_new <= (atol*rhs_norm)**2) exit + beta = gamma_new/gamma + gamma = gamma_new + p = s + beta*p + end do + end subroutine bspline_1d_lsq_cgls + + subroutine bspline_2d_lsq_cgls(spl, x1, x2, f_grid, coeff, max_iter, tol) + type(bspline_2d), intent(in) :: spl + real(dp), intent(in) :: x1(:), x2(:) + real(dp), intent(in) :: f_grid(:,:) + real(dp), intent(inout) :: coeff(:,:) + integer, intent(in), optional :: max_iter + real(dp), intent(in), optional :: tol + + type(grid_cache_2d) :: cache + integer :: n1, n2, nx, ny, k, kmax + real(dp) :: atol, gamma, gamma_new, alpha, beta, denom, rhs_norm + real(dp), allocatable :: r(:,:), q(:,:), s(:,:), p(:,:) + + n1 = size(x1) + n2 = size(x2) nx = spl%sx%n_ctrl ny = spl%sy%n_ctrl - if (size(g, 1) /= nx .or. size(g, 2) /= ny) then - error stop "apply_A2D_T: g shape mismatch" - end if + kmax = 400 + atol = 1.0d-10 + if (present(max_iter)) kmax = max_iter + if (present(tol)) atol = tol - px = spl%sx%degree - py = spl%sy%degree + call precompute_grid_2d(spl, x1, x2, cache) - g = 0.0_dp + allocate(r(n1, n2), q(n1, n2), s(nx, ny), p(nx, ny)) + coeff = 0.0_dp + r = f_grid + call apply_AT_2d_grid(cache, r, s, nx, ny) + p = s + gamma = sum(s*s) + rhs_norm = sqrt(sum(f_grid*f_grid)) + if (rhs_norm == 0.0_dp) return -!$omp parallel default(shared) private(i, spanx, spany, a, b, ix, iy) & -!$omp& private(Nx_b, Ny_b, g_local) if (n_data > 100) - allocate(Nx_b(0:px)) - allocate(Ny_b(0:py)) - allocate(g_local(nx, ny)) - g_local = 0.0_dp -!$omp do - do i = 1, n_data - call find_span(spl%sx, x_data(i), spanx) - call basis_funs(spl%sx, spanx, x_data(i), Nx_b) - call find_span(spl%sy, y_data(i), spany) - call basis_funs(spl%sy, spany, y_data(i), Ny_b) - do a = 0, px - ix = spanx - px + a - do b = 0, py - iy = spany - py + b - g_local(ix, iy) = g_local(ix, iy) + Nx_b(a)*Ny_b(b)*r(i) - end do - end do + do k = 1, kmax + call apply_A_2d_grid(cache, p, q) + denom = sum(q*q) + if (denom <= 0.0_dp) exit + alpha = gamma/denom + coeff = coeff + alpha*p + r = r - alpha*q + call apply_AT_2d_grid(cache, r, s, nx, ny) + gamma_new = sum(s*s) + if (gamma_new <= (atol*rhs_norm)**2) exit + beta = gamma_new/gamma + gamma = gamma_new + p = s + beta*p end do -!$omp end do -!$omp critical - g = g + g_local -!$omp end critical - deallocate(g_local) - deallocate(Nx_b, Ny_b) -!$omp end parallel - end subroutine apply_A2D_T + end subroutine bspline_2d_lsq_cgls + + + subroutine bspline_3d_lsq_cgls(spl, x1, x2, x3, f_grid, coeff, max_iter, tol) + type(bspline_3d), intent(in) :: spl + real(dp), intent(in) :: x1(:), x2(:), x3(:) + real(dp), intent(in) :: f_grid(:,:,:) + real(dp), intent(inout) :: coeff(:,:,:) + integer, intent(in), optional :: max_iter + real(dp), intent(in), optional :: tol + + type(grid_cache_3d) :: cache + integer :: n1, n2, n3, nx, ny, nz, k, kmax + real(dp) :: atol, gamma, gamma_new, alpha, beta, denom, rhs_norm + real(dp), allocatable :: r(:,:,:), q(:,:,:), s(:,:,:), p(:,:,:) + + n1 = size(x1) + n2 = size(x2) + n3 = size(x3) + nx = spl%sx%n_ctrl + ny = spl%sy%n_ctrl + nz = spl%sz%n_ctrl + kmax = 400 + atol = 1.0d-10 + if (present(max_iter)) kmax = max_iter + if (present(tol)) atol = tol + + call precompute_grid_3d(spl, x1, x2, x3, cache) + + allocate(r(n1, n2, n3), q(n1, n2, n3), s(nx, ny, nz), p(nx, ny, nz)) + coeff = 0.0_dp + r = f_grid + call apply_AT_3d_grid(cache, r, s, nx, ny, nz) + p = s + gamma = sum(s*s) + rhs_norm = sqrt(sum(f_grid*f_grid)) + if (rhs_norm == 0.0_dp) return + + do k = 1, kmax + call apply_A_3d_grid(cache, p, q) + denom = sum(q*q) + if (denom <= 0.0_dp) exit + alpha = gamma/denom + coeff = coeff + alpha*p + r = r - alpha*q + call apply_AT_3d_grid(cache, r, s, nx, ny, nz) + gamma_new = sum(s*s) + if (gamma_new <= (atol*rhs_norm)**2) exit + beta = gamma_new/gamma + gamma = gamma_new + p = s + beta*p + end do + end subroutine bspline_3d_lsq_cgls end module neo_bspline diff --git a/src/interpolate/neo_bspline_3d.f90 b/src/interpolate/neo_bspline_3d.f90 deleted file mode 100644 index 5a6c3483..00000000 --- a/src/interpolate/neo_bspline_3d.f90 +++ /dev/null @@ -1,526 +0,0 @@ -module neo_bspline_3d - !! 3D tensor-product B-splines and matrix-free LSQ via CGLS. - !! Includes block-wise basis caching for high-performance LSQ. - use, intrinsic :: iso_fortran_env, only : dp => real64 - use neo_bspline, only : bspline_1d, bspline_1d_init_uniform, find_span, basis_funs - implicit none - private - - type :: bspline_3d - type(bspline_1d) :: sx - type(bspline_1d) :: sy - type(bspline_1d) :: sz - end type bspline_3d - - type :: basis_cache_3d - integer :: n_pts - integer :: px, py, pz - integer, allocatable :: spanx(:), spany(:), spanz(:) - real(dp), allocatable :: Nx_tab(:,:), Ny_tab(:,:), Nz_tab(:,:) - end type basis_cache_3d - - public :: bspline_3d - public :: bspline_3d_init_uniform - public :: bspline_3d_eval - public :: bspline_3d_lsq_cgls - public :: bspline_3d_lsq_cgls_batch - public :: apply_A3D - public :: apply_A3D_T - -contains - - subroutine bspline_3d_init_uniform(spl, degree, n_ctrl, x_min, x_max) - !! Initialise 3D tensor-product B-spline with open-uniform knots - !! in each dimension on [x_min(j), x_max(j)]. - type(bspline_3d), intent(out) :: spl - integer, intent(in) :: degree(3), n_ctrl(3) - real(dp), intent(in) :: x_min(3), x_max(3) - - call bspline_1d_init_uniform(spl%sx, degree(1), n_ctrl(1), x_min(1), x_max(1)) - call bspline_1d_init_uniform(spl%sy, degree(2), n_ctrl(2), x_min(2), x_max(2)) - call bspline_1d_init_uniform(spl%sz, degree(3), n_ctrl(3), x_min(3), x_max(3)) - end subroutine bspline_3d_init_uniform - - - subroutine bspline_3d_eval(spl, coeff, x, y) - !! Evaluate 3D spline - !! S(x,y,z) = sum_{i,j,k} coeff(i,j,k) N_i(x) M_j(y) L_k(z). - type(bspline_3d), intent(in) :: spl - real(dp), intent(in) :: coeff(:,:,:) - real(dp), intent(in) :: x(3) - real(dp), intent(out) :: y - - integer :: nx, ny, nz - integer :: spanx, spany, spanz - integer :: px, py, pz - integer :: a, b, c - integer :: ix, iy, iz - real(dp), allocatable :: Nx_b(:), Ny_b(:), Nz_b(:) - - nx = spl%sx%n_ctrl - ny = spl%sy%n_ctrl - nz = spl%sz%n_ctrl - if (size(coeff, 1) /= nx .or. size(coeff, 2) /= ny .or. & - size(coeff, 3) /= nz) then - error stop "bspline_3d_eval: coeff shape mismatch" - end if - - px = spl%sx%degree - py = spl%sy%degree - pz = spl%sz%degree - - allocate(Nx_b(0:px)) - allocate(Ny_b(0:py)) - allocate(Nz_b(0:pz)) - - call find_span(spl%sx, x(1), spanx) - call basis_funs(spl%sx, spanx, x(1), Nx_b) - call find_span(spl%sy, x(2), spany) - call basis_funs(spl%sy, spany, x(2), Ny_b) - call find_span(spl%sz, x(3), spanz) - call basis_funs(spl%sz, spanz, x(3), Nz_b) - - y = 0.0_dp - do a = 0, px - ix = spanx - px + a - do b = 0, py - iy = spany - py + b - do c = 0, pz - iz = spanz - pz + c - y = y + Nx_b(a)*Ny_b(b)*Nz_b(c)*coeff(ix, iy, iz) - end do - end do - end do - - deallocate(Nx_b, Ny_b, Nz_b) - end subroutine bspline_3d_eval - - - subroutine bspline_3d_lsq_cgls(spl, x_data, y_data, z_data, f_data, coeff, & - max_iter, tol) - !! Matrix-free CGLS for 3D tensor-product B-spline LSQ: - !! min_C sum_i (S_C(x_i,y_i,z_i) - f_i)^2 - !! - !! Uses basis caching: spans and basis functions are precomputed - !! once before the CG iterations, then reused via cached operators. - type(bspline_3d), intent(in) :: spl - real(dp), intent(in) :: x_data(:) - real(dp), intent(in) :: y_data(:) - real(dp), intent(in) :: z_data(:) - real(dp), intent(in) :: f_data(:) - real(dp), intent(inout) :: coeff(:,:,:) - integer, intent(in), optional :: max_iter - real(dp), intent(in), optional :: tol - - integer :: n_data, nx, ny, nz - integer :: k, kmax - real(dp) :: atol, gamma, gamma_new, alpha, beta, denom - real(dp) :: rhs_norm - real(dp), allocatable :: r(:), q(:) - real(dp), allocatable :: s(:,:,:), p(:,:,:) - type(basis_cache_3d) :: cache - - n_data = size(x_data) - if (n_data /= size(y_data) .or. n_data /= size(z_data) .or. & - n_data /= size(f_data)) then - error stop "bspline_3d_lsq_cgls: data size mismatch" - end if - - nx = spl%sx%n_ctrl - ny = spl%sy%n_ctrl - nz = spl%sz%n_ctrl - if (size(coeff, 1) /= nx .or. size(coeff, 2) /= ny .or. & - size(coeff, 3) /= nz) then - error stop "bspline_3d_lsq_cgls: coeff shape mismatch" - end if - - if (present(max_iter)) then - kmax = max_iter - else - kmax = 400 - end if - if (present(tol)) then - atol = tol - else - atol = 1.0d-10 - end if - - call precompute_basis_3d(spl, x_data, y_data, z_data, cache) - - allocate(r(n_data)) - allocate(q(n_data)) - allocate(s(nx, ny, nz)) - allocate(p(nx, ny, nz)) - - coeff = 0.0_dp - r = f_data - - call apply_A3D_T_cached(spl, cache, r, s) - p = s - gamma = sum(s*s) - rhs_norm = sqrt(sum(f_data*f_data)) - - if (rhs_norm == 0.0_dp) then - coeff = 0.0_dp - deallocate(r, q, s, p) - return - end if - - do k = 1, kmax - call apply_A3D_cached(spl, cache, p, q) - denom = sum(q*q) - if (denom <= 0.0_dp) exit - - alpha = gamma/denom - coeff = coeff + alpha*p - r = r - alpha*q - - call apply_A3D_T_cached(spl, cache, r, s) - gamma_new = sum(s*s) - - if (gamma_new <= (atol*rhs_norm)**2) exit - - beta = gamma_new/gamma - gamma = gamma_new - p = s + beta*p - end do - - deallocate(r, q, s, p) - end subroutine bspline_3d_lsq_cgls - - - subroutine bspline_3d_lsq_cgls_batch(spl, x_data, y_data, z_data, f_data, & - coeff, max_iter, tol) - !! Batched matrix-free CGLS for 3D tensor-product B-splines. - !! Solves independent LSQ problems for multiple right-hand sides. - type(bspline_3d), intent(in) :: spl - real(dp), intent(in) :: x_data(:) - real(dp), intent(in) :: y_data(:) - real(dp), intent(in) :: z_data(:) - real(dp), intent(in) :: f_data(:,:) - real(dp), intent(inout) :: coeff(:,:,:,:) - integer, intent(in), optional :: max_iter - real(dp), intent(in), optional :: tol - - integer :: n_data, n_rhs, nx, ny, nz, k - - n_data = size(x_data) - if (n_data /= size(y_data) .or. n_data /= size(z_data) .or. & - n_data /= size(f_data, 1)) then - error stop "bspline_3d_lsq_cgls_batch: data size mismatch" - end if - - n_rhs = size(f_data, 2) - nx = spl%sx%n_ctrl - ny = spl%sy%n_ctrl - nz = spl%sz%n_ctrl - - if (size(coeff, 1) /= nx .or. size(coeff, 2) /= ny .or. & - size(coeff, 3) /= nz .or. size(coeff, 4) /= n_rhs) then - error stop "bspline_3d_lsq_cgls_batch: coeff shape mismatch" - end if - - do k = 1, n_rhs - if (present(max_iter) .and. present(tol)) then - call bspline_3d_lsq_cgls(spl, x_data, y_data, z_data, f_data(:, k), & - coeff(:, :, :, k), max_iter=max_iter, tol=tol) - elseif (present(max_iter)) then - call bspline_3d_lsq_cgls(spl, x_data, y_data, z_data, f_data(:, k), & - coeff(:, :, :, k), max_iter=max_iter) - elseif (present(tol)) then - call bspline_3d_lsq_cgls(spl, x_data, y_data, z_data, f_data(:, k), & - coeff(:, :, :, k), tol=tol) - else - call bspline_3d_lsq_cgls(spl, x_data, y_data, z_data, f_data(:, k), & - coeff(:, :, :, k)) - end if - end do - end subroutine bspline_3d_lsq_cgls_batch - - - subroutine apply_A3D(spl, x_data, y_data, z_data, coeff, f) - !! f = A * coeff (3D spline evaluation at all data points) - type(bspline_3d), intent(in) :: spl - real(dp), intent(in) :: x_data(:) - real(dp), intent(in) :: y_data(:) - real(dp), intent(in) :: z_data(:) - real(dp), intent(in) :: coeff(:,:,:) - real(dp), intent(out) :: f(:) - - integer :: n_data, nx, ny, nz - integer :: i, spanx, spany, spanz - integer :: px, py, pz - integer :: a, b, c, ix, iy, iz - real(dp), allocatable :: Nx_b(:), Ny_b(:), Nz_b(:) - - n_data = size(x_data) - if (n_data /= size(y_data) .or. n_data /= size(z_data) .or. & - n_data /= size(f)) then - error stop "apply_A3D: data size mismatch" - end if - - nx = spl%sx%n_ctrl - ny = spl%sy%n_ctrl - nz = spl%sz%n_ctrl - if (size(coeff, 1) /= nx .or. size(coeff, 2) /= ny .or. & - size(coeff, 3) /= nz) then - error stop "apply_A3D: coeff shape mismatch" - end if - - px = spl%sx%degree - py = spl%sy%degree - pz = spl%sz%degree - - f = 0.0_dp - -!$omp parallel default(shared) private(i, spanx, spany, spanz, a, b, c, ix, iy, iz) & -!$omp& private(Nx_b, Ny_b, Nz_b) if (n_data > 100) - allocate(Nx_b(0:px)) - allocate(Ny_b(0:py)) - allocate(Nz_b(0:pz)) -!$omp do - do i = 1, n_data - call find_span(spl%sx, x_data(i), spanx) - call basis_funs(spl%sx, spanx, x_data(i), Nx_b) - call find_span(spl%sy, y_data(i), spany) - call basis_funs(spl%sy, spany, y_data(i), Ny_b) - call find_span(spl%sz, z_data(i), spanz) - call basis_funs(spl%sz, spanz, z_data(i), Nz_b) - - do a = 0, px - ix = spanx - px + a - do b = 0, py - iy = spany - py + b - do c = 0, pz - iz = spanz - pz + c - f(i) = f(i) + Nx_b(a)*Ny_b(b)*Nz_b(c)*coeff(ix, iy, iz) - end do - end do - end do - end do -!$omp end do - deallocate(Nx_b, Ny_b, Nz_b) -!$omp end parallel - end subroutine apply_A3D - - - subroutine apply_A3D_T(spl, x_data, y_data, z_data, r, g) - !! g = A^T * r (adjoint action in 3D coefficient space) - type(bspline_3d), intent(in) :: spl - real(dp), intent(in) :: x_data(:) - real(dp), intent(in) :: y_data(:) - real(dp), intent(in) :: z_data(:) - real(dp), intent(in) :: r(:) - real(dp), intent(out) :: g(:,:,:) - - integer :: n_data, nx, ny, nz - integer :: i, spanx, spany, spanz - integer :: px, py, pz - integer :: a, b, c, ix, iy, iz - real(dp), allocatable :: Nx_b(:), Ny_b(:), Nz_b(:) - real(dp), allocatable :: g_local(:,:,:) - - n_data = size(x_data) - if (n_data /= size(y_data) .or. n_data /= size(z_data) .or. & - n_data /= size(r)) then - error stop "apply_A3D_T: data size mismatch" - end if - - nx = spl%sx%n_ctrl - ny = spl%sy%n_ctrl - nz = spl%sz%n_ctrl - if (size(g, 1) /= nx .or. size(g, 2) /= ny .or. size(g, 3) /= nz) then - error stop "apply_A3D_T: g shape mismatch" - end if - - px = spl%sx%degree - py = spl%sy%degree - pz = spl%sz%degree - - g = 0.0_dp - -!$omp parallel default(shared) private(i, spanx, spany, spanz, a, b, c, ix, iy, iz) & -!$omp& private(Nx_b, Ny_b, Nz_b, g_local) if (n_data > 100) - allocate(Nx_b(0:px)) - allocate(Ny_b(0:py)) - allocate(Nz_b(0:pz)) - allocate(g_local(nx, ny, nz)) - g_local = 0.0_dp -!$omp do - do i = 1, n_data - call find_span(spl%sx, x_data(i), spanx) - call basis_funs(spl%sx, spanx, x_data(i), Nx_b) - call find_span(spl%sy, y_data(i), spany) - call basis_funs(spl%sy, spany, y_data(i), Ny_b) - call find_span(spl%sz, z_data(i), spanz) - call basis_funs(spl%sz, spanz, z_data(i), Nz_b) - - do a = 0, px - ix = spanx - px + a - do b = 0, py - iy = spany - py + b - do c = 0, pz - iz = spanz - pz + c - g_local(ix, iy, iz) = g_local(ix, iy, iz) + & - Nx_b(a)*Ny_b(b)*Nz_b(c)*r(i) - end do - end do - end do - end do -!$omp end do -!$omp critical - g = g + g_local -!$omp end critical - deallocate(g_local) - deallocate(Nx_b, Ny_b, Nz_b) -!$omp end parallel - end subroutine apply_A3D_T - - - subroutine precompute_basis_3d(spl, x_data, y_data, z_data, cache) - !! Precompute spans and basis values for all data points. - type(bspline_3d), intent(in) :: spl - real(dp), intent(in) :: x_data(:) - real(dp), intent(in) :: y_data(:) - real(dp), intent(in) :: z_data(:) - type(basis_cache_3d), intent(out) :: cache - - integer :: n_data, i, spanx_loc, spany_loc, spanz_loc - integer :: px, py, pz - real(dp), allocatable :: Nx_loc(:), Ny_loc(:), Nz_loc(:) - - n_data = size(x_data) - px = spl%sx%degree - py = spl%sy%degree - pz = spl%sz%degree - - cache%n_pts = n_data - cache%px = px - cache%py = py - cache%pz = pz - - allocate(cache%spanx(n_data), cache%spany(n_data), cache%spanz(n_data)) - allocate(cache%Nx_tab(0:px, n_data)) - allocate(cache%Ny_tab(0:py, n_data)) - allocate(cache%Nz_tab(0:pz, n_data)) - -!$omp parallel default(shared) & -!$omp& private(i, spanx_loc, spany_loc, spanz_loc, Nx_loc, Ny_loc, Nz_loc) & -!$omp& if (n_data > 100) - allocate(Nx_loc(0:px), Ny_loc(0:py), Nz_loc(0:pz)) -!$omp do - do i = 1, n_data - call find_span(spl%sx, x_data(i), spanx_loc) - call basis_funs(spl%sx, spanx_loc, x_data(i), Nx_loc) - call find_span(spl%sy, y_data(i), spany_loc) - call basis_funs(spl%sy, spany_loc, y_data(i), Ny_loc) - call find_span(spl%sz, z_data(i), spanz_loc) - call basis_funs(spl%sz, spanz_loc, z_data(i), Nz_loc) - - cache%spanx(i) = spanx_loc - cache%spany(i) = spany_loc - cache%spanz(i) = spanz_loc - cache%Nx_tab(:, i) = Nx_loc - cache%Ny_tab(:, i) = Ny_loc - cache%Nz_tab(:, i) = Nz_loc - end do -!$omp end do - deallocate(Nx_loc, Ny_loc, Nz_loc) -!$omp end parallel - end subroutine precompute_basis_3d - - - subroutine apply_A3D_cached(spl, cache, coeff, f) - !! f = A * coeff using precomputed basis (cached). - type(bspline_3d), intent(in) :: spl - type(basis_cache_3d), intent(in) :: cache - real(dp), intent(in) :: coeff(:,:,:) - real(dp), intent(out) :: f(:) - - integer :: n_data, px, py, pz - integer :: i, a, b, c, ix, iy, iz, spanx, spany, spanz - - n_data = cache%n_pts - px = cache%px - py = cache%py - pz = cache%pz - - f = 0.0_dp - -!$omp parallel default(shared) private(i, a, b, c, ix, iy, iz, spanx, spany, spanz) & -!$omp& if (n_data > 100) -!$omp do - do i = 1, n_data - spanx = cache%spanx(i) - spany = cache%spany(i) - spanz = cache%spanz(i) - do a = 0, px - ix = spanx - px + a - do b = 0, py - iy = spany - py + b - do c = 0, pz - iz = spanz - pz + c - f(i) = f(i) + cache%Nx_tab(a, i)*cache%Ny_tab(b, i) & - *cache%Nz_tab(c, i)*coeff(ix, iy, iz) - end do - end do - end do - end do -!$omp end do -!$omp end parallel - end subroutine apply_A3D_cached - - - subroutine apply_A3D_T_cached(spl, cache, r, g) - !! g = A^T * r using precomputed basis (cached). - type(bspline_3d), intent(in) :: spl - type(basis_cache_3d), intent(in) :: cache - real(dp), intent(in) :: r(:) - real(dp), intent(out) :: g(:,:,:) - - integer :: n_data, nx, ny, nz, px, py, pz - integer :: i, a, b, c, ix, iy, iz, spanx, spany, spanz - real(dp), allocatable :: g_local(:,:,:) - - n_data = cache%n_pts - nx = spl%sx%n_ctrl - ny = spl%sy%n_ctrl - nz = spl%sz%n_ctrl - px = cache%px - py = cache%py - pz = cache%pz - - g = 0.0_dp - -!$omp parallel default(shared) & -!$omp& private(i, a, b, c, ix, iy, iz, spanx, spany, spanz, g_local) if (n_data > 100) - allocate(g_local(nx, ny, nz)) - g_local = 0.0_dp -!$omp do - do i = 1, n_data - spanx = cache%spanx(i) - spany = cache%spany(i) - spanz = cache%spanz(i) - do a = 0, px - ix = spanx - px + a - do b = 0, py - iy = spany - py + b - do c = 0, pz - iz = spanz - pz + c - g_local(ix, iy, iz) = g_local(ix, iy, iz) + & - cache%Nx_tab(a, i)*cache%Ny_tab(b, i) & - *cache%Nz_tab(c, i)*r(i) - end do - end do - end do - end do -!$omp end do -!$omp critical - g = g + g_local -!$omp end critical - deallocate(g_local) -!$omp end parallel - end subroutine apply_A3D_T_cached - - -end module neo_bspline_3d diff --git a/test/source/bench_neo_bspline_vs_interpolate.f90 b/test/source/bench_neo_bspline_vs_interpolate.f90 index eb45be2c..f45052d1 100644 --- a/test/source/bench_neo_bspline_vs_interpolate.f90 +++ b/test/source/bench_neo_bspline_vs_interpolate.f90 @@ -3,13 +3,12 @@ program bench_neo_bspline_vs_interpolate use, intrinsic :: iso_c_binding, only : c_int, c_long use interpolate use neo_bspline - use neo_bspline_3d implicit none - integer, parameter :: N_CASE = 7 + integer, parameter :: N_CASE = 9 integer, parameter :: N_TOTAL_LIST(N_CASE) = & - [10, 30, 100, 300, 1000, 3000, 10000] + [10, 30, 100, 300, 1000, 3000, 10000, 30000, 100000] real(dp_bench), parameter :: PI_BENCH = acos(-1.0_dp_bench) real(dp_bench), parameter :: TWOPI_BENCH = 2.0_dp_bench*PI_BENCH @@ -135,11 +134,10 @@ subroutine run_bench_2d() real(dp_bench) :: t_create_bs, t_eval_bs real(dp_bench), allocatable :: x1(:), x2(:) real(dp_bench), allocatable :: f_grid(:,:) - real(dp_bench), allocatable :: x_data(:), y_data(:), f_vec(:) real(dp_bench), allocatable :: coeff_bs(:,:) real(dp_bench) :: x_min(2), x_max(2) real(dp_bench) :: x(2), y - integer :: unit, idx, n_data + integer :: unit, n_data x_min = [1.23_dp_bench, 1.23_dp_bench] x_max = x_min + [TWOPI_BENCH, TWOPI_BENCH] @@ -159,25 +157,19 @@ subroutine run_bench_2d() n_data = n1*n2 allocate(x1(n1), x2(n2), f_grid(n1, n2)) - allocate(x_data(n_data), y_data(n_data), f_vec(n_data)) do i1 = 1, n1 - x1(i1) = x_min(1) + (x_max(1) - x_min(1)) * & + x1(i1) = x_min(1) + (x_max(1) - x_min(1))* & real(i1 - 1, dp_bench)/real(n1 - 1, dp_bench) end do do i2 = 1, n2 - x2(i2) = x_min(2) + (x_max(2) - x_min(2)) * & + x2(i2) = x_min(2) + (x_max(2) - x_min(2))* & real(i2 - 1, dp_bench)/real(n2 - 1, dp_bench) end do - idx = 0 do i2 = 1, n2 do i1 = 1, n1 f_grid(i1, i2) = cos(x1(i1))*cos(2.0_dp_bench*x2(i2)) - idx = idx + 1 - x_data(idx) = x1(i1) - y_data(idx) = x2(i2) - f_vec(idx) = f_grid(i1, i2) end do end do @@ -205,12 +197,12 @@ subroutine run_bench_2d() n_ctrl(2) = max(degree(2) + 1, n_ctrl(2)) allocate(coeff_bs(n_ctrl(1), n_ctrl(2))) + coeff_bs = 0.0_dp_bench call bench_time_now(t0) - call bspline_2d_init_uniform(spl_bs, degree, n_ctrl, x_min, & - x_max) - call bspline_2d_lsq_cgls(spl_bs, x_data, y_data, f_vec, & - coeff_bs, max_iter=800, tol=1.0d-10) + call bspline_2d_init_uniform(spl_bs, degree, n_ctrl, x_min, x_max) + call bspline_2d_lsq_cgls(spl_bs, x1, x2, f_grid, coeff_bs, & + max_iter=800, tol=1.0d-10) call bench_time_now(t1) t_create_bs = t1 - t0 @@ -227,7 +219,7 @@ subroutine run_bench_2d() write(unit,'(i10,4es16.8)') n_data, t_create_interp, & t_eval_interp, t_create_bs, t_eval_bs - deallocate(x1, x2, f_grid, x_data, y_data, f_vec, coeff_bs) + deallocate(x1, x2, f_grid, coeff_bs) call destroy_splines_2d(spl_interp) end do @@ -246,12 +238,10 @@ subroutine run_bench_3d() real(dp_bench) :: t_create_bs, t_eval_bs real(dp_bench), allocatable :: x1(:), x2(:), x3(:) real(dp_bench), allocatable :: f3d(:,:,:) - real(dp_bench), allocatable :: x_data(:), y_data(:), z_data(:), & - f_vec(:) real(dp_bench), allocatable :: coeff_bs(:,:,:) real(dp_bench) :: x_min(3), x_max(3) real(dp_bench) :: x(3), y - integer :: unit, idx, n_data + integer :: unit, n_data x_min = [1.23_dp_bench, 1.23_dp_bench, 1.23_dp_bench] x_max = x_min + [TWOPI_BENCH, TWOPI_BENCH, TWOPI_BENCH] @@ -273,55 +263,52 @@ subroutine run_bench_3d() allocate(x1(n1), x2(n2), x3(n3)) allocate(f3d(n1, n2, n3)) - allocate(x_data(n_data), y_data(n_data), z_data(n_data), & - f_vec(n_data)) do i1 = 1, n1 - x1(i1) = x_min(1) + (x_max(1) - x_min(1)) * & + x1(i1) = x_min(1) + (x_max(1) - x_min(1))* & real(i1 - 1, dp_bench)/real(n1 - 1, dp_bench) end do do i2 = 1, n2 - x2(i2) = x_min(2) + (x_max(2) - x_min(2)) * & + x2(i2) = x_min(2) + (x_max(2) - x_min(2))* & real(i2 - 1, dp_bench)/real(n2 - 1, dp_bench) end do do i3 = 1, n3 - x3(i3) = x_min(3) + (x_max(3) - x_min(3)) * & + x3(i3) = x_min(3) + (x_max(3) - x_min(3))* & real(i3 - 1, dp_bench)/real(n3 - 1, dp_bench) end do - idx = 0 do i3 = 1, n3 do i2 = 1, n2 do i1 = 1, n1 f3d(i1, i2, i3) = cos(x1(i1))*cos(2.0_dp_bench*x2(i2)) & *cos(3.0_dp_bench*x3(i3)) - idx = idx + 1 - x_data(idx) = x1(i1) - y_data(idx) = x2(i2) - z_data(idx) = x3(i3) - f_vec(idx) = f3d(i1, i2, i3) end do end do end do - ! Interpolate: construct + evaluate - call bench_time_now(t0) - call construct_splines_3d(x_min, x_max, f3d, [5, 5, 5], & - [.false., .false., .false.], spl_interp) - call bench_time_now(t1) - t_create_interp = t1 - t0 - - call bench_time_now(t0) - do i3 = 1, n3 - do i2 = 1, n2 - do i1 = 1, n1 - x = [x1(i1), x2(i2), x3(i3)] - call evaluate_splines_3d(spl_interp, x, y) + ! Interpolate: construct + evaluate (skip for large N) + if (n_data <= 10000) then + call bench_time_now(t0) + call construct_splines_3d(x_min, x_max, f3d, [5, 5, 5], & + [.false., .false., .false.], spl_interp) + call bench_time_now(t1) + t_create_interp = t1 - t0 + + call bench_time_now(t0) + do i3 = 1, n3 + do i2 = 1, n2 + do i1 = 1, n1 + x = [x1(i1), x2(i2), x3(i3)] + call evaluate_splines_3d(spl_interp, x, y) + end do end do end do - end do - call bench_time_now(t1) - t_eval_interp = t1 - t0 + call bench_time_now(t1) + t_eval_interp = t1 - t0 + else + t_create_interp = -1.0_dp_bench + t_eval_interp = -1.0_dp_bench + end if ! neo_bspline LSQ: construct + evaluate n_ctrl(1) = min(16, n1/2) @@ -332,12 +319,12 @@ subroutine run_bench_3d() n_ctrl(3) = max(degree(3) + 1, n_ctrl(3)) allocate(coeff_bs(n_ctrl(1), n_ctrl(2), n_ctrl(3))) + coeff_bs = 0.0_dp_bench call bench_time_now(t0) - call bspline_3d_init_uniform(spl_bs, degree, n_ctrl, x_min, & - x_max) - call bspline_3d_lsq_cgls(spl_bs, x_data, y_data, z_data, f_vec, & - coeff_bs, max_iter=800, tol=1.0d-10) + call bspline_3d_init_uniform(spl_bs, degree, n_ctrl, x_min, x_max) + call bspline_3d_lsq_cgls(spl_bs, x1, x2, x3, f3d, coeff_bs, & + max_iter=800, tol=1.0d-10) call bench_time_now(t1) t_create_bs = t1 - t0 @@ -356,9 +343,8 @@ subroutine run_bench_3d() write(unit,'(i10,4es16.8)') n_data, t_create_interp, & t_eval_interp, t_create_bs, t_eval_bs - deallocate(x1, x2, x3, f3d) - deallocate(x_data, y_data, z_data, f_vec, coeff_bs) - call destroy_splines_3d(spl_interp) + deallocate(x1, x2, x3, f3d, coeff_bs) + if (n_data <= 10000) call destroy_splines_3d(spl_interp) end do close(unit) diff --git a/test/source/test_neo_bspline_1d.f90 b/test/source/test_neo_bspline_1d.f90 index 847e086b..dab6895a 100644 --- a/test/source/test_neo_bspline_1d.f90 +++ b/test/source/test_neo_bspline_1d.f90 @@ -11,7 +11,6 @@ program test_neo_bspline_1d real(dp), parameter :: X_MAX = TWOPI + 1.23d0 call test_bspline_1d_partition_unity() - call test_bspline_1d_adjoint() call test_bspline_1d_lsq_cos() call test_bspline_1d_lsq_batch() @@ -56,49 +55,6 @@ subroutine test_bspline_1d_partition_unity() end subroutine test_bspline_1d_partition_unity - subroutine test_bspline_1d_adjoint() - type(bspline_1d) :: spl - integer, parameter :: DEGREE = 4 - integer, parameter :: N_CTRL = 30 - integer, parameter :: N_DATA = 200 - - real(dp) :: x_data(N_DATA) - real(dp) :: coeff(N_CTRL) - real(dp) :: r(N_DATA) - real(dp) :: y(N_DATA) - real(dp) :: g(N_CTRL) - real(dp) :: lhs, rhs, rel_err, denom - integer :: i - - print *, "Testing neo_bspline 1D adjoint consistency" - - call bspline_1d_init_uniform(spl, DEGREE, N_CTRL, X_MIN, X_MAX) - call linspace(X_MIN, X_MAX, N_DATA, x_data) - - do i = 1, N_CTRL - coeff(i) = sin(0.37d0*real(i, dp)) - end do - do i = 1, N_DATA - r(i) = cos(0.53d0*real(i, dp)) - end do - - call apply_A(spl, x_data, coeff, y) - call apply_AT(spl, x_data, r, g) - - lhs = sum(y*r) - rhs = sum(coeff*g) - denom = max(abs(lhs), abs(rhs), 1.0d0) - rel_err = abs(lhs - rhs)/denom - - print *, " 1D adjoint rel error =", rel_err - - if (rel_err > 1.0d-12) then - error stop "neo_bspline 1D adjoint inconsistency" - end if - - end subroutine test_bspline_1d_adjoint - - subroutine test_bspline_1d_lsq_cos() type(bspline_1d) :: spl integer, parameter :: DEGREE = 5 @@ -155,7 +111,7 @@ subroutine test_bspline_1d_lsq_batch() integer, parameter :: N_RHS = 2 real(dp) :: x_data(N_DATA) - real(dp) :: f_data(N_DATA, N_RHS) + real(dp) :: f_data(N_DATA) real(dp) :: coeff(N_CTRL, N_RHS) real(dp) :: x_plot(N_PLOT) real(dp) :: f_true(N_PLOT, N_RHS) @@ -168,24 +124,29 @@ subroutine test_bspline_1d_lsq_batch() call bspline_1d_init_uniform(spl, DEGREE, N_CTRL, X_MIN, X_MAX) do i = 1, N_DATA - x_data(i) = X_MIN + (X_MAX - X_MIN) * real(i, dp) / real(N_DATA + 1, dp) - x_data(i) = x_data(i) + 0.1d0 * sin(3.0d0*real(i, dp)) + x_data(i) = X_MIN + (X_MAX - X_MIN)*real(i, dp)/real(N_DATA + 1, dp) + x_data(i) = x_data(i) + 0.1d0*sin(3.0d0*real(i, dp)) if (x_data(i) < X_MIN) x_data(i) = X_MIN if (x_data(i) > X_MAX) x_data(i) = X_MAX - - f_data(i, 1) = cos(2.0d0*x_data(i)) + 0.5d0*sin(3.0d0*x_data(i)) - f_data(i, 2) = sin(1.5d0*x_data(i)) + 0.3d0*cos(4.0d0*x_data(i)) end do - coeff = 0.0_dp - call bspline_1d_lsq_cgls_batch(spl, x_data, f_data, coeff, & - max_iter=400, tol=1.0d-10) + do k = 1, N_RHS + do i = 1, N_DATA + if (k == 1) then + f_data(i) = cos(2.0d0*x_data(i)) + 0.5d0*sin(3.0d0*x_data(i)) + else + f_data(i) = sin(1.5d0*x_data(i)) + 0.3d0*cos(4.0d0*x_data(i)) + end if + end do + coeff(:, k) = 0.0_dp + call bspline_1d_lsq_cgls(spl, x_data, f_data, coeff(:, k), & + max_iter=400, tol=1.0d-10) + end do call linspace(X_MIN, X_MAX, N_PLOT, x_plot) do i = 1, N_PLOT f_true(i, 1) = cos(2.0d0*x_plot(i)) + 0.5d0*sin(3.0d0*x_plot(i)) f_true(i, 2) = sin(1.5d0*x_plot(i)) + 0.3d0*cos(4.0d0*x_plot(i)) - do k = 1, N_RHS call bspline_1d_eval(spl, coeff(:, k), x_plot(i), f_fit(i, k)) end do diff --git a/test/source/test_neo_bspline_2d.f90 b/test/source/test_neo_bspline_2d.f90 index 2fb38759..a44c858f 100644 --- a/test/source/test_neo_bspline_2d.f90 +++ b/test/source/test_neo_bspline_2d.f90 @@ -1,7 +1,7 @@ program test_neo_bspline_2d - use libneo_kinds, only : dp + use libneo_kinds, only: dp use math_constants - use libneo_util, only : linspace + use libneo_util, only: linspace use neo_bspline implicit none @@ -9,74 +9,12 @@ program test_neo_bspline_2d real(dp), parameter :: X_MIN = 1.23d0 real(dp), parameter :: X_MAX = TWOPI + 1.23d0 real(dp), parameter :: TOL_L2_FULL = 5.0d-4 - real(dp), parameter :: TOL_MAX_CIRC = 1.0d-3 - call test_bspline_2d_adjoint() call test_bspline_2d_lsq_full_grid() - call test_bspline_2d_lsq_circle() call test_bspline_2d_lsq_full_grid_batch() contains - subroutine test_bspline_2d_adjoint() - type(bspline_2d) :: spl - integer, parameter :: DEGREE(2) = [3, 3] - integer, parameter :: N_CTRL(2) = [16, 14] - integer, parameter :: N_GRID1 = 24 - integer, parameter :: N_GRID2 = 20 - - real(dp) :: x1(N_GRID1), x2(N_GRID2) - real(dp) :: x_data(N_GRID1*N_GRID2) - real(dp) :: y_data(N_GRID1*N_GRID2) - real(dp) :: coeff(N_CTRL(1), N_CTRL(2)) - real(dp) :: r(N_GRID1*N_GRID2) - real(dp) :: f(N_GRID1*N_GRID2) - real(dp) :: g(N_CTRL(1), N_CTRL(2)) - real(dp) :: lhs, rhs, rel_err, denom - integer :: i1, i2, idx - - print *, "Testing neo_bspline 2D adjoint consistency" - - call bspline_2d_init_uniform(spl, DEGREE, N_CTRL, [X_MIN, X_MIN], & - [X_MAX, X_MAX]) - - call linspace(X_MIN, X_MAX, N_GRID1, x1) - call linspace(X_MIN, X_MAX, N_GRID2, x2) - - idx = 0 - do i2 = 1, N_GRID2 - do i1 = 1, N_GRID1 - idx = idx + 1 - x_data(idx) = x1(i1) - y_data(idx) = x2(i2) - r(idx) = cos(0.37d0*x1(i1))*sin(0.41d0*x2(i2)) - end do - end do - - ! Populate coeff deterministically - do i2 = 1, N_CTRL(2) - do i1 = 1, N_CTRL(1) - coeff(i1, i2) = sin(0.11d0*real(i1, dp)) + cos(0.07d0*real(i2, dp)) - end do - end do - - call apply_A2D(spl, x_data, y_data, coeff, f) - call apply_A2D_T(spl, x_data, y_data, r, g) - - lhs = sum(f*r) - rhs = sum(coeff*g) - denom = max(abs(lhs), abs(rhs), 1.0d0) - rel_err = abs(lhs - rhs)/denom - - print *, " 2D adjoint rel error =", rel_err - - if (rel_err > 1.0d-12) then - error stop "neo_bspline 2D adjoint inconsistency" - end if - - end subroutine test_bspline_2d_adjoint - - subroutine test_bspline_2d_lsq_full_grid() type(bspline_2d) :: spl integer, parameter :: DEGREE(2) = [3, 3] @@ -85,13 +23,10 @@ subroutine test_bspline_2d_lsq_full_grid() integer, parameter :: N_GRID2 = 36 real(dp) :: x1(N_GRID1), x2(N_GRID2) - real(dp) :: x_data(N_GRID1*N_GRID2) - real(dp) :: y_data(N_GRID1*N_GRID2) - real(dp) :: f_data(N_GRID1*N_GRID2) + real(dp) :: f_grid(N_GRID1, N_GRID2) real(dp) :: coeff(N_CTRL(1), N_CTRL(2)) - integer :: i1, i2, idx - integer :: i + integer :: i1, i2 real(dp) :: x(2), f_true, f_fit real(dp) :: err2 @@ -103,26 +38,21 @@ subroutine test_bspline_2d_lsq_full_grid() call linspace(X_MIN, X_MAX, N_GRID1, x1) call linspace(X_MIN, X_MAX, N_GRID2, x2) - idx = 0 do i2 = 1, N_GRID2 do i1 = 1, N_GRID1 - idx = idx + 1 - x_data(idx) = x1(i1) - y_data(idx) = x2(i2) - f_data(idx) = cos(x1(i1))*cos(2.0d0*x2(i2)) + f_grid(i1, i2) = cos(x1(i1))*cos(2.0d0*x2(i2)) end do end do coeff = 0.0_dp - call bspline_2d_lsq_cgls(spl, x_data, y_data, f_data, coeff, & + call bspline_2d_lsq_cgls(spl, x1, x2, f_grid, coeff, & max_iter=800, tol=1.0d-10) err2 = 0.0d0 - idx = 0 - open(unit=20, file="bspline_2d_lsq_grid.dat", status="replace", action="write") + open(unit=20, file="bspline_2d_lsq_grid.dat", status="replace", & + action="write") do i2 = 1, N_GRID2 do i1 = 1, N_GRID1 - idx = idx + 1 x(1) = x1(i1) x(2) = x2(i2) f_true = cos(x(1))*cos(2.0d0*x(2)) @@ -143,83 +73,6 @@ subroutine test_bspline_2d_lsq_full_grid() end subroutine test_bspline_2d_lsq_full_grid - subroutine test_bspline_2d_lsq_circle() - type(bspline_2d) :: spl - integer, parameter :: DEGREE(2) = [3, 3] - integer, parameter :: N_CTRL(2) = [32, 28] - integer, parameter :: N_GRID1 = 40 - integer, parameter :: N_GRID2 = 36 - integer, parameter :: MAX_DATA = N_GRID1*N_GRID2 - - real(dp) :: x1(N_GRID1), x2(N_GRID2) - real(dp) :: x_data(MAX_DATA), y_data(MAX_DATA), f_data(MAX_DATA) - real(dp) :: coeff(N_CTRL(1), N_CTRL(2)) - - real(dp) :: xc, yc, r0, dx, dy - real(dp) :: theta, r_eval - real(dp) :: x(2), f_true, f_fit - real(dp) :: max_err - integer :: i1, i2, ndata, i - - print *, "Testing neo_bspline 2D LSQ CGLS (circular mask)" - - call bspline_2d_init_uniform(spl, DEGREE, N_CTRL, [X_MIN, X_MIN], & - [X_MAX, X_MAX]) - - call linspace(X_MIN, X_MAX, N_GRID1, x1) - call linspace(X_MIN, X_MAX, N_GRID2, x2) - - xc = 0.5d0*(X_MIN + X_MAX) - yc = 0.5d0*(X_MIN + X_MAX) - r0 = 0.45d0*(X_MAX - X_MIN) - - ndata = 0 - do i2 = 1, N_GRID2 - do i1 = 1, N_GRID1 - dx = x1(i1) - xc - dy = x2(i2) - yc - if (dx*dx + dy*dy <= r0*r0) then - ndata = ndata + 1 - x_data(ndata) = x1(i1) - y_data(ndata) = x2(i2) - f_data(ndata) = cos(x1(i1))*cos(2.0d0*x2(i2)) - end if - end do - end do - - if (ndata < 100) then - error stop "neo_bspline 2D LSQ circle: too few data points" - end if - - coeff = 0.0_dp - call bspline_2d_lsq_cgls(spl, x_data(1:ndata), y_data(1:ndata), & - f_data(1:ndata), coeff, max_iter=800, tol=1.0d-10) - - max_err = 0.0d0 - r_eval = 0.4d0*(X_MAX - X_MIN) - - open(unit=21, file="bspline_2d_lsq_circle.dat", status="replace", & - action="write") - do i = 1, 64 - theta = TWOPI*real(i, dp)/64.0d0 - x(1) = xc + r_eval*cos(theta) - x(2) = yc + r_eval*sin(theta) - f_true = cos(x(1))*cos(2.0d0*x(2)) - call bspline_2d_eval(spl, coeff, x, f_fit) - max_err = max(max_err, abs(f_fit - f_true)) - write(21,'(5es24.16)') theta, x(1), x(2), f_true, f_fit - end do - close(21) - - print *, " 2D LSQ circle: max error =", max_err - - if (max_err > TOL_MAX_CIRC) then - error stop "neo_bspline 2D LSQ circle error too large" - end if - - end subroutine test_bspline_2d_lsq_circle - - subroutine test_bspline_2d_lsq_full_grid_batch() type(bspline_2d) :: spl integer, parameter :: DEGREE(2) = [3, 3] @@ -229,14 +82,12 @@ subroutine test_bspline_2d_lsq_full_grid_batch() integer, parameter :: N_RHS = 2 real(dp) :: x1(N_GRID1), x2(N_GRID2) - real(dp) :: x_data(N_GRID1*N_GRID2) - real(dp) :: y_data(N_GRID1*N_GRID2) - real(dp) :: f_data(N_GRID1*N_GRID2, N_RHS) + real(dp) :: f_grid(N_GRID1, N_GRID2) real(dp) :: coeff(N_CTRL(1), N_CTRL(2), N_RHS) real(dp) :: x(2), f_true(N_RHS), f_fit real(dp) :: err2(N_RHS) - integer :: i1, i2, idx, k + integer :: i1, i2, k print *, "Testing neo_bspline 2D LSQ CGLS (full grid, batched)" @@ -246,26 +97,24 @@ subroutine test_bspline_2d_lsq_full_grid_batch() call linspace(X_MIN, X_MAX, N_GRID1, x1) call linspace(X_MIN, X_MAX, N_GRID2, x2) - idx = 0 - do i2 = 1, N_GRID2 - do i1 = 1, N_GRID1 - idx = idx + 1 - x_data(idx) = x1(i1) - y_data(idx) = x2(i2) - f_data(idx, 1) = cos(x1(i1))*cos(2.0d0*x2(i2)) - f_data(idx, 2) = sin(x1(i1))*cos(3.0d0*x2(i2)) + do k = 1, N_RHS + do i2 = 1, N_GRID2 + do i1 = 1, N_GRID1 + if (k == 1) then + f_grid(i1, i2) = cos(x1(i1))*cos(2.0d0*x2(i2)) + else + f_grid(i1, i2) = sin(x1(i1))*cos(3.0d0*x2(i2)) + end if + end do end do + coeff(:, :, k) = 0.0_dp + call bspline_2d_lsq_cgls(spl, x1, x2, f_grid, coeff(:, :, k), & + max_iter=800, tol=1.0d-10) end do - coeff = 0.0_dp - call bspline_2d_lsq_cgls_batch(spl, x_data, y_data, f_data, coeff, & - max_iter=800, tol=1.0d-10) - err2 = 0.0d0 - idx = 0 do i2 = 1, N_GRID2 do i1 = 1, N_GRID1 - idx = idx + 1 x(1) = x1(i1) x(2) = x2(i2) f_true(1) = cos(x(1))*cos(2.0d0*x(2)) diff --git a/test/source/test_neo_bspline_3d.f90 b/test/source/test_neo_bspline_3d.f90 index fb34dcf8..f38b4d25 100644 --- a/test/source/test_neo_bspline_3d.f90 +++ b/test/source/test_neo_bspline_3d.f90 @@ -1,8 +1,8 @@ program test_neo_bspline_3d - use libneo_kinds, only : dp + use libneo_kinds, only: dp use math_constants - use libneo_util, only : linspace - use neo_bspline_3d + use libneo_util, only: linspace + use neo_bspline implicit none @@ -24,15 +24,12 @@ subroutine test_bspline_3d_lsq_full_grid() integer, parameter :: N_GRID3 = 14 real(dp) :: x1(N_GRID1), x2(N_GRID2), x3(N_GRID3) - real(dp) :: x_data(N_GRID1*N_GRID2*N_GRID3) - real(dp) :: y_data(N_GRID1*N_GRID2*N_GRID3) - real(dp) :: z_data(N_GRID1*N_GRID2*N_GRID3) - real(dp) :: f_data(N_GRID1*N_GRID2*N_GRID3) + real(dp) :: f_grid(N_GRID1, N_GRID2, N_GRID3) real(dp) :: coeff(N_CTRL(1), N_CTRL(2), N_CTRL(3)) real(dp) :: x(3), f_true, f_fit real(dp) :: err2 - integer :: i1, i2, i3, idx + integer :: i1, i2, i3 print *, "Testing neo_bspline 3D LSQ CGLS (full grid)" @@ -43,31 +40,25 @@ subroutine test_bspline_3d_lsq_full_grid() call linspace(X_MIN, X_MAX, N_GRID2, x2) call linspace(X_MIN, X_MAX, N_GRID3, x3) - idx = 0 do i3 = 1, N_GRID3 do i2 = 1, N_GRID2 do i1 = 1, N_GRID1 - idx = idx + 1 - x_data(idx) = x1(i1) - y_data(idx) = x2(i2) - z_data(idx) = x3(i3) - f_data(idx) = cos(x1(i1))*cos(2.0d0*x2(i2))*cos(3.0d0*x3(i3)) + f_grid(i1, i2, i3) = cos(x1(i1))*cos(2.0d0*x2(i2)) & + *cos(3.0d0*x3(i3)) end do end do end do coeff = 0.0_dp - call bspline_3d_lsq_cgls(spl, x_data, y_data, z_data, f_data, coeff, & + call bspline_3d_lsq_cgls(spl, x1, x2, x3, f_grid, coeff, & max_iter=800, tol=1.0d-10) err2 = 0.0d0 - idx = 0 open(unit=30, file="bspline_3d_lsq_grid.dat", status="replace", & action="write") do i3 = 1, N_GRID3 do i2 = 1, N_GRID2 do i1 = 1, N_GRID1 - idx = idx + 1 x(1) = x1(i1) x(2) = x2(i2) x(3) = x3(i3) @@ -99,15 +90,12 @@ subroutine test_bspline_3d_lsq_batch() integer, parameter :: N_RHS = 2 real(dp) :: x1(N_GRID1), x2(N_GRID2), x3(N_GRID3) - real(dp) :: x_data(N_GRID1*N_GRID2*N_GRID3) - real(dp) :: y_data(N_GRID1*N_GRID2*N_GRID3) - real(dp) :: z_data(N_GRID1*N_GRID2*N_GRID3) - real(dp) :: f_data(N_GRID1*N_GRID2*N_GRID3, N_RHS) + real(dp) :: f_grid(N_GRID1, N_GRID2, N_GRID3) real(dp) :: coeff(N_CTRL(1), N_CTRL(2), N_CTRL(3), N_RHS) real(dp) :: x(3), f_true(N_RHS), f_fit real(dp) :: err2(N_RHS) - integer :: i1, i2, i3, idx, k + integer :: i1, i2, i3, k print *, "Testing neo_bspline 3D LSQ CGLS (batched)" @@ -118,30 +106,29 @@ subroutine test_bspline_3d_lsq_batch() call linspace(X_MIN, X_MAX, N_GRID2, x2) call linspace(X_MIN, X_MAX, N_GRID3, x3) - idx = 0 - do i3 = 1, N_GRID3 - do i2 = 1, N_GRID2 - do i1 = 1, N_GRID1 - idx = idx + 1 - x_data(idx) = x1(i1) - y_data(idx) = x2(i2) - z_data(idx) = x3(i3) - f_data(idx, 1) = cos(x1(i1))*cos(2.0d0*x2(i2))*cos(3.0d0*x3(i3)) - f_data(idx, 2) = sin(x1(i1))*cos(2.0d0*x2(i2))*cos(1.5d0*x3(i3)) + do k = 1, N_RHS + do i3 = 1, N_GRID3 + do i2 = 1, N_GRID2 + do i1 = 1, N_GRID1 + if (k == 1) then + f_grid(i1, i2, i3) = cos(x1(i1))*cos(2.0d0*x2(i2)) & + *cos(3.0d0*x3(i3)) + else + f_grid(i1, i2, i3) = sin(x1(i1))*cos(2.0d0*x2(i2)) & + *cos(1.5d0*x3(i3)) + end if + end do end do end do + coeff(:, :, :, k) = 0.0_dp + call bspline_3d_lsq_cgls(spl, x1, x2, x3, f_grid, & + coeff(:, :, :, k), max_iter=800, tol=1.0d-10) end do - coeff = 0.0_dp - call bspline_3d_lsq_cgls_batch(spl, x_data, y_data, z_data, f_data, coeff, & - max_iter=800, tol=1.0d-10) - err2 = 0.0d0 - idx = 0 do i3 = 1, N_GRID3 do i2 = 1, N_GRID2 do i1 = 1, N_GRID1 - idx = idx + 1 x(1) = x1(i1) x(2) = x2(i2) x(3) = x3(i3) From dd7a87391a869d113da5096e4d10be8baf15da29 Mon Sep 17 00:00:00 2001 From: Christopher Albert Date: Tue, 2 Dec 2025 10:20:24 +0100 Subject: [PATCH 10/15] Split neo_bspline into base/interp/lsq submodules and add direct interpolation Reorganize the B-spline code into clean, single-responsibility modules: - neo_bspline_base: core types, initialization, evaluation, basis functions - neo_bspline_interp: direct interpolation via LAPACK collocation solve - neo_bspline_lsq: least-squares fitting via matrix-free CGLS The direct interpolation variant solves A*c = f where A_ij = B_j(x_i), using separable tensor-product structure in 2D/3D to reduce dense solve to dimension-by-dimension LU factorizations. OpenMP parallelizes the back-substitution loops in 3D. Benchmarks updated to compare all three methods: interpolate module, neo_bspline LSQ, and neo_bspline direct. Large grid sizes skip direct interpolation (O(n^3) scaling) to avoid timeouts. --- src/interpolate/CMakeLists.txt | 3 + src/interpolate/neo_bspline.f90 | 717 +----------------- src/interpolate/neo_bspline_base.f90 | 213 ++++++ src/interpolate/neo_bspline_interp.f90 | 206 +++++ src/interpolate/neo_bspline_lsq.f90 | 516 +++++++++++++ .../bench_neo_bspline_vs_interpolate.f90 | 214 ++++-- 6 files changed, 1094 insertions(+), 775 deletions(-) create mode 100644 src/interpolate/neo_bspline_base.f90 create mode 100644 src/interpolate/neo_bspline_interp.f90 create mode 100644 src/interpolate/neo_bspline_lsq.f90 diff --git a/src/interpolate/CMakeLists.txt b/src/interpolate/CMakeLists.txt index b007e73c..9c8eefc1 100644 --- a/src/interpolate/CMakeLists.txt +++ b/src/interpolate/CMakeLists.txt @@ -1,6 +1,9 @@ add_library(interpolate STATIC ../spl_three_to_five.f90 acc_spline_build_order5.f90 + neo_bspline_base.f90 + neo_bspline_interp.f90 + neo_bspline_lsq.f90 neo_bspline.f90 batch_interpolate_types.f90 batch_interpolate_1d.f90 diff --git a/src/interpolate/neo_bspline.f90 b/src/interpolate/neo_bspline.f90 index a8af84c7..5263f5a3 100644 --- a/src/interpolate/neo_bspline.f90 +++ b/src/interpolate/neo_bspline.f90 @@ -1,712 +1,11 @@ module neo_bspline - !! High-performance B-spline module for 1D/2D/3D tensor-product splines. - !! Optimized for regular grids with OpenMP SIMD and parallel construction. - use, intrinsic :: iso_fortran_env, only: dp => real64 + !! Umbrella module for B-spline functionality. + !! Re-exports types and procedures from submodules: + !! - neo_bspline_base: Core types, init, eval, basis functions + !! - neo_bspline_interp: Direct interpolation (collocation solve) + !! - neo_bspline_lsq: Least-squares fitting (CGLS solver) + use neo_bspline_base + use neo_bspline_interp + use neo_bspline_lsq implicit none - private - - type :: bspline_1d - integer :: degree - integer :: n_ctrl - real(dp), allocatable :: knots(:) - real(dp) :: x_min, x_max - end type bspline_1d - - type :: bspline_2d - type(bspline_1d) :: sx, sy - end type bspline_2d - - type :: bspline_3d - type(bspline_1d) :: sx, sy, sz - end type bspline_3d - - type :: grid_cache_1d - integer :: ng1, px - integer, allocatable :: span1(:) - real(dp), allocatable :: B1(:,:) - end type grid_cache_1d - - type :: grid_cache_2d - integer :: ng1, ng2, px, py - integer, allocatable :: span1(:), span2(:) - real(dp), allocatable :: B1(:,:), B2(:,:) - end type grid_cache_2d - - type :: grid_cache_3d - integer :: ng1, ng2, ng3, px, py, pz - integer, allocatable :: span1(:), span2(:), span3(:) - real(dp), allocatable :: B1(:,:), B2(:,:), B3(:,:) - end type grid_cache_3d - - public :: bspline_1d, bspline_2d, bspline_3d - public :: bspline_1d_init_uniform, bspline_2d_init_uniform, bspline_3d_init_uniform - public :: bspline_1d_eval, bspline_2d_eval, bspline_3d_eval - public :: bspline_1d_lsq_cgls, bspline_2d_lsq_cgls, bspline_3d_lsq_cgls - public :: find_span, basis_funs - -contains - - subroutine bspline_1d_init_uniform(spl, degree, n_ctrl, x_min, x_max) - type(bspline_1d), intent(out) :: spl - integer, intent(in) :: degree, n_ctrl - real(dp), intent(in) :: x_min, x_max - integer :: p, n, m, i - real(dp) :: h - - p = degree - n = n_ctrl - m = n + p + 1 - spl%degree = p - spl%n_ctrl = n - spl%x_min = x_min - spl%x_max = x_max - allocate(spl%knots(m)) - h = (x_max - x_min)/real(n - p, dp) - do i = 1, m - if (i <= p + 1) then - spl%knots(i) = x_min - else if (i >= m - p) then - spl%knots(i) = x_max - else - spl%knots(i) = x_min + real(i - (p + 1), dp)*h - end if - end do - end subroutine bspline_1d_init_uniform - - - subroutine bspline_2d_init_uniform(spl, degree, n_ctrl, x_min, x_max) - type(bspline_2d), intent(out) :: spl - integer, intent(in) :: degree(2), n_ctrl(2) - real(dp), intent(in) :: x_min(2), x_max(2) - - call bspline_1d_init_uniform(spl%sx, degree(1), n_ctrl(1), x_min(1), x_max(1)) - call bspline_1d_init_uniform(spl%sy, degree(2), n_ctrl(2), x_min(2), x_max(2)) - end subroutine bspline_2d_init_uniform - - - subroutine bspline_3d_init_uniform(spl, degree, n_ctrl, x_min, x_max) - type(bspline_3d), intent(out) :: spl - integer, intent(in) :: degree(3), n_ctrl(3) - real(dp), intent(in) :: x_min(3), x_max(3) - - call bspline_1d_init_uniform(spl%sx, degree(1), n_ctrl(1), x_min(1), x_max(1)) - call bspline_1d_init_uniform(spl%sy, degree(2), n_ctrl(2), x_min(2), x_max(2)) - call bspline_1d_init_uniform(spl%sz, degree(3), n_ctrl(3), x_min(3), x_max(3)) - end subroutine bspline_3d_init_uniform - - - subroutine find_span(spl, x, span) - type(bspline_1d), intent(in) :: spl - real(dp), intent(in) :: x - integer, intent(out) :: span - integer :: low, high, mid, p, n, m - real(dp) :: xx - - p = spl%degree - n = spl%n_ctrl - m = n + p + 1 - xx = min(max(x, spl%x_min), spl%x_max) - if (xx >= spl%knots(m - p)) then - span = n - return - end if - low = p + 1 - high = n + 1 - do - mid = (low + high)/2 - if (xx < spl%knots(mid)) then - high = mid - else if (xx >= spl%knots(mid + 1)) then - low = mid - else - span = mid - exit - end if - end do - end subroutine find_span - - - subroutine basis_funs(spl, span, x, N) - type(bspline_1d), intent(in) :: spl - integer, intent(in) :: span - real(dp), intent(in) :: x - real(dp), intent(out) :: N(0:) - integer :: p, j, r - real(dp) :: left(0:spl%degree), right(0:spl%degree), saved, temp - - p = spl%degree - N(0) = 1.0_dp - do j = 1, p - left(j) = x - spl%knots(span + 1 - j) - right(j) = spl%knots(span + j) - x - saved = 0.0_dp - do r = 0, j - 1 - temp = N(r)/(right(r + 1) + left(j - r)) - N(r) = saved + right(r + 1)*temp - saved = left(j - r)*temp - end do - N(j) = saved - end do - end subroutine basis_funs - - - subroutine bspline_1d_eval(spl, coeff, x, y) - type(bspline_1d), intent(in) :: spl - real(dp), intent(in) :: coeff(:) - real(dp), intent(in) :: x - real(dp), intent(out) :: y - integer :: span, j, p - real(dp) :: N(0:spl%degree) - - p = spl%degree - call find_span(spl, x, span) - call basis_funs(spl, span, x, N) - y = 0.0_dp - !$omp simd reduction(+:y) - do j = 0, p - y = y + N(j)*coeff(span - p + j) - end do - end subroutine bspline_1d_eval - - - subroutine bspline_2d_eval(spl, coeff, x, y) - type(bspline_2d), intent(in) :: spl - real(dp), intent(in) :: coeff(:,:) - real(dp), intent(in) :: x(2) - real(dp), intent(out) :: y - integer :: spanx, spany, px, py, a, b, ix, iy - real(dp) :: Nx(0:spl%sx%degree), Ny(0:spl%sy%degree) - - px = spl%sx%degree - py = spl%sy%degree - call find_span(spl%sx, x(1), spanx) - call basis_funs(spl%sx, spanx, x(1), Nx) - call find_span(spl%sy, x(2), spany) - call basis_funs(spl%sy, spany, x(2), Ny) - y = 0.0_dp - do a = 0, px - ix = spanx - px + a - do b = 0, py - iy = spany - py + b - y = y + Nx(a)*Ny(b)*coeff(ix, iy) - end do - end do - end subroutine bspline_2d_eval - - - subroutine bspline_3d_eval(spl, coeff, x, y) - type(bspline_3d), intent(in) :: spl - real(dp), intent(in) :: coeff(:,:,:) - real(dp), intent(in) :: x(3) - real(dp), intent(out) :: y - integer :: spanx, spany, spanz, px, py, pz, a, b, c, ix, iy, iz - real(dp) :: Nx(0:spl%sx%degree), Ny(0:spl%sy%degree), Nz(0:spl%sz%degree) - - px = spl%sx%degree - py = spl%sy%degree - pz = spl%sz%degree - call find_span(spl%sx, x(1), spanx) - call basis_funs(spl%sx, spanx, x(1), Nx) - call find_span(spl%sy, x(2), spany) - call basis_funs(spl%sy, spany, x(2), Ny) - call find_span(spl%sz, x(3), spanz) - call basis_funs(spl%sz, spanz, x(3), Nz) - y = 0.0_dp - do a = 0, px - ix = spanx - px + a - do b = 0, py - iy = spany - py + b - do c = 0, pz - iz = spanz - pz + c - y = y + Nx(a)*Ny(b)*Nz(c)*coeff(ix, iy, iz) - end do - end do - end do - end subroutine bspline_3d_eval - - - subroutine precompute_grid_1d(spl, x1, cache) - type(bspline_1d), intent(in) :: spl - real(dp), intent(in) :: x1(:) - type(grid_cache_1d), intent(out) :: cache - integer :: i, n1, px - - n1 = size(x1) - px = spl%degree - cache%ng1 = n1 - cache%px = px - allocate(cache%span1(n1), cache%B1(0:px, n1)) - - !$omp parallel do simd private(i) schedule(simd:static) - do i = 1, n1 - call find_span(spl, x1(i), cache%span1(i)) - end do - - !$omp parallel do private(i) schedule(static) - do i = 1, n1 - call basis_funs(spl, cache%span1(i), x1(i), cache%B1(:, i)) - end do - end subroutine precompute_grid_1d - - - subroutine precompute_grid_2d(spl, x1, x2, cache) - type(bspline_2d), intent(in) :: spl - real(dp), intent(in) :: x1(:), x2(:) - type(grid_cache_2d), intent(out) :: cache - integer :: i, n1, n2, px, py - - n1 = size(x1) - n2 = size(x2) - px = spl%sx%degree - py = spl%sy%degree - cache%ng1 = n1 - cache%ng2 = n2 - cache%px = px - cache%py = py - allocate(cache%span1(n1), cache%span2(n2)) - allocate(cache%B1(0:px, n1), cache%B2(0:py, n2)) - - !$omp parallel do simd private(i) schedule(simd:static) - do i = 1, n1 - call find_span(spl%sx, x1(i), cache%span1(i)) - end do - !$omp parallel do private(i) schedule(static) - do i = 1, n1 - call basis_funs(spl%sx, cache%span1(i), x1(i), cache%B1(:, i)) - end do - - !$omp parallel do simd private(i) schedule(simd:static) - do i = 1, n2 - call find_span(spl%sy, x2(i), cache%span2(i)) - end do - !$omp parallel do private(i) schedule(static) - do i = 1, n2 - call basis_funs(spl%sy, cache%span2(i), x2(i), cache%B2(:, i)) - end do - end subroutine precompute_grid_2d - - - subroutine precompute_grid_3d(spl, x1, x2, x3, cache) - type(bspline_3d), intent(in) :: spl - real(dp), intent(in) :: x1(:), x2(:), x3(:) - type(grid_cache_3d), intent(out) :: cache - integer :: i, n1, n2, n3, px, py, pz - - n1 = size(x1) - n2 = size(x2) - n3 = size(x3) - px = spl%sx%degree - py = spl%sy%degree - pz = spl%sz%degree - cache%ng1 = n1 - cache%ng2 = n2 - cache%ng3 = n3 - cache%px = px - cache%py = py - cache%pz = pz - allocate(cache%span1(n1), cache%span2(n2), cache%span3(n3)) - allocate(cache%B1(0:px, n1), cache%B2(0:py, n2), cache%B3(0:pz, n3)) - - !$omp parallel do simd private(i) schedule(simd:static) - do i = 1, n1 - call find_span(spl%sx, x1(i), cache%span1(i)) - end do - !$omp parallel do private(i) schedule(static) - do i = 1, n1 - call basis_funs(spl%sx, cache%span1(i), x1(i), cache%B1(:, i)) - end do - - !$omp parallel do simd private(i) schedule(simd:static) - do i = 1, n2 - call find_span(spl%sy, x2(i), cache%span2(i)) - end do - !$omp parallel do private(i) schedule(static) - do i = 1, n2 - call basis_funs(spl%sy, cache%span2(i), x2(i), cache%B2(:, i)) - end do - - !$omp parallel do simd private(i) schedule(simd:static) - do i = 1, n3 - call find_span(spl%sz, x3(i), cache%span3(i)) - end do - !$omp parallel do private(i) schedule(static) - do i = 1, n3 - call basis_funs(spl%sz, cache%span3(i), x3(i), cache%B3(:, i)) - end do - end subroutine precompute_grid_3d - - - subroutine apply_A_1d_grid(cache, coeff, f) - type(grid_cache_1d), intent(in) :: cache - real(dp), intent(in) :: coeff(:) - real(dp), intent(out) :: f(:) - integer :: i, a, ix, n1, px, s1 - - n1 = cache%ng1 - px = cache%px - !$omp parallel do simd private(i, a, ix, s1) schedule(simd:static) - do i = 1, n1 - s1 = cache%span1(i) - f(i) = 0.0_dp - do a = 0, px - ix = s1 - px + a - f(i) = f(i) + cache%B1(a, i)*coeff(ix) - end do - end do - end subroutine apply_A_1d_grid - - - subroutine apply_AT_1d_grid(cache, r, g, n_ctrl) - type(grid_cache_1d), intent(in) :: cache - real(dp), intent(in) :: r(:) - real(dp), intent(out) :: g(:) - integer, intent(in) :: n_ctrl - integer :: i, a, ix, n1, px, s1 - real(dp), allocatable :: g_local(:) - - n1 = cache%ng1 - px = cache%px - g = 0.0_dp - - !$omp parallel private(g_local, i, a, ix, s1) default(shared) - allocate(g_local(n_ctrl)) - g_local = 0.0_dp - !$omp do schedule(static) - do i = 1, n1 - s1 = cache%span1(i) - do a = 0, px - ix = s1 - px + a - g_local(ix) = g_local(ix) + cache%B1(a, i)*r(i) - end do - end do - !$omp end do - !$omp critical - g = g + g_local - !$omp end critical - deallocate(g_local) - !$omp end parallel - end subroutine apply_AT_1d_grid - - - subroutine apply_A_2d_grid(cache, coeff, f) - type(grid_cache_2d), intent(in) :: cache - real(dp), intent(in) :: coeff(:,:) - real(dp), intent(out) :: f(:,:) - integer :: i1, i2, a, b, ix, iy, n1, n2, px, py, s1, s2 - real(dp) :: val - - n1 = cache%ng1 - n2 = cache%ng2 - px = cache%px - py = cache%py - - !$omp parallel do collapse(2) private(i1, i2, a, b, ix, iy, s1, s2, val) & - !$omp& schedule(static) - do i2 = 1, n2 - do i1 = 1, n1 - s1 = cache%span1(i1) - s2 = cache%span2(i2) - val = 0.0_dp - do a = 0, px - ix = s1 - px + a - do b = 0, py - iy = s2 - py + b - val = val + cache%B1(a, i1)*cache%B2(b, i2)*coeff(ix, iy) - end do - end do - f(i1, i2) = val - end do - end do - end subroutine apply_A_2d_grid - - - subroutine apply_AT_2d_grid(cache, r, g, nx, ny) - type(grid_cache_2d), intent(in) :: cache - real(dp), intent(in) :: r(:,:) - real(dp), intent(out) :: g(:,:) - integer, intent(in) :: nx, ny - integer :: i1, i2, a, b, ix, iy, n1, n2, px, py, s1, s2 - real(dp), allocatable :: g_local(:,:) - - n1 = cache%ng1 - n2 = cache%ng2 - px = cache%px - py = cache%py - g = 0.0_dp - - !$omp parallel private(g_local, i1, i2, a, b, ix, iy, s1, s2) default(shared) - allocate(g_local(nx, ny)) - g_local = 0.0_dp - !$omp do collapse(2) schedule(static) - do i2 = 1, n2 - do i1 = 1, n1 - s1 = cache%span1(i1) - s2 = cache%span2(i2) - do a = 0, px - ix = s1 - px + a - do b = 0, py - iy = s2 - py + b - g_local(ix, iy) = g_local(ix, iy) + & - cache%B1(a, i1)*cache%B2(b, i2)*r(i1, i2) - end do - end do - end do - end do - !$omp end do - !$omp critical - g = g + g_local - !$omp end critical - deallocate(g_local) - !$omp end parallel - end subroutine apply_AT_2d_grid - - - subroutine apply_A_3d_grid(cache, coeff, f) - type(grid_cache_3d), intent(in) :: cache - real(dp), intent(in) :: coeff(:,:,:) - real(dp), intent(out) :: f(:,:,:) - integer :: i1, i2, i3, a, b, c, ix, iy, iz - integer :: n1, n2, n3, px, py, pz, s1, s2, s3 - real(dp) :: val, Nab - - n1 = cache%ng1 - n2 = cache%ng2 - n3 = cache%ng3 - px = cache%px - py = cache%py - pz = cache%pz - - !$omp parallel do collapse(3) & - !$omp& private(i1, i2, i3, a, b, c, ix, iy, iz, s1, s2, s3, val, Nab) & - !$omp& schedule(static) - do i3 = 1, n3 - do i2 = 1, n2 - do i1 = 1, n1 - s1 = cache%span1(i1) - s2 = cache%span2(i2) - s3 = cache%span3(i3) - val = 0.0_dp - do a = 0, px - ix = s1 - px + a - do b = 0, py - iy = s2 - py + b - Nab = cache%B1(a, i1)*cache%B2(b, i2) - !$omp simd reduction(+:val) - do c = 0, pz - iz = s3 - pz + c - val = val + Nab*cache%B3(c, i3)*coeff(ix, iy, iz) - end do - end do - end do - f(i1, i2, i3) = val - end do - end do - end do - end subroutine apply_A_3d_grid - - - subroutine apply_AT_3d_grid(cache, r, g, nx, ny, nz) - type(grid_cache_3d), intent(in) :: cache - real(dp), intent(in) :: r(:,:,:) - real(dp), intent(out) :: g(:,:,:) - integer, intent(in) :: nx, ny, nz - integer :: i1, i2, i3, a, b, c, ix, iy, iz - integer :: n1, n2, n3, px, py, pz, s1, s2, s3 - real(dp) :: ri, Nab - real(dp), allocatable :: g_local(:,:,:) - - n1 = cache%ng1 - n2 = cache%ng2 - n3 = cache%ng3 - px = cache%px - py = cache%py - pz = cache%pz - g = 0.0_dp - - !$omp parallel private(g_local, i1, i2, i3, a, b, c, ix, iy, iz, s1, s2, s3, ri, Nab) & - !$omp& default(shared) - allocate(g_local(nx, ny, nz)) - g_local = 0.0_dp - !$omp do collapse(3) schedule(static) - do i3 = 1, n3 - do i2 = 1, n2 - do i1 = 1, n1 - s1 = cache%span1(i1) - s2 = cache%span2(i2) - s3 = cache%span3(i3) - ri = r(i1, i2, i3) - do a = 0, px - ix = s1 - px + a - do b = 0, py - iy = s2 - py + b - Nab = cache%B1(a, i1)*cache%B2(b, i2)*ri - do c = 0, pz - iz = s3 - pz + c - g_local(ix, iy, iz) = g_local(ix, iy, iz) + & - Nab*cache%B3(c, i3) - end do - end do - end do - end do - end do - end do - !$omp end do - !$omp critical - g = g + g_local - !$omp end critical - deallocate(g_local) - !$omp end parallel - end subroutine apply_AT_3d_grid - - - subroutine bspline_1d_lsq_cgls(spl, x_data, f_data, coeff, max_iter, tol) - type(bspline_1d), intent(in) :: spl - real(dp), intent(in) :: x_data(:) - real(dp), intent(in) :: f_data(:) - real(dp), intent(inout) :: coeff(:) - integer, intent(in), optional :: max_iter - real(dp), intent(in), optional :: tol - - type(grid_cache_1d) :: cache - integer :: n_data, n_ctrl, k, kmax - real(dp) :: atol, gamma, gamma_new, alpha, beta, denom, rhs_norm - real(dp), allocatable :: r(:), q(:), s(:), p(:) - - n_data = size(x_data) - n_ctrl = spl%n_ctrl - kmax = 200 - atol = 1.0d-10 - if (present(max_iter)) kmax = max_iter - if (present(tol)) atol = tol - - call precompute_grid_1d(spl, x_data, cache) - - allocate(r(n_data), q(n_data), s(n_ctrl), p(n_ctrl)) - coeff = 0.0_dp - r = f_data - call apply_AT_1d_grid(cache, r, s, n_ctrl) - p = s - gamma = dot_product(s, s) - rhs_norm = sqrt(dot_product(f_data, f_data)) - if (rhs_norm == 0.0_dp) return - - do k = 1, kmax - call apply_A_1d_grid(cache, p, q) - denom = dot_product(q, q) - if (denom <= 0.0_dp) exit - alpha = gamma/denom - coeff = coeff + alpha*p - r = r - alpha*q - call apply_AT_1d_grid(cache, r, s, n_ctrl) - gamma_new = dot_product(s, s) - if (gamma_new <= (atol*rhs_norm)**2) exit - beta = gamma_new/gamma - gamma = gamma_new - p = s + beta*p - end do - end subroutine bspline_1d_lsq_cgls - - - subroutine bspline_2d_lsq_cgls(spl, x1, x2, f_grid, coeff, max_iter, tol) - type(bspline_2d), intent(in) :: spl - real(dp), intent(in) :: x1(:), x2(:) - real(dp), intent(in) :: f_grid(:,:) - real(dp), intent(inout) :: coeff(:,:) - integer, intent(in), optional :: max_iter - real(dp), intent(in), optional :: tol - - type(grid_cache_2d) :: cache - integer :: n1, n2, nx, ny, k, kmax - real(dp) :: atol, gamma, gamma_new, alpha, beta, denom, rhs_norm - real(dp), allocatable :: r(:,:), q(:,:), s(:,:), p(:,:) - - n1 = size(x1) - n2 = size(x2) - nx = spl%sx%n_ctrl - ny = spl%sy%n_ctrl - kmax = 400 - atol = 1.0d-10 - if (present(max_iter)) kmax = max_iter - if (present(tol)) atol = tol - - call precompute_grid_2d(spl, x1, x2, cache) - - allocate(r(n1, n2), q(n1, n2), s(nx, ny), p(nx, ny)) - coeff = 0.0_dp - r = f_grid - call apply_AT_2d_grid(cache, r, s, nx, ny) - p = s - gamma = sum(s*s) - rhs_norm = sqrt(sum(f_grid*f_grid)) - if (rhs_norm == 0.0_dp) return - - do k = 1, kmax - call apply_A_2d_grid(cache, p, q) - denom = sum(q*q) - if (denom <= 0.0_dp) exit - alpha = gamma/denom - coeff = coeff + alpha*p - r = r - alpha*q - call apply_AT_2d_grid(cache, r, s, nx, ny) - gamma_new = sum(s*s) - if (gamma_new <= (atol*rhs_norm)**2) exit - beta = gamma_new/gamma - gamma = gamma_new - p = s + beta*p - end do - end subroutine bspline_2d_lsq_cgls - - - subroutine bspline_3d_lsq_cgls(spl, x1, x2, x3, f_grid, coeff, max_iter, tol) - type(bspline_3d), intent(in) :: spl - real(dp), intent(in) :: x1(:), x2(:), x3(:) - real(dp), intent(in) :: f_grid(:,:,:) - real(dp), intent(inout) :: coeff(:,:,:) - integer, intent(in), optional :: max_iter - real(dp), intent(in), optional :: tol - - type(grid_cache_3d) :: cache - integer :: n1, n2, n3, nx, ny, nz, k, kmax - real(dp) :: atol, gamma, gamma_new, alpha, beta, denom, rhs_norm - real(dp), allocatable :: r(:,:,:), q(:,:,:), s(:,:,:), p(:,:,:) - - n1 = size(x1) - n2 = size(x2) - n3 = size(x3) - nx = spl%sx%n_ctrl - ny = spl%sy%n_ctrl - nz = spl%sz%n_ctrl - kmax = 400 - atol = 1.0d-10 - if (present(max_iter)) kmax = max_iter - if (present(tol)) atol = tol - - call precompute_grid_3d(spl, x1, x2, x3, cache) - - allocate(r(n1, n2, n3), q(n1, n2, n3), s(nx, ny, nz), p(nx, ny, nz)) - coeff = 0.0_dp - r = f_grid - call apply_AT_3d_grid(cache, r, s, nx, ny, nz) - p = s - gamma = sum(s*s) - rhs_norm = sqrt(sum(f_grid*f_grid)) - if (rhs_norm == 0.0_dp) return - - do k = 1, kmax - call apply_A_3d_grid(cache, p, q) - denom = sum(q*q) - if (denom <= 0.0_dp) exit - alpha = gamma/denom - coeff = coeff + alpha*p - r = r - alpha*q - call apply_AT_3d_grid(cache, r, s, nx, ny, nz) - gamma_new = sum(s*s) - if (gamma_new <= (atol*rhs_norm)**2) exit - beta = gamma_new/gamma - gamma = gamma_new - p = s + beta*p - end do - end subroutine bspline_3d_lsq_cgls - - end module neo_bspline diff --git a/src/interpolate/neo_bspline_base.f90 b/src/interpolate/neo_bspline_base.f90 new file mode 100644 index 00000000..02057c29 --- /dev/null +++ b/src/interpolate/neo_bspline_base.f90 @@ -0,0 +1,213 @@ +module neo_bspline_base + !! Core B-spline types and basis function evaluation. + !! No external dependencies beyond intrinsics. + use, intrinsic :: iso_fortran_env, only: dp => real64 + implicit none + private + + type, public :: bspline_1d + integer :: degree + integer :: n_ctrl + real(dp), allocatable :: knots(:) + real(dp) :: x_min, x_max + end type bspline_1d + + type, public :: bspline_2d + type(bspline_1d) :: sx, sy + end type bspline_2d + + type, public :: bspline_3d + type(bspline_1d) :: sx, sy, sz + end type bspline_3d + + public :: bspline_1d_init_uniform, bspline_2d_init_uniform, bspline_3d_init_uniform + public :: bspline_1d_eval, bspline_2d_eval, bspline_3d_eval + public :: find_span, basis_funs + +contains + + subroutine bspline_1d_init_uniform(spl, degree, n_ctrl, x_min, x_max) + type(bspline_1d), intent(out) :: spl + integer, intent(in) :: degree, n_ctrl + real(dp), intent(in) :: x_min, x_max + integer :: p, n, m, i + real(dp) :: h + + p = degree + n = n_ctrl + m = n + p + 1 + spl%degree = p + spl%n_ctrl = n + spl%x_min = x_min + spl%x_max = x_max + allocate(spl%knots(m)) + h = (x_max - x_min)/real(n - p, dp) + do i = 1, m + if (i <= p + 1) then + spl%knots(i) = x_min + else if (i >= m - p) then + spl%knots(i) = x_max + else + spl%knots(i) = x_min + real(i - (p + 1), dp)*h + end if + end do + end subroutine bspline_1d_init_uniform + + + subroutine bspline_2d_init_uniform(spl, degree, n_ctrl, x_min, x_max) + type(bspline_2d), intent(out) :: spl + integer, intent(in) :: degree(2), n_ctrl(2) + real(dp), intent(in) :: x_min(2), x_max(2) + + call bspline_1d_init_uniform(spl%sx, degree(1), n_ctrl(1), x_min(1), & + x_max(1)) + call bspline_1d_init_uniform(spl%sy, degree(2), n_ctrl(2), x_min(2), & + x_max(2)) + end subroutine bspline_2d_init_uniform + + + subroutine bspline_3d_init_uniform(spl, degree, n_ctrl, x_min, x_max) + type(bspline_3d), intent(out) :: spl + integer, intent(in) :: degree(3), n_ctrl(3) + real(dp), intent(in) :: x_min(3), x_max(3) + + call bspline_1d_init_uniform(spl%sx, degree(1), n_ctrl(1), x_min(1), & + x_max(1)) + call bspline_1d_init_uniform(spl%sy, degree(2), n_ctrl(2), x_min(2), & + x_max(2)) + call bspline_1d_init_uniform(spl%sz, degree(3), n_ctrl(3), x_min(3), & + x_max(3)) + end subroutine bspline_3d_init_uniform + + + subroutine find_span(spl, x, span) + type(bspline_1d), intent(in) :: spl + real(dp), intent(in) :: x + integer, intent(out) :: span + integer :: low, high, mid, p, n, m + real(dp) :: xx + + p = spl%degree + n = spl%n_ctrl + m = n + p + 1 + xx = min(max(x, spl%x_min), spl%x_max) + if (xx >= spl%knots(m - p)) then + span = n + return + end if + low = p + 1 + high = n + 1 + do + mid = (low + high)/2 + if (xx < spl%knots(mid)) then + high = mid + else if (xx >= spl%knots(mid + 1)) then + low = mid + else + span = mid + exit + end if + end do + end subroutine find_span + + + subroutine basis_funs(spl, span, x, N) + type(bspline_1d), intent(in) :: spl + integer, intent(in) :: span + real(dp), intent(in) :: x + real(dp), intent(out) :: N(0:) + integer :: p, j, r + real(dp) :: left(0:spl%degree), right(0:spl%degree), saved, temp + + p = spl%degree + N(0) = 1.0_dp + do j = 1, p + left(j) = x - spl%knots(span + 1 - j) + right(j) = spl%knots(span + j) - x + saved = 0.0_dp + do r = 0, j - 1 + temp = N(r)/(right(r + 1) + left(j - r)) + N(r) = saved + right(r + 1)*temp + saved = left(j - r)*temp + end do + N(j) = saved + end do + end subroutine basis_funs + + + subroutine bspline_1d_eval(spl, coeff, x, y) + type(bspline_1d), intent(in) :: spl + real(dp), intent(in) :: coeff(:) + real(dp), intent(in) :: x + real(dp), intent(out) :: y + integer :: span, j, p + real(dp) :: N(0:spl%degree) + + p = spl%degree + call find_span(spl, x, span) + call basis_funs(spl, span, x, N) + y = 0.0_dp + !$omp simd reduction(+:y) + do j = 0, p + y = y + N(j)*coeff(span - p + j) + end do + end subroutine bspline_1d_eval + + + subroutine bspline_2d_eval(spl, coeff, x, y) + type(bspline_2d), intent(in) :: spl + real(dp), intent(in) :: coeff(:,:) + real(dp), intent(in) :: x(2) + real(dp), intent(out) :: y + integer :: spanx, spany, px, py, a, b, ix, iy + real(dp) :: Nx(0:spl%sx%degree), Ny(0:spl%sy%degree) + + px = spl%sx%degree + py = spl%sy%degree + call find_span(spl%sx, x(1), spanx) + call basis_funs(spl%sx, spanx, x(1), Nx) + call find_span(spl%sy, x(2), spany) + call basis_funs(spl%sy, spany, x(2), Ny) + y = 0.0_dp + do a = 0, px + ix = spanx - px + a + do b = 0, py + iy = spany - py + b + y = y + Nx(a)*Ny(b)*coeff(ix, iy) + end do + end do + end subroutine bspline_2d_eval + + + subroutine bspline_3d_eval(spl, coeff, x, y) + type(bspline_3d), intent(in) :: spl + real(dp), intent(in) :: coeff(:,:,:) + real(dp), intent(in) :: x(3) + real(dp), intent(out) :: y + integer :: spanx, spany, spanz, px, py, pz, a, b, c, ix, iy, iz + real(dp) :: Nx(0:spl%sx%degree), Ny(0:spl%sy%degree) + real(dp) :: Nz(0:spl%sz%degree) + + px = spl%sx%degree + py = spl%sy%degree + pz = spl%sz%degree + call find_span(spl%sx, x(1), spanx) + call basis_funs(spl%sx, spanx, x(1), Nx) + call find_span(spl%sy, x(2), spany) + call basis_funs(spl%sy, spany, x(2), Ny) + call find_span(spl%sz, x(3), spanz) + call basis_funs(spl%sz, spanz, x(3), Nz) + y = 0.0_dp + do a = 0, px + ix = spanx - px + a + do b = 0, py + iy = spany - py + b + do c = 0, pz + iz = spanz - pz + c + y = y + Nx(a)*Ny(b)*Nz(c)*coeff(ix, iy, iz) + end do + end do + end do + end subroutine bspline_3d_eval + +end module neo_bspline_base diff --git a/src/interpolate/neo_bspline_interp.f90 b/src/interpolate/neo_bspline_interp.f90 new file mode 100644 index 00000000..615bc8f3 --- /dev/null +++ b/src/interpolate/neo_bspline_interp.f90 @@ -0,0 +1,206 @@ +module neo_bspline_interp + !! Direct B-spline interpolation via collocation. + !! Solves the linear system A*c = f where A_ij = B_j(x_i). + !! Uses separable tensor-product structure for efficiency in 2D/3D. + use, intrinsic :: iso_fortran_env, only: dp => real64 + use neo_bspline_base, only: bspline_1d, bspline_2d, bspline_3d, & + find_span, basis_funs + implicit none + private + + public :: bspline_1d_interp, bspline_2d_interp, bspline_3d_interp + +contains + + subroutine bspline_1d_interp(spl, x_data, f_data, coeff) + !! Direct 1D B-spline interpolation: solve collocation system A*c = f. + type(bspline_1d), intent(in) :: spl + real(dp), intent(in) :: x_data(:) + real(dp), intent(in) :: f_data(:) + real(dp), intent(out) :: coeff(:) + + integer :: n, p, i, j, span, info + real(dp), allocatable :: A(:,:), work_f(:), Nvals(:) + integer, allocatable :: ipiv(:) + + n = size(x_data) + p = spl%degree + allocate(A(n, n), work_f(n), ipiv(n), Nvals(0:p)) + A = 0.0_dp + + do i = 1, n + call find_span(spl, x_data(i), span) + call basis_funs(spl, span, x_data(i), Nvals) + do j = 0, p + A(i, span - p + j) = Nvals(j) + end do + end do + + work_f = f_data + call dgesv(n, 1, A, n, ipiv, work_f, n, info) + if (info /= 0) then + coeff = 0.0_dp + return + end if + coeff = work_f + end subroutine bspline_1d_interp + + + subroutine bspline_2d_interp(spl, x1, x2, f_grid, coeff) + !! Direct 2D B-spline interpolation using separable tensor product. + !! Solves dimension-by-dimension: first along x1, then along x2. + type(bspline_2d), intent(in) :: spl + real(dp), intent(in) :: x1(:), x2(:) + real(dp), intent(in) :: f_grid(:,:) + real(dp), intent(out) :: coeff(:,:) + + integer :: n1, n2, i, j, span, p1, p2, info, pmax + real(dp), allocatable :: A1(:,:), A2(:,:), temp(:,:), work(:), Nvals(:) + integer, allocatable :: ipiv(:) + + n1 = size(x1) + n2 = size(x2) + p1 = spl%sx%degree + p2 = spl%sy%degree + pmax = max(p1, p2) + allocate(A1(n1, n1), A2(n2, n2), temp(n1, n2), ipiv(max(n1, n2))) + allocate(work(max(n1, n2)), Nvals(0:pmax)) + + A1 = 0.0_dp + do i = 1, n1 + call find_span(spl%sx, x1(i), span) + call basis_funs(spl%sx, span, x1(i), Nvals(0:p1)) + do j = 0, p1 + A1(i, span - p1 + j) = Nvals(j) + end do + end do + + A2 = 0.0_dp + do i = 1, n2 + call find_span(spl%sy, x2(i), span) + call basis_funs(spl%sy, span, x2(i), Nvals(0:p2)) + do j = 0, p2 + A2(i, span - p2 + j) = Nvals(j) + end do + end do + + temp = f_grid + call dgetrf(n1, n1, A1, n1, ipiv, info) + if (info /= 0) then + coeff = 0.0_dp + return + end if + do j = 1, n2 + work(1:n1) = temp(:, j) + call dgetrs('N', n1, 1, A1, n1, ipiv, work, n1, info) + temp(:, j) = work(1:n1) + end do + + call dgetrf(n2, n2, A2, n2, ipiv, info) + if (info /= 0) then + coeff = 0.0_dp + return + end if + do i = 1, n1 + work(1:n2) = temp(i, :) + call dgetrs('N', n2, 1, A2, n2, ipiv, work, n2, info) + coeff(i, :) = work(1:n2) + end do + end subroutine bspline_2d_interp + + + subroutine bspline_3d_interp(spl, x1, x2, x3, f_grid, coeff) + !! Direct 3D B-spline interpolation using separable tensor product. + !! Solves dimension-by-dimension: x1 -> x2 -> x3. + type(bspline_3d), intent(in) :: spl + real(dp), intent(in) :: x1(:), x2(:), x3(:) + real(dp), intent(in) :: f_grid(:,:,:) + real(dp), intent(out) :: coeff(:,:,:) + + integer :: n1, n2, n3, i, j, k, span, p1, p2, p3, info, pmax, nmax + real(dp), allocatable :: A1(:,:), A2(:,:), A3(:,:), temp(:,:,:) + real(dp), allocatable :: Nvals(:) + integer, allocatable :: ipiv1(:), ipiv2(:), ipiv3(:) + + n1 = size(x1) + n2 = size(x2) + n3 = size(x3) + p1 = spl%sx%degree + p2 = spl%sy%degree + p3 = spl%sz%degree + pmax = max(p1, p2, p3) + nmax = max(n1, n2, n3) + allocate(A1(n1, n1), A2(n2, n2), A3(n3, n3)) + allocate(temp(n1, n2, n3), ipiv1(n1), ipiv2(n2), ipiv3(n3)) + allocate(Nvals(0:pmax)) + + A1 = 0.0_dp + do i = 1, n1 + call find_span(spl%sx, x1(i), span) + call basis_funs(spl%sx, span, x1(i), Nvals(0:p1)) + do j = 0, p1 + A1(i, span - p1 + j) = Nvals(j) + end do + end do + + A2 = 0.0_dp + do i = 1, n2 + call find_span(spl%sy, x2(i), span) + call basis_funs(spl%sy, span, x2(i), Nvals(0:p2)) + do j = 0, p2 + A2(i, span - p2 + j) = Nvals(j) + end do + end do + + A3 = 0.0_dp + do i = 1, n3 + call find_span(spl%sz, x3(i), span) + call basis_funs(spl%sz, span, x3(i), Nvals(0:p3)) + do j = 0, p3 + A3(i, span - p3 + j) = Nvals(j) + end do + end do + + temp = f_grid + + call dgetrf(n1, n1, A1, n1, ipiv1, info) + if (info /= 0) then + coeff = 0.0_dp + return + end if + call dgetrf(n2, n2, A2, n2, ipiv2, info) + if (info /= 0) then + coeff = 0.0_dp + return + end if + call dgetrf(n3, n3, A3, n3, ipiv3, info) + if (info /= 0) then + coeff = 0.0_dp + return + end if + + !$omp parallel do collapse(2) private(j, k) schedule(static) + do k = 1, n3 + do j = 1, n2 + call dgetrs('N', n1, 1, A1, n1, ipiv1, temp(:, j, k), n1, info) + end do + end do + + !$omp parallel do collapse(2) private(i, k) schedule(static) + do k = 1, n3 + do i = 1, n1 + call dgetrs('N', n2, 1, A2, n2, ipiv2, temp(i, :, k), n2, info) + end do + end do + + !$omp parallel do collapse(2) private(i, j) schedule(static) + do j = 1, n2 + do i = 1, n1 + call dgetrs('N', n3, 1, A3, n3, ipiv3, temp(i, j, :), n3, info) + end do + end do + + coeff = temp + end subroutine bspline_3d_interp + +end module neo_bspline_interp diff --git a/src/interpolate/neo_bspline_lsq.f90 b/src/interpolate/neo_bspline_lsq.f90 new file mode 100644 index 00000000..611a506d --- /dev/null +++ b/src/interpolate/neo_bspline_lsq.f90 @@ -0,0 +1,516 @@ +module neo_bspline_lsq + !! Least-squares B-spline fitting via matrix-free CGLS. + !! Exploits regular grid structure with separable basis caching. + use, intrinsic :: iso_fortran_env, only: dp => real64 + use neo_bspline_base, only: bspline_1d, bspline_2d, bspline_3d, & + find_span, basis_funs + implicit none + private + + type :: grid_cache_1d + integer :: ng1, px + integer, allocatable :: span1(:) + real(dp), allocatable :: B1(:,:) + end type grid_cache_1d + + type :: grid_cache_2d + integer :: ng1, ng2, px, py + integer, allocatable :: span1(:), span2(:) + real(dp), allocatable :: B1(:,:), B2(:,:) + end type grid_cache_2d + + type :: grid_cache_3d + integer :: ng1, ng2, ng3, px, py, pz + integer, allocatable :: span1(:), span2(:), span3(:) + real(dp), allocatable :: B1(:,:), B2(:,:), B3(:,:) + end type grid_cache_3d + + public :: bspline_1d_lsq_cgls, bspline_2d_lsq_cgls, bspline_3d_lsq_cgls + +contains + + subroutine precompute_grid_1d(spl, x1, cache) + type(bspline_1d), intent(in) :: spl + real(dp), intent(in) :: x1(:) + type(grid_cache_1d), intent(out) :: cache + integer :: i, n1, px + + n1 = size(x1) + px = spl%degree + cache%ng1 = n1 + cache%px = px + allocate(cache%span1(n1), cache%B1(0:px, n1)) + + !$omp parallel do simd private(i) schedule(simd:static) + do i = 1, n1 + call find_span(spl, x1(i), cache%span1(i)) + end do + + !$omp parallel do private(i) schedule(static) + do i = 1, n1 + call basis_funs(spl, cache%span1(i), x1(i), cache%B1(:, i)) + end do + end subroutine precompute_grid_1d + + + subroutine precompute_grid_2d(spl, x1, x2, cache) + type(bspline_2d), intent(in) :: spl + real(dp), intent(in) :: x1(:), x2(:) + type(grid_cache_2d), intent(out) :: cache + integer :: i, n1, n2, px, py + + n1 = size(x1) + n2 = size(x2) + px = spl%sx%degree + py = spl%sy%degree + cache%ng1 = n1 + cache%ng2 = n2 + cache%px = px + cache%py = py + allocate(cache%span1(n1), cache%span2(n2)) + allocate(cache%B1(0:px, n1), cache%B2(0:py, n2)) + + !$omp parallel do simd private(i) schedule(simd:static) + do i = 1, n1 + call find_span(spl%sx, x1(i), cache%span1(i)) + end do + !$omp parallel do private(i) schedule(static) + do i = 1, n1 + call basis_funs(spl%sx, cache%span1(i), x1(i), cache%B1(:, i)) + end do + + !$omp parallel do simd private(i) schedule(simd:static) + do i = 1, n2 + call find_span(spl%sy, x2(i), cache%span2(i)) + end do + !$omp parallel do private(i) schedule(static) + do i = 1, n2 + call basis_funs(spl%sy, cache%span2(i), x2(i), cache%B2(:, i)) + end do + end subroutine precompute_grid_2d + + + subroutine precompute_grid_3d(spl, x1, x2, x3, cache) + type(bspline_3d), intent(in) :: spl + real(dp), intent(in) :: x1(:), x2(:), x3(:) + type(grid_cache_3d), intent(out) :: cache + integer :: i, n1, n2, n3, px, py, pz + + n1 = size(x1) + n2 = size(x2) + n3 = size(x3) + px = spl%sx%degree + py = spl%sy%degree + pz = spl%sz%degree + cache%ng1 = n1 + cache%ng2 = n2 + cache%ng3 = n3 + cache%px = px + cache%py = py + cache%pz = pz + allocate(cache%span1(n1), cache%span2(n2), cache%span3(n3)) + allocate(cache%B1(0:px, n1), cache%B2(0:py, n2), cache%B3(0:pz, n3)) + + !$omp parallel do simd private(i) schedule(simd:static) + do i = 1, n1 + call find_span(spl%sx, x1(i), cache%span1(i)) + end do + !$omp parallel do private(i) schedule(static) + do i = 1, n1 + call basis_funs(spl%sx, cache%span1(i), x1(i), cache%B1(:, i)) + end do + + !$omp parallel do simd private(i) schedule(simd:static) + do i = 1, n2 + call find_span(spl%sy, x2(i), cache%span2(i)) + end do + !$omp parallel do private(i) schedule(static) + do i = 1, n2 + call basis_funs(spl%sy, cache%span2(i), x2(i), cache%B2(:, i)) + end do + + !$omp parallel do simd private(i) schedule(simd:static) + do i = 1, n3 + call find_span(spl%sz, x3(i), cache%span3(i)) + end do + !$omp parallel do private(i) schedule(static) + do i = 1, n3 + call basis_funs(spl%sz, cache%span3(i), x3(i), cache%B3(:, i)) + end do + end subroutine precompute_grid_3d + + + subroutine apply_A_1d(cache, coeff, f) + type(grid_cache_1d), intent(in) :: cache + real(dp), intent(in) :: coeff(:) + real(dp), intent(out) :: f(:) + integer :: i, a, ix, n1, px, s1 + + n1 = cache%ng1 + px = cache%px + !$omp parallel do simd private(i, a, ix, s1) schedule(simd:static) + do i = 1, n1 + s1 = cache%span1(i) + f(i) = 0.0_dp + do a = 0, px + ix = s1 - px + a + f(i) = f(i) + cache%B1(a, i)*coeff(ix) + end do + end do + end subroutine apply_A_1d + + + subroutine apply_AT_1d(cache, r, g, n_ctrl) + type(grid_cache_1d), intent(in) :: cache + real(dp), intent(in) :: r(:) + real(dp), intent(out) :: g(:) + integer, intent(in) :: n_ctrl + integer :: i, a, ix, n1, px, s1 + real(dp), allocatable :: g_local(:) + + n1 = cache%ng1 + px = cache%px + g = 0.0_dp + + !$omp parallel private(g_local, i, a, ix, s1) default(shared) + allocate(g_local(n_ctrl)) + g_local = 0.0_dp + !$omp do schedule(static) + do i = 1, n1 + s1 = cache%span1(i) + do a = 0, px + ix = s1 - px + a + g_local(ix) = g_local(ix) + cache%B1(a, i)*r(i) + end do + end do + !$omp end do + !$omp critical + g = g + g_local + !$omp end critical + deallocate(g_local) + !$omp end parallel + end subroutine apply_AT_1d + + + subroutine apply_A_2d(cache, coeff, f) + type(grid_cache_2d), intent(in) :: cache + real(dp), intent(in) :: coeff(:,:) + real(dp), intent(out) :: f(:,:) + integer :: i1, i2, a, b, ix, iy, n1, n2, px, py, s1, s2 + real(dp) :: val + + n1 = cache%ng1 + n2 = cache%ng2 + px = cache%px + py = cache%py + + !$omp parallel do collapse(2) private(i1, i2, a, b, ix, iy, s1, s2, val) & + !$omp& schedule(static) + do i2 = 1, n2 + do i1 = 1, n1 + s1 = cache%span1(i1) + s2 = cache%span2(i2) + val = 0.0_dp + do a = 0, px + ix = s1 - px + a + do b = 0, py + iy = s2 - py + b + val = val + cache%B1(a, i1)*cache%B2(b, i2)*coeff(ix, iy) + end do + end do + f(i1, i2) = val + end do + end do + end subroutine apply_A_2d + + + subroutine apply_AT_2d(cache, r, g, nx, ny) + type(grid_cache_2d), intent(in) :: cache + real(dp), intent(in) :: r(:,:) + real(dp), intent(out) :: g(:,:) + integer, intent(in) :: nx, ny + integer :: i1, i2, a, b, ix, iy, n1, n2, px, py, s1, s2 + real(dp), allocatable :: g_local(:,:) + + n1 = cache%ng1 + n2 = cache%ng2 + px = cache%px + py = cache%py + g = 0.0_dp + + !$omp parallel private(g_local, i1, i2, a, b, ix, iy, s1, s2) default(shared) + allocate(g_local(nx, ny)) + g_local = 0.0_dp + !$omp do collapse(2) schedule(static) + do i2 = 1, n2 + do i1 = 1, n1 + s1 = cache%span1(i1) + s2 = cache%span2(i2) + do a = 0, px + ix = s1 - px + a + do b = 0, py + iy = s2 - py + b + g_local(ix, iy) = g_local(ix, iy) + & + cache%B1(a, i1)*cache%B2(b, i2)*r(i1, i2) + end do + end do + end do + end do + !$omp end do + !$omp critical + g = g + g_local + !$omp end critical + deallocate(g_local) + !$omp end parallel + end subroutine apply_AT_2d + + + subroutine apply_A_3d(cache, coeff, f) + type(grid_cache_3d), intent(in) :: cache + real(dp), intent(in) :: coeff(:,:,:) + real(dp), intent(out) :: f(:,:,:) + integer :: i1, i2, i3, a, b, c, ix, iy, iz + integer :: n1, n2, n3, px, py, pz, s1, s2, s3 + real(dp) :: val, Nab + + n1 = cache%ng1 + n2 = cache%ng2 + n3 = cache%ng3 + px = cache%px + py = cache%py + pz = cache%pz + + !$omp parallel do collapse(3) & + !$omp& private(i1, i2, i3, a, b, c, ix, iy, iz, s1, s2, s3, val, Nab) & + !$omp& schedule(static) + do i3 = 1, n3 + do i2 = 1, n2 + do i1 = 1, n1 + s1 = cache%span1(i1) + s2 = cache%span2(i2) + s3 = cache%span3(i3) + val = 0.0_dp + do a = 0, px + ix = s1 - px + a + do b = 0, py + iy = s2 - py + b + Nab = cache%B1(a, i1)*cache%B2(b, i2) + !$omp simd reduction(+:val) + do c = 0, pz + iz = s3 - pz + c + val = val + Nab*cache%B3(c, i3)*coeff(ix, iy, iz) + end do + end do + end do + f(i1, i2, i3) = val + end do + end do + end do + end subroutine apply_A_3d + + + subroutine apply_AT_3d(cache, r, g, nx, ny, nz) + type(grid_cache_3d), intent(in) :: cache + real(dp), intent(in) :: r(:,:,:) + real(dp), intent(out) :: g(:,:,:) + integer, intent(in) :: nx, ny, nz + integer :: i1, i2, i3, a, b, c, ix, iy, iz + integer :: n1, n2, n3, px, py, pz, s1, s2, s3 + real(dp) :: ri, Nab + real(dp), allocatable :: g_local(:,:,:) + + n1 = cache%ng1 + n2 = cache%ng2 + n3 = cache%ng3 + px = cache%px + py = cache%py + pz = cache%pz + g = 0.0_dp + + !$omp parallel & + !$omp& private(g_local, i1, i2, i3, a, b, c, ix, iy, iz, s1, s2, s3, ri, Nab) & + !$omp& default(shared) + allocate(g_local(nx, ny, nz)) + g_local = 0.0_dp + !$omp do collapse(3) schedule(static) + do i3 = 1, n3 + do i2 = 1, n2 + do i1 = 1, n1 + s1 = cache%span1(i1) + s2 = cache%span2(i2) + s3 = cache%span3(i3) + ri = r(i1, i2, i3) + do a = 0, px + ix = s1 - px + a + do b = 0, py + iy = s2 - py + b + Nab = cache%B1(a, i1)*cache%B2(b, i2)*ri + do c = 0, pz + iz = s3 - pz + c + g_local(ix, iy, iz) = g_local(ix, iy, iz) + & + Nab*cache%B3(c, i3) + end do + end do + end do + end do + end do + end do + !$omp end do + !$omp critical + g = g + g_local + !$omp end critical + deallocate(g_local) + !$omp end parallel + end subroutine apply_AT_3d + + + subroutine bspline_1d_lsq_cgls(spl, x_data, f_data, coeff, max_iter, tol) + type(bspline_1d), intent(in) :: spl + real(dp), intent(in) :: x_data(:) + real(dp), intent(in) :: f_data(:) + real(dp), intent(inout) :: coeff(:) + integer, intent(in), optional :: max_iter + real(dp), intent(in), optional :: tol + + type(grid_cache_1d) :: cache + integer :: n_data, n_ctrl, k, kmax + real(dp) :: atol, gamma, gamma_new, alpha, beta, denom, rhs_norm + real(dp), allocatable :: r(:), q(:), s(:), p(:) + + n_data = size(x_data) + n_ctrl = spl%n_ctrl + kmax = 200 + atol = 1.0d-10 + if (present(max_iter)) kmax = max_iter + if (present(tol)) atol = tol + + call precompute_grid_1d(spl, x_data, cache) + + allocate(r(n_data), q(n_data), s(n_ctrl), p(n_ctrl)) + coeff = 0.0_dp + r = f_data + call apply_AT_1d(cache, r, s, n_ctrl) + p = s + gamma = dot_product(s, s) + rhs_norm = sqrt(dot_product(f_data, f_data)) + if (rhs_norm == 0.0_dp) return + + do k = 1, kmax + call apply_A_1d(cache, p, q) + denom = dot_product(q, q) + if (denom <= 0.0_dp) exit + alpha = gamma/denom + coeff = coeff + alpha*p + r = r - alpha*q + call apply_AT_1d(cache, r, s, n_ctrl) + gamma_new = dot_product(s, s) + if (gamma_new <= (atol*rhs_norm)**2) exit + beta = gamma_new/gamma + gamma = gamma_new + p = s + beta*p + end do + end subroutine bspline_1d_lsq_cgls + + + subroutine bspline_2d_lsq_cgls(spl, x1, x2, f_grid, coeff, max_iter, tol) + type(bspline_2d), intent(in) :: spl + real(dp), intent(in) :: x1(:), x2(:) + real(dp), intent(in) :: f_grid(:,:) + real(dp), intent(inout) :: coeff(:,:) + integer, intent(in), optional :: max_iter + real(dp), intent(in), optional :: tol + + type(grid_cache_2d) :: cache + integer :: n1, n2, nx, ny, k, kmax + real(dp) :: atol, gamma, gamma_new, alpha, beta, denom, rhs_norm + real(dp), allocatable :: r(:,:), q(:,:), s(:,:), p(:,:) + + n1 = size(x1) + n2 = size(x2) + nx = spl%sx%n_ctrl + ny = spl%sy%n_ctrl + kmax = 400 + atol = 1.0d-10 + if (present(max_iter)) kmax = max_iter + if (present(tol)) atol = tol + + call precompute_grid_2d(spl, x1, x2, cache) + + allocate(r(n1, n2), q(n1, n2), s(nx, ny), p(nx, ny)) + coeff = 0.0_dp + r = f_grid + call apply_AT_2d(cache, r, s, nx, ny) + p = s + gamma = sum(s*s) + rhs_norm = sqrt(sum(f_grid*f_grid)) + if (rhs_norm == 0.0_dp) return + + do k = 1, kmax + call apply_A_2d(cache, p, q) + denom = sum(q*q) + if (denom <= 0.0_dp) exit + alpha = gamma/denom + coeff = coeff + alpha*p + r = r - alpha*q + call apply_AT_2d(cache, r, s, nx, ny) + gamma_new = sum(s*s) + if (gamma_new <= (atol*rhs_norm)**2) exit + beta = gamma_new/gamma + gamma = gamma_new + p = s + beta*p + end do + end subroutine bspline_2d_lsq_cgls + + + subroutine bspline_3d_lsq_cgls(spl, x1, x2, x3, f_grid, coeff, max_iter, tol) + type(bspline_3d), intent(in) :: spl + real(dp), intent(in) :: x1(:), x2(:), x3(:) + real(dp), intent(in) :: f_grid(:,:,:) + real(dp), intent(inout) :: coeff(:,:,:) + integer, intent(in), optional :: max_iter + real(dp), intent(in), optional :: tol + + type(grid_cache_3d) :: cache + integer :: n1, n2, n3, nx, ny, nz, k, kmax + real(dp) :: atol, gamma, gamma_new, alpha, beta, denom, rhs_norm + real(dp), allocatable :: r(:,:,:), q(:,:,:), s(:,:,:), p(:,:,:) + + n1 = size(x1) + n2 = size(x2) + n3 = size(x3) + nx = spl%sx%n_ctrl + ny = spl%sy%n_ctrl + nz = spl%sz%n_ctrl + kmax = 400 + atol = 1.0d-10 + if (present(max_iter)) kmax = max_iter + if (present(tol)) atol = tol + + call precompute_grid_3d(spl, x1, x2, x3, cache) + + allocate(r(n1, n2, n3), q(n1, n2, n3), s(nx, ny, nz), p(nx, ny, nz)) + coeff = 0.0_dp + r = f_grid + call apply_AT_3d(cache, r, s, nx, ny, nz) + p = s + gamma = sum(s*s) + rhs_norm = sqrt(sum(f_grid*f_grid)) + if (rhs_norm == 0.0_dp) return + + do k = 1, kmax + call apply_A_3d(cache, p, q) + denom = sum(q*q) + if (denom <= 0.0_dp) exit + alpha = gamma/denom + coeff = coeff + alpha*p + r = r - alpha*q + call apply_AT_3d(cache, r, s, nx, ny, nz) + gamma_new = sum(s*s) + if (gamma_new <= (atol*rhs_norm)**2) exit + beta = gamma_new/gamma + gamma = gamma_new + p = s + beta*p + end do + end subroutine bspline_3d_lsq_cgls + +end module neo_bspline_lsq diff --git a/test/source/bench_neo_bspline_vs_interpolate.f90 b/test/source/bench_neo_bspline_vs_interpolate.f90 index f45052d1..f9a132fa 100644 --- a/test/source/bench_neo_bspline_vs_interpolate.f90 +++ b/test/source/bench_neo_bspline_vs_interpolate.f90 @@ -1,6 +1,6 @@ program bench_neo_bspline_vs_interpolate - use, intrinsic :: iso_fortran_env, only : dp_bench => real64 - use, intrinsic :: iso_c_binding, only : c_int, c_long + use, intrinsic :: iso_fortran_env, only: dp_bench => real64 + use, intrinsic :: iso_c_binding, only: c_int, c_long use interpolate use neo_bspline @@ -50,14 +50,15 @@ end subroutine bench_time_now subroutine run_bench_1d() type(SplineData1D) :: spl_interp - type(bspline_1d) :: spl_bs - integer :: i, k, n, degree_bs, n_ctrl + type(bspline_1d) :: spl_bs, spl_bs_dir + integer :: i, k, n, degree_bs real(dp_bench) :: t0, t1 real(dp_bench) :: t_create_interp, t_eval_interp - real(dp_bench) :: t_create_bs, t_eval_bs - real(dp_bench), allocatable :: x(:), f(:), coeff(:) + real(dp_bench) :: t_create_lsq, t_eval_lsq + real(dp_bench) :: t_create_dir, t_eval_dir + real(dp_bench), allocatable :: x(:), f(:), coeff_lsq(:), coeff_dir(:) real(dp_bench) :: x_min, x_max, y - integer :: unit + integer :: unit, n_ctrl_lsq x_min = 1.23_dp_bench x_max = x_min + TWOPI_BENCH @@ -71,13 +72,12 @@ subroutine run_bench_1d() allocate(x(n), f(n)) do i = 1, n - x(i) = x_min + (x_max - x_min) * real(i - 1, dp_bench) & - / real(n - 1, dp_bench) - f(i) = cos(2.0_dp_bench*x(i)) + 0.5_dp_bench* & - sin(3.0_dp_bench*x(i)) + x(i) = x_min + (x_max - x_min)*real(i - 1, dp_bench) & + /real(n - 1, dp_bench) + f(i) = cos(2.0_dp_bench*x(i)) + 0.5_dp_bench*sin(3.0_dp_bench*x(i)) end do - ! Interpolate: construct + evaluate + ! 1) interpolate module: construct + evaluate call bench_time_now(t0) call construct_splines_1d(x_min, x_max, f, 5, .false., spl_interp) call bench_time_now(t1) @@ -90,32 +90,56 @@ subroutine run_bench_1d() call bench_time_now(t1) t_eval_interp = t1 - t0 - ! neo_bspline LSQ: construct + evaluate + ! 2) neo_bspline LSQ: construct + evaluate degree_bs = 5 - n_ctrl = min(40, n/2) - n_ctrl = max(degree_bs + 1, n_ctrl) + n_ctrl_lsq = min(40, n/2) + n_ctrl_lsq = max(degree_bs + 1, n_ctrl_lsq) - allocate(coeff(n_ctrl)) + allocate(coeff_lsq(n_ctrl_lsq)) + coeff_lsq = 0.0_dp_bench call bench_time_now(t0) - call bspline_1d_init_uniform(spl_bs, degree_bs, n_ctrl, x_min, & + call bspline_1d_init_uniform(spl_bs, degree_bs, n_ctrl_lsq, x_min, & x_max) - call bspline_1d_lsq_cgls(spl_bs, x, f, coeff, max_iter=400, & + call bspline_1d_lsq_cgls(spl_bs, x, f, coeff_lsq, max_iter=400, & tol=1.0d-10) call bench_time_now(t1) - t_create_bs = t1 - t0 + t_create_lsq = t1 - t0 call bench_time_now(t0) do i = 1, n - call bspline_1d_eval(spl_bs, coeff, x(i), y) + call bspline_1d_eval(spl_bs, coeff_lsq, x(i), y) end do call bench_time_now(t1) - t_eval_bs = t1 - t0 + t_eval_lsq = t1 - t0 - write(unit,'(i10,4es16.8)') n, t_create_interp, t_eval_interp, & - t_create_bs, t_eval_bs + ! 3) neo_bspline direct interp: construct + evaluate (skip large N) + if (n <= 3000) then + allocate(coeff_dir(n)) - deallocate(x, f, coeff) + call bench_time_now(t0) + call bspline_1d_init_uniform(spl_bs_dir, degree_bs, n, x_min, x_max) + call bspline_1d_interp(spl_bs_dir, x, f, coeff_dir) + call bench_time_now(t1) + t_create_dir = t1 - t0 + + call bench_time_now(t0) + do i = 1, n + call bspline_1d_eval(spl_bs_dir, coeff_dir, x(i), y) + end do + call bench_time_now(t1) + t_eval_dir = t1 - t0 + + deallocate(coeff_dir) + else + t_create_dir = -1.0_dp_bench + t_eval_dir = -1.0_dp_bench + end if + + write(unit,'(i10,6es16.8)') n, t_create_interp, t_eval_interp, & + t_create_lsq, t_eval_lsq, t_create_dir, t_eval_dir + + deallocate(x, f, coeff_lsq) call destroy_splines_1d(spl_interp) end do @@ -125,16 +149,17 @@ end subroutine run_bench_1d subroutine run_bench_2d() type(SplineData2D) :: spl_interp - type(bspline_2d) :: spl_bs + type(bspline_2d) :: spl_bs, spl_bs_dir integer :: i1, i2, k integer :: n_total, n_side, n1, n2 - integer :: degree(2), n_ctrl(2) + integer :: degree(2), n_ctrl_lsq(2) real(dp_bench) :: t0, t1 real(dp_bench) :: t_create_interp, t_eval_interp - real(dp_bench) :: t_create_bs, t_eval_bs + real(dp_bench) :: t_create_lsq, t_eval_lsq + real(dp_bench) :: t_create_dir, t_eval_dir real(dp_bench), allocatable :: x1(:), x2(:) real(dp_bench), allocatable :: f_grid(:,:) - real(dp_bench), allocatable :: coeff_bs(:,:) + real(dp_bench), allocatable :: coeff_lsq(:,:), coeff_dir(:,:) real(dp_bench) :: x_min(2), x_max(2) real(dp_bench) :: x(2), y integer :: unit, n_data @@ -173,7 +198,7 @@ subroutine run_bench_2d() end do end do - ! Interpolate: construct + evaluate + ! 1) interpolate module: construct + evaluate call bench_time_now(t0) call construct_splines_2d(x_min, x_max, f_grid, [5, 5], & [.false., .false.], spl_interp) @@ -190,36 +215,63 @@ subroutine run_bench_2d() call bench_time_now(t1) t_eval_interp = t1 - t0 - ! neo_bspline LSQ: construct + evaluate - n_ctrl(1) = min(16, n1/2) - n_ctrl(2) = min(16, n2/2) - n_ctrl(1) = max(degree(1) + 1, n_ctrl(1)) - n_ctrl(2) = max(degree(2) + 1, n_ctrl(2)) + ! 2) neo_bspline LSQ: construct + evaluate + n_ctrl_lsq(1) = min(16, n1/2) + n_ctrl_lsq(2) = min(16, n2/2) + n_ctrl_lsq(1) = max(degree(1) + 1, n_ctrl_lsq(1)) + n_ctrl_lsq(2) = max(degree(2) + 1, n_ctrl_lsq(2)) - allocate(coeff_bs(n_ctrl(1), n_ctrl(2))) - coeff_bs = 0.0_dp_bench + allocate(coeff_lsq(n_ctrl_lsq(1), n_ctrl_lsq(2))) + coeff_lsq = 0.0_dp_bench call bench_time_now(t0) - call bspline_2d_init_uniform(spl_bs, degree, n_ctrl, x_min, x_max) - call bspline_2d_lsq_cgls(spl_bs, x1, x2, f_grid, coeff_bs, & + call bspline_2d_init_uniform(spl_bs, degree, n_ctrl_lsq, x_min, x_max) + call bspline_2d_lsq_cgls(spl_bs, x1, x2, f_grid, coeff_lsq, & max_iter=800, tol=1.0d-10) call bench_time_now(t1) - t_create_bs = t1 - t0 + t_create_lsq = t1 - t0 call bench_time_now(t0) do i2 = 1, n2 do i1 = 1, n1 x = [x1(i1), x2(i2)] - call bspline_2d_eval(spl_bs, coeff_bs, x, y) + call bspline_2d_eval(spl_bs, coeff_lsq, x, y) end do end do call bench_time_now(t1) - t_eval_bs = t1 - t0 + t_eval_lsq = t1 - t0 + + ! 3) neo_bspline direct interp: construct + evaluate (skip large N) + if (n_data <= 10000) then + allocate(coeff_dir(n1, n2)) + + call bench_time_now(t0) + call bspline_2d_init_uniform(spl_bs_dir, degree, [n1, n2], x_min, & + x_max) + call bspline_2d_interp(spl_bs_dir, x1, x2, f_grid, coeff_dir) + call bench_time_now(t1) + t_create_dir = t1 - t0 + + call bench_time_now(t0) + do i2 = 1, n2 + do i1 = 1, n1 + x = [x1(i1), x2(i2)] + call bspline_2d_eval(spl_bs_dir, coeff_dir, x, y) + end do + end do + call bench_time_now(t1) + t_eval_dir = t1 - t0 + + deallocate(coeff_dir) + else + t_create_dir = -1.0_dp_bench + t_eval_dir = -1.0_dp_bench + end if - write(unit,'(i10,4es16.8)') n_data, t_create_interp, & - t_eval_interp, t_create_bs, t_eval_bs + write(unit,'(i10,6es16.8)') n_data, t_create_interp, t_eval_interp, & + t_create_lsq, t_eval_lsq, t_create_dir, t_eval_dir - deallocate(x1, x2, f_grid, coeff_bs) + deallocate(x1, x2, f_grid, coeff_lsq) call destroy_splines_2d(spl_interp) end do @@ -229,16 +281,17 @@ end subroutine run_bench_2d subroutine run_bench_3d() type(SplineData3D) :: spl_interp - type(bspline_3d) :: spl_bs + type(bspline_3d) :: spl_bs, spl_bs_dir integer :: i1, i2, i3, k integer :: n_total, n_side, n1, n2, n3 - integer :: degree(3), n_ctrl(3) + integer :: degree(3), n_ctrl_lsq(3) real(dp_bench) :: t0, t1 real(dp_bench) :: t_create_interp, t_eval_interp - real(dp_bench) :: t_create_bs, t_eval_bs + real(dp_bench) :: t_create_lsq, t_eval_lsq + real(dp_bench) :: t_create_dir, t_eval_dir real(dp_bench), allocatable :: x1(:), x2(:), x3(:) real(dp_bench), allocatable :: f3d(:,:,:) - real(dp_bench), allocatable :: coeff_bs(:,:,:) + real(dp_bench), allocatable :: coeff_lsq(:,:,:), coeff_dir(:,:,:) real(dp_bench) :: x_min(3), x_max(3) real(dp_bench) :: x(3), y integer :: unit, n_data @@ -286,7 +339,7 @@ subroutine run_bench_3d() end do end do - ! Interpolate: construct + evaluate (skip for large N) + ! 1) interpolate module: construct + evaluate (skip for large N) if (n_data <= 10000) then call bench_time_now(t0) call construct_splines_3d(x_min, x_max, f3d, [5, 5, 5], & @@ -310,40 +363,69 @@ subroutine run_bench_3d() t_eval_interp = -1.0_dp_bench end if - ! neo_bspline LSQ: construct + evaluate - n_ctrl(1) = min(16, n1/2) - n_ctrl(2) = min(16, n2/2) - n_ctrl(3) = min(16, n3/2) - n_ctrl(1) = max(degree(1) + 1, n_ctrl(1)) - n_ctrl(2) = max(degree(2) + 1, n_ctrl(2)) - n_ctrl(3) = max(degree(3) + 1, n_ctrl(3)) + ! 2) neo_bspline LSQ: construct + evaluate + n_ctrl_lsq(1) = min(16, n1/2) + n_ctrl_lsq(2) = min(16, n2/2) + n_ctrl_lsq(3) = min(16, n3/2) + n_ctrl_lsq(1) = max(degree(1) + 1, n_ctrl_lsq(1)) + n_ctrl_lsq(2) = max(degree(2) + 1, n_ctrl_lsq(2)) + n_ctrl_lsq(3) = max(degree(3) + 1, n_ctrl_lsq(3)) - allocate(coeff_bs(n_ctrl(1), n_ctrl(2), n_ctrl(3))) - coeff_bs = 0.0_dp_bench + allocate(coeff_lsq(n_ctrl_lsq(1), n_ctrl_lsq(2), n_ctrl_lsq(3))) + coeff_lsq = 0.0_dp_bench call bench_time_now(t0) - call bspline_3d_init_uniform(spl_bs, degree, n_ctrl, x_min, x_max) - call bspline_3d_lsq_cgls(spl_bs, x1, x2, x3, f3d, coeff_bs, & + call bspline_3d_init_uniform(spl_bs, degree, n_ctrl_lsq, x_min, x_max) + call bspline_3d_lsq_cgls(spl_bs, x1, x2, x3, f3d, coeff_lsq, & max_iter=800, tol=1.0d-10) call bench_time_now(t1) - t_create_bs = t1 - t0 + t_create_lsq = t1 - t0 call bench_time_now(t0) do i3 = 1, n3 do i2 = 1, n2 do i1 = 1, n1 x = [x1(i1), x2(i2), x3(i3)] - call bspline_3d_eval(spl_bs, coeff_bs, x, y) + call bspline_3d_eval(spl_bs, coeff_lsq, x, y) end do end do end do call bench_time_now(t1) - t_eval_bs = t1 - t0 + t_eval_lsq = t1 - t0 + + ! 3) neo_bspline direct interp: construct + evaluate (skip large N) + if (n_data <= 10000) then + allocate(coeff_dir(n1, n2, n3)) + + call bench_time_now(t0) + call bspline_3d_init_uniform(spl_bs_dir, degree, [n1, n2, n3], & + x_min, x_max) + call bspline_3d_interp(spl_bs_dir, x1, x2, x3, f3d, coeff_dir) + call bench_time_now(t1) + t_create_dir = t1 - t0 + + call bench_time_now(t0) + do i3 = 1, n3 + do i2 = 1, n2 + do i1 = 1, n1 + x = [x1(i1), x2(i2), x3(i3)] + call bspline_3d_eval(spl_bs_dir, coeff_dir, x, y) + end do + end do + end do + call bench_time_now(t1) + t_eval_dir = t1 - t0 + + deallocate(coeff_dir) + else + t_create_dir = -1.0_dp_bench + t_eval_dir = -1.0_dp_bench + end if - write(unit,'(i10,4es16.8)') n_data, t_create_interp, & - t_eval_interp, t_create_bs, t_eval_bs + write(unit,'(i10,6es16.8)') n_data, t_create_interp, t_eval_interp, & + t_create_lsq, t_eval_lsq, t_create_dir, t_eval_dir - deallocate(x1, x2, x3, f3d, coeff_bs) + deallocate(x1, x2, x3, f3d, coeff_lsq) if (n_data <= 10000) call destroy_splines_3d(spl_interp) end do From ddc05bab9630b148755cca2a76a7b7c0f1df4f81 Mon Sep 17 00:00:00 2001 From: Christopher Albert Date: Tue, 2 Dec 2025 10:54:48 +0100 Subject: [PATCH 11/15] Fix bspline benchmark timing and ignore generated plots --- .gitignore | 1 + bench_neo_bspline_1d.png | Bin 145092 -> 0 bytes bench_neo_bspline_2d.png | Bin 144207 -> 0 bytes bench_neo_bspline_3d.png | Bin 121049 -> 0 bytes .../bench_neo_bspline_vs_interpolate.f90 | 12 +++++++++--- 5 files changed, 10 insertions(+), 3 deletions(-) delete mode 100644 bench_neo_bspline_1d.png delete mode 100644 bench_neo_bspline_2d.png delete mode 100644 bench_neo_bspline_3d.png diff --git a/.gitignore b/.gitignore index b9749d00..88fd62a5 100644 --- a/.gitignore +++ b/.gitignore @@ -66,5 +66,6 @@ lib/ .venv dist/ test/**/*.png +bench_neo_bspline_*.png version.f90 Testing/Temporary/CTestCostData.txt diff --git a/bench_neo_bspline_1d.png b/bench_neo_bspline_1d.png deleted file mode 100644 index 8018d9e4c0717069d19a7a2cdc4da4af53ef8782..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 145092 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�OlboQkafzoPj_j1n-e943 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%0DHAf`1zYY0 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 z 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
ftxCkOT7WKVNi0e+XzEfbz3weFu=x~IMH9cxrC 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≶pl-LHy46W|aS%>s=gi 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 diff --git a/bench_neo_bspline_2d.png b/bench_neo_bspline_2d.png deleted file mode 100644 index f04c9058ca57a41ba2e9df3747bca87629e2fad8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 144207 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°f!4CS~L&rYf^?bvellIp#69wZiEbFM|Dmc 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Ⓢgdm?bwj} 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%0D?WCjuYQ-McJVa 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 LB$addme2nIpgH+{ diff --git a/test/source/bench_neo_bspline_vs_interpolate.f90 b/test/source/bench_neo_bspline_vs_interpolate.f90 index f9a132fa..7064d98f 100644 --- a/test/source/bench_neo_bspline_vs_interpolate.f90 +++ b/test/source/bench_neo_bspline_vs_interpolate.f90 @@ -17,7 +17,12 @@ program bench_neo_bspline_vs_interpolate integer(c_long) :: tv_nsec end type timespec +!> clock id for clock_gettime; macOS uses 6 for CLOCK_MONOTONIC, Linux uses 1. +#ifdef __APPLE__ + integer(c_int), parameter :: CLOCK_MONOTONIC = 6_c_int +#else integer(c_int), parameter :: CLOCK_MONOTONIC = 1_c_int +#endif interface function c_clock_gettime(clock_id, tp) bind(C, name="clock_gettime") @@ -40,11 +45,12 @@ subroutine bench_time_now(t) integer(c_int) :: ierr ierr = c_clock_gettime(CLOCK_MONOTONIC, ts) - if (ierr /= 0_c_int) then - t = 0.0_dp_bench - else + if (ierr == 0_c_int) then t = real(ts%tv_sec, dp_bench) & + real(ts%tv_nsec, dp_bench)*1.0e-9_dp_bench + else + ! Fallback for platforms where CLOCK_MONOTONIC is unavailable. + call cpu_time(t) end if end subroutine bench_time_now From 8c0daab06f98fc8785a30879ff25309c35d891c6 Mon Sep 17 00:00:00 2001 From: Christopher Albert Date: Tue, 2 Dec 2025 10:59:50 +0100 Subject: [PATCH 12/15] Plot direct bspline interpolation timings --- test/scripts/plot_neo_bspline_benchmarks.py | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/test/scripts/plot_neo_bspline_benchmarks.py b/test/scripts/plot_neo_bspline_benchmarks.py index 65476411..b1e9b568 100644 --- a/test/scripts/plot_neo_bspline_benchmarks.py +++ b/test/scripts/plot_neo_bspline_benchmarks.py @@ -6,14 +6,18 @@ import numpy as np -def load_bench(path: pathlib.Path) -> tuple[np.ndarray, np.ndarray, np.ndarray, np.ndarray, np.ndarray]: +def load_bench( + path: pathlib.Path, +) -> tuple[np.ndarray, np.ndarray, np.ndarray, np.ndarray, np.ndarray, np.ndarray, np.ndarray]: data = np.loadtxt(path) n = data[:, 0] t_create_interp = data[:, 1] t_eval_interp = data[:, 2] t_create_bs = data[:, 3] t_eval_bs = data[:, 4] - return n, t_create_interp, t_eval_interp, t_create_bs, t_eval_bs + t_create_dir = data[:, 5] + t_eval_dir = data[:, 6] + return n, t_create_interp, t_eval_interp, t_create_bs, t_eval_bs, t_create_dir, t_eval_dir def plot_dim_create( @@ -21,11 +25,16 @@ def plot_dim_create( title: str, output: pathlib.Path, ) -> None: - n, t_ci, t_ei, t_cb, t_eb = load_bench(path) + n, t_ci, _, t_cb, _, t_cd, _ = load_bench(path) + + # ignore skipped cases (-1) for direct interpolation + mask_dir = t_cd > 0 fig, ax = plt.subplots(figsize=(6, 4)) ax.loglog(n, t_ci, "o-", label="interp create") ax.loglog(n, t_cb, "s-", label="neo_bspline create") + if np.any(mask_dir): + ax.loglog(n[mask_dir], t_cd[mask_dir], "^-", label="neo_bspline direct create") ax.set_xlabel("number of data points") ax.set_ylabel("time [s]") @@ -42,11 +51,15 @@ def plot_dim_eval( title: str, output: pathlib.Path, ) -> None: - n, t_ci, t_ei, t_cb, t_eb = load_bench(path) + n, _, t_ei, _, t_eb, _, t_ed = load_bench(path) + + mask_dir = t_ed > 0 fig, ax = plt.subplots(figsize=(6, 4)) ax.loglog(n, t_ei, "o--", label="interp eval") ax.loglog(n, t_eb, "s--", label="neo_bspline eval") + if np.any(mask_dir): + ax.loglog(n[mask_dir], t_ed[mask_dir], "^--", label="neo_bspline direct eval") ax.set_xlabel("number of data points") ax.set_ylabel("time [s]") From 309f2bff32beafc3c663f799fee6fa2464b9b35c Mon Sep 17 00:00:00 2001 From: Christopher Albert Date: Tue, 2 Dec 2025 11:04:18 +0100 Subject: [PATCH 13/15] Make direct bspline bench run all sizes and use band solver --- src/interpolate/neo_bspline_interp.f90 | 24 +++- .../bench_neo_bspline_vs_interpolate.f90 | 107 ++++++++---------- 2 files changed, 64 insertions(+), 67 deletions(-) diff --git a/src/interpolate/neo_bspline_interp.f90 b/src/interpolate/neo_bspline_interp.f90 index 615bc8f3..9be28a60 100644 --- a/src/interpolate/neo_bspline_interp.f90 +++ b/src/interpolate/neo_bspline_interp.f90 @@ -8,6 +8,15 @@ module neo_bspline_interp implicit none private + interface + subroutine dgbsv(n, kl, ku, nrhs, ab, ldab, ipiv, b, ldb, info) + import :: dp + integer :: n, kl, ku, nrhs, ldab, ldb, info + integer :: ipiv(*) + real(dp) :: ab(ldab, *), b(ldb, *) + end subroutine dgbsv + end interface + public :: bspline_1d_interp, bspline_2d_interp, bspline_3d_interp contains @@ -19,25 +28,28 @@ subroutine bspline_1d_interp(spl, x_data, f_data, coeff) real(dp), intent(in) :: f_data(:) real(dp), intent(out) :: coeff(:) - integer :: n, p, i, j, span, info - real(dp), allocatable :: A(:,:), work_f(:), Nvals(:) + integer :: n, p, i, j, span, info, kl, ku, ldab + real(dp), allocatable :: ab(:,:), work_f(:), Nvals(:) integer, allocatable :: ipiv(:) n = size(x_data) p = spl%degree - allocate(A(n, n), work_f(n), ipiv(n), Nvals(0:p)) - A = 0.0_dp + kl = p + ku = p + ldab = 2*kl + ku + 1 + allocate(ab(ldab, n), work_f(n), ipiv(n), Nvals(0:p)) + ab = 0.0_dp do i = 1, n call find_span(spl, x_data(i), span) call basis_funs(spl, span, x_data(i), Nvals) do j = 0, p - A(i, span - p + j) = Nvals(j) + ab(kl + ku + 1 + j, span - p + j) = Nvals(j) end do end do work_f = f_data - call dgesv(n, 1, A, n, ipiv, work_f, n, info) + call dgbsv(n, kl, ku, 1, ab, ldab, ipiv, work_f, n, info) if (info /= 0) then coeff = 0.0_dp return diff --git a/test/source/bench_neo_bspline_vs_interpolate.f90 b/test/source/bench_neo_bspline_vs_interpolate.f90 index 7064d98f..99138d46 100644 --- a/test/source/bench_neo_bspline_vs_interpolate.f90 +++ b/test/source/bench_neo_bspline_vs_interpolate.f90 @@ -120,27 +120,22 @@ subroutine run_bench_1d() t_eval_lsq = t1 - t0 ! 3) neo_bspline direct interp: construct + evaluate (skip large N) - if (n <= 3000) then - allocate(coeff_dir(n)) + allocate(coeff_dir(n)) - call bench_time_now(t0) - call bspline_1d_init_uniform(spl_bs_dir, degree_bs, n, x_min, x_max) - call bspline_1d_interp(spl_bs_dir, x, f, coeff_dir) - call bench_time_now(t1) - t_create_dir = t1 - t0 + call bench_time_now(t0) + call bspline_1d_init_uniform(spl_bs_dir, degree_bs, n, x_min, x_max) + call bspline_1d_interp(spl_bs_dir, x, f, coeff_dir) + call bench_time_now(t1) + t_create_dir = t1 - t0 - call bench_time_now(t0) - do i = 1, n - call bspline_1d_eval(spl_bs_dir, coeff_dir, x(i), y) - end do - call bench_time_now(t1) - t_eval_dir = t1 - t0 + call bench_time_now(t0) + do i = 1, n + call bspline_1d_eval(spl_bs_dir, coeff_dir, x(i), y) + end do + call bench_time_now(t1) + t_eval_dir = t1 - t0 - deallocate(coeff_dir) - else - t_create_dir = -1.0_dp_bench - t_eval_dir = -1.0_dp_bench - end if + deallocate(coeff_dir) write(unit,'(i10,6es16.8)') n, t_create_interp, t_eval_interp, & t_create_lsq, t_eval_lsq, t_create_dir, t_eval_dir @@ -248,31 +243,26 @@ subroutine run_bench_2d() t_eval_lsq = t1 - t0 ! 3) neo_bspline direct interp: construct + evaluate (skip large N) - if (n_data <= 10000) then - allocate(coeff_dir(n1, n2)) + allocate(coeff_dir(n1, n2)) - call bench_time_now(t0) - call bspline_2d_init_uniform(spl_bs_dir, degree, [n1, n2], x_min, & - x_max) - call bspline_2d_interp(spl_bs_dir, x1, x2, f_grid, coeff_dir) - call bench_time_now(t1) - t_create_dir = t1 - t0 + call bench_time_now(t0) + call bspline_2d_init_uniform(spl_bs_dir, degree, [n1, n2], x_min, & + x_max) + call bspline_2d_interp(spl_bs_dir, x1, x2, f_grid, coeff_dir) + call bench_time_now(t1) + t_create_dir = t1 - t0 - call bench_time_now(t0) - do i2 = 1, n2 - do i1 = 1, n1 - x = [x1(i1), x2(i2)] - call bspline_2d_eval(spl_bs_dir, coeff_dir, x, y) - end do + call bench_time_now(t0) + do i2 = 1, n2 + do i1 = 1, n1 + x = [x1(i1), x2(i2)] + call bspline_2d_eval(spl_bs_dir, coeff_dir, x, y) end do - call bench_time_now(t1) - t_eval_dir = t1 - t0 + end do + call bench_time_now(t1) + t_eval_dir = t1 - t0 - deallocate(coeff_dir) - else - t_create_dir = -1.0_dp_bench - t_eval_dir = -1.0_dp_bench - end if + deallocate(coeff_dir) write(unit,'(i10,6es16.8)') n_data, t_create_interp, t_eval_interp, & t_create_lsq, t_eval_lsq, t_create_dir, t_eval_dir @@ -400,33 +390,28 @@ subroutine run_bench_3d() t_eval_lsq = t1 - t0 ! 3) neo_bspline direct interp: construct + evaluate (skip large N) - if (n_data <= 10000) then - allocate(coeff_dir(n1, n2, n3)) + allocate(coeff_dir(n1, n2, n3)) - call bench_time_now(t0) - call bspline_3d_init_uniform(spl_bs_dir, degree, [n1, n2, n3], & - x_min, x_max) - call bspline_3d_interp(spl_bs_dir, x1, x2, x3, f3d, coeff_dir) - call bench_time_now(t1) - t_create_dir = t1 - t0 + call bench_time_now(t0) + call bspline_3d_init_uniform(spl_bs_dir, degree, [n1, n2, n3], & + x_min, x_max) + call bspline_3d_interp(spl_bs_dir, x1, x2, x3, f3d, coeff_dir) + call bench_time_now(t1) + t_create_dir = t1 - t0 - call bench_time_now(t0) - do i3 = 1, n3 - do i2 = 1, n2 - do i1 = 1, n1 - x = [x1(i1), x2(i2), x3(i3)] - call bspline_3d_eval(spl_bs_dir, coeff_dir, x, y) - end do + call bench_time_now(t0) + do i3 = 1, n3 + do i2 = 1, n2 + do i1 = 1, n1 + x = [x1(i1), x2(i2), x3(i3)] + call bspline_3d_eval(spl_bs_dir, coeff_dir, x, y) end do end do - call bench_time_now(t1) - t_eval_dir = t1 - t0 + end do + call bench_time_now(t1) + t_eval_dir = t1 - t0 - deallocate(coeff_dir) - else - t_create_dir = -1.0_dp_bench - t_eval_dir = -1.0_dp_bench - end if + deallocate(coeff_dir) write(unit,'(i10,6es16.8)') n_data, t_create_interp, t_eval_interp, & t_create_lsq, t_eval_lsq, t_create_dir, t_eval_dir From d776fa94728f5b4228ab0c908bfc7617e7bd6391 Mon Sep 17 00:00:00 2001 From: Christopher Albert Date: Tue, 2 Dec 2025 11:07:45 +0100 Subject: [PATCH 14/15] Benchmark interpolate 3D at all sizes --- .../bench_neo_bspline_vs_interpolate.f90 | 37 ++++++++----------- 1 file changed, 16 insertions(+), 21 deletions(-) diff --git a/test/source/bench_neo_bspline_vs_interpolate.f90 b/test/source/bench_neo_bspline_vs_interpolate.f90 index 99138d46..9db7407f 100644 --- a/test/source/bench_neo_bspline_vs_interpolate.f90 +++ b/test/source/bench_neo_bspline_vs_interpolate.f90 @@ -335,29 +335,24 @@ subroutine run_bench_3d() end do end do - ! 1) interpolate module: construct + evaluate (skip for large N) - if (n_data <= 10000) then - call bench_time_now(t0) - call construct_splines_3d(x_min, x_max, f3d, [5, 5, 5], & - [.false., .false., .false.], spl_interp) - call bench_time_now(t1) - t_create_interp = t1 - t0 - - call bench_time_now(t0) - do i3 = 1, n3 - do i2 = 1, n2 - do i1 = 1, n1 - x = [x1(i1), x2(i2), x3(i3)] - call evaluate_splines_3d(spl_interp, x, y) - end do + ! 1) interpolate module: construct + evaluate + call bench_time_now(t0) + call construct_splines_3d(x_min, x_max, f3d, [5, 5, 5], & + [.false., .false., .false.], spl_interp) + call bench_time_now(t1) + t_create_interp = t1 - t0 + + call bench_time_now(t0) + do i3 = 1, n3 + do i2 = 1, n2 + do i1 = 1, n1 + x = [x1(i1), x2(i2), x3(i3)] + call evaluate_splines_3d(spl_interp, x, y) end do end do - call bench_time_now(t1) - t_eval_interp = t1 - t0 - else - t_create_interp = -1.0_dp_bench - t_eval_interp = -1.0_dp_bench - end if + end do + call bench_time_now(t1) + t_eval_interp = t1 - t0 ! 2) neo_bspline LSQ: construct + evaluate n_ctrl_lsq(1) = min(16, n1/2) From d5355efaac02d9153a0377f6e74e6452d83a7fe1 Mon Sep 17 00:00:00 2001 From: Christopher Albert Date: Tue, 2 Dec 2025 12:08:34 +0100 Subject: [PATCH 15/15] Add 2D direct bspline analytical test --- test/source/test_neo_bspline_2d.f90 | 47 +++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/test/source/test_neo_bspline_2d.f90 b/test/source/test_neo_bspline_2d.f90 index a44c858f..d7d1188b 100644 --- a/test/source/test_neo_bspline_2d.f90 +++ b/test/source/test_neo_bspline_2d.f90 @@ -11,6 +11,7 @@ program test_neo_bspline_2d real(dp), parameter :: TOL_L2_FULL = 5.0d-4 call test_bspline_2d_lsq_full_grid() + call test_bspline_2d_interp_exact() call test_bspline_2d_lsq_full_grid_batch() contains @@ -73,6 +74,52 @@ subroutine test_bspline_2d_lsq_full_grid() end subroutine test_bspline_2d_lsq_full_grid + subroutine test_bspline_2d_interp_exact() + type(bspline_2d) :: spl + integer, parameter :: DEGREE(2) = [3, 3] + integer, parameter :: N1 = 18 + integer, parameter :: N2 = 14 + + real(dp) :: x1(N1), x2(N2) + real(dp) :: f_grid(N1, N2) + real(dp) :: coeff(N1, N2) + real(dp) :: f_fit, f_true, x(2) + real(dp) :: err_max + integer :: i1, i2 + + print *, "Testing neo_bspline 2D direct interpolation (collocation)" + + call bspline_2d_init_uniform(spl, DEGREE, [N1, N2], [X_MIN, X_MIN], & + [X_MAX, X_MAX]) + + call linspace(X_MIN, X_MAX, N1, x1) + call linspace(X_MIN, X_MAX, N2, x2) + + do i2 = 1, N2 + do i1 = 1, N1 + f_grid(i1, i2) = cos(x1(i1))*cos(2.0d0*x2(i2)) + end do + end do + + call bspline_2d_interp(spl, x1, x2, f_grid, coeff) + + err_max = 0.0d0 + do i2 = 1, N2 + do i1 = 1, N1 + x = [x1(i1), x2(i2)] + f_true = cos(x(1))*cos(2.0d0*x(2)) + call bspline_2d_eval(spl, coeff, x, f_fit) + err_max = max(err_max, abs(f_fit - f_true)) + end do + end do + + print *, " 2D direct interp max error =", err_max + if (err_max > 1.0d-10) then + error stop "neo_bspline 2D direct interpolation error too large" + end if + end subroutine test_bspline_2d_interp_exact + + subroutine test_bspline_2d_lsq_full_grid_batch() type(bspline_2d) :: spl integer, parameter :: DEGREE(2) = [3, 3]

x{nU+&PRKg){wB*O_XRyYjjZTn^()s!iQs5 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 zku