From 9d6dc87014bd91ec30b2cc9b6b42c8573877228a Mon Sep 17 00:00:00 2001
From: Pauli Virtanen <pauli.t.virtanen@jyu.fi>
Date: Tue, 2 Aug 2022 14:41:23 +0300
Subject: [PATCH] Edit

---
 meson.build    |  9 +++++---
 src/action.hpp | 15 ++++++++++++
 src/common.h   |  9 --------
 src/common.hpp | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++
 src/main.cpp   | 21 ++++++++++++++++-
 5 files changed, 103 insertions(+), 13 deletions(-)
 create mode 100644 src/action.hpp
 delete mode 100644 src/common.h
 create mode 100644 src/common.hpp

diff --git a/meson.build b/meson.build
index 9615275..928852a 100644
--- a/meson.build
+++ b/meson.build
@@ -1,5 +1,8 @@
-project('usadelndsoc', 'cpp')
+project('usadelndsoc', 'cpp',
+        default_options : ['cpp_std=c++17'])
 
 cppad_dep = dependency('cppad')
-deps = [cppad_dep]
-executable('main', 'src/main.cpp', dependencies: deps)
+eigen3_dep = dependency('eigen3')
+
+deps = [cppad_dep, eigen3_dep]
+executable('main', 'src/main.cpp', dependencies : deps)
diff --git a/src/action.hpp b/src/action.hpp
new file mode 100644
index 0000000..6d9127f
--- /dev/null
+++ b/src/action.hpp
@@ -0,0 +1,15 @@
+#ifndef ACTION_HPP_
+#define ACTION_HPP_
+
+#include "common.hpp"
+
+
+inline ADComplex S_2(Array<ADComplex,3> Q)
+{
+    size_t i = 2;
+    return Q(0u, i, 2u);
+}
+
+
+
+#endif
diff --git a/src/common.h b/src/common.h
deleted file mode 100644
index de55b0f..0000000
--- a/src/common.h
+++ /dev/null
@@ -1,9 +0,0 @@
-#ifndef COMMON_H_
-#define COMMON_H_
-
-#include <cppad/cppad.hpp>
-
-typedef CppAD::AD<double> ADDouble;
-typedef std::complex<ADDouble> ADComplex;
-
-#endif
diff --git a/src/common.hpp b/src/common.hpp
new file mode 100644
index 0000000..12d7b98
--- /dev/null
+++ b/src/common.hpp
@@ -0,0 +1,62 @@
+#ifndef COMMON_H_
+#define COMMON_H_
+
+#include <array>
+#include <tuple>
+#include <iostream>
+
+#include <cppad/cppad.hpp>
+#include <cppad/example/cppad_eigen.hpp>
+
+#include <Eigen/Core>
+
+typedef CppAD::AD<double> ADDouble;
+typedef std::complex<ADDouble> ADComplex;
+
+template <typename Scalar, int NDim>
+class Array
+{
+private:
+    std::vector<Scalar>& data_;
+    std::array<size_t, NDim> shape_;
+    std::array<size_t, NDim> stride_;
+
+protected:
+    template <typename... Idx>
+    size_t index(Idx... idxs) const
+        {
+            const std::array<size_t,NDim> m{idxs...};
+            size_t idx = 0;
+
+            for (size_t i = 0; i < NDim; ++i)
+                idx += stride_[i] * m[i];
+
+            return idx;
+        }
+    
+public:
+    Array(std::vector<Scalar>& data, std::array<size_t, NDim> shape) : data_(data), shape_(shape)
+        {
+            if (NDim > 0) {
+                size_t i = NDim - 1;
+                stride_[i] = 1;
+                while (i-- > 0)
+                    stride_[i] = shape[i+1] * stride_[i+1];
+            }
+        }
+
+    template <typename... Idx>
+    Scalar& operator()(Idx... idxs)
+        {
+            return data_[index(idxs...)];
+        }
+
+    template <typename... Idx>
+    const Scalar&& operator()(Idx... idxs) const
+        {
+            return data_[index(idxs...)];
+        }
+};
+
+
+#endif
diff --git a/src/main.cpp b/src/main.cpp
index 783cb8e..7d79f02 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -1,8 +1,27 @@
-#include "common.h"
+#include "common.hpp"
+#include "action.hpp"
 
 
 int main()
 {
+    std::vector<double> v(3*3*3);
+    Array<double,3> Q(v,{3,3,3});
+
+    for (size_t i = 0; i < 3; ++i) {
+        for (size_t j = 0; i < 3; ++i) {
+            for (size_t k = 0; i < 3; ++i) {
+                Q(i,j,k) = i+j+k;
+            }
+        }
+    }
+
+    for (size_t i = 0; i < 3; ++i) {
+        for (size_t j = 0; i < 3; ++i) {
+            for (size_t k = 0; i < 3; ++i) {
+                std::cout << Q(i,j,k) << std::endl;
+            }
+        }
+    }
 
     return 0;
 }
-- 
GitLab