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