#pragma once #include namespace kel { namespace lbm { namespace sch { using namespace saw::schema; template struct Descriptor { static constexpr uint64_t D = DV; static constexpr uint64_t Q = QV; }; template struct Cell { using Descriptor = Desc; static constexpr uint64_t SC = SC_V; static constexpr uint64_t DC = DC_V; static constexpr uint64_t QC = QC_V; static constexpr uint64_t Size = SC + Desc::D * DC + Desc::Q * QC; }; template struct CellField; template struct CellField< Desc, Struct< Member... > >; } template class df_info{}; template class df_info> { public: using Descriptor = sch::Descriptor<1,3>; static constexpr uint64_t D = 1u; static constexpr uint64_t Q = 3u; static constexpr std::array,Q> directions = {{ { 0}, {-1}, { 1} }}; static constexpr std::array::type, Q> weights = { 2./3., 1./6., 1./6. }; static constexpr std::array opposite_index = { 0,2,1 }; static constexpr typename saw::native_data_type::type inv_cs2 = 3.0; static constexpr typename saw::native_data_type::type cs2 = 1./3.; }; /** * D2Q5 Descriptor */ template class df_info> { public: using Descriptor = sch::Descriptor<2,5>; static constexpr uint64_t D = 2u; static constexpr uint64_t Q = 5u; static constexpr std::array, Q> directions = {{ { 0, 0}, {-1, 0}, { 1, 0}, { 0,-1}, { 0, 1}, }}; static constexpr std::array::type,Q> weights = { 1./3., 1./6., 1./6., 1./6., 1./6. }; static constexpr std::array opposite_index = { 0, 2, 1, 4, 3 }; static constexpr typename saw::native_data_type::type inv_cs2 = 3.0; static constexpr typename saw::native_data_type::type cs2 = 1./3.; }; template class df_info> { public: using Descriptor = sch::Descriptor<2,9>; static constexpr uint64_t D = 2u; static constexpr uint64_t Q = 9u; static constexpr std::array, Q> directions = {{ { 0, 0}, {-1, 0}, { 1, 0}, { 0,-1}, { 0, 1}, {-1,-1}, { 1, 1}, {-1, 1}, { 1,-1} }}; static constexpr std::array::type,Q> weights = { 4./9., 1./9., 1./9., 1./9., 1./9., 1./36., 1./36., 1./36., 1./36. }; static constexpr std::array opposite_index = { 0, 2, 1, 4, 3, 6, 5, 8, 7 }; static constexpr typename saw::native_data_type::type inv_cs2 = 3.0; static constexpr typename saw::native_data_type::type cs2 = 1./3.; }; } } namespace saw { template struct meta_schema> { using MetaSchema = schema::Void; using Schema = kel::lbm::sch::Cell; }; template struct meta_schema> { using MetaSchema = schema::FixedArray; using Schema = kel::lbm::sch::CellField; }; template class data, Encode> final { public: using Schema = kel::lbm::sch::Cell; using MetaSchema = typename meta_schema::MetaSchema; private: data, Encode> inner_; public: data() = default; data& operator()(const data& index){ return inner_.at(index); } const data& operator()(const data& index)const{ return inner_.at(index); } }; template class data, Encode> final { public: using Schema = kel::lbm::sch::CellField; using MetaSchema = typename meta_schema::MetaSchema; private: data, Encode> inner_; public: data() = default; data(const data& inner_meta__): inner_{inner_meta__} {} const data meta() const { return inner_.get_dims(); } template data get_dim_size() const { static_assert(i < Desc::D, "Not enough dimensions"); return inner_.template get_dim_size(); } const data& operator()(const data, Encode>& index)const{ return inner_.at(index); } data& operator()(const data, Encode>& index){ return inner_.at(index); } }; }