diff --git a/fieldaccess.py b/fieldaccess.py index 95cbc1d5fe51953b93b2f2056b5ed524d49c6f92..093ade644ed5fe601d5664a005ca9d91c1ec72fb 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 -----------------------------------------------------------