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) |