diff options
-rw-r--r-- | c++/descriptor.hpp | 21 | ||||
-rw-r--r-- | c++/examples/cavity_2d.cpp | 21 | ||||
-rw-r--r-- | tests/equilibrium.cpp | 2 |
3 files changed, 23 insertions, 21 deletions
diff --git a/c++/descriptor.hpp b/c++/descriptor.hpp index 376e733..1228e10 100644 --- a/c++/descriptor.hpp +++ b/c++/descriptor.hpp @@ -23,13 +23,13 @@ struct Cell { }; template<typename Desc, typename Cell> -struct CellFields; +struct CellField; template<typename Desc, typename... CellFieldTypes, saw::string_literal... CellFieldNames> -struct CellFields< +struct CellField< Desc, Struct< - Member<Array<CellFieldTypes,Desc::D>, CellFieldNames>... + Member<CellFieldTypes, CellFieldNames>... > >; @@ -163,9 +163,9 @@ struct meta_schema<kel::lbm::sch::Cell<T,Desc,S,D,Q>> { }; template<typename Desc, typename CellT> -struct meta_schema<kel::lbm::sch::CellFields<Desc, CellT>> { +struct meta_schema<kel::lbm::sch::CellField<Desc, CellT>> { using MetaSchema = schema::FixedArray<schema::UInt64,Desc::D>; - using Schema = kel::lbm::sch::CellFields<Desc, CellT>; + using Schema = kel::lbm::sch::CellField<Desc, CellT>; }; template<typename Sch, typename Desc, uint64_t S, uint64_t D, uint64_t Q, typename Encode> @@ -187,13 +187,12 @@ public: }; template<typename Desc, typename CellT, typename Encode> -class data<kel::lbm::sch::CellFields<Desc, CellT>, Encode> final { +class data<kel::lbm::sch::CellField<Desc, CellT>, Encode> final { public: - using Schema = kel::lbm::sch::CellFields<Desc,CellT>; + using Schema = kel::lbm::sch::CellField<Desc,CellT>; using MetaSchema = typename meta_schema<Schema>::MetaSchema; private: - data<CellT, Encode> inner_; - data<MetaSchema, Encode> inner_meta_; + data<schema::Array<CellT,Desc::D>, Encode> inner_; public: data() = default; data(const data<MetaSchema,Encode>& inner_meta__): @@ -201,6 +200,10 @@ public: inner_meta_{inner_meta__} {} + const data<MetaSchema, Encode>& meta() const { + return inner_.dims(); + } + template<uint64_t i> data<schema::UInt64,Encode> get_dim_size() const { static_assert(i < Desc::D, "Not enough dimensions"); diff --git a/c++/examples/cavity_2d.cpp b/c++/examples/cavity_2d.cpp index f93bc64..49f47cd 100644 --- a/c++/examples/cavity_2d.cpp +++ b/c++/examples/cavity_2d.cpp @@ -37,8 +37,8 @@ using CellInfo = Cell<UInt8, D2Q9, 1, 0, 0>; */ template<typename Desc> using CellStruct = Struct< - Member<Array<DfCell<Desc>,Desc::D>, "dfs">, - Member<Array<CellInfo<Desc>,Desc::D>, "info"> + Member<DfCell<Desc>, "dfs">, + Member<CellInfo<Desc>, "info"> >; @@ -243,11 +243,11 @@ constexpr size_t dim_y = 256; template<typename Func> void apply_for_cells(Func&& func, saw::data<kel::lbm::sch::CavityFieldD2Q9>& dat){ - for(std::size_t i = 0; i < dat.template get_dim_size<1u>().get(); ++i){ - for(std::size_t j = 0; j < dat.template get_dim_size<0u>().get(); ++j){ + for(std::size_t i = 0; i < dat.meta().at({1u}).get(); ++i){ + for(std::size_t j = 0; j < dat.meta().at({0u}).get(); ++j){ saw::data<saw::schema::UInt64> di{i}; saw::data<saw::schema::UInt64> dj{j}; - auto& cell_v = dat({{dj,di}}); + auto& cell_v = dat.template get<"dfs">().at({{dj,di}}); func(cell_v, j, i); } } @@ -350,19 +350,18 @@ void lbm_step( // Stream for(uint64_t i = 1; (i+1) < old_latt.template get_dim_size<0>().get(); ++i){ for(uint64_t j = 1; (j+1) < old_latt.template get_dim_size<1>().get(); ++j){ - auto& df_new = new_latt.template get<"dfs">()({{i,j}}); - auto& info_new = new_latt.template get<"info">()({{i,j}}); + auto& df_new = new_latt.template get<"dfs">().at({{i,j}}); + auto& info_new = new_latt.template get<"info">().at({{i,j}}); if(info_new({0u}).get() > 0u && info_new({0u}).get() != 2u){ for(uint64_t k = 0u; k < sch::D2Q9::Q; ++k){ auto dir = dfi::directions[dfi::opposite_index[k]]; - auto& cell_old = old_latt({{i+dir[0],j+dir[1]}}); - auto& df_old = cell_old.template get<"dfs">(); - auto& info_old = cell_old.template get<"info">(); + auto& df_old = old_latt.template get<"dfs">().at({{i+dir[0],j+dir[1]}}); + auto& info_old = old_latt.template get<"info">().at({{i+dir[0],j+dir[1]}}); if( info_old({0}).get() == 2u ){ - auto& df_old_loc = old_latt({{i,j}}).template get<"dfs">(); + auto& df_old_loc = old_latt.template get<"dfs">().at({{i,j}}); df_new({k}) = df_old_loc({dfi::opposite_index.at(k)}) - 2.0 * dfi::inv_cs2 * dfi::weights.at(k) * 1.0 * ( bb_lid.lid_vel[0] * dir[0] + bb_lid.lid_vel[1] * dir[1]); // dfs({dfi::opposite_index.at(i)}) = dfs_cpy({i}) - 2.0 * dfi::weights[i] * 1.0 * ( lid_vel[0] * dfi::directions[i][0] + lid_vel[1] * dfi::directions[i][1]) * dfi::inv_cs2; } else { diff --git a/tests/equilibrium.cpp b/tests/equilibrium.cpp index 88542d2..bb26dd0 100644 --- a/tests/equilibrium.cpp +++ b/tests/equilibrium.cpp @@ -23,7 +23,7 @@ void check_equilibrium(){ } } -SAW_TEST("Equilibrium At rest D1Q3"){ +SAW_TEST("Equilibrium at rest D1Q3"){ using namespace kel; check_equilibrium<lbm::sch::Descriptor<1,3>>(); } |