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