From 0ba2bc42e7ffaf71983dc9a8a1c59853c50a2cc2 Mon Sep 17 00:00:00 2001 From: "Claudius \"keldu\" Holeksa" Date: Mon, 14 Aug 2023 03:55:48 +0200 Subject: c++: Going into the area of simple BGK Dynamics --- c++/collide_and_stream.h | 9 ++++++ c++/descriptor.h | 24 ++++++++++++++ c++/examples/cavity_2d.cpp | 80 ++++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 110 insertions(+), 3 deletions(-) create mode 100644 c++/collide_and_stream.h diff --git a/c++/collide_and_stream.h b/c++/collide_and_stream.h new file mode 100644 index 0000000..5682437 --- /dev/null +++ b/c++/collide_and_stream.h @@ -0,0 +1,9 @@ +#pragma once + +namespace kel { +namespace lbm { +class bgk_dynamics { + +}; +} +} diff --git a/c++/descriptor.h b/c++/descriptor.h index c09b312..4d29831 100644 --- a/c++/descriptor.h +++ b/c++/descriptor.h @@ -27,5 +27,29 @@ using CellData = Struct< template using Lattice = Array; } + +template +class df_info{}; + +template +class df_info> { + static constexpr std::array, 5> directions = { + { 0, 0}, + {-1, 0}, + { 0,-1}, + { 0, 1}, + { 1, 0} + }; + + static constexpr std::array,5> weights = { + {1,3}, + {1,6}, + {1,6}, + {1,6}, + {1,6} + }; + + static constexpr std::ratio cs2 = {1,3}; +}; } } diff --git a/c++/examples/cavity_2d.cpp b/c++/examples/cavity_2d.cpp index 0f96a65..e06ba2d 100644 --- a/c++/examples/cavity_2d.cpp +++ b/c++/examples/cavity_2d.cpp @@ -2,6 +2,8 @@ #include +#include + namespace kel { namespace lbm { namespace schema { @@ -31,8 +33,23 @@ using Cell = CellData< } } +constexpr size_t dim_x = 32; +constexpr size_t dim_y = 32; + +struct rectangle { + std::array data_; + + rectangle(size_t x, size_t y, size_t w, size_t h): + data_{x,y,w,h} + {} + + bool inside(size_t i, size_t j) const { + return !(i < data_[0] || i > (data_[0]+data_[2]) || j < data_[1] || j > (data_[1] +data_[3])); + } +}; + template -void apply_for_cells(Func&& func, saw::data, saw::encode::Native>& dat ){ +void apply_for_cells(Func&& func, saw::data>& dat){ for(std::size_t i = 0; i < dat.get_dim_size(0); ++i){ for(std::size_t j = 0; j < dat.get_dim_size(1); ++j){ func(dat.at(i,j), i, j); @@ -40,14 +57,71 @@ void apply_for_cells(Func&& func, saw::data, saw } } +void set_geometry(saw::data>& latt){ + using namespace kel::lbm; + apply_for_cells([](auto& cell, std::size_t i, std::size_t j){ + uint8_t val = 0; + if(i == 1){ + val = 2; + } + if(j == 1 || (i+2) == dim_x || (j+2) == dim_y){ + val = 3; + } + if(i == 0 || j == 0 || (i+1) == dim_x || (j+1) == dim_y){ + val = 1; + } + cell.template get<"info">().at(0).set(val); + }, latt); +} + +void set_initial_conditions(saw::data>& latt){ + using namespace kel::lbm; + apply_for_cells([](auto& cell, std::size_t i, std::size_t j){ + cell.template get<"dfs">().at(0).set(1.0); + }, latt); +} + int main(){ using namespace kel::lbm; - saw::data, saw::encode::Native> lattice{512, 512}; + saw::data, saw::encode::Native> lattice{dim_x, dim_y}; + + /** + * Set meta information describing what this cell is + */ + set_geometry(lattice); + /** + * + */ + set_initial_conditions(lattice); + /** + * Print basic setup info + */ apply_for_cells([](auto& cell, std::size_t i, std::size_t j){ - // cell.get<"info">(); + // Not needed + (void) i; + std::cout<(cell.template get<"info">().at(0).get()); + if( (j+1) < dim_y){ + std::cout<<" "; + }else{ + std::cout<<"\n"; + } }, lattice); + + std::cout<<"\n"; + apply_for_cells([](auto& cell, std::size_t i, std::size_t j){ + // Not needed + (void) i; + std::cout<().at(0).get(); + if( (j+1) < dim_y){ + std::cout<<" "; + }else{ + std::cout<<"\n"; + } + }, lattice); + + std::cout<