#pragma once #include "population.h" #include "propagation.h" #include "cuboid.h" #include "concepts.h" #include "population.h" #include namespace pattern { template class SSS { private: Cuboid _cuboid; T* _base; T* _buffer[population::q]; T* _f[population::q]; public: using value_t = T; SSS(Cuboid cuboid): _cuboid(cuboid) { const std::size_t pagesize = sysconf(_SC_PAGESIZE); const std::ptrdiff_t padding = population::max_offset(_cuboid); _base = static_cast( std::aligned_alloc(pagesize, population::q * (_cuboid.volume() + 2*padding) * sizeof(T))); for (unsigned iPop=0; iPop < population::q; ++iPop) { _buffer[iPop] = _base + iPop * (_cuboid.volume() + 2*padding); _f[iPop] = _buffer[iPop] + padding; } } ~SSS() { delete [] _base; } T* get(unsigned iPop, stage::pre_collision) { return _f[iPop]; } T* get(unsigned iPop, stage::post_collision) { return _f[population::opposite(iPop)]; } void stream() { T* f_old[population::q]; for (unsigned iPop=0; iPop < population::q; ++iPop) { f_old[iPop] = _f[iPop]; } for (unsigned iPop=0; iPop < population::q; ++iPop) { _f[iPop] = f_old[population::opposite(iPop)] - population::offset(_cuboid, iPop); } } }; }