diff options
Diffstat (limited to 'ldc_3d_benchmark.py')
-rw-r--r-- | ldc_3d_benchmark.py | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/ldc_3d_benchmark.py b/ldc_3d_benchmark.py new file mode 100644 index 0000000..d066d87 --- /dev/null +++ b/ldc_3d_benchmark.py @@ -0,0 +1,97 @@ +import numpy +import time +from string import Template + +from simulation import Lattice, Geometry +from symbolic.generator import LBM + +import symbolic.D3Q19 as D3Q19 +import symbolic.D3Q27 as D3Q27 + +import itertools + +lid_speed = 0.1 +relaxation_time = 0.52 + +def MLUPS(cells, steps, time): + return cells * steps / time * 1e-6 + +def cavity(geometry, x, y, z): + if x == 1 or y == 1 or z == 1 or x == geometry.size_x-2 or y == geometry.size_y-2: + return 2 + elif z == geometry.size_z-2: + return 3 + else: + return 1 + +boundary = Template(""" + if ( m == 2 ) { + u_0 = 0.0; + u_1 = 0.0; + u_2 = 0.0; + } + if ( m == 3 ) { + u_0 = $lid_speed; + u_1 = 0.0; + u_2 = 0.0; + } +""").substitute({ + 'lid_speed': lid_speed +}) + +sizes = [16, 32, 48, 64, 96] + +layouts = [ + ( 16, 1, 1), + ( 24, 1, 1), + ( 32, 1, 1), + ( 48, 1, 1), + ( 64, 1, 1), + ( 96, 1, 1) +] + +descriptors = [ D3Q19, D3Q27 ] + +precisions = [ 'single', 'double' ] + +configs = list(filter( + lambda config: config[0] % config[1][0] == 0 and config[0] % config[1][1] == 0, + itertools.product(*[sizes, layouts, descriptors, precisions, [True, False]]) +)) + +measurements = [] + +for size, layout, descriptor, precision, opti in configs: + lbm = LBM(descriptor) + lattice = Lattice( + descriptor = descriptor, + geometry = Geometry(size, size, size), + precision = precision, + layout = layout, + moments = lbm.moments(optimize = opti), + collide = lbm.bgk(f_eq = lbm.equilibrium(), tau = relaxation_time, optimize = opti), + boundary_src = boundary) + lattice.setup_geometry(cavity) + + nUpdates = 1000 + nStat = 100 + + stats = [] + + lastStat = time.time() + + for i in range(1,nUpdates+1): + lattice.evolve() + + if i % nStat == 0: + lattice.sync() + mlups = round(MLUPS(lattice.geometry.volume, nStat, time.time() - lastStat)) + stats.append(mlups) + lastStat = time.time() + + print('%s: ~%d MLUPS' % ((size, layout, descriptor.__name__, precision, opti), numpy.average(stats))) + measurements.append(((size, layout, descriptor.__name__, precision, opti), stats)) + del lattice, lbm + +with open('result/ldc_3d_benchmark.data', 'w') as f: + f.write(str(measurements)) |