#pragma once #include "common.hpp" #include "schema.hpp" namespace kel { namespace lbm { template class particle_aabb final { static_assert(saw::always_false, "Not supported"); }; template class particle_aabb< sch::ParticleGroup> > final { public: using Schema = sch::ParticleGroup>; using AABB = sch::Struct< sch::Member,"a">, sch::Member,"b"> >; public: template static constexpr saw::data calculate(const saw::data& p_grp, const saw::data>& i, const saw::data>& meta){ saw::data aabb; auto& parts = p_grp.template get<"particles">(); auto& pi = parts.at(i); auto& pirb = pi.template get<"rigid_body">(); auto& pirb_pos = pirb.template get<"position">(); auto& a = aabb.template get<"a">(); auto& b = aabb.template get<"b">(); const saw::data>& rad_d = p_grp.template get<"collision">().template get<"radius">().at({0u}); saw::data> lower; saw::data> upper; for(uint64_t i{0u}; i < D; ++i){ lower.at({{i}}) = pirb_pos.at({{i}}) >= rad_d.at({}) ? (pirb_pos.at({{i}}) - rad_d.at({})) : saw::data{0}; a.at({i}) = lower.at({{i}}).template cast_to(); upper.at({{i}}) = pirb_pos.at({{i}}) + rad_d.at({}); b.at({i}) = (upper.at({{i}})+saw::data{1}).template cast_to(); } return aabb; } }; } }