diff options
Diffstat (limited to 'boltzgen/kernel')
| -rw-r--r-- | boltzgen/kernel/generator.py | 47 | ||||
| -rw-r--r-- | boltzgen/kernel/target/__init__.py | 2 | ||||
| -rw-r--r-- | boltzgen/kernel/target/index.py (renamed from boltzgen/kernel/target/cell_index.py) | 6 | ||||
| -rw-r--r-- | boltzgen/kernel/target/layout/AOS.py | 6 | ||||
| -rw-r--r-- | boltzgen/kernel/target/layout/SOA.py | 6 | 
5 files changed, 32 insertions, 35 deletions
diff --git a/boltzgen/kernel/generator.py b/boltzgen/kernel/generator.py index da32a76..b2a632c 100644 --- a/boltzgen/kernel/generator.py +++ b/boltzgen/kernel/generator.py @@ -3,23 +3,36 @@ import sympy  from mako.template import Template  from pathlib import Path -import boltzgen.kernel.target +from . import target  class Generator: -    def __init__(self, descriptor, moments, collision): +    def __init__(self, descriptor, moments, collision, language, precision, index, layout):          self.descriptor = descriptor          self.moments    = moments          self.collision  = collision +        self.target     = language +        self.float_type = eval("target.precision.%s" % language).get_float_type(precision) -    def instantiate(self, target, template, float_type, layout_impl, geometry, extras = []): -        template_path = Path(__file__).parent/("template/%s.%s.mako" % (template, target)) +        try: +            self.index_impl = eval("target.index.%s" % index) +        except AttributeError: +            raise Exception("There is no cell indexing scheme '%s'" % index) from None + +        try: +            self.layout_impl = eval("target.layout.%s" % layout) +        except AttributeError: +            raise Exception("There is no layout '%s'" % layout) from None + +    def instantiate(self, template, geometry, extras = []): +        template_path = Path(__file__).parent/("template/%s.%s.mako" % (template, self.target))          if not template_path.exists(): -            raise Exception("Target '%s' doesn't provide '%s'" % (target, template)) +            raise Exception("Target '%s' doesn't provide '%s'" % (self.target, template))          return Template(filename = str(template_path)).render(              descriptor = self.descriptor,              geometry   = geometry, -            layout     = layout_impl, +            index      = self.index_impl(geometry), +            layout     = self.layout_impl(self.descriptor, self.index_impl, geometry),              moments_subexpr    = self.moments[0],              moments_assignment = self.moments[1], @@ -27,29 +40,13 @@ class Generator:              collision_assignment = self.collision[1],              ccode = sympy.ccode, -            float_type = float_type, +            float_type = self.float_type,              extras = extras          ) -    def kernel(self, target, precision, layout, cell_index, geometry, functions, extras = []): -        cell_index_impl = eval("boltzgen.kernel.target.cell_index.%s" % cell_index) -        if cell_index_impl is None: -            raise Exception("There is no cell indexing scheme '%s'" % (target, layout)) -        else: -            cell_index_impl = cell_index_impl(geometry) - -        layout_impl = eval("boltzgen.kernel.target.layout.%s" % layout) -        if layout_impl is None: -            raise Exception("There is no layout '%s'" % (target, layout)) -        else: -            layout_impl = layout_impl(self.descriptor, cell_index_impl, geometry) - +    def kernel(self, geometry, functions, extras = []):          if geometry.dimension() != self.descriptor.d:              raise Exception('Geometry dimension must match descriptor dimension') -        float_type = eval("boltzgen.kernel.target.precision.%s" % target).get_float_type(precision) - -        return "\n".join(map( -            lambda f: self.instantiate(target, f, float_type, layout_impl, geometry, extras), -            functions)) +        return "\n".join(map(lambda f: self.instantiate(f, geometry, extras), functions)) diff --git a/boltzgen/kernel/target/__init__.py b/boltzgen/kernel/target/__init__.py index d39f48b..5927d1b 100644 --- a/boltzgen/kernel/target/__init__.py +++ b/boltzgen/kernel/target/__init__.py @@ -1,3 +1,3 @@  from . import layout  from . import precision -from . import cell_index +from . import index diff --git a/boltzgen/kernel/target/cell_index.py b/boltzgen/kernel/target/index.py index 7e74dc5..e89e9ee 100644 --- a/boltzgen/kernel/target/cell_index.py +++ b/boltzgen/kernel/target/index.py @@ -1,17 +1,17 @@ -class CellIndexer: +class CellIndex:      def __init__(self, geometry):          self.geometry   = geometry      def neighbor(self, c_i):          return self.gid(*[ c for _, c in enumerate(c_i) ]) -class XYZ(CellIndexer): +class XYZ(CellIndex):      pass      def gid(self, x, y, z=0):          return x*self.geometry.size_y*self.geometry.size_z + y*self.geometry.size_z + z -class ZYX(CellIndexer): +class ZYX(CellIndex):      pass      def gid(self, x, y, z=0): diff --git a/boltzgen/kernel/target/layout/AOS.py b/boltzgen/kernel/target/layout/AOS.py index c603869..88e5377 100644 --- a/boltzgen/kernel/target/layout/AOS.py +++ b/boltzgen/kernel/target/layout/AOS.py @@ -1,7 +1,7 @@  class AOS: -    def __init__(self, descriptor, cell_index, geometry): +    def __init__(self, descriptor, index, geometry):          self.descriptor = descriptor -        self.cell_index = cell_index +        self.index    = index(geometry)          self.geometry = geometry      def cell_preshift(self, gid): @@ -11,4 +11,4 @@ class AOS:          return i      def neighbor_offset(self, c_i): -        return self.descriptor.q * self.cell_index.neighbor(c_i) +        return self.descriptor.q * self.index.neighbor(c_i) diff --git a/boltzgen/kernel/target/layout/SOA.py b/boltzgen/kernel/target/layout/SOA.py index 8f126ff..05e9e84 100644 --- a/boltzgen/kernel/target/layout/SOA.py +++ b/boltzgen/kernel/target/layout/SOA.py @@ -1,7 +1,7 @@  class SOA: -    def __init__(self, descriptor, cell_index, geometry): +    def __init__(self, descriptor, index, geometry):          self.descriptor = descriptor -        self.cell_index = cell_index +        self.index    = index(geometry)          self.geometry = geometry      def cell_preshift(self, gid): @@ -11,4 +11,4 @@ class SOA:          return i * self.geometry.volume      def neighbor_offset(self, c_i): -        return self.cell_index.neighbor(c_i) +        return self.index.neighbor(c_i)  | 
