summaryrefslogtreecommitdiff
path: root/src/pattern/sss.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/pattern/sss.h')
-rw-r--r--src/pattern/sss.h63
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);
+ }
+ }
+
+};
+
+}