From 3eee564217c83f4f36ec09734373f16685bb8cc4 Mon Sep 17 00:00:00 2001 From: Yen-Chen <yen-chen.chen@tum.de> Date: Mon, 17 Mar 2025 11:06:46 +0100 Subject: [PATCH] Reorganize lambda functions so that it is easier to understand --- src/horizontal/mo_lib_divrot.cpp | 311 ++++++++----------------------- 1 file changed, 73 insertions(+), 238 deletions(-) diff --git a/src/horizontal/mo_lib_divrot.cpp b/src/horizontal/mo_lib_divrot.cpp index b33df79..c09dfcc 100644 --- a/src/horizontal/mo_lib_divrot.cpp +++ b/src/horizontal/mo_lib_divrot.cpp @@ -15,16 +15,10 @@ #include <horizontal/mo_lib_divrot.hpp> #include <support/mo_lib_loopindices.hpp> -#define DECLARE_LAMBDA_INNER_PRODUCT(_func_name, _output, _id, _lambda) \ - auto inner_product = [=, &_output](int _id, auto &&...ts) { \ - return [=, &_output] { \ - _output(_id) = 0.0; \ - int dummy[sizeof...(ts)]{(_lambda, 0)...}; \ - }; \ - }; \ - auto _func_name = [=]<int... Is>(int _id, \ +#define DECLARE_INTEGER_SEQUENCE_WRAPPER_W_ID(_func_name, _base_function) \ + auto _func_name = [=]<int... Is>(int unk, \ std::integer_sequence<int, Is...>) { \ - return inner_product(_id, Is...)(); \ + return _base_function(unk, Is...)(); \ }; template <typename T> @@ -273,15 +267,18 @@ void recon_lsq_cell_q(const T *p_cc, const int *lsq_idx_c, const int *lsq_blk_c, Kokkos::parallel_for( "recon_lsq_cell_q_step2", innerPolicy, KOKKOS_LAMBDA(const int jk, const int jc) { - auto lambda_add = [=, &z_qt_times_d](auto lsq_qtmat_c_view, auto z_d, - int jb, int jk, int jc, int unk, - int i) { - z_qt_times_d(unk) += - lsq_qtmat_c_view(jc, unk, i, jb) * z_d(i, jc, jk); + auto inner_product = [=, &z_qt_times_d](int unk, auto &&...ts) { + return [=, &z_qt_times_d] { + z_qt_times_d(unk) = 0.0; + int dummy[sizeof...(ts)]{( + [=, &z_qt_times_d](int i) { + z_qt_times_d(unk) += + lsq_qtmat_c_view(jc, unk, i, jb) * z_d(i, jc, jk); + }(ts), + 0)...}; + }; }; - DECLARE_LAMBDA_INNER_PRODUCT( - dot_product, z_qt_times_d, unk, - lambda_add(lsq_qtmat_c_view, z_d, jb, jk, jc, unk, ts)); + DECLARE_INTEGER_SEQUENCE_WRAPPER_W_ID(dot_product, inner_product); dot_product(0, std::make_integer_sequence<int, 9>()); dot_product(1, std::make_integer_sequence<int, 9>()); dot_product(2, std::make_integer_sequence<int, 9>()); @@ -401,56 +398,23 @@ void recon_lsq_cell_q_svd(const T *p_cc, const int *lsq_idx_c, Kokkos::parallel_for( "recon_lsq_cell_q_svd_step2", innerPolicy, KOKKOS_LAMBDA(const int jk, const int jc) { - p_coeff_view(5, jc, jk, jb) = - lsq_pseudoinv_view(jc, 4, 0, jb) * z_b(0, jc, jk) + - lsq_pseudoinv_view(jc, 4, 1, jb) * z_b(1, jc, jk) + - lsq_pseudoinv_view(jc, 4, 2, jb) * z_b(2, jc, jk) + - lsq_pseudoinv_view(jc, 4, 3, jb) * z_b(3, jc, jk) + - lsq_pseudoinv_view(jc, 4, 4, jb) * z_b(4, jc, jk) + - lsq_pseudoinv_view(jc, 4, 5, jb) * z_b(5, jc, jk) + - lsq_pseudoinv_view(jc, 4, 6, jb) * z_b(6, jc, jk) + - lsq_pseudoinv_view(jc, 4, 7, jb) * z_b(7, jc, jk) + - lsq_pseudoinv_view(jc, 4, 8, jb) * z_b(8, jc, jk); - p_coeff_view(4, jc, jk, jb) = - lsq_pseudoinv_view(jc, 3, 0, jb) * z_b(0, jc, jk) + - lsq_pseudoinv_view(jc, 3, 1, jb) * z_b(1, jc, jk) + - lsq_pseudoinv_view(jc, 3, 2, jb) * z_b(2, jc, jk) + - lsq_pseudoinv_view(jc, 3, 3, jb) * z_b(3, jc, jk) + - lsq_pseudoinv_view(jc, 3, 4, jb) * z_b(4, jc, jk) + - lsq_pseudoinv_view(jc, 3, 5, jb) * z_b(5, jc, jk) + - lsq_pseudoinv_view(jc, 3, 6, jb) * z_b(6, jc, jk) + - lsq_pseudoinv_view(jc, 3, 7, jb) * z_b(7, jc, jk) + - lsq_pseudoinv_view(jc, 3, 8, jb) * z_b(8, jc, jk); - p_coeff_view(3, jc, jk, jb) = - lsq_pseudoinv_view(jc, 2, 0, jb) * z_b(0, jc, jk) + - lsq_pseudoinv_view(jc, 2, 1, jb) * z_b(1, jc, jk) + - lsq_pseudoinv_view(jc, 2, 2, jb) * z_b(2, jc, jk) + - lsq_pseudoinv_view(jc, 2, 3, jb) * z_b(3, jc, jk) + - lsq_pseudoinv_view(jc, 2, 4, jb) * z_b(4, jc, jk) + - lsq_pseudoinv_view(jc, 2, 5, jb) * z_b(5, jc, jk) + - lsq_pseudoinv_view(jc, 2, 6, jb) * z_b(6, jc, jk) + - lsq_pseudoinv_view(jc, 2, 7, jb) * z_b(7, jc, jk) + - lsq_pseudoinv_view(jc, 2, 8, jb) * z_b(8, jc, jk); - p_coeff_view(2, jc, jk, jb) = - lsq_pseudoinv_view(jc, 1, 0, jb) * z_b(0, jc, jk) + - lsq_pseudoinv_view(jc, 1, 1, jb) * z_b(1, jc, jk) + - lsq_pseudoinv_view(jc, 1, 2, jb) * z_b(2, jc, jk) + - lsq_pseudoinv_view(jc, 1, 3, jb) * z_b(3, jc, jk) + - lsq_pseudoinv_view(jc, 1, 4, jb) * z_b(4, jc, jk) + - lsq_pseudoinv_view(jc, 1, 5, jb) * z_b(5, jc, jk) + - lsq_pseudoinv_view(jc, 1, 6, jb) * z_b(6, jc, jk) + - lsq_pseudoinv_view(jc, 1, 7, jb) * z_b(7, jc, jk) + - lsq_pseudoinv_view(jc, 1, 8, jb) * z_b(8, jc, jk); - p_coeff_view(1, jc, jk, jb) = - lsq_pseudoinv_view(jc, 0, 0, jb) * z_b(0, jc, jk) + - lsq_pseudoinv_view(jc, 0, 1, jb) * z_b(1, jc, jk) + - lsq_pseudoinv_view(jc, 0, 2, jb) * z_b(2, jc, jk) + - lsq_pseudoinv_view(jc, 0, 3, jb) * z_b(3, jc, jk) + - lsq_pseudoinv_view(jc, 0, 4, jb) * z_b(4, jc, jk) + - lsq_pseudoinv_view(jc, 0, 5, jb) * z_b(5, jc, jk) + - lsq_pseudoinv_view(jc, 0, 6, jb) * z_b(6, jc, jk) + - lsq_pseudoinv_view(jc, 0, 7, jb) * z_b(7, jc, jk) + - lsq_pseudoinv_view(jc, 0, 8, jb) * z_b(8, jc, jk); + auto inner_product = [=, &p_coeff_view](int unk, auto &&...ts) { + return [=, &p_coeff_view] { + p_coeff_view(unk + 1, jc, jk, jb) = 0.0; + int dummy[sizeof...(ts)]{( + [=, &p_coeff_view](int i) { + p_coeff_view(unk + 1, jc, jk, jb) += + lsq_pseudoinv_view(jc, unk, i, jb) * z_b(i, jc, jk); + }(ts), + 0)...}; + }; + }; + DECLARE_INTEGER_SEQUENCE_WRAPPER_W_ID(dot_product, inner_product); + dot_product(4, std::make_integer_sequence<int, 9>()); + dot_product(3, std::make_integer_sequence<int, 9>()); + dot_product(2, std::make_integer_sequence<int, 9>()); + dot_product(1, std::make_integer_sequence<int, 9>()); + dot_product(0, std::make_integer_sequence<int, 9>()); p_coeff_view(0, jc, jk, jb) = p_cc_view(jc, jk, jb) - p_coeff_view(1, jc, jk, jb) * lsq_moments_view(jc, jb, 0) - @@ -546,87 +510,27 @@ void recon_lsq_cell_c(const T *p_cc, const int *lsq_idx_c, const int *lsq_blk_c, Kokkos::parallel_for( "recon_lsq_cell_c_step2", innerPolicy, KOKKOS_LAMBDA(const int jk, const int jc) { - z_qt_times_d(0) = lsq_qtmat_c_view(jc, 0, 0, jb) * z_d(0, jc, jk) + - lsq_qtmat_c_view(jc, 0, 1, jb) * z_d(1, jc, jk) + - lsq_qtmat_c_view(jc, 0, 2, jb) * z_d(2, jc, jk) + - lsq_qtmat_c_view(jc, 0, 3, jb) * z_d(3, jc, jk) + - lsq_qtmat_c_view(jc, 0, 4, jb) * z_d(4, jc, jk) + - lsq_qtmat_c_view(jc, 0, 5, jb) * z_d(5, jc, jk) + - lsq_qtmat_c_view(jc, 0, 6, jb) * z_d(6, jc, jk) + - lsq_qtmat_c_view(jc, 0, 7, jb) * z_d(7, jc, jk) + - lsq_qtmat_c_view(jc, 0, 8, jb) * z_d(8, jc, jk); - z_qt_times_d(1) = lsq_qtmat_c_view(jc, 1, 0, jb) * z_d(0, jc, jk) + - lsq_qtmat_c_view(jc, 1, 1, jb) * z_d(1, jc, jk) + - lsq_qtmat_c_view(jc, 1, 2, jb) * z_d(2, jc, jk) + - lsq_qtmat_c_view(jc, 1, 3, jb) * z_d(3, jc, jk) + - lsq_qtmat_c_view(jc, 1, 4, jb) * z_d(4, jc, jk) + - lsq_qtmat_c_view(jc, 1, 5, jb) * z_d(5, jc, jk) + - lsq_qtmat_c_view(jc, 1, 6, jb) * z_d(6, jc, jk) + - lsq_qtmat_c_view(jc, 1, 7, jb) * z_d(7, jc, jk) + - lsq_qtmat_c_view(jc, 1, 8, jb) * z_d(8, jc, jk); - z_qt_times_d(2) = lsq_qtmat_c_view(jc, 2, 0, jb) * z_d(0, jc, jk) + - lsq_qtmat_c_view(jc, 2, 1, jb) * z_d(1, jc, jk) + - lsq_qtmat_c_view(jc, 2, 2, jb) * z_d(2, jc, jk) + - lsq_qtmat_c_view(jc, 2, 3, jb) * z_d(3, jc, jk) + - lsq_qtmat_c_view(jc, 2, 4, jb) * z_d(4, jc, jk) + - lsq_qtmat_c_view(jc, 2, 5, jb) * z_d(5, jc, jk) + - lsq_qtmat_c_view(jc, 2, 6, jb) * z_d(6, jc, jk) + - lsq_qtmat_c_view(jc, 2, 7, jb) * z_d(7, jc, jk) + - lsq_qtmat_c_view(jc, 2, 8, jb) * z_d(8, jc, jk); - z_qt_times_d(3) = lsq_qtmat_c_view(jc, 3, 0, jb) * z_d(0, jc, jk) + - lsq_qtmat_c_view(jc, 3, 1, jb) * z_d(1, jc, jk) + - lsq_qtmat_c_view(jc, 3, 2, jb) * z_d(2, jc, jk) + - lsq_qtmat_c_view(jc, 3, 3, jb) * z_d(3, jc, jk) + - lsq_qtmat_c_view(jc, 3, 4, jb) * z_d(4, jc, jk) + - lsq_qtmat_c_view(jc, 3, 5, jb) * z_d(5, jc, jk) + - lsq_qtmat_c_view(jc, 3, 6, jb) * z_d(6, jc, jk) + - lsq_qtmat_c_view(jc, 3, 7, jb) * z_d(7, jc, jk) + - lsq_qtmat_c_view(jc, 3, 8, jb) * z_d(8, jc, jk); - z_qt_times_d(4) = lsq_qtmat_c_view(jc, 4, 0, jb) * z_d(0, jc, jk) + - lsq_qtmat_c_view(jc, 4, 1, jb) * z_d(1, jc, jk) + - lsq_qtmat_c_view(jc, 4, 2, jb) * z_d(2, jc, jk) + - lsq_qtmat_c_view(jc, 4, 3, jb) * z_d(3, jc, jk) + - lsq_qtmat_c_view(jc, 4, 4, jb) * z_d(4, jc, jk) + - lsq_qtmat_c_view(jc, 4, 5, jb) * z_d(5, jc, jk) + - lsq_qtmat_c_view(jc, 4, 6, jb) * z_d(6, jc, jk) + - lsq_qtmat_c_view(jc, 4, 7, jb) * z_d(7, jc, jk) + - lsq_qtmat_c_view(jc, 4, 8, jb) * z_d(8, jc, jk); - z_qt_times_d(5) = lsq_qtmat_c_view(jc, 5, 0, jb) * z_d(0, jc, jk) + - lsq_qtmat_c_view(jc, 5, 1, jb) * z_d(1, jc, jk) + - lsq_qtmat_c_view(jc, 5, 2, jb) * z_d(2, jc, jk) + - lsq_qtmat_c_view(jc, 5, 3, jb) * z_d(3, jc, jk) + - lsq_qtmat_c_view(jc, 5, 4, jb) * z_d(4, jc, jk) + - lsq_qtmat_c_view(jc, 5, 5, jb) * z_d(5, jc, jk) + - lsq_qtmat_c_view(jc, 5, 6, jb) * z_d(6, jc, jk) + - lsq_qtmat_c_view(jc, 5, 7, jb) * z_d(7, jc, jk) + - lsq_qtmat_c_view(jc, 5, 8, jb) * z_d(8, jc, jk); - z_qt_times_d(6) = lsq_qtmat_c_view(jc, 6, 0, jb) * z_d(0, jc, jk) + - lsq_qtmat_c_view(jc, 6, 1, jb) * z_d(1, jc, jk) + - lsq_qtmat_c_view(jc, 6, 2, jb) * z_d(2, jc, jk) + - lsq_qtmat_c_view(jc, 6, 3, jb) * z_d(3, jc, jk) + - lsq_qtmat_c_view(jc, 6, 4, jb) * z_d(4, jc, jk) + - lsq_qtmat_c_view(jc, 6, 5, jb) * z_d(5, jc, jk) + - lsq_qtmat_c_view(jc, 6, 6, jb) * z_d(6, jc, jk) + - lsq_qtmat_c_view(jc, 6, 7, jb) * z_d(7, jc, jk) + - lsq_qtmat_c_view(jc, 6, 8, jb) * z_d(8, jc, jk); - z_qt_times_d(7) = lsq_qtmat_c_view(jc, 7, 0, jb) * z_d(0, jc, jk) + - lsq_qtmat_c_view(jc, 7, 1, jb) * z_d(1, jc, jk) + - lsq_qtmat_c_view(jc, 7, 2, jb) * z_d(2, jc, jk) + - lsq_qtmat_c_view(jc, 7, 3, jb) * z_d(3, jc, jk) + - lsq_qtmat_c_view(jc, 7, 4, jb) * z_d(4, jc, jk) + - lsq_qtmat_c_view(jc, 7, 5, jb) * z_d(5, jc, jk) + - lsq_qtmat_c_view(jc, 7, 6, jb) * z_d(6, jc, jk) + - lsq_qtmat_c_view(jc, 7, 7, jb) * z_d(7, jc, jk) + - lsq_qtmat_c_view(jc, 7, 8, jb) * z_d(8, jc, jk); - z_qt_times_d(8) = lsq_qtmat_c_view(jc, 8, 0, jb) * z_d(0, jc, jk) + - lsq_qtmat_c_view(jc, 8, 1, jb) * z_d(1, jc, jk) + - lsq_qtmat_c_view(jc, 8, 2, jb) * z_d(2, jc, jk) + - lsq_qtmat_c_view(jc, 8, 3, jb) * z_d(3, jc, jk) + - lsq_qtmat_c_view(jc, 8, 4, jb) * z_d(4, jc, jk) + - lsq_qtmat_c_view(jc, 8, 5, jb) * z_d(5, jc, jk) + - lsq_qtmat_c_view(jc, 8, 6, jb) * z_d(6, jc, jk) + - lsq_qtmat_c_view(jc, 8, 7, jb) * z_d(7, jc, jk) + - lsq_qtmat_c_view(jc, 8, 8, jb) * z_d(8, jc, jk); + auto inner_product = [=, &z_qt_times_d](int unk, auto &&...ts) { + return [=, &z_qt_times_d] { + z_qt_times_d(unk) = 0.0; + int dummy[sizeof...(ts)]{( + [=, &z_qt_times_d](int i) { + z_qt_times_d(unk) += + lsq_qtmat_c_view(jc, unk, i, jb) * z_d(i, jc, jk); + }(ts), + 0)...}; + }; + }; + DECLARE_INTEGER_SEQUENCE_WRAPPER_W_ID(dot_product, inner_product); + dot_product(0, std::make_integer_sequence<int, 9>()); + dot_product(1, std::make_integer_sequence<int, 9>()); + dot_product(2, std::make_integer_sequence<int, 9>()); + dot_product(3, std::make_integer_sequence<int, 9>()); + dot_product(4, std::make_integer_sequence<int, 9>()); + dot_product(5, std::make_integer_sequence<int, 9>()); + dot_product(6, std::make_integer_sequence<int, 9>()); + dot_product(7, std::make_integer_sequence<int, 9>()); + dot_product(8, std::make_integer_sequence<int, 9>()); p_coeff_view(9, jc, jk, jb) = ptr_rrdiag(jc, 8, jb) * z_qt_times_d(8); p_coeff_view(8, jc, jk, jb) = @@ -786,96 +690,27 @@ void recon_lsq_cell_c_svd(const T *p_cc, const int *lsq_idx_c, z_b(8) = p_cc_view(iidx(jc, jb, 8), jk, iblk(jc, jb, 8)) - p_cc_view(jc, jk, jb); - p_coeff_view(9, jc, jk, jb) = - lsq_pseudoinv_view(jc, 8, 0, jb) * z_b(0) + - lsq_pseudoinv_view(jc, 8, 1, jb) * z_b(1) + - lsq_pseudoinv_view(jc, 8, 2, jb) * z_b(2) + - lsq_pseudoinv_view(jc, 8, 3, jb) * z_b(3) + - lsq_pseudoinv_view(jc, 8, 4, jb) * z_b(4) + - lsq_pseudoinv_view(jc, 8, 5, jb) * z_b(5) + - lsq_pseudoinv_view(jc, 8, 6, jb) * z_b(6) + - lsq_pseudoinv_view(jc, 8, 7, jb) * z_b(7) + - lsq_pseudoinv_view(jc, 8, 8, jb) * z_b(8); - p_coeff_view(8, jc, jk, jb) = - lsq_pseudoinv_view(jc, 7, 0, jb) * z_b(0) + - lsq_pseudoinv_view(jc, 7, 1, jb) * z_b(1) + - lsq_pseudoinv_view(jc, 7, 2, jb) * z_b(2) + - lsq_pseudoinv_view(jc, 7, 3, jb) * z_b(3) + - lsq_pseudoinv_view(jc, 7, 4, jb) * z_b(4) + - lsq_pseudoinv_view(jc, 7, 5, jb) * z_b(5) + - lsq_pseudoinv_view(jc, 7, 6, jb) * z_b(6) + - lsq_pseudoinv_view(jc, 7, 7, jb) * z_b(7) + - lsq_pseudoinv_view(jc, 7, 8, jb) * z_b(8); - p_coeff_view(7, jc, jk, jb) = - lsq_pseudoinv_view(jc, 6, 0, jb) * z_b(0) + - lsq_pseudoinv_view(jc, 6, 1, jb) * z_b(1) + - lsq_pseudoinv_view(jc, 6, 2, jb) * z_b(2) + - lsq_pseudoinv_view(jc, 6, 3, jb) * z_b(3) + - lsq_pseudoinv_view(jc, 6, 4, jb) * z_b(4) + - lsq_pseudoinv_view(jc, 6, 5, jb) * z_b(5) + - lsq_pseudoinv_view(jc, 6, 6, jb) * z_b(6) + - lsq_pseudoinv_view(jc, 6, 7, jb) * z_b(7) + - lsq_pseudoinv_view(jc, 6, 8, jb) * z_b(8); - p_coeff_view(6, jc, jk, jb) = - lsq_pseudoinv_view(jc, 5, 0, jb) * z_b(0) + - lsq_pseudoinv_view(jc, 5, 1, jb) * z_b(1) + - lsq_pseudoinv_view(jc, 5, 2, jb) * z_b(2) + - lsq_pseudoinv_view(jc, 5, 3, jb) * z_b(3) + - lsq_pseudoinv_view(jc, 5, 4, jb) * z_b(4) + - lsq_pseudoinv_view(jc, 5, 5, jb) * z_b(5) + - lsq_pseudoinv_view(jc, 5, 6, jb) * z_b(6) + - lsq_pseudoinv_view(jc, 5, 7, jb) * z_b(7) + - lsq_pseudoinv_view(jc, 5, 8, jb) * z_b(8); - p_coeff_view(5, jc, jk, jb) = - lsq_pseudoinv_view(jc, 4, 0, jb) * z_b(0) + - lsq_pseudoinv_view(jc, 4, 1, jb) * z_b(1) + - lsq_pseudoinv_view(jc, 4, 2, jb) * z_b(2) + - lsq_pseudoinv_view(jc, 4, 3, jb) * z_b(3) + - lsq_pseudoinv_view(jc, 4, 4, jb) * z_b(4) + - lsq_pseudoinv_view(jc, 4, 5, jb) * z_b(5) + - lsq_pseudoinv_view(jc, 4, 6, jb) * z_b(6) + - lsq_pseudoinv_view(jc, 4, 7, jb) * z_b(7) + - lsq_pseudoinv_view(jc, 4, 8, jb) * z_b(8); - p_coeff_view(4, jc, jk, jb) = - lsq_pseudoinv_view(jc, 3, 0, jb) * z_b(0) + - lsq_pseudoinv_view(jc, 3, 1, jb) * z_b(1) + - lsq_pseudoinv_view(jc, 3, 2, jb) * z_b(2) + - lsq_pseudoinv_view(jc, 3, 3, jb) * z_b(3) + - lsq_pseudoinv_view(jc, 3, 4, jb) * z_b(4) + - lsq_pseudoinv_view(jc, 3, 5, jb) * z_b(5) + - lsq_pseudoinv_view(jc, 3, 6, jb) * z_b(6) + - lsq_pseudoinv_view(jc, 3, 7, jb) * z_b(7) + - lsq_pseudoinv_view(jc, 3, 8, jb) * z_b(8); - p_coeff_view(3, jc, jk, jb) = - lsq_pseudoinv_view(jc, 2, 0, jb) * z_b(0) + - lsq_pseudoinv_view(jc, 2, 1, jb) * z_b(1) + - lsq_pseudoinv_view(jc, 2, 2, jb) * z_b(2) + - lsq_pseudoinv_view(jc, 2, 3, jb) * z_b(3) + - lsq_pseudoinv_view(jc, 2, 4, jb) * z_b(4) + - lsq_pseudoinv_view(jc, 2, 5, jb) * z_b(5) + - lsq_pseudoinv_view(jc, 2, 6, jb) * z_b(6) + - lsq_pseudoinv_view(jc, 2, 7, jb) * z_b(7) + - lsq_pseudoinv_view(jc, 2, 8, jb) * z_b(8); - p_coeff_view(2, jc, jk, jb) = - lsq_pseudoinv_view(jc, 1, 0, jb) * z_b(0) + - lsq_pseudoinv_view(jc, 1, 1, jb) * z_b(1) + - lsq_pseudoinv_view(jc, 1, 2, jb) * z_b(2) + - lsq_pseudoinv_view(jc, 1, 3, jb) * z_b(3) + - lsq_pseudoinv_view(jc, 1, 4, jb) * z_b(4) + - lsq_pseudoinv_view(jc, 1, 5, jb) * z_b(5) + - lsq_pseudoinv_view(jc, 1, 6, jb) * z_b(6) + - lsq_pseudoinv_view(jc, 1, 7, jb) * z_b(7) + - lsq_pseudoinv_view(jc, 1, 8, jb) * z_b(8); - p_coeff_view(1, jc, jk, jb) = - lsq_pseudoinv_view(jc, 0, 0, jb) * z_b(0) + - lsq_pseudoinv_view(jc, 0, 1, jb) * z_b(1) + - lsq_pseudoinv_view(jc, 0, 2, jb) * z_b(2) + - lsq_pseudoinv_view(jc, 0, 3, jb) * z_b(3) + - lsq_pseudoinv_view(jc, 0, 4, jb) * z_b(4) + - lsq_pseudoinv_view(jc, 0, 5, jb) * z_b(5) + - lsq_pseudoinv_view(jc, 0, 6, jb) * z_b(6) + - lsq_pseudoinv_view(jc, 0, 7, jb) * z_b(7) + - lsq_pseudoinv_view(jc, 0, 8, jb) * z_b(8); + auto inner_product = [=, &p_coeff_view](int unk, auto &&...ts) { + return [=, &p_coeff_view] { + p_coeff_view(unk + 1, jc, jk, jb) = 0.0; + int dummy[sizeof...(ts)]{( + [=, &p_coeff_view](int i) { + p_coeff_view(unk + 1, jc, jk, jb) += + lsq_pseudoinv_view(jc, unk, i, jb) * z_b(i); + }(ts), + 0)...}; + }; + }; + DECLARE_INTEGER_SEQUENCE_WRAPPER_W_ID(dot_product, inner_product); + dot_product(8, std::make_integer_sequence<int, 9>()); + dot_product(7, std::make_integer_sequence<int, 9>()); + dot_product(6, std::make_integer_sequence<int, 9>()); + dot_product(5, std::make_integer_sequence<int, 9>()); + dot_product(4, std::make_integer_sequence<int, 9>()); + dot_product(3, std::make_integer_sequence<int, 9>()); + dot_product(2, std::make_integer_sequence<int, 9>()); + dot_product(1, std::make_integer_sequence<int, 9>()); + dot_product(0, std::make_integer_sequence<int, 9>()); p_coeff_view(0, jc, jk, jb) = p_cc_view(jc, jk, jb) - p_coeff_view(1, jc, jk, jb) * lsq_moments_view(jc, jb, 0) - -- GitLab