From 3e231e292791095583ceb346d4f63f07bb3cca67 Mon Sep 17 00:00:00 2001 From: Alex Barnett Date: Mon, 22 Jul 2024 22:13:42 -0400 Subject: [PATCH] regenerate kernel Horner coeffs: scaled to max val 1, and shave off some degrees for upsampfac=1.25 (#499) * gen_all_horner_cpp_header.m 1st try * new ES kernel generation * regen ES kernel with max size 1 not exp(beta) * fix constexpr in matlab-gen ES kernel code * done rescaling ES kernel to max value 1, regen all coeffs, fixes #454 * src/ker_horner_allw_loop_constexpr.c * add 1 to degree for larger-w upsampfac=1.25 ker eval, recovers prior accuracy * fix 1dtest issue re allowing ier=1 (warning only), #500 * more automated matlb kernel coeff generation * automated and documented matlab kernel coefficient generation; tweaked the poly degrees for kernel, checked accuracy * regen ker coeffs .h without nc200() etc func; use .size() instead, much neater * reverted matlab before clang-format messed it up * clang-formatted regen with assert logic fixed in .h horner stuff --- CHANGELOG | 4 +- devel/README | 24 + devel/gen_all_horner_C_code.m | 54 +- devel/gen_all_horner_cpp_header.m | 52 + devel/gen_ker_horner_C_code.m | 50 - devel/gen_ker_horner_loop_C_code.m | 25 +- devel/gen_ker_horner_loop_cpp_code.m | 70 ++ devel/get_degree_and_beta.m | 41 + devel/ker_ppval_coeff_mat.m | 68 +- devel/reverse_engineer_tol.m | 15 + docs/devnotes.rst | 8 + matlab/test/fig_accuracy.m | 23 +- src/ker_horner_allw_loop_constexpr.c | 205 ++++ src/ker_horner_allw_loop_constexpr.h | 939 +++++++++++++----- ..._lowupsampfac_horner_allw_loop_constexpr.c | 317 +++--- ..._lowupsampfac_horner_allw_loop_constexpr.h | 576 +++++++++++ src/spreadinterp.cpp | 24 +- test/checkallaccs.sh | 13 +- test/finufft1d_test.cpp | 2 +- 19 files changed, 1973 insertions(+), 537 deletions(-) create mode 100644 devel/README create mode 100644 devel/gen_all_horner_cpp_header.m delete mode 100644 devel/gen_ker_horner_C_code.m create mode 100644 devel/gen_ker_horner_loop_cpp_code.m create mode 100644 devel/get_degree_and_beta.m create mode 100644 devel/reverse_engineer_tol.m create mode 100644 src/ker_horner_allw_loop_constexpr.c create mode 100644 src/ker_lowupsampfac_horner_allw_loop_constexpr.h diff --git a/CHANGELOG b/CHANGELOG index 4e78eb5c3..000e03b6f 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,8 +1,10 @@ List of features / changes made / release notes, in reverse chronological order. If not stated, FINUFFT is assumed (cuFINUFFT <=1.3 is listed separately). -V 2.3.0beta (6/21/24) +V 2.3.0beta (7/21/24) +* ES kernel rescaled to max value 1, reduced horner degrees for upsampfac=1.25 + (fixes fp32 overflow issue #454). * Major acceleration of spread/interp kernels using XSIMD header-only lib, kernel evaluation, templating by ns with AVX-width-dependent decisions. Up to 80% faster, dep on compiler. (Marco Barbone with help from Libin Lu). diff --git a/devel/README b/devel/README new file mode 100644 index 000000000..44c9808c0 --- /dev/null +++ b/devel/README @@ -0,0 +1,24 @@ +Developer and experimental codes for FINUFFT +-------------------------------------------- + +For generating kernel coefficient codes in ../src, +the developer must run from MATLAB the following: + +gen_all_horner_C_code.m : writes C-style Horner coeffs (pre-2024) + * a single call writes upsampfac=2 and 1.25 + * calls gen_ker_horner_loop_C_code.m +gen_all_horner_cpp_header.m : writes C++ header Horner coeffs (July 2024 on) + * a single call writes upsampfac=2 and 1.25 + * calls gen_ker_horner_loop_cpp_code.m + +Both of the gen_ker_* scripts call for the solve of the coeffs for each w: +ker_ppval_coeff_mat.m + (which has the kernel definition in it, which must match spreadinterp.cpp) + +The universal location for kernel approximation (degree, ES beta setting) is: +get_degree_and_beta.m +Tweaks should be done here, and see instructions there for resulting acc test. +Another code that has to match ../src/spreadinterp.cpp is: +reverse_engineer_tol.m + +Barnett 7/22/24 diff --git a/devel/gen_all_horner_C_code.m b/devel/gen_all_horner_C_code.m index 5ac28cb95..009e05ea4 100644 --- a/devel/gen_all_horner_C_code.m +++ b/devel/gen_all_horner_C_code.m @@ -1,41 +1,39 @@ % Script to make all C code for looped Horner eval of kernels of all widths. % writes to "ker" array, from a variable "z", and switches by width "w". -% Resulting C code needs only placing in a function. +% Now does both upsampfacs. +% Resulting C code needs only including in a function. % Barnett 4/23/18; now calling Ludvig's loop version from 4/25/18. % version including low upsampfac, 6/17/18. % Ludvig put in w=4n padding, 1/31/20. Mystery about why d was bigger 2/6/20. +% split out code for degree, beta, etc; loop upsampfacs Barnett 7/22/24. clear opts = struct(); -ws = 2:16; -upsampfac = 2; % sigma (upsampling): either 2 (default) or low (eg 5/4). -opts.wpad = true; % pad kernel eval to multiple of 4 +for upsampfac = [2.0, 1.25]; % sigma: either 2 (default) or low (eg 5/4) + fprintf('upsampfac = %g...\n',upsampfac) + + ws = 2:16; + opts.wpad = true; % pad kernel eval to multiple of 4 -if upsampfac==2, fid = fopen('../src/ker_horner_allw_loop.c','w'); -else, fid = fopen('../src/ker_lowupsampfac_horner_allw_loop.c','w'); -end -fwrite(fid,sprintf('// Code generated by gen_all_horner_C_code.m in finufft/devel\n')); -fwrite(fid,sprintf('// Authors: Alex Barnett & Ludvig af Klinteberg.\n// (C) The Simons Foundation, Inc.\n')); -for j=1:numel(ws) - w = ws(j) - if upsampfac==2 % hardwire the betas for this default case - betaoverws = [2.20 2.26 2.38 2.30]; % matches setup_spreader - beta = betaoverws(min(4,w-1)) * w; % uses last entry for w>=5 - d = w + 2 + (w<=8); % between 2-3 more degree than w - else % use formulae, must match params in setup_spreader... - gamma=0.97; % safety factor - betaoverws = gamma*pi*(1-1/(2*upsampfac)); % from cutoff freq formula - beta = betaoverws * w; - d = w + 1 + (w<=8); % less, since beta smaller, smoother + if upsampfac==2, fid = fopen('../src/ker_horner_allw_loop_constexpr.c','w'); + else, fid = fopen('../src/ker_lowupsampfac_horner_allw_loop_constexpr.c','w'); end - str = gen_ker_horner_loop_C_code(w,d,beta,opts); - if j==1 % write switch statement - fwrite(fid,sprintf(' if (w==%d) {\n',w)); - else - fwrite(fid,sprintf(' } else if (w==%d) {\n',w)); + fwrite(fid,sprintf('// Code generated by gen_all_horner_C_code.m in finufft/devel\n')); + fwrite(fid,sprintf('// Authors: Alex Barnett & Ludvig af Klinteberg.\n// (C) The Simons Foundation, Inc.\n')); + for j=1:numel(ws) + w = ws(j); + [d,beta] = get_degree_and_beta(w,upsampfac); + fprintf('w=%d\td=%d\tbeta=%.3g\n',w,d,beta); + str = gen_ker_horner_loop_C_code(w,d,beta,opts); + if j==1 % write switch statement + fwrite(fid,sprintf(' if constexpr(w==%d) {\n',w)); + else + fwrite(fid,sprintf(' } else if constexpr(w==%d) {\n',w)); + end + for i=1:numel(str); fwrite(fid,[' ',str{i}]); end end - for i=1:numel(str); fwrite(fid,[' ',str{i}]); end + fwrite(fid,sprintf(' } else\n printf("width not implemented!\\n");\n')); + fclose(fid); + end -fwrite(fid,sprintf(' } else\n printf("width not implemented!\\n");\n')); -fclose(fid); diff --git a/devel/gen_all_horner_cpp_header.m b/devel/gen_all_horner_cpp_header.m new file mode 100644 index 000000000..d6d3a7e52 --- /dev/null +++ b/devel/gen_all_horner_cpp_header.m @@ -0,0 +1,52 @@ +% Script to make C++ header for looped Horner eval of kernels of all widths, +% for a particular opts.upsampfac (user to hand-choose below). +% C++ version (now writes .h), uses constexpr to switch by width w. + +% Barnett 4/23/18; now calling Ludvig's loop version from 4/25/18. +% version including low upsampfac, 6/17/18. +% Ludvig put in w=4n padding, 1/31/20. Mystery about why d was bigger 2/6/20. +% C++ header using constexpr of Barbone, replacing *_C_code.m. Barnett 7/16/24. +% simplified to kill nc200() etc functions, Barbone + Barnett 7/22/24. +clear +%opts = struct(); % not needed yet + +for upsampfac = [2.0, 1.25] % sigma: either 2 (default) or low (eg 5/4) + fprintf('upsampfac = %g...\n',upsampfac) + + ws = 2:16; % list of widths (the driver, rather than tols) + % (must match MIN and MAX NSPREAD in source headers) + if upsampfac==2 + fid = fopen('../src/ker_horner_allw_loop_constexpr.h','w'); + elseif upsampfac==1.25 + fid = fopen('../src/ker_lowupsampfac_horner_allw_loop_constexpr.h','w'); + end + fwrite(fid,sprintf('// Header of static arrays of monomial coeffs of spreading kernel function in each\n')); + fwrite(fid,sprintf('// fine-grid interval. Generated by gen_all_horner_cpp_header.m in devel/\n')); + fwrite(fid,sprintf('// Authors: Alex Barnett, Ludvig af Klinteberg, Marco Barbone & Libin Lu.\n// (C) 2018--2024 The Simons Foundation, Inc.\n')); + fwrite(fid,sprintf('#include \n\n')); + + usf_tag = sprintf('%d',100*upsampfac); % string, follow Barbone convention: 200 or 125 + fwrite(fid,sprintf('template\nconstexpr auto get_horner_coeffs_%s() noexcept {\n',usf_tag)); + + for j=1:numel(ws) + w = ws(j); + [d,beta] = get_degree_and_beta(w,upsampfac); + fprintf('w=%d\td=%d\tbeta=%.3g\n',w,d,beta); + str = gen_ker_horner_loop_cpp_code(w,d,beta); % code strings for this w (nc hardcoded) + + if j==1 % write switch statement + fwrite(fid,sprintf(' if constexpr (w == %d) {\n',w)); + else + fwrite(fid,sprintf(' } else if constexpr (w == %d) {\n',w)); + end + for i=1:numel(str); fwrite(fid,[' ',str{i}]); end % format 4 extra spaces + end + + % handle bad w at compile time... + fwrite(fid,sprintf(' }\n')); + fwrite(fid,sprintf(' static_assert(w >= %d, "w must be >= %d");\n',ws(1),ws(1))); + fwrite(fid,sprintf(' static_assert(w <= %d, "w must be <= %d");\n',ws(end),ws(end))); + fwrite(fid,sprintf(' };\n')); % close all brackets + fclose(fid); + +end diff --git a/devel/gen_ker_horner_C_code.m b/devel/gen_ker_horner_C_code.m deleted file mode 100644 index 0519c822e..000000000 --- a/devel/gen_ker_horner_C_code.m +++ /dev/null @@ -1,50 +0,0 @@ -function str = gen_ker_horner_C_code(w,d,be,o) -% GEN_KER_HORNER_C_CODE Write C code strings for Horner eval of ES kernel -% -% str = gen_ker_horner_C_code(w,d,be,o) -% -% Inputs: -% w = integer kernel width in grid points, eg 10 -% d = poly degree to keep, eg 13 -% beta = kernel parameter, around 2.3*w -% opts - optional struct (unused; could switch to cosh kernel variant, etc..) -% -% Outputs: -% str = length-w cell array of C code strings to eval each segment of kernel -% -% Also see: KER_PPVAL_COEFF_MAT, FIG_SPEED_KER_PPVAL (which tests acc too) -% -% Note: # flops is same as filling a col vec of [1;z;z^2;..] & doing small BLAS2 -% but that might be a bit faster; not sure. Stuck to simple Horner for now, -% not exploiting that there are w calls to different poly's w/ *same* z arg. - -% Barnett 4/23/18. -if nargin==0, test_gen_ker_horner_C_code; return; end -if nargin<4, o=[]; end - -C = ker_ppval_coeff_mat(w,d,be,o); -str = cell(w,1); -for i=1:w % loop over segments of kernel - s = sprintf('ker[%d] = ',i-1); - for n=1:d - s = [s sprintf('%.16E + z*(',C(n,i))]; % (n-1)th coeff for i'th segment - end - s = [s sprintf('%.16E)',C(end,i))]; - for n=1:d-1, s = [s sprintf(')')]; end % close all parens - s = [s sprintf(';\n')]; % terminate the C line, CR - str{i} = s; -end - -%%%%%%%% -function test_gen_ker_horner_C_code % writes C code to file but doesn't test. -w=13; d=15; % pick a single kernel width and degree to write code for -%w=7; d=10; -%w=2; d=5; -beta=2.3*w; -str = gen_ker_horner_C_code(w,d,beta); -% str{:} -fnam = sprintf('ker_horner_w%d.c',w); -fid = fopen(fnam,'w'); -for i=1:numel(str); fwrite(fid,str{i}); end -fclose(fid); -system(['more ' fnam]) diff --git a/devel/gen_ker_horner_loop_C_code.m b/devel/gen_ker_horner_loop_C_code.m index 12fe74baa..e2dd1b75a 100644 --- a/devel/gen_ker_horner_loop_C_code.m +++ b/devel/gen_ker_horner_loop_C_code.m @@ -5,11 +5,12 @@ % % Inputs: % w = integer kernel width in grid points, eg 10 -% d = poly degree to keep, eg 13 -% beta = kernel parameter, around 2.3*w +% d = 0 (auto), or poly degree to keep, eg 13. (passed to ker_ppval_coeff_mat) +% beta = kernel parameter, around 2.3*w (for upsampfac=2) % opts - optional struct, with fields: % wpad - if true, pad the number of kernel eval (segments) to w=4n % for SIMD speed, esp. w/ GCC<=5.4 +% cutoff - desired coeff cutoff for this kernel, needed when d=0 % [ideas: could use to switch to cosh kernel variant, etc..] % % Outputs: @@ -23,18 +24,20 @@ % (Horner can't be vectorized in the degree direction; Estrin was no faster.) % Ludvig af Klinteberg 4/25/18, based on Barnett 4/23/18. Ludvig wpad 1/31/20. +% Barnett fixed bug where degree was d-1 not d throughout; auto-d opt, 7/22/24. if nargin==0, test_gen_ker_horner_loop_C_code; return; end if nargin<4, o=[]; end C = ker_ppval_coeff_mat(w,d,be,o); -str = cell(d+1,1); +if d==0, d = size(C,2)-1; end +str = cell(d+2,1); if isfield(o,'wpad') && o.wpad width = 4*ceil(w/4); C = [C zeros(size(C,1),width-w)]; % pad coeffs w/ 0, up to multiple of 4 else width = w; end -for n=1:d % loop over poly coeff powers +for n=1:d+1 % loop over poly coeff powers s = sprintf('FLT c%d[] = {%.16E',n-1, C(n,1)); for i=2:width % loop over segments s = sprintf('%s, %.16E', s, C(n,i)); @@ -43,21 +46,21 @@ end s = sprintf('for (int i=0; i<%d; i++) ker[i] = ',width); -for n=1:d-1 +for n=1:d s = [s sprintf('c%d[i] + z*(',n-1)]; % (n-1)th coeff for i'th segment end -s = [s sprintf('c%d[i]',d-1)]; -for n=1:d-1, s = [s sprintf(')')]; end % close all parens +s = [s sprintf('c%d[i]',d)]; +for n=1:d, s = [s sprintf(')')]; end % close all parens s = [s sprintf(';\n')]; % terminate the C line, CR -str{d+1} = s; +str{d+2} = s; %%%%%%%% function test_gen_ker_horner_loop_C_code % writes C code to file, doesn't test -w=13; d=16; % pick a single kernel width and degree to write code for +w=13; d=0; opts.cutoff = 1e-12; % pick a width and cutoff for degree +beta=2.3*w; % implies upsampfac=2 %w=7; d=11; %w=2; d=5; -beta=2.3*w; -str = gen_ker_horner_loop_C_code(w,d,beta); +str = gen_ker_horner_loop_C_code(w,d,beta,opts); % str{:} fnam = sprintf('ker_horner_w%d.c',w); fid = fopen(fnam,'w'); diff --git a/devel/gen_ker_horner_loop_cpp_code.m b/devel/gen_ker_horner_loop_cpp_code.m new file mode 100644 index 000000000..e8d698f88 --- /dev/null +++ b/devel/gen_ker_horner_loop_cpp_code.m @@ -0,0 +1,70 @@ +function str = gen_ker_horner_loop_cpp_code(w,d,be,o) +% GEN_KER_HORNER_LOOP_CPP_CODE Write C++ for piecewise poly coeffs of kernel +% +% str = gen_ker_horner_loop_cpp_code(w,d,be,o) +% +% Inputs: +% w = integer kernel width in grid points, eg 10 +% d = 0 for auto, else poly degree to keep, eg 13. (will give # coeffs nc=d+1) +% beta = kernel parameter, around 2.3*w (upsampfac=2 only) +% opts - optional struct, with fields: [none for now]. +% +% Outputs: +% str = cell array of C++ code strings to define (d+1)*w static coeffs array, +% as in each w-specific block in ../src/ker_horner_allw_loop_constexpr.h +% +% Also see: KER_PPVAL_COEFF_MAT, FIG_SPEED_KER_PPVAL (which tests acc too) +% GEN_KER_HORNER_CPP_HEADER +% +% Notes: +% +% It exploits that there are w calls to different poly's w/ *same* z arg, writing +% this as a loop. This allows the kernel evals at one z to be a w*nc mat-vec. +% The xsimd code which uses this (see spreadinterp.cpp) is now too elaborate to +% explain here. +% +% Changes from gen_ker_horner_loop_C_code.m: +% i) a simple C++ style 2D array is written, with the w-direction fast, poly coeff +% direction slow. (It used to be a list of 1D arrays plus Horner eval code.) +% ii) coeffs are now ordered c_d,c_{d-1},...,c_0, where degree d=nc-1. (Used +% to be reversed.) +% +% Ideas: could try PSWF, cosh kernel ES variant, Reinecke tweaked-power ES +% variant, etc.. + +% Ludvig af Klinteberg 4/25/18, based on Barnett 4/23/18. Ludvig wpad 1/31/20. +% Barnett redo for Barbone templated arrays, no wpad, 7/16/24. +% hardcoded outer nc array size, 7/22/24. + +if nargin==0, test_gen_ker_horner_loop_cpp_code; return; end +if nargin<4, o=[]; end + +C = ker_ppval_coeff_mat(w,d,be,o); +if d==0, d = size(C,2)-1; end +nc = d+1; +str = cell(nc+2,1); % one coeff per line + one return and one close-paren line +% code to open the templated array... why two {{? (some C++ ambiguity thing) +str{1} = sprintf(' return std::array, %d> {{\n', nc); +for n=1:d+1 % loop over poly coeff powers 0,1,..,d + % sprintf implicitly loops over fine-grid interpolation intervals 1:w... + coeffrow = sprintf('%.16E, ', C(n,:)); + coeffrow = coeffrow(1:end-2); % easy kill trailing comma (but allowed in C++) + str{d+3-n} = sprintf(' {%s},\n', coeffrow); % leave outer trailing comma +end +str{nc+2} = sprintf(' }};\n'); % terminate the array (two braces) + + +%%%%%%%% +function test_gen_ker_horner_loop_cpp_code % writes code to file, doesn't test +w=13; d=w+1; % pick a single kernel width and degree to write code for +%w=7; d=11; +%w=2; d=5; +beta=2.3*w; % upsampfac=2 only +str = gen_ker_horner_loop_cpp_code(w,d,beta); +% str{:} +% check write and read to file... +fnam = sprintf('ker_horner_w%d.cpp',w); +fid = fopen(fnam,'w'); +for i=1:numel(str); fwrite(fid,str{i}); end +fclose(fid); +system(['more ' fnam]) diff --git a/devel/get_degree_and_beta.m b/devel/get_degree_and_beta.m new file mode 100644 index 000000000..a76bf509c --- /dev/null +++ b/devel/get_degree_and_beta.m @@ -0,0 +1,41 @@ +function [d,beta] = get_degree_and_beta(w,upsampfac) +% GET_DEGREE_AND_BETA defines degree & beta from w & upsampfac +% +% [d,beta] = get_degree_and_beta(w,upsampfac) +% +% Universal definition for piecewise poly degree chosen for kernel +% coeff generation by matlab, and the ES kernel beta parameter. +% The map from tol to width w must match code in spreadinterp used to +% choose w. +% +% Used by all other *.m codes for generating coeffs. +% +% To test: use KER_PPVAL_COEFF_MAT self-test +% +% To verify accuracy in practice, compile FINUFFT CPU then run +% test/checkallaccs.sh and matlab/test/fig_accuracy.m +% +% Also see: REVERSE_ENGINEER_TOL, KER_PPVAL_COEFF_MAT + +% Barnett 7/22/24 +if upsampfac==0.0, upsampfac=2.0; end + +% if d set to 0 in following, means it gets auto-chosen... +if upsampfac==2 % hardwire the betas for this default case + betaoverws = [2.20 2.26 2.38 2.30]; % must match setup_spreader + beta = betaoverws(min(4,w-1)) * w; % uses last entry for w>=5 + d = w + 1 + (w<=7) - (w==2); % between 1-2 more degree than w. tweak +elseif upsampfac==1.25 % use formulae, must match params in setup_spreader + gamma=0.97; % safety factor + betaoverws = gamma*pi*(1-1/(2*upsampfac)); % from cutoff freq formula + beta = betaoverws * w; + d = ceil(0.7*w+1.3); % less, since beta smaller. tweak + %d = 0; % auto-choose override? No, too much jitter. +end + +if d==0 + tol = reverse_engineer_tol(w,upsampfac); + opts.cutoff = 0.5 * tol; % fudge to get more poly-approx acc than tol + C = ker_ppval_coeff_mat(w,0,beta,opts); % do solve merely to get d + d = size(C,1)-1; % extract the auto-chosen d +end diff --git a/devel/ker_ppval_coeff_mat.m b/devel/ker_ppval_coeff_mat.m index 3026020c9..218d42393 100644 --- a/devel/ker_ppval_coeff_mat.m +++ b/devel/ker_ppval_coeff_mat.m @@ -5,22 +5,29 @@ % % Inputs: % w = integer kernel width in grid points, eg 10 -% d = poly degree to keep, eg 13 +% d = enforce poly degree to keep (eg 13), or if 0, uses opts.tol to +% make automatic decision. % beta = kernel parameter, around 2.3*w -% opts - optional struct +% opts - optional struct: +% opts.cutoff = smallest coeff size, needed only to pick d automatically % Outputs: % C = (d+1)*w double-precision matrix of coeffs for ppval % Each col is (c_0...c_d) in c_0 + c_1z + ... + c_dz^d where |z|<=1 % is the local variable in 1/w units about each grid pt. +% +% Notes: the self-test of this function is useful to tweak d (degree) for +% each w. Also once FINUFFT CPU compiled, run test/checkallaccs.sh +% or matlab/test/fig_accuracy.m. -% Barnett 4/23/18 +% Barnett 4/23/18. Test all w, and rescale to 1 max val, 7/21/24 +% auto-picking d, 7/22/24. if nargin==0, test_ker_ppval_coeff_mat; return; end if nargin<4, o=[]; end -f = @(z) exp(be*sqrt(1-z.^2)); % ES kernel on [-1,1], handles complex +f = @(z) exp(be*(sqrt(1-z.^2)-1)); % ES kernel on [-1,1], handles complex fitd = 20; % fit degree -m = 7; % colloc pts per wall (4m>deg) +m = 7; % colloc pts per wall (4m>deg). Odd is better, hits Re axis h = 1/w; % size of half a grid spacing, in units where [-1,1] is kernel supp. C = nan(fitd+1,w); % alloc output % set up collocation linear sys on a box... @@ -34,25 +41,40 @@ R(:,i) = f(xi+z*h); end C = V\R; % do all solves for poly coeffs (multiple RHS) -C = C(1:d+1,:); % keep only up to requested eval degree (coeffs 0 to d) +if d>0 + C = C(1:d+1,:); % keep only up to requested eval degree (coeffs 0 to d) +elseif d==0 % auto-pick d + if ~isfield(o,'cutoff'), error('opts.cutoff must be set when d=0!'); end + rowsiz = max(abs(C),[],2); % worst coeff across all w intervals + nc = max(find(rowsiz>o.cutoff)); + C = C(1:nc,:); + d = nc-1; + %fprintf('\t w=%d\tcutoff=%.3g:\tpicking d=%d\n',w,o.cutoff,d) +else, warning('unknown d<0; not trimming rows of C coeffs matrix!'); +end + %%%%%% function test_ker_ppval_coeff_mat -w=7; d=11; -%w=13; d=15; -beta=2.3*w; % sigma=2 -%beta=1.83*w; w=7; d=9; % sigma=5/4 -f = @(z) exp(beta*sqrt(1-z.^2)); % must match the above - -C = ker_ppval_coeff_mat(w,d,beta); -%C/exp(beta) % shows that no advantage to truncating any tails... -t = linspace(-1,1,30); % list of offsets in 1/w units -h = 1/w; -maxerr = 0; % track max error of evaluation in pts in all intervals -for i=1:w - xi = -1+h*(2*i-1); % center of the i'th expansion, in [-1,1] supp. - erri = max(abs(f(xi+t*h) - polyval(C(end:-1:1,i),t))); - erri = erri / exp(beta); % scale to rel err to kernel peak - maxerr = max(erri,maxerr); +for sigma = [2.0, 1.25] % upsampfacs + fprintf('upsampfac = %g...\n',sigma) + for w=2:16 % range of kernel ns in C++ code + [d, beta] = get_degree_and_beta(w, sigma); % get actual d (>0) + C = ker_ppval_coeff_mat(w,d,beta); + %C/exp(beta) % shows that no advantage to truncating any tails... (eh?) + f = @(z) exp(beta*(sqrt(1-z.^2)-1)); % ES: must match the above, to test + t = linspace(-1,1,30); % list of offsets in 1/w units + h = 1/w; + maxerr = 0; % track max error of evaluation in pts in all intervals + for i=1:w + xi = -1+h*(2*i-1); % center of the i'th expansion, in [-1,1] supp. + erri = max(abs(f(xi+t*h) - polyval(C(end:-1:1,i),t))); + % erri = erri / exp(beta); % scale to rel err to kernel peak (now 1) + maxerr = max(erri,maxerr); + end + tol = reverse_engineer_tol(w, sigma); % merely for comparison... + fprintf('w=%d\t d=%d\t tol=%.g\t maxerr=%.3g \tmaxerr/tol=%.3g\n',... + w,d,tol,maxerr,maxerr/tol) + end end -maxerr + diff --git a/devel/reverse_engineer_tol.m b/devel/reverse_engineer_tol.m new file mode 100644 index 000000000..a57f013ab --- /dev/null +++ b/devel/reverse_engineer_tol.m @@ -0,0 +1,15 @@ +function tol = reverse_engineer_tol(w,upsampfac) +% REVERSE_ENGINEER_TOL reconstructs tolerance from width and upsampfac +% +% tol = reverse_engineer_tol(w,upsampfac) +% +% For fixed upsampfac (aka sigma), must be the inverse function for +% how w is chosen from tol in spreadinterp.cpp:setup_spreader() + +% Barnett 7/22/24 + +if upsampfac==2.0 + tol = 10^(1-w); +else + tol = exp(-pi*w*sqrt(1-1/upsampfac)); % generic case, covers sigma=1.25 +end diff --git a/docs/devnotes.rst b/docs/devnotes.rst index 57b400f16..11dca3e95 100644 --- a/docs/devnotes.rst +++ b/docs/devnotes.rst @@ -24,6 +24,14 @@ Developer notes * For testing and performance measuring routines see ``test/README`` and ``perftest/README``. We need more of the latter, eg, something making performance graphs that enable rapid eyeball comparison of various settings/machines. Marco is working on that. +* The kernel function in spreadinterp is evaluated via piecewise-polynomial approximation (Horner's rule). The code for this is auto-generated in MATLAB, for all upsampling factors. There are two versions supported: + + - 2018--2024 vintage: no explicit SIMD vectorization, C code is generated code for the Horner evaluation loop, by running from MATLAB `gen_all_horner_C_code.m` + + - post-2024 vintage: explicit SIMD and many other acceleration tricks, and the generated code is a static C++ array of coefficients, and their sizes (`nc` or number of coefficients) for each width `w`. Run from MATLAB `gen_ker_horner_loop_cpp_code.m` + + See `devel/README` for more details. The ES kernel coefficient and poly approx degree for both of the above are defined in a single location, `devel/get_degree_and_beta.m`, which must match the C++ `setup_spreader()` function. + * Continuous Integration (CI). See files for this in ``.github/workflows/``. It currently tests the default ``makefile`` settings in linux, and three other ``make.inc.*`` files covering OSX and Windows (MinGW). CI does not test build the variant OMP=OFF. The dev should test these locally. Likewise, the Julia wrapper is separate and thus not tested in CI. We have added ``JenkinsFile`` for the GPU CI via python wrappers. * **Installing MWrap**. This is needed only for experts to rebuild the matlab/octave interfaces. diff --git a/matlab/test/fig_accuracy.m b/matlab/test/fig_accuracy.m index ed789632f..9a8ddac09 100644 --- a/matlab/test/fig_accuracy.m +++ b/matlab/test/fig_accuracy.m @@ -1,24 +1,33 @@ % finufft accuracy test figs, deciding err norm to report. Barnett 6/6/17 +% Changed to rel 2-norm, 7/22/24. clear %M=1e5; N=1e2; % M = # NU pts, N = # modes. Note: keep MN<1e8 for now -M=1e4; N=1e3; -%M=1e2; N=1e5; % confusion about N vs M controlling err prefac +M=1e4; N=1e2; % keel N small to see close to epsmach; cond # = O(N) +%M=1e2; N=1e5; % confusion about N vs M controlling err prefac (it's N) isign = +1; % sign of imaginary unit in exponential o.debug = 0; % choose 1 for timing breakdown text output -tols = 10.^(-1:-1:-14); +% use one of these two... +tols = 10.^(-1:-0.02:-15); o.upsampfac = 2.0; +%tols = 10.^(-1:-0.02:-10); o.upsampfac=1.25; % for lowupsampfac + +% other expts... %tols = 1e-6; +%tols = 10.^(-1:-1:-10); o.upsampfac=1.25; % for lowupsampfac + errs = nan*tols; for t=1:numel(tols) x = pi*(2*rand(1,M)-1); c = randn(1,M)+1i*randn(1,M); - f = finufft1d1(x,c,isign,tols(t),N,o); ns = (ceil(-N/2):floor((N-1)/2))'; % mode indices, col vec + f = finufft1d1(x,c,isign,tols(t),N,o); fe = exp(1i*isign*ns*x) * c.'; % exact (note mat fill, matvec) - errs(t) = max(abs(f(:)-fe(:)))/norm(c,1); % eps as in err analysis... - %p=2; errs(t) = norm(f(:)-fe(:),p)/norm(c,p); % ... or rel p-norm + %errs(t) = max(abs(f(:)-fe(:)))/norm(c,1); % eps as in err analysis... + %p=2; errs(t) = norm(f(:)-fe(:),p)/norm(c,p); % ... or p-norm rel to input + p=2; errs(t) = norm(f(:)-fe(:),p)/norm(fe(:),p); % ... or rel p-norm end figure; loglog(tols,errs,'+'); hold on; plot(tols,tols,'-'); axis tight; xlabel('tol'); ylabel('err'); -title(sprintf('1d1: (maxerr)/||c||_1, M=%d, N=%d\n',M,N)); +%title(sprintf('1d1: (maxerr)/||c||_1, M=%d, N=%d\n',M,N)); +title(sprintf('1d1: ||\tilde f - f||_2/||f||_2, M=%d, N=%d\n',M,N)); diff --git a/src/ker_horner_allw_loop_constexpr.c b/src/ker_horner_allw_loop_constexpr.c new file mode 100644 index 000000000..92a38527c --- /dev/null +++ b/src/ker_horner_allw_loop_constexpr.c @@ -0,0 +1,205 @@ +// Code generated by gen_all_horner_C_code.m in finufft/devel +// Authors: Alex Barnett & Ludvig af Klinteberg. +// (C) The Simons Foundation, Inc. + if constexpr(w==2) { + FLT c0[] = {5.5428559551548429E-01, 5.5428559551548384E-01, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c1[] = {7.0481840008800800E-01, -7.0481840008800789E-01, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c2[] = {-2.2584311526143722E-02, -2.2584311526143454E-02, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c3[] = {-2.5024197515954172E-01, 2.5024197515954183E-01, 0.0000000000000000E+00, 0.0000000000000000E+00}; + for (int i=0; i<4; i++) ker[i] = c0[i] + z*(c1[i] + z*(c2[i] + z*(c3[i]))); + } else if constexpr(w==3) { + FLT c0[] = {1.7787237246937579E-01, 1.0000000000000013E+00, 1.7787237247678458E-01, 0.0000000000000000E+00}; + FLT c1[] = {3.5966530797580987E-01, 2.1212921335912769E-17, -3.5966530796781049E-01, 0.0000000000000000E+00}; + FLT c2[] = {2.0160576446392525E-01, -3.7666666666667292E-01, 2.0160576447145476E-01, 0.0000000000000000E+00}; + FLT c3[] = {-1.7450587318669355E-02, 4.7841151834284663E-18, 1.7450587325767687E-02, 0.0000000000000000E+00}; + FLT c4[] = {-4.2902993854032984E-02, 6.0475925925925544E-02, -4.2902993846219581E-02, 0.0000000000000000E+00}; + FLT c5[] = {-4.5057857403454230E-03, -2.2085344902082910E-17, 4.5057857475245119E-03, 0.0000000000000000E+00}; + for (int i=0; i<4; i++) ker[i] = c0[i] + z*(c1[i] + z*(c2[i] + z*(c3[i] + z*(c4[i] + z*(c5[i]))))); + } else if constexpr(w==4) { + FLT c0[] = {3.9828257752799377E-02, 7.3911656575585805E-01, 7.3911656575585805E-01, 3.9828257752799384E-02}; + FLT c1[] = {1.0749328817387331E-01, 4.5419700247912276E-01, -4.5419700247912287E-01, -1.0749328817387331E-01}; + FLT c2[] = {1.0408888748149286E-01, -1.0268333881994469E-01, -1.0268333881994463E-01, 1.0408888748149286E-01}; + FLT c3[] = {3.7516840869185726E-02, -1.0412335657155609E-01, 1.0412335657155619E-01, -3.7516840869185719E-02}; + FLT c4[] = {-3.5432868834529780E-03, 2.8903049344238094E-03, 2.8903049344237578E-03, -3.5432868834529736E-03}; + FLT c5[] = {-5.7512181801490803E-03, 1.0945950376831749E-02, -1.0945950376831702E-02, 5.7512181801490803E-03}; + FLT c6[] = {-7.3657365672905517E-04, 3.7144674885204070E-04, 3.7144674885202628E-04, -7.3657365672907674E-04}; + for (int i=0; i<4; i++) ker[i] = c0[i] + z*(c1[i] + z*(c2[i] + z*(c3[i] + z*(c4[i] + z*(c5[i] + z*(c6[i])))))); + } else if constexpr(w==5) { + FLT c0[] = {1.0051451410391413E-02, 3.8286382489474302E-01, 1.0000000000000007E+00, 3.8286382489474247E-01, 1.0051451410391420E-02, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c1[] = {3.0826052021380449E-02, 3.8431958613457989E-01, -1.0606460667956290E-16, -3.8431958613457956E-01, -3.0826052021380446E-02, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c2[] = {3.6562231959204307E-02, 7.8509612097392850E-02, -2.3000000000000043E-01, 7.8509612097392975E-02, 3.6562231959204300E-02, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c3[] = {2.0250135419918228E-02, -3.9381037339048575E-02, 2.5392611358194196E-17, 3.9381037339048602E-02, -2.0250135419918248E-02, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c4[] = {4.0593041193018580E-03, -1.6067481167759527E-02, 2.4150000000000067E-02, -1.6067481167759551E-02, 4.0593041193018554E-03, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c5[] = {-9.2488937959280416E-04, 1.2476700479676119E-03, -2.7206380314284564E-17, -1.2476700479676119E-03, 9.2488937959280416E-04, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c6[] = {-5.6059657038176342E-04, 1.2116190166775124E-03, -1.5448333333332248E-03, 1.2116190166775590E-03, -5.6059657038177242E-04, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c7[] = {-3.4201716508580047E-05, 2.3137115416451718E-05, 2.5987213744756162E-17, -2.3137115416372002E-05, 3.4201716508570079E-05, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; + for (int i=0; i<8; i++) ker[i] = c0[i] + z*(c1[i] + z*(c2[i] + z*(c3[i] + z*(c4[i] + z*(c5[i] + z*(c6[i] + z*(c7[i]))))))); + } else if constexpr(w==6) { + FLT c0[] = {2.0875119883113405E-03, 1.5741818314646630E-01, 8.2446837122968764E-01, 8.2446837122968797E-01, 1.5741818314646627E-01, 2.0875119883208733E-03, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c1[] = {7.2383827471879155E-03, 2.0903648995439442E-01, 3.2052935784357639E-01, -3.2052935784357617E-01, -2.0903648995439442E-01, -7.2383827471776269E-03, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c2[] = {1.0180085126333447E-02, 9.2337811484268964E-02, -1.0253741712233809E-01, -1.0253741712233820E-01, 9.2337811484268992E-02, 1.0180085126343141E-02, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c3[] = {7.3669955501269365E-03, 4.9102900025223429E-03, -5.1302324979469460E-02, 5.1302324979469523E-02, -4.9102900025223065E-03, -7.3669955501178136E-03, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c4[] = {2.7444270008043924E-03, -8.0004810696544873E-03, 5.2920367975574324E-03, 5.2920367975573977E-03, -8.0004810696544925E-03, 2.7444270008144425E-03, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c5[] = {3.2622379114950018E-04, -1.8514138516535202E-03, 3.8520985619445395E-03, -3.8520985619445863E-03, 1.8514138516535124E-03, -3.2622379114026403E-04, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c6[] = {-1.2239646122606701E-04, 2.2750660293441327E-04, -1.2702072030312787E-04, -1.2702072030306311E-04, 2.2750660293440248E-04, -1.2239646121695602E-04, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c7[] = {-4.6695893922777881E-05, 1.1717219021518970E-04, -1.8098268625854635E-04, 1.8098268625862607E-04, -1.1717219021518182E-04, 4.6695893931715671E-05, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c8[] = {-1.5875418082720764E-06, 7.2147850126235124E-07, -7.0930078220514644E-08, -7.0930078220514644E-08, 7.2147850127765077E-07, -1.5875417996313146E-06, 0.0000000000000000E+00, 0.0000000000000000E+00}; + for (int i=0; i<8; i++) ker[i] = c0[i] + z*(c1[i] + z*(c2[i] + z*(c3[i] + z*(c4[i] + z*(c5[i] + z*(c6[i] + z*(c7[i] + z*(c8[i])))))))); + } else if constexpr(w==7) { + FLT c0[] = {4.0677823488318105E-04, 5.5714997521829554E-02, 5.1113018541287836E-01, 1.0000000000000004E+00, 5.1113018541287858E-01, 5.5714997521829540E-02, 4.0677823488476019E-04, 0.0000000000000000E+00}; + FLT c1[] = {1.5569364307494555E-03, 8.9228372765634070E-02, 3.5049603091348175E-01, -1.2727752801547551E-16, -3.5049603091348197E-01, -8.9228372765634056E-02, -1.5569364307477628E-03, 0.0000000000000000E+00}; + FLT c2[] = {2.4904843753404821E-03, 5.4888936725282354E-02, 2.4759577399513299E-02, -1.6428571428571420E-01, 2.4759577399513219E-02, 5.4888936725282375E-02, 2.4904843753420958E-03, 0.0000000000000000E+00}; + FLT c3[] = {2.1552691780265211E-03, 1.3627105791872403E-02, -3.3718114813591091E-02, 9.1739351594304141E-17, 3.3718114813591160E-02, -1.3627105791872408E-02, -2.1552691780250184E-03, 0.0000000000000000E+00}; + FLT c4[] = {1.0735311014902873E-03, -7.2030895675482935E-04, -6.6760503000562778E-03, 1.2656705539358897E-02, -6.6760503000563636E-03, -7.2030895675483466E-04, 1.0735311014919515E-03, 0.0000000000000000E+00}; + FLT c5[] = {2.8413019973530621E-04, -1.1175797418592197E-03, 1.3906361031251863E-03, -3.3449040113448959E-17, -1.3906361031251863E-03, 1.1175797418592314E-03, -2.8413019973377808E-04, 0.0000000000000000E+00}; + FLT c6[] = {1.6363160465888369E-05, -1.5802085209242327E-04, 4.4431051893381075E-04, -6.0985626028862202E-04, 4.4431051893372624E-04, -1.5802085209243048E-04, 1.6363160467394535E-05, 0.0000000000000000E+00}; + FLT c7[] = {-1.2513684117292326E-05, 2.9105578584771500E-05, -2.8835295309280147E-05, 3.4204613883790509E-17, 2.8835295309401381E-05, -2.9105578584773161E-05, 1.2513684118771961E-05, 0.0000000000000000E+00}; + FLT c8[] = {-3.2859430043338334E-06, 9.3570096164196706E-06, -1.7015821249913417E-05, 2.0688046128709321E-05, -1.7015821249913417E-05, 9.3570096164234958E-06, -3.2859430029059141E-06, 0.0000000000000000E+00}; + FLT c9[] = {-1.5030958477791755E-08, -9.3540219413709317E-08, 1.3079704875006950E-07, -3.2241315608379925E-17, -1.3079704868363920E-07, 9.3540219416477249E-08, 1.5030959705495632E-08, 0.0000000000000000E+00}; + for (int i=0; i<8; i++) ker[i] = c0[i] + z*(c1[i] + z*(c2[i] + z*(c3[i] + z*(c4[i] + z*(c5[i] + z*(c6[i] + z*(c7[i] + z*(c8[i] + z*(c9[i]))))))))); + } else if constexpr(w==8) { + FLT c0[] = {7.5442178667263954E-05, 1.7659090182402852E-02, 2.6112828482312656E-01, 8.6561421087578294E-01, 8.6561421087578283E-01, 2.6112828482312644E-01, 1.7659090182402852E-02, 7.5442178667263873E-05}; + FLT c1[] = {3.1361556564941533E-04, 3.2518751351035650E-02, 2.4295266212395961E-01, 2.5083142126627189E-01, -2.5083142126627200E-01, -2.4295266212395961E-01, -3.2518751351035650E-02, -3.1361556564941516E-04}; + FLT c2[] = {5.5627094085228127E-04, 2.4604803324737454E-02, 6.5902977410162808E-02, -9.1064379250067509E-02, -9.1064379250067509E-02, 6.5902977410162836E-02, 2.4604803324737447E-02, 5.5627094085228149E-04}; + FLT c3[] = {5.5053208919074686E-04, 9.2359485489686838E-03, -6.2169545154249859E-03, -3.1386277864020484E-02, 3.1386277864020540E-02, 6.2169545154249963E-03, -9.2359485489686872E-03, -5.5053208919074697E-04}; + FLT c4[] = {3.3122072653963831E-04, 1.3353118718124433E-03, -5.9878504390516426E-03, 4.3217905833729652E-03, 4.3217905833728282E-03, -5.9878504390516859E-03, 1.3353118718124383E-03, 3.3122072653963847E-04}; + FLT c5[] = {1.2112223749399396E-04, -2.3174709024353631E-04, -5.1773322458159175E-04, 1.8691284471382202E-03, -1.8691284471382202E-03, 5.1773322458161506E-04, 2.3174709024353533E-04, -1.2112223749399399E-04}; + FLT c6[] = {2.3288943339077674E-05, -1.1810885265513386E-04, 2.1380000655379325E-04, -1.1905274322671857E-04, -1.1905274322666821E-04, 2.1380000655377886E-04, -1.1810885265513567E-04, 2.3288943339077756E-05}; + FLT c7[] = {8.7290223704599643E-08, -9.9551635569511269E-06, 3.9042123573727561E-05, -7.0647330846731457E-05, 7.0647330846733124E-05, -3.9042123573704312E-05, 9.9551635569469747E-06, -8.7290223704651537E-08}; + FLT c8[] = {-1.0444417486660109E-06, 2.8837147790363758E-06, -3.9445588398358392E-06, 1.9505656879865072E-06, 1.9505656879375492E-06, -3.9445588398358392E-06, 2.8837147790380012E-06, -1.0444417486659870E-06}; + FLT c9[] = {-1.9601350641697596E-07, 6.2981383505349922E-07, -1.3252363384678579E-06, 1.9071649677086492E-06, -1.9071649677418643E-06, 1.3252363384844655E-06, -6.2981383506145699E-07, 1.9601350641688405E-07}; + for (int i=0; i<8; i++) ker[i] = c0[i] + z*(c1[i] + z*(c2[i] + z*(c3[i] + z*(c4[i] + z*(c5[i] + z*(c6[i] + z*(c7[i] + z*(c8[i] + z*(c9[i]))))))))); + } else if constexpr(w==9) { + FLT c0[] = {1.3445576990655669E-05, 5.1377966678943553E-03, 1.1569392196071673E-01, 5.9595989228910684E-01, 1.0000000000000004E+00, 5.9595989228910784E-01, 1.1569392196071668E-01, 5.1377966678943891E-03, 1.3445576990655669E-05, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c1[] = {6.0003223623206657E-05, 1.0569385595664994E-02, 1.3202059711663527E-01, 3.1241329121161582E-01, -6.3638764007737742E-17, -3.1241329121161615E-01, -1.3202059711663530E-01, -1.0569385595665030E-02, -6.0003223623206657E-05, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c2[] = {1.1601811379064815E-04, 9.2861699099147117E-03, 5.4760895870332296E-02, -2.7420112488899190E-04, -1.2777777777777782E-01, -2.7420112488923623E-04, 5.4760895870332310E-02, 9.2861699099147411E-03, 1.1601811379064820E-04, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c3[] = {1.2783089927061671E-04, 4.4048543606096746E-03, 6.4505427512762383E-03, -2.6627297241817623E-02, 5.0907892336476291E-17, 2.6627297241817893E-02, -6.4505427512762392E-03, -4.4048543606096851E-03, -1.2783089927061677E-04, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c4[] = {8.8459828362140154E-05, 1.1147546008569563E-03, -2.1200589329645721E-03, -2.9677441441083030E-03, 7.7692043895745341E-03, -2.9677441441080454E-03, -2.1200589329645721E-03, 1.1147546008569587E-03, 8.8459828362140127E-05, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c5[] = {3.9567294647305451E-05, 8.1817980646548685E-05, -7.2116754318329347E-04, 1.0390038161996692E-03, 1.3900173479267018E-17, -1.0390038161999335E-03, 7.2116754318327797E-04, -8.1817980646548685E-05, -3.9567294647305479E-05, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c6[] = {1.1032857092605834E-05, -3.4254477931957202E-05, -1.3557143976035342E-05, 1.8667778536559447E-04, -2.9974999576615630E-04, 1.8667778536541582E-04, -1.3557143976042535E-05, -3.4254477931960353E-05, 1.1032857092605854E-05, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c7[] = {1.5345430093717280E-06, -9.9308189188290649E-06, 2.3762810604644528E-05, -2.4017602201901366E-05, -1.1468142860888204E-17, 2.4017602202089031E-05, -2.3762810604641208E-05, 9.9308189188344622E-06, -1.5345430093717798E-06, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c8[] = {-8.1737159283255514E-08, -4.1540916378286498E-07, 2.6668107554239935E-06, -6.3261434127972289E-06, 8.2578681450047054E-06, -6.3261434126197552E-06, 2.6668107554392931E-06, -4.1540916378625952E-07, -8.1737159283261483E-08, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c9[] = {-7.3256982980632681E-08, 2.3321978963689725E-07, -4.0030411107271311E-07, 3.4388260962519006E-07, -1.6867455797025957E-17, -3.4388260995180576E-07, 4.0030411105472155E-07, -2.3321978963603227E-07, 7.3256982980605642E-08, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c10[] = {-1.0121400696639382E-08, 3.6191328859115424E-08, -8.7258577130274595E-08, 1.4622014472389451E-07, -1.7333902183589538E-07, 1.4622014475109679E-07, -8.7258577123989584E-08, 3.6191328857387053E-08, -1.0121400696607466E-08, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; + for (int i=0; i<12; i++) ker[i] = c0[i] + z*(c1[i] + z*(c2[i] + z*(c3[i] + z*(c4[i] + z*(c5[i] + z*(c6[i] + z*(c7[i] + z*(c8[i] + z*(c9[i] + z*(c10[i])))))))))); + } else if constexpr(w==10) { + FLT c0[] = {2.3186292807626206E-06, 1.3952040327729878E-03, 4.5894237568906808E-02, 3.4666431215091636E-01, 8.9110862394332080E-01, 8.9110862394332024E-01, 3.4666431215091609E-01, 4.5894237568906815E-02, 1.3952040327729794E-03, 2.3186292807626312E-06, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c1[] = {1.1010978063160392E-05, 3.1454190365986022E-03, 6.0943215953720313E-02, 2.5074802988370321E-01, 2.0598750885032696E-01, -2.0598750885032721E-01, -2.5074802988370321E-01, -6.0943215953720313E-02, -3.1454190365985909E-03, -1.1010978063160389E-05, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c2[] = {2.2925449299630729E-05, 3.1050615653861954E-03, 3.2337657329423494E-02, 4.4760550762170469E-02, -8.0226193254406372E-02, -8.0226193254406220E-02, 4.4760550762170517E-02, 3.2337657329423487E-02, 3.1050615653861859E-03, 2.2925449299630675E-05, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c3[] = {2.7622345748507502E-05, 1.7317590416004948E-03, 7.6620063086756491E-03, -9.8393115612840920E-03, -2.1163068654269146E-02, 2.1163068654269441E-02, 9.8393115612840434E-03, -7.6620063086756422E-03, -1.7317590416004902E-03, -2.7622345748507452E-05, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c4[] = {2.1363614860997127E-05, 5.7553475552091639E-04, 1.4813144535930596E-04, -4.1113061120761881E-03, 3.3662735809591028E-03, 3.3662735809590343E-03, -4.1113061120763173E-03, 1.4813144535930382E-04, 5.7553475552091368E-04, 2.1363614860997080E-05, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c5[] = {1.1063475580065303E-05, 1.0180053030149664E-04, -3.4137441280837188E-04, -4.9828659222659531E-05, 1.0442648308816227E-03, -1.0442648308818948E-03, 4.9828659222721751E-05, 3.4137441280836993E-04, -1.0180053030149543E-04, -1.1063475580065282E-05, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c6[] = {3.8359011440648835E-06, 1.3049698816908465E-06, -6.3791463619209036E-05, 1.4528730872073815E-04, -8.6630472952427834E-05, -8.6630472952399048E-05, 1.4528730872079033E-04, -6.3791463619214443E-05, 1.3049698816899472E-06, 3.8359011440648708E-06, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c7[] = {8.3366418668162695E-07, -3.5785601754620480E-06, 2.4539930904838030E-06, 1.2754336575757957E-05, -3.3000414536134188E-05, 3.3000414536278678E-05, -1.2754336575753804E-05, -2.4539930904804814E-06, 3.5785601754631898E-06, -8.3366418668162208E-07, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c8[] = {8.0572098823824191E-08, -6.8352224328347800E-07, 2.0695541423476481E-06, -2.9709579577199207E-06, 1.5005770225504653E-06, 1.5005770225994236E-06, -2.9709579578790350E-06, 2.0695541423461179E-06, -6.8352224328405176E-07, 8.0572098823813736E-08, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c9[] = {-1.0412910456846279E-08, -3.6228831478765483E-09, 1.3932530225087088E-07, -4.5071262435551458E-07, 7.5149884412259115E-07, -7.5149884433295379E-07, 4.5071262442194489E-07, -1.3932530225640674E-07, 3.6228831474873082E-09, 1.0412910456862496E-08, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c10[] = {-4.4291858217017104E-09, 1.5904364892171725E-08, -3.2603275107603078E-08, 3.8190045579900928E-08, -1.7631718328624946E-08, -1.7631718392731933E-08, 3.8190045599384427E-08, -3.2603275104460579E-08, 1.5904364893271601E-08, -4.4291858217152902E-09, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c11[] = {-4.4040059171412067E-10, 1.7857872824825793E-09, -4.9203237628693688E-09, 9.5125261839819949E-09, -1.3157194845364040E-08, 1.3157194812996284E-08, -9.5125262237318697E-09, 4.9203237570488512E-09, -1.7857872831569075E-09, 4.4040059171633886E-10, 0.0000000000000000E+00, 0.0000000000000000E+00}; + for (int i=0; i<12; i++) ker[i] = c0[i] + z*(c1[i] + z*(c2[i] + z*(c3[i] + z*(c4[i] + z*(c5[i] + z*(c6[i] + z*(c7[i] + z*(c8[i] + z*(c9[i] + z*(c10[i] + z*(c11[i]))))))))))); + } else if constexpr(w==11) { + FLT c0[] = {3.8884809238313185E-07, 3.5785567372179962E-04, 1.6654951019551330E-02, 1.7692785324424576E-01, 6.5593328211813140E-01, 1.0000000000000002E+00, 6.5593328211813118E-01, 1.7692785324424568E-01, 1.6654951019551327E-02, 3.5785567372179962E-04, 3.8884809238312624E-07, 0.0000000000000000E+00}; + FLT c1[] = {1.9516358260453373E-06, 8.7214421096705637E-04, 2.4929466432368100E-02, 1.5885079249667186E-01, 2.7894884556454935E-01, -4.2425842671825161E-17, -2.7894884556454946E-01, -1.5885079249667192E-01, -2.4929466432368107E-02, -8.7214421096705637E-04, -1.9516358260453182E-06, 0.0000000000000000E+00}; + FLT c2[] = {4.3353827605930494E-06, 9.4705645354715528E-04, 1.5700144896729010E-02, 4.8428271550326779E-02, -1.2807080799297177E-02, -1.0454545454545444E-01, -1.2807080799297078E-02, 4.8428271550326855E-02, 1.5700144896729010E-02, 9.4705645354715518E-04, 4.3353827605930206E-06, 0.0000000000000000E+00}; + FLT c3[] = {5.6395387871289762E-06, 5.9760549110825397E-04, 5.0911332059142217E-03, 1.6690038662948302E-03, -2.1030028251698030E-02, -6.2059675980830466E-17, 2.1030028251698099E-02, -1.6690038662947877E-03, -5.0911332059142252E-03, -5.9760549110825386E-04, -5.6395387871289448E-06, 0.0000000000000000E+00}; + FLT c4[] = {4.7836299264887183E-06, 2.3732554180006435E-04, 7.1846854433599121E-04, -2.2660086673713040E-03, -1.3190061226034701E-03, 5.2488730277989084E-03, -1.3190061226034527E-03, -2.2660086673713599E-03, 7.1846854433598741E-04, 2.3732554180006416E-04, 4.7836299264886963E-06, 0.0000000000000000E+00}; + FLT c5[] = {2.7801202330030060E-06, 5.8401836435976375E-05, -5.7255962675852127E-05, -4.1058481683293790E-04, 7.4543249761820096E-04, -1.1763859565712905E-17, -7.4543249761829431E-04, 4.1058481683289903E-04, 5.7255962675851158E-05, -5.8401836435976402E-05, -2.7801202330029937E-06, 0.0000000000000000E+00}; + FLT c6[] = {1.1248609988572039E-06, 7.1593996360417439E-06, -3.7923443960739139E-05, 2.8219312687374916E-05, 8.5797383067766139E-05, -1.6875309167107462E-04, 8.5797383067713081E-05, 2.8219312687382113E-05, -3.7923443960742731E-05, 7.1593996360415194E-06, 1.1248609988571965E-06, 0.0000000000000000E+00}; + FLT c7[] = {3.1074712008817151E-07, -3.7942806006715527E-07, -4.2327710785732912E-06, 1.4518421536638065E-05, -1.6373413879626877E-05, -2.5348737439255354E-17, 1.6373413879625217E-05, -1.4518421536614087E-05, 4.2327710785712152E-06, 3.7942806006725903E-07, -3.1074712008816986E-07, 0.0000000000000000E+00}; + FLT c8[] = {5.3160526822192399E-08, -2.9438470061320831E-07, 4.4816653818040024E-07, 4.9835853876401780E-07, -2.6602444110713340E-06, 3.9090815375281570E-06, -2.6602444110835736E-06, 4.9835853872423912E-07, 4.4816653818231268E-07, -2.9438470061324415E-07, 5.3160526822193524E-08, 0.0000000000000000E+00}; + FLT c9[] = {3.1778958300840877E-09, -3.9044067083629674E-08, 1.4726158788157950E-07, -2.7451209287892671E-07, 2.4544112211910511E-07, -1.2096711311755274E-17, -2.4544112210526550E-07, 2.7451209284571153E-07, -1.4726158788330946E-07, 3.9044067083510739E-08, -3.1778958300837498E-09, 0.0000000000000000E+00}; + FLT c10[] = {-8.6163117991759351E-10, 1.2292710052307758E-09, 4.9928263030434056E-09, -2.5746199383297511E-08, 5.5054682067879709E-08, -6.9606951448910763E-08, 5.5054682119416694E-08, -2.5746199404038006E-08, 4.9928263027291555E-09, 1.2292710051522133E-09, -8.6163117991951154E-10, 0.0000000000000000E+00}; + FLT c11[] = {-2.3293080872927463E-10, 9.3461130373861974E-10, -2.2220140858706851E-09, 3.2420144189661432E-09, -2.5573586925383353E-09, -5.6612065112108297E-17, 2.5573586278028237E-09, -3.2420144306071784E-09, 2.2220140837412273E-09, -9.3461130374749249E-10, 2.3293080872975987E-10, 0.0000000000000000E+00}; + FLT c12[] = {-1.6776727231328416E-11, 7.5440974158024552E-11, -2.3911386524068553E-10, 5.3207180481239914E-10, -8.5057642651644847E-10, 9.9272871999260090E-10, -8.5057648776788347E-10, 5.3207179256211214E-10, -2.3911386498547126E-10, 7.5440974102196413E-11, -1.6776727230829949E-11, 0.0000000000000000E+00}; + for (int i=0; i<12; i++) ker[i] = c0[i] + z*(c1[i] + z*(c2[i] + z*(c3[i] + z*(c4[i] + z*(c5[i] + z*(c6[i] + z*(c7[i] + z*(c8[i] + z*(c9[i] + z*(c10[i] + z*(c11[i] + z*(c12[i])))))))))))); + } else if constexpr(w==12) { + FLT c0[] = {6.3667715563015570E-08, 8.7461142088576766E-05, 5.6146669497086606E-03, 8.1271316412301384E-02, 4.1627261402765736E-01, 9.0846375182673733E-01, 9.0846375182673733E-01, 4.1627261402765731E-01, 8.1271316412301550E-02, 5.6146669497086693E-03, 8.7461142088576834E-05, 6.3667715563034920E-08}; + FLT c1[] = {3.3587389488258577E-07, 2.2809471090022899E-04, 9.2744480587562007E-03, 8.5676487647660032E-02, 2.4720659158040617E-01, 1.7472997738461996E-01, -1.7472997738462001E-01, -2.4720659158040628E-01, -8.5676487647660143E-02, -9.2744480587562180E-03, -2.2809471090022904E-04, -3.3587389488256655E-07}; + FLT c2[] = {7.9035220764954430E-07, 2.6846594761214740E-04, 6.6557324960729147E-03, 3.4792641812076711E-02, 2.9454899103693734E-02, -7.1172529707069124E-02, -7.1172529707069096E-02, 2.9454899103693782E-02, 3.4792641812076718E-02, 6.6557324960729259E-03, 2.6846594761214735E-04, 7.9035220764956854E-07}; + FLT c3[] = {1.0993606197695949E-06, 1.8716155179384023E-04, 2.6329045000561338E-03, 5.3754303637599914E-03, -1.0591878410592578E-02, -1.5228395084945702E-02, 1.5228395084945730E-02, 1.0591878410592587E-02, -5.3754303637599428E-03, -2.6329045000561338E-03, -1.8716155179384034E-04, -1.0993606197695828E-06}; + FLT c4[] = {1.0091198513153350E-06, 8.4812954286468410E-05, 5.7431140218944536E-04, -5.0274672420764957E-04, -2.8008958990917753E-03, 2.6435090762446183E-03, 2.6435090762445667E-03, -2.8008958990918438E-03, -5.0274672420767526E-04, 5.7431140218944330E-04, 8.4812954286468437E-05, 1.0091198513153600E-06}; + FLT c5[] = {6.4507244019416563E-07, 2.5481132674301245E-05, 4.2795619387511915E-05, -3.0197159708155482E-04, 1.1080610219043500E-04, 6.4144454802694513E-04, -6.4144454802697625E-04, -1.1080610219045833E-04, 3.0197159708158204E-04, -4.2795619387510939E-05, -2.5481132674301316E-05, -6.4507244019415007E-07}; + FLT c6[] = {2.9426545129495859E-07, 4.7724106401924093E-06, -1.1001642128367906E-05, -2.6869692251292144E-05, 9.4483235217683692E-05, -6.1678458203290321E-05, -6.1678458203254352E-05, 9.4483235217685495E-05, -2.6869692251315525E-05, -1.1001642128368805E-05, 4.7724106401924229E-06, 2.9426545129497829E-07}; + FLT c7[] = {9.5799843879056626E-08, 3.7784160107118267E-07, -3.2256313018480346E-06, 5.0144058082789751E-06, 3.4886031174209264E-06, -1.7411974954214207E-05, 1.7411974954235796E-05, -3.4886031174051491E-06, -5.0144058082478364E-06, 3.2256313018492801E-06, -3.7784160107122159E-07, -9.5799843879039130E-08}; + FLT c8[] = {2.1473864761678232E-08, -5.7414008446893210E-08, -2.0134799316449521E-07, 1.1145247706155282E-06, -1.8840465966169550E-06, 1.0067804560971022E-06, 1.0067804560971022E-06, -1.8840465966230748E-06, 1.1145247706170582E-06, -2.0134799316564268E-07, -5.7414008446863325E-08, 2.1473864761695973E-08}; + FLT c9[] = {2.8867786924316934E-09, -2.0015791402110268E-08, 4.5306507659307604E-08, -7.8859059636103066E-09, -1.5755151475869637E-07, 3.4270221889093394E-07, -3.4270221896290014E-07, 1.5755151472824914E-07, 7.8859059580744467E-09, -4.5306507657318156E-08, 2.0015791402056882E-08, -2.8867786924176715E-09}; + FLT c10[] = {6.9986758891654079E-11, -1.8486004429655807E-09, 8.7658205605928853E-09, -2.0364661375797448E-08, 2.5396405344356160E-08, -1.2044441220062096E-08, -1.2044441164754107E-08, 2.5396405365096656E-08, -2.0364661348771956E-08, 8.7658205579217619E-09, -1.8486004429017487E-09, 6.9986758906816106E-11}; + FLT c11[] = {-5.6296594748046544E-11, 1.4066781263743013E-10, 4.6947620085301740E-11, -1.1526063790854956E-09, 3.3027593311030557E-09, -5.2174001589202684E-09, 5.2174000697669761E-09, -3.3027593717047144E-09, 1.1526063504087998E-09, -4.6947618097807960E-11, -1.4066781268623019E-10, 5.6296594761372986E-11}; + FLT c12[] = {-1.0870401168050591E-11, 4.8044744326063225E-11, -1.3004175788816287E-10, 2.2570502165107441E-10, -2.4006684671217922E-10, 1.0597990739279489E-10, 1.0597992372651088E-10, -2.4006685283732272E-10, 2.2570503824000470E-10, -1.3004176146116325E-10, 4.8044744334038674E-11, -1.0870401155791457E-11}; + FLT c13[] = {-4.7539080515542580E-13, 2.6787995697670693E-12, -1.0000146136716776E-11, 2.5777402448424271E-11, -4.7463679303544195E-11, 6.4012208879125011E-11, -6.4012248551446094E-11, 4.7463663434615762E-11, -2.5777396894299317E-11, 1.0000149211321660E-11, -2.6787995790652696E-12, 4.7539081135422603E-13}; + for (int i=0; i<12; i++) ker[i] = c0[i] + z*(c1[i] + z*(c2[i] + z*(c3[i] + z*(c4[i] + z*(c5[i] + z*(c6[i] + z*(c7[i] + z*(c8[i] + z*(c9[i] + z*(c10[i] + z*(c11[i] + z*(c12[i] + z*(c13[i]))))))))))))); + } else if constexpr(w==13) { + FLT c0[] = {1.0208956054983660E-08, 2.0506572462261995E-05, 1.7784497194617914E-03, 3.4214490279693019E-02, 2.3443634373410052E-01, 7.0049708882252781E-01, 9.9999999999999956E-01, 7.0049708882252670E-01, 2.3443634373410033E-01, 3.4214490279692915E-02, 1.7784497194617914E-03, 2.0506572462261771E-05, 1.0208956054983704E-08, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c1[] = {5.6353468219321982E-08, 5.6780128053894706E-05, 3.1934841481628330E-03, 4.0941461360716913E-02, 1.7436810648693343E-01, 2.5085467225681685E-01, -4.2425842671825272E-17, -2.5085467225681662E-01, -1.7436810648693341E-01, -4.0941461360716816E-02, -3.1934841481628322E-03, -5.6780128053894245E-05, -5.6353468219322028E-08, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c2[] = {1.3966266158866419E-07, 7.1655019336418715E-05, 2.5459504018621160E-03, 2.0160236969440630E-02, 4.0770064165298381E-02, -1.9317276988534519E-02, -8.8461538461538702E-02, -1.9317276988534231E-02, 4.0770064165298381E-02, 2.0160236969440609E-02, 2.5459504018621169E-03, 7.1655019336418200E-05, 1.3966266158866422E-07, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c3[] = {2.0618605552701890E-07, 5.4306747658367629E-05, 1.1637911071900912E-03, 4.7784706844645301E-03, -1.2004184173789252E-03, -1.6862510515566049E-02, 9.7663889839209053E-18, 1.6862510515566097E-02, 1.2004184173788634E-03, -4.7784706844645371E-03, -1.1637911071900916E-03, -5.4306747658367324E-05, -2.0618605552701893E-07, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c4[] = {2.0277547837406113E-07, 2.7328509487415513E-05, 3.2236608098850332E-04, 3.0859705461357004E-04, -2.0254394973525094E-03, -5.2398574644554148E-04, 3.7818616294950373E-03, -5.2398574644547274E-04, -2.0254394973524665E-03, 3.0859705461356787E-04, 3.2236608098850332E-04, 2.7328509487415378E-05, 2.0277547837406113E-07, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c5[] = {1.4058372037094500E-07, 9.4685595066536152E-06, 4.8682874512158753E-05, -1.1575111217135236E-04, -2.1811605515766828E-04, 5.4056763477039569E-04, 1.9368559350380580E-17, -5.4056763477032576E-04, 2.1811605515769940E-04, 1.1575111217134847E-04, -4.8682874512158509E-05, -9.4685595066535983E-06, -1.4058372037094503E-07, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c6[] = {7.0755520230584412E-08, 2.2298625886400112E-06, 7.8375383351921547E-07, -2.8394470622678201E-05, 3.5771256766246747E-05, 4.1631950912197713E-05, -1.0418619302464089E-04, 4.1631950912400947E-05, 3.5771256766178408E-05, -2.8394470622675504E-05, 7.8375383351932791E-07, 2.2298625886400150E-06, 7.0755520230584359E-08, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c7[] = {2.6111186487625189E-08, 3.2044561720736560E-07, -1.2220373462324990E-06, -8.5793794342312014E-07, 8.3299507234022271E-06, -1.0956754351203854E-05, 4.2374504788607687E-17, 1.0956754351086770E-05, -8.3299507234225711E-06, 8.5793794342312014E-07, 1.2220373462324990E-06, -3.2044561720740451E-07, -2.6111186487625219E-08, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c8[] = {6.9838095920571053E-09, 1.2796250155223251E-08, -2.1971713837867670E-07, 5.2791981730845992E-07, -1.4622692109166607E-07, -1.2222183756557477E-06, 2.0809248310447731E-06, -1.2222183757291852E-06, -1.4622692100904889E-07, 5.2791981729507288E-07, -2.1971713837877233E-07, 1.2796250155280027E-08, 6.9838095920571284E-09, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c9[] = {1.2845897306281068E-09, -5.2304801922931164E-09, -5.0548716984338105E-09, 6.7539942920393712E-08, -1.6027276235916921E-07, 1.5655092163694814E-07, -2.0049126746331200E-17, -1.5655092175596911E-07, 1.6027276234256162E-07, -6.7539942914165863E-08, 5.0548716981743173E-09, 5.2304801922274408E-09, -1.2845897306281596E-09, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c10[] = {1.3345700642135977E-10, -1.1551704392497283E-09, 3.4412362337817539E-09, -3.2850871137761556E-09, -6.1855158894413326E-09, 2.3119925542057157E-08, -3.2145944250702619E-08, 2.3119925991120319E-08, -6.1855159390928232E-09, -3.2850871338881514E-09, 3.4412362340567228E-09, -1.1551704392030819E-09, 1.3345700642135018E-10, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c11[] = {-1.9694481417906755E-12, -7.0630732029806550E-11, 4.4161967738503258E-10, -1.2581280904632460E-09, 2.0087583294349134E-09, -1.6557204113066525E-09, -2.4838776856226866E-17, 1.6557200331149790E-09, -2.0087583290445127E-09, 1.2581281109060392E-09, -4.4161967758023283E-10, 7.0630731987661026E-11, 1.9694481417581824E-12, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c12[] = {-3.1122514900942224E-12, 1.0235548890361649E-11, -1.0076717484352820E-11, -3.6278870299335626E-11, 1.6235810773706083E-10, -3.2356767144198370E-10, 4.0014568953167669E-10, -3.2356778577799558E-10, 1.6235815163392255E-10, -3.6278895693159697E-11, -1.0076717659812659E-11, 1.0235548935223541E-11, -3.1122514900513855E-12, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c13[] = {-4.4521627552749709E-13, 2.1830423159171809E-12, -6.6494701742631481E-12, 1.3364546912215633E-11, -1.7572522963316000E-11, 1.3087514697366595E-11, -8.4435734857040533E-18, -1.3087609910937195E-11, 1.7572511855066095E-11, -1.3364550482724530E-11, 6.6494700750823452E-12, -2.1830423529162694E-12, 4.4521627549722952E-13, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c14[] = {-1.1331825570440727E-14, 7.5442530545509575E-14, -3.5473155765082429E-13, 1.0827877815183058E-12, -2.3054260653186393E-12, 3.5752119738669225E-12, -4.1288702029291516E-12, 3.5754810437391768E-12, -2.3054322758177103E-12, 1.0827809499693276E-12, -3.5473128594148992E-13, 7.5442566328658522E-14, -1.1331825569256169E-14, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; + for (int i=0; i<16; i++) ker[i] = c0[i] + z*(c1[i] + z*(c2[i] + z*(c3[i] + z*(c4[i] + z*(c5[i] + z*(c6[i] + z*(c7[i] + z*(c8[i] + z*(c9[i] + z*(c10[i] + z*(c11[i] + z*(c12[i] + z*(c13[i] + z*(c14[i])))))))))))))); + } else if constexpr(w==14) { + FLT c0[] = {1.6070755785071470E-09, 4.6371263117318249E-06, 5.3392892770691479E-04, 1.3380163586766325E-02, 1.1960061568997662E-01, 4.7332499268789302E-01, 9.2104360429933840E-01, 9.2104360429933885E-01, 4.7332499268789296E-01, 1.1960061568997690E-01, 1.3380163586766332E-02, 5.3392892770691815E-04, 4.6371263117318359E-06, 1.6070755785075478E-09, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c1[] = {9.2475302076758741E-09, 1.3546865389183958E-05, 1.0306349751547583E-03, 1.7767594411827761E-02, 1.0518000824290018E-01, 2.3882936521395406E-01, 1.5170179567585840E-01, -1.5170179567585848E-01, -2.3882936521395406E-01, -1.0518000824290037E-01, -1.7767594411827757E-02, -1.0306349751547620E-03, -1.3546865389183984E-05, -9.2475302076758013E-09, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c2[] = {2.4024402573674993E-08, 1.8178651135370016E-05, 8.9712289901830596E-04, 1.0104692380253471E-02, 3.4193348251104448E-02, 1.8533380680638742E-02, -6.3746746886473818E-02, -6.3746746886473721E-02, 1.8533380680638804E-02, 3.4193348251104413E-02, 1.0104692380253476E-02, 8.9712289901830910E-04, 1.8178651135370050E-05, 2.4024402573675764E-08, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c3[] = {3.7419288907183448E-08, 1.4804264337309593E-05, 4.5929141335173085E-04, 3.0552592910038081E-03, 3.3079403387824137E-03, -1.0247716289024917E-02, -1.1480323948535254E-02, 1.1480323948535244E-02, 1.0247716289024917E-02, -3.3079403387824436E-03, -3.0552592910038129E-03, -4.5929141335173296E-04, -1.4804264337309631E-05, -3.7419288907183713E-08, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c4[] = {3.9124194363163294E-08, 8.1265227753122953E-06, 1.4975407030324924E-04, 4.4789439277602671E-04, -7.9407521150519009E-04, -1.9254008995686696E-03, 2.1136619999319452E-03, 2.1136619999320310E-03, -1.9254008995687039E-03, -7.9407521150514065E-04, 4.4789439277602807E-04, 1.4975407030325019E-04, 8.1265227753123105E-06, 3.9124194363164148E-08, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c5[] = {2.9113992252245392E-08, 3.1458937074171811E-06, 3.0585266291431803E-05, -6.5135387342531804E-06, -2.3196510408356695E-04, 1.5778347828059787E-04, 4.2181913759730289E-04, -4.2181913759743511E-04, -1.5778347828065232E-04, 2.3196510408355917E-04, 6.5135387342541527E-06, -3.0585266291432135E-05, -3.1458937074171904E-06, -2.9113992252245418E-08, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c6[] = {1.5927753226313465E-08, 8.6591441391883585E-07, 3.1186030532597906E-06, -1.4256326863804729E-05, -6.9192418278078509E-06, 6.1786486497531192E-05, -4.4611361914715045E-05, -4.4611361914675478E-05, 6.1786486497559070E-05, -6.9192418278168430E-06, -1.4256326863804280E-05, 3.1186030532597906E-06, 8.6591441391883140E-07, 1.5927753226313942E-08, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c7[] = {6.5072355972924813E-09, 1.6321871905298928E-07, -1.6208737249938854E-07, -2.0005919851713336E-06, 4.6289117401622691E-06, 1.5738407906772272E-07, -1.0033756087449713E-05, 1.0033756087433936E-05, -1.5738407907104422E-07, -4.6289117402421935E-06, 2.0005919851702955E-06, 1.6208737249954423E-07, -1.6321871905298441E-07, -6.5072355972922497E-09, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c8[] = {1.9857214221989461E-09, 1.7788899565182485E-08, -1.0133541198304996E-07, 4.4566342393624423E-08, 5.3564828267956768E-07, -1.1695093255217001E-06, 6.7085595112856254E-07, 6.7085595109184377E-07, -1.1695093255400593E-06, 5.3564828275147516E-07, 4.4566342396301834E-08, -1.0133541198318143E-07, 1.7788899565178749E-08, 1.9857214221992583E-09, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c9[] = {4.4289508956510068E-10, -2.3397558744219687E-11, -1.2203541602842489E-08, 4.1555456454833886E-08, -4.0387396856849884E-08, -5.2822132680810253E-08, 1.7383889339056799E-07, -1.7383889348606158E-07, 5.2822132664202676E-08, 4.0387396840242307E-08, -4.1555456456217852E-08, 1.2203541602842489E-08, 2.3397558739320396E-11, -4.4289508956485780E-10, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c10[] = {6.7195187479838651E-11, -3.6781600571601283E-10, 1.8909214073475932E-10, 3.2074788108853071E-09, -1.0777792240321408E-08, 1.5287295334927549E-08, -7.6060393527572334E-09, -7.6060393515002332E-09, 1.5287295319215051E-08, -1.0777792242206908E-08, 3.2074788110424317E-09, 1.8909214034194689E-10, -3.6781600571877484E-10, 6.7195187480061628E-11, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c11[] = {5.1753158905731111E-12, -5.7459004388635483E-11, 2.1373772903641436E-10, -3.3474981778015193E-10, -5.5056512295298501E-11, 1.1984997396258443E-09, -2.3401535495753279E-09, 2.3401534462256513E-09, -1.1984997901649717E-09, 5.5056485464132478E-11, 3.3474981628953162E-10, -2.1373772851292269E-10, 5.7459004398894591E-11, -5.1753158903325276E-12, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c12[] = {-3.4295334315359932E-13, -1.9669734025378269E-12, 1.8829710628324230E-11, -6.6063899195501951E-11, 1.2987243582507169E-10, -1.4723144009119097E-10, 6.6816630074648980E-11, 6.6816585156930012E-11, -1.4723144213290547E-10, 1.2987245930478841E-10, -6.6063899004091207E-11, 1.8829709958386662E-11, -1.9669734162456265E-12, -3.4295334295109775E-13, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c13[] = {-1.4925032356594262E-13, 5.9101412859019032E-13, -1.0473415219044306E-12, -3.4168917194284013E-13, 6.3681359177110198E-12, -1.6773482744373957E-11, 2.5499660495751048E-11, -2.5499681125358013E-11, 1.6773489091945331E-11, -6.3681446456216585E-12, 3.4168897358123469E-13, 1.0473414475188284E-12, -5.9101412655620904E-13, 1.4925032367339251E-13, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c14[] = {-1.6512890189653285E-14, 8.8250732683937202E-14, -3.0062086690296025E-13, 6.8819285466437257E-13, -1.0710400014754661E-12, 1.0658737978231948E-12, -4.5539043383551768E-13, -4.5538732858598216E-13, 1.0658669662742166E-12, -1.0710350330762092E-12, 6.8819363097675645E-13, -3.0062096394200824E-13, 8.8250729348219931E-14, -1.6512890096369287E-14, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c15[] = {1.6573977048758373E-16, 1.3350705098663598E-15, -1.0198682011443083E-14, 3.9098729470330932E-14, -9.7793954863110993E-14, 1.7461760909376988E-13, -2.3139300803193430E-13, 2.3133712649617930E-13, -1.7464512743103152E-13, 9.7793532432495125E-14, -3.9100087283024766E-14, 1.0198847966327885E-14, -1.3350639093879870E-15, -1.6573967195923749E-16, 0.0000000000000000E+00, 0.0000000000000000E+00}; + for (int i=0; i<16; i++) ker[i] = c0[i] + z*(c1[i] + z*(c2[i] + z*(c3[i] + z*(c4[i] + z*(c5[i] + z*(c6[i] + z*(c7[i] + z*(c8[i] + z*(c9[i] + z*(c10[i] + z*(c11[i] + z*(c12[i] + z*(c13[i] + z*(c14[i] + z*(c15[i]))))))))))))))); + } else if constexpr(w==15) { + FLT c0[] = {2.4886236238313275E-10, 1.0156314710024850E-06, 1.5297772142853732E-04, 4.9110296377727252E-03, 5.6121982134094042E-02, 2.8670951404936740E-01, 7.3488453954210708E-01, 1.0000000000000018E+00, 7.3488453954210708E-01, 2.8670951404936773E-01, 5.6121982134094160E-02, 4.9110296377727304E-03, 1.5297772142853735E-04, 1.0156314710024854E-06, 2.4886236238313405E-10, 0.0000000000000000E+00}; + FLT c1[] = {1.4880454274285380E-09, 3.1146031777409664E-06, 3.1470309742465704E-04, 7.1215977556942766E-03, 5.6335374470954699E-02, 1.8245542837228426E-01, 2.2739494478010194E-01, -8.4851685343650138E-17, -2.2739494478010203E-01, -1.8245542837228429E-01, -5.6335374470954797E-02, -7.1215977556942861E-03, -3.1470309742465704E-04, -3.1146031777409677E-06, -1.4880454274285417E-09, 0.0000000000000000E+00}; + FLT c2[] = {4.0364738474324407E-09, 4.4152383936309399E-06, 2.9537757977456613E-04, 4.5415629108243203E-03, 2.2685962261788536E-02, 3.3502333548319392E-02, -2.2696322242195928E-02, -7.6666666666667105E-02, -2.2696322242195890E-02, 3.3502333548319295E-02, 2.2685962261788574E-02, 4.5415629108243290E-03, 2.9537757977456602E-04, 4.4152383936309408E-06, 4.0364738474324407E-09, 0.0000000000000000E+00}; + FLT c3[] = {6.6006259688120903E-09, 3.8297656275654615E-06, 1.6597029248061418E-04, 1.6248331197066910E-03, 4.0281119347581806E-03, -2.8399908290139670E-03, -1.3756562885831731E-02, 8.4642037860646445E-18, 1.3756562885831830E-02, 2.8399908290139726E-03, -4.0281119347581763E-03, -1.6248331197066903E-03, -1.6597029248061428E-04, -3.8297656275654632E-06, -6.6006259688120903E-09, 0.0000000000000000E+00}; + FLT c4[] = {7.2920076887968842E-09, 2.2644150332986927E-06, 6.1226481435401080E-05, 3.3216368068303837E-04, 4.2258807580772573E-07, -1.7026747228854225E-03, -1.2026158633577104E-04, 2.8537037037045169E-03, -1.2026158633587413E-04, -1.7026747228854396E-03, 4.2258807580342979E-07, 3.3216368068303599E-04, 6.1226481435401053E-05, 2.2644150332986923E-06, 7.2920076887968825E-09, 0.0000000000000000E+00}; + FLT c5[] = {5.7777535593445582E-09, 9.5996306286140537E-07, 1.5097159537535539E-05, 2.8094504791463487E-05, -1.2791075475385979E-04, -1.0516749004206970E-04, 4.0040320377523060E-04, -5.3767305800596667E-17, -4.0040320377526947E-04, 1.0516749004224858E-04, 1.2791075475386367E-04, -2.8094504791466405E-05, -1.5097159537535578E-05, -9.5996306286140621E-07, -5.7777535593445615E-09, 0.0000000000000000E+00}; + FLT c6[] = {3.3986627004323941E-09, 2.9741452947022137E-07, 2.3232144780590986E-06, -3.5941523174517531E-06, -1.8171775676703349E-05, 3.2858338560999192E-05, 2.0665249075282785E-05, -6.8763374485658282E-05, 2.0665249075243218E-05, 3.2858338560903870E-05, -1.8171775676688959E-05, -3.5941523174468073E-06, 2.3232144780590283E-06, 2.9741452947022068E-07, 3.3986627004323950E-09, 0.0000000000000000E+00}; + FLT c7[] = {1.5128957992049935E-09, 6.6672685257782830E-08, 1.4160936684819443E-07, -1.2611166225406650E-06, 6.6865545481274985E-07, 4.6861078169603807E-06, -7.4523870622367549E-06, 3.4449326618851042E-17, 7.4523870622915596E-06, -4.6861078171685983E-06, -6.6865545481586376E-07, 1.2611166225370321E-06, -1.4160936684822037E-07, -6.6672685257784048E-08, -1.5128957992049958E-09, 0.0000000000000000E+00}; + FLT c8[] = {5.1310324414219323E-10, 1.0163871982746417E-08, -2.4441175134513117E-08, -1.0543632600128869E-07, 4.0979777876948477E-07, -2.9573937050886787E-07, -5.9824625885776880E-07, 1.2067769777215239E-06, -5.9824625888224795E-07, -2.9573937051804759E-07, 4.0979777875189036E-07, -1.0543632599908938E-07, -2.4441175134504150E-08, 1.0163871982746604E-08, 5.1310324414219250E-10, 0.0000000000000000E+00}; + FLT c9[] = {1.3160883866734162E-10, 8.0584478671628169E-10, -6.7824252839146209E-09, 9.4471403085770161E-09, 2.4030590210440211E-08, -9.0522548461561274E-08, 9.9320303281521742E-08, -3.3235747494939870E-17, -9.9320303331344472E-08, 9.0522548575046391E-08, -2.4030590184144877E-08, -9.4471403129019068E-09, 6.7824252838551532E-09, -8.0584478671661959E-10, -1.3160883866734426E-10, 0.0000000000000000E+00}; + FLT c10[] = {2.4734066313993841E-11, -4.3978001546130925E-11, -5.4975091407909014E-10, 2.6307942053065240E-09, -4.2001676300414851E-09, -1.8212709476483809E-10, 1.0547608728554078E-08, -1.6454374657490009E-08, 1.0547608700900084E-08, -1.8212715510082630E-10, -4.2001676441827325E-09, 2.6307942080562109E-09, -5.4975091408400028E-10, -4.3978001546169286E-11, 2.4734066313994739E-11, 0.0000000000000000E+00}; + FLT c11[] = {3.0917581107079110E-12, -2.1504981482082260E-11, 3.4611945847529536E-11, 1.1082666372508343E-10, -5.8883841601722089E-10, 1.1304779835787544E-09, -1.0037911764569433E-09, -3.0283968181148084E-17, 1.0037910961054091E-09, -1.1304781035382004E-09, 5.8883843170422537E-10, -1.1082666581905009E-10, -3.4611945887456865E-11, 2.1504981481250442E-11, -3.0917581107099418E-12, 0.0000000000000000E+00}; + FLT c12[] = {1.5997634038702646E-13, -2.4807970167387033E-12, 1.1275106680112280E-11, -2.3847055462676874E-11, 1.5364449544552166E-11, 4.4350560279013230E-11, -1.3563512446398317E-10, 1.8159082249266700E-10, -1.3563514079769914E-10, 4.4350479631290549E-11, 1.5364417897977443E-11, -2.3847054792739306E-11, 1.1275106670142972E-11, -2.4807970166140870E-12, 1.5997634038751326E-13, 0.0000000000000000E+00}; + FLT c13[] = {-2.4800914617581790E-14, -2.0428591850792014E-14, 6.6720754938105064E-13, -2.9781124760980002E-12, 7.0947582817473084E-12, -1.0181652063894561E-11, 7.9189094930423407E-12, -9.8394354439677929E-18, -7.9189221881850869E-12, 1.0181666345930150E-11, -7.0947471734974048E-12, 2.9781096494451229E-12, -6.6720756797745112E-13, 2.0428591947648267E-14, 2.4800914616825102E-14, 0.0000000000000000E+00}; + FLT c14[] = {-6.3774103677168823E-15, 2.8974955180500696E-14, -6.8422375867171716E-14, 5.3398530878603272E-14, 1.7893255188637643E-13, -7.2419108095498065E-13, 1.3713257052105891E-12, -1.6687592372473224E-12, 1.3713291209850782E-12, -7.2419667040414461E-13, 1.7892478876253759E-13, 5.3400510475182175E-14, -6.8422363737290718E-14, 2.8974955332124205E-14, -6.3774103674947777E-15, 0.0000000000000000E+00}; + FLT c15[] = {-5.1635500303423897E-16, 3.1828102524634415E-15, -1.2111395036223793E-14, 3.1272176408626341E-14, -5.6181159756113080E-14, 6.8652488307259956E-14, -4.9059039919968102E-14, -1.9388362148879701E-17, 4.9009555190681807E-14, -6.8669083795740107E-14, 5.6191961910432889E-14, -3.1272613926049905E-14, 1.2111362976757412E-14, -3.1828104881948118E-15, 5.1635500248749881E-16, 0.0000000000000000E+00}; + FLT c16[] = {4.5179136270516879E-18, -1.3721567983016968E-17, -2.0188039379638457E-16, 1.1787961810528452E-15, -3.6002979849300605E-15, 7.4771830629950721E-15, -1.1466606614177747E-14, 1.2929793395674386E-14, -1.1481537091539957E-14, 7.4099959148651253E-15, -3.6189610816328235E-15, 1.1783179391998368E-15, -2.0189132920460885E-16, -1.3721681893519305E-17, 4.5179138940294278E-18, 0.0000000000000000E+00}; + for (int i=0; i<16; i++) ker[i] = c0[i] + z*(c1[i] + z*(c2[i] + z*(c3[i] + z*(c4[i] + z*(c5[i] + z*(c6[i] + z*(c7[i] + z*(c8[i] + z*(c9[i] + z*(c10[i] + z*(c11[i] + z*(c12[i] + z*(c13[i] + z*(c14[i] + z*(c15[i] + z*(c16[i])))))))))))))))); + } else if constexpr(w==16) { + FLT c0[] = {3.7973138383475537E-11, 2.1620729770457849E-07, 4.2059935922517660E-05, 1.7055631615451750E-03, 2.4507833223051386E-02, 1.5833750021928361E-01, 5.2065761855025594E-01, 9.3058177132107822E-01, 9.3058177132107800E-01, 5.2065761855025572E-01, 1.5833750021928361E-01, 2.4507833223051390E-02, 1.7055631615451755E-03, 4.2059935922517687E-05, 2.1620729770457854E-07, 3.7973138383475505E-11}; + FLT c1[] = {2.3529614069937343E-10, 6.9307767643753116E-07, 9.1584555859393314E-05, 2.6688190455647263E-03, 2.7424935799146798E-02, 1.1980519064171602E-01, 2.2858769149343988E-01, 1.3403316930972972E-01, -1.3403316930972986E-01, -2.2858769149343991E-01, -1.1980519064171602E-01, -2.7424935799146809E-02, -2.6688190455647263E-03, -9.1584555859393314E-05, -6.9307767643753127E-07, -2.3529614069937420E-10}; + FLT c2[] = {6.6422278409342463E-10, 1.0324321112746625E-06, 9.1817488865684755E-05, 1.8711533829047159E-03, 1.2921996060610222E-02, 3.2047854205940307E-02, 1.0693035516337730E-02, -5.7626889750985288E-02, -5.7626889750985406E-02, 1.0693035516337771E-02, 3.2047854205940300E-02, 1.2921996060610223E-02, 1.8711533829047159E-03, 9.1817488865684755E-05, 1.0324321112746625E-06, 6.6422278409342463E-10}; + FLT c3[] = {1.1357078950958105E-09, 9.4728532805183307E-07, 5.5827161828283832E-05, 7.6087086075588245E-04, 3.0946204357507547E-03, 1.6729582927767583E-03, -9.5127691406673535E-03, -8.9630953638635182E-03, 8.9630953638635789E-03, 9.5127691406673934E-03, -1.6729582927767586E-03, -3.0946204357507555E-03, -7.6087086075588234E-04, -5.5827161828283825E-05, -9.4728532805183349E-07, -1.1357078950958109E-09}; + FLT c4[] = {1.3190161602522575E-09, 5.9764321317063347E-07, 2.2744388605473007E-05, 1.9073517322668122E-04, 2.8943142766412957E-04, -8.8625893129445996E-04, -1.3389167739520143E-03, 1.7216657535079883E-03, 1.7216657535080399E-03, -1.3389167739520486E-03, -8.8625893129445140E-04, 2.8943142766413012E-04, 1.9073517322668078E-04, 2.2744388605472990E-05, 5.9764321317063347E-07, 1.3190161602522575E-09}; + FLT c5[] = {1.1057322032863294E-09, 2.7364351668058891E-07, 6.4277990516970045E-06, 2.7144256967440260E-05, -3.6927862875713990E-05, -1.6756539822665589E-04, 1.6190404775919697E-04, 2.9203183363573547E-04, -2.9203183363575488E-04, -1.6190404775916586E-04, 1.6756539822664033E-04, 3.6927862875711076E-05, -2.7144256967440016E-05, -6.4277990516969969E-06, -2.7364351668058902E-07, -1.1057322032863298E-09}; + FLT c6[] = {6.9354916180818914E-10, 9.3269475195063855E-08, 1.2384428187212307E-06, 8.4996778392780880E-07, -1.3106613626291306E-05, 2.8218026704008473E-06, 4.1119875273747256E-05, -3.3017437945364753E-05, -3.3017437945361154E-05, 4.1119875273773338E-05, 2.8218026703918548E-06, -1.3106613626292205E-05, 8.4996778392747158E-07, 1.2384428187212307E-06, 9.3269475195063524E-08, 6.9354916180818924E-10}; + FLT c7[] = {3.3254260763955980E-10, 2.3748169129616548E-08, 1.4324995919581946E-07, -4.5855119979513952E-07, -9.5896649524474271E-07, 3.6155491754929462E-06, -9.8206137492975964E-07, -6.1812989820939710E-06, 6.1812989821267707E-06, 9.8206137495882303E-07, -3.6155491754861996E-06, 9.5896649524349715E-07, 4.5855119979513952E-07, -1.4324995919581623E-07, -2.3748169129616750E-08, -3.3254260763955995E-10}; + FLT c8[] = {1.2320735888479567E-10, 4.4066719437555919E-09, 2.9936173156415513E-09, -8.7082338359625540E-08, 1.2972939456024976E-07, 2.2882425901978947E-07, -7.3491924909951292E-07, 4.5592445663881905E-07, 4.5592445668777740E-07, -7.3491924909951292E-07, 2.2882425901519963E-07, 1.2972939456177968E-07, -8.7082338359685309E-08, 2.9936173156430456E-09, 4.4066719437555919E-09, 1.2320735888479557E-10}; + FLT c9[] = {3.5284250010876544E-11, 5.4380355945615962E-10, -2.1550460241863304E-09, -3.7344953350225554E-09, 2.7722604309770562E-08, -3.9597167025382683E-08, -1.3993916658989759E-08, 9.5626629211485668E-08, -9.5626629251620657E-08, 1.3993916686669056E-08, 3.9597167023998724E-08, -2.7722604313576463E-08, 3.7344953348063106E-09, 2.1550460241816002E-09, -5.4380355945633912E-10, -3.5284250010876789E-11}; + FLT c10[] = {7.7013760205810495E-12, 2.8123297626112544E-11, -3.7953802134892808E-10, 8.7573780433573981E-10, 5.1359846170264275E-10, -5.3609157562628785E-09, 9.1303304588329059E-09, -4.8150451155485792E-09, -4.8150451281185763E-09, 9.1303304734455279E-09, -5.3609157606623776E-09, 5.1359846248826757E-10, 8.7573780425717729E-10, -3.7953802134524547E-10, 2.8123297626093363E-11, 7.7013760205810866E-12}; + FLT c11[] = {1.2276300481455858E-12, -4.1769601374580106E-12, -1.9148402820678083E-11, 1.3822953605936348E-10, -3.0994364315672905E-10, 2.0316700797680967E-10, 4.3650567492219507E-10, -1.1534087876776367E-09, 1.1534087287626426E-09, -4.3650568826679616E-10, -2.0316702022119098E-10, 3.0994363911075959E-10, -1.3822953621907280E-10, 1.9148402809587158E-11, 4.1769601372500562E-12, -1.2276300481457296E-12}; + FLT c12[] = {1.2527329159245277E-13, -1.0816725478983629E-12, 2.7445378617411554E-12, 1.7839887814412696E-12, -2.6194657489648952E-11, 6.7446676626524242E-11, -8.5082169359569567E-11, 4.0254977976937753E-11, 4.0255018811227722E-11, -8.5082173442998567E-11, 6.7446660803236882E-11, -2.6194658255291886E-11, 1.7839886059814300E-12, 2.7445378627380862E-12, -1.0816725479139400E-12, 1.2527329159255924E-13}; + FLT c13[] = {3.2506946752710782E-15, -9.2845381976413515E-14, 5.1542690454602287E-13, -1.3678932749752010E-12, 1.6503393979160946E-12, 7.2550201768889120E-13, -6.2314790536140772E-12, 1.1299389559457127E-11, -1.1299395907028501E-11, 6.2314933356496677E-12, -7.2549567011751778E-13, -1.6503411831705432E-12, 1.3678932005895990E-12, -5.1542690687057296E-13, 9.2845381921931865E-14, -3.2506946753420181E-15}; + FLT c14[] = {-1.3523251102433609E-15, 1.9055797797121101E-15, 1.8430802267160460E-14, -1.1526994860082207E-13, 3.3348703176907399E-13, -5.8352482961996788E-13, 6.1748228591582172E-13, -2.7106468455582230E-13, -2.7107027400498627E-13, 6.1750014110065109E-13, -5.8352296647024653E-13, 3.3348780808145787E-13, -1.1526990978520290E-13, 1.8430803480148559E-14, 1.9055798650003358E-15, -1.3523251103173957E-15}; + FLT c15[] = {-2.4132931376483073E-16, 1.2442653568449662E-15, -3.5592674167315351E-15, 5.0955768471980872E-15, 1.6433757901515860E-15, -2.5292369304993825E-14, 6.2705842006972340E-14, -9.2647844753490817E-14, 9.2624309333464405E-14, -6.2708738674052505E-14, 2.5283784911407270E-14, -1.6454577696154606E-15, -5.0957126284674709E-15, 3.5592589304021987E-15, -1.2442654599774408E-15, 2.4132931371807006E-16}; + FLT c16[] = {-1.6052119849944121E-17, 1.0220931367339573E-16, -4.3668875981049212E-16, 1.2658945204775534E-15, -2.5919308700797615E-15, 3.7378450076294255E-15, -3.5206065620092615E-15, 1.3556873444887233E-15, 1.3825622037407022E-15, -3.5235926574817036E-15, 3.7296332450802098E-15, -2.5925840784643585E-15, 1.2657662116877219E-15, -4.3668857755368841E-16, 1.0220931367339573E-16, -1.6052119749827469E-17}; + FLT c17[] = {1.2307507958064464E-18, -2.6518508071733353E-18, -1.1738826401341014E-20, 2.6948814943373302E-17, -1.1509910460329600E-16, 2.8279944900173787E-16, -4.6726530883316867E-16, 6.6203450429457653E-16, -6.6004614127826513E-16, 4.7069975404316101E-16, -2.8081108598542653E-16, 1.1491834432908588E-16, -2.6954463701942368E-17, 1.1451975380255613E-20, 2.6518459803532692E-18, -1.2307508038870603E-18}; + for (int i=0; i<16; i++) ker[i] = c0[i] + z*(c1[i] + z*(c2[i] + z*(c3[i] + z*(c4[i] + z*(c5[i] + z*(c6[i] + z*(c7[i] + z*(c8[i] + z*(c9[i] + z*(c10[i] + z*(c11[i] + z*(c12[i] + z*(c13[i] + z*(c14[i] + z*(c15[i] + z*(c16[i] + z*(c17[i]))))))))))))))))); + } else + printf("width not implemented!\n"); diff --git a/src/ker_horner_allw_loop_constexpr.h b/src/ker_horner_allw_loop_constexpr.h index 077773038..6abbf9af2 100644 --- a/src/ker_horner_allw_loop_constexpr.h +++ b/src/ker_horner_allw_loop_constexpr.h @@ -1,234 +1,711 @@ -// Code generated by gen_all_horner_C_code.m in finufft/devel -// Authors: Alex Barnett & Ludvig af Klinteberg. -// (C) The Simons Foundation, Inc. +// Header of static arrays of monomial coeffs of spreading kernel function in each +// fine-grid interval. Generated by gen_all_horner_cpp_header.m in devel/ +// Authors: Alex Barnett, Ludvig af Klinteberg, Marco Barbone & Libin Lu. +// (C) 2018--2024 The Simons Foundation, Inc. #include -template constexpr auto nc200() noexcept { return w + 2 + (w <= 8); } -template -constexpr std::array, nc200()> get_horner_coeffs_200() noexcept { - constexpr auto nc = nc200(); - if constexpr (w == 2) { - return std::array, nc> {{ - {-2.0940804433577420E+00, -2.0940804433577389E+00}, - {-2.0382426253182082E+01, 2.0382426253182086E+01}, - {-1.8395117920046484E+00, -1.8395117920046560E+00}, - {5.7408070938221300E+01, -5.7408070938221293E+01}, - {4.5147043243215315E+01, 4.5147043243215300E+01} - }}; - } else if constexpr (w == 3) { - return std::array, nc> {{ - {-3.9654011076088804E+00, 1.8062124448285358E-13, 3.9654011139270540E+00}, - {-3.7757583061523668E+01, 5.3222970968867315E+01, -3.7757583054647384E+01}, - {-1.5357716116473156E+01, 9.5071486252033243E-15, 1.5357716122720193E+01}, - {1.7742692790454484E+02, -3.3149255274727801E+02, 1.7742692791117119E+02}, - {3.1653018869611077E+02, 7.4325702843759617E-14, -3.1653018868907071E+02}, - {1.5653991189315119E+02, 8.8006872410780295E+02, 1.5653991189967152E+02} - }}; - } else if constexpr (w == 4) { - return std::array, nc> {{ - {-1.0039212571700894E+01, 5.0626747735616746E+00, 5.0626747735625512E+00, -1.0039212571700640E+01}, - {-7.8386867802392288E+01, 1.4918904800408930E+02, -1.4918904800408751E+02, 7.8386867802392359E+01}, - {-4.8293622641174039E+01, 3.9393732546135226E+01, 3.9393732546135816E+01, -4.8293622641174061E+01}, - {5.1133995502497419E+02, -1.4191608683682996E+03, 1.4191608683682998E+03, -5.1133995502497424E+02}, - {1.4186910680718345E+03, -1.3995339862725591E+03, -1.3995339862725598E+03, 1.4186910680718347E+03}, - {1.4650917259256939E+03, 6.1905285583602863E+03, -6.1905285583602881E+03, -1.4650917259256937E+03}, - {5.4284366850213200E+02, 1.0073871433088398E+04, 1.0073871433088396E+04, 5.4284366850213223E+02} - }}; - } else if constexpr (w == 5) { - return std::array, nc> {{ - {-3.3762488150353924E+00, 2.2839981872948751E+00, 7.1884725699454154E-12, -2.2839981872943818E+00, 3.3762488150341459E+00}, - {-5.5339722671223846E+01, 1.1960590540261879E+02, -1.5249941358311668E+02, 1.1960590540262307E+02, -5.5339722671223605E+01}, - {-9.1301168206167262E+01, 1.2316471075214675E+02, 2.0698495299948402E-11, -1.2316471075214508E+02, 9.1301168206167233E+01}, - {4.0071733590403869E+02, -1.5861137916762602E+03, 2.3839858699098645E+03, -1.5861137916762643E+03, 4.0071733590403909E+02}, - {1.9990077310495396E+03, -3.8875294641277296E+03, 9.7116927320010791E-12, 3.8875294641277369E+03, -1.9990077310495412E+03}, - {3.6092689177271222E+03, 7.7501368899498666E+03, -2.2704627332475000E+04, 7.7501368899498730E+03, 3.6092689177271218E+03}, - {3.0430174925083825E+03, 3.7938404259811403E+04, -1.1842989705877139E-11, -3.7938404259811381E+04, -3.0430174925083829E+03}, - {9.9223677575398392E+02, 3.7794697666613320E+04, 9.8715771010760494E+04, 3.7794697666613283E+04, 9.9223677575398403E+02} - }}; - } else if constexpr (w == 6) { - return std::array, nc> {{ - {-1.5631081288842275E+00, 7.1037430591266115E-01, -6.9838401121429056E-02, -6.9838401186476856E-02, 7.1037430589285400E-01, -1.5631081203754575E+00}, - {-4.5977202613350237E+01, 1.1536880606853076E+02, -1.7819720186493959E+02, 1.7819720186497622E+02, -1.1536880606854736E+02, 4.5977202622148909E+01}, - {-1.2051267090537374E+02, 2.2400507411399673E+02, -1.2506575852541796E+02, -1.2506575852521925E+02, 2.2400507411398695E+02, -1.2051267089640181E+02}, - {3.2120291706547636E+02, -1.8229189469936762E+03, 3.7928113414429808E+03, -3.7928113414427025E+03, 1.8229189469937312E+03, -3.2120291705638243E+02}, - {2.7021878300949752E+03, -7.8773465553972646E+03, 5.2105876478342780E+03, 5.2105876478343343E+03, -7.8773465553972710E+03, 2.7021878301048723E+03}, - {7.2536109410387417E+03, 4.8347162752602981E+03, -5.0512736602018522E+04, 5.0512736602018478E+04, -4.8347162752603008E+03, -7.2536109410297540E+03}, - {1.0023404568475091E+04, 9.0916650498360192E+04, -1.0095927514054619E+05, -1.0095927514054628E+05, 9.0916650498360177E+04, 1.0023404568484635E+04}, - {7.1269776034442639E+03, 2.0581923258843314E+05, 3.1559612614917674E+05, -3.1559612614917627E+05, -2.0581923258843317E+05, -7.1269776034341394E+03}, - {2.0553833234911876E+03, 1.5499537739913128E+05, 8.1177907023291115E+05, 8.1177907023291173E+05, 1.5499537739913136E+05, 2.0553833235005691E+03} - }}; - } else if constexpr(w==7) { - return std::array, nc> {{ - {-1.4761409685186277E-01, -9.1862771280377487E-01, 1.2845147741777752E+00, 5.6547359492808854E-10, -1.2845147728310689E+00, 9.1862771293147971E-01, 1.4761410890866353E-01}, - {-3.2270164914249058E+01, 9.1892112257581346E+01, -1.6710678096334209E+02, 2.0317049305432383E+02, -1.6710678096383771E+02, 9.1892112257416159E+01, -3.2270164900224913E+01}, - {-1.2289277373867256E+02, 2.8583630927743314E+02, -2.8318194617327981E+02, 6.9043515551118249E-10, 2.8318194617392436E+02, -2.8583630927760140E+02, 1.2289277375319763E+02}, - {1.6069721418053300E+02, -1.5518707872251393E+03, 4.3634273936642621E+03, -5.9891976420595174E+03, 4.3634273936642730E+03, -1.5518707872251064E+03, 1.6069721419533221E+02}, - {2.7903491906228419E+03, -1.0975382873973093E+04, 1.3656979541144799E+04, 7.7346408577822045E-10, -1.3656979541143772E+04, 1.0975382873973256E+04, -2.7903491906078298E+03}, - {1.0542795672344864E+04, -7.0739172265098678E+03, -6.5563293056049893E+04, 1.2429734005960064E+05, -6.5563293056049602E+04, -7.0739172265098332E+03, 1.0542795672361213E+04}, - {2.1166189345881645E+04, 1.3382732160223130E+05, -3.3113450969689694E+05, 6.9013724510092140E-10, 3.3113450969689724E+05, -1.3382732160223136E+05, -2.1166189345866893E+04}, - {2.4458227486779251E+04, 5.3904618484139396E+05, 2.4315566181017534E+05, -1.6133959371974322E+06, 2.4315566181017453E+05, 5.3904618484139396E+05, 2.4458227486795113E+04}, - {1.5290160332974696E+04, 8.7628248584320408E+05, 3.4421061790934438E+06, -2.6908159596373561E-10, -3.4421061790934461E+06, -8.7628248584320408E+05, -1.5290160332958067E+04}, - {3.9948351830487481E+03, 5.4715865608590771E+05, 5.0196413492771760E+06, 9.8206709220713247E+06, 5.0196413492771825E+06, 5.4715865608590783E+05, 3.9948351830642519E+03} - }}; - } else if constexpr(w==8) { - return std::array, nc> {{ - {3.7894993760177598E-01, -1.7334408836731494E+00, 2.5271184057877303E+00, -1.2600963971824484E+00, -1.2600963917834651E+00, 2.5271184069685657E+00, -1.7334408840526812E+00, 3.7894993760636758E-01}, - {-1.9200143062947848E+01, 6.1692257626706223E+01, -1.2981109187842989E+02, 1.8681284210471688E+02, -1.8681284209654376E+02, 1.2981109187880142E+02, -6.1692257626845532E+01, 1.9200143062947120E+01}, - {-1.0230637348345023E+02, 2.8246898554269114E+02, -3.8638201738139219E+02, 1.9106407993320320E+02, 1.9106407993289886E+02, -3.8638201738492717E+02, 2.8246898554219217E+02, -1.0230637348345138E+02}, - {8.5503535636821422E+00, -9.7513976461238224E+02, 3.8242995179171526E+03, -6.9201295567267280E+03, 6.9201295567248662E+03, -3.8242995179155446E+03, 9.7513976461209836E+02, -8.5503535637013552E+00}, - {2.2812256770903232E+03, -1.1569135767377773E+04, 2.0942387020798891E+04, -1.1661592834945191E+04, -1.1661592834940149E+04, 2.0942387020801420E+04, -1.1569135767377924E+04, 2.2812256770903286E+03}, - {1.1864306345505294E+04, -2.2700360645707988E+04, -5.0713607251414309E+04, 1.8308704458211688E+05, -1.8308704458210632E+05, 5.0713607251413123E+04, 2.2700360645707628E+04, -1.1864306345505294E+04}, - {3.2444118016247590E+04, 1.3079802224392134E+05, -5.8652889370129269E+05, 4.2333306008151924E+05, 4.2333306008152053E+05, -5.8652889370128722E+05, 1.3079802224392109E+05, 3.2444118016247590E+04}, - {5.3926359802542116E+04, 9.0469037926849292E+05, -6.0897036277696118E+05, -3.0743852105799988E+06, 3.0743852105800058E+06, 6.0897036277696711E+05, -9.0469037926849339E+05, -5.3926359802542138E+04}, - {5.4488498478251728E+04, 2.4101183255475131E+06, 6.4554051283428287E+06, -8.9200440393090546E+06, -8.9200440393090583E+06, 6.4554051283428324E+06, 2.4101183255475126E+06, 5.4488498478251728E+04}, - {3.0719636811267599E+04, 3.1853145713323927E+06, 2.3797981861403696E+07, 2.4569731244678464E+07, -2.4569731244678471E+07, -2.3797981861403704E+07, -3.1853145713323941E+06, -3.0719636811267606E+04}, - {7.3898000697447915E+03, 1.7297637497600035E+06, 2.5578341605285794E+07, 8.4789650417103335E+07, 8.4789650417103350E+07, 2.5578341605285816E+07, 1.7297637497600049E+06, 7.3898000697447915E+03} - }}; - } else if constexpr(w==9) { - return std::array, nc> {{ - {-9.8886360698074700E+00, 3.5359026949867051E+01, -8.5251867715709949E+01, 1.4285748012617628E+02, -1.6935269668779691E+02, 1.4285748010331625E+02, -8.5251867711661305E+01, 3.5359026944299828E+01, -9.8886360698207305E+00}, - {-7.1572272057937070E+01, 2.2785637019511205E+02, -3.9109820765665262E+02, 3.3597424711470910E+02, 1.0596763818009852E-07, -3.3597424723359080E+02, 3.9109820766854079E+02, -2.2785637019009673E+02, 7.1572272057939983E+01}, - {-7.9857427421129714E+01, -4.0585588534807385E+02, 2.6054813773472697E+03, -6.1806593581075495E+03, 8.0679596874001718E+03, -6.1806593581869265E+03, 2.6054813773147021E+03, -4.0585588535363172E+02, -7.9857427421126204E+01}, - {1.4992527030548456E+03, -9.7024371533891372E+03, 2.3216330734057381E+04, -2.3465262819040818E+04, 5.3299736484284360E-08, 2.3465262819251962E+04, -2.3216330734049119E+04, 9.7024371533890644E+03, -1.4992527030548747E+03}, - {1.0779131453134638E+04, -3.3466718311300596E+04, -1.3245366619006139E+04, 1.8238470515353698E+05, -2.9285656292977190E+05, 1.8238470515350526E+05, -1.3245366619000662E+04, -3.3466718311299621E+04, 1.0779131453134616E+04}, - {3.8657354724013814E+04, 7.9936390113331305E+04, -7.0458265546791907E+05, 1.0151095605715880E+06, 1.2138090419648379E-07, -1.0151095605717725E+06, 7.0458265546794771E+05, -7.9936390113331567E+04, -3.8657354724013821E+04}, - {8.6425493435991244E+04, 1.0891182836653308E+06, -2.0713033564200639E+06, -2.8994941183506218E+06, 7.5905338661205899E+06, -2.8994941183505375E+06, -2.0713033564200667E+06, 1.0891182836653353E+06, 8.6425493435991288E+04}, - {1.2489113703229747E+05, 4.3035547171861930E+06, 6.3021978510598792E+06, -2.6014941986659057E+07, 6.0417403157325170E-08, 2.6014941986659389E+07, -6.3021978510598652E+06, -4.3035547171862079E+06, -1.2489113703229751E+05}, - {1.1335001341875963E+05, 9.0726133144784812E+06, 5.3501544534038112E+07, -2.6789524644146336E+05, -1.2483923718899371E+08, -2.6789524644172983E+05, 5.3501544534038112E+07, 9.0726133144785129E+06, 1.1335001341875960E+05}, - {5.8623313038274340E+04, 1.0326318537280345E+07, 1.2898448324824864E+08, 3.0522863709830385E+08, -3.9398045056223735E-08, -3.0522863709830391E+08, -1.2898448324824864E+08, -1.0326318537280388E+07, -5.8623313038274347E+04}, - {1.3136365370186100E+04, 5.0196413492771806E+06, 1.1303327711722563E+08, 5.8225443924996686E+08, 9.7700272582690656E+08, 5.8225443924996758E+08, 1.1303327711722568E+08, 5.0196413492772207E+06, 1.3136365370186135E+04} - }}; - } else if constexpr(w==10) { - return std::array, nc> {{ - {-4.2916172038214198E+00, 1.7402146071148604E+01, -4.7947588069135868E+01, 9.2697698088029625E+01, -1.2821427596894478E+02, 1.2821427705670308E+02, -9.2697698297776569E+01, 4.7947588093524907E+01, -1.7402146074502035E+01, 4.2916172038452141E+00,}, - {-4.3161545259389186E+01, 1.5498490981579428E+02, -3.1771250774232175E+02, 3.7215448796427023E+02, -1.7181762832770994E+02, -1.7181763036843782E+02, 3.7215448789408123E+02, -3.1771250773692140E+02, 1.5498490982186786E+02, -4.3161545259547800E+01,}, - {-1.0147176570537010E+02, -3.5304284185385157E+01, 1.3576976854876134E+03, -4.3921059353471856E+03, 7.3232085271125388E+03, -7.3232085273978546E+03, 4.3921059367737662E+03, -1.3576976854043962E+03, 3.5304284185385157E+01, 1.0147176570550941E+02,}, - {7.8515926628982663E+02, -6.6607899119372642E+03, 2.0167398338513311E+04, -2.8951401344519112E+04, 1.4622828142848679E+04, 1.4622828143544031E+04, -2.8951401346900999E+04, 2.0167398338398041E+04, -6.6607899119505255E+03, 7.8515926628967964E+02,}, - {8.1238936393894646E+03, -3.4872365530450072E+04, 2.3913680325196314E+04, 1.2428850301830019E+05, -3.2158255329716846E+05, 3.2158255329951923E+05, -1.2428850301867779E+05, -2.3913680325277423E+04, 3.4872365530457188E+04, -8.1238936393894255E+03,}, - {3.7380102688153558E+04, 1.2716675000355666E+04, -6.2163527451774501E+05, 1.4157962667184104E+06, -8.4419693137680157E+05, -8.4419693137743860E+05, 1.4157962667189445E+06, -6.2163527451771160E+05, 1.2716675000340010E+04, 3.7380102688153442E+04,}, - {1.0781139496011091E+05, 9.9202615851199068E+05, -3.3266265543962116E+06, -4.8557049011479173E+05, 1.0176155522772279E+07, -1.0176155522772269E+07, 4.8557049011678610E+05, 3.3266265543963453E+06, -9.9202615851196018E+05, -1.0781139496011072E+05,}, - {2.0818422772177903E+05, 5.6084730690362519E+06, 1.4435118192351763E+06, -4.0063869969544649E+07, 3.2803674392747045E+07, 3.2803674392746095E+07, -4.0063869969546899E+07, 1.4435118192351642E+06, 5.6084730690362034E+06, 2.0818422772177853E+05,}, - {2.6917433004353486E+05, 1.6875651476661228E+07, 7.4664745481963441E+07, -9.5882157211118385E+07, -2.0622994435532519E+08, 2.0622994435532743E+08, 9.5882157211118177E+07, -7.4664745481963515E+07, -1.6875651476661161E+07, -2.6917433004353428E+05,}, - {2.2340399734184606E+05, 3.0258214643190462E+07, 3.1512411458738232E+08, 4.3618276932319808E+08, -7.8178848450497293E+08, -7.8178848450497019E+08, 4.3618276932319826E+08, 3.1512411458738232E+08, 3.0258214643190313E+07, 2.2340399734184548E+05,}, - {1.0729981697645642E+05, 3.0651490267742988E+07, 5.9387966085130465E+08, 2.4434902657508330E+09, 2.0073077861288922E+09, -2.0073077861288943E+09, -2.4434902657508330E+09, -5.9387966085130453E+08, -3.0651490267742816E+07, -1.0729981697645638E+05,}, - {2.2594586605749264E+04, 1.3595989066786593E+07, 4.4723032442444897E+08, 3.3781755837397518E+09, 8.6836783895849819E+09, 8.6836783895849762E+09, 3.3781755837397494E+09, 4.4723032442444897E+08, 1.3595989066786474E+07, 2.2594586605749344E+04,} - }}; - } else if constexpr(w==11) { - return std::array, nc> {{ - {-1.6306382886201207E+00, 7.3325946591320434E+00, -2.3241017682854558E+01, 5.1715494398901185E+01, -8.2673000279130790E+01, 9.6489719151212370E+01, -8.2673010381149226E+01, 5.1715494328769353E+01, -2.3241018024860580E+01, 7.3325946448852415E+00, -1.6306382886460551E+00,}, - {-2.2640047135517630E+01, 9.0840898563949466E+01, -2.1597187544386938E+02, 3.1511229111443720E+02, -2.4856617998395282E+02, 6.1683918215190516E-06, 2.4856618439352349E+02, -3.1511228757800421E+02, 2.1597187557069353E+02, -9.0840898570046704E+01, 2.2640047135565219E+01,}, - {-8.3747489794189363E+01, 1.1948077479405792E+02, 4.8528498015072080E+02, -2.5024391114755094E+03, 5.3511195318669425E+03, -6.7655484107390166E+03, 5.3511195362291774E+03, -2.5024391131167667E+03, 4.8528498019392708E+02, 1.1948077480620087E+02, -8.3747489794426258E+01,}, - {3.0888018539740131E+02, -3.7949446187471626E+03, 1.4313303204988082E+04, -2.6681600235594462E+04, 2.3856005166166615E+04, 8.6424601730164351E-06, -2.3856005155895236E+04, 2.6681600234453199E+04, -1.4313303205083188E+04, 3.7949446187583080E+03, -3.0888018539728523E+02,}, - {5.1670143574922731E+03, -2.8613147115372190E+04, 4.3560195427081359E+04, 4.8438679582765450E+04, -2.5856630639231802E+05, 3.7994883866738499E+05, -2.5856630640319458E+05, 4.8438679579510936E+04, 4.3560195426766244E+04, -2.8613147115376054E+04, 5.1670143574922913E+03,}, - {3.0203516161820498E+04, -3.6879059542768438E+04, -4.1141031216788280E+05, 1.4111389975267777E+06, -1.5914376635331670E+06, 9.4095582602103753E-06, 1.5914376635379130E+06, -1.4111389975247320E+06, 4.1141031216776522E+05, 3.6879059542750314E+04, -3.0203516161820549E+04,}, - {1.0933249308680627E+05, 6.9586821127987828E+05, -3.6860240321937902E+06, 2.7428169457736355E+06, 8.3392008440593518E+06, -1.6402201025046850E+07, 8.3392008440698013E+06, 2.7428169457778852E+06, -3.6860240321937371E+06, 6.9586821127989423E+05, 1.0933249308680571E+05,}, - {2.7021781043532980E+05, 5.6764510325100143E+06, -5.5650761736748898E+06, -3.9907385617900200E+07, 7.2453390663687646E+07, 1.2300109686762266E-05, -7.2453390663684472E+07, 3.9907385617899075E+07, 5.5650761736749066E+06, -5.6764510325099993E+06, -2.7021781043532846E+05,}, - {4.6495183529254980E+05, 2.3067199578027144E+07, 6.9832590192482382E+07, -2.2024799260683522E+08, -1.2820270942588677E+08, 5.1017181199129778E+08, -1.2820270942588474E+08, -2.2024799260683942E+08, 6.9832590192482322E+07, 2.3067199578027155E+07, 4.6495183529254742E+05,}, - {5.4814313598122005E+05, 5.8085130777589552E+07, 4.9484006166551048E+08, 1.6222124676640952E+08, -2.0440440381345339E+09, 9.1416457449079640E-06, 2.0440440381345336E+09, -1.6222124676640788E+08, -4.9484006166551071E+08, -5.8085130777589560E+07, -5.4814313598121714E+05,}, - {4.2138380313901440E+05, 9.2050522922791913E+07, 1.5259983101266613E+09, 4.7070559561237173E+09, -1.2448027572952359E+09, -1.0161446790279301E+10, -1.2448027572952316E+09, 4.7070559561237268E+09, 1.5259983101266615E+09, 9.2050522922791913E+07, 4.2138380313901149E+05,}, - {1.8969206922085886E+05, 8.4769319065313652E+07, 2.4230555767723408E+09, 1.5439732722639101E+10, 2.7112836839612309E+10, 2.5609833368650835E-06, -2.7112836839612328E+10, -1.5439732722639105E+10, -2.4230555767723408E+09, -8.4769319065313682E+07, -1.8969206922085711E+05,}, - {3.7794653219809625E+04, 3.4782300224660739E+07, 1.6188020733727551E+09, 1.7196758809615005E+10, 6.3754384857724617E+10, 9.7196447559193497E+10, 6.3754384857724617E+10, 1.7196758809614998E+10, 1.6188020733727560E+09, 3.4782300224660769E+07, 3.7794653219808984E+04,} - }}; - } else if constexpr(w==12) { - return std::array, nc> {{ - {-4.6087004144309118E-01, 2.5969759128998060E+00, -9.6946932216381381E+00, 2.4990041962121211E+01, -4.6013909139329137E+01, 6.2056985032913090E+01, -6.2056925855365186E+01, 4.6013921000662158E+01, -2.4990037445376750E+01, 9.6946954085586885E+00, -2.5969759201692755E+00, 4.6087004744129911E-01}, - {-1.0538365872268786E+01, 4.6577222488645518E+01, -1.2606964198473415E+02, 2.1881091668968099E+02, -2.3273399614976032E+02, 1.0274275204276027E+02, 1.0274270265494516E+02, -2.3273401859852868E+02, 2.1881091865396468E+02, -1.2606964777237258E+02, 4.6577222453584369E+01, -1.0538365860573146E+01}, - {-5.4577020998836872E+01, 1.3637112867242237E+02, 4.5513616580246023E+01, -1.1174001367986359E+03, 3.2018769312434206E+03, -5.0580351396215219E+03, 5.0580351683422405E+03, -3.2018769242193171E+03, 1.1174000998831286E+03, -4.5513609243969356E+01, -1.3637112867730119E+02, 5.4577021011726984E+01}, - {6.7849020474048089E+01, -1.7921351308204744E+03, 8.4980694686552797E+03, -1.9742624859769410E+04, 2.4620674845030797E+04, -1.1676544851227827E+04, -1.1676544869194569E+04, 2.4620674845030626E+04, -1.9742624831436660E+04, 8.4980694630406069E+03, -1.7921351308312935E+03, 6.7849020488592075E+01}, - {2.7986023314783361E+03, -1.9404411093655592E+04, 4.3922625000519314E+04, -7.6450317451901383E+03, -1.5273911974273989E+05, 3.3223441458516393E+05, -3.3223441441930021E+05, 1.5273911979752057E+05, 7.6450317512768806E+03, -4.3922624998141677E+04, 1.9404411093637758E+04, -2.7986023314644049E+03}, - {2.0817947751046438E+04, -5.5660303410315042E+04, -1.9519783923444615E+05, 1.0804817251338551E+06, -1.8264985852555393E+06, 9.7602844968061335E+05, 9.7602844962902542E+05, -1.8264985852963410E+06, 1.0804817251124913E+06, -1.9519783923503032E+05, -5.5660303410363231E+04, 2.0817947751063632E+04}, - {9.2873647411234080E+04, 3.6630046787425119E+05, -3.1271047224730137E+06, 4.8612412939252760E+06, 3.3820440907796426E+06, -1.6880127953704204E+07, 1.6880127953756198E+07, -3.3820440907614031E+06, -4.8612412938993908E+06, 3.1271047224752530E+06, -3.6630046787425695E+05, -9.2873647411217215E+04}, - {2.8527714307528478E+05, 4.6266378435690766E+06, -1.0665598090790771E+07, -2.6048960239891130E+07, 9.1597254427317813E+07, -5.9794495983264342E+07, -5.9794495983220413E+07, 9.1597254427343085E+07, -2.6048960239921503E+07, -1.0665598090794146E+07, 4.6266378435690673E+06, 2.8527714307530399E+05}, - {6.2536876825114002E+05, 2.4702814073680203E+07, 4.1488431554846466E+07, -2.9274790542418826E+08, 1.0742154109191516E+08, 6.2185168968032193E+08, -6.2185168968012476E+08, -1.0742154109184742E+08, 2.9274790542423087E+08, -4.1488431554843128E+07, -2.4702814073680237E+07, -6.2536876825112454E+05}, - {9.7829638830158755E+05, 8.2222351241519913E+07, 5.5676911894064474E+08, -4.8739037675427330E+08, -2.7153428193078227E+09, 2.5627633609246106E+09, 2.5627633609246163E+09, -2.7153428193078651E+09, -4.8739037675430620E+08, 5.5676911894064546E+08, 8.2222351241519868E+07, 9.7829638830161188E+05}, - {1.0657807616803218E+06, 1.8144472126890984E+08, 2.5524827004349842E+09, 5.2112383911371660E+09, -1.0268350564014645E+10, -1.4763245309081306E+10, 1.4763245309081314E+10, 1.0268350564014671E+10, -5.2112383911371059E+09, -2.5524827004349871E+09, -1.8144472126890984E+08, -1.0657807616803099E+06}, - {7.6621098001581512E+05, 2.6026568260310286E+08, 6.4524338253008652E+09, 3.3729904113826820E+10, 2.8555202212474091E+10, -6.8998572040731537E+10, -6.8998572040731445E+10, 2.8555202212474079E+10, 3.3729904113826824E+10, 6.4524338253008757E+09, 2.6026568260310274E+08, 7.6621098001583829E+05}, - {3.2561466099406168E+05, 2.2112758120210618E+08, 8.9911609880089817E+09, 8.3059508064200943E+10, 2.3965569143469864E+11, 1.6939286803305212E+11, -1.6939286803305203E+11, -2.3965569143469864E+11, -8.3059508064201080E+10, -8.9911609880089989E+09, -2.2112758120210618E+08, -3.2561466099404311E+05}, - {6.1722991679852908E+04, 8.4789650417103648E+07, 5.4431675199498701E+09, 7.8788892335272232E+10, 4.0355760945670044E+11, 8.8071481911347949E+11, 8.8071481911347961E+11, 4.0355760945670044E+11, 7.8788892335272430E+10, 5.4431675199498835E+09, 8.4789650417103708E+07, 6.1722991679871957E+04} - }}; - } else if constexpr(w==13) { - return std::array, nc> {{ - {-1.0957333716725008E-01, 7.2949317004436565E-01, -3.4300816058693728E+00, 1.0470054474579324E+01, -2.2292134950656113E+01, 3.4570827323582719E+01, -3.9923523442753932E+01, 3.4573264959502886E+01, -2.2292358612963266E+01, 1.0470042004916014E+01, -3.4300810538570281E+00, 7.2949352113279253E-01, -1.0957333740315604E-01}, - {-4.3050286009489040E+00, 2.1108975724659501E+01, -6.4297198812570272E+01, 1.2922884632277874E+02, -1.6991812716212596E+02, 1.2655005901719436E+02, 9.2483537895948854E-05, -1.2655066232531748E+02, 1.6991805207569072E+02, -1.2922893667436634E+02, 6.4297198424711908E+01, -2.1108976207523057E+01, 4.3050286009485790E+00}, - {-3.0093984465361217E+01, 9.8972865724808671E+01, -9.7437038666761538E+01, -3.5079928405373198E+02, 1.5699250566648977E+03, -3.1287439837941820E+03, 3.8692196309709061E+03, -3.1287462825615335E+03, 1.5699252631958864E+03, -3.5079944793112952E+02, -9.7437041893750632E+01, 9.8972866189610414E+01, -3.0093984465884773E+01}, - {-1.9043622268674213E+01, -6.8296542209516542E+02, 4.2702512274202591E+03, -1.2165497317825058E+04, 1.9423733298269544E+04, -1.6010024066956401E+04, 3.4018642874429026E-04, 1.6010021599471667E+04, -1.9423732817821805E+04, 1.2165497483905752E+04, -4.2702512286689680E+03, 6.8296542153908558E+02, 1.9043622268312891E+01}, - {1.2904654687550299E+03, -1.1169946055009055E+04, 3.3275109713863385E+04, -3.1765222274236821E+04, -5.9810982085323274E+04, 2.2355863038592847E+05, -3.1083591705219547E+05, 2.2355863445202672E+05, -5.9810982721084511E+04, -3.1765222464963932E+04, 3.3275109714208855E+04, -1.1169946054555618E+04, 1.2904654687545376E+03}, - {1.2421368748961073E+04, -5.0576243647011936E+04, -4.8878193436902722E+04, 6.5307896872028301E+05, -1.5497610127060430E+06, 1.5137725917321201E+06, 4.1615986404011299E-04, -1.5137725918538549E+06, 1.5497610130469005E+06, -6.5307896856811445E+05, 4.8878193438804832E+04, 5.0576243646433126E+04, -1.2421368748961073E+04}, - {6.7530100970876694E+04, 1.2373362326658823E+05, -2.1245597183281910E+06, 5.1047323238754412E+06, -1.4139444405488928E+06, -1.1818267555096827E+07, 2.0121548578624789E+07, -1.1818267557079868E+07, -1.4139444401348191E+06, 5.1047323236516044E+06, -2.1245597183309775E+06, 1.2373362326702787E+05, 6.7530100970876316E+04}, - {2.5248269397037517E+05, 3.0985559672616189E+06, -1.1816517087616559E+07, -8.2958498770184973E+06, 8.0546642347355247E+07, -1.0594657799485898E+08, 2.1816722293163801E-04, 1.0594657799424352E+08, -8.0546642347497791E+07, 8.2958498771036500E+06, 1.1816517087615721E+07, -3.0985559672621777E+06, -2.5248269397037517E+05}, - {6.8417206432039209E+05, 2.1561705510027152E+07, 7.5785249893055111E+06, -2.7456096030221754E+08, 3.4589095671054310E+08, 4.0256106808894646E+08, -1.0074306926603404E+09, 4.0256106809081393E+08, 3.4589095670997137E+08, -2.7456096030236483E+08, 7.5785249893030487E+06, 2.1561705510027405E+07, 6.8417206432039209E+05}, - {1.3593773865640305E+06, 9.1556445104158267E+07, 4.7074012944133747E+08, -1.1192579335657008E+09, -2.1090780087868555E+09, 5.2270306737951984E+09, 5.6467240041521856E-04, -5.2270306737934217E+09, 2.1090780087880819E+09, 1.1192579335658383E+09, -4.7074012944133127E+08, -9.1556445104157984E+07, -1.3593773865640305E+06}, - {1.9607419630386413E+06, 2.6425362558103892E+08, 3.1171259341747193E+09, 2.9839860297839913E+09, -1.9585031917561897E+10, -5.0666917387065792E+09, 3.6568794485480583E+10, -5.0666917387057562E+09, -1.9585031917561817E+10, 2.9839860297838497E+09, 3.1171259341747184E+09, 2.6425362558103728E+08, 1.9607419630386417E+06}, - {1.9937206140846491E+06, 5.2512029493765980E+08, 1.1253303793811750E+10, 4.6205527735932152E+10, -1.1607472377983305E+10, -1.6305241755642313E+11, 3.5385440504350348E-04, 1.6305241755642365E+11, 1.1607472377982582E+10, -4.6205527735932213E+10, -1.1253303793811750E+10, -5.2512029493765628E+08, -1.9937206140846489E+06}, - {1.3504711883426071E+06, 6.9286979077463162E+08, 2.4618123595484577E+10, 1.9493985627722607E+11, 3.9422703517046350E+11, -1.8678883613919861E+11, -8.5538079834550110E+11, -1.8678883613919730E+11, 3.9422703517046375E+11, 1.9493985627722589E+11, 2.4618123595484566E+10, 6.9286979077462614E+08, 1.3504711883426069E+06}, - {5.4491110456935549E+05, 5.4903670125539351E+08, 3.0879465445278183E+10, 3.9588436413399969E+11, 1.6860562536749778E+12, 2.4256447893117891E+12, -5.5583944938791784E-05, -2.4256447893117847E+12, -1.6860562536749768E+12, -3.9588436413399890E+11, -3.0879465445278183E+10, -5.4903670125538898E+08, -5.4491110456935526E+05}, - {9.8715725867495363E+04, 1.9828875496808097E+08, 1.7196758809614983E+10, 3.3083776881353577E+11, 2.2668873993375439E+12, 6.7734720591167568E+12, 9.6695220682534785E+12, 6.7734720591167432E+12, 2.2668873993375430E+12, 3.3083776881353503E+11, 1.7196758809614998E+10, 1.9828875496807891E+08, 9.8715725867496090E+04} - }}; - } else if constexpr(w==14) { - return std::array, nc> {{ - {1.5984868520881029E-02, 1.2876175212962959E-01, -9.8358742969175483E-01, 3.7711523389360830E+00, -9.4305498095765508E+00, 1.6842854581416674E+01, -2.2308566502972713E+01, 2.2308940200151390E+01, -1.6841512668820517E+01, 9.4313524091989347E+00, -3.7710716543179599E+00, 9.8361025494556609E-01, -1.2876100566420701E-01, -1.5984859433053292E-02}, - {-1.5925952284027161E+00, 8.5113930215357829E+00, -2.8993523187012922E+01, 6.6373454994590404E+01, -1.0329574518449559E+02, 1.0280184257681817E+02, -4.3896094875192006E+01, -4.3899302208087086E+01, 1.0280039795628096E+02, -1.0329511291885207E+02, 6.6373435700858948E+01, -2.8993536490606409E+01, 8.5113924808491728E+00, -1.5925952194145006E+00}, - {-1.4394533627743886E+01, 5.7000699089242815E+01, -1.0101142663923416E+02, -3.2954197414395189E+01, 6.1417879182394654E+02, -1.6177283846697430E+03, 2.4593386157454975E+03, -2.4593322941165261E+03, 1.6177291239900730E+03, -6.1417952013923764E+02, 3.2954100943010943E+01, 1.0101142710333265E+02, -5.7000699100179844E+01, 1.4394533639240331E+01}, - {-3.3076333188134086E+01, -1.8970588563697331E+02, 1.8160423493164808E+03, -6.3715703355644328E+03, 1.2525624574329036E+04, -1.4199806452802783E+04, 6.4441892296909591E+03, 6.4441909537524216E+03, -1.4199808176873401E+04, 1.2525626154733827E+04, -6.3715704433222418E+03, 1.8160422729911850E+03, -1.8970588700495102E+02, -3.3076333168231550E+01}, - {4.9913632908459954E+02, -5.5416668524952684E+03, 2.0614058717617296E+04, -3.2285139072943130E+04, -5.3099550821623425E+03, 1.1559000502166932E+05, -2.2569743259261423E+05, 2.2569743616896842E+05, -1.1559000130545651E+05, 5.3099543129458480E+03, 3.2285139142872020E+04, -2.0614058670790018E+04, 5.5416668533342381E+03, -4.9913632906195977E+02}, - {6.4806786522793900E+03, -3.5474227032974472E+04, 1.8237100709385861E+04, 3.0934714629696816E+05, -1.0394703931686131E+06, 1.4743920333143482E+06, -7.3356882447856572E+05, -7.3356882916658197E+05, 1.4743920305501707E+06, -1.0394703929917105E+06, 3.0934714631908614E+05, 1.8237100665157792E+04, -3.5474227033406372E+04, 6.4806786523010323E+03}, - {4.2715272622845026E+04, -2.2565910611953568E+03, -1.1769776156959014E+06, 4.0078399907813077E+06, -3.8951858063335596E+06, -5.0944610754510267E+06, 1.6765992446914168E+07, -1.6765992426657490E+07, 5.0944610781778870E+06, 3.8951858062361716E+06, -4.0078399907326135E+06, 1.1769776157141617E+06, 2.2565910606306688E+03, -4.2715272622820135E+04}, - {1.9151404903933613E+05, 1.7156606891563335E+06, -9.7733523156688716E+06, 4.2982266233154163E+06, 5.1660907884347722E+07, -1.1279400211155911E+08, 6.4701089573962681E+07, 6.4701089571562663E+07, -1.1279400211012064E+08, 5.1660907891220264E+07, 4.2982266233826512E+06, -9.7733523157112263E+06, 1.7156606891560503E+06, 1.9151404903936724E+05}, - {6.2759409419592959E+05, 1.5741723594963098E+07, -1.5632610223406436E+07, -1.9294824907078514E+08, 4.4643806532434595E+08, 1.5178998385244830E+07, -9.6771139891725647E+08, 9.6771139892509627E+08, -1.5178998381042883E+07, -4.4643806533176166E+08, 1.9294824907065383E+08, 1.5632610223392555E+07, -1.5741723594963137E+07, -6.2759409419590747E+05}, - {1.5361613559533111E+06, 8.3513615594416574E+07, 3.0077547202708024E+08, -1.3749596754067802E+09, -6.6733027297557127E+08, 5.9590333632819109E+09, -4.3025685566870070E+09, -4.3025685566872711E+09, 5.9590333632806673E+09, -6.6733027297523963E+08, -1.3749596754067125E+09, 3.0077547202709383E+08, 8.3513615594416171E+07, 1.5361613559533576E+06}, - {2.8079157920112358E+06, 3.0340753492383724E+08, 2.9498136661747241E+09, -6.2820200387919831E+08, -2.2372008390623215E+10, 1.5217518660584890E+10, 4.0682590266891922E+10, -4.0682590266869431E+10, -1.5217518660582748E+10, 2.2372008390625935E+10, 6.2820200387968791E+08, -2.9498136661747637E+09, -3.0340753492383808E+08, -2.8079157920112377E+06}, - {3.7733555140851745E+06, 7.8376718099107409E+08, 1.4443117772349569E+10, 4.3197433307418671E+10, -7.6585042240585556E+10, -1.8569640140763062E+11, 2.0385335192657199E+11, 2.0385335192656519E+11, -1.8569640140762662E+11, -7.6585042240580856E+10, 4.3197433307418686E+10, 1.4443117772349669E+10, 7.8376718099107552E+08, 3.7733555140852560E+06}, - {3.6089249230396422E+06, 1.4278058213962190E+09, 4.4296625537022423E+10, 2.9466624630419781E+11, 3.1903621584503235E+11, -9.8834691411254565E+11, -1.1072264714919226E+12, 1.1072264714919316E+12, 9.8834691411255151E+11, -3.1903621584503467E+11, -2.9466624630419769E+11, -4.4296625537022621E+10, -1.4278058213962219E+09, -3.6089249230396664E+06}, - {2.3170473769379663E+06, 1.7532505043698256E+09, 8.6523535958354309E+10, 9.7455289065487354E+11, 3.2977972139362314E+12, 1.7874626001697781E+12, -6.1480918082633916E+12, -6.1480918082633975E+12, 1.7874626001697690E+12, 3.2977972139362285E+12, 9.7455289065487329E+11, 8.6523535958354630E+10, 1.7532505043698275E+09, 2.3170473769380399E+06}, - {8.9188339002980455E+05, 1.3065352538728635E+09, 9.9400185225815567E+10, 1.7136059013402405E+12, 1.0144146621675832E+13, 2.3034036018490715E+13, 1.4630967270448871E+13, -1.4630967270448855E+13, -2.3034036018490719E+13, -1.0144146621675846E+13, -1.7136059013402405E+12, -9.9400185225815964E+10, -1.3065352538728662E+09, -8.9188339002979454E+05}, - {1.5499533202966207E+05, 4.4723032442444688E+08, 5.1495083701694740E+10, 1.2904576022918071E+12, 1.1534950432785506E+13, 4.5650102198520484E+13, 8.8830582190032641E+13, 8.8830582190032641E+13, 4.5650102198520492E+13, 1.1534950432785527E+13, 1.2904576022918074E+12, 5.1495083701695107E+10, 4.4723032442444855E+08, 1.5499533202970232E+05} - }}; - } else if constexpr(w==15) { - return std::array, nc> {{ - {4.3460786767313729E-03, -1.3199600771767199E-02, -1.9412688562910244E-01, 1.1329433700669471E+00, -3.4442045795063887E+00, 7.1737626956468912E+00, -1.1098109271625262E+01, 1.2385772358881393E+01, -1.1101471316239516E+01, 7.0913926025978853E+00, -3.4845491148773502E+00, 1.1323523856621058E+00, -1.9414904754428672E-01, -1.3200165079792004E-02, 4.3460782759443158E-03}, - {-4.9671584513490097E-01, 3.0617550953446115E+00, -1.1650665638578070E+01, 3.0081586723089057E+01, -5.4028356726202020E+01, 6.6077203078498044E+01, -4.7145500171928198E+01, 4.2118837140985958E-03, 4.7167106663349848E+01, -6.6048394423269173E+01, 5.4062906728994193E+01, -3.0081603709324451E+01, 1.1650672008416343E+01, -3.0617551285208524E+00, 4.9671584437353217E-01}, - {-6.1348505739169541E+00, 2.7872915855267404E+01, -6.5819942538871970E+01, 5.1366231962952028E+01, 1.7213955398158618E+02, -6.9658621010000411E+02, 1.3192236112353403E+03, -1.6054106225233884E+03, 1.3192031991952242E+03, -6.9663961216547739E+02, 1.7211403815802629E+02, 5.1367579954366171E+01, -6.5819957939661379E+01, 2.7872915947616441E+01, -6.1348505735855374E+00}, - {-2.3857631312588978E+01, -1.9651606133609231E+01, 6.4183083829803820E+02, -2.8648433109641578E+03, 6.8249243722518859E+03, -9.7944325124827701E+03, 7.6177757600121276E+03, 1.8034307737205296E-02, -7.6177559127722052E+03, 9.7944326623113047E+03, -6.8249058342322496E+03, 2.8648407117981119E+03, -6.4183085438795774E+02, 1.9651605969778377E+01, 2.3857631312809222E+01}, - {1.5389176594899303E+02, -2.3864418511494741E+03, 1.0846266954249364E+04, -2.2940053396478714E+04, 1.4780106121058996E+04, 4.2663651769852157E+04, -1.3047648013242516E+05, 1.7468401314164279E+05, -1.3047645484607235E+05, 4.2663541429144650E+04, 1.4780036296018619E+04, -2.2940053180976502E+04, 1.0846266927315819E+04, -2.3864418517113058E+03, 1.5389176594779781E+02}, - {2.9741655196834722E+03, -2.0687056403786246E+04, 3.3295507799709936E+04, 1.0661145730323243E+05, -5.6644238105382060E+05, 1.0874811616841732E+06, -9.6561270266008016E+05, 1.5626594062671070E-02, 9.6561272951271443E+05, -1.0874812528712249E+06, 5.6644243308078672E+05, -1.0661145838213131E+05, -3.3295507812197495E+04, 2.0687056403630129E+04, -2.9741655196846405E+03}, - {2.3793325531458529E+04, -4.2305332803808597E+04, -5.2884156985535356E+05, 2.5307340127864038E+06, -4.0404175271559842E+06, -1.7519992360184138E+05, 1.0146438805818636E+07, -1.5828545480742473E+07, 1.0146438778928882E+07, -1.7520004389869148E+05, -4.0404175770437294E+06, 2.5307340149977510E+06, -5.2884156989405944E+05, -4.2305332803937294E+04, 2.3793325531459184E+04}, - {1.2660319987326677E+05, 7.7519511328119377E+05, -6.5244610661450895E+06, 9.0878257488052379E+06, 2.3116605621149920E+07, -8.7079594462079599E+07, 9.5542733739275128E+07, 6.0548970733798724E-02, -9.5542733661364838E+07, 8.7079594608550951E+07, -2.3116605559600785E+07, -9.0878257522138134E+06, 6.5244610661298726E+06, -7.7519511328133650E+05, -1.2660319987326639E+05}, - {4.9358776531681651E+05, 9.7772970960585065E+06, -2.3511574237987626E+07, -1.0142613816641946E+08, 3.9421144218035364E+08, -2.8449115593052310E+08, -5.7549243243741119E+08, 1.1608781631182449E+09, -5.7549243240763104E+08, -2.8449115600447333E+08, 3.9421144214381480E+08, -1.0142613816429654E+08, -2.3511574237995699E+07, 9.7772970960588697E+06, 4.9358776531681546E+05}, - {1.4553539959296256E+06, 6.4136842048384041E+07, 1.3622336582062906E+08, -1.2131510424644001E+09, 6.4322366984221375E+08, 4.5078753872047586E+09, -7.1689413746930647E+09, 3.2906916833662987E-02, 7.1689413746724453E+09, -4.5078753875009747E+09, -6.4322366985365331E+08, 1.2131510424608817E+09, -1.3622336582067037E+08, -6.4136842048384242E+07, -1.4553539959296256E+06}, - {3.2693972344231778E+06, 2.8610260147425205E+08, 2.2348528403750563E+09, -3.4574515574242272E+09, -1.7480626463583939E+10, 3.1608597465540653E+10, 1.9879262560072273E+10, -6.6148013553772224E+10, 1.9879262560085339E+10, 3.1608597465515747E+10, -1.7480626463576942E+10, -3.4574515574198236E+09, 2.2348528403750110E+09, 2.8610260147425193E+08, 3.2693972344231787E+06}, - {5.5580012413990172E+06, 9.2345162185944164E+08, 1.4522950934020109E+10, 2.7025952371212009E+10, -1.2304576967641914E+11, -1.0116752717202786E+11, 3.8517418245458325E+11, 1.0918347404432817E-01, -3.8517418245444312E+11, 1.0116752717221135E+11, 1.2304576967643665E+11, -2.7025952371214943E+10, -1.4522950934020079E+10, -9.2345162185944211E+08, -5.5580012413990181E+06}, - {7.0146619045520434E+06, 2.1782897863065763E+09, 5.8897780310148087E+10, 3.1953009601770325E+11, 4.0651527029737198E+08, -1.6379148273276064E+12, -1.1568753137013029E+11, 2.7451653250460508E+12, -1.1568753137012485E+11, -1.6379148273277261E+12, 4.0651527029819238E+08, 3.1953009601770361E+11, 5.8897780310148087E+10, 2.1782897863065763E+09, 7.0146619045520443E+06}, - {6.3495763451755755E+06, 3.6841035003733950E+09, 1.5965774278321045E+11, 1.5630338683778201E+12, 3.8749058615819268E+12, -2.7319740087723574E+12, -1.3233342822865402E+13, 6.1642230420317079E-02, 1.3233342822865449E+13, 2.7319740087723975E+12, -3.8749058615819365E+12, -1.5630338683778203E+12, -1.5965774278321042E+11, -3.6841035003733935E+09, -6.3495763451755764E+06}, - {3.8829497354762917E+06, 4.2473082696966448E+09, 2.8414312556015540E+11, 4.3688281331121411E+12, 2.1823119508000543E+13, 3.2228098609392094E+13, -2.1833085454691789E+13, -7.3750710225100812E+13, -2.1833085454691820E+13, 3.2228098609392055E+13, 2.1823119508000594E+13, 4.3688281331121479E+12, 2.8414312556015527E+11, 4.2473082696966434E+09, 3.8829497354762889E+06}, - {1.4314487885226035E+06, 2.9961416925358453E+09, 3.0273361232748438E+11, 6.8507333793903584E+12, 5.4192702756911000E+13, 1.7551587948105309E+14, 2.1874615668430150E+14, 3.4316191014053393E-02, -2.1874615668430150E+14, -1.7551587948105334E+14, -5.4192702756911180E+13, -6.8507333793903701E+12, -3.0273361232748438E+11, -2.9961416925358458E+09, -1.4314487885226049E+06}, - {2.3939707792241839E+05, 9.7700272582690191E+08, 1.4715933396485257E+11, 4.7242424833337158E+12, 5.3987426629953594E+13, 2.7580474290566078E+14, 7.0693378336533400E+14, 9.6196578554477775E+14, 7.0693378336533400E+14, 2.7580474290566125E+14, 5.3987426629953766E+13, 4.7242424833337246E+12, 1.4715933396485263E+11, 9.7700272582690215E+08, 2.3939707792242285E+05} - }}; - } else if constexpr(w==16) { - return std::array, nc> {{ - {1.1808835093099178E-02, -2.5444299558662394E-02, -1.5661344238792723E-04, 2.5820071204205225E-01, -1.0930950485268096E+00, 2.6408492552008669E+00, -4.4415763059111955E+00, 6.8227366238712817E+00, -6.8186662643534008E+00, 4.4887924763186051E+00, -2.6327085361651021E+00, 1.0918739406714428E+00, -2.5844238963842503E-01, 1.2680123888735934E-04, 2.5444206395526567E-02, -1.1808834826225629E-02}, - {-1.5401723686076832E-01, 9.8067823888634464E-01, -4.1900843552415639E+00, 1.2150534299778382E+01, -2.4763139606227178E+01, 3.6068014621628578E+01, -3.4346647779134791E+01, 1.3259903958585387E+01, 1.2937147675617604E+01, -3.4454233206790519E+01, 3.6027670086257579E+01, -2.4769863695455662E+01, 1.2149431128889342E+01, -4.1901615115388706E+00, 9.8067695636810759E-01, -1.5401723756214594E-01}, - {-2.3155118729954247E+00, 1.1938503634469159E+01, -3.4150562973753665E+01, 4.8898615554511437E+01, 1.5853185548633874E+01, -2.4272678107130790E+02, 6.0151276286907887E+02, -8.8751856926690448E+02, 8.8742942550355474E+02, -6.0136491467620624E+02, 2.4282489356694586E+02, -1.5850195971204462E+01, -4.8897392545563044E+01, 3.4150562973753665E+01, -1.1938504430698943E+01, 2.3155118723150525E+00}, - {-1.2975319073401824E+01, 1.8283698218710011E+01, 1.7684015393859755E+02, -1.1059917445033070E+03, 3.1998168298121523E+03, -5.5988200120063057E+03, 5.9248751921324047E+03, -2.5990022806343668E+03, -2.5990962125709430E+03, 5.9247537039895724E+03, -5.5988835070734467E+03, 3.1998292349030621E+03, -1.1059926481090836E+03, 1.7684013881079576E+02, 1.8283698123134819E+01, -1.2975319073977776E+01}, - {3.1189837632471693E+01, -8.9083493807061564E+02, 4.9454293649337906E+03, -1.3124693635095375E+04, 1.5834784331991095E+04, 6.9607870364081436E+03, -5.9789871879430451E+04, 1.0841726514394575E+05, -1.0841709685990328E+05, 5.9790206615067997E+04, -6.9607049368128291E+03, -1.5834783935893831E+04, 1.3124692974990443E+04, -4.9454295091588992E+03, 8.9083493794871868E+02, -3.1189837631106176E+01}, - {1.2019749667923656E+03, -1.0378455844500613E+04, 2.6333352653155256E+04, 1.7117060106301305E+04, -2.5133287443653666E+05, 6.4713914262131555E+05, -8.1634942572553246E+05, 3.8623935281825601E+05, 3.8623876433339820E+05, -8.1634960962672008E+05, 6.4713900469564367E+05, -2.5133289627502396E+05, 1.7117057951236206E+04, 2.6333352581335013E+04, -1.0378455846609291E+04, 1.2019749667911419E+03}, - {1.1778892113375481E+04, -4.0077190108724200E+04, -1.8372552175909068E+05, 1.3262878399160223E+06, -2.9738539927520575E+06, 1.9493509709529271E+06, 4.1881949951139782E+06, -1.1066749616505133E+07, 1.1066749327519676E+07, -4.1881946843906553E+06, -1.9493507810665092E+06, 2.9738539818831389E+06, -1.3262878384774840E+06, 1.8372552162922107E+05, 4.0077190107319519E+04, -1.1778892113376129E+04}, - {7.3893334077310064E+04, 2.6983804209559254E+05, -3.6415998561101072E+06, 8.4025485849181097E+06, 4.9278860779345948E+06, -5.1437033846752726E+07, 8.7603898676325440E+07, -4.6199498412402093E+07, -4.6199498208604209E+07, 8.7603898435731798E+07, -5.1437033863736227E+07, 4.9278861005789889E+06, 8.4025485831489991E+06, -3.6415998560990733E+06, 2.6983804209473461E+05, 7.3893334077307401E+04}, - {3.3854610744280310E+05, 5.2176984975081543E+06, -2.0677283565079328E+07, -3.5831818968518838E+07, 2.6599346106412742E+08, -3.7992777977357000E+08, -1.3426914417466179E+08, 9.1752051229224503E+08, -9.1752051129499328E+08, 1.3426914497246322E+08, 3.7992777991069216E+08, -2.6599346104854536E+08, 3.5831818968908392E+07, 2.0677283564896725E+07, -5.2176984975075833E+06, -3.3854610744279937E+05}, - {1.1821527096621769E+06, 4.2281234059839502E+07, 2.8723226058712766E+07, -8.3553955857628822E+08, 1.2447304828823066E+09, 2.1955280943585949E+09, -7.0514195726908512E+09, 4.3745141239718714E+09, 4.3745141233600502E+09, -7.0514195728029747E+09, 2.1955280943510208E+09, 1.2447304828590808E+09, -8.3553955857879233E+08, 2.8723226058761366E+07, 4.2281234059838109E+07, 1.1821527096621762E+06}, - {3.1906872142825006E+06, 2.2785946180651775E+08, 1.3744578972809248E+09, -4.3997172592883167E+09, -9.2011130754043922E+09, 3.4690551711832901E+10, -9.4227043395047741E+09, -5.9308465070198639E+10, 5.9308465069336540E+10, 9.4227043396350136E+09, -3.4690551711738396E+10, 9.2011130753567543E+09, 4.3997172592879610E+09, -1.3744578972813025E+09, -2.2785946180651844E+08, -3.1906872142825015E+06}, - {6.6544809363384582E+06, 8.9490403680928326E+08, 1.1882638725190845E+10, 8.1552898137823076E+09, -1.2575562817886868E+11, 2.7074695075907585E+10, 3.9453789461955023E+11, -3.1679644857468066E+11, -3.1679644857392346E+11, 3.9453789461966650E+11, 2.7074695075992649E+10, -1.2575562817884555E+11, 8.1552898137788668E+09, 1.1882638725190889E+10, 8.9490403680928278E+08, 6.6544809363384554E+06}, - {1.0609303958036326E+07, 2.6255609052371716E+09, 6.1673589426039413E+10, 2.6044432099085333E+11, -3.5431628074578204E+11, -1.6077602129636348E+12, 1.5534405614728977E+12, 2.8019935380857432E+12, -2.8019935380841978E+12, -1.5534405614724106E+12, 1.6077602129635625E+12, 3.5431628074580896E+11, -2.6044432099084848E+11, -6.1673589426039429E+10, -2.6255609052371716E+09, -1.0609303958036322E+07}, - {1.2655725616100594E+07, 5.7342804054544210E+09, 2.1822836608899570E+11, 1.8300700858999690E+12, 2.7770431049857676E+12, -8.5034969223852568E+12, -1.2846668467423438E+13, 1.6519076896571838E+13, 1.6519076896572182E+13, -1.2846668467423555E+13, -8.5034969223850703E+12, 2.7770431049857896E+12, 1.8300700858999678E+12, 2.1822836608899567E+11, 5.7342804054544210E+09, 1.2655725616100591E+07}, - {1.0896915393078227E+07, 9.0890343524593849E+09, 5.3565169504010010E+11, 7.3004206720038701E+12, 2.9692333044160066E+13, 1.6051737468109549E+13, -9.1273329108089906E+13, -8.5999306918502953E+13, 8.5999306918502422E+13, 9.1273329108089984E+13, -1.6051737468109510E+13, -2.9692333044160082E+13, -7.3004206720038701E+12, -5.3565169504010022E+11, -9.0890343524593849E+09, -1.0896915393078227E+07}, - {6.3730995546265077E+06, 9.9060026035198078E+09, 8.8097248605449023E+11, 1.7953384130753688E+13, 1.2398425545001662E+14, 3.0749346493041262E+14, 1.0259777520247159E+14, -5.5291976457534325E+14, -5.5291976457534325E+14, 1.0259777520247186E+14, 3.0749346493041219E+14, 1.2398425545001659E+14, 1.7953384130753676E+13, 8.8097248605448950E+11, 9.9060026035198040E+09, 6.3730995546265030E+06}, - {2.2576246485480359E+06, 6.6499571180086451E+09, 8.7873753526056287E+11, 2.5606844387131066E+13, 2.6313738449330153E+14, 1.1495095100701460E+15, 2.1932582707747560E+15, 1.2860244365132595E+15, -1.2860244365132600E+15, -2.1932582707747578E+15, -1.1495095100701465E+15, -2.6313738449330159E+14, -2.5606844387131062E+13, -8.7873753526056299E+11, -6.6499571180086451E+09, -2.2576246485480373E+06}, - {3.6434551345570839E+05, 2.0744705928579483E+09, 4.0355760945669995E+11, 1.6364575388763029E+13, 2.3514830376056538E+14, 1.5192201717462528E+15, 4.9956173084674090E+15, 8.9287666945127360E+15, 8.9287666945127390E+15, 4.9956173084674090E+15, 1.5192201717462528E+15, 2.3514830376056538E+14, 1.6364575388763035E+13, 4.0355760945670026E+11, 2.0744705928579524E+09, 3.6434551345571183E+05} - }}; - } else { - static_assert(w >= 2, "w must be >= 2"); - static_assert(w <= 16, "w must be <= 16"); - return {}; - } +template constexpr auto get_horner_coeffs_200() noexcept { + if constexpr (w == 2) { + return std::array, 4>{{ + {-2.5024197515954172E-01, 2.5024197515954183E-01}, + {-2.2584311526143722E-02, -2.2584311526143454E-02}, + {7.0481840008800800E-01, -7.0481840008800789E-01}, + {5.5428559551548429E-01, 5.5428559551548384E-01}, + }}; + } else if constexpr (w == 3) { + return std::array, 6>{{ + {-4.5057857403454230E-03, -2.2085344902082910E-17, 4.5057857475245119E-03}, + {-4.2902993854032984E-02, 6.0475925925925544E-02, -4.2902993846219581E-02}, + {-1.7450587318669355E-02, 4.7841151834284663E-18, 1.7450587325767687E-02}, + {2.0160576446392525E-01, -3.7666666666667292E-01, 2.0160576447145476E-01}, + {3.5966530797580987E-01, 2.1212921335912769E-17, -3.5966530796781049E-01}, + {1.7787237246937579E-01, 1.0000000000000013E+00, 1.7787237247678458E-01}, + }}; + } else if constexpr (w == 4) { + return std::array, 7>{{ + {-7.3657365672905517E-04, 3.7144674885204070E-04, 3.7144674885202628E-04, + -7.3657365672907674E-04}, + {-5.7512181801490803E-03, 1.0945950376831749E-02, -1.0945950376831702E-02, + 5.7512181801490803E-03}, + {-3.5432868834529780E-03, 2.8903049344238094E-03, 2.8903049344237578E-03, + -3.5432868834529736E-03}, + {3.7516840869185726E-02, -1.0412335657155609E-01, 1.0412335657155619E-01, + -3.7516840869185719E-02}, + {1.0408888748149286E-01, -1.0268333881994469E-01, -1.0268333881994463E-01, + 1.0408888748149286E-01}, + {1.0749328817387331E-01, 4.5419700247912276E-01, -4.5419700247912287E-01, + -1.0749328817387331E-01}, + {3.9828257752799377E-02, 7.3911656575585805E-01, 7.3911656575585805E-01, + 3.9828257752799384E-02}, + }}; + } else if constexpr (w == 5) { + return std::array, 8>{{ + {-3.4201716508580047E-05, 2.3137115416451718E-05, 2.5987213744756162E-17, + -2.3137115416372002E-05, 3.4201716508570079E-05}, + {-5.6059657038176342E-04, 1.2116190166775124E-03, -1.5448333333332248E-03, + 1.2116190166775590E-03, -5.6059657038177242E-04}, + {-9.2488937959280416E-04, 1.2476700479676119E-03, -2.7206380314284564E-17, + -1.2476700479676119E-03, 9.2488937959280416E-04}, + {4.0593041193018580E-03, -1.6067481167759527E-02, 2.4150000000000067E-02, + -1.6067481167759551E-02, 4.0593041193018554E-03}, + {2.0250135419918228E-02, -3.9381037339048575E-02, 2.5392611358194196E-17, + 3.9381037339048602E-02, -2.0250135419918248E-02}, + {3.6562231959204307E-02, 7.8509612097392850E-02, -2.3000000000000043E-01, + 7.8509612097392975E-02, 3.6562231959204300E-02}, + {3.0826052021380449E-02, 3.8431958613457989E-01, -1.0606460667956290E-16, + -3.8431958613457956E-01, -3.0826052021380446E-02}, + {1.0051451410391413E-02, 3.8286382489474302E-01, 1.0000000000000007E+00, + 3.8286382489474247E-01, 1.0051451410391420E-02}, + }}; + } else if constexpr (w == 6) { + return std::array, 9>{{ + {-1.5875418082720764E-06, 7.2147850126235124E-07, -7.0930078220514644E-08, + -7.0930078220514644E-08, 7.2147850127765077E-07, -1.5875417996313146E-06}, + {-4.6695893922777881E-05, 1.1717219021518970E-04, -1.8098268625854635E-04, + 1.8098268625862607E-04, -1.1717219021518182E-04, 4.6695893931715671E-05}, + {-1.2239646122606701E-04, 2.2750660293441327E-04, -1.2702072030312787E-04, + -1.2702072030306311E-04, 2.2750660293440248E-04, -1.2239646121695602E-04}, + {3.2622379114950018E-04, -1.8514138516535202E-03, 3.8520985619445395E-03, + -3.8520985619445863E-03, 1.8514138516535124E-03, -3.2622379114026403E-04}, + {2.7444270008043924E-03, -8.0004810696544873E-03, 5.2920367975574324E-03, + 5.2920367975573977E-03, -8.0004810696544925E-03, 2.7444270008144425E-03}, + {7.3669955501269365E-03, 4.9102900025223429E-03, -5.1302324979469460E-02, + 5.1302324979469523E-02, -4.9102900025223065E-03, -7.3669955501178136E-03}, + {1.0180085126333447E-02, 9.2337811484268964E-02, -1.0253741712233809E-01, + -1.0253741712233820E-01, 9.2337811484268992E-02, 1.0180085126343141E-02}, + {7.2383827471879155E-03, 2.0903648995439442E-01, 3.2052935784357639E-01, + -3.2052935784357617E-01, -2.0903648995439442E-01, -7.2383827471776269E-03}, + {2.0875119883113405E-03, 1.5741818314646630E-01, 8.2446837122968764E-01, + 8.2446837122968797E-01, 1.5741818314646627E-01, 2.0875119883208733E-03}, + }}; + } else if constexpr (w == 7) { + return std::array, 10>{{ + {-1.5030958477791755E-08, -9.3540219413709317E-08, 1.3079704875006950E-07, + -3.2241315608379925E-17, -1.3079704868363920E-07, 9.3540219416477249E-08, + 1.5030959705495632E-08}, + {-3.2859430043338334E-06, 9.3570096164196706E-06, -1.7015821249913417E-05, + 2.0688046128709321E-05, -1.7015821249913417E-05, 9.3570096164234958E-06, + -3.2859430029059141E-06}, + {-1.2513684117292326E-05, 2.9105578584771500E-05, -2.8835295309280147E-05, + 3.4204613883790509E-17, 2.8835295309401381E-05, -2.9105578584773161E-05, + 1.2513684118771961E-05}, + {1.6363160465888369E-05, -1.5802085209242327E-04, 4.4431051893381075E-04, + -6.0985626028862202E-04, 4.4431051893372624E-04, -1.5802085209243048E-04, + 1.6363160467394535E-05}, + {2.8413019973530621E-04, -1.1175797418592197E-03, 1.3906361031251863E-03, + -3.3449040113448959E-17, -1.3906361031251863E-03, 1.1175797418592314E-03, + -2.8413019973377808E-04}, + {1.0735311014902873E-03, -7.2030895675482935E-04, -6.6760503000562778E-03, + 1.2656705539358897E-02, -6.6760503000563636E-03, -7.2030895675483466E-04, + 1.0735311014919515E-03}, + {2.1552691780265211E-03, 1.3627105791872403E-02, -3.3718114813591091E-02, + 9.1739351594304141E-17, 3.3718114813591160E-02, -1.3627105791872408E-02, + -2.1552691780250184E-03}, + {2.4904843753404821E-03, 5.4888936725282354E-02, 2.4759577399513299E-02, + -1.6428571428571420E-01, 2.4759577399513219E-02, 5.4888936725282375E-02, + 2.4904843753420958E-03}, + {1.5569364307494555E-03, 8.9228372765634070E-02, 3.5049603091348175E-01, + -1.2727752801547551E-16, -3.5049603091348197E-01, -8.9228372765634056E-02, + -1.5569364307477628E-03}, + {4.0677823488318105E-04, 5.5714997521829554E-02, 5.1113018541287836E-01, + 1.0000000000000004E+00, 5.1113018541287858E-01, 5.5714997521829540E-02, + 4.0677823488476019E-04}, + }}; + } else if constexpr (w == 8) { + return std::array, 10>{{ + {-1.9601350641697596E-07, 6.2981383505349922E-07, -1.3252363384678579E-06, + 1.9071649677086492E-06, -1.9071649677418643E-06, 1.3252363384844655E-06, + -6.2981383506145699E-07, 1.9601350641688405E-07}, + {-1.0444417486660109E-06, 2.8837147790363758E-06, -3.9445588398358392E-06, + 1.9505656879865072E-06, 1.9505656879375492E-06, -3.9445588398358392E-06, + 2.8837147790380012E-06, -1.0444417486659870E-06}, + {8.7290223704599643E-08, -9.9551635569511269E-06, 3.9042123573727561E-05, + -7.0647330846731457E-05, 7.0647330846733124E-05, -3.9042123573704312E-05, + 9.9551635569469747E-06, -8.7290223704651537E-08}, + {2.3288943339077674E-05, -1.1810885265513386E-04, 2.1380000655379325E-04, + -1.1905274322671857E-04, -1.1905274322666821E-04, 2.1380000655377886E-04, + -1.1810885265513567E-04, 2.3288943339077756E-05}, + {1.2112223749399396E-04, -2.3174709024353631E-04, -5.1773322458159175E-04, + 1.8691284471382202E-03, -1.8691284471382202E-03, 5.1773322458161506E-04, + 2.3174709024353533E-04, -1.2112223749399399E-04}, + {3.3122072653963831E-04, 1.3353118718124433E-03, -5.9878504390516426E-03, + 4.3217905833729652E-03, 4.3217905833728282E-03, -5.9878504390516859E-03, + 1.3353118718124383E-03, 3.3122072653963847E-04}, + {5.5053208919074686E-04, 9.2359485489686838E-03, -6.2169545154249859E-03, + -3.1386277864020484E-02, 3.1386277864020540E-02, 6.2169545154249963E-03, + -9.2359485489686872E-03, -5.5053208919074697E-04}, + {5.5627094085228127E-04, 2.4604803324737454E-02, 6.5902977410162808E-02, + -9.1064379250067509E-02, -9.1064379250067509E-02, 6.5902977410162836E-02, + 2.4604803324737447E-02, 5.5627094085228149E-04}, + {3.1361556564941533E-04, 3.2518751351035650E-02, 2.4295266212395961E-01, + 2.5083142126627189E-01, -2.5083142126627200E-01, -2.4295266212395961E-01, + -3.2518751351035650E-02, -3.1361556564941516E-04}, + {7.5442178667263954E-05, 1.7659090182402852E-02, 2.6112828482312656E-01, + 8.6561421087578294E-01, 8.6561421087578283E-01, 2.6112828482312644E-01, + 1.7659090182402852E-02, 7.5442178667263873E-05}, + }}; + } else if constexpr (w == 9) { + return std::array, 11>{{ + {-1.0121400696639382E-08, 3.6191328859115424E-08, -8.7258577130274595E-08, + 1.4622014472389451E-07, -1.7333902183589538E-07, 1.4622014475109679E-07, + -8.7258577123989584E-08, 3.6191328857387053E-08, -1.0121400696607466E-08}, + {-7.3256982980632681E-08, 2.3321978963689725E-07, -4.0030411107271311E-07, + 3.4388260962519006E-07, -1.6867455797025957E-17, -3.4388260995180576E-07, + 4.0030411105472155E-07, -2.3321978963603227E-07, 7.3256982980605642E-08}, + {-8.1737159283255514E-08, -4.1540916378286498E-07, 2.6668107554239935E-06, + -6.3261434127972289E-06, 8.2578681450047054E-06, -6.3261434126197552E-06, + 2.6668107554392931E-06, -4.1540916378625952E-07, -8.1737159283261483E-08}, + {1.5345430093717280E-06, -9.9308189188290649E-06, 2.3762810604644528E-05, + -2.4017602201901366E-05, -1.1468142860888204E-17, 2.4017602202089031E-05, + -2.3762810604641208E-05, 9.9308189188344622E-06, -1.5345430093717798E-06}, + {1.1032857092605834E-05, -3.4254477931957202E-05, -1.3557143976035342E-05, + 1.8667778536559447E-04, -2.9974999576615630E-04, 1.8667778536541582E-04, + -1.3557143976042535E-05, -3.4254477931960353E-05, 1.1032857092605854E-05}, + {3.9567294647305451E-05, 8.1817980646548685E-05, -7.2116754318329347E-04, + 1.0390038161996692E-03, 1.3900173479267018E-17, -1.0390038161999335E-03, + 7.2116754318327797E-04, -8.1817980646548685E-05, -3.9567294647305479E-05}, + {8.8459828362140154E-05, 1.1147546008569563E-03, -2.1200589329645721E-03, + -2.9677441441083030E-03, 7.7692043895745341E-03, -2.9677441441080454E-03, + -2.1200589329645721E-03, 1.1147546008569587E-03, 8.8459828362140127E-05}, + {1.2783089927061671E-04, 4.4048543606096746E-03, 6.4505427512762383E-03, + -2.6627297241817623E-02, 5.0907892336476291E-17, 2.6627297241817893E-02, + -6.4505427512762392E-03, -4.4048543606096851E-03, -1.2783089927061677E-04}, + {1.1601811379064815E-04, 9.2861699099147117E-03, 5.4760895870332296E-02, + -2.7420112488899190E-04, -1.2777777777777782E-01, -2.7420112488923623E-04, + 5.4760895870332310E-02, 9.2861699099147411E-03, 1.1601811379064820E-04}, + {6.0003223623206657E-05, 1.0569385595664994E-02, 1.3202059711663527E-01, + 3.1241329121161582E-01, -6.3638764007737742E-17, -3.1241329121161615E-01, + -1.3202059711663530E-01, -1.0569385595665030E-02, -6.0003223623206657E-05}, + {1.3445576990655669E-05, 5.1377966678943553E-03, 1.1569392196071673E-01, + 5.9595989228910684E-01, 1.0000000000000004E+00, 5.9595989228910784E-01, + 1.1569392196071668E-01, 5.1377966678943891E-03, 1.3445576990655669E-05}, + }}; + } else if constexpr (w == 10) { + return std::array, 12>{{ + {-4.4040059171412067E-10, 1.7857872824825793E-09, -4.9203237628693688E-09, + 9.5125261839819949E-09, -1.3157194845364040E-08, 1.3157194812996284E-08, + -9.5125262237318697E-09, 4.9203237570488512E-09, -1.7857872831569075E-09, + 4.4040059171633886E-10}, + {-4.4291858217017104E-09, 1.5904364892171725E-08, -3.2603275107603078E-08, + 3.8190045579900928E-08, -1.7631718328624946E-08, -1.7631718392731933E-08, + 3.8190045599384427E-08, -3.2603275104460579E-08, 1.5904364893271601E-08, + -4.4291858217152902E-09}, + {-1.0412910456846279E-08, -3.6228831478765483E-09, 1.3932530225087088E-07, + -4.5071262435551458E-07, 7.5149884412259115E-07, -7.5149884433295379E-07, + 4.5071262442194489E-07, -1.3932530225640674E-07, 3.6228831474873082E-09, + 1.0412910456862496E-08}, + {8.0572098823824191E-08, -6.8352224328347800E-07, 2.0695541423476481E-06, + -2.9709579577199207E-06, 1.5005770225504653E-06, 1.5005770225994236E-06, + -2.9709579578790350E-06, 2.0695541423461179E-06, -6.8352224328405176E-07, + 8.0572098823813736E-08}, + {8.3366418668162695E-07, -3.5785601754620480E-06, 2.4539930904838030E-06, + 1.2754336575757957E-05, -3.3000414536134188E-05, 3.3000414536278678E-05, + -1.2754336575753804E-05, -2.4539930904804814E-06, 3.5785601754631898E-06, + -8.3366418668162208E-07}, + {3.8359011440648835E-06, 1.3049698816908465E-06, -6.3791463619209036E-05, + 1.4528730872073815E-04, -8.6630472952427834E-05, -8.6630472952399048E-05, + 1.4528730872079033E-04, -6.3791463619214443E-05, 1.3049698816899472E-06, + 3.8359011440648708E-06}, + {1.1063475580065303E-05, 1.0180053030149664E-04, -3.4137441280837188E-04, + -4.9828659222659531E-05, 1.0442648308816227E-03, -1.0442648308818948E-03, + 4.9828659222721751E-05, 3.4137441280836993E-04, -1.0180053030149543E-04, + -1.1063475580065282E-05}, + {2.1363614860997127E-05, 5.7553475552091639E-04, 1.4813144535930596E-04, + -4.1113061120761881E-03, 3.3662735809591028E-03, 3.3662735809590343E-03, + -4.1113061120763173E-03, 1.4813144535930382E-04, 5.7553475552091368E-04, + 2.1363614860997080E-05}, + {2.7622345748507502E-05, 1.7317590416004948E-03, 7.6620063086756491E-03, + -9.8393115612840920E-03, -2.1163068654269146E-02, 2.1163068654269441E-02, + 9.8393115612840434E-03, -7.6620063086756422E-03, -1.7317590416004902E-03, + -2.7622345748507452E-05}, + {2.2925449299630729E-05, 3.1050615653861954E-03, 3.2337657329423494E-02, + 4.4760550762170469E-02, -8.0226193254406372E-02, -8.0226193254406220E-02, + 4.4760550762170517E-02, 3.2337657329423487E-02, 3.1050615653861859E-03, + 2.2925449299630675E-05}, + {1.1010978063160392E-05, 3.1454190365986022E-03, 6.0943215953720313E-02, + 2.5074802988370321E-01, 2.0598750885032696E-01, -2.0598750885032721E-01, + -2.5074802988370321E-01, -6.0943215953720313E-02, -3.1454190365985909E-03, + -1.1010978063160389E-05}, + {2.3186292807626206E-06, 1.3952040327729878E-03, 4.5894237568906808E-02, + 3.4666431215091636E-01, 8.9110862394332080E-01, 8.9110862394332024E-01, + 3.4666431215091609E-01, 4.5894237568906815E-02, 1.3952040327729794E-03, + 2.3186292807626312E-06}, + }}; + } else if constexpr (w == 11) { + return std::array, 13>{{ + {-1.6776727231328416E-11, 7.5440974158024552E-11, -2.3911386524068553E-10, + 5.3207180481239914E-10, -8.5057642651644847E-10, 9.9272871999260090E-10, + -8.5057648776788347E-10, 5.3207179256211214E-10, -2.3911386498547126E-10, + 7.5440974102196413E-11, -1.6776727230829949E-11}, + {-2.3293080872927463E-10, 9.3461130373861974E-10, -2.2220140858706851E-09, + 3.2420144189661432E-09, -2.5573586925383353E-09, -5.6612065112108297E-17, + 2.5573586278028237E-09, -3.2420144306071784E-09, 2.2220140837412273E-09, + -9.3461130374749249E-10, 2.3293080872975987E-10}, + {-8.6163117991759351E-10, 1.2292710052307758E-09, 4.9928263030434056E-09, + -2.5746199383297511E-08, 5.5054682067879709E-08, -6.9606951448910763E-08, + 5.5054682119416694E-08, -2.5746199404038006E-08, 4.9928263027291555E-09, + 1.2292710051522133E-09, -8.6163117991951154E-10}, + {3.1778958300840877E-09, -3.9044067083629674E-08, 1.4726158788157950E-07, + -2.7451209287892671E-07, 2.4544112211910511E-07, -1.2096711311755274E-17, + -2.4544112210526550E-07, 2.7451209284571153E-07, -1.4726158788330946E-07, + 3.9044067083510739E-08, -3.1778958300837498E-09}, + {5.3160526822192399E-08, -2.9438470061320831E-07, 4.4816653818040024E-07, + 4.9835853876401780E-07, -2.6602444110713340E-06, 3.9090815375281570E-06, + -2.6602444110835736E-06, 4.9835853872423912E-07, 4.4816653818231268E-07, + -2.9438470061324415E-07, 5.3160526822193524E-08}, + {3.1074712008817151E-07, -3.7942806006715527E-07, -4.2327710785732912E-06, + 1.4518421536638065E-05, -1.6373413879626877E-05, -2.5348737439255354E-17, + 1.6373413879625217E-05, -1.4518421536614087E-05, 4.2327710785712152E-06, + 3.7942806006725903E-07, -3.1074712008816986E-07}, + {1.1248609988572039E-06, 7.1593996360417439E-06, -3.7923443960739139E-05, + 2.8219312687374916E-05, 8.5797383067766139E-05, -1.6875309167107462E-04, + 8.5797383067713081E-05, 2.8219312687382113E-05, -3.7923443960742731E-05, + 7.1593996360415194E-06, 1.1248609988571965E-06}, + {2.7801202330030060E-06, 5.8401836435976375E-05, -5.7255962675852127E-05, + -4.1058481683293790E-04, 7.4543249761820096E-04, -1.1763859565712905E-17, + -7.4543249761829431E-04, 4.1058481683289903E-04, 5.7255962675851158E-05, + -5.8401836435976402E-05, -2.7801202330029937E-06}, + {4.7836299264887183E-06, 2.3732554180006435E-04, 7.1846854433599121E-04, + -2.2660086673713040E-03, -1.3190061226034701E-03, 5.2488730277989084E-03, + -1.3190061226034527E-03, -2.2660086673713599E-03, 7.1846854433598741E-04, + 2.3732554180006416E-04, 4.7836299264886963E-06}, + {5.6395387871289762E-06, 5.9760549110825397E-04, 5.0911332059142217E-03, + 1.6690038662948302E-03, -2.1030028251698030E-02, -6.2059675980830466E-17, + 2.1030028251698099E-02, -1.6690038662947877E-03, -5.0911332059142252E-03, + -5.9760549110825386E-04, -5.6395387871289448E-06}, + {4.3353827605930494E-06, 9.4705645354715528E-04, 1.5700144896729010E-02, + 4.8428271550326779E-02, -1.2807080799297177E-02, -1.0454545454545444E-01, + -1.2807080799297078E-02, 4.8428271550326855E-02, 1.5700144896729010E-02, + 9.4705645354715518E-04, 4.3353827605930206E-06}, + {1.9516358260453373E-06, 8.7214421096705637E-04, 2.4929466432368100E-02, + 1.5885079249667186E-01, 2.7894884556454935E-01, -4.2425842671825161E-17, + -2.7894884556454946E-01, -1.5885079249667192E-01, -2.4929466432368107E-02, + -8.7214421096705637E-04, -1.9516358260453182E-06}, + {3.8884809238313185E-07, 3.5785567372179962E-04, 1.6654951019551330E-02, + 1.7692785324424576E-01, 6.5593328211813140E-01, 1.0000000000000002E+00, + 6.5593328211813118E-01, 1.7692785324424568E-01, 1.6654951019551327E-02, + 3.5785567372179962E-04, 3.8884809238312624E-07}, + }}; + } else if constexpr (w == 12) { + return std::array, 14>{{ + {-4.7539080515542580E-13, 2.6787995697670693E-12, -1.0000146136716776E-11, + 2.5777402448424271E-11, -4.7463679303544195E-11, 6.4012208879125011E-11, + -6.4012248551446094E-11, 4.7463663434615762E-11, -2.5777396894299317E-11, + 1.0000149211321660E-11, -2.6787995790652696E-12, 4.7539081135422603E-13}, + {-1.0870401168050591E-11, 4.8044744326063225E-11, -1.3004175788816287E-10, + 2.2570502165107441E-10, -2.4006684671217922E-10, 1.0597990739279489E-10, + 1.0597992372651088E-10, -2.4006685283732272E-10, 2.2570503824000470E-10, + -1.3004176146116325E-10, 4.8044744334038674E-11, -1.0870401155791457E-11}, + {-5.6296594748046544E-11, 1.4066781263743013E-10, 4.6947620085301740E-11, + -1.1526063790854956E-09, 3.3027593311030557E-09, -5.2174001589202684E-09, + 5.2174000697669761E-09, -3.3027593717047144E-09, 1.1526063504087998E-09, + -4.6947618097807960E-11, -1.4066781268623019E-10, 5.6296594761372986E-11}, + {6.9986758891654079E-11, -1.8486004429655807E-09, 8.7658205605928853E-09, + -2.0364661375797448E-08, 2.5396405344356160E-08, -1.2044441220062096E-08, + -1.2044441164754107E-08, 2.5396405365096656E-08, -2.0364661348771956E-08, + 8.7658205579217619E-09, -1.8486004429017487E-09, 6.9986758906816106E-11}, + {2.8867786924316934E-09, -2.0015791402110268E-08, 4.5306507659307604E-08, + -7.8859059636103066E-09, -1.5755151475869637E-07, 3.4270221889093394E-07, + -3.4270221896290014E-07, 1.5755151472824914E-07, 7.8859059580744467E-09, + -4.5306507657318156E-08, 2.0015791402056882E-08, -2.8867786924176715E-09}, + {2.1473864761678232E-08, -5.7414008446893210E-08, -2.0134799316449521E-07, + 1.1145247706155282E-06, -1.8840465966169550E-06, 1.0067804560971022E-06, + 1.0067804560971022E-06, -1.8840465966230748E-06, 1.1145247706170582E-06, + -2.0134799316564268E-07, -5.7414008446863325E-08, 2.1473864761695973E-08}, + {9.5799843879056626E-08, 3.7784160107118267E-07, -3.2256313018480346E-06, + 5.0144058082789751E-06, 3.4886031174209264E-06, -1.7411974954214207E-05, + 1.7411974954235796E-05, -3.4886031174051491E-06, -5.0144058082478364E-06, + 3.2256313018492801E-06, -3.7784160107122159E-07, -9.5799843879039130E-08}, + {2.9426545129495859E-07, 4.7724106401924093E-06, -1.1001642128367906E-05, + -2.6869692251292144E-05, 9.4483235217683692E-05, -6.1678458203290321E-05, + -6.1678458203254352E-05, 9.4483235217685495E-05, -2.6869692251315525E-05, + -1.1001642128368805E-05, 4.7724106401924229E-06, 2.9426545129497829E-07}, + {6.4507244019416563E-07, 2.5481132674301245E-05, 4.2795619387511915E-05, + -3.0197159708155482E-04, 1.1080610219043500E-04, 6.4144454802694513E-04, + -6.4144454802697625E-04, -1.1080610219045833E-04, 3.0197159708158204E-04, + -4.2795619387510939E-05, -2.5481132674301316E-05, -6.4507244019415007E-07}, + {1.0091198513153350E-06, 8.4812954286468410E-05, 5.7431140218944536E-04, + -5.0274672420764957E-04, -2.8008958990917753E-03, 2.6435090762446183E-03, + 2.6435090762445667E-03, -2.8008958990918438E-03, -5.0274672420767526E-04, + 5.7431140218944330E-04, 8.4812954286468437E-05, 1.0091198513153600E-06}, + {1.0993606197695949E-06, 1.8716155179384023E-04, 2.6329045000561338E-03, + 5.3754303637599914E-03, -1.0591878410592578E-02, -1.5228395084945702E-02, + 1.5228395084945730E-02, 1.0591878410592587E-02, -5.3754303637599428E-03, + -2.6329045000561338E-03, -1.8716155179384034E-04, -1.0993606197695828E-06}, + {7.9035220764954430E-07, 2.6846594761214740E-04, 6.6557324960729147E-03, + 3.4792641812076711E-02, 2.9454899103693734E-02, -7.1172529707069124E-02, + -7.1172529707069096E-02, 2.9454899103693782E-02, 3.4792641812076718E-02, + 6.6557324960729259E-03, 2.6846594761214735E-04, 7.9035220764956854E-07}, + {3.3587389488258577E-07, 2.2809471090022899E-04, 9.2744480587562007E-03, + 8.5676487647660032E-02, 2.4720659158040617E-01, 1.7472997738461996E-01, + -1.7472997738462001E-01, -2.4720659158040628E-01, -8.5676487647660143E-02, + -9.2744480587562180E-03, -2.2809471090022904E-04, -3.3587389488256655E-07}, + {6.3667715563015570E-08, 8.7461142088576766E-05, 5.6146669497086606E-03, + 8.1271316412301384E-02, 4.1627261402765736E-01, 9.0846375182673733E-01, + 9.0846375182673733E-01, 4.1627261402765731E-01, 8.1271316412301550E-02, + 5.6146669497086693E-03, 8.7461142088576834E-05, 6.3667715563034920E-08}, + }}; + } else if constexpr (w == 13) { + return std::array, 15>{{ + {-1.1331825570440727E-14, 7.5442530545509575E-14, -3.5473155765082429E-13, + 1.0827877815183058E-12, -2.3054260653186393E-12, 3.5752119738669225E-12, + -4.1288702029291516E-12, 3.5754810437391768E-12, -2.3054322758177103E-12, + 1.0827809499693276E-12, -3.5473128594148992E-13, 7.5442566328658522E-14, + -1.1331825569256169E-14}, + {-4.4521627552749709E-13, 2.1830423159171809E-12, -6.6494701742631481E-12, + 1.3364546912215633E-11, -1.7572522963316000E-11, 1.3087514697366595E-11, + -8.4435734857040533E-18, -1.3087609910937195E-11, 1.7572511855066095E-11, + -1.3364550482724530E-11, 6.6494700750823452E-12, -2.1830423529162694E-12, + 4.4521627549722952E-13}, + {-3.1122514900942224E-12, 1.0235548890361649E-11, -1.0076717484352820E-11, + -3.6278870299335626E-11, 1.6235810773706083E-10, -3.2356767144198370E-10, + 4.0014568953167669E-10, -3.2356778577799558E-10, 1.6235815163392255E-10, + -3.6278895693159697E-11, -1.0076717659812659E-11, 1.0235548935223541E-11, + -3.1122514900513855E-12}, + {-1.9694481417906755E-12, -7.0630732029806550E-11, 4.4161967738503258E-10, + -1.2581280904632460E-09, 2.0087583294349134E-09, -1.6557204113066525E-09, + -2.4838776856226866E-17, 1.6557200331149790E-09, -2.0087583290445127E-09, + 1.2581281109060392E-09, -4.4161967758023283E-10, 7.0630731987661026E-11, + 1.9694481417581824E-12}, + {1.3345700642135977E-10, -1.1551704392497283E-09, 3.4412362337817539E-09, + -3.2850871137761556E-09, -6.1855158894413326E-09, 2.3119925542057157E-08, + -3.2145944250702619E-08, 2.3119925991120319E-08, -6.1855159390928232E-09, + -3.2850871338881514E-09, 3.4412362340567228E-09, -1.1551704392030819E-09, + 1.3345700642135018E-10}, + {1.2845897306281068E-09, -5.2304801922931164E-09, -5.0548716984338105E-09, + 6.7539942920393712E-08, -1.6027276235916921E-07, 1.5655092163694814E-07, + -2.0049126746331200E-17, -1.5655092175596911E-07, 1.6027276234256162E-07, + -6.7539942914165863E-08, 5.0548716981743173E-09, 5.2304801922274408E-09, + -1.2845897306281596E-09}, + {6.9838095920571053E-09, 1.2796250155223251E-08, -2.1971713837867670E-07, + 5.2791981730845992E-07, -1.4622692109166607E-07, -1.2222183756557477E-06, + 2.0809248310447731E-06, -1.2222183757291852E-06, -1.4622692100904889E-07, + 5.2791981729507288E-07, -2.1971713837877233E-07, 1.2796250155280027E-08, + 6.9838095920571284E-09}, + {2.6111186487625189E-08, 3.2044561720736560E-07, -1.2220373462324990E-06, + -8.5793794342312014E-07, 8.3299507234022271E-06, -1.0956754351203854E-05, + 4.2374504788607687E-17, 1.0956754351086770E-05, -8.3299507234225711E-06, + 8.5793794342312014E-07, 1.2220373462324990E-06, -3.2044561720740451E-07, + -2.6111186487625219E-08}, + {7.0755520230584412E-08, 2.2298625886400112E-06, 7.8375383351921547E-07, + -2.8394470622678201E-05, 3.5771256766246747E-05, 4.1631950912197713E-05, + -1.0418619302464089E-04, 4.1631950912400947E-05, 3.5771256766178408E-05, + -2.8394470622675504E-05, 7.8375383351932791E-07, 2.2298625886400150E-06, + 7.0755520230584359E-08}, + {1.4058372037094500E-07, 9.4685595066536152E-06, 4.8682874512158753E-05, + -1.1575111217135236E-04, -2.1811605515766828E-04, 5.4056763477039569E-04, + 1.9368559350380580E-17, -5.4056763477032576E-04, 2.1811605515769940E-04, + 1.1575111217134847E-04, -4.8682874512158509E-05, -9.4685595066535983E-06, + -1.4058372037094503E-07}, + {2.0277547837406113E-07, 2.7328509487415513E-05, 3.2236608098850332E-04, + 3.0859705461357004E-04, -2.0254394973525094E-03, -5.2398574644554148E-04, + 3.7818616294950373E-03, -5.2398574644547274E-04, -2.0254394973524665E-03, + 3.0859705461356787E-04, 3.2236608098850332E-04, 2.7328509487415378E-05, + 2.0277547837406113E-07}, + {2.0618605552701890E-07, 5.4306747658367629E-05, 1.1637911071900912E-03, + 4.7784706844645301E-03, -1.2004184173789252E-03, -1.6862510515566049E-02, + 9.7663889839209053E-18, 1.6862510515566097E-02, 1.2004184173788634E-03, + -4.7784706844645371E-03, -1.1637911071900916E-03, -5.4306747658367324E-05, + -2.0618605552701893E-07}, + {1.3966266158866419E-07, 7.1655019336418715E-05, 2.5459504018621160E-03, + 2.0160236969440630E-02, 4.0770064165298381E-02, -1.9317276988534519E-02, + -8.8461538461538702E-02, -1.9317276988534231E-02, 4.0770064165298381E-02, + 2.0160236969440609E-02, 2.5459504018621169E-03, 7.1655019336418200E-05, + 1.3966266158866422E-07}, + {5.6353468219321982E-08, 5.6780128053894706E-05, 3.1934841481628330E-03, + 4.0941461360716913E-02, 1.7436810648693343E-01, 2.5085467225681685E-01, + -4.2425842671825272E-17, -2.5085467225681662E-01, -1.7436810648693341E-01, + -4.0941461360716816E-02, -3.1934841481628322E-03, -5.6780128053894245E-05, + -5.6353468219322028E-08}, + {1.0208956054983660E-08, 2.0506572462261995E-05, 1.7784497194617914E-03, + 3.4214490279693019E-02, 2.3443634373410052E-01, 7.0049708882252781E-01, + 9.9999999999999956E-01, 7.0049708882252670E-01, 2.3443634373410033E-01, + 3.4214490279692915E-02, 1.7784497194617914E-03, 2.0506572462261771E-05, + 1.0208956054983704E-08}, + }}; + } else if constexpr (w == 14) { + return std::array, 16>{{ + {1.6573977048758373E-16, 1.3350705098663598E-15, -1.0198682011443083E-14, + 3.9098729470330932E-14, -9.7793954863110993E-14, 1.7461760909376988E-13, + -2.3139300803193430E-13, 2.3133712649617930E-13, -1.7464512743103152E-13, + 9.7793532432495125E-14, -3.9100087283024766E-14, 1.0198847966327885E-14, + -1.3350639093879870E-15, -1.6573967195923749E-16}, + {-1.6512890189653285E-14, 8.8250732683937202E-14, -3.0062086690296025E-13, + 6.8819285466437257E-13, -1.0710400014754661E-12, 1.0658737978231948E-12, + -4.5539043383551768E-13, -4.5538732858598216E-13, 1.0658669662742166E-12, + -1.0710350330762092E-12, 6.8819363097675645E-13, -3.0062096394200824E-13, + 8.8250729348219931E-14, -1.6512890096369287E-14}, + {-1.4925032356594262E-13, 5.9101412859019032E-13, -1.0473415219044306E-12, + -3.4168917194284013E-13, 6.3681359177110198E-12, -1.6773482744373957E-11, + 2.5499660495751048E-11, -2.5499681125358013E-11, 1.6773489091945331E-11, + -6.3681446456216585E-12, 3.4168897358123469E-13, 1.0473414475188284E-12, + -5.9101412655620904E-13, 1.4925032367339251E-13}, + {-3.4295334315359932E-13, -1.9669734025378269E-12, 1.8829710628324230E-11, + -6.6063899195501951E-11, 1.2987243582507169E-10, -1.4723144009119097E-10, + 6.6816630074648980E-11, 6.6816585156930012E-11, -1.4723144213290547E-10, + 1.2987245930478841E-10, -6.6063899004091207E-11, 1.8829709958386662E-11, + -1.9669734162456265E-12, -3.4295334295109775E-13}, + {5.1753158905731111E-12, -5.7459004388635483E-11, 2.1373772903641436E-10, + -3.3474981778015193E-10, -5.5056512295298501E-11, 1.1984997396258443E-09, + -2.3401535495753279E-09, 2.3401534462256513E-09, -1.1984997901649717E-09, + 5.5056485464132478E-11, 3.3474981628953162E-10, -2.1373772851292269E-10, + 5.7459004398894591E-11, -5.1753158903325276E-12}, + {6.7195187479838651E-11, -3.6781600571601283E-10, 1.8909214073475932E-10, + 3.2074788108853071E-09, -1.0777792240321408E-08, 1.5287295334927549E-08, + -7.6060393527572334E-09, -7.6060393515002332E-09, 1.5287295319215051E-08, + -1.0777792242206908E-08, 3.2074788110424317E-09, 1.8909214034194689E-10, + -3.6781600571877484E-10, 6.7195187480061628E-11}, + {4.4289508956510068E-10, -2.3397558744219687E-11, -1.2203541602842489E-08, + 4.1555456454833886E-08, -4.0387396856849884E-08, -5.2822132680810253E-08, + 1.7383889339056799E-07, -1.7383889348606158E-07, 5.2822132664202676E-08, + 4.0387396840242307E-08, -4.1555456456217852E-08, 1.2203541602842489E-08, + 2.3397558739320396E-11, -4.4289508956485780E-10}, + {1.9857214221989461E-09, 1.7788899565182485E-08, -1.0133541198304996E-07, + 4.4566342393624423E-08, 5.3564828267956768E-07, -1.1695093255217001E-06, + 6.7085595112856254E-07, 6.7085595109184377E-07, -1.1695093255400593E-06, + 5.3564828275147516E-07, 4.4566342396301834E-08, -1.0133541198318143E-07, + 1.7788899565178749E-08, 1.9857214221992583E-09}, + {6.5072355972924813E-09, 1.6321871905298928E-07, -1.6208737249938854E-07, + -2.0005919851713336E-06, 4.6289117401622691E-06, 1.5738407906772272E-07, + -1.0033756087449713E-05, 1.0033756087433936E-05, -1.5738407907104422E-07, + -4.6289117402421935E-06, 2.0005919851702955E-06, 1.6208737249954423E-07, + -1.6321871905298441E-07, -6.5072355972922497E-09}, + {1.5927753226313465E-08, 8.6591441391883585E-07, 3.1186030532597906E-06, + -1.4256326863804729E-05, -6.9192418278078509E-06, 6.1786486497531192E-05, + -4.4611361914715045E-05, -4.4611361914675478E-05, 6.1786486497559070E-05, + -6.9192418278168430E-06, -1.4256326863804280E-05, 3.1186030532597906E-06, + 8.6591441391883140E-07, 1.5927753226313942E-08}, + {2.9113992252245392E-08, 3.1458937074171811E-06, 3.0585266291431803E-05, + -6.5135387342531804E-06, -2.3196510408356695E-04, 1.5778347828059787E-04, + 4.2181913759730289E-04, -4.2181913759743511E-04, -1.5778347828065232E-04, + 2.3196510408355917E-04, 6.5135387342541527E-06, -3.0585266291432135E-05, + -3.1458937074171904E-06, -2.9113992252245418E-08}, + {3.9124194363163294E-08, 8.1265227753122953E-06, 1.4975407030324924E-04, + 4.4789439277602671E-04, -7.9407521150519009E-04, -1.9254008995686696E-03, + 2.1136619999319452E-03, 2.1136619999320310E-03, -1.9254008995687039E-03, + -7.9407521150514065E-04, 4.4789439277602807E-04, 1.4975407030325019E-04, + 8.1265227753123105E-06, 3.9124194363164148E-08}, + {3.7419288907183448E-08, 1.4804264337309593E-05, 4.5929141335173085E-04, + 3.0552592910038081E-03, 3.3079403387824137E-03, -1.0247716289024917E-02, + -1.1480323948535254E-02, 1.1480323948535244E-02, 1.0247716289024917E-02, + -3.3079403387824436E-03, -3.0552592910038129E-03, -4.5929141335173296E-04, + -1.4804264337309631E-05, -3.7419288907183713E-08}, + {2.4024402573674993E-08, 1.8178651135370016E-05, 8.9712289901830596E-04, + 1.0104692380253471E-02, 3.4193348251104448E-02, 1.8533380680638742E-02, + -6.3746746886473818E-02, -6.3746746886473721E-02, 1.8533380680638804E-02, + 3.4193348251104413E-02, 1.0104692380253476E-02, 8.9712289901830910E-04, + 1.8178651135370050E-05, 2.4024402573675764E-08}, + {9.2475302076758741E-09, 1.3546865389183958E-05, 1.0306349751547583E-03, + 1.7767594411827761E-02, 1.0518000824290018E-01, 2.3882936521395406E-01, + 1.5170179567585840E-01, -1.5170179567585848E-01, -2.3882936521395406E-01, + -1.0518000824290037E-01, -1.7767594411827757E-02, -1.0306349751547620E-03, + -1.3546865389183984E-05, -9.2475302076758013E-09}, + {1.6070755785071470E-09, 4.6371263117318249E-06, 5.3392892770691479E-04, + 1.3380163586766325E-02, 1.1960061568997662E-01, 4.7332499268789302E-01, + 9.2104360429933840E-01, 9.2104360429933885E-01, 4.7332499268789296E-01, + 1.1960061568997690E-01, 1.3380163586766332E-02, 5.3392892770691815E-04, + 4.6371263117318359E-06, 1.6070755785075478E-09}, + }}; + } else if constexpr (w == 15) { + return std::array, 17>{{ + {4.5179136270516879E-18, -1.3721567983016968E-17, -2.0188039379638457E-16, + 1.1787961810528452E-15, -3.6002979849300605E-15, 7.4771830629950721E-15, + -1.1466606614177747E-14, 1.2929793395674386E-14, -1.1481537091539957E-14, + 7.4099959148651253E-15, -3.6189610816328235E-15, 1.1783179391998368E-15, + -2.0189132920460885E-16, -1.3721681893519305E-17, 4.5179138940294278E-18}, + {-5.1635500303423897E-16, 3.1828102524634415E-15, -1.2111395036223793E-14, + 3.1272176408626341E-14, -5.6181159756113080E-14, 6.8652488307259956E-14, + -4.9059039919968102E-14, -1.9388362148879701E-17, 4.9009555190681807E-14, + -6.8669083795740107E-14, 5.6191961910432889E-14, -3.1272613926049905E-14, + 1.2111362976757412E-14, -3.1828104881948118E-15, 5.1635500248749881E-16}, + {-6.3774103677168823E-15, 2.8974955180500696E-14, -6.8422375867171716E-14, + 5.3398530878603272E-14, 1.7893255188637643E-13, -7.2419108095498065E-13, + 1.3713257052105891E-12, -1.6687592372473224E-12, 1.3713291209850782E-12, + -7.2419667040414461E-13, 1.7892478876253759E-13, 5.3400510475182175E-14, + -6.8422363737290718E-14, 2.8974955332124205E-14, -6.3774103674947777E-15}, + {-2.4800914617581790E-14, -2.0428591850792014E-14, 6.6720754938105064E-13, + -2.9781124760980002E-12, 7.0947582817473084E-12, -1.0181652063894561E-11, + 7.9189094930423407E-12, -9.8394354439677929E-18, -7.9189221881850869E-12, + 1.0181666345930150E-11, -7.0947471734974048E-12, 2.9781096494451229E-12, + -6.6720756797745112E-13, 2.0428591947648267E-14, 2.4800914616825102E-14}, + {1.5997634038702646E-13, -2.4807970167387033E-12, 1.1275106680112280E-11, + -2.3847055462676874E-11, 1.5364449544552166E-11, 4.4350560279013230E-11, + -1.3563512446398317E-10, 1.8159082249266700E-10, -1.3563514079769914E-10, + 4.4350479631290549E-11, 1.5364417897977443E-11, -2.3847054792739306E-11, + 1.1275106670142972E-11, -2.4807970166140870E-12, 1.5997634038751326E-13}, + {3.0917581107079110E-12, -2.1504981482082260E-11, 3.4611945847529536E-11, + 1.1082666372508343E-10, -5.8883841601722089E-10, 1.1304779835787544E-09, + -1.0037911764569433E-09, -3.0283968181148084E-17, 1.0037910961054091E-09, + -1.1304781035382004E-09, 5.8883843170422537E-10, -1.1082666581905009E-10, + -3.4611945887456865E-11, 2.1504981481250442E-11, -3.0917581107099418E-12}, + {2.4734066313993841E-11, -4.3978001546130925E-11, -5.4975091407909014E-10, + 2.6307942053065240E-09, -4.2001676300414851E-09, -1.8212709476483809E-10, + 1.0547608728554078E-08, -1.6454374657490009E-08, 1.0547608700900084E-08, + -1.8212715510082630E-10, -4.2001676441827325E-09, 2.6307942080562109E-09, + -5.4975091408400028E-10, -4.3978001546169286E-11, 2.4734066313994739E-11}, + {1.3160883866734162E-10, 8.0584478671628169E-10, -6.7824252839146209E-09, + 9.4471403085770161E-09, 2.4030590210440211E-08, -9.0522548461561274E-08, + 9.9320303281521742E-08, -3.3235747494939870E-17, -9.9320303331344472E-08, + 9.0522548575046391E-08, -2.4030590184144877E-08, -9.4471403129019068E-09, + 6.7824252838551532E-09, -8.0584478671661959E-10, -1.3160883866734426E-10}, + {5.1310324414219323E-10, 1.0163871982746417E-08, -2.4441175134513117E-08, + -1.0543632600128869E-07, 4.0979777876948477E-07, -2.9573937050886787E-07, + -5.9824625885776880E-07, 1.2067769777215239E-06, -5.9824625888224795E-07, + -2.9573937051804759E-07, 4.0979777875189036E-07, -1.0543632599908938E-07, + -2.4441175134504150E-08, 1.0163871982746604E-08, 5.1310324414219250E-10}, + {1.5128957992049935E-09, 6.6672685257782830E-08, 1.4160936684819443E-07, + -1.2611166225406650E-06, 6.6865545481274985E-07, 4.6861078169603807E-06, + -7.4523870622367549E-06, 3.4449326618851042E-17, 7.4523870622915596E-06, + -4.6861078171685983E-06, -6.6865545481586376E-07, 1.2611166225370321E-06, + -1.4160936684822037E-07, -6.6672685257784048E-08, -1.5128957992049958E-09}, + {3.3986627004323941E-09, 2.9741452947022137E-07, 2.3232144780590986E-06, + -3.5941523174517531E-06, -1.8171775676703349E-05, 3.2858338560999192E-05, + 2.0665249075282785E-05, -6.8763374485658282E-05, 2.0665249075243218E-05, + 3.2858338560903870E-05, -1.8171775676688959E-05, -3.5941523174468073E-06, + 2.3232144780590283E-06, 2.9741452947022068E-07, 3.3986627004323950E-09}, + {5.7777535593445582E-09, 9.5996306286140537E-07, 1.5097159537535539E-05, + 2.8094504791463487E-05, -1.2791075475385979E-04, -1.0516749004206970E-04, + 4.0040320377523060E-04, -5.3767305800596667E-17, -4.0040320377526947E-04, + 1.0516749004224858E-04, 1.2791075475386367E-04, -2.8094504791466405E-05, + -1.5097159537535578E-05, -9.5996306286140621E-07, -5.7777535593445615E-09}, + {7.2920076887968842E-09, 2.2644150332986927E-06, 6.1226481435401080E-05, + 3.3216368068303837E-04, 4.2258807580772573E-07, -1.7026747228854225E-03, + -1.2026158633577104E-04, 2.8537037037045169E-03, -1.2026158633587413E-04, + -1.7026747228854396E-03, 4.2258807580342979E-07, 3.3216368068303599E-04, + 6.1226481435401053E-05, 2.2644150332986923E-06, 7.2920076887968825E-09}, + {6.6006259688120903E-09, 3.8297656275654615E-06, 1.6597029248061418E-04, + 1.6248331197066910E-03, 4.0281119347581806E-03, -2.8399908290139670E-03, + -1.3756562885831731E-02, 8.4642037860646445E-18, 1.3756562885831830E-02, + 2.8399908290139726E-03, -4.0281119347581763E-03, -1.6248331197066903E-03, + -1.6597029248061428E-04, -3.8297656275654632E-06, -6.6006259688120903E-09}, + {4.0364738474324407E-09, 4.4152383936309399E-06, 2.9537757977456613E-04, + 4.5415629108243203E-03, 2.2685962261788536E-02, 3.3502333548319392E-02, + -2.2696322242195928E-02, -7.6666666666667105E-02, -2.2696322242195890E-02, + 3.3502333548319295E-02, 2.2685962261788574E-02, 4.5415629108243290E-03, + 2.9537757977456602E-04, 4.4152383936309408E-06, 4.0364738474324407E-09}, + {1.4880454274285380E-09, 3.1146031777409664E-06, 3.1470309742465704E-04, + 7.1215977556942766E-03, 5.6335374470954699E-02, 1.8245542837228426E-01, + 2.2739494478010194E-01, -8.4851685343650138E-17, -2.2739494478010203E-01, + -1.8245542837228429E-01, -5.6335374470954797E-02, -7.1215977556942861E-03, + -3.1470309742465704E-04, -3.1146031777409677E-06, -1.4880454274285417E-09}, + {2.4886236238313275E-10, 1.0156314710024850E-06, 1.5297772142853732E-04, + 4.9110296377727252E-03, 5.6121982134094042E-02, 2.8670951404936740E-01, + 7.3488453954210708E-01, 1.0000000000000018E+00, 7.3488453954210708E-01, + 2.8670951404936773E-01, 5.6121982134094160E-02, 4.9110296377727304E-03, + 1.5297772142853735E-04, 1.0156314710024854E-06, 2.4886236238313405E-10}, + }}; + } else if constexpr (w == 16) { + return std::array, 18>{{ + {1.2307507958064464E-18, -2.6518508071733353E-18, -1.1738826401341014E-20, + 2.6948814943373302E-17, -1.1509910460329600E-16, 2.8279944900173787E-16, + -4.6726530883316867E-16, 6.6203450429457653E-16, -6.6004614127826513E-16, + 4.7069975404316101E-16, -2.8081108598542653E-16, 1.1491834432908588E-16, + -2.6954463701942368E-17, 1.1451975380255613E-20, 2.6518459803532692E-18, + -1.2307508038870603E-18}, + {-1.6052119849944121E-17, 1.0220931367339573E-16, -4.3668875981049212E-16, + 1.2658945204775534E-15, -2.5919308700797615E-15, 3.7378450076294255E-15, + -3.5206065620092615E-15, 1.3556873444887233E-15, 1.3825622037407022E-15, + -3.5235926574817036E-15, 3.7296332450802098E-15, -2.5925840784643585E-15, + 1.2657662116877219E-15, -4.3668857755368841E-16, 1.0220931367339573E-16, + -1.6052119749827469E-17}, + {-2.4132931376483073E-16, 1.2442653568449662E-15, -3.5592674167315351E-15, + 5.0955768471980872E-15, 1.6433757901515860E-15, -2.5292369304993825E-14, + 6.2705842006972340E-14, -9.2647844753490817E-14, 9.2624309333464405E-14, + -6.2708738674052505E-14, 2.5283784911407270E-14, -1.6454577696154606E-15, + -5.0957126284674709E-15, 3.5592589304021987E-15, -1.2442654599774408E-15, + 2.4132931371807006E-16}, + {-1.3523251102433609E-15, 1.9055797797121101E-15, 1.8430802267160460E-14, + -1.1526994860082207E-13, 3.3348703176907399E-13, -5.8352482961996788E-13, + 6.1748228591582172E-13, -2.7106468455582230E-13, -2.7107027400498627E-13, + 6.1750014110065109E-13, -5.8352296647024653E-13, 3.3348780808145787E-13, + -1.1526990978520290E-13, 1.8430803480148559E-14, 1.9055798650003358E-15, + -1.3523251103173957E-15}, + {3.2506946752710782E-15, -9.2845381976413515E-14, 5.1542690454602287E-13, + -1.3678932749752010E-12, 1.6503393979160946E-12, 7.2550201768889120E-13, + -6.2314790536140772E-12, 1.1299389559457127E-11, -1.1299395907028501E-11, + 6.2314933356496677E-12, -7.2549567011751778E-13, -1.6503411831705432E-12, + 1.3678932005895990E-12, -5.1542690687057296E-13, 9.2845381921931865E-14, + -3.2506946753420181E-15}, + {1.2527329159245277E-13, -1.0816725478983629E-12, 2.7445378617411554E-12, + 1.7839887814412696E-12, -2.6194657489648952E-11, 6.7446676626524242E-11, + -8.5082169359569567E-11, 4.0254977976937753E-11, 4.0255018811227722E-11, + -8.5082173442998567E-11, 6.7446660803236882E-11, -2.6194658255291886E-11, + 1.7839886059814300E-12, 2.7445378627380862E-12, -1.0816725479139400E-12, + 1.2527329159255924E-13}, + {1.2276300481455858E-12, -4.1769601374580106E-12, -1.9148402820678083E-11, + 1.3822953605936348E-10, -3.0994364315672905E-10, 2.0316700797680967E-10, + 4.3650567492219507E-10, -1.1534087876776367E-09, 1.1534087287626426E-09, + -4.3650568826679616E-10, -2.0316702022119098E-10, 3.0994363911075959E-10, + -1.3822953621907280E-10, 1.9148402809587158E-11, 4.1769601372500562E-12, + -1.2276300481457296E-12}, + {7.7013760205810495E-12, 2.8123297626112544E-11, -3.7953802134892808E-10, + 8.7573780433573981E-10, 5.1359846170264275E-10, -5.3609157562628785E-09, + 9.1303304588329059E-09, -4.8150451155485792E-09, -4.8150451281185763E-09, + 9.1303304734455279E-09, -5.3609157606623776E-09, 5.1359846248826757E-10, + 8.7573780425717729E-10, -3.7953802134524547E-10, 2.8123297626093363E-11, + 7.7013760205810866E-12}, + {3.5284250010876544E-11, 5.4380355945615962E-10, -2.1550460241863304E-09, + -3.7344953350225554E-09, 2.7722604309770562E-08, -3.9597167025382683E-08, + -1.3993916658989759E-08, 9.5626629211485668E-08, -9.5626629251620657E-08, + 1.3993916686669056E-08, 3.9597167023998724E-08, -2.7722604313576463E-08, + 3.7344953348063106E-09, 2.1550460241816002E-09, -5.4380355945633912E-10, + -3.5284250010876789E-11}, + {1.2320735888479567E-10, 4.4066719437555919E-09, 2.9936173156415513E-09, + -8.7082338359625540E-08, 1.2972939456024976E-07, 2.2882425901978947E-07, + -7.3491924909951292E-07, 4.5592445663881905E-07, 4.5592445668777740E-07, + -7.3491924909951292E-07, 2.2882425901519963E-07, 1.2972939456177968E-07, + -8.7082338359685309E-08, 2.9936173156430456E-09, 4.4066719437555919E-09, + 1.2320735888479557E-10}, + {3.3254260763955980E-10, 2.3748169129616548E-08, 1.4324995919581946E-07, + -4.5855119979513952E-07, -9.5896649524474271E-07, 3.6155491754929462E-06, + -9.8206137492975964E-07, -6.1812989820939710E-06, 6.1812989821267707E-06, + 9.8206137495882303E-07, -3.6155491754861996E-06, 9.5896649524349715E-07, + 4.5855119979513952E-07, -1.4324995919581623E-07, -2.3748169129616750E-08, + -3.3254260763955995E-10}, + {6.9354916180818914E-10, 9.3269475195063855E-08, 1.2384428187212307E-06, + 8.4996778392780880E-07, -1.3106613626291306E-05, 2.8218026704008473E-06, + 4.1119875273747256E-05, -3.3017437945364753E-05, -3.3017437945361154E-05, + 4.1119875273773338E-05, 2.8218026703918548E-06, -1.3106613626292205E-05, + 8.4996778392747158E-07, 1.2384428187212307E-06, 9.3269475195063524E-08, + 6.9354916180818924E-10}, + {1.1057322032863294E-09, 2.7364351668058891E-07, 6.4277990516970045E-06, + 2.7144256967440260E-05, -3.6927862875713990E-05, -1.6756539822665589E-04, + 1.6190404775919697E-04, 2.9203183363573547E-04, -2.9203183363575488E-04, + -1.6190404775916586E-04, 1.6756539822664033E-04, 3.6927862875711076E-05, + -2.7144256967440016E-05, -6.4277990516969969E-06, -2.7364351668058902E-07, + -1.1057322032863298E-09}, + {1.3190161602522575E-09, 5.9764321317063347E-07, 2.2744388605473007E-05, + 1.9073517322668122E-04, 2.8943142766412957E-04, -8.8625893129445996E-04, + -1.3389167739520143E-03, 1.7216657535079883E-03, 1.7216657535080399E-03, + -1.3389167739520486E-03, -8.8625893129445140E-04, 2.8943142766413012E-04, + 1.9073517322668078E-04, 2.2744388605472990E-05, 5.9764321317063347E-07, + 1.3190161602522575E-09}, + {1.1357078950958105E-09, 9.4728532805183307E-07, 5.5827161828283832E-05, + 7.6087086075588245E-04, 3.0946204357507547E-03, 1.6729582927767583E-03, + -9.5127691406673535E-03, -8.9630953638635182E-03, 8.9630953638635789E-03, + 9.5127691406673934E-03, -1.6729582927767586E-03, -3.0946204357507555E-03, + -7.6087086075588234E-04, -5.5827161828283825E-05, -9.4728532805183349E-07, + -1.1357078950958109E-09}, + {6.6422278409342463E-10, 1.0324321112746625E-06, 9.1817488865684755E-05, + 1.8711533829047159E-03, 1.2921996060610222E-02, 3.2047854205940307E-02, + 1.0693035516337730E-02, -5.7626889750985288E-02, -5.7626889750985406E-02, + 1.0693035516337771E-02, 3.2047854205940300E-02, 1.2921996060610223E-02, + 1.8711533829047159E-03, 9.1817488865684755E-05, 1.0324321112746625E-06, + 6.6422278409342463E-10}, + {2.3529614069937343E-10, 6.9307767643753116E-07, 9.1584555859393314E-05, + 2.6688190455647263E-03, 2.7424935799146798E-02, 1.1980519064171602E-01, + 2.2858769149343988E-01, 1.3403316930972972E-01, -1.3403316930972986E-01, + -2.2858769149343991E-01, -1.1980519064171602E-01, -2.7424935799146809E-02, + -2.6688190455647263E-03, -9.1584555859393314E-05, -6.9307767643753127E-07, + -2.3529614069937420E-10}, + {3.7973138383475537E-11, 2.1620729770457849E-07, 4.2059935922517660E-05, + 1.7055631615451750E-03, 2.4507833223051386E-02, 1.5833750021928361E-01, + 5.2065761855025594E-01, 9.3058177132107822E-01, 9.3058177132107800E-01, + 5.2065761855025572E-01, 1.5833750021928361E-01, 2.4507833223051390E-02, + 1.7055631615451755E-03, 4.2059935922517687E-05, 2.1620729770457854E-07, + 3.7973138383475505E-11}, + }}; + } + static_assert(w >= 2, "w must be >= 2"); + static_assert(w <= 16, "w must be <= 16"); }; - - diff --git a/src/ker_lowupsampfac_horner_allw_loop_constexpr.c b/src/ker_lowupsampfac_horner_allw_loop_constexpr.c index cfbbb0964..60e1973d8 100644 --- a/src/ker_lowupsampfac_horner_allw_loop_constexpr.c +++ b/src/ker_lowupsampfac_horner_allw_loop_constexpr.c @@ -2,191 +2,170 @@ // Authors: Alex Barnett & Ludvig af Klinteberg. // (C) The Simons Foundation, Inc. if constexpr(w==2) { - FLT c0[] = {2.3711015472112514E+01, 2.3711015472112514E+01, 0.0000000000000000E+00, 0.0000000000000000E+00}; - FLT c1[] = {2.5079742199350562E+01, -2.5079742199350562E+01, 0.0000000000000000E+00, 0.0000000000000000E+00}; - FLT c2[] = {-3.5023281580177050E+00, -3.5023281580177086E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; - FLT c3[] = {-7.3894949249195587E+00, 7.3894949249195632E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c0[] = {6.1209111871385724E-01, 6.1209111871385691E-01, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c1[] = {6.4742429432896442E-01, -6.4742429432896453E-01, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c2[] = {-9.0411309581634888E-02, -9.0411309581634625E-02, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c3[] = {-1.9075708590566734E-01, 1.9075708590566728E-01, 0.0000000000000000E+00, 0.0000000000000000E+00}; for (int i=0; i<4; i++) ker[i] = c0[i] + z*(c1[i] + z*(c2[i] + z*(c3[i]))); } else if constexpr(w==3) { - FLT c0[] = {5.9620016143346824E+01, 2.4110216701187497E+02, 5.9620016148621815E+01, 0.0000000000000000E+00}; - FLT c1[] = {9.7575520958604258E+01, 9.4807967775797928E-16, -9.7575520952908519E+01, 0.0000000000000000E+00}; - FLT c2[] = {3.5838417859768512E+01, -7.3472145274965371E+01, 3.5838417865129472E+01, 0.0000000000000000E+00}; - FLT c3[] = {-1.0721643298166471E+01, -2.1299978194824344E-16, 1.0721643303220413E+01, 0.0000000000000000E+00}; - FLT c4[] = {-7.0570630207138318E+00, 9.1538553399011260E+00, -7.0570630151506633E+00, 0.0000000000000000E+00}; + FLT c0[] = {2.4728112933307078E-01, 1.0000000000000044E+00, 2.4728112935494950E-01, 0.0000000000000000E+00}; + FLT c1[] = {4.0470611346184532E-01, -4.2425842671824539E-17, -4.0470611343822149E-01, 0.0000000000000000E+00}; + FLT c2[] = {1.4864411342268646E-01, -3.0473448739822762E-01, 1.4864411344492173E-01, 0.0000000000000000E+00}; + FLT c3[] = {-4.4469294619149641E-02, -3.1573886092308317E-18, 4.4469294640111512E-02, 0.0000000000000000E+00}; + FLT c4[] = {-2.9270010751775016E-02, 3.7966707032750742E-02, -2.9270010728701203E-02, 0.0000000000000000E+00}; for (int i=0; i<4; i++) ker[i] = c0[i] + z*(c1[i] + z*(c2[i] + z*(c3[i] + z*(c4[i])))); } else if constexpr(w==4) { - FLT c0[] = {1.2612470018753689E+02, 1.1896204292999116E+03, 1.1896204292999118E+03, 1.2612470018753696E+02}; - FLT c1[] = {2.6158034850676626E+02, 5.6161104654809810E+02, -5.6161104654809844E+02, -2.6158034850676620E+02}; - FLT c2[] = {1.7145379463699527E+02, -1.6695967127766517E+02, -1.6695967127766514E+02, 1.7145379463699527E+02}; - FLT c3[] = {2.3525961965887870E+01, -1.0057439659768858E+02, 1.0057439659768873E+02, -2.3525961965887827E+01}; - FLT c4[] = {-1.5608307370340880E+01, 9.5627412100260845E+00, 9.5627412100260205E+00, -1.5608307370340908E+01}; - FLT c5[] = {-4.5715207776748699E+00, 7.9904373067895493E+00, -7.9904373067893877E+00, 4.5715207776749462E+00}; + FLT c0[] = {8.4048892491849825E-02, 7.9275732207620908E-01, 7.9275732207620886E-01, 8.4048892491849783E-02}; + FLT c1[] = {1.7431588385887239E-01, 3.7425489538028406E-01, -3.7425489538028428E-01, -1.7431588385887237E-01}; + FLT c2[] = {1.1425598262146333E-01, -1.1126112046907125E-01, -1.1126112046907125E-01, 1.1425598262146337E-01}; + FLT c3[] = {1.5677587697716076E-02, -6.7022293289915644E-02, 6.7022293289915699E-02, -1.5677587697716051E-02}; + FLT c4[] = {-1.0401300825285587E-02, 6.3725646657140341E-03, 6.3725646657139994E-03, -1.0401300825285620E-02}; + FLT c5[] = {-3.0464394190490465E-03, 5.3247889205097444E-03, -5.3247889205097912E-03, 3.0464394190490543E-03}; for (int i=0; i<4; i++) ker[i] = c0[i] + z*(c1[i] + z*(c2[i] + z*(c3[i] + z*(c4[i] + z*(c5[i]))))); } else if constexpr(w==5) { - FLT c0[] = {2.4106943677442615E+02, 4.3538384278025542E+03, 9.3397486707381995E+03, 4.3538384278025515E+03, 2.4106943677442607E+02, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; - FLT c1[] = {5.8781364250328272E+02, 3.4742855804122028E+03, -7.3041306797303120E-14, -3.4742855804122009E+03, -5.8781364250328249E+02, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; - FLT c2[] = {5.1234107167555862E+02, 3.5219546517037116E+02, -1.7076861141633149E+03, 3.5219546517037247E+02, 5.1234107167555862E+02, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; - FLT c3[] = {1.7540956907856057E+02, -3.5792356187777074E+02, -4.9888896652511712E-13, 3.5792356187777165E+02, -1.7540956907856059E+02, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; - FLT c4[] = {-2.1768066955094961E-01, -7.8322173187697558E+01, 1.3904039464934516E+02, -7.8322173187697842E+01, -2.1768066955103071E-01, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; - FLT c5[] = {-1.4207955403641256E+01, 1.6019466986221790E+01, 5.4386376890865855E-13, -1.6019466986220916E+01, 1.4207955403641320E+01, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; - FLT c6[] = {-2.1966493586753826E+00, 5.0672636163194582E+00, -6.7340544905090631E+00, 5.0672636163189448E+00, -2.1966493586753089E+00, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; - for (int i=0; i<8; i++) ker[i] = c0[i] + z*(c1[i] + z*(c2[i] + z*(c3[i] + z*(c4[i] + z*(c5[i] + z*(c6[i])))))); + FLT c0[] = {2.5811126752233304E-02, 4.6616226852477355E-01, 1.0000000000000004E+00, 4.6616226852477299E-01, 2.5811126752233314E-02, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c1[] = {6.2936773057387069E-02, 3.7198919402374026E-01, -8.4851685343650335E-17, -3.7198919402374014E-01, -6.2936773057387083E-02, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c2[] = {5.4855980576944546E-02, 3.7709308632020662E-02, -1.8284069243892614E-01, 3.7709308632020801E-02, 5.4855980576944560E-02, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c3[] = {1.8780973157032109E-02, -3.8322611720715674E-02, 2.0186098450281545E-17, 3.8322611720715723E-02, -1.8780973157032105E-02, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c4[] = {-2.3306908700109395E-05, -8.3858973028988343E-03, 1.4886952481383780E-02, -8.3858973028988516E-03, -2.3306908700108859E-05, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c5[] = {-1.5212353034889752E-03, 1.7151925122365424E-03, 8.6737859434123232E-18, -1.7151925122365892E-03, 1.5212353034889810E-03, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; + for (int i=0; i<8; i++) ker[i] = c0[i] + z*(c1[i] + z*(c2[i] + z*(c3[i] + z*(c4[i] + z*(c5[i]))))); } else if constexpr(w==6) { - FLT c0[] = {4.3011762559089101E+02, 1.3368828836127070E+04, 4.9861340433371224E+04, 4.9861340433371253E+04, 1.3368828836127073E+04, 4.3011762559835148E+02, 0.0000000000000000E+00, 0.0000000000000000E+00}; - FLT c1[] = {1.1857225840065141E+03, 1.4112553227730617E+04, 1.5410005180819440E+04, -1.5410005180819426E+04, -1.4112553227730616E+04, -1.1857225839984601E+03, 0.0000000000000000E+00, 0.0000000000000000E+00}; - FLT c2[] = {1.2460481448413077E+03, 4.3127030215084960E+03, -5.5438591621431169E+03, -5.5438591621431306E+03, 4.3127030215084960E+03, 1.2460481448488902E+03, 0.0000000000000000E+00, 0.0000000000000000E+00}; - FLT c3[] = {6.0825549344387753E+02, -3.4106010789547094E+02, -1.9775725023673197E+03, 1.9775725023673208E+03, 3.4106010789547116E+02, -6.0825549343673094E+02, 0.0000000000000000E+00, 0.0000000000000000E+00}; - FLT c4[] = {1.1264961069783706E+02, -3.9740822717991142E+02, 2.7557540616463064E+02, 2.7557540616462472E+02, -3.9740822717991210E+02, 1.1264961070570448E+02, 0.0000000000000000E+00, 0.0000000000000000E+00}; - FLT c5[] = {-1.5387906304333878E+01, -3.2640579296387394E+01, 1.1683718215647470E+02, -1.1683718215646800E+02, 3.2640579296390861E+01, 1.5387906311562851E+01, 0.0000000000000000E+00, 0.0000000000000000E+00}; - FLT c6[] = {-9.3947198873910249E+00, 1.5069930500881778E+01, -8.0900452409597179E+00, -8.0900452409538364E+00, 1.5069930500884301E+01, -9.3947198802581902E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; - FLT c7[] = {-5.6048841964539509E-01, 2.3377422080924530E+00, -4.2391567591836514E+00, 4.2391567591841817E+00, -2.3377422080928629E+00, 5.6048842664294984E-01, 0.0000000000000000E+00, 0.0000000000000000E+00}; - for (int i=0; i<8; i++) ker[i] = c0[i] + z*(c1[i] + z*(c2[i] + z*(c3[i] + z*(c4[i] + z*(c5[i] + z*(c6[i] + z*(c7[i]))))))); + FLT c0[] = {7.3992041846532757E-03, 2.2998056434514016E-01, 8.5775196559356104E-01, 8.5775196559356104E-01, 2.2998056434514022E-01, 7.3992041847816149E-03, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c1[] = {2.0397684222696253E-02, 2.4277466601214734E-01, 2.6509440217151270E-01, -2.6509440217151259E-01, -2.4277466601214734E-01, -2.0397684222557694E-02, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c2[] = {2.1435449512033442E-02, 7.4190333865239919E-02, -9.5369600014193201E-02, -9.5369600014193159E-02, 7.4190333865239960E-02, 2.1435449512163873E-02, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c3[] = {1.0463664645794023E-02, -5.8671703446042042E-03, -3.4019677093840475E-02, 3.4019677093840461E-02, 5.8671703446041964E-03, -1.0463664645671077E-02, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c4[] = {1.9378826192716983E-03, -6.8365127179467666E-03, 4.7406536657959653E-03, 4.7406536657959306E-03, -6.8365127179467709E-03, 1.9378826194070362E-03, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c5[] = {-2.6471424081647520E-04, -5.6150758897068509E-04, 2.0099203466670676E-03, -2.0099203466671066E-03, 5.6150758897069290E-04, 2.6471424094083525E-04, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c6[] = {-1.6161497824910401E-04, 2.5924418389359724E-04, -1.3917099193206471E-04, -1.3917099193200356E-04, 2.5924418389357561E-04, -1.6161497812640463E-04, 0.0000000000000000E+00, 0.0000000000000000E+00}; + for (int i=0; i<8; i++) ker[i] = c0[i] + z*(c1[i] + z*(c2[i] + z*(c3[i] + z*(c4[i] + z*(c5[i] + z*(c6[i])))))); } else if constexpr(w==7) { - FLT c0[] = {7.2950392616203249E+02, 3.6439117038309480E+04, 2.1220891582018422E+05, 3.6180058567561524E+05, 2.1220891582018445E+05, 3.6439117038309487E+04, 7.2950392617434545E+02, 0.0000000000000000E+00}; - FLT c1[] = {2.2197790785452576E+03, 4.6392067080426248E+04, 1.1568051746995670E+05, -1.1902861988308852E-11, -1.1568051746995671E+05, -4.6392067080426241E+04, -2.2197790785319785E+03, 0.0000000000000000E+00}; - FLT c2[] = {2.6796845075663955E+03, 2.0921129984587249E+04, 3.9399551345574849E+01, -4.7251335435527435E+04, 3.9399551345580633E+01, 2.0921129984587245E+04, 2.6796845075789142E+03, 0.0000000000000000E+00}; - FLT c3[] = {1.6253748990844499E+03, 2.6138488347211564E+03, -1.0037546705421508E+04, 2.6823166126907972E-11, 1.0037546705421508E+04, -2.6138488347211546E+03, -1.6253748990726619E+03, 0.0000000000000000E+00}; - FLT c4[] = {4.9106375852553418E+02, -8.6668269315416171E+02, -1.0513434716618249E+03, 2.8444456471590756E+03, -1.0513434716618387E+03, -8.6668269315416057E+02, 4.9106375853851472E+02, 0.0000000000000000E+00}; - FLT c5[] = {4.0739167949763157E+01, -2.8515155742293922E+02, 3.9930326803801455E+02, 2.4847312048933061E-11, -3.9930326803798215E+02, 2.8515155742293899E+02, -4.0739167937835738E+01, 0.0000000000000000E+00}; - FLT c6[] = {-1.7148987139838667E+01, 7.5799002551700223E-01, 6.3260304953160343E+01, -1.0529869309160161E+02, 6.3260304953194023E+01, 7.5799002552709915E-01, -1.7148987128069749E+01, 0.0000000000000000E+00}; - FLT c7[] = {-4.5424411501060264E+00, 9.8749254058318616E+00, -9.6456179777547195E+00, 2.0621161109877312E-11, 9.6456179778118027E+00, -9.8749254058319202E+00, 4.5424411616514604E+00, 0.0000000000000000E+00}; - FLT c8[] = {-5.0793946806832954E-02, 7.3273813711856639E-01, -2.0117140544738263E+00, 2.6999257940856816E+00, -2.0117140545416512E+00, 7.3273813711318592E-01, -5.0793935653327994E-02, 0.0000000000000000E+00}; - for (int i=0; i<8; i++) ker[i] = c0[i] + z*(c1[i] + z*(c2[i] + z*(c3[i] + z*(c4[i] + z*(c5[i] + z*(c6[i] + z*(c7[i] + z*(c8[i])))))))); + FLT c0[] = {2.0163149398992283E-03, 1.0071602557045134E-01, 5.8653557849806126E-01, 1.0000000000000004E+00, 5.8653557849806159E-01, 1.0071602557045131E-01, 2.0163149399332566E-03, 0.0000000000000000E+00}; + FLT c1[] = {6.1353661835569220E-03, 1.2822551681002711E-01, 3.1973557271594355E-01, -6.3638764007737718E-17, -3.1973557271594361E-01, -1.2822551681002708E-01, -6.1353661835202144E-03, 0.0000000000000000E+00}; + FLT c2[] = {7.4065234100227726E-03, 5.7825030729344355E-02, 1.0889852837591876E-04, -1.3060049459923273E-01, 1.0889852837587447E-04, 5.7825030729344383E-02, 7.4065234100573743E-03, 0.0000000000000000E+00}; + FLT c3[] = {4.4924606632387679E-03, 7.2245566707420791E-03, -2.7743312484355673E-02, -5.9183130302535822E-17, 2.7743312484355704E-02, -7.2245566707420964E-03, -4.4924606632061829E-03, 0.0000000000000000E+00}; + FLT c4[] = {1.3572774007773840E-03, -2.3954706749181320E-03, -2.9058644824981553E-03, 7.8619155407045668E-03, -2.9058644824981211E-03, -2.3954706749181446E-03, 1.3572774008132624E-03, 0.0000000000000000E+00}; + FLT c5[] = {1.1260116639581571E-04, -7.8814564904711420E-04, 1.1036556706848707E-03, -1.7239739988593079E-17, -1.1036556706849018E-03, 7.8814564904712190E-04, -1.1260116636284838E-04, 0.0000000000000000E+00}; + FLT c6[] = {-4.7399003259806255E-05, 2.0950491942900027E-06, 1.7484854214666628E-04, -2.9104069274775099E-04, 1.7484854214662188E-04, 2.0950491942971965E-06, -4.7399003227280481E-05, 0.0000000000000000E+00}; + FLT c7[] = {-1.2555096177147631E-05, 2.7293834771950587E-05, -2.6660039700443368E-05, -1.5789308062419179E-17, 2.6660039700526404E-05, -2.7293834771958475E-05, 1.2555096209062448E-05, 0.0000000000000000E+00}; + for (int i=0; i<8; i++) ker[i] = c0[i] + z*(c1[i] + z*(c2[i] + z*(c3[i] + z*(c4[i] + z*(c5[i] + z*(c6[i] + z*(c7[i]))))))); } else if constexpr(w==8) { - FLT c0[] = {1.1895823653767145E+03, 9.0980236725236929E+04, 7.7438826909537485E+05, 2.0077596413122697E+06, 2.0077596413122697E+06, 7.7438826909537497E+05, 9.0980236725236929E+04, 1.1895823653767147E+03}; - FLT c1[] = {3.9313191526977798E+03, 1.3318570706800820E+05, 5.7275848637687636E+05, 4.6250273225257988E+05, -4.6250273225257976E+05, -5.7275848637687659E+05, -1.3318570706800820E+05, -3.9313191526977798E+03}; - FLT c2[] = {5.2976026193612370E+03, 7.5628970871188430E+04, 1.0073339198368321E+05, -1.8165150843791291E+05, -1.8165150843791291E+05, 1.0073339198368321E+05, 7.5628970871188460E+04, 5.2976026193612397E+03}; - FLT c3[] = {3.7552239608473842E+03, 1.8376340228970901E+04, -2.3878081117551585E+04, -4.6296734056047833E+04, 4.6296734056048226E+04, 2.3878081117551632E+04, -1.8376340228970901E+04, -3.7552239608473833E+03}; - FLT c4[] = {1.4742862505418652E+03, 1.2842168112178376E+02, -9.1969665138398723E+03, 7.5990739935234687E+03, 7.5990739935234151E+03, -9.1969665138399178E+03, 1.2842168112178072E+02, 1.4742862505418645E+03}; - FLT c5[] = {2.8158981009344416E+02, -8.8613607108855206E+02, 5.3457145342334378E+01, 2.1750989694614777E+03, -2.1750989694609211E+03, -5.3457145342173561E+01, 8.8613607108856843E+02, -2.8158981009344393E+02}; - FLT c6[] = {-1.4786862436240726E+00, -1.3935442261830281E+02, 3.2599325739083491E+02, -1.9541889343332295E+02, -1.9541889343339443E+02, 3.2599325739083696E+02, -1.3935442261827953E+02, -1.4786862436237442E+00}; - FLT c7[] = {-1.1542034522902307E+01, 1.2000512051397084E+01, 1.9687328710129744E+01, -6.3962883082482271E+01, 6.3962883082874910E+01, -1.9687328710101575E+01, -1.2000512051407391E+01, 1.1542034522902124E+01}; - FLT c8[] = {-1.7448292513542445E+00, 4.8577330433956609E+00, -6.8794163043773890E+00, 3.4611708987408365E+00, 3.4611708985348386E+00, -6.8794163043605385E+00, 4.8577330433771184E+00, -1.7448292513550807E+00}; - FLT c9[] = {1.5044951479021193E-01, 9.6230159355094713E-02, -7.0399250398052082E-01, 1.3251401132916929E+00, -1.3251401128795544E+00, 7.0399250407339709E-01, -9.6230159355094713E-02, -1.5044951479003055E-01}; - for (int i=0; i<8; i++) ker[i] = c0[i] + z*(c1[i] + z*(c2[i] + z*(c3[i] + z*(c4[i] + z*(c5[i] + z*(c6[i] + z*(c7[i] + z*(c8[i] + z*(c9[i]))))))))); + FLT c0[] = {5.2827275612461451E-04, 4.0402734444109238E-02, 3.4389230803369708E-01, 8.9161099745784866E-01, 8.9161099745784866E-01, 3.4389230803369697E-01, 4.0402734444109224E-02, 5.2827275612461430E-04}; + FLT c1[] = {1.7458301875074103E-03, 5.9145446836664561E-02, 2.5435204236257858E-01, 2.0538938722823227E-01, -2.0538938722823244E-01, -2.5435204236257863E-01, -5.9145446836664561E-02, -1.7458301875074092E-03}; + FLT c2[] = {2.3525728171808302E-03, 3.3585505340219680E-02, 4.4733940386002188E-02, -8.0668262921248610E-02, -8.0668262921248568E-02, 4.4733940386002209E-02, 3.3585505340219701E-02, 2.3525728171808302E-03}; + FLT c3[] = {1.6676293877589655E-03, 8.1606118103203715E-03, -1.0603838868224464E-02, -2.0559571166483818E-02, 2.0559571166483891E-02, 1.0603838868224413E-02, -8.1606118103203749E-03, -1.6676293877589668E-03}; + FLT c4[] = {6.5470478006265378E-04, 5.7029826102786423E-05, -4.0842122325117809E-03, 3.3746160664395804E-03, 3.3746160664395288E-03, -4.0842122325117896E-03, 5.7029826102776760E-05, 6.5470478006265378E-04}; + FLT c5[] = {1.2504911757628661E-04, -3.9351755557265425E-04, 2.3739384784470553E-05, 9.6592347103021444E-04, -9.6592347103024556E-04, -2.3739384784447222E-05, 3.9351755557266206E-04, -1.2504911757628680E-04}; + FLT c6[] = {-6.5665874015875498E-07, -6.1884865695206945E-05, 1.4476791315359098E-04, -8.6782118193358648E-05, -8.6782118193387420E-05, 1.4476791315357120E-04, -6.1884865695208748E-05, -6.5665874015841775E-07}; + FLT c7[] = {-5.1256159860521059E-06, 5.3292178505827560E-06, 8.7427989025241135E-06, -2.8404799465034010E-05, 2.8404799465103762E-05, -8.7427989025340797E-06, -5.3292178505848321E-06, 5.1256159860515867E-06}; + for (int i=0; i<8; i++) ker[i] = c0[i] + z*(c1[i] + z*(c2[i] + z*(c3[i] + z*(c4[i] + z*(c5[i] + z*(c6[i] + z*(c7[i]))))))); } else if constexpr(w==9) { - FLT c0[] = {1.8793738965776997E+03, 2.1220891582018419E+05, 2.5233246441351641E+06, 9.2877384983420596E+06, 1.4015330434461458E+07, 9.2877384983420689E+06, 2.5233246441351632E+06, 2.1220891582018507E+05, 1.8793738965777015E+03, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; - FLT c1[] = {6.6675066501609344E+03, 3.4704155240986997E+05, 2.2890184838322559E+06, 3.8705035445351214E+06, -1.6037058324963857E-09, -3.8705035445351251E+06, -2.2890184838322555E+06, -3.4704155240987107E+05, -6.6675066501609363E+03, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; - FLT c2[] = {9.8412775404612330E+03, 2.3171563090202375E+05, 6.8167589492092200E+05, -2.1140963571671984E+05, -1.4236515118873848E+06, -2.1140963571672366E+05, 6.8167589492092165E+05, 2.3171563090202425E+05, 9.8412775404612312E+03, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; - FLT c3[] = {7.8762358364031033E+03, 7.6500585979636104E+04, 1.2434778984075023E+04, -2.8572091469430045E+05, 1.5952874106327477E-09, 2.8572091469430359E+05, -1.2434778984075045E+04, -7.6500585979636220E+04, -7.8762358364031052E+03, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; - FLT c4[] = {3.6941911906762084E+03, 9.9232929169975941E+03, -3.3472877669902169E+04, -1.4082384858052235E+04, 6.7911966136972551E+04, -1.4082384858047793E+04, -3.3472877669902322E+04, 9.9232929169976087E+03, 3.6941911906762070E+03, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; - FLT c5[] = {9.8900189723050266E+02, -1.2736589324621855E+03, -5.0407308390126955E+03, 9.8914296140171609E+03, 1.0742991696587890E-09, -9.8914296140222541E+03, 5.0407308390134704E+03, 1.2736589324621880E+03, -9.8900189723050198E+02, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; - FLT c6[] = {1.1165868717715853E+02, -5.9057035448564977E+02, 5.5860705835603983E+02, 9.1996097522959656E+02, -2.0290255886377897E+03, 9.1996097523001129E+02, 5.5860705835622480E+02, -5.9057035448564693E+02, 1.1165868717715870E+02, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; - FLT c7[] = {-1.3142584300868881E+01, -4.2852762793304592E+01, 1.8188640945795066E+02, -2.1362000457567430E+02, 6.1024810759112463E-10, 2.1362000457722939E+02, -1.8188640945795305E+02, 4.2852762793363922E+01, 1.3142584300866494E+01, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; - FLT c8[] = {-5.8088068374878068E+00, 1.0201832931362965E+01, -3.5220973519213472E-01, -2.6632420896811951E+01, 4.2737607182672249E+01, -2.6632420895534445E+01, -3.5220973562147767E-01, 1.0201832931230712E+01, -5.8088068374901178E+00, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; - FLT c9[] = {-4.0642645973308456E-01, 1.8389772328416343E+00, -3.5549484953682806E+00, 3.2273562233914270E+00, 1.3413454081272250E-09, -3.2273562258526494E+00, 3.5549484959023196E+00, -1.8389772328242200E+00, 4.0642645973371377E-01, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; - for (int i=0; i<12; i++) ker[i] = c0[i] + z*(c1[i] + z*(c2[i] + z*(c3[i] + z*(c4[i] + z*(c5[i] + z*(c6[i] + z*(c7[i] + z*(c8[i] + z*(c9[i]))))))))); + FLT c0[] = {1.3409415535124442E-04, 1.5141199617983766E-02, 1.8004032483820079E-01, 6.6268423293859668E-01, 1.0000000000000004E+00, 6.6268423293859735E-01, 1.8004032483820079E-01, 1.5141199617983816E-02, 1.3409415535124450E-04, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c1[] = {4.7572953640583418E-04, 2.4761567630011038E-02, 1.6332247709293546E-01, 2.7616213278983209E-01, -6.3638764007737718E-17, -2.7616213278983237E-01, -1.6332247709293557E-01, -2.4761567630011107E-02, -4.7572953640583407E-04, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c2[] = {7.0217948741779833E-04, 1.6533012331430411E-02, 4.8637875368588449E-02, -1.5084170630532941E-02, -1.0157816246607008E-01, -1.5084170630533198E-02, 4.8637875368588469E-02, 1.6533012331430449E-02, 7.0217948741779833E-04, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c3[] = {5.6197289626769558E-04, 5.4583505067802903E-03, 8.8722695781043813E-04, -2.0386313118366247E-02, -2.5586386887323148E-17, 2.0386313118366479E-02, -8.8722695781043510E-04, -5.4583505067803007E-03, -5.6197289626769590E-04, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c4[] = {2.6358216867957524E-04, 7.0803132065997234E-04, -2.3883045659485323E-03, -1.0047843626592211E-03, 4.8455486978740345E-03, -1.0047843626590149E-03, -2.3883045659485410E-03, 7.0803132065997180E-04, 2.6358216867957530E-04, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c5[] = {7.0565721004957926E-05, -9.0876125855048783E-05, -3.5965836571495268E-04, 7.0575785995722685E-04, 1.3852933204327093E-17, -7.0575785995747578E-04, 3.5965836571492157E-04, 9.0876125855048783E-05, -7.0565721004957953E-05, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c6[] = {7.9668965137352613E-06, -4.2137454928179153E-05, 3.9856859670067282E-05, 6.5639620808994340E-05, -1.4477186949848808E-04, 6.5639620808769517E-05, 3.9856859670051101E-05, -4.2137454928182751E-05, 7.9668965137352613E-06, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c7[] = {-9.3772917893937511E-07, -3.0575635011733582E-06, 1.2977675432522508E-05, -1.5241881422240646E-05, 9.0538532849680740E-18, 1.5241881422370184E-05, -1.2977675432515243E-05, 3.0575635011791710E-06, 9.3772917893919352E-07, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c8[] = {-4.1446092652960729E-07, 7.2790527337694249E-07, -2.5130319770320465E-08, -1.9002349620399918E-06, 3.0493470976490761E-06, -1.9002349619053566E-06, -2.5130319758080882E-08, 7.2790527337216141E-07, -4.1446092652953556E-07, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; + for (int i=0; i<12; i++) ker[i] = c0[i] + z*(c1[i] + z*(c2[i] + z*(c3[i] + z*(c4[i] + z*(c5[i] + z*(c6[i] + z*(c7[i] + z*(c8[i])))))))); } else if constexpr(w==10) { - FLT c0[] = {2.8923571298063562E+03, 4.6856831608341925E+05, 7.5304732752870023E+06, 3.7576537584215783E+07, 7.9591606307847857E+07, 7.9591606307847857E+07, 3.7576537584215745E+07, 7.5304732752870042E+06, 4.6856831608341780E+05, 2.8923571298063575E+03, 0.0000000000000000E+00, 0.0000000000000000E+00}; - FLT c1[] = {1.0919387804943191E+04, 8.3976685277206497E+05, 7.9494027659552367E+06, 2.1606786285174552E+07, 1.4625897641453246E+07, -1.4625897641453277E+07, -2.1606786285174549E+07, -7.9494027659552367E+06, -8.3976685277206241E+05, -1.0919387804943171E+04, 0.0000000000000000E+00, 0.0000000000000000E+00}; - FLT c2[] = {1.7418455635504150E+04, 6.3489952164419880E+05, 3.1358985409389879E+06, 2.2547438801903646E+06, -6.0429762783920728E+06, -6.0429762783920513E+06, 2.2547438801903692E+06, 3.1358985409389860E+06, 6.3489952164419706E+05, 1.7418455635504110E+04, 0.0000000000000000E+00, 0.0000000000000000E+00}; - FLT c3[] = {1.5396188098732160E+04, 2.5490607173283451E+05, 4.2818880748176615E+05, -9.5435463094349275E+05, -1.2004850139039254E+06, 1.2004850139039545E+06, 9.5435463094349345E+05, -4.2818880748176581E+05, -2.5490607173283395E+05, -1.5396188098732138E+04, 0.0000000000000000E+00, 0.0000000000000000E+00}; - FLT c4[] = {8.2616700456447434E+03, 5.2880641964112285E+04, -6.1165055141131161E+04, -2.1590299490711108E+05, 2.1595822052157650E+05, 2.1595822052157007E+05, -2.1590299490713840E+05, -6.1165055141131197E+04, 5.2880641964112183E+04, 8.2616700456447306E+03, 0.0000000000000000E+00, 0.0000000000000000E+00}; - FLT c5[] = {2.7267169079066489E+03, 2.4572549134030801E+03, -2.6065821571078384E+04, 1.3919259807559451E+04, 4.6802084705699206E+04, -4.6802084705714289E+04, -1.3919259807536537E+04, 2.6065821571078890E+04, -2.4572549134029036E+03, -2.7267169079066425E+03, 0.0000000000000000E+00, 0.0000000000000000E+00}; - FLT c6[] = {5.0402062537834070E+02, -1.3640153425625381E+03, -1.4063198459019245E+03, 7.0858129627834105E+03, -4.8375233777605163E+03, -4.8375233777670810E+03, 7.0858129627894641E+03, -1.4063198459014579E+03, -1.3640153425626913E+03, 5.0402062537833700E+02, 0.0000000000000000E+00, 0.0000000000000000E+00}; - FLT c7[] = {2.4199726682542348E+01, -2.8393731159249540E+02, 5.1652001352543709E+02, 7.4578914842705018E+01, -1.1556759026365337E+03, 1.1556759026651935E+03, -7.4578914839714216E+01, -5.1652001352595710E+02, 2.8393731159268043E+02, -2.4199726682540959E+01, 0.0000000000000000E+00, 0.0000000000000000E+00}; - FLT c8[] = {-1.0545675122360885E+01, -3.0306758891224317E+00, 7.2305523762173834E+01, -1.3808908570221064E+02, 7.6293213403386517E+01, 7.6293213419205742E+01, -1.3808908572505672E+02, 7.2305523760424833E+01, -3.0306758894244412E+00, -1.0545675122369961E+01, 0.0000000000000000E+00, 0.0000000000000000E+00}; - FLT c9[] = {-2.1836930570474395E+00, 5.4992367509081630E+00, -4.5624617253163446E+00, -6.6492709819863256E+00, 2.0339240341691568E+01, -2.0339240351164950E+01, 6.6492710020476089E+00, 4.5624617253163446E+00, -5.4992367508501152E+00, 2.1836930570530630E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; - FLT c10[] = {-9.1748741459757727E-02, 5.2562451739588611E-01, -1.4144257958835973E+00, 1.8629578990262812E+00, -9.0169874554123419E-01, -9.0169876258108816E-01, 1.8629579026113960E+00, -1.4144257947447987E+00, 5.2562451738534777E-01, -9.1748741464373396E-02, 0.0000000000000000E+00, 0.0000000000000000E+00}; - for (int i=0; i<12; i++) ker[i] = c0[i] + z*(c1[i] + z*(c2[i] + z*(c3[i] + z*(c4[i] + z*(c5[i] + z*(c6[i] + z*(c7[i] + z*(c8[i] + z*(c9[i] + z*(c10[i])))))))))); + FLT c0[] = {3.3157481538170295E-05, 5.3715860775974443E-03, 8.6328042282845754E-02, 4.3077092326437988E-01, 9.1242439930731112E-01, 9.1242439930731112E-01, 4.3077092326437960E-01, 8.6328042282845754E-02, 5.3715860775974201E-03, 3.3157481538170274E-05, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c1[] = {1.2517797191066984E-04, 9.6269418565961429E-03, 9.1130577457178424E-02, 2.4769645835465365E-01, 1.6766875916810517E-01, -1.6766875916810545E-01, -2.4769645835465348E-01, -9.1130577457178438E-02, -9.6269418565961117E-03, -1.2517797191066959E-04, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c2[] = {1.9968216068682140E-04, 7.2783782301876591E-03, 3.5949398124193947E-02, 2.5847993600195466E-02, -6.9275634160640545E-02, -6.9275634160640365E-02, 2.5847993600195553E-02, 3.5949398124193933E-02, 7.2783782301876418E-03, 1.9968216068682094E-04, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c3[] = {1.7649923565147223E-04, 2.9221990881931068E-03, 4.9086823797164910E-03, -1.0940556313145935E-02, -1.3762152424114771E-02, 1.3762152424114837E-02, 1.0940556313145999E-02, -4.9086823797165006E-03, -2.9221990881930985E-03, -1.7649923565147191E-04, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c4[] = {9.4710355505531879E-05, 6.0621452710061727E-04, -7.0118560592789044E-04, -2.4750745659638880E-03, 2.4757076628502080E-03, 2.4757076628501222E-03, -2.4750745659639995E-03, -7.0118560592789261E-04, 6.0621452710061011E-04, 9.4710355505531744E-05, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c5[] = {3.1258610702677757E-05, 2.8169545035124896E-05, -2.9881406711975588E-04, 1.5956798534240196E-04, 5.3653099874330845E-04, -5.3653099874345622E-04, -1.5956798534228530E-04, 2.9881406711975979E-04, -2.8169545035121007E-05, -3.1258610702677757E-05, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c6[] = {5.7780052154064923E-06, -1.5636835808662441E-05, -1.6121807313048698E-05, 8.1230533420432682E-05, -5.5456530742837516E-05, -5.5456530742837516E-05, 8.1230533420447061E-05, -1.6121807313052293E-05, -1.5636835808664237E-05, 5.7780052154064500E-06, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c7[] = {2.7742147829396434E-07, -3.2550081973300800E-06, 5.9212960378052008E-06, 8.5495977199931152E-07, -1.3248468528067400E-05, 1.3248468528201922E-05, -8.5495977192042543E-07, -5.9212960378031248E-06, 3.2550081973319486E-06, -2.7742147829393835E-07, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c8[] = {-1.2089379439830882E-07, -3.4743143854854381E-08, 8.2889801007304441E-07, -1.5830293785166221E-06, 8.7461219396318958E-07, 8.7461219390199166E-07, -1.5830293786451377E-06, 8.2889801007763427E-07, -3.4743143856671194E-08, -1.2089379439833272E-07, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c9[] = {-2.5033479260931243E-08, 6.3042298325822974E-08, -5.2303271559903752E-08, -7.6226091793981470E-08, 2.3316553106919865E-07, -2.3316553114670068E-07, 7.6226091852107994E-08, 5.2303271559903752E-08, -6.3042298325822974E-08, 2.5033479260954218E-08, 0.0000000000000000E+00, 0.0000000000000000E+00}; + for (int i=0; i<12; i++) ker[i] = c0[i] + z*(c1[i] + z*(c2[i] + z*(c3[i] + z*(c4[i] + z*(c5[i] + z*(c6[i] + z*(c7[i] + z*(c8[i] + z*(c9[i]))))))))); } else if constexpr(w==11) { - FLT c0[] = {4.3537972057094357E+03, 9.8872306817881018E+05, 2.0938056062983289E+07, 1.3701428307175827E+08, 3.8828289972017348E+08, 5.4292197128519189E+08, 3.8828289972017324E+08, 1.3701428307175821E+08, 2.0938056062983286E+07, 9.8872306817881099E+05, 4.3537972057093830E+03, 0.0000000000000000E+00}; - FLT c1[] = {1.7371472778611496E+04, 1.9155790709433770E+06, 2.4914432724618733E+07, 9.7792160665338323E+07, 1.3126779387874992E+08, 1.1003518489948497E-08, -1.3126779387874992E+08, -9.7792160665338367E+07, -2.4914432724618725E+07, -1.9155790709433774E+06, -1.7371472778611387E+04, 0.0000000000000000E+00}; - FLT c2[] = {2.9650558537745437E+04, 1.6014973065836846E+06, 1.1867448782239100E+07, 2.0812212822540633E+07, -1.1749875870571069E+07, -4.5121922350041404E+07, -1.1749875870571032E+07, 2.0812212822540659E+07, 1.1867448782239093E+07, 1.6014973065836851E+06, 2.9650558537745299E+04, 0.0000000000000000E+00}; - FLT c3[] = {2.8505604980264394E+04, 7.4166660874053277E+05, 2.5711466441825330E+06, -1.2146931938153899E+06, -8.3931576510116160E+06, -1.5221113764487218E-08, 8.3931576510117017E+06, 1.2146931938154220E+06, -2.5711466441825316E+06, -7.4166660874053324E+05, -2.8505604980264285E+04, 0.0000000000000000E+00}; - FLT c4[] = {1.7045632829988481E+04, 1.9785834209758078E+05, 8.6361403553701501E+04, -1.0584472412326147E+06, -1.3367486018960556E+05, 1.7818009619467217E+06, -1.3367486018952832E+05, -1.0584472412326441E+06, 8.6361403553699885E+04, 1.9785834209758087E+05, 1.7045632829988419E+04, 0.0000000000000000E+00}; - FLT c5[] = {6.5462464716912918E+03, 2.5347576368078855E+04, -7.5810878908805942E+04, -8.0774039751690128E+04, 2.5492801112955116E+05, 3.6655592491345995E-08, -2.5492801112950110E+05, 8.0774039751702396E+04, 7.5810878908810162E+04, -2.5347576368078677E+04, -6.5462464716912700E+03, 0.0000000000000000E+00}; - FLT c6[] = {1.5684149291082115E+03, -1.0302687059852267E+03, -1.3446845770824435E+04, 2.0814393480320545E+04, 1.4366994276523908E+04, -4.4581342385955380E+04, 1.4366994276463982E+04, 2.0814393480325110E+04, -1.3446845770824308E+04, -1.0302687059850016E+03, 1.5684149291082128E+03, 0.0000000000000000E+00}; - FLT c7[] = {1.9398419323286222E+02, -8.7329293867281388E+02, 2.4796533428938184E+02, 3.2905701326623416E+03, -4.8989871768459579E+03, 2.8861239463615327E-09, 4.8989871768722078E+03, -3.2905701326312101E+03, -2.4796533429068171E+02, 8.7329293867237629E+02, -1.9398419323287882E+02, 0.0000000000000000E+00}; - FLT c8[] = {-4.2288232505124679E+00, -9.9574929618003850E+01, 2.9563077146126534E+02, -1.9453049352240328E+02, -4.0107401572039475E+02, 7.9532514195009401E+02, -4.0107401576942334E+02, -1.9453049354949908E+02, 2.9563077145563869E+02, -9.9574929618160851E+01, -4.2288232505049734E+00, 0.0000000000000000E+00}; - FLT c9[] = {-5.3741131162167548E+00, 5.5350606003782072E+00, 1.9153744596147156E+01, -6.3189447483342484E+01, 6.6921287710344444E+01, 2.6543499136172006E-08, -6.6921287588490713E+01, 6.3189447458080132E+01, -1.9153744593546620E+01, -5.5350606004478644E+00, 5.3741131162113120E+00, 0.0000000000000000E+00}; - FLT c10[] = {-7.0359426508237854E-01, 2.2229112757468452E+00, -3.2054079720618520E+00, 8.3392526913327172E-02, 6.8879260281453520E+00, -1.0795498333352139E+01, 6.8879260220718077E+00, 8.3392507342704467E-02, -3.2054079702060019E+00, 2.2229112757257625E+00, -7.0359426507941902E-01, 0.0000000000000000E+00}; - FLT c11[] = {5.2648094861126392E-02, 9.9912561389764148E-02, -4.3913938527232693E-01, 7.9792987484770361E-01, -6.9191816827427566E-01, -1.2022534526020762E-09, 6.9191820562024531E-01, -7.9792984883890594E-01, 4.3913938443394634E-01, -9.9912561446925147E-02, -5.2648094869462925E-02, 0.0000000000000000E+00}; - for (int i=0; i<12; i++) ker[i] = c0[i] + z*(c1[i] + z*(c2[i] + z*(c3[i] + z*(c4[i] + z*(c5[i] + z*(c6[i] + z*(c7[i] + z*(c8[i] + z*(c9[i] + z*(c10[i] + z*(c11[i]))))))))))); + FLT c0[] = {8.0191950887587672E-06, 1.8211144887695901E-03, 3.8565497751765716E-02, 2.5236459439543668E-01, 7.1517256669690443E-01, 1.0000000000000000E+00, 7.1517256669690399E-01, 2.5236459439543651E-01, 3.8565497751765709E-02, 1.8211144887695910E-03, 8.0191950887586656E-06, 0.0000000000000000E+00}; + FLT c1[] = {3.1996260415636094E-05, 3.5282769389657653E-03, 4.5889527487056471E-02, 1.8012194355267486E-01, 2.4178022040260394E-01, -1.4849044935138820E-16, -2.4178022040260408E-01, -1.8012194355267491E-01, -4.5889527487056485E-02, -3.5282769389657670E-03, -3.1996260415635877E-05, 0.0000000000000000E+00}; + FLT c2[] = {5.4612928019025150E-05, 2.9497743530118282E-03, 2.1858479505161198E-02, 3.8333708936616487E-02, -2.1641923687039311E-02, -8.3109405654057139E-02, -2.1641923687039148E-02, 3.8333708936616549E-02, 2.1858479505161187E-02, 2.9497743530118282E-03, 5.4612928019024878E-05, 0.0000000000000000E+00}; + FLT c3[] = {5.2504054888010103E-05, 1.3660648269306120E-03, 4.7357572177382573E-03, -2.2373255422689078E-03, -1.5459233729560838E-02, 8.2777271348319417E-17, 1.5459233729560940E-02, 2.2373255422689585E-03, -4.7357572177382573E-03, -1.3660648269306120E-03, -5.2504054888009899E-05, 0.0000000000000000E+00}; + FLT c4[] = {3.1396100602888598E-05, 3.6443237253636128E-04, 1.5906780001786376E-04, -1.9495384184342525E-03, -2.4621376046556591E-04, 3.2818730060400242E-03, -2.4621376046549717E-04, -1.9495384184342957E-03, 1.5906780001786054E-04, 3.6443237253636090E-04, 3.1396100602888476E-05, 0.0000000000000000E+00}; + FLT c5[] = {1.2057435171015772E-05, 4.6687328398363199E-05, -1.3963494372748247E-04, -1.4877651674415632E-04, 4.6954815721688515E-04, -8.0112266480761140E-18, -4.6954815721699401E-04, 1.4877651674410965E-04, 1.3963494372748247E-04, -4.6687328398363565E-05, -1.2057435171015740E-05, 0.0000000000000000E+00}; + FLT c6[] = {2.8888404081262420E-06, -1.8976367884802011E-06, -2.4767547607262255E-05, 3.8337725458138998E-05, 2.6462355617083014E-05, -8.2113719362889533E-05, 2.6462355617074022E-05, 3.8337725458128211E-05, -2.4767547607268550E-05, -1.8976367884808755E-06, 2.8888404081262352E-06, 0.0000000000000000E+00}; + FLT c7[] = {3.5729663467784788E-07, -1.6085054296210825E-06, 4.5672370507419953E-07, 6.0608527683396937E-06, -9.0233724844419958E-06, 4.9941702496811109E-18, 9.0233724844635849E-06, -6.0608527683001474E-06, -4.5672370507336912E-07, 1.6085054296209787E-06, -3.5729663467787059E-07, 0.0000000000000000E+00}; + FLT c8[] = {-7.7890073973121893E-09, -1.8340559948721496E-07, 5.4451797328899156E-07, -3.5830285714158528E-07, -7.3873233539148814E-07, 1.4648976903565062E-06, -7.3873233539148814E-07, -3.5830285714158528E-07, 5.4451797329166893E-07, -1.8340559948707155E-07, -7.7890073973062137E-09, 0.0000000000000000E+00}; + FLT c9[] = {-9.8984999695150684E-09, 1.0194946774237274E-08, 3.5279000674744131E-08, -1.1638771467098967E-07, 1.2326133614997474E-07, 4.0516498100293627E-17, -1.2326133616658230E-07, 1.1638771461009523E-07, -3.5279000675436117E-08, -1.0194946774540017E-08, 9.8984999695035805E-09, 0.0000000000000000E+00}; + for (int i=0; i<12; i++) ker[i] = c0[i] + z*(c1[i] + z*(c2[i] + z*(c3[i] + z*(c4[i] + z*(c5[i] + z*(c6[i] + z*(c7[i] + z*(c8[i] + z*(c9[i]))))))))); } else if constexpr(w==12) { - FLT c0[] = {6.4299692685485315E+03, 2.0077596413122714E+06, 5.4904521978991628E+07, 4.5946106674819350E+08, 1.6835469840840104E+09, 3.1308386544851556E+09, 3.1308386544851556E+09, 1.6835469840840099E+09, 4.5946106674819458E+08, 5.4904521978991754E+07, 2.0077596413122730E+06, 6.4299692685634491E+03}; - FLT c1[] = {2.6965848540274073E+04, 4.1625245902732178E+06, 7.2097002594596952E+07, 3.8505085985474640E+08, 7.9479013671674240E+08, 4.7870231281824082E+08, -4.7870231281824046E+08, -7.9479013671674252E+08, -3.8505085985474682E+08, -7.2097002594597101E+07, -4.1625245902732178E+06, -2.6965848540258085E+04}; - FLT c2[] = {4.8869694409905111E+04, 3.7863371066322513E+06, 3.9530526716552719E+07, 1.1475134266581042E+08, 4.6311261797930710E+07, -2.0442837194260675E+08, -2.0442837194260725E+08, 4.6311261797930680E+07, 1.1475134266581020E+08, 3.9530526716552787E+07, 3.7863371066322504E+06, 4.8869694409920470E+04}; - FLT c3[] = {5.0530564260114021E+04, 1.9615784087727289E+06, 1.1044597342441007E+07, 7.9812418612436540E+06, -3.4042228324588493E+07, -3.3301805987927791E+07, 3.3301805987928167E+07, 3.4042228324588671E+07, -7.9812418612435497E+06, -1.1044597342440993E+07, -1.9615784087727286E+06, -5.0530564260099913E+04}; - FLT c4[] = {3.3081876469965493E+04, 6.2011956881368335E+05, 1.3086001239863748E+06, -3.1165484297367339E+06, -5.1982996003442882E+06, 6.3530947749618590E+06, 6.3530947749616513E+06, -5.1982996003444213E+06, -3.1165484297366543E+06, 1.3086001239863599E+06, 6.2011956881368288E+05, 3.3081876469981333E+04}; - FLT c5[] = {1.4308966168506788E+04, 1.1375573205951916E+05, -1.0318195403424598E+05, -6.6892418721462542E+05, 5.9223570255461533E+05, 1.1093685152673351E+06, -1.1093685152666988E+06, -5.9223570255418238E+05, 6.6892418721489178E+05, 1.0318195403424004E+05, -1.1375573205951886E+05, -1.4308966168492358E+04}; - FLT c6[] = {4.0848961919700960E+03, 7.5033277163528910E+03, -5.2578904182711594E+04, 6.3431596329919275E+03, 1.5984798504282799E+05, -1.2521363434070408E+05, -1.2521363434057294E+05, 1.5984798504289921E+05, 6.3431596327853522E+03, -5.2578904182714803E+04, 7.5033277163530738E+03, 4.0848961919843541E+03}; - FLT c7[] = {7.1658797373677544E+02, -1.5499947984100402E+03, -4.5490740453241297E+03, 1.4520122796414065E+04, -3.7896465826366048E+03, -2.3597107892645658E+04, 2.3597107892708405E+04, 3.7896465828577311E+03, -1.4520122796272850E+04, 4.5490740453326107E+03, 1.5499947984094520E+03, -7.1658797372277388E+02}; - FLT c8[] = {5.2022749592533359E+01, -4.0624258132650436E+02, 5.2256582980122801E+02, 9.3282469962834807E+02, -2.8710622267611107E+03, 1.7594166903207245E+03, 1.7594166904840572E+03, -2.8710622269566602E+03, 9.3282469973848731E+02, 5.2256582976889342E+02, -4.0624258132718376E+02, 5.2022749606062760E+01}; - FLT c9[] = {-7.0341875498860729E+00, -2.3043166229077922E+01, 1.2279331781679724E+02, -1.6714687548507158E+02, -4.4746498424591195E+01, 3.6060906024962412E+02, -3.6060905985137049E+02, 4.4746498852565225E+01, 1.6714687549695972E+02, -1.2279331779599295E+02, 2.3043166228938606E+01, 7.0341875614861786E+00}; - FLT c10[] = {-2.1556100132617875E+00, 4.1361104009993737E+00, 1.8107701723532290E+00, -2.1223400322208619E+01, 3.5820961861882218E+01, -1.8782945665578143E+01, -1.8782945409136026E+01, 3.5820961915195049E+01, -2.1223400242576908E+01, 1.8107701298380314E+00, 4.1361104007462801E+00, -2.1556100021452793E+00}; - FLT c11[] = {-1.1440899376747954E-01, 7.0567641591060326E-01, -1.4530217904770133E+00, 1.0571984613482723E+00, 1.4389002957406878E+00, -4.2241732762744180E+00, 4.2241733421252539E+00, -1.4389000664821670E+00, -1.0571984509828731E+00, 1.4530218285851431E+00, -7.0567641613924970E-01, 1.1440900438178304E-01}; - FLT c12[] = {-1.4486009663463860E-02, 2.9387825785034223E-03, -1.0265969715607470E-01, 2.6748267835596640E-01, -3.3606430399849180E-01, 1.5850148085005597E-01, 1.5850183161365292E-01, -3.3606448814949358E-01, 2.6748281866164947E-01, -1.0265975004478733E-01, 2.9387817050372631E-03, -1.4486000369842612E-02}; - for (int i=0; i<12; i++) ker[i] = c0[i] + z*(c1[i] + z*(c2[i] + z*(c3[i] + z*(c4[i] + z*(c5[i] + z*(c6[i] + z*(c7[i] + z*(c8[i] + z*(c9[i] + z*(c10[i] + z*(c11[i] + z*(c12[i])))))))))))); + FLT c0[] = {1.9028495068410013E-06, 5.9416527261081902E-04, 1.6248140264385584E-02, 1.3597036436097915E-01, 4.9821957378204829E-01, 9.2652305802242962E-01, 9.2652305802242918E-01, 4.9821957378204829E-01, 1.3597036436097931E-01, 1.6248140264385619E-02, 5.9416527261081913E-04, 1.9028495068454209E-06}; + FLT c1[] = {7.9801239249145906E-06, 1.2318344820958854E-03, 2.1335987794357202E-02, 1.1394981969310450E-01, 2.3520579283187470E-01, 1.4166451219687684E-01, -1.4166451219687690E-01, -2.3520579283187470E-01, -1.1394981969310465E-01, -2.1335987794357230E-02, -1.2318344820958849E-03, -7.9801239249098591E-06}; + FLT c2[] = {1.4462226804444718E-05, 1.1205076408888253E-03, 1.1698445222077601E-02, 3.3958877046121605E-02, 1.3705098421608818E-02, -6.0497400607811502E-02, -6.0497400607811364E-02, 1.3705098421608861E-02, 3.3958877046121584E-02, 1.1698445222077629E-02, 1.1205076408888253E-03, 1.4462226804449268E-05}; + FLT c3[] = {1.4953735432776068E-05, 5.8049865432805055E-04, 3.2684769908807644E-03, 2.3619245295514002E-03, -1.0074268581043128E-02, -9.8551520939613012E-03, 9.8551520939613984E-03, 1.0074268581043190E-02, -2.3619245295513390E-03, -3.2684769908807631E-03, -5.8049865432805055E-04, -1.4953735432771904E-05}; + FLT c4[] = {9.7900673700200710E-06, 1.8351475200221906E-04, 3.8725987583789449E-04, -9.2229408802589803E-04, -1.5383560041741977E-03, 1.8800996948122673E-03, 1.8800996948122159E-03, -1.5383560041741806E-03, -9.2229408802591950E-04, 3.8725987583788858E-04, 1.8351475200221892E-04, 9.7900673700247601E-06}; + FLT c5[] = {4.2345162286123920E-06, 3.3664241555334188E-05, -3.0535096226552359E-05, -1.9795772057291372E-04, 1.7526295499601351E-04, 3.2830037656729569E-04, -3.2830037656741235E-04, -1.7526295499597461E-04, 1.9795772057291762E-04, 3.0535096226554304E-05, -3.3664241555334127E-05, -4.2345162286081289E-06}; + FLT c6[] = {1.2088615636792283E-06, 2.2204932634070340E-06, -1.5559909809164321E-05, 1.8771595438438357E-06, 4.7304527720930092E-05, -3.7055029721542363E-05, -3.7055029721474024E-05, 4.7304527720924698E-05, 1.8771595438150590E-06, -1.5559909809162522E-05, 2.2204932634069218E-06, 1.2088615636834516E-06}; + FLT c7[] = {2.1206307767330490E-07, -4.5869687934425177E-07, -1.3462277877572238E-06, 4.2970047520095079E-06, -1.1214870287414941E-06, -6.9831974682611276E-06, 6.9831974682960042E-06, 1.1214870288062637E-06, -4.2970047519858427E-06, 1.3462277877584693E-06, 4.5869687934430365E-07, -2.1206307766916437E-07}; + FLT c8[] = {1.5395324498811026E-08, -1.2022118042098672E-07, 1.5464523856461759E-07, 2.7605497715117822E-07, -8.4964626030792186E-07, 5.2067203455623376E-07, 5.2067203460519205E-07, -8.4964626028956253E-07, 2.7605497715882793E-07, 1.5464523855945402E-07, -1.2022118042095684E-07, 1.5395324502815186E-08}; + FLT c9[] = {-2.0816585198663231E-09, -6.8192670392721950E-09, 3.6338774646281261E-08, -4.9464521005206807E-08, -1.3242031043825771E-08, 1.0671664853011416E-07, -1.0671664860484826E-07, 1.3242031029986123E-08, 4.9464520965071825E-08, -3.6338774641091391E-08, 6.8192670390235131E-09, 2.0816585232936298E-09}; + FLT c10[] = {-6.3791929313927889E-10, 1.2240176129392066E-09, 5.3586929655729871E-10, -6.2807356207213370E-09, 1.0600657345063913E-08, -5.5585209137321311E-09, -5.5585209024191334E-09, 1.0600657351506037E-08, -6.2807355779833450E-09, 5.3586929058654981E-10, 1.2240176130570502E-09, -6.3791928984364409E-10}; + for (int i=0; i<12; i++) ker[i] = c0[i] + z*(c1[i] + z*(c2[i] + z*(c3[i] + z*(c4[i] + z*(c5[i] + z*(c6[i] + z*(c7[i] + z*(c8[i] + z*(c9[i] + z*(c10[i])))))))))); } else if constexpr(w==13) { - FLT c0[] = {9.3397060605267689E+03, 3.9447202186643109E+06, 1.3701428307175812E+08, 1.4375660883001409E+09, 6.6384519128895693E+09, 1.5848048271166529E+10, 2.1031560281976665E+10, 1.5848048271166502E+10, 6.6384519128895674E+09, 1.4375660883001378E+09, 1.3701428307175812E+08, 3.9447202186642843E+06, 9.3397060605268125E+03, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; - FLT c1[] = {4.0984512931817764E+04, 8.6828943763566799E+06, 1.9558432133067656E+08, 1.3674961320373521E+09, 3.9251291128182430E+09, 4.5116631434426517E+09, 4.8375356630808043E-07, -4.5116631434426460E+09, -3.9251291128182402E+09, -1.3674961320373492E+09, -1.9558432133067656E+08, -8.6828943763566278E+06, -4.0984512931817771E+04, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; - FLT c2[] = {7.8379538318778985E+04, 8.4928073133582603E+06, 1.1992091153966437E+08, 5.0561697705436689E+08, 6.1845897311593950E+08, -5.1306326495404470E+08, -1.4790096327029374E+09, -5.1306326495404077E+08, 6.1845897311593986E+08, 5.0561697705436659E+08, 1.1992091153966436E+08, 8.4928073133582156E+06, 7.8379538318778927E+04, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; - FLT c3[] = {8.6417670227040013E+04, 4.8250267333349697E+06, 3.9836803808039002E+07, 7.5026052902191013E+07, -7.7565422849560052E+07, -2.5393835488011825E+08, 5.1202971235247489E-07, 2.5393835488012013E+08, 7.7565422849558711E+07, -7.5026052902191967E+07, -3.9836803808039002E+07, -4.8250267333349511E+06, -8.6417670227039998E+04, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; - FLT c4[] = {6.1161604972829380E+04, 1.7331203720075535E+06, 7.0216196997558968E+06, -3.6027138646117523E+06, -3.1775875626364492E+07, 1.6544480876790185E+06, 4.9816566960114852E+07, 1.6544480876808946E+06, -3.1775875626363728E+07, -3.6027138646113039E+06, 7.0216196997558847E+06, 1.7331203720075490E+06, 6.1161604972829351E+04, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; - FLT c5[] = {2.9177164557155938E+04, 3.9318079134661221E+05, 3.1307448297760956E+05, -2.7571366584957433E+06, -9.8421840747392306E+05, 6.8469173866731795E+06, 2.9232946975263515E-06, -6.8469173866698397E+06, 9.8421840747792379E+05, 2.7571366584955421E+06, -3.1307448297758284E+05, -3.9318079134660971E+05, -2.9177164557155946E+04, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; - FLT c6[] = {9.5097815505886610E+03, 4.8799940773716655E+04, -1.2734023162441862E+05, -2.5472337176564379E+05, 6.3596049196278059E+05, 2.2361868201841635E+05, -1.0716559939651759E+06, 2.2361868202218774E+05, 6.3596049196161982E+05, -2.5472337176485342E+05, -1.2734023162441724E+05, 4.8799940773713337E+04, 9.5097815505886447E+03, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; - FLT c7[] = {2.0601715730545379E+03, 1.9365931141472569E+02, -2.5304303117518622E+04, 2.9151392447034210E+04, 5.9055020355306144E+04, -1.1784846181665688E+05, 1.1400011168699383E-06, 1.1784846181507374E+05, -5.9055020356297522E+04, -2.9151392447480976E+04, 2.5304303117520958E+04, -1.9365931141621550E+02, -2.0601715730545466E+03, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; - FLT c8[] = {2.5975061893404052E+02, -1.0025387650583972E+03, -6.8642481194759603E+02, 6.7515314205452096E+03, -7.0772939650079616E+03, -6.5444514139847633E+03, 1.6566898963381227E+04, -6.5444514164662887E+03, -7.0772939638053231E+03, 6.7515314202341915E+03, -6.8642481198706810E+02, -1.0025387650556635E+03, 2.5975061893403893E+02, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; - FLT c9[] = {5.8705282128634133E+00, -1.4424362302822419E+02, 3.3390627215295177E+02, 4.8151337640374301E+01, -1.1431733953039347E+03, 1.4557114789663567E+03, 1.9301282133401762E-06, -1.4557114797747520E+03, 1.1431733969207255E+03, -4.8151337212400264E+01, -3.3390627213809154E+02, 1.4424362302302313E+02, -5.8705282128808269E+00, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; - FLT c10[] = {-4.0954969508936898E+00, -1.2634947188543673E+00, 3.8134139835466350E+01, -8.4115524781317148E+01, 4.2766848228448069E+01, 1.0573434411021174E+02, -1.9636661067694894E+02, 1.0573435394677749E+02, 4.2766846813968300E+01, -8.4115525213218916E+01, 3.8134139824669184E+01, -1.2634947158177201E+00, -4.0954969509055461E+00, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; - FLT c11[] = {-6.2702735486285888E-01, 1.8595467772479546E+00, -1.3027978470952948E+00, -4.9265265903267785E+00, 1.3906831953385087E+01, -1.3753762586104637E+01, 1.0604155239584518E-06, 1.3753756761963198E+01, -1.3906831509501583E+01, 4.9265273268806409E+00, 1.3027978586801867E+00, -1.8595467797630916E+00, 6.2702735486047489E-01, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; - FLT c12[] = {-4.8290636703364975E-02, 1.7531876505199090E-01, -5.0041292774701596E-01, 6.3665145473474949E-01, -1.2476811514471326E-02, -1.2061603189510861E+00, 1.8595308638696268E+00, -1.2061633355215959E+00, -1.2475969680262359E-02, 6.3665088474340670E-01, -5.0041295405456876E-01, 1.7531876799797264E-01, -4.8290636708721864E-02, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; - FLT c13[] = {2.2894665617766322E-02, -7.1358257229878720E-03, -1.4950743217821900E-02, 7.0611745711086651E-02, -1.2311302279978055E-01, 1.0342573392772816E-01, 5.7346192890547669E-07, -1.0342709034448951E-01, 1.2311300937219723E-01, -7.0611830251417942E-02, 1.4950741891648016E-02, 7.1358203725587141E-03, -2.2894665628191136E-02, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; - for (int i=0; i<16; i++) ker[i] = c0[i] + z*(c1[i] + z*(c2[i] + z*(c3[i] + z*(c4[i] + z*(c5[i] + z*(c6[i] + z*(c7[i] + z*(c8[i] + z*(c9[i] + z*(c10[i] + z*(c11[i] + z*(c12[i] + z*(c13[i]))))))))))))); + FLT c0[] = {4.4408051211162671E-07, 1.8756193861873413E-04, 6.5146989208011699E-03, 6.8352802598867848E-02, 3.1564238810082496E-01, 7.5353649746793927E-01, 9.9999999999999944E-01, 7.5353649746793827E-01, 3.1564238810082473E-01, 6.8352802598867710E-02, 6.5146989208011664E-03, 1.8756193861873272E-04, 4.4408051211162740E-07, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c1[] = {1.9487148068106048E-06, 4.1285069961250690E-04, 9.2995630713278779E-03, 6.5021145064983535E-02, 1.8663042875530000E-01, 2.1451870821533811E-01, -4.2425842671825291E-17, -2.1451870821533800E-01, -1.8663042875529998E-01, -6.5021145064983424E-02, -9.2995630713278762E-03, -4.1285069961250441E-04, -1.9487148068106044E-06, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c2[] = {3.7267581324409626E-06, 4.0381251792508718E-04, 5.7019503038218408E-03, 2.4040868593456798E-02, 2.9406233528281676E-02, -2.4394921635639274E-02, -7.0323343245740924E-02, -2.4394921635639076E-02, 2.9406233528281728E-02, 2.4040868593456794E-02, 5.7019503038218391E-03, 4.0381251792508517E-04, 3.7267581324409639E-06, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c3[] = {4.1089519307370109E-06, 2.2941839162878702E-04, 1.8941440042457411E-03, 3.5673079836347600E-03, -3.6880489041049127E-03, -1.2074156718545229E-02, 7.7638840193391308E-18, 1.2074156718545398E-02, 3.6880489041048680E-03, -3.5673079836347752E-03, -1.8941440042457402E-03, -2.2941839162878607E-04, -4.1089519307370134E-06, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c4[] = {2.9080869014384416E-06, 8.2405696428180866E-05, 3.3386109283452882E-04, -1.7130036080580300E-04, -1.5108662980936798E-03, 7.8665018928628880E-05, 2.3686576883603285E-03, 7.8665018928680434E-05, -1.5108662980936711E-03, -1.7130036080580300E-04, 3.3386109283452703E-04, 8.2405696428180690E-05, 2.9080869014384429E-06, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c5[] = {1.3873038503072794E-06, 1.8694798962849904E-05, 1.4885937076477319E-05, -1.3109520271107600E-04, -4.6797213058836700E-05, 3.2555441892430831E-04, -4.2789977886166419E-17, -3.2555441892428500E-04, 4.6797213058883368E-05, 1.3109520271106627E-04, -1.4885937076476833E-05, -1.8694798962849965E-05, -1.3873038503072805E-06, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c6[] = {4.5216719173889329E-07, 2.3203195635244806E-06, -6.0547210914040705E-06, -1.2111482379350871E-05, 3.0238388566349212E-05, 1.0632529352104186E-05, -5.0954659549722760E-05, 1.0632529352261560E-05, 3.0238388566306048E-05, -1.2111482379354468E-05, -6.0547210914051945E-06, 2.3203195635247335E-06, 4.5216719173889398E-07, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c7[] = {9.7956192761409367E-08, 9.2080334894896161E-09, -1.2031586234331795E-06, 1.3860784486026173E-06, 2.8079238803139698E-06, -5.6034103145542327E-06, -1.2739341879231602E-17, 5.6034103145492504E-06, -2.8079238803461473E-06, -1.3860784486009564E-06, 1.2031586234342174E-06, -9.2080334897361341E-09, -9.7956192761410584E-08, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c8[] = {1.2350515865275413E-08, -4.7668301905193214E-08, -3.2637845350503965E-08, 3.2101904613886198E-07, -3.3650826993121675E-07, -3.1117289067535446E-07, 7.8771611533367254E-07, -3.1117289078551072E-07, -3.3650826986389902E-07, 3.2101904612203255E-07, -3.2637845350169294E-08, -4.7668301904846586E-08, 1.2350515865276535E-08, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c9[] = {2.7912946705499348E-10, -6.8584366112252110E-09, 1.5876438439921649E-08, 2.2894800333296164E-09, -5.4355139618053459E-08, 6.9215572172708388E-08, -2.0761222756661531E-17, -6.9215572327712453E-08, 5.4355139609749671E-08, -2.2894800250258273E-09, -1.5876438439921649E-08, 6.8584366109549049E-09, -2.7912946705575371E-10, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c10[] = {-1.9473100882661174E-10, -6.0076128537522075E-11, 1.8131864336846848E-09, -3.9994904594475383E-09, 2.0334605453276710E-09, 5.0274131644549980E-09, -9.3367591454043182E-09, 5.0274135399836745E-09, 2.0334605013326797E-09, -3.9994904896155324E-09, 1.8131864336846848E-09, -6.0076128203631512E-11, -1.9473100882576781E-10, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c11[] = {-2.9813639428880222E-11, 8.8416967203798553E-11, -6.1944900049416202E-11, -2.3424446304741974E-10, 6.6123634170186695E-10, -6.5395826611340155E-10, -4.1544196918380560E-17, 6.5395798843212787E-10, -6.6123634887104090E-10, 2.3424448292235756E-10, 6.1944899375087956E-11, -8.8416967518780826E-11, 2.9813639428672270E-11, 0.0000000000000000E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; + for (int i=0; i<16; i++) ker[i] = c0[i] + z*(c1[i] + z*(c2[i] + z*(c3[i] + z*(c4[i] + z*(c5[i] + z*(c6[i] + z*(c7[i] + z*(c8[i] + z*(c9[i] + z*(c10[i] + z*(c11[i]))))))))))); } else if constexpr(w==14) { - FLT c0[] = {1.3368785683552904E+04, 7.5304732752870144E+06, 3.2765764524434990E+08, 4.2418096936485257E+09, 2.4197690538177525E+10, 7.2227640697189651E+10, 1.2261475327356714E+11, 1.2261475327356711E+11, 7.2227640697189682E+10, 2.4197690538177582E+10, 4.2418096936485257E+09, 3.2765764524435169E+08, 7.5304732752870200E+06, 1.3368785683578039E+04, 0.0000000000000000E+00, 0.0000000000000000E+00}; - FLT c1[] = {6.1154444023081669E+04, 1.7488686085101541E+07, 5.0279014009863263E+08, 4.4777867842655849E+09, 1.6916819861812059E+10, 2.8971884004562843E+10, 1.6054555293734524E+10, -1.6054555293734529E+10, -2.8971884004562843E+10, -1.6916819861812090E+10, -4.4777867842655830E+09, -5.0279014009863406E+08, -1.7488686085101560E+07, -6.1154444023056145E+04, 0.0000000000000000E+00, 0.0000000000000000E+00}; - FLT c2[] = {1.2279790808348049E+05, 1.8230319600271538E+07, 3.3815815633683985E+08, 1.9369899011251254E+09, 3.9743454154781203E+09, 7.4954544638351786E+08, -7.0173920607395000E+09, -7.0173920607395000E+09, 7.4954544638351130E+08, 3.9743454154781117E+09, 1.9369899011251252E+09, 3.3815815633684093E+08, 1.8230319600271557E+07, 1.2279790808350699E+05, 0.0000000000000000E+00, 0.0000000000000000E+00}; - FLT c3[] = {1.4339321200624766E+05, 1.1200899688172188E+07, 1.2799140125169712E+08, 4.0176966726270604E+08, 7.9146174555810899E+07, -1.1719748245183561E+09, -9.6919138198233843E+08, 9.6919138198235476E+08, 1.1719748245183618E+09, -7.9146174555819452E+07, -4.0176966726270568E+08, -1.2799140125169776E+08, -1.1200899688172201E+07, -1.4339321200622554E+05, 0.0000000000000000E+00, 0.0000000000000000E+00}; - FLT c4[] = {1.0866548538632700E+05, 4.4565213401510641E+06, 2.8354150929531462E+07, 2.2805067924009934E+07, -1.2058223609889300E+08, -1.2775415620368913E+08, 1.9261201640091014E+08, 1.9261201640090343E+08, -1.2775415620368628E+08, -1.2058223609888241E+08, 2.2805067924009915E+07, 2.8354150929531943E+07, 4.4565213401510660E+06, 1.0866548538635390E+05, 0.0000000000000000E+00, 0.0000000000000000E+00}; - FLT c5[] = {5.6346565047794407E+04, 1.1743908345502375E+06, 3.0601086667309003E+06, -7.2274020134796975E+06, -1.6220595157143334E+07, 2.0773587344466623E+07, 2.8183198298701070E+07, -2.8183198298682313E+07, -2.0773587344454899E+07, 1.6220595157147046E+07, 7.2274020134809064E+06, -3.0601086667310768E+06, -1.1743908345502312E+06, -5.6346565047771022E+04, 0.0000000000000000E+00, 0.0000000000000000E+00}; - FLT c6[] = {2.0435142564639598E+04, 1.9450977300078847E+05, -1.1234667576926883E+05, -1.5205767549240857E+06, 1.0515640561047094E+06, 3.7458351782500809E+06, -3.3794074240119159E+06, -3.3794074240111569E+06, 3.7458351782506104E+06, 1.0515640561079446E+06, -1.5205767549239916E+06, -1.1234667576914738E+05, 1.9450977300078212E+05, 2.0435142564663307E+04, 0.0000000000000000E+00, 0.0000000000000000E+00}; - FLT c7[] = {5.1491366053560478E+03, 1.4735748500440239E+04, -8.1689482343683034E+04, -3.5176894225644079E+04, 3.7034248410400847E+05, -1.9109669530460562E+05, -5.2637978465735121E+05, 5.2637978465564619E+05, 1.9109669530912716E+05, -3.7034248412078863E+05, 3.5176894225852200E+04, 8.1689482343699274E+04, -1.4735748500439855E+04, -5.1491366053330485E+03, 0.0000000000000000E+00, 0.0000000000000000E+00}; - FLT c8[] = {8.5138795113645585E+02, -1.2978618911733427E+03, -8.7500873646623440E+03, 2.1319159613970569E+04, 7.6586611605801199E+03, -6.2424139811455236E+04, 4.2620771487921840E+04, 4.2620771491440872E+04, -6.2424139815176597E+04, 7.6586611693937375E+03, 2.1319159613447209E+04, -8.7500873648877496E+03, -1.2978618911701635E+03, 8.5138795115875257E+02, 0.0000000000000000E+00, 0.0000000000000000E+00}; - FLT c9[] = {7.2176142041616245E+01, -4.5543406155008586E+02, 2.8301959891624585E+02, 2.1994171513769957E+03, -4.5082500677203352E+03, 4.7658016853354945E+02, 7.1044827209848581E+03, -7.1044827023442112E+03, -4.7658015978385805E+02, 4.5082500694322307E+03, -2.1994171506161529E+03, -2.8301959873197922E+02, 4.5543406154525627E+02, -7.2176142022451799E+01, 0.0000000000000000E+00, 0.0000000000000000E+00}; - FLT c10[] = {-3.1135380163286266E+00, -3.8554406982628045E+01, 1.4396028111579378E+02, -1.1260050352192819E+02, -3.0073665460436297E+02, 7.2079162225452933E+02, -4.1195308319958349E+02, -4.1195308907344031E+02, 7.2079162228692246E+02, -3.0073665296314113E+02, -1.1260050391063737E+02, 1.4396028095922969E+02, -3.8554406981953719E+01, -3.1135379980309104E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; - FLT c11[] = {-1.6022934776950781E+00, 1.8678197421257499E+00, 8.3368944138930576E+00, -3.0791578217513287E+01, 3.4749712345962102E+01, 1.2322522680262193E+01, -7.3924006859338746E+01, 7.3924005395986399E+01, -1.2322518095091780E+01, -3.4749717239655702E+01, 3.0791578812609753E+01, -8.3368942651188451E+00, -1.8678197375527952E+00, 1.6022934952009980E+00, 0.0000000000000000E+00, 0.0000000000000000E+00}; - FLT c12[] = {-1.9362061840948824E-01, 6.3024467669748396E-01, -9.3262278519229969E-01, -4.8908749318740480E-01, 4.0479376609320967E+00, -6.2829712900962678E+00, 3.1767825933699174E+00, 3.1767865219197975E+00, -6.2829777441520323E+00, 4.0479394849078085E+00, -4.8908801933495105E-01, -9.3262306580362497E-01, 6.3024467258732675E-01, -1.9362060312142931E-01, 0.0000000000000000E+00, 0.0000000000000000E+00}; - FLT c13[] = {1.8785913718903639E-02, 3.1605271252714680E-02, -1.3655798291459853E-01, 2.5016547139148904E-01, -1.6654308552073466E-01, -2.1682598043284024E-01, 6.1786085249849709E-01, -6.1785470804340159E-01, 2.1682794765059335E-01, 1.6654258378326353E-01, -2.5016523395036322E-01, 1.3655803190024704E-01, -3.1605272440421092E-02, -1.8785905282938619E-02, 0.0000000000000000E+00, 0.0000000000000000E+00}; - FLT c14[] = {-1.2896545140952162E-02, -3.7106972352948116E-03, 5.8857860695711909E-04, 1.3987176343065890E-02, -3.5714007561179102E-02, 4.3401590960273219E-02, -2.0034532372716081E-02, -2.0038454375630149E-02, 4.3401322628411031E-02, -3.5713348533616053E-02, 1.3987046090052241E-02, 5.8856319054218355E-04, -3.7106979912720915E-03, -1.2896537385752806E-02, 0.0000000000000000E+00, 0.0000000000000000E+00}; - for (int i=0; i<16; i++) ker[i] = c0[i] + z*(c1[i] + z*(c2[i] + z*(c3[i] + z*(c4[i] + z*(c5[i] + z*(c6[i] + z*(c7[i] + z*(c8[i] + z*(c9[i] + z*(c10[i] + z*(c11[i] + z*(c12[i] + z*(c13[i] + z*(c14[i])))))))))))))); + FLT c0[] = {1.0213002307223056E-07, 5.7528591418445632E-05, 2.5031206020280083E-03, 3.2405046511689239E-02, 1.8485678142025511E-01, 5.5177865704975293E-01, 9.3670793123951734E-01, 9.3670793123951734E-01, 5.5177865704975293E-01, 1.8485678142025552E-01, 3.2405046511689246E-02, 2.5031206020280179E-03, 5.7528591418445801E-05, 1.0213002307242283E-07, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c1[] = {4.6718564624239798E-07, 1.3360375098030156E-04, 3.8410346178215297E-03, 3.4207779106833432E-02, 1.2923501383683486E-01, 2.2132894130184300E-01, 1.2264779624530257E-01, -1.2264779624530266E-01, -2.2132894130184300E-01, -1.2923501383683503E-01, -3.4207779106833432E-02, -3.8410346178215393E-03, -1.3360375098030183E-04, -4.6718564624220306E-07, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c2[] = {9.3810713124204517E-07, 1.3926941499858522E-04, 2.5833386162538992E-03, 1.4797516242328845E-02, 3.0361769467151939E-02, 5.7261067343619453E-03, -5.3608938764866568E-02, -5.3608938764866804E-02, 5.7261067343620043E-03, 3.0361769467151887E-02, 1.4797516242328843E-02, 2.5833386162539074E-03, 1.3926941499858538E-04, 9.3810713124224771E-07, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c3[] = {1.0954436997682012E-06, 8.5568590196649072E-05, 9.7778250562911362E-04, 3.0692948752812726E-03, 6.0463237460737715E-04, -8.9532302111319517E-03, -7.4040784665310088E-03, 7.4040784665311398E-03, 8.9532302111319049E-03, -6.0463237460742030E-04, -3.0692948752812760E-03, -9.7778250562911796E-04, -8.5568590196649234E-05, -1.0954436997680322E-06, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c4[] = {8.3014334976692694E-07, 3.4045323043173907E-05, 2.1660980714121266E-04, 1.7421792587401537E-04, -9.2118064021565096E-04, -9.7597008655070415E-04, 1.4714477548414425E-03, 1.4714477548413221E-03, -9.7597008655066978E-04, -9.2118064021557355E-04, 1.7421792587402128E-04, 2.1660980714121377E-04, 3.4045323043173954E-05, 8.3014334976713256E-07, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c5[] = {4.3045614796951609E-07, 8.9716871724550223E-06, 2.3377513570381975E-05, -5.5213296993544491E-05, -1.2391624765754029E-04, 1.5869855385558889E-04, 2.1530382494139264E-04, -2.1530382494148987E-04, -1.5869855385559667E-04, 1.2391624765754420E-04, 5.5213296993542547E-05, -2.3377513570382097E-05, -8.9716871724550562E-06, -4.3045614796933784E-07, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c6[] = {1.5611302559652624E-07, 1.4859455506706588E-06, -8.5826557923801041E-07, -1.1616353402589941E-05, 8.0333594878743668E-06, 2.8616079443342253E-05, -2.5816776957596172E-05, -2.5816776957725667E-05, 2.8616079443297517E-05, 8.0333594878743668E-06, -1.1616353402589941E-05, -8.5826557923812285E-07, 1.4859455506706096E-06, 1.5611302559670729E-07, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c7[] = {3.9336515129721029E-08, 1.1257285216172823E-07, -6.2406181937643518E-07, -2.6873173855212429E-07, 2.8292088258391734E-06, -1.4598715517943753E-06, -4.0212462690573659E-06, 4.0212462690777108E-06, 1.4598715517561777E-06, -2.8292088259366911E-06, 2.6873173855004832E-07, 6.2406181937633131E-07, -1.1257285216170229E-07, -3.9336515129545111E-08, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c8[] = {6.5041263396090684E-09, -9.9149367808892008E-09, -6.6845758889566122E-08, 1.6286641993591861E-07, 5.8507874937330077E-08, -4.7688540979254475E-07, 3.2559878513865341E-07, 3.2559878505297634E-07, -4.7688540973134683E-07, 5.8507875016887355E-08, 1.6286641992979879E-07, -6.6845758890092050E-08, -9.9149367809190818E-09, 6.5041263397797216E-09, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c9[] = {5.5138523621058489E-10, -3.4792607432848048E-09, 2.1621109683219443E-09, 1.6802313214377317E-08, -3.4440501477287078E-08, 3.6408052006210212E-09, 5.4274262219974878E-08, -5.4274262276717443E-08, -3.6408052283003184E-09, 3.4440501466215358E-08, -1.6802313213339344E-08, -2.1621109680192019E-09, 3.4792607432685862E-09, -5.5138523606432426E-10, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c10[] = {-2.3785683828648566E-11, -2.9453404128779668E-10, 1.0997757892316608E-09, -8.6020469050217690E-10, -2.2974593148638725E-09, 5.5064436862062262E-09, -3.1470906039204597E-09, -3.1470906435159520E-09, 5.5064436312124872E-09, -2.2974593224058709E-09, -8.6020468893092726E-10, 1.0997757877782549E-09, -2.9453404132462281E-10, -2.3785683688841006E-11, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c11[] = {-1.2240623323565210E-11, 1.4269095045857491E-11, 6.3689195678622977E-11, -2.3523039312409202E-10, 2.6546832599550726E-10, 9.4137124835858634E-11, -5.6473808447746174E-10, 5.6473802485264837E-10, -9.4137192268683287E-11, -2.6546836370465266E-10, 2.3523038893615868E-10, -6.3689194596148682E-11, -1.4269094972657386E-11, 1.2240623457626768E-11, 0.0000000000000000E+00, 0.0000000000000000E+00}; + FLT c12[] = {-1.4791529084475183E-12, 4.8147158230661728E-12, -7.1247156948137733E-12, -3.7363541207502799E-12, 3.0923963981839685E-11, -4.7998355799044319E-11, 2.4268806716162679E-11, 2.4268733214440741E-11, -4.7998325173326849E-11, 3.0923986440699169E-11, -3.7363622876082732E-12, -7.1247172580014364E-12, 4.8147157243700130E-12, -1.4791527913704449E-12, 0.0000000000000000E+00, 0.0000000000000000E+00}; + for (int i=0; i<16; i++) ker[i] = c0[i] + z*(c1[i] + z*(c2[i] + z*(c3[i] + z*(c4[i] + z*(c5[i] + z*(c6[i] + z*(c7[i] + z*(c8[i] + z*(c9[i] + z*(c10[i] + z*(c11[i] + z*(c12[i])))))))))))); } else if constexpr(w==15) { - FLT c0[] = {1.8887777774374499E+04, 1.4015330434461417E+07, 7.5498683300180018E+08, 1.1900937739619951E+10, 8.2530965279375351E+10, 3.0178246269069604E+11, 6.3775691457119104E+11, 8.1471473119305554E+11, 6.3775691457119116E+11, 3.0178246269069641E+11, 8.2530965279375519E+10, 1.1900937739619963E+10, 7.5498683300180054E+08, 1.4015330434461435E+07, 1.8887777774374488E+04, 0.0000000000000000E+00}; - FLT c1[] = {8.9780907163796335E+04, 3.4167636285297148E+07, 1.2346880033823481E+09, 1.3719272724135921E+10, 6.5858241494816696E+10, 1.5266999939989539E+11, 1.5687794513790723E+11, -2.8523584844088883E-05, -1.5687794513790732E+11, -1.5266999939989545E+11, -6.5858241494816811E+10, -1.3719272724135933E+10, -1.2346880033823476E+09, -3.4167636285297163E+07, -8.9780907163796335E+04, 0.0000000000000000E+00}; - FLT c2[] = {1.8850321233130712E+05, 3.7693640983013541E+07, 8.9846818051570034E+08, 6.7094088040439653E+09, 1.9743296615199215E+10, 1.8072727219391140E+10, -2.0634615374559410E+10, -4.9654335197177498E+10, -2.0634615374559414E+10, 1.8072727219391048E+10, 1.9743296615199223E+10, 6.7094088040439672E+09, 8.9846818051570022E+08, 3.7693640983013526E+07, 1.8850321233130703E+05, 0.0000000000000000E+00}; - FLT c3[] = {2.3185006533495727E+05, 2.4789475362741601E+07, 3.7751696829092383E+08, 1.7167916788178182E+09, 1.9832401267745295E+09, -3.4881359830884194E+09, -7.8785602379628601E+09, 6.6906528952995499E-05, 7.8785602379629536E+09, 3.4881359830884261E+09, -1.9832401267745163E+09, -1.7167916788178096E+09, -3.7751696829092425E+08, -2.4789475362741597E+07, -2.3185006533495730E+05, 0.0000000000000000E+00}; - FLT c4[] = {1.8672970114818285E+05, 1.0741068109706732E+07, 9.8017949708492473E+07, 2.0291084954252145E+08, -2.7857869294214898E+08, -9.4112677968756318E+08, 1.7886520649334356E+08, 1.4579673547891481E+09, 1.7886520649344125E+08, -9.4112677968753338E+08, -2.7857869294217581E+08, 2.0291084954251301E+08, 9.8017949708492488E+07, 1.0741068109706739E+07, 1.8672970114818282E+05, 0.0000000000000000E+00}; - FLT c5[] = {1.0411891611891470E+05, 3.1771463075269456E+06, 1.4880104152842037E+07, -6.8136965447538150E+06, -8.7072998215422541E+07, 1.8024116530863210E+06, 1.9067730799615666E+08, 1.2078175959365315E-04, -1.9067730799603686E+08, -1.8024116529155241E+06, 8.7072998215445980E+07, 6.8136965447565373E+06, -1.4880104152841812E+07, -3.1771463075269484E+06, -1.0411891611891470E+05, 0.0000000000000000E+00}; - FLT c6[] = {4.1300641422694731E+04, 6.3217168592497683E+05, 7.7343707634845132E+05, -5.4575962381476769E+06, -3.7387211063063843E+06, 1.8451583614082869E+07, 3.0480804948189310E+06, -2.7500445095872246E+07, 3.0480804948457484E+06, 1.8451583614064269E+07, -3.7387211062890980E+06, -5.4575962381450543E+06, 7.7343707634841127E+05, 6.3217168592497602E+05, 4.1300641422694724E+04, 0.0000000000000000E+00}; - FLT c7[] = {1.1710443348523711E+04, 7.5405449195716908E+04, -1.6634736996487752E+05, -5.6069290801842115E+05, 1.1540571563940533E+06, 1.0209821660925965E+06, -2.9641921942009293E+06, -7.3770236318814628E-06, 2.9641921942630685E+06, -1.0209821662946860E+06, -1.1540571563987043E+06, 5.6069290801928868E+05, 1.6634736996459437E+05, -7.5405449195719295E+04, -1.1710443348523739E+04, 0.0000000000000000E+00}; - FLT c8[] = {2.3142324239350210E+03, 2.1710560541703007E+03, -3.6929625713151705E+04, 2.6143898219588682E+04, 1.4046980090353978E+05, -2.1033190114896413E+05, -1.1132269819276403E+05, 3.7491447373940505E+05, -1.1132269820720138E+05, -2.1033190120894444E+05, 1.4046980085134835E+05, 2.6143898217223435E+04, -3.6929625713258414E+04, 2.1710560541651053E+03, 2.3142324239349791E+03, 0.0000000000000000E+00}; - FLT c9[] = {2.8879718294281940E+02, -9.2801372612866078E+02, -1.9817144428357562E+03, 9.9004179214302640E+03, -5.7928268996319048E+03, -2.1083466266548403E+04, 3.3285502001854453E+04, 1.3615676123196788E-04, -3.3285501884684672E+04, 2.1083466388283239E+04, 5.7928269528908959E+03, -9.9004179214302640E+03, 1.9817144428357562E+03, 9.2801372612624596E+02, -2.8879718294281940E+02, 0.0000000000000000E+00}; - FLT c10[] = {1.3121871131759899E+01, -1.5978845118014243E+02, 2.7429718889479011E+02, 4.4598059431432415E+02, -1.8917609556521720E+03, 1.5303002256342920E+03, 1.7542368404254241E+03, -3.9411530187890685E+03, 1.7542368839611659E+03, 1.5303002335812619E+03, -1.8917609760379448E+03, 4.4598059250034765E+02, 2.7429718872202716E+02, -1.5978845118149314E+02, 1.3121871131760223E+01, 0.0000000000000000E+00}; - FLT c11[] = {-2.4286151057622600E+00, -6.7839829150137421E+00, 4.6999223003107119E+01, -7.4896070454665107E+01, -3.2010110856873055E+01, 2.5022929107925501E+02, -2.8786053481345135E+02, 1.4424367379967129E-05, 2.8786057555317575E+02, -2.5022937123192844E+02, 3.2010139421505684E+01, 7.4896073537460509E+01, -4.6999223012862650E+01, 6.7839829186720362E+00, 2.4286151057336860E+00, 0.0000000000000000E+00}; - FLT c12[] = {-5.4810555665671257E-01, 1.1436870859674571E+00, 8.2471504792547190E-01, -8.5602131787584241E+00, 1.5631631237511966E+01, -6.4979395997142886E+00, -1.8737629118679905E+01, 3.3283673647767003E+01, -1.8737705444926284E+01, -6.4980552114725620E+00, 1.5631576798962341E+01, -8.5602158445716778E+00, 8.2471481116140977E-01, 1.1436870769250529E+00, -5.4810555667406624E-01, 0.0000000000000000E+00}; - FLT c13[] = {-1.4554612891837512E-02, 1.7022157398269799E-01, -3.7563892964814216E-01, 2.0131145240492249E-01, 8.3554123561642435E-01, -2.1191317631421946E+00, 1.9961007770939201E+00, 5.0230495487029605E-05, -1.9960655197919825E+00, 2.1191435815870405E+00, -8.3552330614378623E-01, -2.0131363341395125E-01, 3.7563890238546094E-01, -1.7022157734534860E-01, 1.4554612875194470E-02, 0.0000000000000000E+00}; - FLT c14[] = {-1.2348455978815665E-02, 2.6143485494326945E-03, -2.9252290291144727E-02, 7.5392101552106419E-02, -8.7986538697867239E-02, 1.3073120666751545E-03, 1.5251801232957554E-01, -2.3235618419546245E-01, 1.5253703942622115E-01, 1.3217162898956957E-03, -8.7999818995735196E-02, 7.5391507930594778E-02, -2.9252395603998178E-02, 2.6143483927929994E-03, -1.2348455970768767E-02, 0.0000000000000000E+00}; - FLT c15[] = {1.4214685591273772E-02, -1.2364346992375923E-03, 1.2892328724708124E-03, 1.6178725688327468E-03, -8.2104229475896996E-03, 1.3914679473447157E-02, -1.1426959041713501E-02, 1.6590583007947697E-05, 1.1446333966460217E-02, -1.3912124902889801E-02, 8.2298310485774198E-03, -1.6155336438419190E-03, -1.2892162843503102E-03, 1.2364372911314208E-03, -1.4214685607473108E-02, 0.0000000000000000E+00}; - for (int i=0; i<16; i++) ker[i] = c0[i] + z*(c1[i] + z*(c2[i] + z*(c3[i] + z*(c4[i] + z*(c5[i] + z*(c6[i] + z*(c7[i] + z*(c8[i] + z*(c9[i] + z*(c10[i] + z*(c11[i] + z*(c12[i] + z*(c13[i] + z*(c14[i] + z*(c15[i]))))))))))))))); + FLT c0[] = {2.3183302143948740E-08, 1.7202745817468638E-05, 9.2668857465754892E-04, 1.4607490553401940E-02, 1.0130044556641118E-01, 3.7041488405244688E-01, 7.8279781886019206E-01, 1.0000000000000011E+00, 7.8279781886019195E-01, 3.7041488405244721E-01, 1.0130044556641132E-01, 1.4607490553401953E-02, 9.2668857465754838E-04, 1.7202745817468631E-05, 2.3183302143948743E-08, 0.0000000000000000E+00}; + FLT c1[] = {1.1019919454791575E-07, 4.1938159428224133E-05, 1.5154850601194975E-03, 1.6839357628952684E-02, 8.0835952724673241E-02, 1.8739074372244102E-01, 1.9255567517255726E-01, 1.6956773054418529E-31, -1.9255567517255731E-01, -1.8739074372244113E-01, -8.0835952724673366E-02, -1.6839357628952709E-02, -1.5154850601194975E-03, -4.1938159428224133E-05, -1.1019919454791579E-07, 0.0000000000000000E+00}; + FLT c2[] = {2.3137327105312781E-07, 4.6266060425611184E-05, 1.1028009511991968E-03, 8.2352859806754768E-03, 2.4233386066663400E-02, 2.2182889945939446E-02, -2.5327411650384966E-02, -6.0946897479642374E-02, -2.5327411650384900E-02, 2.2182889945939362E-02, 2.4233386066663431E-02, 8.2352859806754889E-03, 1.1028009511991974E-03, 4.6266060425611204E-05, 2.3137327105312789E-07, 0.0000000000000000E+00}; + FLT c3[] = {2.8457821671573232E-07, 3.0427184404092272E-05, 4.6337319534911801E-04, 2.1072304367244893E-03, 2.4342755210407336E-03, -4.2814200474568642E-03, -9.6703299158782570E-03, 1.1713135756253251E-16, 9.6703299158783472E-03, 4.2814200474569067E-03, -2.4342755210407171E-03, -2.1072304367244859E-03, -4.6337319534911801E-04, -3.0427184404092272E-05, -2.8457821671573253E-07, 0.0000000000000000E+00}; + FLT c4[] = {2.2919642176438707E-07, 1.3183839322480003E-05, 1.2030953406839345E-04, 2.4905754342428545E-04, -3.4193403196993528E-04, -1.1551611179404116E-03, 2.1954335627570980E-04, 1.7895433812202518E-03, 2.1954335627569262E-04, -1.1551611179404632E-03, -3.4193403196995035E-04, 2.4905754342428572E-04, 1.2030953406839334E-04, 1.3183839322479994E-05, 2.2919642176438718E-07, 0.0000000000000000E+00}; + FLT c5[] = {1.2779800356186583E-07, 3.8997040140349321E-06, 1.8264189394307380E-05, -8.3632912035133083E-06, -1.0687544349165045E-04, 2.2123224044259885E-06, 2.3404180714519442E-04, -3.1780101629791230E-17, -2.3404180714510888E-04, -2.2123224042859913E-06, 1.0687544349166601E-04, 8.3632912035016430E-06, -1.8264189394307563E-05, -3.8997040140349321E-06, -1.2779800356186591E-07, 0.0000000000000000E+00}; + FLT c6[] = {5.0693377499403671E-08, 7.7594237801399261E-07, 9.4933483676650543E-07, -6.6987818302441095E-06, -4.5889941143310731E-06, 2.2647907184666643E-05, 3.7412856035719476E-06, -3.3754692339531092E-05, 3.7412856035755445E-06, 2.2647907184632474E-05, -4.5889941143094898E-06, -6.6987818302360161E-06, 9.4933483676673021E-07, 7.7594237801399261E-07, 5.0693377499403691E-08, 0.0000000000000000E+00}; + FLT c7[] = {1.4373673262756718E-08, 9.2554419735720107E-08, -2.0417866965620877E-07, -6.8820764686365081E-07, 1.4165168644119495E-06, 1.2531774951342180E-06, -3.6383191328395853E-06, 7.7231484391689009E-17, 3.6383191329101677E-06, -1.2531774953177319E-06, -1.4165168644026078E-06, 6.8820764686022552E-07, 2.0417866965633852E-07, -9.2554419735716864E-08, -1.4373673262756819E-08, 0.0000000000000000E+00}; + FLT c8[] = {2.8405432421064880E-09, 2.6648052024110037E-09, -4.5328290134669312E-08, 3.2089634827933056E-08, 1.7241593347433905E-07, -2.5816631649430664E-07, -1.3664009514955699E-07, 4.6017883229632535E-07, -1.3664009519851534E-07, -2.5816631659222327E-07, 1.7241593343456043E-07, 3.2089634833287873E-08, -4.5328290134639428E-08, 2.6648052024095099E-09, 2.8405432421065231E-09, 0.0000000000000000E+00}; + FLT c9[] = {3.5447644664515603E-10, -1.1390658479631380E-09, -2.4324028601744043E-09, 1.2152005525649129E-08, -7.1102518397187493E-09, -2.5878341881540945E-08, 4.0855407208672653E-08, -5.2935793078520102E-17, -4.0855407200368865E-08, 2.5878341983954342E-08, 7.1102518798537297E-09, -1.2152005534644900E-08, 2.4324028599797840E-09, 1.1390658479621243E-09, -3.5447644664522991E-10, 0.0000000000000000E+00}; + FLT c10[] = {1.6106092880560131E-11, -1.9612809867391534E-10, 3.3667881343327413E-10, 5.4740705721569177E-10, -2.3219918274241966E-09, 1.8783264065861090E-09, 2.1531914801939135E-09, -4.8374639374556914E-09, 2.1531914732804149E-09, 1.8783263688761161E-09, -2.3219918425081937E-09, 5.4740705894406642E-10, 3.3667881359039910E-10, -1.9612809867391534E-10, 1.6106092880566125E-11, 0.0000000000000000E+00}; + FLT c11[] = {-2.9809392328870459E-12, -8.3268200106445154E-12, 5.7687950421418410E-11, -9.1929199328063136E-11, -3.9289939147449750E-11, 3.0713723883726984E-10, -3.5332678542514975E-10, -2.7146437259190364E-19, 3.5332673644762448E-10, -3.0713734467131358E-10, 3.9289960193589238E-11, 9.1929195849949024E-11, -5.7687950527891289E-11, 8.3268200078717850E-12, 2.9809392328263928E-12, 0.0000000000000000E+00}; + FLT c12[] = {-6.7275763610714952E-13, 1.4037883799551298E-12, 1.0122748703359079E-12, -1.0507011558415453E-11, 1.9186622029950655E-11, -7.9757821000147658E-12, -2.2999231890282221E-11, 4.0853143156922655E-11, -2.2999289058288172E-11, -7.9759209366006470E-12, 1.9186575580945818E-11, -1.0507009389093798E-11, 1.0122747666550936E-12, 1.4037883779612681E-12, -6.7275763607599545E-13, 0.0000000000000000E+00}; + for (int i=0; i<16; i++) ker[i] = c0[i] + z*(c1[i] + z*(c2[i] + z*(c3[i] + z*(c4[i] + z*(c5[i] + z*(c6[i] + z*(c7[i] + z*(c8[i] + z*(c9[i] + z*(c10[i] + z*(c11[i] + z*(c12[i])))))))))))); } else if constexpr(w==16) { - FLT c0[] = {2.6374086784014689E+04, 2.5501413681212645E+07, 1.6835469840840099E+09, 3.1953580806547867E+10, 2.6584910126662766E+11, 1.1715858191494619E+12, 3.0181658330343120E+12, 4.7888775408612773E+12, 4.7888775408612764E+12, 3.0181658330343125E+12, 1.1715858191494619E+12, 2.6584910126662772E+11, 3.1953580806547874E+10, 1.6835469840840104E+09, 2.5501413681212656E+07, 2.6374086784014886E+04}; - FLT c1[] = {1.2991568388123445E+05, 6.4986154651133664E+07, 2.9142305012947259E+09, 3.9748054433728149E+10, 2.3649443248440247E+11, 7.0471088240421252E+11, 1.0533888905987031E+12, 5.4832304482297632E+11, -5.4832304482297687E+11, -1.0533888905987034E+12, -7.0471088240421265E+11, -2.3649443248440250E+11, -3.9748054433728149E+10, -2.9142305012947259E+09, -6.4986154651133649E+07, -1.2991568388123448E+05}; - FLT c2[] = {2.8421223836872831E+05, 7.5448503558118582E+07, 2.2710828032883868E+09, 2.1491603403163826E+10, 8.4299374042308136E+10, 1.3384457365769528E+11, 1.8630012765531485E+09, -2.4384536789321179E+11, -2.4384536789321094E+11, 1.8630012765532806E+09, 1.3384457365769531E+11, 8.4299374042308090E+10, 2.1491603403163826E+10, 2.2710828032883863E+09, 7.5448503558118552E+07, 2.8421223836872820E+05}; - FLT c3[] = {3.6653021243297518E+05, 5.2693428548387080E+07, 1.0410094433021281E+09, 6.3986267576853533E+09, 1.3313926739756302E+10, -2.7909761561128025E+09, -3.9911638977027977E+10, -2.9236947704012939E+10, 2.9236947704012939E+10, 3.9911638977028267E+10, 2.7909761561128430E+09, -1.3313926739756279E+10, -6.3986267576853561E+09, -1.0410094433021276E+09, -5.2693428548387088E+07, -3.6653021243297518E+05}; - FLT c4[] = {3.1185660915838118E+05, 2.4564274645530280E+07, 3.0509279143241835E+08, 1.0432225146182569E+09, 6.4966284440222360E+07, -4.2483903608016477E+09, -3.1778261722524829E+09, 5.9880587942832708E+09, 5.9880587942832832E+09, -3.1778261722526174E+09, -4.2483903608017979E+09, 6.4966284440235756E+07, 1.0432225146182607E+09, 3.0509279143241805E+08, 2.4564274645530272E+07, 3.1185660915838124E+05}; - FLT c5[] = {1.8544733523229562E+05, 7.9824949938292839E+06, 5.6880943382648192E+07, 5.4097201999258779E+07, -3.0776449202833223E+08, -3.7659931821867347E+08, 6.8797698944719648E+08, 7.5429896889866996E+08, -7.5429896889781320E+08, -6.8797698944658160E+08, 3.7659931821898031E+08, 3.0776449202837497E+08, -5.4097201999252096E+07, -5.6880943382647842E+07, -7.9824949938292857E+06, -1.8544733523229562E+05}; - FLT c6[] = {7.9472339236673259E+04, 1.8159676553648398E+06, 5.7259818806751696E+06, -1.2786136236423338E+07, -3.8677490873147681E+07, 4.7651450515707508E+07, 9.0723760109202415E+07, -9.4532949239946112E+07, -9.4532949239604995E+07, 9.0723760109522834E+07, 4.7651450515667401E+07, -3.8677490873160362E+07, -1.2786136236416934E+07, 5.7259818806752721E+06, 1.8159676553648538E+06, 7.9472339236673215E+04}; - FLT c7[] = {2.4831718998299857E+04, 2.7536301841716090E+05, -5.1045953356025166E+04, -2.6996387880239477E+06, 1.1656554632125401E+06, 9.1521923449522462E+06, -6.8198180925621921E+06, -1.2555197000954127E+07, 1.2555197001087580E+07, 6.8198180925775450E+06, -9.1521923449367471E+06, -1.1656554632051867E+06, 2.6996387880183556E+06, 5.1045953355832869E+04, -2.7536301841717580E+05, -2.4831718998299897E+04}; - FLT c8[] = {5.6060763597396035E+03, 2.2154740880101843E+04, -1.0243462874810334E+05, -1.1802198892388590E+05, 6.4061699367506150E+05, -1.1166716749369531E+05, -1.4153578101923370E+06, 1.0790712965214122E+06, 1.0790712965802078E+06, -1.4153578102569627E+06, -1.1166716767280686E+05, 6.4061699367841065E+05, -1.1802198892652121E+05, -1.0243462874831920E+05, 2.2154740880096295E+04, 5.6060763597396262E+03}; - FLT c9[] = {8.7271993222049730E+02, -7.0074676859193858E+02, -1.2528372958474913E+04, 2.3643101054370443E+04, 3.1699060146436736E+04, -1.1270133578294520E+05, 3.6872846840416030E+04, 1.5168911768972370E+05, -1.5168911672801850E+05, -3.6872846329129716E+04, 1.1270133600206790E+05, -3.1699060140349993E+04, -2.3643101053229180E+04, 1.2528372958403583E+04, 7.0074676858840917E+02, -8.7271993222049730E+02}; - FLT c10[] = {7.8842259458727298E+01, -4.2070880913717718E+02, -1.0535142166729695E+02, 3.3375056757602101E+03, -4.9426353709826744E+03, -3.6567309465694352E+03, 1.5199085032737788E+04, -9.4972226150681072E+03, -9.4972224492176338E+03, 1.5199085307902486E+04, -3.6567309714471071E+03, -4.9426353751288962E+03, 3.3375056795609726E+03, -1.0535142205602271E+02, -4.2070880913447866E+02, 7.8842259458701932E+01}; - FLT c11[] = {8.9833076760252317E-02, -4.4163371177310189E+01, 1.2880771175011134E+02, 2.8722208980881483E+00, -5.7164632401064989E+02, 9.0417621054583299E+02, 1.1221311957018894E+00, -1.4190922684153286E+03, 1.4190926436578332E+03, -1.1219382673482139E+00, -9.0417616902565715E+02, 5.7164633587355513E+02, -2.8722219907225899E+00, -1.2880771149646372E+02, 4.4163371174871045E+01, -8.9833076793553943E-02}; - FLT c12[] = {-1.0900468357304585E+00, -1.1264666580175993E-01, 1.1810668498718398E+01, -3.0289105594116332E+01, 1.5494599855921946E+01, 6.0130016326899806E+01, -1.2330195579557967E+02, 6.7114292010484860E+01, 6.7114238133033894E+01, -1.2330200967294053E+02, 6.0129899592769000E+01, 1.5494588631452897E+01, -3.0289108821162568E+01, 1.1810668060273379E+01, -1.1264668224327026E-01, -1.0900468357482698E+00}; - FLT c13[] = {-1.1763610124684608E-01, 4.2939195551308978E-01, -2.7950231695310290E-01, -1.7354597875532083E+00, 5.1181749794184972E+00, -5.0538409872852545E+00, -2.1268758321444312E+00, 1.0709572497394593E+01, -1.0709247944735344E+01, 2.1270284132327628E+00, 5.0538814533614023E+00, -5.1181783143082038E+00, 1.7354587260576941E+00, 2.7950208340719496E-01, -4.2939195720020440E-01, 1.1763610121354666E-01}; - FLT c14[] = {-1.8020499708490779E-02, 3.6694576081450124E-02, -1.1331174689418615E-01, 1.3970801507325420E-01, 8.1708800731612838E-02, -5.4465632012605969E-01, 7.9628723318194716E-01, -3.9045387765910361E-01, -3.9034731591396871E-01, 7.9641679205120786E-01, -5.4465236519348836E-01, 8.1709687544577886E-02, 1.3970913694934384E-01, -1.1331198385459386E-01, 3.6694575058947500E-02, -1.8020499699434717E-02}; - FLT c15[] = {1.4589783457723899E-02, -7.8885273589694921E-04, -4.4854775481901451E-03, 1.8117810622567232E-02, -3.0563678378015532E-02, 1.9027105036022670E-02, 2.4778670881552757E-02, -6.7767913155521747E-02, 6.7979444868167399E-02, -2.4638534439549119E-02, -1.8992900331546877E-02, 3.0569915511324409E-02, -1.8117279802711158E-02, 4.4857097818771776E-03, 7.8885377265448060E-04, -1.4589783469873403E-02}; - FLT c16[] = {-1.0467998068898355E-02, -3.2140568385029999E-04, 5.2979866592800886E-04, -1.5800624712947203E-04, -1.4200041949817279E-03, 3.7626007108648857E-03, -3.8348321381240775E-03, 1.6547563335740942E-03, 1.5759584129276946E-03, -3.8873640852216617E-03, 3.7166352571544989E-03, -1.4265706883689335E-03, -1.5923746463956793E-04, 5.2952292450647511E-04, -3.2141610431099765E-04, -1.0467998084554094E-02}; - for (int i=0; i<16; i++) ker[i] = c0[i] + z*(c1[i] + z*(c2[i] + z*(c3[i] + z*(c4[i] + z*(c5[i] + z*(c6[i] + z*(c7[i] + z*(c8[i] + z*(c9[i] + z*(c10[i] + z*(c11[i] + z*(c12[i] + z*(c13[i] + z*(c14[i] + z*(c15[i] + z*(c16[i])))))))))))))))); + FLT c0[] = {5.2012152104083984E-09, 5.0291159580938677E-06, 3.3201112337137920E-04, 6.3015433246683353E-03, 5.2427915343763412E-02, 2.3104762006593377E-01, 5.9521037322997217E-01, 9.4441119081353875E-01, 9.4441119081353875E-01, 5.9521037322997217E-01, 2.3104762006593377E-01, 5.2427915343763412E-02, 6.3015433246683353E-03, 3.3201112337137920E-04, 5.0291159580938694E-06, 5.2012152104083868E-09}; + FLT c1[] = {2.5620581163903708E-08, 1.2815874111792787E-05, 5.7471335914300670E-04, 7.8386860177525539E-03, 4.6638901641906962E-02, 1.3897554029141571E-01, 2.0773808644544137E-01, 1.0813440420918320E-01, -1.0813440420918335E-01, -2.0773808644544145E-01, -1.3897554029141571E-01, -4.6638901641906975E-02, -7.8386860177525539E-03, -5.7471335914300648E-04, -1.2815874111792787E-05, -2.5620581163903721E-08}; + FLT c2[] = {5.6049296769722387E-08, 1.4879146623074258E-05, 4.4787865139353365E-04, 4.2383440773521696E-03, 1.6624620601556193E-02, 2.6395394769117640E-02, 3.6740117889106082E-04, -4.8088574473126630E-02, -4.8088574473126713E-02, 3.6740117889113471E-04, 2.6395394769117678E-02, 1.6624620601556193E-02, 4.2383440773521722E-03, 4.4787865139353359E-04, 1.4879146623074262E-05, 5.6049296769722367E-08}; + FLT c3[] = {7.2283166867263303E-08, 1.0391634193778160E-05, 2.0529674430143854E-04, 1.2618687081127932E-03, 2.6256301814801060E-03, -5.5040645592551222E-04, -7.8709464111364341E-03, -5.7657980103486698E-03, 5.7657980103487626E-03, 7.8709464111365313E-03, 5.5040645592551373E-04, -2.6256301814801060E-03, -1.2618687081127928E-03, -2.0529674430143856E-04, -1.0391634193778164E-05, -7.2283166867263303E-08}; + FLT c4[] = {6.1501023800531295E-08, 4.8443034242391141E-06, 6.0167136036954503E-05, 2.0573318254802077E-04, 1.2811955521419976E-05, -8.3782209201438288E-04, -6.2669687707128208E-04, 1.1809008871738671E-03, 1.1809008871739529E-03, -6.2669687707129921E-04, -8.3782209201441725E-04, 1.2811955521421050E-05, 2.0573318254802050E-04, 6.0167136036954456E-05, 4.8443034242391132E-06, 6.1501023800531308E-08}; + FLT c5[] = {3.6571939291734580E-08, 1.5742222553115409E-06, 1.1217451065775842E-05, 1.0668471374318627E-05, -6.0694020243069901E-05, -7.4268888177613095E-05, 1.3567546096380107E-04, 1.4875477215032178E-04, -1.4875477215047734E-04, -1.3567546096381663E-04, 7.4268888177613095E-05, 6.0694020243062122E-05, -1.0668471374319355E-05, -1.1217451065775811E-05, -1.5742222553115415E-06, -3.6571939291734593E-08}; + FLT c6[] = {1.5672684443241270E-08, 3.5812571134853209E-07, 1.1292168823202786E-06, -2.5215449854178345E-06, -7.6275609266392180E-06, 9.3973092319735694E-06, 1.7891569285079721E-05, -1.8642776809377737E-05, -1.8642776809426295E-05, 1.7891569285078386E-05, 9.3973092319897562E-06, -7.6275609266437149E-06, -2.5215449854180594E-06, 1.1292168823201941E-06, 3.5812571134853119E-07, 1.5672684443241263E-08}; + FLT c7[] = {4.8970459380161164E-09, 5.4304148291616929E-08, -1.0066736763230802E-08, -5.3239387743771126E-07, 2.2987809872367560E-07, 1.8048974519479544E-06, -1.3449315565629853E-06, -2.4760016204856650E-06, 2.4760016205163890E-06, 1.3449315566227727E-06, -1.8048974519269872E-06, -2.2987809871931610E-07, 5.3239387743823018E-07, 1.0066736763256750E-08, -5.4304148291616929E-08, -4.8970459380161164E-09}; + FLT c8[] = {1.1055703983904745E-09, 4.3691209554203762E-09, -2.0201061499410946E-08, -2.3275033897663606E-08, 1.2633562931562412E-07, -2.2021804055570054E-08, -2.7912172398560873E-07, 2.1280289566371563E-07, 2.1280289566371563E-07, -2.7912172399172855E-07, -2.2021804070869530E-08, 1.2633562931791905E-07, -2.3275033897807039E-08, -2.0201061499398992E-08, 4.3691209554207493E-09, 1.1055703983904803E-09}; + FLT c9[] = {1.7210848751139206E-10, -1.3819378018485677E-10, -2.4707116695746685E-09, 4.6626394244300632E-09, 6.2513494738369478E-09, -2.2225751670676472E-08, 7.2716681748129466E-09, 2.9914504847745951E-08, -2.9914504925247984E-08, -7.2716681969563846E-09, 2.2225751655452858E-08, -6.2513494779888428E-09, -4.6626394252950410E-09, 2.4707116695043892E-09, 1.3819378018409654E-10, -1.7210848751141845E-10}; + FLT c10[] = {1.5548426850867747E-11, -8.2967690041035768E-11, -2.0776280275005410E-11, 6.5818716252940090E-10, -9.7473366764093964E-10, -7.2114134421445299E-10, 2.9974008586911667E-09, -1.8729407766830212E-09, -1.8729408099935145E-09, 2.9974008676571101E-09, -7.2114133321570515E-10, -9.7473366606969001E-10, 6.5818716284365085E-10, -2.0776280294646031E-11, -8.2967690039501348E-11, 1.5548426850871941E-11}; + FLT c11[] = {1.7715918240672815E-14, -8.7094275514577869E-12, 2.5402078534858863E-11, 5.6643120203537577E-13, -1.1273397749808333E-10, 1.7831198930961025E-10, 2.2123190757406476E-13, -2.7985827080469500E-10, 2.7985821912985675E-10, -2.2124766556045869E-13, -1.7831199578671051E-10, 1.1273397565255340E-10, -5.6643233774610691E-13, -2.5402078583658933E-11, 8.7094275509032414E-12, -1.7715918237423519E-14}; + FLT c12[] = {-2.1496737417083317E-13, -2.2214974042200800E-14, 2.3291735717266144E-12, -5.9732917765233235E-12, 3.0556712628179253E-12, 1.1858122635605482E-11, -2.4316415414833160E-11, 1.3235499986994189E-11, 1.3235536737855158E-11, -2.4316433790263641E-11, 1.1858112427032992E-11, 3.0556697315320517E-12, -5.9732921593447914E-12, 2.3291735677388905E-12, -2.2214973792968073E-14, -2.1496737416207108E-13}; + FLT c13[] = {-2.3198933270740715E-14, 8.4680084926105710E-14, -5.5120394376955525E-14, -3.4224825412770884E-13, 1.0093451766215381E-12, -9.9669407015123244E-13, -4.1950464449360547E-13, 2.1120456723238401E-12, -2.1120631281451168E-12, 4.1949988381507543E-13, 9.9669407015123244E-13, -1.0093463667911707E-12, 3.4224835330851150E-13, 5.5120381979355185E-14, -8.4680084587108829E-14, 2.3198933258633685E-14}; + for (int i=0; i<16; i++) ker[i] = c0[i] + z*(c1[i] + z*(c2[i] + z*(c3[i] + z*(c4[i] + z*(c5[i] + z*(c6[i] + z*(c7[i] + z*(c8[i] + z*(c9[i] + z*(c10[i] + z*(c11[i] + z*(c12[i] + z*(c13[i]))))))))))))); } else printf("width not implemented!\n"); diff --git a/src/ker_lowupsampfac_horner_allw_loop_constexpr.h b/src/ker_lowupsampfac_horner_allw_loop_constexpr.h new file mode 100644 index 000000000..6298d4665 --- /dev/null +++ b/src/ker_lowupsampfac_horner_allw_loop_constexpr.h @@ -0,0 +1,576 @@ +// Header of static arrays of monomial coeffs of spreading kernel function in each +// fine-grid interval. Generated by gen_all_horner_cpp_header.m in devel/ +// Authors: Alex Barnett, Ludvig af Klinteberg, Marco Barbone & Libin Lu. +// (C) 2018--2024 The Simons Foundation, Inc. +#include + +template constexpr auto get_horner_coeffs_125() noexcept { + if constexpr (w == 2) { + return std::array, 4>{{ + {-1.9075708590566734E-01, 1.9075708590566728E-01}, + {-9.0411309581634888E-02, -9.0411309581634625E-02}, + {6.4742429432896442E-01, -6.4742429432896453E-01}, + {6.1209111871385724E-01, 6.1209111871385691E-01}, + }}; + } else if constexpr (w == 3) { + return std::array, 5>{{ + {-2.9270010751775016E-02, 3.7966707032750742E-02, -2.9270010728701203E-02}, + {-4.4469294619149641E-02, -3.1573886092308317E-18, 4.4469294640111512E-02}, + {1.4864411342268646E-01, -3.0473448739822762E-01, 1.4864411344492173E-01}, + {4.0470611346184532E-01, -4.2425842671824539E-17, -4.0470611343822149E-01}, + {2.4728112933307078E-01, 1.0000000000000044E+00, 2.4728112935494950E-01}, + }}; + } else if constexpr (w == 4) { + return std::array, 6>{{ + {-3.0464394190490465E-03, 5.3247889205097444E-03, -5.3247889205097912E-03, + 3.0464394190490543E-03}, + {-1.0401300825285587E-02, 6.3725646657140341E-03, 6.3725646657139994E-03, + -1.0401300825285620E-02}, + {1.5677587697716076E-02, -6.7022293289915644E-02, 6.7022293289915699E-02, + -1.5677587697716051E-02}, + {1.1425598262146333E-01, -1.1126112046907125E-01, -1.1126112046907125E-01, + 1.1425598262146337E-01}, + {1.7431588385887239E-01, 3.7425489538028406E-01, -3.7425489538028428E-01, + -1.7431588385887237E-01}, + {8.4048892491849825E-02, 7.9275732207620908E-01, 7.9275732207620886E-01, + 8.4048892491849783E-02}, + }}; + } else if constexpr (w == 5) { + return std::array, 6>{{ + {-1.5212353034889752E-03, 1.7151925122365424E-03, 8.6737859434123232E-18, + -1.7151925122365892E-03, 1.5212353034889810E-03}, + {-2.3306908700109395E-05, -8.3858973028988343E-03, 1.4886952481383780E-02, + -8.3858973028988516E-03, -2.3306908700108859E-05}, + {1.8780973157032109E-02, -3.8322611720715674E-02, 2.0186098450281545E-17, + 3.8322611720715723E-02, -1.8780973157032105E-02}, + {5.4855980576944546E-02, 3.7709308632020662E-02, -1.8284069243892614E-01, + 3.7709308632020801E-02, 5.4855980576944560E-02}, + {6.2936773057387069E-02, 3.7198919402374026E-01, -8.4851685343650335E-17, + -3.7198919402374014E-01, -6.2936773057387083E-02}, + {2.5811126752233304E-02, 4.6616226852477355E-01, 1.0000000000000004E+00, + 4.6616226852477299E-01, 2.5811126752233314E-02}, + }}; + } else if constexpr (w == 6) { + return std::array, 7>{{ + {-1.6161497824910401E-04, 2.5924418389359724E-04, -1.3917099193206471E-04, + -1.3917099193200356E-04, 2.5924418389357561E-04, -1.6161497812640463E-04}, + {-2.6471424081647520E-04, -5.6150758897068509E-04, 2.0099203466670676E-03, + -2.0099203466671066E-03, 5.6150758897069290E-04, 2.6471424094083525E-04}, + {1.9378826192716983E-03, -6.8365127179467666E-03, 4.7406536657959653E-03, + 4.7406536657959306E-03, -6.8365127179467709E-03, 1.9378826194070362E-03}, + {1.0463664645794023E-02, -5.8671703446042042E-03, -3.4019677093840475E-02, + 3.4019677093840461E-02, 5.8671703446041964E-03, -1.0463664645671077E-02}, + {2.1435449512033442E-02, 7.4190333865239919E-02, -9.5369600014193201E-02, + -9.5369600014193159E-02, 7.4190333865239960E-02, 2.1435449512163873E-02}, + {2.0397684222696253E-02, 2.4277466601214734E-01, 2.6509440217151270E-01, + -2.6509440217151259E-01, -2.4277466601214734E-01, -2.0397684222557694E-02}, + {7.3992041846532757E-03, 2.2998056434514016E-01, 8.5775196559356104E-01, + 8.5775196559356104E-01, 2.2998056434514022E-01, 7.3992041847816149E-03}, + }}; + } else if constexpr (w == 7) { + return std::array, 8>{{ + {-1.2555096177147631E-05, 2.7293834771950587E-05, -2.6660039700443368E-05, + -1.5789308062419179E-17, 2.6660039700526404E-05, -2.7293834771958475E-05, + 1.2555096209062448E-05}, + {-4.7399003259806255E-05, 2.0950491942900027E-06, 1.7484854214666628E-04, + -2.9104069274775099E-04, 1.7484854214662188E-04, 2.0950491942971965E-06, + -4.7399003227280481E-05}, + {1.1260116639581571E-04, -7.8814564904711420E-04, 1.1036556706848707E-03, + -1.7239739988593079E-17, -1.1036556706849018E-03, 7.8814564904712190E-04, + -1.1260116636284838E-04}, + {1.3572774007773840E-03, -2.3954706749181320E-03, -2.9058644824981553E-03, + 7.8619155407045668E-03, -2.9058644824981211E-03, -2.3954706749181446E-03, + 1.3572774008132624E-03}, + {4.4924606632387679E-03, 7.2245566707420791E-03, -2.7743312484355673E-02, + -5.9183130302535822E-17, 2.7743312484355704E-02, -7.2245566707420964E-03, + -4.4924606632061829E-03}, + {7.4065234100227726E-03, 5.7825030729344355E-02, 1.0889852837591876E-04, + -1.3060049459923273E-01, 1.0889852837587447E-04, 5.7825030729344383E-02, + 7.4065234100573743E-03}, + {6.1353661835569220E-03, 1.2822551681002711E-01, 3.1973557271594355E-01, + -6.3638764007737718E-17, -3.1973557271594361E-01, -1.2822551681002708E-01, + -6.1353661835202144E-03}, + {2.0163149398992283E-03, 1.0071602557045134E-01, 5.8653557849806126E-01, + 1.0000000000000004E+00, 5.8653557849806159E-01, 1.0071602557045131E-01, + 2.0163149399332566E-03}, + }}; + } else if constexpr (w == 8) { + return std::array, 8>{{ + {-5.1256159860521059E-06, 5.3292178505827560E-06, 8.7427989025241135E-06, + -2.8404799465034010E-05, 2.8404799465103762E-05, -8.7427989025340797E-06, + -5.3292178505848321E-06, 5.1256159860515867E-06}, + {-6.5665874015875498E-07, -6.1884865695206945E-05, 1.4476791315359098E-04, + -8.6782118193358648E-05, -8.6782118193387420E-05, 1.4476791315357120E-04, + -6.1884865695208748E-05, -6.5665874015841775E-07}, + {1.2504911757628661E-04, -3.9351755557265425E-04, 2.3739384784470553E-05, + 9.6592347103021444E-04, -9.6592347103024556E-04, -2.3739384784447222E-05, + 3.9351755557266206E-04, -1.2504911757628680E-04}, + {6.5470478006265378E-04, 5.7029826102786423E-05, -4.0842122325117809E-03, + 3.3746160664395804E-03, 3.3746160664395288E-03, -4.0842122325117896E-03, + 5.7029826102776760E-05, 6.5470478006265378E-04}, + {1.6676293877589655E-03, 8.1606118103203715E-03, -1.0603838868224464E-02, + -2.0559571166483818E-02, 2.0559571166483891E-02, 1.0603838868224413E-02, + -8.1606118103203749E-03, -1.6676293877589668E-03}, + {2.3525728171808302E-03, 3.3585505340219680E-02, 4.4733940386002188E-02, + -8.0668262921248610E-02, -8.0668262921248568E-02, 4.4733940386002209E-02, + 3.3585505340219701E-02, 2.3525728171808302E-03}, + {1.7458301875074103E-03, 5.9145446836664561E-02, 2.5435204236257858E-01, + 2.0538938722823227E-01, -2.0538938722823244E-01, -2.5435204236257863E-01, + -5.9145446836664561E-02, -1.7458301875074092E-03}, + {5.2827275612461451E-04, 4.0402734444109238E-02, 3.4389230803369708E-01, + 8.9161099745784866E-01, 8.9161099745784866E-01, 3.4389230803369697E-01, + 4.0402734444109224E-02, 5.2827275612461430E-04}, + }}; + } else if constexpr (w == 9) { + return std::array, 9>{{ + {-4.1446092652960729E-07, 7.2790527337694249E-07, -2.5130319770320465E-08, + -1.9002349620399918E-06, 3.0493470976490761E-06, -1.9002349619053566E-06, + -2.5130319758080882E-08, 7.2790527337216141E-07, -4.1446092652953556E-07}, + {-9.3772917893937511E-07, -3.0575635011733582E-06, 1.2977675432522508E-05, + -1.5241881422240646E-05, 9.0538532849680740E-18, 1.5241881422370184E-05, + -1.2977675432515243E-05, 3.0575635011791710E-06, 9.3772917893919352E-07}, + {7.9668965137352613E-06, -4.2137454928179153E-05, 3.9856859670067282E-05, + 6.5639620808994340E-05, -1.4477186949848808E-04, 6.5639620808769517E-05, + 3.9856859670051101E-05, -4.2137454928182751E-05, 7.9668965137352613E-06}, + {7.0565721004957926E-05, -9.0876125855048783E-05, -3.5965836571495268E-04, + 7.0575785995722685E-04, 1.3852933204327093E-17, -7.0575785995747578E-04, + 3.5965836571492157E-04, 9.0876125855048783E-05, -7.0565721004957953E-05}, + {2.6358216867957524E-04, 7.0803132065997234E-04, -2.3883045659485323E-03, + -1.0047843626592211E-03, 4.8455486978740345E-03, -1.0047843626590149E-03, + -2.3883045659485410E-03, 7.0803132065997180E-04, 2.6358216867957530E-04}, + {5.6197289626769558E-04, 5.4583505067802903E-03, 8.8722695781043813E-04, + -2.0386313118366247E-02, -2.5586386887323148E-17, 2.0386313118366479E-02, + -8.8722695781043510E-04, -5.4583505067803007E-03, -5.6197289626769590E-04}, + {7.0217948741779833E-04, 1.6533012331430411E-02, 4.8637875368588449E-02, + -1.5084170630532941E-02, -1.0157816246607008E-01, -1.5084170630533198E-02, + 4.8637875368588469E-02, 1.6533012331430449E-02, 7.0217948741779833E-04}, + {4.7572953640583418E-04, 2.4761567630011038E-02, 1.6332247709293546E-01, + 2.7616213278983209E-01, -6.3638764007737718E-17, -2.7616213278983237E-01, + -1.6332247709293557E-01, -2.4761567630011107E-02, -4.7572953640583407E-04}, + {1.3409415535124442E-04, 1.5141199617983766E-02, 1.8004032483820079E-01, + 6.6268423293859668E-01, 1.0000000000000004E+00, 6.6268423293859735E-01, + 1.8004032483820079E-01, 1.5141199617983816E-02, 1.3409415535124450E-04}, + }}; + } else if constexpr (w == 10) { + return std::array, 10>{{ + {-2.5033479260931243E-08, 6.3042298325822974E-08, -5.2303271559903752E-08, + -7.6226091793981470E-08, 2.3316553106919865E-07, -2.3316553114670068E-07, + 7.6226091852107994E-08, 5.2303271559903752E-08, -6.3042298325822974E-08, + 2.5033479260954218E-08}, + {-1.2089379439830882E-07, -3.4743143854854381E-08, 8.2889801007304441E-07, + -1.5830293785166221E-06, 8.7461219396318958E-07, 8.7461219390199166E-07, + -1.5830293786451377E-06, 8.2889801007763427E-07, -3.4743143856671194E-08, + -1.2089379439833272E-07}, + {2.7742147829396434E-07, -3.2550081973300800E-06, 5.9212960378052008E-06, + 8.5495977199931152E-07, -1.3248468528067400E-05, 1.3248468528201922E-05, + -8.5495977192042543E-07, -5.9212960378031248E-06, 3.2550081973319486E-06, + -2.7742147829393835E-07}, + {5.7780052154064923E-06, -1.5636835808662441E-05, -1.6121807313048698E-05, + 8.1230533420432682E-05, -5.5456530742837516E-05, -5.5456530742837516E-05, + 8.1230533420447061E-05, -1.6121807313052293E-05, -1.5636835808664237E-05, + 5.7780052154064500E-06}, + {3.1258610702677757E-05, 2.8169545035124896E-05, -2.9881406711975588E-04, + 1.5956798534240196E-04, 5.3653099874330845E-04, -5.3653099874345622E-04, + -1.5956798534228530E-04, 2.9881406711975979E-04, -2.8169545035121007E-05, + -3.1258610702677757E-05}, + {9.4710355505531879E-05, 6.0621452710061727E-04, -7.0118560592789044E-04, + -2.4750745659638880E-03, 2.4757076628502080E-03, 2.4757076628501222E-03, + -2.4750745659639995E-03, -7.0118560592789261E-04, 6.0621452710061011E-04, + 9.4710355505531744E-05}, + {1.7649923565147223E-04, 2.9221990881931068E-03, 4.9086823797164910E-03, + -1.0940556313145935E-02, -1.3762152424114771E-02, 1.3762152424114837E-02, + 1.0940556313145999E-02, -4.9086823797165006E-03, -2.9221990881930985E-03, + -1.7649923565147191E-04}, + {1.9968216068682140E-04, 7.2783782301876591E-03, 3.5949398124193947E-02, + 2.5847993600195466E-02, -6.9275634160640545E-02, -6.9275634160640365E-02, + 2.5847993600195553E-02, 3.5949398124193933E-02, 7.2783782301876418E-03, + 1.9968216068682094E-04}, + {1.2517797191066984E-04, 9.6269418565961429E-03, 9.1130577457178424E-02, + 2.4769645835465365E-01, 1.6766875916810517E-01, -1.6766875916810545E-01, + -2.4769645835465348E-01, -9.1130577457178438E-02, -9.6269418565961117E-03, + -1.2517797191066959E-04}, + {3.3157481538170295E-05, 5.3715860775974443E-03, 8.6328042282845754E-02, + 4.3077092326437988E-01, 9.1242439930731112E-01, 9.1242439930731112E-01, + 4.3077092326437960E-01, 8.6328042282845754E-02, 5.3715860775974201E-03, + 3.3157481538170274E-05}, + }}; + } else if constexpr (w == 11) { + return std::array, 10>{{ + {-9.8984999695150684E-09, 1.0194946774237274E-08, 3.5279000674744131E-08, + -1.1638771467098967E-07, 1.2326133614997474E-07, 4.0516498100293627E-17, + -1.2326133616658230E-07, 1.1638771461009523E-07, -3.5279000675436117E-08, + -1.0194946774540017E-08, 9.8984999695035805E-09}, + {-7.7890073973121893E-09, -1.8340559948721496E-07, 5.4451797328899156E-07, + -3.5830285714158528E-07, -7.3873233539148814E-07, 1.4648976903565062E-06, + -7.3873233539148814E-07, -3.5830285714158528E-07, 5.4451797329166893E-07, + -1.8340559948707155E-07, -7.7890073973062137E-09}, + {3.5729663467784788E-07, -1.6085054296210825E-06, 4.5672370507419953E-07, + 6.0608527683396937E-06, -9.0233724844419958E-06, 4.9941702496811109E-18, + 9.0233724844635849E-06, -6.0608527683001474E-06, -4.5672370507336912E-07, + 1.6085054296209787E-06, -3.5729663467787059E-07}, + {2.8888404081262420E-06, -1.8976367884802011E-06, -2.4767547607262255E-05, + 3.8337725458138998E-05, 2.6462355617083014E-05, -8.2113719362889533E-05, + 2.6462355617074022E-05, 3.8337725458128211E-05, -2.4767547607268550E-05, + -1.8976367884808755E-06, 2.8888404081262352E-06}, + {1.2057435171015772E-05, 4.6687328398363199E-05, -1.3963494372748247E-04, + -1.4877651674415632E-04, 4.6954815721688515E-04, -8.0112266480761140E-18, + -4.6954815721699401E-04, 1.4877651674410965E-04, 1.3963494372748247E-04, + -4.6687328398363565E-05, -1.2057435171015740E-05}, + {3.1396100602888598E-05, 3.6443237253636128E-04, 1.5906780001786376E-04, + -1.9495384184342525E-03, -2.4621376046556591E-04, 3.2818730060400242E-03, + -2.4621376046549717E-04, -1.9495384184342957E-03, 1.5906780001786054E-04, + 3.6443237253636090E-04, 3.1396100602888476E-05}, + {5.2504054888010103E-05, 1.3660648269306120E-03, 4.7357572177382573E-03, + -2.2373255422689078E-03, -1.5459233729560838E-02, 8.2777271348319417E-17, + 1.5459233729560940E-02, 2.2373255422689585E-03, -4.7357572177382573E-03, + -1.3660648269306120E-03, -5.2504054888009899E-05}, + {5.4612928019025150E-05, 2.9497743530118282E-03, 2.1858479505161198E-02, + 3.8333708936616487E-02, -2.1641923687039311E-02, -8.3109405654057139E-02, + -2.1641923687039148E-02, 3.8333708936616549E-02, 2.1858479505161187E-02, + 2.9497743530118282E-03, 5.4612928019024878E-05}, + {3.1996260415636094E-05, 3.5282769389657653E-03, 4.5889527487056471E-02, + 1.8012194355267486E-01, 2.4178022040260394E-01, -1.4849044935138820E-16, + -2.4178022040260408E-01, -1.8012194355267491E-01, -4.5889527487056485E-02, + -3.5282769389657670E-03, -3.1996260415635877E-05}, + {8.0191950887587672E-06, 1.8211144887695901E-03, 3.8565497751765716E-02, + 2.5236459439543668E-01, 7.1517256669690443E-01, 1.0000000000000000E+00, + 7.1517256669690399E-01, 2.5236459439543651E-01, 3.8565497751765709E-02, + 1.8211144887695910E-03, 8.0191950887586656E-06}, + }}; + } else if constexpr (w == 12) { + return std::array, 11>{{ + {-6.3791929313927889E-10, 1.2240176129392066E-09, 5.3586929655729871E-10, + -6.2807356207213370E-09, 1.0600657345063913E-08, -5.5585209137321311E-09, + -5.5585209024191334E-09, 1.0600657351506037E-08, -6.2807355779833450E-09, + 5.3586929058654981E-10, 1.2240176130570502E-09, -6.3791928984364409E-10}, + {-2.0816585198663231E-09, -6.8192670392721950E-09, 3.6338774646281261E-08, + -4.9464521005206807E-08, -1.3242031043825771E-08, 1.0671664853011416E-07, + -1.0671664860484826E-07, 1.3242031029986123E-08, 4.9464520965071825E-08, + -3.6338774641091391E-08, 6.8192670390235131E-09, 2.0816585232936298E-09}, + {1.5395324498811026E-08, -1.2022118042098672E-07, 1.5464523856461759E-07, + 2.7605497715117822E-07, -8.4964626030792186E-07, 5.2067203455623376E-07, + 5.2067203460519205E-07, -8.4964626028956253E-07, 2.7605497715882793E-07, + 1.5464523855945402E-07, -1.2022118042095684E-07, 1.5395324502815186E-08}, + {2.1206307767330490E-07, -4.5869687934425177E-07, -1.3462277877572238E-06, + 4.2970047520095079E-06, -1.1214870287414941E-06, -6.9831974682611276E-06, + 6.9831974682960042E-06, 1.1214870288062637E-06, -4.2970047519858427E-06, + 1.3462277877584693E-06, 4.5869687934430365E-07, -2.1206307766916437E-07}, + {1.2088615636792283E-06, 2.2204932634070340E-06, -1.5559909809164321E-05, + 1.8771595438438357E-06, 4.7304527720930092E-05, -3.7055029721542363E-05, + -3.7055029721474024E-05, 4.7304527720924698E-05, 1.8771595438150590E-06, + -1.5559909809162522E-05, 2.2204932634069218E-06, 1.2088615636834516E-06}, + {4.2345162286123920E-06, 3.3664241555334188E-05, -3.0535096226552359E-05, + -1.9795772057291372E-04, 1.7526295499601351E-04, 3.2830037656729569E-04, + -3.2830037656741235E-04, -1.7526295499597461E-04, 1.9795772057291762E-04, + 3.0535096226554304E-05, -3.3664241555334127E-05, -4.2345162286081289E-06}, + {9.7900673700200710E-06, 1.8351475200221906E-04, 3.8725987583789449E-04, + -9.2229408802589803E-04, -1.5383560041741977E-03, 1.8800996948122673E-03, + 1.8800996948122159E-03, -1.5383560041741806E-03, -9.2229408802591950E-04, + 3.8725987583788858E-04, 1.8351475200221892E-04, 9.7900673700247601E-06}, + {1.4953735432776068E-05, 5.8049865432805055E-04, 3.2684769908807644E-03, + 2.3619245295514002E-03, -1.0074268581043128E-02, -9.8551520939613012E-03, + 9.8551520939613984E-03, 1.0074268581043190E-02, -2.3619245295513390E-03, + -3.2684769908807631E-03, -5.8049865432805055E-04, -1.4953735432771904E-05}, + {1.4462226804444718E-05, 1.1205076408888253E-03, 1.1698445222077601E-02, + 3.3958877046121605E-02, 1.3705098421608818E-02, -6.0497400607811502E-02, + -6.0497400607811364E-02, 1.3705098421608861E-02, 3.3958877046121584E-02, + 1.1698445222077629E-02, 1.1205076408888253E-03, 1.4462226804449268E-05}, + {7.9801239249145906E-06, 1.2318344820958854E-03, 2.1335987794357202E-02, + 1.1394981969310450E-01, 2.3520579283187470E-01, 1.4166451219687684E-01, + -1.4166451219687690E-01, -2.3520579283187470E-01, -1.1394981969310465E-01, + -2.1335987794357230E-02, -1.2318344820958849E-03, -7.9801239249098591E-06}, + {1.9028495068410013E-06, 5.9416527261081902E-04, 1.6248140264385584E-02, + 1.3597036436097915E-01, 4.9821957378204829E-01, 9.2652305802242962E-01, + 9.2652305802242918E-01, 4.9821957378204829E-01, 1.3597036436097931E-01, + 1.6248140264385619E-02, 5.9416527261081913E-04, 1.9028495068454209E-06}, + }}; + } else if constexpr (w == 13) { + return std::array, 12>{{ + {-2.9813639428880222E-11, 8.8416967203798553E-11, -6.1944900049416202E-11, + -2.3424446304741974E-10, 6.6123634170186695E-10, -6.5395826611340155E-10, + -4.1544196918380560E-17, 6.5395798843212787E-10, -6.6123634887104090E-10, + 2.3424448292235756E-10, 6.1944899375087956E-11, -8.8416967518780826E-11, + 2.9813639428672270E-11}, + {-1.9473100882661174E-10, -6.0076128537522075E-11, 1.8131864336846848E-09, + -3.9994904594475383E-09, 2.0334605453276710E-09, 5.0274131644549980E-09, + -9.3367591454043182E-09, 5.0274135399836745E-09, 2.0334605013326797E-09, + -3.9994904896155324E-09, 1.8131864336846848E-09, -6.0076128203631512E-11, + -1.9473100882576781E-10}, + {2.7912946705499348E-10, -6.8584366112252110E-09, 1.5876438439921649E-08, + 2.2894800333296164E-09, -5.4355139618053459E-08, 6.9215572172708388E-08, + -2.0761222756661531E-17, -6.9215572327712453E-08, 5.4355139609749671E-08, + -2.2894800250258273E-09, -1.5876438439921649E-08, 6.8584366109549049E-09, + -2.7912946705575371E-10}, + {1.2350515865275413E-08, -4.7668301905193214E-08, -3.2637845350503965E-08, + 3.2101904613886198E-07, -3.3650826993121675E-07, -3.1117289067535446E-07, + 7.8771611533367254E-07, -3.1117289078551072E-07, -3.3650826986389902E-07, + 3.2101904612203255E-07, -3.2637845350169294E-08, -4.7668301904846586E-08, + 1.2350515865276535E-08}, + {9.7956192761409367E-08, 9.2080334894896161E-09, -1.2031586234331795E-06, + 1.3860784486026173E-06, 2.8079238803139698E-06, -5.6034103145542327E-06, + -1.2739341879231602E-17, 5.6034103145492504E-06, -2.8079238803461473E-06, + -1.3860784486009564E-06, 1.2031586234342174E-06, -9.2080334897361341E-09, + -9.7956192761410584E-08}, + {4.5216719173889329E-07, 2.3203195635244806E-06, -6.0547210914040705E-06, + -1.2111482379350871E-05, 3.0238388566349212E-05, 1.0632529352104186E-05, + -5.0954659549722760E-05, 1.0632529352261560E-05, 3.0238388566306048E-05, + -1.2111482379354468E-05, -6.0547210914051945E-06, 2.3203195635247335E-06, + 4.5216719173889398E-07}, + {1.3873038503072794E-06, 1.8694798962849904E-05, 1.4885937076477319E-05, + -1.3109520271107600E-04, -4.6797213058836700E-05, 3.2555441892430831E-04, + -4.2789977886166419E-17, -3.2555441892428500E-04, 4.6797213058883368E-05, + 1.3109520271106627E-04, -1.4885937076476833E-05, -1.8694798962849965E-05, + -1.3873038503072805E-06}, + {2.9080869014384416E-06, 8.2405696428180866E-05, 3.3386109283452882E-04, + -1.7130036080580300E-04, -1.5108662980936798E-03, 7.8665018928628880E-05, + 2.3686576883603285E-03, 7.8665018928680434E-05, -1.5108662980936711E-03, + -1.7130036080580300E-04, 3.3386109283452703E-04, 8.2405696428180690E-05, + 2.9080869014384429E-06}, + {4.1089519307370109E-06, 2.2941839162878702E-04, 1.8941440042457411E-03, + 3.5673079836347600E-03, -3.6880489041049127E-03, -1.2074156718545229E-02, + 7.7638840193391308E-18, 1.2074156718545398E-02, 3.6880489041048680E-03, + -3.5673079836347752E-03, -1.8941440042457402E-03, -2.2941839162878607E-04, + -4.1089519307370134E-06}, + {3.7267581324409626E-06, 4.0381251792508718E-04, 5.7019503038218408E-03, + 2.4040868593456798E-02, 2.9406233528281676E-02, -2.4394921635639274E-02, + -7.0323343245740924E-02, -2.4394921635639076E-02, 2.9406233528281728E-02, + 2.4040868593456794E-02, 5.7019503038218391E-03, 4.0381251792508517E-04, + 3.7267581324409639E-06}, + {1.9487148068106048E-06, 4.1285069961250690E-04, 9.2995630713278779E-03, + 6.5021145064983535E-02, 1.8663042875530000E-01, 2.1451870821533811E-01, + -4.2425842671825291E-17, -2.1451870821533800E-01, -1.8663042875529998E-01, + -6.5021145064983424E-02, -9.2995630713278762E-03, -4.1285069961250441E-04, + -1.9487148068106044E-06}, + {4.4408051211162671E-07, 1.8756193861873413E-04, 6.5146989208011699E-03, + 6.8352802598867848E-02, 3.1564238810082496E-01, 7.5353649746793927E-01, + 9.9999999999999944E-01, 7.5353649746793827E-01, 3.1564238810082473E-01, + 6.8352802598867710E-02, 6.5146989208011664E-03, 1.8756193861873272E-04, + 4.4408051211162740E-07}, + }}; + } else if constexpr (w == 14) { + return std::array, 13>{{ + {-1.4791529084475183E-12, 4.8147158230661728E-12, -7.1247156948137733E-12, + -3.7363541207502799E-12, 3.0923963981839685E-11, -4.7998355799044319E-11, + 2.4268806716162679E-11, 2.4268733214440741E-11, -4.7998325173326849E-11, + 3.0923986440699169E-11, -3.7363622876082732E-12, -7.1247172580014364E-12, + 4.8147157243700130E-12, -1.4791527913704449E-12}, + {-1.2240623323565210E-11, 1.4269095045857491E-11, 6.3689195678622977E-11, + -2.3523039312409202E-10, 2.6546832599550726E-10, 9.4137124835858634E-11, + -5.6473808447746174E-10, 5.6473802485264837E-10, -9.4137192268683287E-11, + -2.6546836370465266E-10, 2.3523038893615868E-10, -6.3689194596148682E-11, + -1.4269094972657386E-11, 1.2240623457626768E-11}, + {-2.3785683828648566E-11, -2.9453404128779668E-10, 1.0997757892316608E-09, + -8.6020469050217690E-10, -2.2974593148638725E-09, 5.5064436862062262E-09, + -3.1470906039204597E-09, -3.1470906435159520E-09, 5.5064436312124872E-09, + -2.2974593224058709E-09, -8.6020468893092726E-10, 1.0997757877782549E-09, + -2.9453404132462281E-10, -2.3785683688841006E-11}, + {5.5138523621058489E-10, -3.4792607432848048E-09, 2.1621109683219443E-09, + 1.6802313214377317E-08, -3.4440501477287078E-08, 3.6408052006210212E-09, + 5.4274262219974878E-08, -5.4274262276717443E-08, -3.6408052283003184E-09, + 3.4440501466215358E-08, -1.6802313213339344E-08, -2.1621109680192019E-09, + 3.4792607432685862E-09, -5.5138523606432426E-10}, + {6.5041263396090684E-09, -9.9149367808892008E-09, -6.6845758889566122E-08, + 1.6286641993591861E-07, 5.8507874937330077E-08, -4.7688540979254475E-07, + 3.2559878513865341E-07, 3.2559878505297634E-07, -4.7688540973134683E-07, + 5.8507875016887355E-08, 1.6286641992979879E-07, -6.6845758890092050E-08, + -9.9149367809190818E-09, 6.5041263397797216E-09}, + {3.9336515129721029E-08, 1.1257285216172823E-07, -6.2406181937643518E-07, + -2.6873173855212429E-07, 2.8292088258391734E-06, -1.4598715517943753E-06, + -4.0212462690573659E-06, 4.0212462690777108E-06, 1.4598715517561777E-06, + -2.8292088259366911E-06, 2.6873173855004832E-07, 6.2406181937633131E-07, + -1.1257285216170229E-07, -3.9336515129545111E-08}, + {1.5611302559652624E-07, 1.4859455506706588E-06, -8.5826557923801041E-07, + -1.1616353402589941E-05, 8.0333594878743668E-06, 2.8616079443342253E-05, + -2.5816776957596172E-05, -2.5816776957725667E-05, 2.8616079443297517E-05, + 8.0333594878743668E-06, -1.1616353402589941E-05, -8.5826557923812285E-07, + 1.4859455506706096E-06, 1.5611302559670729E-07}, + {4.3045614796951609E-07, 8.9716871724550223E-06, 2.3377513570381975E-05, + -5.5213296993544491E-05, -1.2391624765754029E-04, 1.5869855385558889E-04, + 2.1530382494139264E-04, -2.1530382494148987E-04, -1.5869855385559667E-04, + 1.2391624765754420E-04, 5.5213296993542547E-05, -2.3377513570382097E-05, + -8.9716871724550562E-06, -4.3045614796933784E-07}, + {8.3014334976692694E-07, 3.4045323043173907E-05, 2.1660980714121266E-04, + 1.7421792587401537E-04, -9.2118064021565096E-04, -9.7597008655070415E-04, + 1.4714477548414425E-03, 1.4714477548413221E-03, -9.7597008655066978E-04, + -9.2118064021557355E-04, 1.7421792587402128E-04, 2.1660980714121377E-04, + 3.4045323043173954E-05, 8.3014334976713256E-07}, + {1.0954436997682012E-06, 8.5568590196649072E-05, 9.7778250562911362E-04, + 3.0692948752812726E-03, 6.0463237460737715E-04, -8.9532302111319517E-03, + -7.4040784665310088E-03, 7.4040784665311398E-03, 8.9532302111319049E-03, + -6.0463237460742030E-04, -3.0692948752812760E-03, -9.7778250562911796E-04, + -8.5568590196649234E-05, -1.0954436997680322E-06}, + {9.3810713124204517E-07, 1.3926941499858522E-04, 2.5833386162538992E-03, + 1.4797516242328845E-02, 3.0361769467151939E-02, 5.7261067343619453E-03, + -5.3608938764866568E-02, -5.3608938764866804E-02, 5.7261067343620043E-03, + 3.0361769467151887E-02, 1.4797516242328843E-02, 2.5833386162539074E-03, + 1.3926941499858538E-04, 9.3810713124224771E-07}, + {4.6718564624239798E-07, 1.3360375098030156E-04, 3.8410346178215297E-03, + 3.4207779106833432E-02, 1.2923501383683486E-01, 2.2132894130184300E-01, + 1.2264779624530257E-01, -1.2264779624530266E-01, -2.2132894130184300E-01, + -1.2923501383683503E-01, -3.4207779106833432E-02, -3.8410346178215393E-03, + -1.3360375098030183E-04, -4.6718564624220306E-07}, + {1.0213002307223056E-07, 5.7528591418445632E-05, 2.5031206020280083E-03, + 3.2405046511689239E-02, 1.8485678142025511E-01, 5.5177865704975293E-01, + 9.3670793123951734E-01, 9.3670793123951734E-01, 5.5177865704975293E-01, + 1.8485678142025552E-01, 3.2405046511689246E-02, 2.5031206020280179E-03, + 5.7528591418445801E-05, 1.0213002307242283E-07}, + }}; + } else if constexpr (w == 15) { + return std::array, 13>{{ + {-6.7275763610714952E-13, 1.4037883799551298E-12, 1.0122748703359079E-12, + -1.0507011558415453E-11, 1.9186622029950655E-11, -7.9757821000147658E-12, + -2.2999231890282221E-11, 4.0853143156922655E-11, -2.2999289058288172E-11, + -7.9759209366006470E-12, 1.9186575580945818E-11, -1.0507009389093798E-11, + 1.0122747666550936E-12, 1.4037883779612681E-12, -6.7275763607599545E-13}, + {-2.9809392328870459E-12, -8.3268200106445154E-12, 5.7687950421418410E-11, + -9.1929199328063136E-11, -3.9289939147449750E-11, 3.0713723883726984E-10, + -3.5332678542514975E-10, -2.7146437259190364E-19, 3.5332673644762448E-10, + -3.0713734467131358E-10, 3.9289960193589238E-11, 9.1929195849949024E-11, + -5.7687950527891289E-11, 8.3268200078717850E-12, 2.9809392328263928E-12}, + {1.6106092880560131E-11, -1.9612809867391534E-10, 3.3667881343327413E-10, + 5.4740705721569177E-10, -2.3219918274241966E-09, 1.8783264065861090E-09, + 2.1531914801939135E-09, -4.8374639374556914E-09, 2.1531914732804149E-09, + 1.8783263688761161E-09, -2.3219918425081937E-09, 5.4740705894406642E-10, + 3.3667881359039910E-10, -1.9612809867391534E-10, 1.6106092880566125E-11}, + {3.5447644664515603E-10, -1.1390658479631380E-09, -2.4324028601744043E-09, + 1.2152005525649129E-08, -7.1102518397187493E-09, -2.5878341881540945E-08, + 4.0855407208672653E-08, -5.2935793078520102E-17, -4.0855407200368865E-08, + 2.5878341983954342E-08, 7.1102518798537297E-09, -1.2152005534644900E-08, + 2.4324028599797840E-09, 1.1390658479621243E-09, -3.5447644664522991E-10}, + {2.8405432421064880E-09, 2.6648052024110037E-09, -4.5328290134669312E-08, + 3.2089634827933056E-08, 1.7241593347433905E-07, -2.5816631649430664E-07, + -1.3664009514955699E-07, 4.6017883229632535E-07, -1.3664009519851534E-07, + -2.5816631659222327E-07, 1.7241593343456043E-07, 3.2089634833287873E-08, + -4.5328290134639428E-08, 2.6648052024095099E-09, 2.8405432421065231E-09}, + {1.4373673262756718E-08, 9.2554419735720107E-08, -2.0417866965620877E-07, + -6.8820764686365081E-07, 1.4165168644119495E-06, 1.2531774951342180E-06, + -3.6383191328395853E-06, 7.7231484391689009E-17, 3.6383191329101677E-06, + -1.2531774953177319E-06, -1.4165168644026078E-06, 6.8820764686022552E-07, + 2.0417866965633852E-07, -9.2554419735716864E-08, -1.4373673262756819E-08}, + {5.0693377499403671E-08, 7.7594237801399261E-07, 9.4933483676650543E-07, + -6.6987818302441095E-06, -4.5889941143310731E-06, 2.2647907184666643E-05, + 3.7412856035719476E-06, -3.3754692339531092E-05, 3.7412856035755445E-06, + 2.2647907184632474E-05, -4.5889941143094898E-06, -6.6987818302360161E-06, + 9.4933483676673021E-07, 7.7594237801399261E-07, 5.0693377499403691E-08}, + {1.2779800356186583E-07, 3.8997040140349321E-06, 1.8264189394307380E-05, + -8.3632912035133083E-06, -1.0687544349165045E-04, 2.2123224044259885E-06, + 2.3404180714519442E-04, -3.1780101629791230E-17, -2.3404180714510888E-04, + -2.2123224042859913E-06, 1.0687544349166601E-04, 8.3632912035016430E-06, + -1.8264189394307563E-05, -3.8997040140349321E-06, -1.2779800356186591E-07}, + {2.2919642176438707E-07, 1.3183839322480003E-05, 1.2030953406839345E-04, + 2.4905754342428545E-04, -3.4193403196993528E-04, -1.1551611179404116E-03, + 2.1954335627570980E-04, 1.7895433812202518E-03, 2.1954335627569262E-04, + -1.1551611179404632E-03, -3.4193403196995035E-04, 2.4905754342428572E-04, + 1.2030953406839334E-04, 1.3183839322479994E-05, 2.2919642176438718E-07}, + {2.8457821671573232E-07, 3.0427184404092272E-05, 4.6337319534911801E-04, + 2.1072304367244893E-03, 2.4342755210407336E-03, -4.2814200474568642E-03, + -9.6703299158782570E-03, 1.1713135756253251E-16, 9.6703299158783472E-03, + 4.2814200474569067E-03, -2.4342755210407171E-03, -2.1072304367244859E-03, + -4.6337319534911801E-04, -3.0427184404092272E-05, -2.8457821671573253E-07}, + {2.3137327105312781E-07, 4.6266060425611184E-05, 1.1028009511991968E-03, + 8.2352859806754768E-03, 2.4233386066663400E-02, 2.2182889945939446E-02, + -2.5327411650384966E-02, -6.0946897479642374E-02, -2.5327411650384900E-02, + 2.2182889945939362E-02, 2.4233386066663431E-02, 8.2352859806754889E-03, + 1.1028009511991974E-03, 4.6266060425611204E-05, 2.3137327105312789E-07}, + {1.1019919454791575E-07, 4.1938159428224133E-05, 1.5154850601194975E-03, + 1.6839357628952684E-02, 8.0835952724673241E-02, 1.8739074372244102E-01, + 1.9255567517255726E-01, 1.6956773054418529E-31, -1.9255567517255731E-01, + -1.8739074372244113E-01, -8.0835952724673366E-02, -1.6839357628952709E-02, + -1.5154850601194975E-03, -4.1938159428224133E-05, -1.1019919454791579E-07}, + {2.3183302143948740E-08, 1.7202745817468638E-05, 9.2668857465754892E-04, + 1.4607490553401940E-02, 1.0130044556641118E-01, 3.7041488405244688E-01, + 7.8279781886019206E-01, 1.0000000000000011E+00, 7.8279781886019195E-01, + 3.7041488405244721E-01, 1.0130044556641132E-01, 1.4607490553401953E-02, + 9.2668857465754838E-04, 1.7202745817468631E-05, 2.3183302143948743E-08}, + }}; + } else if constexpr (w == 16) { + return std::array, 14>{{ + {-2.3198933270740715E-14, 8.4680084926105710E-14, -5.5120394376955525E-14, + -3.4224825412770884E-13, 1.0093451766215381E-12, -9.9669407015123244E-13, + -4.1950464449360547E-13, 2.1120456723238401E-12, -2.1120631281451168E-12, + 4.1949988381507543E-13, 9.9669407015123244E-13, -1.0093463667911707E-12, + 3.4224835330851150E-13, 5.5120381979355185E-14, -8.4680084587108829E-14, + 2.3198933258633685E-14}, + {-2.1496737417083317E-13, -2.2214974042200800E-14, 2.3291735717266144E-12, + -5.9732917765233235E-12, 3.0556712628179253E-12, 1.1858122635605482E-11, + -2.4316415414833160E-11, 1.3235499986994189E-11, 1.3235536737855158E-11, + -2.4316433790263641E-11, 1.1858112427032992E-11, 3.0556697315320517E-12, + -5.9732921593447914E-12, 2.3291735677388905E-12, -2.2214973792968073E-14, + -2.1496737416207108E-13}, + {1.7715918240672815E-14, -8.7094275514577869E-12, 2.5402078534858863E-11, + 5.6643120203537577E-13, -1.1273397749808333E-10, 1.7831198930961025E-10, + 2.2123190757406476E-13, -2.7985827080469500E-10, 2.7985821912985675E-10, + -2.2124766556045869E-13, -1.7831199578671051E-10, 1.1273397565255340E-10, + -5.6643233774610691E-13, -2.5402078583658933E-11, 8.7094275509032414E-12, + -1.7715918237423519E-14}, + {1.5548426850867747E-11, -8.2967690041035768E-11, -2.0776280275005410E-11, + 6.5818716252940090E-10, -9.7473366764093964E-10, -7.2114134421445299E-10, + 2.9974008586911667E-09, -1.8729407766830212E-09, -1.8729408099935145E-09, + 2.9974008676571101E-09, -7.2114133321570515E-10, -9.7473366606969001E-10, + 6.5818716284365085E-10, -2.0776280294646031E-11, -8.2967690039501348E-11, + 1.5548426850871941E-11}, + {1.7210848751139206E-10, -1.3819378018485677E-10, -2.4707116695746685E-09, + 4.6626394244300632E-09, 6.2513494738369478E-09, -2.2225751670676472E-08, + 7.2716681748129466E-09, 2.9914504847745951E-08, -2.9914504925247984E-08, + -7.2716681969563846E-09, 2.2225751655452858E-08, -6.2513494779888428E-09, + -4.6626394252950410E-09, 2.4707116695043892E-09, 1.3819378018409654E-10, + -1.7210848751141845E-10}, + {1.1055703983904745E-09, 4.3691209554203762E-09, -2.0201061499410946E-08, + -2.3275033897663606E-08, 1.2633562931562412E-07, -2.2021804055570054E-08, + -2.7912172398560873E-07, 2.1280289566371563E-07, 2.1280289566371563E-07, + -2.7912172399172855E-07, -2.2021804070869530E-08, 1.2633562931791905E-07, + -2.3275033897807039E-08, -2.0201061499398992E-08, 4.3691209554207493E-09, + 1.1055703983904803E-09}, + {4.8970459380161164E-09, 5.4304148291616929E-08, -1.0066736763230802E-08, + -5.3239387743771126E-07, 2.2987809872367560E-07, 1.8048974519479544E-06, + -1.3449315565629853E-06, -2.4760016204856650E-06, 2.4760016205163890E-06, + 1.3449315566227727E-06, -1.8048974519269872E-06, -2.2987809871931610E-07, + 5.3239387743823018E-07, 1.0066736763256750E-08, -5.4304148291616929E-08, + -4.8970459380161164E-09}, + {1.5672684443241270E-08, 3.5812571134853209E-07, 1.1292168823202786E-06, + -2.5215449854178345E-06, -7.6275609266392180E-06, 9.3973092319735694E-06, + 1.7891569285079721E-05, -1.8642776809377737E-05, -1.8642776809426295E-05, + 1.7891569285078386E-05, 9.3973092319897562E-06, -7.6275609266437149E-06, + -2.5215449854180594E-06, 1.1292168823201941E-06, 3.5812571134853119E-07, + 1.5672684443241263E-08}, + {3.6571939291734580E-08, 1.5742222553115409E-06, 1.1217451065775842E-05, + 1.0668471374318627E-05, -6.0694020243069901E-05, -7.4268888177613095E-05, + 1.3567546096380107E-04, 1.4875477215032178E-04, -1.4875477215047734E-04, + -1.3567546096381663E-04, 7.4268888177613095E-05, 6.0694020243062122E-05, + -1.0668471374319355E-05, -1.1217451065775811E-05, -1.5742222553115415E-06, + -3.6571939291734593E-08}, + {6.1501023800531295E-08, 4.8443034242391141E-06, 6.0167136036954503E-05, + 2.0573318254802077E-04, 1.2811955521419976E-05, -8.3782209201438288E-04, + -6.2669687707128208E-04, 1.1809008871738671E-03, 1.1809008871739529E-03, + -6.2669687707129921E-04, -8.3782209201441725E-04, 1.2811955521421050E-05, + 2.0573318254802050E-04, 6.0167136036954456E-05, 4.8443034242391132E-06, + 6.1501023800531308E-08}, + {7.2283166867263303E-08, 1.0391634193778160E-05, 2.0529674430143854E-04, + 1.2618687081127932E-03, 2.6256301814801060E-03, -5.5040645592551222E-04, + -7.8709464111364341E-03, -5.7657980103486698E-03, 5.7657980103487626E-03, + 7.8709464111365313E-03, 5.5040645592551373E-04, -2.6256301814801060E-03, + -1.2618687081127928E-03, -2.0529674430143856E-04, -1.0391634193778164E-05, + -7.2283166867263303E-08}, + {5.6049296769722387E-08, 1.4879146623074258E-05, 4.4787865139353365E-04, + 4.2383440773521696E-03, 1.6624620601556193E-02, 2.6395394769117640E-02, + 3.6740117889106082E-04, -4.8088574473126630E-02, -4.8088574473126713E-02, + 3.6740117889113471E-04, 2.6395394769117678E-02, 1.6624620601556193E-02, + 4.2383440773521722E-03, 4.4787865139353359E-04, 1.4879146623074262E-05, + 5.6049296769722367E-08}, + {2.5620581163903708E-08, 1.2815874111792787E-05, 5.7471335914300670E-04, + 7.8386860177525539E-03, 4.6638901641906962E-02, 1.3897554029141571E-01, + 2.0773808644544137E-01, 1.0813440420918320E-01, -1.0813440420918335E-01, + -2.0773808644544145E-01, -1.3897554029141571E-01, -4.6638901641906975E-02, + -7.8386860177525539E-03, -5.7471335914300648E-04, -1.2815874111792787E-05, + -2.5620581163903721E-08}, + {5.2012152104083984E-09, 5.0291159580938677E-06, 3.3201112337137920E-04, + 6.3015433246683353E-03, 5.2427915343763412E-02, 2.3104762006593377E-01, + 5.9521037322997217E-01, 9.4441119081353875E-01, 9.4441119081353875E-01, + 5.9521037322997217E-01, 2.3104762006593377E-01, 5.2427915343763412E-02, + 6.3015433246683353E-03, 3.3201112337137920E-04, 5.0291159580938694E-06, + 5.2012152104083868E-09}, + }}; + } + static_assert(w >= 2, "w must be >= 2"); + static_assert(w <= 16, "w must be <= 16"); +}; diff --git a/src/spreadinterp.cpp b/src/spreadinterp.cpp index 3f03c79bb..6d1652d5c 100644 --- a/src/spreadinterp.cpp +++ b/src/spreadinterp.cpp @@ -705,17 +705,18 @@ int setup_spreader(finufft_spread_opts &opts, FLT eps, double upsampfac, int ker FLT evaluate_kernel(FLT x, const finufft_spread_opts &opts) /* ES ("exp sqrt") kernel evaluation at single real argument: - phi(x) = exp(beta.sqrt(1 - (2x/n_s)^2)), for |x| < nspread/2 + phi(x) = exp(beta.(sqrt(1 - (2x/n_s)^2) - 1)), for |x| < nspread/2 related to an asymptotic approximation to the Kaiser--Bessel, itself an approximation to prolate spheroidal wavefunction (PSWF) of order 0. - This is the "reference implementation", used by eg finufft/onedim_* 2/17/17 + This is the "reference implementation", used by eg finufft/onedim_* 2/17/17. + Rescaled so max is 1, Barnett 7/21/24 */ { if (abs(x) >= (FLT)opts.ES_halfwidth) // if spreading/FT careful, shouldn't need this if, but causes no speed hit return 0.0; else - return exp((FLT)opts.ES_beta * sqrt((FLT)1.0 - (FLT)opts.ES_c * x * x)); + return exp( (FLT)opts.ES_beta * (sqrt((FLT)1.0 - (FLT)opts.ES_c * x * x) - (FLT)1.0) ); } template @@ -731,9 +732,11 @@ void evaluate_kernel_vector(FLT *ker, FLT *args, const finufft_spread_opts &opts If opts.kerpad true, args and ker must be allocated for Npad, and args is written to (to pad to length Npad), only first N outputs are correct. Barnett 4/24/18 option to pad to mult of 4 for better SIMD vectorization. + Rescaled so max is 1, Barnett 7/21/24 Obsolete (replaced by Horner), but keep around for experimentation since - works for arbitrary beta. Formula must match reference implementation. */ + works for arbitrary beta. Formula must match reference implementation. +*/ { FLT b = (FLT)opts.ES_beta; FLT c = (FLT)opts.ES_c; @@ -748,7 +751,8 @@ void evaluate_kernel_vector(FLT *ker, FLT *args, const finufft_spread_opts &opts args[i] = 0.0; } for (int i = 0; i < Npad; i++) { // Loop 1: Compute exponential arguments - ker[i] = b * sqrt((FLT)1.0 - c * args[i] * args[i]); // care! 1.0 is double + // care! 1.0 is double... + ker[i] = b * (sqrt((FLT)1.0 - c * args[i] * args[i]) - (FLT)1.0); } if (!(opts.flags & TF_OMIT_EVALUATE_EXPONENTIAL)) for (int i = 0; i < Npad; i++) // Loop 2: Compute exponentials @@ -783,10 +787,10 @@ Two upsampfacs implemented. Params must match ref formula. Barnett 4/24/18 */ static constexpr auto alignment = arch_t::alignment(); static constexpr auto simd_size = simd_type::size; static constexpr auto padded_ns = (w + simd_size - 1) & ~(simd_size - 1); - static constexpr auto nc = nc200(); static constexpr auto horner_coeffs = get_horner_coeffs_200(); + static constexpr auto nc = horner_coeffs.size(); static constexpr auto use_ker_sym = (simd_size < w); - + alignas(alignment) static constexpr auto padded_coeffs = pad_2D_array_with_zeros(horner_coeffs); @@ -1391,9 +1395,9 @@ FINUFFT_NEVER_INLINE void spread_subproblem_1d_kernel( // it allows to save one load this way at each iteration // This does for each element e of the subgrid, x1 defined above and pt the NU point - // the following: e += exp(beta.sqrt(1 - (2*x1/n_s)^2))*pt - // NOTE: x1 is translated accordingly, please see the ES method for more - // using uint8_t in loops to favor unrolling. + // the following: e += scaled_kernel(2*x1/n_s)*pt, where "scaled_kernel" is defined + // on [-1,1]. + // Using uint8_t in loops to favor unrolling. // Most compilers limit the unrolling to 255, uint8_t is at most 255 for (uint8_t dx{0}; dx < regular_part; dx += 2 * simd_size) { // read ker_v which is simd_size wide from ker diff --git a/test/checkallaccs.sh b/test/checkallaccs.sh index 8a8fcee88..1fcd913db 100755 --- a/test/checkallaccs.sh +++ b/test/checkallaccs.sh @@ -9,21 +9,22 @@ DEFAULTDIM=1 DIM=${1:-$DEFAULTDIM} echo checkallaccs for dim=$DIM : -# finufft test size params +# finufft test size params (prod{N}.N < TEST_BIGPROB so compares direct transf) TEST1="1e3 1e3" -TEST2="1e2 1e1 1e3" -TEST3="1e1 1e1 1e1 1e3" +TEST2="1e2 2e1 1e3" +TEST3="1e1 2e1 3e1 1e3" # bash hack to make DIM switch between one of the above 3 choices TESTD=TEST$DIM TEST=${!TESTD} +# other test args SORT=2 +UPSAMPFAC=2.0 for acc in `seq 1 15`; do TOL=1e-$acc echo ----------requesting $TOL : - ./spreadtestnd $DIM 1e6 1e6 $TOL $SORT - ./finufft${DIM}d_test $TEST $TOL 0 $SORT - ./finufftGuru1_test $TEST2 1 $TOL 0 $SORT +# ./spreadtestnd $DIM 1e6 1e6 $TOL $SORT + ./finufft${DIM}d_test $TEST $TOL 0 $SORT $UPSAMPFAC | grep dirft done diff --git a/test/finufft1d_test.cpp b/test/finufft1d_test.cpp index b4a946738..75e375197 100644 --- a/test/finufft1d_test.cpp +++ b/test/finufft1d_test.cpp @@ -149,7 +149,7 @@ int main(int argc, char *argv[]) { timer.restart(); ier = FINUFFT1D3(M, x, c, isign, tol, N, s, F, &opts); t = timer.elapsedsec(); - if (ier > 0) { + if (ier > 1) { printf("error (ier=%d)!\n", ier); return ier; } else