From 01dd680f6a735c5b28f02d4382f3b5121f59cadd Mon Sep 17 00:00:00 2001 From: "Claudius \"keldu\" Holeksa" Date: Thu, 31 Jul 2025 17:55:16 +0200 Subject: Wip --- examples/poiseulle_particles_2d.cpp | 67 ++++++++++++++++++++++++++++++++++++- 1 file changed, 66 insertions(+), 1 deletion(-) (limited to 'examples/poiseulle_particles_2d.cpp') diff --git a/examples/poiseulle_particles_2d.cpp b/examples/poiseulle_particles_2d.cpp index efaf146..80fb889 100644 --- a/examples/poiseulle_particles_2d.cpp +++ b/examples/poiseulle_particles_2d.cpp @@ -309,13 +309,78 @@ void add_particles(kel::lbm::particle_system& part_sys){ } } -void couple_particles_to_lattice(kel::lbm::particle_system& part_sys, saw::data& latt){ +void couple_particles_to_lattice( + kel::lbm::particle_system& part_sys, + saw::data& latt, + saw::data,sch::D2Q9::D>>& macros, + saw::data time_step +){ iterate_over([&](const saw::data>& index){ auto& cell = latt(index); auto& info = cell.template get<"info">(); auto& mask = cell.template get<"particle_mask">(); + for(saw::data i{0u}; i < part_sys.size(); ++i){ + auto& part = part_sys.at(i); + + auto& p_rb = part.template get<"rigid_body">(); + auto& p_pos = p_rb.template get<"position">(); + auto& p_rot = p_rb.template get<"rotation">(); + + auto& p_mask = part.template get<"mask">(); + auto& p_size = part.template get<"size">(); + + // Rotated x-dir + saw::data> x_dir{{ + p_size * saw::data{std::cos(p_rot.get())}, + p_size * saw::data{-std::sin(p_rot.get())} + }}; + + // Rotated y-dir + saw::data> y_dir{{ + p_size * saw::data{std::sin(p_rot.get())}, + p_size * saw::data{std::cos(p_rot.get())} + }}; + // Particle to Fluid Coupling + // Spread force to close fluid cells + iterate_over([&](const saw::data>& index){ + (void)index; + }, {{0u,0u}}, p_mask.dims()); + + // Fluid to Particle Coupling + iterate_over([&](const saw::data>& index){ + saw::data> mask_shift{{ + index.at({0u}) * x_dir.at({0u}) + index.at({0u}) * y_dir.at({0u}), + index.at({1u}) * x_dir.at({1u}) + index.at({1u}) * y_dir.at({1u}) + }}; + + // Lagrange in Euler + auto p_pos_lie = p_pos + mask_shift; + // Cast down to get lower corner. + // Before casting shift by 0.5 for closest pick + saw::data> p_cell_pos {{ + static_cast(mask_shift.at({0u}).get()+0.5), + static_cast(mask_shift.at({1u}).get()+0.5) + }}; + // Interpolate this from close U cells. + // For now pick the closest U + auto& closest_u = macros.at(p_cell_pos).template get<"velocity">(); + auto p_shift = closest_u; + for(saw::data i{0u}; i < 2u; ++i){ + p_shift.at(i) = p_shift.at(i) * time_step; + } + + + + // Add forces to put away from walls + /// 1. Check if neighbour is wall + /// 2. Add force pushing away from wall + + // Add forces to push away from other particles + + }, {{0u,0u}}, p_mask.dims()); + } }, {{0u,0u}}, meta); } -- cgit v1.2.3