#pragma once #include "component.hpp" #include "equilibrium.hpp" namespace kel { namespace lbm { namespace cmpt { struct BGK {}; } template class component { private: typename saw::native_data_type::type relaxation_; public: component(typename saw::native_data_type::type relaxation__): relaxation_{relaxation__} {} using Component = cmpt::BGK; /** * Thoughts regarding automating order setup */ using access = cmpt::access_tuple< cmpt::access<"dfs", 1, true, true, true> >; /** * Thoughts regarding automating order setup */ static constexpr saw::string_literal name = "collision"; static constexpr saw::string_literal after = ""; static constexpr saw::string_literal before = "streaming"; /** * Raw setup */ template void apply(saw::data& field, saw::data> index, uint64_t time_step){ bool is_even = ((time_step % 2) == 0); auto& cell = field(index); auto& dfs_old = is_even ? cell.template get<"dfs_old">() : cell.template get<"dfs">(); auto& dfs = (!is_even) ? cell.template get<"dfs_old">() : cell.template get<"dfs">(); saw::data rho; saw::data> vel; compute_rho_u(dfs,rho,vel); auto eq = equilibrium(rho,vel); for(uint64_t i = 0u; i < Descriptor::Q; ++i){ dfs_old({i}).set(dfs_old({i}).get() + (1.0 / relaxation_) * (eq.at(i).get() - dfs_old({i}).get())); } } }; } }