Shamrock 2025.10.0
Astrophysical Code
Loading...
Searching...
No Matches
bufToVtkBuf.hpp
Go to the documentation of this file.
1// -------------------------------------------------------//
2//
3// SHAMROCK code for hydrodynamics
4// Copyright (c) 2021-2026 Timothée David--Cléris <tim.shamrock@proton.me>
5// SPDX-License-Identifier: CeCILL Free Software License Agreement v2.1
6// Shamrock is licensed under the CeCILL 2.1 License, see LICENSE for more information
7//
8// -------------------------------------------------------//
9
10#pragma once
11
19#include "shambase/endian.hpp"
20#include "shambackends/sycl.hpp"
22#include "shambackends/vec.hpp"
23
24namespace shamrock::details {
25
26 template<class RT, class T>
27 RT to_vtk_type(T a) {
29 }
30
31 template<class RT, class T>
32 inline sycl::buffer<RT> to_vtk_buf_type(sycl::queue &q, sycl::buffer<T> &buf_in, u64 len) {
33 sycl::buffer<RT> ret(len);
34
35 q.submit([=, &buf_in, &ret](sycl::handler &cgh) {
36 sycl::accessor acc_in{buf_in, cgh, sycl::read_only};
37 sycl::accessor acc_out{ret, cgh, sycl::write_only, sycl::no_init};
38 cgh.parallel_for(sycl::range<1>{len}, [=](sycl::item<1> id) {
39 acc_out[id] = to_vtk_type<RT>(acc_in[id]);
40 });
41 });
42
43 return ret;
44 }
45
46 template<class RT, class T, int n>
47 inline sycl::buffer<RT> to_vtk_buf_type(
48 sycl::queue &q, sycl::buffer<sycl::vec<T, n>> &buf_in, u64 len) {
49 sycl::buffer<RT> ret(len * n);
50
51 q.submit([=, &buf_in, &ret](sycl::handler &cgh) {
52 sycl::accessor acc_in{buf_in, cgh, sycl::read_only};
53 sycl::accessor acc_out{ret, cgh, sycl::write_only, sycl::no_init};
54
55 cgh.parallel_for(sycl::range<1>{len}, [=](sycl::item<1> id) {
56 u32 idx = id.get_linear_id() * n;
57
58 if constexpr (n == 2) {
59 acc_out[idx] = to_vtk_type<RT>(acc_in[id].x());
60 acc_out[idx + 1] = to_vtk_type<RT>(acc_in[id].y());
61 }
62
63 if constexpr (n == 3) {
64 acc_out[idx] = to_vtk_type<RT>(acc_in[id].x());
65 acc_out[idx + 1] = to_vtk_type<RT>(acc_in[id].y());
66 acc_out[idx + 2] = to_vtk_type<RT>(acc_in[id].z());
67 }
68
69 if constexpr (n == 4) {
70 acc_out[idx] = to_vtk_type<RT>(acc_in[id].x());
71 acc_out[idx + 1] = to_vtk_type<RT>(acc_in[id].y());
72 acc_out[idx + 2] = to_vtk_type<RT>(acc_in[id].z());
73 acc_out[idx + 3] = to_vtk_type<RT>(acc_in[id].w());
74 }
75
76 if constexpr (n == 8) {
77 acc_out[idx] = to_vtk_type<RT>(acc_in[id].s0());
78 acc_out[idx + 1] = to_vtk_type<RT>(acc_in[id].s1());
79 acc_out[idx + 2] = to_vtk_type<RT>(acc_in[id].s2());
80 acc_out[idx + 3] = to_vtk_type<RT>(acc_in[id].s3());
81 acc_out[idx + 4] = to_vtk_type<RT>(acc_in[id].s4());
82 acc_out[idx + 5] = to_vtk_type<RT>(acc_in[id].s5());
83 acc_out[idx + 6] = to_vtk_type<RT>(acc_in[id].s6());
84 acc_out[idx + 7] = to_vtk_type<RT>(acc_in[id].s7());
85 }
86
87 if constexpr (n == 16) {
88 acc_out[idx] = to_vtk_type<RT>(acc_in[id].s0());
89 acc_out[idx + 1] = to_vtk_type<RT>(acc_in[id].s1());
90 acc_out[idx + 2] = to_vtk_type<RT>(acc_in[id].s2());
91 acc_out[idx + 3] = to_vtk_type<RT>(acc_in[id].s3());
92 acc_out[idx + 4] = to_vtk_type<RT>(acc_in[id].s4());
93 acc_out[idx + 5] = to_vtk_type<RT>(acc_in[id].s5());
94 acc_out[idx + 6] = to_vtk_type<RT>(acc_in[id].s6());
95 acc_out[idx + 7] = to_vtk_type<RT>(acc_in[id].s7());
96 acc_out[idx + 8] = to_vtk_type<RT>(acc_in[id].s8());
97 acc_out[idx + 9] = to_vtk_type<RT>(acc_in[id].s9());
98 acc_out[idx + 10] = to_vtk_type<RT>(acc_in[id].sA());
99 acc_out[idx + 11] = to_vtk_type<RT>(acc_in[id].sB());
100 acc_out[idx + 12] = to_vtk_type<RT>(acc_in[id].sC());
101 acc_out[idx + 13] = to_vtk_type<RT>(acc_in[id].sD());
102 acc_out[idx + 14] = to_vtk_type<RT>(acc_in[id].sE());
103 acc_out[idx + 15] = to_vtk_type<RT>(acc_in[id].sF());
104 }
105 });
106 });
107
108 return ret;
109 }
110
111} // namespace shamrock::details
std::uint32_t u32
32 bit unsigned integer
std::uint64_t u64
64 bit unsigned integer
void throw_with_loc(std::string message, SourceLocation loc=SourceLocation{})
Throw an exception and append the source location to it.