From 724c9552e5814edca2e0bfffdd393e2ccfcb6279 Mon Sep 17 00:00:00 2001
From: Martin Bauer <martin.bauer@fau.de>
Date: Thu, 5 Jul 2018 10:04:06 +0200
Subject: [PATCH] EsoTwist field accessor

---
 fieldaccess.py | 44 ++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 44 insertions(+)

diff --git a/fieldaccess.py b/fieldaccess.py
index 95cbc1d5..093ade64 100644
--- a/fieldaccess.py
+++ b/fieldaccess.py
@@ -4,6 +4,12 @@ from lbmpy.stencils import inverse_direction
 from pystencils import Field
 
 
+__all__ = ['PdfFieldAccessor', 'CollideOnlyInplaceAccessor', 'StreamPullTwoFieldsAccessor',
+           'AAEvenTimeStepAccessor', 'AAOddTimeStepAccessor',
+           'EsoTwistEvenTimeStepAccessor', 'EsoTwistOddTimeStepAccessor',
+           'visualize_pdf_field_accessor', 'visualize_field_mapping']
+
+
 # ------------------------------------------------ Interface -----------------------------------------------------------
 from pystencils.astnodes import LoopOverCoordinate
 
@@ -121,6 +127,44 @@ class AAOddTimeStepAccessor(PdfFieldAccessor):
         return [field[d](i) for i, d in enumerate(stencil)]
 
 
+class EsoTwistOddTimeStepAccessor(PdfFieldAccessor):
+    @staticmethod
+    def read(field, stencil):
+        result = []
+        for direction in stencil:
+            inv_dir = inverse_direction(direction)
+            spatial_offset = tuple(max(e, 0) for e in inv_dir)
+            result.append(field[spatial_offset](stencil.index(inv_dir)))
+        return result
+
+    @staticmethod
+    def write(field, stencil):
+        result = []
+        for i, direction in enumerate(stencil):
+            spatial_offset = tuple(max(e, 0) for e in direction)
+            result.append(field[spatial_offset](i))
+        return result
+
+
+class EsoTwistEvenTimeStepAccessor(PdfFieldAccessor):
+    @staticmethod
+    def read(field, stencil):
+        result = []
+        for i, direction in enumerate(stencil):
+            spatial_offset = tuple(max(-e, 0) for e in direction)
+            result.append(field[spatial_offset](i))
+        return result
+
+    @staticmethod
+    def write(field, stencil):
+        result = []
+        for direction in stencil:
+            inv_dir = inverse_direction(direction)
+            spatial_offset = tuple(max(e, 0) for e in direction)
+            result.append(field[spatial_offset](stencil.index(inv_dir)))
+        return result
+
+
 # -------------------------------------------- Visualization -----------------------------------------------------------
 
 
-- 
GitLab