#pragma once #include "../particle.hpp" namespace kel { namespace lbm { template class particle_circle_geometry { private: public: particle_circle_geometry() {} template saw::data> generate_mask(uint64_t resolution, uint64_t boundary_nodes = 0) const { saw::data> mask; auto& grid = mask.template get<"grid">(); //uint64_t rad_i = static_cast(resolution * radius_.get())+1u; uint64_t rad_i = resolution; uint64_t size = rad_i + 2*boundary_nodes; grid = {{{size,size}}}; saw::data delta_x{2.0 / rad_i}; saw::data center = (saw::data{1.0} + saw::data{2.0} * saw::data{static_cast::type>(boundary_nodes)/rad_i}); for(uint64_t i = 0; i < size; ++i){ for(uint64_t j = 0; j < size; ++j){ grid.at({{i,j}}).set(0); if(i >= boundary_nodes and j >= boundary_nodes and i < (rad_i + boundary_nodes) and j < (rad_i + boundary_nodes) ){ saw::data fi = saw::data{0.5+static_cast::type>(i)} * delta_x - center; saw::data fj = saw::data{0.5+static_cast::type>(j)} * delta_x - center; auto norm_f_ij = fi*fi + fj*fj; if(norm_f_ij.get() <= 1){ grid.at({{i,j}}).set(1); } } } } return mask; } }; } }