From 4610b50bfe47ed0d75f30279fca69d0dcdc04ee2 Mon Sep 17 00:00:00 2001 From: Adrian Kummerlaender Date: Wed, 6 Nov 2019 21:24:08 +0100 Subject: Add basic AA pattern support for OpenCL example --- lid_driven_cavity/opencl/ldc_2d.py | 74 +++++++++++++++++--------------------- 1 file changed, 32 insertions(+), 42 deletions(-) (limited to 'lid_driven_cavity/opencl/ldc_2d.py') diff --git a/lid_driven_cavity/opencl/ldc_2d.py b/lid_driven_cavity/opencl/ldc_2d.py index c080284..8d9e324 100644 --- a/lid_driven_cavity/opencl/ldc_2d.py +++ b/lid_driven_cavity/opencl/ldc_2d.py @@ -1,36 +1,16 @@ import numpy import time -import matplotlib -matplotlib.use('AGG') -import matplotlib.pyplot as plt - from boltzgen import Generator, Geometry from boltzgen.lbm.lattice import D2Q9 from boltzgen.lbm.model import BGK -from simulation import Lattice, CellList - -def MLUPS(cells, steps, time): - return cells * steps / time * 1e-6 - -def generate_moment_plots(lattice, moments): - for i, m in enumerate(moments): - print("Generating plot %d of %d." % (i+1, len(moments))) - - gid = lattice.memory.gid - velocity = numpy.reshape( - [ numpy.sqrt(m[gid(x,y)*3+1]**2 + m[gid(x,y)*3+2]**2) for x, y in lattice.geometry.inner_cells() ], - lattice.geometry.inner_size()) - - plt.figure(figsize=(10, 10)) - plt.imshow(velocity, origin='lower', cmap=plt.get_cmap('seismic')) - plt.savefig("result/ldc_2d_%02d.png" % i, bbox_inches='tight', pad_inches=0) +from common import CellList, generate_moment_plots nUpdates = 100000 nStat = 10000 -geometry = Geometry(256, 256) +geometry = Geometry(512, 512) print("Generating kernel using boltzgen...\n") @@ -38,37 +18,35 @@ functions = ['collide_and_stream', 'equilibrilize', 'collect_moments', 'momenta_ extras = ['cell_list_dispatch'] precision = 'single' +streaming = 'AA' + +import AA +import AB + +Lattice = eval('%s.Lattice' % streaming) +HelperTemplate = eval('%s.HelperTemplate' % streaming) + +def MLUPS(cells, steps, time): + return cells * steps / time * 1e-6 generator = Generator( - model = BGK(D2Q9, tau = 0.6), + model = BGK(D2Q9, tau = 0.54), target = 'cl', precision = precision, + streaming = streaming, index = 'ZYX', layout = 'SOA') kernel_src = generator.kernel(geometry, functions, extras) -kernel_src += generator.custom(geometry, """ -__kernel void equilibrilize_all(__global ${float_type}* f_next, - __global ${float_type}* f_prev) -{ - const unsigned int gid = ${index.gid('get_global_id(0)', 'get_global_id(1)')}; - equilibrilize(f_next, f_prev, gid); - equilibrilize(f_prev, f_next, gid); -} - -__kernel void collect_moments_all(__global ${float_type}* f, - __global ${float_type}* moments) -{ - const unsigned int gid = ${index.gid('get_global_id(0)', 'get_global_id(1)')}; - collect_moments(f, gid, moments); -} -""") +kernel_src += generator.custom(geometry, HelperTemplate) print("Initializing simulation...\n") lattice = Lattice(geometry, kernel_src, D2Q9, precision = precision) gid = lattice.memory.gid +ghost_cells = CellList(lattice.context, lattice.queue, lattice.float_type, + [ gid(x,y) for x, y in geometry.cells() if x == 0 or y == 0 or x == geometry.size_x-1 or y == geometry.size_y-1 ]) bulk_cells = CellList(lattice.context, lattice.queue, lattice.float_type, [ gid(x,y) for x, y in geometry.inner_cells() if x > 1 and x < geometry.size_x-2 and y > 1 and y < geometry.size_y-2 ]) wall_cells = CellList(lattice.context, lattice.queue, lattice.float_type, @@ -76,9 +54,21 @@ wall_cells = CellList(lattice.context, lattice.queue, lattice.float_type, lid_cells = CellList(lattice.context, lattice.queue, lattice.float_type, [ gid(x,y) for x, y in geometry.inner_cells() if y == geometry.size_y-2 ]) -lattice.schedule('collide_and_stream_cells', bulk_cells) -lattice.schedule('velocity_momenta_boundary_cells', wall_cells, numpy.array([0.0, 0.0], dtype=lattice.float_type[0])) -lattice.schedule('velocity_momenta_boundary_cells', lid_cells, numpy.array([0.1, 0.0], dtype=lattice.float_type[0])) +if streaming == 'AB': + lattice.schedule('collide_and_stream_cells', bulk_cells) + lattice.schedule('velocity_momenta_boundary_cells', wall_cells, numpy.array([0.0, 0.0], dtype=lattice.float_type[0])) + lattice.schedule('velocity_momenta_boundary_cells', lid_cells, numpy.array([0.1, 0.0], dtype=lattice.float_type[0])) + +elif streaming == 'AA': + lattice.schedule_tick('collide_and_stream_tick_cells', bulk_cells) + lattice.schedule_tick('velocity_momenta_boundary_tick_cells', wall_cells, numpy.array([0.0, 0.0], dtype=lattice.float_type[0])) + lattice.schedule_tick('velocity_momenta_boundary_tick_cells', lid_cells, numpy.array([0.1, 0.0], dtype=lattice.float_type[0])) + + lattice.schedule_tock('equilibrilize_tick_cells', ghost_cells) + lattice.schedule_tock('collide_and_stream_tock_cells', bulk_cells) + lattice.schedule_tock('velocity_momenta_boundary_tock_cells', wall_cells, numpy.array([0.0, 0.0], dtype=lattice.float_type[0])) + lattice.schedule_tock('velocity_momenta_boundary_tock_cells', lid_cells, numpy.array([0.1, 0.0], dtype=lattice.float_type[0])) + print("Starting simulation using %d cells...\n" % lattice.geometry.volume) -- cgit v1.2.3