summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClaudius "keldu" Holeksa <mail@keldu.de>2026-02-11 17:28:23 +0100
committerClaudius "keldu" Holeksa <mail@keldu.de>2026-02-11 17:28:23 +0100
commit3e7f672b35f4a2196be8f27d35ef527eec79179d (patch)
tree58d09a5937c4d0d471bbd17a1b07f52e4d5cf410
parent595cdfd51594af7cee4258a1ed92b06c6bf0171d (diff)
downloadlibs-lbm-3e7f672b35f4a2196be8f27d35ef527eec79179d.tar.gz
Too lazy to ammend last commit. Moving to particle based HLBM and
others. Also implemented rotational movement properly now
-rw-r--r--default.nix2
-rw-r--r--examples/poiseulle_particles_2d_gpu/sim.cpp83
-rw-r--r--shell.nix18
3 files changed, 78 insertions, 25 deletions
diff --git a/default.nix b/default.nix
index 7c19841..706c48f 100644
--- a/default.nix
+++ b/default.nix
@@ -68,7 +68,7 @@ let
src = builtins.fetchurl {
url = "https://git.keldu.de/forstio-forstio/snapshot/master.tar.gz";
- sha256 = "e91c18fef798dd7b3afbd1615c2e320b90d74aa2d7ef726801a76e3f7f77ae81";
+ sha256 = "sha256:10dffxzkyvm705l75vypl95dg40b68p5qqfizcx7ppcqyzz1h779";
};
phases = [ "unpackPhase" "installPhase" ];
diff --git a/examples/poiseulle_particles_2d_gpu/sim.cpp b/examples/poiseulle_particles_2d_gpu/sim.cpp
index 0ad1b61..691ec93 100644
--- a/examples/poiseulle_particles_2d_gpu/sim.cpp
+++ b/examples/poiseulle_particles_2d_gpu/sim.cpp
@@ -1,5 +1,6 @@
#include <kel/lbm/sycl/lbm.hpp>
#include <kel/lbm/lbm.hpp>
+#include <kel/lbm/particle.hpp>
#include <forstio/io/io.hpp>
#include <forstio/remote/filesystem/easy.hpp>
@@ -9,8 +10,9 @@
namespace kel {
namespace lbm {
-constexpr uint64_t dim_x = 1024u;
-constexpr uint64_t dim_y = 512u;
+constexpr uint64_t dim_x = 1024ul;
+constexpr uint64_t dim_y = 512ul;
+constexpr uint64_t particle_size = 128ul;
namespace sch {
using namespace saw::schema;
@@ -21,10 +23,15 @@ template<typename T, typename Desc>
using DfChunk = Chunk<FixedArray<T,Desc::Q>, 1u, dim_x, dim_y>;
template<typename T, typename Desc>
+using ScalarChunk = Chunk<Scalar<T>, 0u, dim_x, dim_y>;
+
+template<typename T, typename Desc>
using ChunkStruct = Struct<
Member<InfoChunk, "info">,
Member<DfChunk<T,Desc>, "dfs">,
- Member<DfChunk<T,Desc>, "dfs_old">
+ Member<DfChunk<T,Desc>, "dfs_old">,
+ Member<ScalarChunk<T,Desc>, "particle_N">,
+ Member<ScalarChunk<T,Desc>, "particle_D">
>;
template<typename T, typename Desc>
@@ -36,17 +43,21 @@ using RhoChunk = Chunk<Scalar<T>, 0u, dim_x, dim_y>;
template<typename T, typename Desc>
using MacroStruct = Struct<
Member<VelChunk<T,Desc>, "velocity">,
- Member<RhoChunk<T>, "density">
+ Member<RhoChunk<T>, "density">,
+ Member<ScalarChunk<T,Desc>, "porosity">
>;
-// template<typename T, typename Desc>
-// using Particles = Particle<
+//template<typename T, typename Desc>
+//using ParticleArray = Array<
+// Particle<T,Desc::D>
+//>;
}
template<typename T, typename Desc>
saw::error_or<void> setup_initial_conditions(
saw::data<sch::ChunkStruct<T,Desc>>& fields,
- saw::data<sch::MacroStruct<T,Desc>>& macros
+ saw::data<sch::MacroStruct<T,Desc>>& macros,
+ saw::data<sch::FixedArray<sch::Particle<T,Desc::D>, particle_size>>& particles
){
auto& info_f = fields.template get<"info">();
// Set everything as walls
@@ -122,6 +133,10 @@ saw::error_or<void> setup_initial_conditions(
{{1u,1u}}
);
+ for(saw::data<sch::UInt64> i{0u}; i < saw::data<sch::UInt64>{particle_size}; ++i){
+ auto& part = particles.at(i);
+ }
+
return saw::make_void();
}
@@ -138,7 +153,7 @@ saw::error_or<void> step(
// auto coll_ev =
q.submit([&](acpp::sycl::handler& h){
// Need nicer things to handle the flow. I see improvement here
- component<T,Desc,cmpt::BGK,encode::Sycl<saw::encode::Native>> collision{0.6};
+ component<T,Desc,cmpt::HLBM,encode::Sycl<saw::encode::Native>> collision{0.6};
component<T,Desc,cmpt::BounceBack,encode::Sycl<saw::encode::Native>> bb;
saw::data<sch::Scalar<T>> rho_b;
@@ -232,8 +247,17 @@ saw::error_or<void> lbm_main(int argc, char** argv){
return std::move(eo_lbm_dir.get_error());
}
auto& lbm_dir = eo_lbm_dir.get_value();
+
auto out_dir = lbm_dir / "poiseulle_particles_2d_gpu";
+ {
+ std::error_code ec;
+ std::filesystem::create_directories(out_dir,ec);
+ if(ec != std::errc{}){
+ return saw::make_error<saw::err::critical>("Could not create output directory");
+ }
+ }
+
converter<sch::Float64> conv {
// delta_x
{{1.0}},
@@ -244,6 +268,7 @@ saw::error_or<void> lbm_main(int argc, char** argv){
// saw::data<sch::FixedArray<sch::UInt64,Desc::D>> meta{{dim_x,dim_y}};
auto lbm_data_ptr = saw::heap<saw::data<sch::ChunkStruct<T,Desc>>>();
auto lbm_macro_data_ptr = saw::heap<saw::data<sch::MacroStruct<T,Desc>>>();
+ auto lbm_particle_data_ptr = saw::heap<saw::data<sch::FixedArray<sch::Particle<T,Desc::D>, particle_size>>>();
auto eo_aio = saw::setup_async_io();
if(eo_aio.is_error()){
@@ -267,7 +292,7 @@ saw::error_or<void> lbm_main(int argc, char** argv){
sycl_q.wait();
{
- auto eov = setup_initial_conditions<T,Desc>(*lbm_data_ptr,*lbm_macro_data_ptr);
+ auto eov = setup_initial_conditions<T,Desc>(*lbm_data_ptr,*lbm_macro_data_ptr,*lbm_particle_data_ptr);
if(eov.is_error()){
return eov;
}
@@ -275,7 +300,9 @@ saw::error_or<void> lbm_main(int argc, char** argv){
saw::data<sch::ChunkStruct<T,Desc>, encode::Sycl<saw::encode::Native>> lbm_sycl_data{sycl_q};
saw::data<sch::MacroStruct<T,Desc>, encode::Sycl<saw::encode::Native>> lbm_sycl_macro_data{sycl_q};
+ saw::data<sch::FixedArray<sch::Particle<T,Desc::D>, particle_size>, encode::Sycl<saw::encode::Native>> lbm_sycl_particle_data{sycl_q};
sycl_q.wait();
+
auto lsd_view = make_chunk_struct_view(lbm_sycl_data);
auto lsdm_view = make_chunk_struct_view(lbm_sycl_macro_data);
{
@@ -290,33 +317,41 @@ saw::error_or<void> lbm_main(int argc, char** argv){
return eov;
}
}
+ {
+ auto eov = dev.copy_to_device(*lbm_particle_data_ptr,lbm_sycl_particle_data);
+ if(eov.is_error()){
+ return eov;
+ }
+ }
sycl_q.wait();
- saw::data<sch::UInt64> time_steps{4096ul};
+ saw::data<sch::UInt64> time_steps{particle_size};
for(saw::data<sch::UInt64> i{0u}; i < time_steps and krun; ++i){
{
- std::string file_name = "tmp/t_";
- file_name += std::to_string(i.get());
- file_name += ".vtk";
-
{
- auto eov = write_vtk_file(file_name, *lbm_macro_data_ptr);
+ std::string file_name = "t_";
+ file_name += std::to_string(i.get());
+ file_name += ".vtk";
+ auto eov = write_vtk_file(out_dir/file_name, *lbm_macro_data_ptr);
if(eov.is_error()){
return eov;
}
}
- {
- auto eov = saw::easy::encode_and_write_file<sch::ChunkStruct<T,Desc>,saw::encode::KelSimple>(file_name, *lbm_macro_data_ptr);
+ /*{
+ std::string file_name = "p_";
+ file_name += std::to_string(i.get());
+ file_name += ".json";
+ auto eov = saw::easy::encode_and_write_file<sch::FixedArray<sch::Particle<T,Desc::D>,particle_size>,saw::encode::Json>(out_dir, *lbm_particle_data_ptr);
if(eov.is_error()){
return eov;
}
- }
+ }*/
}
{
- std::string file_name = "tmp/df_";
+ std::string file_name = "df_";
file_name += std::to_string(i.get());
file_name += ".vtk";
- auto eov = write_vtk_file(file_name, *lbm_data_ptr);
+ auto eov = write_vtk_file(out_dir/file_name, *lbm_data_ptr);
if(eov.is_error()){
return eov;
}
@@ -348,19 +383,19 @@ saw::error_or<void> lbm_main(int argc, char** argv){
}
sycl_q.wait();
{
- std::string file_name = "tmp/t_";
+ std::string file_name = "t_";
file_name += std::to_string(time_steps.get());
file_name += ".vtk";
- auto eov = write_vtk_file(file_name, *lbm_macro_data_ptr);
+ auto eov = write_vtk_file(out_dir/file_name, *lbm_macro_data_ptr);
if(eov.is_error()){
return eov;
}
}
{
- std::string file_name = "tmp/df_";
+ std::string file_name = "df_";
file_name += std::to_string(time_steps.get());
file_name += ".vtk";
- auto eov = write_vtk_file(file_name, *lbm_data_ptr);
+ auto eov = write_vtk_file(out_dir/file_name, *lbm_data_ptr);
if(eov.is_error()){
return eov;
}
diff --git a/shell.nix b/shell.nix
new file mode 100644
index 0000000..0c22e94
--- /dev/null
+++ b/shell.nix
@@ -0,0 +1,18 @@
+{ pkgs ? import <nixpkgs> {}
+, ...
+}:
+
+pkgs.mkShell {
+ buildInputs = [
+ pkgs.scons
+ pkgs.clang
+ pkgs.clang-tools
+ ];
+
+ shellHook = ''
+ if [ ! -f compile_commands.json ]; then
+ printf "Generating compile_commands.json...\n"
+ scons cdb
+ fi
+ '';
+}