#include "../c++/descriptor.hpp" #include "../c++/equilibrium.hpp" #include #include namespace kel { namespace lbm { namespace sch { using namespace saw::schema; /** * Basic distribution function * Base type * D * Q * Scalar factor * D factor * Q factor */ using T = Float32; using D2Q5 = Descriptor<2,5>; using D2Q9 = Descriptor<2,9>; template using DfCell = Cell; template using CellInfo = Cell; /** * Basic type for simulation */ template using CellStruct = Struct< Member, "dfs">, Member, "dfs_old">, Member, "info">, Member, Member >; template using MacroStruct = Struct< Member, "velocity">, Member >; using CavityFieldD2Q9 = CellField>; } } } 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(j == 1){ val = 2u; } if(i == 1 || (i+2) == dim_x || (j+2) == dim_y){ val = 3u; } if(i > 1 && (i+2) < dim_x && j > 1 && (j+2) < dim_y){ val = 1u; } if(i == 0 || j == 0 || (i+1) == dim_x || (j+1) == dim_y){ val = 0u; } cell.template get<"info">()(0u).set(val); }, latt); */ } void lbm_step( saw::data& latt, bool even_step ){ using namespace kel::lbm; using dfi = df_info; component coll; coll.relaxation_ = 0.5384; component rho_coll; rho_coll.relaxation_ = 0.5384; rho_coll.rho_ = 1.0; component bb; component bb_lid; bb_lid.lid_vel = {0.1,0.0}; // Collide apply_for_cells([&](auto& cell, std::size_t i, std::size_t j){ auto& df = even_step ? cell.template get<"dfs_old">() : cell.template get<"dfs">(); auto& info = cell.template get<"info">(); auto info_val = info({0u}).get(); switch(info_val){ case 1u: coll.apply(df); break; case 2u: // bb.apply(df); bb_lid.apply(df); break; case 3u: bb.apply(df); break; } }, latt); // Stream for(uint64_t i = 1; (i+1) < latt.template get_dim_size<0>().get(); ++i){ for(uint64_t j = 1; (j+1) < latt.template get_dim_size<1>().get(); ++j){ auto& cell = latt({{i,j}}); auto& df_new = even_step ? cell.template get<"dfs">() : cell.template get<"dfs_old">(); auto& info_new = cell.template get<"info">(); 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_dir_old = latt({{i+dir[0],j+dir[1]}}); auto& df_old = even_step ? cell_dir_old.template get<"dfs_old">() : cell_dir_old.template get<"dfs">(); auto& info_old = cell_dir_old.template get<"info">(); if( info_old({0}).get() == 2u ){ auto& df_old_loc = even_step ? latt({{i,j}}).template get<"dfs_old">() : latt({{i,j}}).template get<"dfs">(); 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 { df_new({k}) = df_old({k}); } } } } } } int main(int argc, char** argv){ using namespace kel::lbm; std::string_view cfg_file_name = "config.json"; if(argc > 1){ cfg_file_name = argv[1]; } auto eo_conf = load_lbm_config>(cfg_file_name); if(eo_conf.is_error()){ auto& err = eo_conf.get_error(); std::cerr<<"[Error]: "< conv{ {conf.template get<"delta_x">()}, {conf.template get<"delta_t">()} }; print_lbm_meta>(conv, {conf.template get<"kinematic_viscosity">()}); saw::data> dim{{128, 128}}; saw::data lattice{dim}; lbm::particle_system> system; /** * Set meta information describing what this cell is */ set_geometry(lattice); uint64_t lattice_steps{128u}; uint64_t print_every{64u}; bool even_step{true}; uint64_t file_num{0u}; saw::data,sch::D2Q9::D>> macros{dim}; for(uint64_t step{0u}; step < lattice_steps; ++step){ lbm_step(lattice, even_step); even_step = not even_step; } return 0; }