From da656e3333ca98be9e80dbc63640598a392186f9 Mon Sep 17 00:00:00 2001 From: "Claudius \"keldu\" Holeksa" Date: Fri, 23 Jan 2026 12:43:57 +0100 Subject: Dangling changes and address boundary errors --- .nix/badchimp.nix | 12 +++++ examples/poiseulle_particles_2d_gpu/sim.cpp | 8 +-- lib/core/c++/chunk.hpp | 2 +- lib/sycl/c++/data.hpp | 72 ++++++++------------------- vtk_to_png.py | 75 +++++++++++++++++++++++++++++ 5 files changed, 109 insertions(+), 60 deletions(-) create mode 100644 .nix/badchimp.nix create mode 100644 vtk_to_png.py diff --git a/.nix/badchimp.nix b/.nix/badchimp.nix new file mode 100644 index 0000000..f747ffe --- /dev/null +++ b/.nix/badchimp.nix @@ -0,0 +1,12 @@ +{ lib +, stdenv +, fetchFromGitHub +}: + +stdenv.mkDerivation { + pname = "BadChimp"; + version = "0.0.0"; + + src = fetchFromGitHub { + }; +} diff --git a/examples/poiseulle_particles_2d_gpu/sim.cpp b/examples/poiseulle_particles_2d_gpu/sim.cpp index 9646b0a..ad60813 100644 --- a/examples/poiseulle_particles_2d_gpu/sim.cpp +++ b/examples/poiseulle_particles_2d_gpu/sim.cpp @@ -140,13 +140,7 @@ saw::error_or lbm_main(int argc, char** argv){ } } - saw::data, encode::Sycl> lbm_sycl_data; - { - auto eov = dev.allocate_on_device(lbm_sycl_data); - if(eov.is_error()){ - return eov; - } - } + saw::data, encode::Sycl> lbm_sycl_data{sycl_q}; { auto eov = dev.copy_to_device(lbm_data,lbm_sycl_data); if(eov.is_error()){ diff --git a/lib/core/c++/chunk.hpp b/lib/core/c++/chunk.hpp index 6b028ba..1da2c9f 100644 --- a/lib/core/c++/chunk.hpp +++ b/lib/core/c++/chunk.hpp @@ -81,7 +81,7 @@ public: } static constexpr auto flat_size() { - return data::flat_size(); + return data::flat_dims(); } }; diff --git a/lib/sycl/c++/data.hpp b/lib/sycl/c++/data.hpp index d9976dd..c6ea281 100644 --- a/lib/sycl/c++/data.hpp +++ b/lib/sycl/c++/data.hpp @@ -1,5 +1,3 @@ -#pragma once - #include "common.hpp" #include @@ -35,7 +33,7 @@ public: q_{&q__}, values_{nullptr} { - values_ = acpp::sycl::malloc>(ct_multiply::value,q_); + values_ = acpp::sycl::malloc_device>(ct_multiply::value,*q_); } ~data(){ @@ -43,7 +41,7 @@ public: return; } - acpp::sycl::free(values_,q_); + acpp::sycl::free(values_,*q_); } static constexpr data> get_dims() { @@ -127,10 +125,20 @@ private: * Do it here by specializing. */ StorageT members_; + + template + constexpr data(acpp::sycl::queue& q, std::index_sequence): + members_{(static_cast(Is), q)...} + { + + } public: data(acpp::sycl::queue& q__): - members_{{data,kel::lbm::encode::Sycl>{q__}...}} - {} + data{q__, std::make_index_sequence{}} +// members_(q__)//data,kel::lbm::encode::Sycl>(q__)...) + { + q__.wait(); + } template auto& get(){ @@ -144,37 +152,6 @@ public: namespace kel { namespace lbm { namespace impl { -template -struct sycl_malloc_struct_helper; - -template -struct sycl_malloc_struct_helper, Encode> final { - using Schema = sch::Struct; - - template - static saw::error_or allocate_on_device_member(typename saw::data>::StorageT& storage, sycl::queue& q){ - if constexpr (i < sizeof...(Members)){ - using M = typename saw::parameter_pack_type::type; - auto& ptr = std::get(storage); - - ptr = sycl::malloc_device(1u,q); - - return allocate_on_device_member(storage,q); - } - - return saw::make_void(); - } - - static saw::error_or allocate_on_device(saw::data>& sycl_data, sycl::queue& q){ - typename saw::data>::StorageT storage; - - auto eov = allocate_on_device_member<0u>(storage,q); - sycl_data = {storage, q}; - - return eov; - } -}; - template struct sycl_copy_helper; @@ -186,13 +163,13 @@ struct sycl_copy_helper, Encode> final { static saw::error_or copy_to_device_member(saw::data& host_data, saw::data>& sycl_data, sycl::queue& q){ if constexpr (i < sizeof...(Members)){ using M = typename saw::parameter_pack_type::type; - auto& host_member_data = host_data.template get(); - auto& sycl_member_data = sycl_data.template get(); + auto& host_member_data = host_data.template get(); + auto& sycl_member_data = sycl_data.template get(); auto host_ptr = host_member_data.flat_data(); auto sycl_ptr = sycl_member_data.flat_data(); - q.memcpy(host_ptr, sycl_ptr, sizeof(std::decay_t) * host_member_data.flat_size() ); + q.memcpy(host_ptr, sycl_ptr, sizeof(std::decay_t) * host_member_data.flat_size().get() ); return copy_to_device_member(host_data,sycl_data,q); } @@ -209,13 +186,13 @@ struct sycl_copy_helper, Encode> final { static saw::error_or copy_to_host_member(saw::data>& sycl_data, saw::data& host_data, sycl::queue& q){ if constexpr (i < sizeof...(Members)){ using M = typename saw::parameter_pack_type::type; - auto& host_member_data = host_data.template get(); - auto& sycl_member_data = sycl_data.template get(); + auto& host_member_data = host_data.template get(); + auto& sycl_member_data = sycl_data.template get(); auto host_ptr = host_member_data.flat_data(); auto sycl_ptr = sycl_member_data.flat_data(); - q.memcpy(sycl_ptr, host_ptr, sizeof(std::decay_t) * host_member_data.flat_size() ); + q.memcpy(sycl_ptr, host_ptr, sizeof(std::decay_t) * host_member_data.flat_size().get() ); return copy_to_host_member(sycl_data,host_data,q); } @@ -239,15 +216,6 @@ public: device() = default; ~device() = default; - template - saw::error_or allocate_on_device(saw::data>& sycl_data){ - auto eov = impl::sycl_malloc_struct_helper::allocate_on_device(sycl_data, q_); - if(eov.is_error()){ - return eov; - } - return saw::make_void(); - } - template saw::error_or copy_to_device(saw::data& host_data, saw::data>& sycl_data){ return impl::sycl_copy_helper::copy_to_device(host_data, sycl_data, q_); diff --git a/vtk_to_png.py b/vtk_to_png.py new file mode 100644 index 0000000..9c3f4f3 --- /dev/null +++ b/vtk_to_png.py @@ -0,0 +1,75 @@ +import vtk +import glob +import os + +vtk_files = sorted(glob.glob("*.vtk")) +output_dir = "frames" +os.makedirs(output_dir, exist_ok=True) + +renderer = vtk.vtkRenderer() +render_window = vtk.vtkRenderWindow() +render_window.SetOffScreenRendering(1) +render_window.SetSize(1024, 512) +render_window.AddRenderer(renderer) + +renderer.SetBackground(1, 1, 1) + +camera_initialized = False + +for i, vtk_file in enumerate(vtk_files): + reader = vtk.vtkStructuredPointsReader() + reader.SetFileName(vtk_file) + reader.Update() + + image = reader.GetOutput() + + mag = vtk.vtkImageMagnitude(); + mag.SetInputData(image); + mag.Update(); + image = mag.GetOutput(); + scalar_name = "Velocity magnitude"; + + scalars = image.GetPointData().GetScalars() + if scalars is None: + raise RuntimeError("No scalar data found") + + vmin, vmax = scalars.GetRange() + + # Image slice mapper (2D!) + slice_mapper = vtk.vtkImageSliceMapper() + slice_mapper.SetInputData(image) + + # Pick the only slice (or middle if dimension >1) + extent = image.GetExtent() + slice_mapper.SetSliceNumber(extent[4]) # Z slice + + slice_actor = vtk.vtkImageSlice() + slice_actor.SetMapper(slice_mapper) + + # Grayscale mapping + prop = slice_actor.GetProperty() + prop.SetColorWindow(vmax - vmin) + prop.SetColorLevel(0.5 * (vmax + vmin)) + + renderer.RemoveAllViewProps() + renderer.AddViewProp(slice_actor) + + if not camera_initialized: + renderer.ResetCamera() + camera_initialized = True + + render_window.Render() + + # Capture to PNG + w2i = vtk.vtkWindowToImageFilter() + w2i.SetInput(render_window) + w2i.ReadFrontBufferOff() + w2i.Update() + + writer = vtk.vtkPNGWriter() + writer.SetFileName(f"{output_dir}/frame_{i:04d}.png") + writer.SetInputConnection(w2i.GetOutputPort()) + writer.Write() + + print(f"Saved frame {i} range=({vmin},{vmax})") + -- cgit v1.2.3