From bd46f5bf0e4c05aeea2e5f5b75648c4a85b8b63f Mon Sep 17 00:00:00 2001
From: Frederik Hennig <frederik.hennig@fau.de>
Date: Mon, 24 Mar 2025 09:16:56 +0100
Subject: [PATCH] Add test case for vector extraction

---
 tests/generator_scripts/index.yaml            |  1 +
 .../source/VectorExtraction.harness.cpp       | 30 +++++++++++++++++++
 .../source/VectorExtraction.py                | 21 +++++++++++++
 3 files changed, 52 insertions(+)
 create mode 100644 tests/generator_scripts/source/VectorExtraction.harness.cpp
 create mode 100644 tests/generator_scripts/source/VectorExtraction.py

diff --git a/tests/generator_scripts/index.yaml b/tests/generator_scripts/index.yaml
index c87977f..79f06f5 100644
--- a/tests/generator_scripts/index.yaml
+++ b/tests/generator_scripts/index.yaml
@@ -84,6 +84,7 @@ NestedNamespaces:
 ScaleKernel:
 JacobiMdspan:
 StlContainers1D:
+VectorExtraction:
 
 # std::mdspan
 
diff --git a/tests/generator_scripts/source/VectorExtraction.harness.cpp b/tests/generator_scripts/source/VectorExtraction.harness.cpp
new file mode 100644
index 0000000..55c4f05
--- /dev/null
+++ b/tests/generator_scripts/source/VectorExtraction.harness.cpp
@@ -0,0 +1,30 @@
+#include "VectorExtraction.hpp"
+#include <experimental/mdspan>
+#include <memory>
+#include <vector>
+
+#undef NDEBUG
+#include <cassert>
+
+namespace stdex = std::experimental;
+
+using extents_t = stdex::extents<std::int64_t, std::dynamic_extent, std::dynamic_extent, 3>;
+using vector_field_t = stdex::mdspan<double, extents_t, stdex::layout_right>;
+constexpr size_t N{41};
+
+int main(void)
+{
+    auto u_data = std::make_unique<double[]>(N * N * 3);
+    vector_field_t u_field{u_data.get(), extents_t{N, N}};
+    std::vector<double> v{3.1, 3.2, 3.4};
+
+    gen::invoke(u_field, v);
+
+    for (size_t j = 0; j < N; ++j)
+        for (size_t i = 0; i < N; ++i)
+        {
+            assert(u_field(j, i, 0) == v[0]);
+            assert(u_field(j, i, 1) == v[1]);
+            assert(u_field(j, i, 2) == v[2]);
+        }
+}
\ No newline at end of file
diff --git a/tests/generator_scripts/source/VectorExtraction.py b/tests/generator_scripts/source/VectorExtraction.py
new file mode 100644
index 0000000..dc60eca
--- /dev/null
+++ b/tests/generator_scripts/source/VectorExtraction.py
@@ -0,0 +1,21 @@
+from pystencilssfg import SourceFileGenerator
+from pystencilssfg.lang.cpp import std
+import pystencils as ps
+import sympy as sp
+
+std.mdspan.configure(namespace="std::experimental", header="<experimental/mdspan>")
+
+with SourceFileGenerator() as sfg:
+    sfg.namespace("gen")
+
+    u_field = ps.fields("u(3): double[2D]", layout="c")
+    u = sp.symbols("u_:3")
+
+    asms = [ps.Assignment(u_field(i), u[i]) for i in range(3)]
+    ker = sfg.kernels.create(asms)
+
+    sfg.function("invoke")(
+        sfg.map_field(u_field, std.mdspan.from_field(u_field, layout_policy="layout_right")),
+        sfg.map_vector(u, std.vector("double", const=True, ref=True).var("vel")),
+        sfg.call(ker)
+    )
-- 
GitLab