#pragma once #include namespace kel { namespace lbm { namespace sch { using namespace saw::schema; template using ParticleRigidBody = Struct< Member, "position">, Member, "position_old">, Member, "rotation">, Member, "rotation_old">, Member, "acceleration">, Member, "rotational_acceleration"> >; template using ParticleMask = Struct< Member, "grid"> >; template using Particle = Struct< Member, "rigid_body">, Member, "mask"> >; } template class particle_system { private: saw::data> particles_; void verlet_step(saw::data& particle, saw::data time_step_delta){ auto& body = particle.template get<"rigid_body">(); auto& pos = body.template get<"position">(); auto& pos_old = body.template get<"position_old">(); auto& rot = body.template get<"rotation">(); auto& acc = body.template get<"acceleration">(); auto tsd_squared = time_step_delta * time_step_delta; saw::data> pos_new; // Actual step for(uint64_t i = 0u; i < D; ++i){ pos_new.at({i}) = saw::data{2.0} * pos.at({i}) - pos_old.at({i}) + acc.at({i}) * tsd_squared; } pos_old = pos; pos = pos_new; } public: void step(T time_step_delta){ for(auto& iter : particles_){ verlet_step(time_step_delta); } } template void update_particle_border(saw::data& latt){ for(auto& iter : particles_){ } } }; } }