diff options
Diffstat (limited to 'src/pattern/sss.h')
-rw-r--r-- | src/pattern/sss.h | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/src/pattern/sss.h b/src/pattern/sss.h new file mode 100644 index 0000000..1f1985d --- /dev/null +++ b/src/pattern/sss.h @@ -0,0 +1,63 @@ +#pragma once + +#include "population.h" +#include "propagation.h" + +#include "cuboid.h" +#include "concepts.h" +#include "population.h" + +#include <unistd.h> + +namespace pattern { + +template <concepts::Arithmetic T> +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<T*>( + 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); + } + } + +}; + +} |