From 418fb9a27cab212735a903d6008d1c31b71bed48 Mon Sep 17 00:00:00 2001 From: Adrian Kummerlaender Date: Fri, 14 Jun 2019 22:44:44 +0200 Subject: Extract geometry information --- lbm.py | 76 ++++++++++++++++++++++++++++++++++++++++-------------------------- 1 file changed, 46 insertions(+), 30 deletions(-) (limited to 'lbm.py') diff --git a/lbm.py b/lbm.py index 5118f17..e4eaf62 100644 --- a/lbm.py +++ b/lbm.py @@ -6,13 +6,28 @@ import sympy from mako.template import Template +class Geometry: + def __init__(self, size_x, size_y): + self.size_x = size_x + self.size_y = size_y + self.volume = size_x * size_y + + def inner_cells(self): + for y in range(1,self.size_y-1): + for x in range(1,self.size_x-1): + yield x, y + + def span(self): + return (self.size_x, self.size_y) + + def inner_span(self): + return (self.size_x-2, self.size_y-2) + + class Lattice: - def __init__(self, descriptor, nX, nY, moments, collide, geometry, pop_eq_src = '', boundary_src = ''): + def __init__(self, descriptor, geometry, moments, collide, pop_eq_src = '', boundary_src = ''): self.descriptor = descriptor - - self.nX = nX - self.nY = nY - self.nCells = nX * nY + self.geometry = geometry self.moments = moments self.collide = collide @@ -24,13 +39,12 @@ class Lattice: self.context = cl.Context(properties=[(cl.context_properties.PLATFORM, self.platform)]) self.queue = cl.CommandQueue(self.context) - self.np_material = numpy.ndarray(shape=(self.nCells, 1), dtype=numpy.int32) - self.setup_geometry(geometry) + self.np_material = numpy.ndarray(shape=(self.geometry.volume, 1), dtype=numpy.int32) self.tick = True - self.pop_size = descriptor.q * self.nCells * numpy.float32(0).nbytes - self.moments_size = (descriptor.d+1) * self.nCells * numpy.float32(0).nbytes + self.pop_size = descriptor.q * self.geometry.volume * numpy.float32(0).nbytes + self.moments_size = (descriptor.d+1) * self.geometry.volume * numpy.float32(0).nbytes self.cl_pop_a = cl.Buffer(self.context, mf.READ_WRITE, size=self.pop_size) self.cl_pop_b = cl.Buffer(self.context, mf.READ_WRITE, size=self.pop_size) @@ -40,37 +54,35 @@ class Lattice: self.build_kernel() - self.program.equilibrilize(self.queue, (self.nX,self.nY), (32,1), self.cl_pop_a, self.cl_pop_b).wait() + self.program.equilibrilize( + self.queue, (self.geometry.size_x,self.geometry.size_y), (32,1), self.cl_pop_a, self.cl_pop_b).wait() def idx(self, x, y): - return y * self.nX + x; + return y * self.geometry.size_x + x; + + def setup_geometry(self, material_at): + for x, y in self.geometry.inner_cells(): + self.np_material[self.idx(x,y)] = material_at(self.geometry, x, y) - def setup_geometry(self, geometry): - for y in range(1,self.nY-1): - for x in range(1,self.nX-1): - self.np_material[self.idx(x,y)] = geometry(self.nX,self.nY,x,y) + cl.enqueue_copy(self.queue, self.cl_material, self.np_material).wait(); def build_kernel(self): program_src = Template(filename = './template/kernel.mako').render( descriptor = self.descriptor, + geometry = self.geometry, - nX = self.nX, - nY = self.nY, - nCells = self.nCells, - - moments_helper = self.moments[0], + moments_subexpr = self.moments[0], moments_assignment = self.moments[1], - collide_helper = self.collide[0], + collide_subexpr = self.collide[0], collide_assignment = self.collide[1], pop_eq_src = Template(self.pop_eq_src).render( descriptor = self.descriptor, - nX = self.nX, - nY = self.nY, - nCells = self.nCells + geometry = self.geometry ), boundary_src = Template(self.boundary_src).render( - descriptor = self.descriptor + descriptor = self.descriptor, + geometry = self.geometry ), ccode = sympy.ccode @@ -80,19 +92,23 @@ class Lattice: def evolve(self): if self.tick: self.tick = False - self.program.collide_and_stream(self.queue, (self.nX,self.nY), (32,1), self.cl_pop_a, self.cl_pop_b, self.cl_material) + self.program.collide_and_stream( + self.queue, self.geometry.span(), (32,1), self.cl_pop_a, self.cl_pop_b, self.cl_material) else: self.tick = True - self.program.collide_and_stream(self.queue, (self.nX,self.nY), (32,1), self.cl_pop_b, self.cl_pop_a, self.cl_material) + self.program.collide_and_stream( + self.queue, self.geometry.span(), (32,1), self.cl_pop_b, self.cl_pop_a, self.cl_material) def sync(self): self.queue.finish() def get_moments(self): - moments = numpy.ndarray(shape=(self.descriptor.d+1, self.nCells), dtype=numpy.float32) + moments = numpy.ndarray(shape=(self.descriptor.d+1, self.geometry.volume), dtype=numpy.float32) if self.tick: - self.program.collect_moments(self.queue, (self.nX,self.nY), (32,1), self.cl_pop_b, self.cl_moments) + self.program.collect_moments( + self.queue, self.geometry.span(), (32,1), self.cl_pop_b, self.cl_moments) else: - self.program.collect_moments(self.queue, (self.nX,self.nY), (32,1), self.cl_pop_a, self.cl_moments) + self.program.collect_moments( + self.queue, self.geometry.span(), (32,1), self.cl_pop_a, self.cl_moments) cl.enqueue_copy(self.queue, moments, self.cl_moments).wait(); return moments -- cgit v1.2.3