def setUp(self): config = LBConfig() config.init_iters = 0 config.seed = 0 config.precision = 'single' config.block_size = 8 config.mem_alignment = 8 config.lat_nx, config.lat_ny, config.lat_nz = self.lattice_size config.logger = DummyLogger() config.grid = 'D3Q19' config.mode = 'batch' self.sim = LBSim(config) self.backend = DummyBackend()
def setUp(self): config = LBConfig() config.init_iters = 0 config.seed = 0 config.access_pattern = 'AA' config.precision = 'single' config.block_size = 8 config.mem_alignment = 8 # Does not affect behaviour of any of the functions tested here. config.lat_nz, config.lat_nx, config.lat_ny = self.size_3d config.logger = DummyLogger() config.grid = 'D3Q19' self.sim = LBSim(config) self.backend = DummyBackend()
def test_2subdomains(self): config = LBConfig() config.lat_nx = 64 config.lat_ny = 64 config.periodic_x = True config.periodic_y = True config.grid = 'D2Q9' geo = LBGeometry2D(config) b1 = SubdomainSpec2D((0, 0), (32, 64), envelope_size=1, id_=1) b2 = SubdomainSpec2D((32, 0), (32, 64), envelope_size=1, id_=2) proc = LBGeometryProcessor([b1, b2], 2, geo) proc._connect_subdomains(config) cpairs = b1.get_connections(SubdomainSpec2D.X_HIGH, b2.id) self.assertEqual(len(cpairs), 3) cpairs = b1.get_connections(SubdomainSpec2D.X_LOW, b2.id) self.assertTrue( self._check_partial_map( cpairs, [slice(1, 65)], { vi(-1, -1): np.array([[0]]), vi(-1, 0): np.array([[0], [63]]), vi(-1, 1): np.array([[63]]) })) self.assertTrue( self._check_partial_map(cpairs, [slice(0, 1)], {vi(-1, -1): np.array([[0]])})) self.assertTrue( self._check_partial_map(cpairs, [slice(65, 66)], {vi(-1, 1): np.array([[0]])}))
def test_3subdomains(self): config = LBConfig() config.lat_nx = 64 config.lat_ny = 64 config.periodic_x = True config.periodic_y = False config.grid = 'D2Q9' geo = LBGeometry2D(config) b1 = SubdomainSpec2D((0, 0), (32, 64), envelope_size=1, id_=1) b2 = SubdomainSpec2D((32, 0), (8, 64), envelope_size=1, id_=2) b3 = SubdomainSpec2D((40, 0), (24, 64), envelope_size=1, id_=3) proc = LBGeometryProcessor([b1, b2, b3], 2, geo) proc._connect_subdomains(config) cpair = b1.get_connection(SubdomainSpec2D.X_LOW, b3.id) self.assertEqual(cpair.src.dst_full_buf_slice, [slice(1, 63)]) expected_map = { vi(-1, 0): np.array([[0], [63]]), vi(-1, 1): np.array([[63]]), vi(-1, -1): np.array([[0]]) } _verify_partial_map(self, cpair.src, expected_map)
def setUp(self): config = LBConfig() config.seed = 0 config.precision = 'single' config.block_size = 8 config.mem_alignment = 8 # Does not affect behaviour of any of the functions tested here. config.lat_nx, config.lat_ny = self.lattice_size config.logger = DummyLogger() config.grid = 'D2Q9' self.sim = LBSim(config) self.config = config self.backend = DummyBackend()
def test_2subdomains(self): config = LBConfig() config.lat_nx = 64 config.lat_ny = 64 config.periodic_x = True config.periodic_y = True config.grid = 'D2Q9' geo = LBGeometry2D(config) b1 = SubdomainSpec2D((0, 0), (32, 64), envelope_size=1, id_=1) b2 = SubdomainSpec2D((32, 0), (32, 64), envelope_size=1, id_=2) proc = LBGeometryProcessor([b1, b2], 2, geo.gsize) proc._connect_subdomains(config) cpairs = b1.get_connections(SubdomainSpec2D.X_HIGH, b2.id) self.assertEqual(len(cpairs), 3) cpairs = b1.get_connections(SubdomainSpec2D.X_LOW, b2.id) self.assertTrue( self._check_partial_map(cpairs, [slice(1, 65)], {vi(-1, -1): np.array([[0]]), vi(-1, 0): np.array([[0], [63]]), vi(-1, 1): np.array([[63]])})) self.assertTrue( self._check_partial_map(cpairs, [slice(0, 1)], {vi(-1, -1): np.array([[0]])})) self.assertTrue( self._check_partial_map(cpairs, [slice(65, 66)], {vi(-1, 1): np.array([[0]])}))
def test_5subdomains(self): config = LBConfig() config.lat_nx = 50 config.lat_ny = 75 config.periodic_x = True config.periodic_y = True config.grid = 'D2Q9' geo = LBGeometry2D(config) b1 = SubdomainSpec2D((0, 0), (25, 25), envelope_size=1, id_=1) b2 = SubdomainSpec2D((25, 0), (25, 25), envelope_size=1, id_=2) b3 = SubdomainSpec2D((0, 25), (50, 25), envelope_size=1, id_=3) b4 = SubdomainSpec2D((0, 50), (25, 25), envelope_size=1, id_=4) b5 = SubdomainSpec2D((25, 50), (25, 25), envelope_size=1, id_=5) proc = LBGeometryProcessor([b1, b2, b3, b4, b5], 2, geo) proc._connect_subdomains(config) cpair = b1.get_connection(SubdomainSpec2D.X_LOW, b5.id) expected_map = {vi(-1, -1): np.array([[0]])} _verify_partial_map(self, cpair.src, expected_map) cpair = b1.get_connection(SubdomainSpec2D.X_HIGH, b5.id) expected_map = {vi(1, -1): np.array([[0]])} _verify_partial_map(self, cpair.src, expected_map) cpair = b1.get_connection(SubdomainSpec2D.Y_LOW, b4.id) expected_map = { vi(0, -1): np.array([[0], [24]]), vi(1, -1): np.array([[24]]), vi(-1, -1): np.array([[0]]) } _verify_partial_map(self, cpair.src, expected_map) cpair = b1.get_connection(SubdomainSpec2D.X_LOW, b2.id) self.assertEqual(cpair.src.dst_full_buf_slice, [slice(1, 24)]) cpair = b1.get_connection(SubdomainSpec2D.X_HIGH, b2.id) self.assertEqual(cpair.src.dst_full_buf_slice, [slice(1, 24)]) cpair = b1.get_connection(SubdomainSpec2D.Y_HIGH, b3.id) self.assertEqual(cpair.src.dst_full_buf_slice, [slice(1, 24)]) cpair = b1.get_connection(SubdomainSpec2D.X_LOW, b3.id) self.assertEqual(cpair.src.dst_full_buf_slice, []) expected_map = {vi(-1, 1): np.array([[0]])} _verify_partial_map(self, cpair.src, expected_map)
def test_5subdomains(self): config = LBConfig() config.lat_nx = 50 config.lat_ny = 75 config.periodic_x = True config.periodic_y = True config.grid = 'D2Q9' geo = LBGeometry2D(config) b1 = SubdomainSpec2D((0, 0), (25, 25), envelope_size=1, id_=1) b2 = SubdomainSpec2D((25, 0), (25, 25), envelope_size=1, id_=2) b3 = SubdomainSpec2D((0, 25), (50, 25), envelope_size=1, id_=3) b4 = SubdomainSpec2D((0, 50), (25, 25), envelope_size=1, id_=4) b5 = SubdomainSpec2D((25, 50), (25, 25), envelope_size=1, id_=5) proc = LBGeometryProcessor([b1, b2, b3, b4, b5], 2, geo.gsize) proc._connect_subdomains(config) cpair = b1.get_connection(SubdomainSpec2D.X_LOW, b5.id) expected_map = {vi(-1, -1): np.array([[0]])} _verify_partial_map(self, cpair.src, expected_map) cpair = b1.get_connection(SubdomainSpec2D.X_HIGH, b5.id) expected_map = {vi(1, -1): np.array([[0]])} _verify_partial_map(self, cpair.src, expected_map) cpair = b1.get_connection(SubdomainSpec2D.Y_LOW, b4.id) expected_map = {vi(0, -1): np.array([[0], [24]]), vi(1, -1): np.array([[24]]), vi(-1, -1): np.array([[0]])} _verify_partial_map(self, cpair.src, expected_map) cpair = b1.get_connection(SubdomainSpec2D.X_LOW, b2.id) self.assertEqual(cpair.src.dst_full_buf_slice, [slice(1, 24)]) cpair = b1.get_connection(SubdomainSpec2D.X_HIGH, b2.id) self.assertEqual(cpair.src.dst_full_buf_slice, [slice(1, 24)]) cpair = b1.get_connection(SubdomainSpec2D.Y_HIGH, b3.id) self.assertEqual(cpair.src.dst_full_buf_slice, [slice(1, 24)]) cpair = b1.get_connection(SubdomainSpec2D.X_LOW, b3.id) self.assertEqual(cpair.src.dst_full_buf_slice, []) expected_map = {vi(-1, 1): np.array([[0]])} _verify_partial_map(self, cpair.src, expected_map)
def test_3subdomains(self): config = LBConfig() config.lat_nx = 64 config.lat_ny = 64 config.periodic_x = True config.periodic_y = False config.grid = 'D2Q9' geo = LBGeometry2D(config) b1 = SubdomainSpec2D((0, 0), (32, 64), envelope_size=1, id_=1) b2 = SubdomainSpec2D((32, 0), (8, 64), envelope_size=1, id_=2) b3 = SubdomainSpec2D((40, 0), (24, 64), envelope_size=1, id_=3) proc = LBGeometryProcessor([b1, b2, b3], 2, geo.gsize) proc._connect_subdomains(config) cpair = b1.get_connection(SubdomainSpec2D.X_LOW, b3.id) self.assertEqual(cpair.src.dst_full_buf_slice, [slice(1, 63)]) expected_map = { vi(-1, 0): np.array([[0], [63]]), vi(-1, 1): np.array([[63]]), vi(-1, -1): np.array([[0]])} _verify_partial_map(self, cpair.src, expected_map)
def setUp(self): config = LBConfig() config.init_iters = 0 config.seed = 0 config.access_pattern = 'AA' config.precision = 'single' config.block_size = 8 config.mem_alignment = 8 config.mode = 'batch' # Does not affect behaviour of any of the functions tested here. config.lat_nz, config.lat_nx, config.lat_ny = self.size_3d config.logger = DummyLogger() config.grid = 'D3Q19' self.sim = LBSim(config) self.backend = DummyBackend()
def test_4subdomains(self): config = LBConfig() config.lat_nx = 64 config.lat_ny = 64 config.periodic_x = True config.periodic_y = True config.grid = 'D2Q9' geo = LBGeometry2D(config) b1 = SubdomainSpec2D((0, 0), (32, 32), envelope_size=1, id_=1) b2 = SubdomainSpec2D((32, 0), (32, 32), envelope_size=1, id_=2) b3 = SubdomainSpec2D((0, 32), (32, 32), envelope_size=1, id_=3) b4 = SubdomainSpec2D((32, 32), (32, 32), envelope_size=1, id_=4) proc = LBGeometryProcessor([b1, b2, b3, b4], 2, geo) proc._connect_subdomains(config) ## b1 - b4 cpairs = b1.get_connections(SubdomainSpec2D.X_LOW, b4.id) self.assertEqual(len(cpairs), 2) self.assertTrue( self._check_partial_map(cpairs, [slice(0, 1)], {vi(-1, -1): np.array([[0]])})) self.assertTrue( self._check_partial_map(cpairs, [slice(33, 34)], {vi(-1, 1): np.array([[0]])})) cpairs = b1.get_connections(SubdomainSpec2D.X_HIGH, b4.id) self.assertEqual(len(cpairs), 2) self.assertTrue( self._check_partial_map(cpairs, [slice(0, 1)], {vi(1, -1): np.array([[0]])})) self.assertTrue( self._check_partial_map(cpairs, [slice(33, 34)], {vi(1, 1): np.array([[0]])})) cpairs = b1.get_connections(SubdomainSpec2D.Y_LOW, b4.id) self.assertEqual(len(cpairs), 0) cpairs = b1.get_connections(SubdomainSpec2D.Y_HIGH, b4.id) self.assertEqual(len(cpairs), 0) ### b2 - b3 cpairs = b2.get_connections(SubdomainSpec2D.X_LOW, b3.id) self.assertEqual(len(cpairs), 2) self.assertTrue( self._check_partial_map(cpairs, [slice(0, 1)], {vi(-1, -1): np.array([[0]])})) self.assertTrue( self._check_partial_map(cpairs, [slice(33, 34)], {vi(-1, 1): np.array([[0]])})) cpairs = b2.get_connections(SubdomainSpec2D.X_HIGH, b3.id) self.assertEqual(len(cpairs), 2) self.assertTrue( self._check_partial_map(cpairs, [slice(0, 1)], {vi(1, -1): np.array([[0]])})) self.assertTrue( self._check_partial_map(cpairs, [slice(33, 34)], {vi(1, 1): np.array([[0]])})) cpairs = b2.get_connections(SubdomainSpec2D.Y_LOW, b3.id) self.assertEqual(len(cpairs), 0) cpairs = b2.get_connections(SubdomainSpec2D.Y_HIGH, b3.id) self.assertEqual(len(cpairs), 0)
def setUp(self): config = LBConfig() config.seed = 0 config.init_iters = 0 config.access_pattern = 'AA' config.precision = 'single' config.block_size = 8 config.mem_alignment = 8 config.lat_nx, config.lat_ny = 40, 80 config.logger = DummyLogger() config.grid = 'D2Q9' config.benchmark_sample_from = 0 config.benchmark_minibatch = 1 config.bulk_boundary_split = False config.output = '' self.config = config self.backend = DummyBackend() self.ctx = zmq.Context()
def test_4subdomains(self): config = LBConfig() config.lat_nx = 64 config.lat_ny = 64 config.periodic_x = True config.periodic_y = True config.grid = 'D2Q9' geo = LBGeometry2D(config) b1 = SubdomainSpec2D((0, 0), (32, 32), envelope_size=1, id_=1) b2 = SubdomainSpec2D((32, 0), (32, 32), envelope_size=1, id_=2) b3 = SubdomainSpec2D((0, 32), (32, 32), envelope_size=1, id_=3) b4 = SubdomainSpec2D((32, 32), (32, 32), envelope_size=1, id_=4) proc = LBGeometryProcessor([b1, b2, b3, b4], 2, geo.gsize) proc._connect_subdomains(config) ## b1 - b4 cpairs = b1.get_connections(SubdomainSpec2D.X_LOW, b4.id) self.assertEqual(len(cpairs), 2) self.assertTrue( self._check_partial_map(cpairs, [slice(0, 1)], {vi(-1, -1): np.array([[0]])})) self.assertTrue( self._check_partial_map(cpairs, [slice(33, 34)], {vi(-1, 1): np.array([[0]])})) cpairs = b1.get_connections(SubdomainSpec2D.X_HIGH, b4.id) self.assertEqual(len(cpairs), 2) self.assertTrue( self._check_partial_map(cpairs, [slice(0, 1)], {vi(1, -1): np.array([[0]])})) self.assertTrue( self._check_partial_map(cpairs, [slice(33, 34)], {vi(1, 1): np.array([[0]])})) cpairs = b1.get_connections(SubdomainSpec2D.Y_LOW, b4.id) self.assertEqual(len(cpairs), 0) cpairs = b1.get_connections(SubdomainSpec2D.Y_HIGH, b4.id) self.assertEqual(len(cpairs), 0) ### b2 - b3 cpairs = b2.get_connections(SubdomainSpec2D.X_LOW, b3.id) self.assertEqual(len(cpairs), 2) self.assertTrue( self._check_partial_map(cpairs, [slice(0, 1)], {vi(-1, -1): np.array([[0]])})) self.assertTrue( self._check_partial_map(cpairs, [slice(33, 34)], {vi(-1, 1): np.array([[0]])})) cpairs = b2.get_connections(SubdomainSpec2D.X_HIGH, b3.id) self.assertEqual(len(cpairs), 2) self.assertTrue( self._check_partial_map(cpairs, [slice(0, 1)], {vi(1, -1): np.array([[0]])})) self.assertTrue( self._check_partial_map(cpairs, [slice(33, 34)], {vi(1, 1): np.array([[0]])})) cpairs = b2.get_connections(SubdomainSpec2D.Y_LOW, b3.id) self.assertEqual(len(cpairs), 0) cpairs = b2.get_connections(SubdomainSpec2D.Y_HIGH, b3.id) self.assertEqual(len(cpairs), 0)
def test_TMS(self): settings = { 'debug_single_process': True, 'quiet': True, 'precision': 'double', 'access_pattern': 'AB', 'check_invalid_results_gpu': False, 'check_invalid_results_host': False, 'lat_nx': self.nx, 'lat_ny': self.ny, 'max_iters': 1, 'visc': 1.0/12.0, } ctrl = LBSimulationController(Test2DSim, default_config=settings) ctrl.run(ignore_cmdline=True) runner = ctrl.master.runner dist = runner._debug_get_dist() rho_bb = 0.0 ux_bb = 0.0 uy_bb = 0.0 for k, v in fi_start_2d.iteritems(): if D2Q9.basis[k][1] == 1: v = fi_start_2d[D2Q9.idx_opposite[k]] rho_bb += v ux_bb += D2Q9.basis[k][0] * v uy_bb += D2Q9.basis[k][1] * v ux_bb /= rho_bb uy_bb /= rho_bb rho = 0.0 ux = 0.0 uy = 0.0 cfg = LBConfig() cfg.incompressible = False cfg.minimize_roundoff = False eq = bgk_equilibrium(D2Q9, cfg).expression for k, v in fi_start_2d.iteritems(): if D2Q9.basis[k][1] == 1: v = eq[k].evalf(subs={'g0m0': rho_bb, 'g0m1x': ux_bb, 'g0m1y': uy_bb}) rho += v ux += D2Q9.basis[k][0] * v uy += D2Q9.basis[k][1] * v ux /= rho uy /= rho print 'Target values are rho=%e, ux=%e, uy=%e' % (rho_bb, ux_bb, uy_bb) print 'Instantaneous values are rho=%e, ux=%e, uy=%e' % (rho, ux, uy) fneq = {} for k, v in fi_start_2d.iteritems(): if D2Q9.basis[k][1] == 1: fneq[k] = (eq[k].evalf(subs={'g0m0': rho_bb, 'g0m1x': ux_bb, 'g0m1y': uy_bb}) - eq[k].evalf(subs={'g0m0': rho, 'g0m1x': ux, 'g0m1y': uy})) else: fneq[k] = v - eq[k].evalf(subs={'g0m0': rho, 'g0m1x': ux, 'g0m1y': uy}) tau = relaxation_time(1.0/12.0) omega = 1.0 / tau res = {} for k, v in fi_start_2d.iteritems(): if D2Q9.basis[k][1] == 1: res[k] = ((1.0 - (omega - 1)) * eq[k].evalf(subs={'g0m0': rho_bb, 'g0m1x': ux_bb, 'g0m1y': uy_bb}) + (omega - 1) * eq[k].evalf(subs={'g0m0': rho, 'g0m1x': ux, 'g0m1y': uy})) else: res[k] = (v + omega * (eq[k].evalf(subs={'g0m0': rho, 'g0m1x': ux, 'g0m1y': uy}) - v) + eq[k].evalf(subs={'g0m0': rho_bb, 'g0m1x': ux_bb, 'g0m1y': uy_bb}) - eq[k].evalf(subs={'g0m0': rho, 'g0m1x': ux, 'g0m1y': uy})) for k, v in res.iteritems(): np.testing.assert_allclose(dist[k,1,16], np.float64(v))
def setUp(self): config = LBConfig() config.seed = 0 config.init_iters = 0 config.access_pattern = 'AA' config.precision = 'single' config.block_size = 8 config.mem_alignment = 8 config.mode = 'batch' config.lat_nx, config.lat_ny = 40, 80 config.logger = DummyLogger() config.grid = 'D2Q9' config.benchmark_sample_from = 0 config.benchmark_minibatch = 1 config.bulk_boundary_split = False config.output = '' self.config = config self.backend = DummyBackend() self.ctx = zmq.Context()
def test_TMS(self): settings = { 'debug_single_process': True, 'quiet': True, 'precision': 'double', 'access_pattern': 'AB', 'check_invalid_results_gpu': False, 'check_invalid_results_host': False, 'lat_nx': self.nx, 'lat_ny': self.ny, 'max_iters': 1, 'visc': 1.0 / 12.0, } ctrl = LBSimulationController(Test2DSim, default_config=settings) ctrl.run(ignore_cmdline=True) runner = ctrl.master.runner dist = runner._debug_get_dist() rho_bb = 0.0 ux_bb = 0.0 uy_bb = 0.0 for k, v in fi_start_2d.iteritems(): if D2Q9.basis[k][1] == 1: v = fi_start_2d[D2Q9.idx_opposite[k]] rho_bb += v ux_bb += D2Q9.basis[k][0] * v uy_bb += D2Q9.basis[k][1] * v ux_bb /= rho_bb uy_bb /= rho_bb rho = 0.0 ux = 0.0 uy = 0.0 cfg = LBConfig() cfg.incompressible = False cfg.minimize_roundoff = False eq = bgk_equilibrium(D2Q9, cfg).expression for k, v in fi_start_2d.iteritems(): if D2Q9.basis[k][1] == 1: v = eq[k].evalf(subs={ 'g0m0': rho_bb, 'g0m1x': ux_bb, 'g0m1y': uy_bb }) rho += v ux += D2Q9.basis[k][0] * v uy += D2Q9.basis[k][1] * v ux /= rho uy /= rho print 'Target values are rho=%e, ux=%e, uy=%e' % (rho_bb, ux_bb, uy_bb) print 'Instantaneous values are rho=%e, ux=%e, uy=%e' % (rho, ux, uy) fneq = {} for k, v in fi_start_2d.iteritems(): if D2Q9.basis[k][1] == 1: fneq[k] = (eq[k].evalf(subs={ 'g0m0': rho_bb, 'g0m1x': ux_bb, 'g0m1y': uy_bb }) - eq[k].evalf(subs={ 'g0m0': rho, 'g0m1x': ux, 'g0m1y': uy })) else: fneq[k] = v - eq[k].evalf(subs={ 'g0m0': rho, 'g0m1x': ux, 'g0m1y': uy }) tau = relaxation_time(1.0 / 12.0) omega = 1.0 / tau res = {} for k, v in fi_start_2d.iteritems(): if D2Q9.basis[k][1] == 1: res[k] = ((1.0 - (omega - 1)) * eq[k].evalf(subs={ 'g0m0': rho_bb, 'g0m1x': ux_bb, 'g0m1y': uy_bb }) + (omega - 1) * eq[k].evalf(subs={ 'g0m0': rho, 'g0m1x': ux, 'g0m1y': uy })) else: res[k] = (v + omega * (eq[k].evalf(subs={ 'g0m0': rho, 'g0m1x': ux, 'g0m1y': uy }) - v) + eq[k].evalf(subs={ 'g0m0': rho_bb, 'g0m1x': ux_bb, 'g0m1y': uy_bb }) - eq[k].evalf(subs={ 'g0m0': rho, 'g0m1x': ux, 'g0m1y': uy })) for k, v in res.iteritems(): np.testing.assert_allclose(dist[k, 1, 16], np.float64(v))
def setUp(self): config = LBConfig() config.init_iters = 0 config.seed = 0 config.precision = 'single' config.block_size = 8 config.mem_alignment = 8 config.node_addressing = 'direct' config.lat_nx, config.lat_ny = self.lattice_size config.logger = DummyLogger() config.grid = 'D2Q9' config.mode = 'batch' config.periodic_x = False config.periodic_y = False config.use_link_tags = False config.time_dependence = False config.space_dependence = False self.sim = LBSim(config) self.config = config self.backend = DummyBackend()
def setUp(self): config = LBConfig() config.init_iters = 0 config.seed = 0 config.precision = "single" config.block_size = 8 config.mem_alignment = 8 config.node_addressing = "direct" config.lat_nx, config.lat_ny, config.lat_nz = self.lattice_size config.logger = DummyLogger() config.grid = "D3Q19" config.mode = "batch" config.periodic_x = False config.periodic_y = False config.periodic_z = False config.use_link_tags = False config.time_dependence = False config.space_dependence = False config.access_pattern = "AB" self.sim = LBSim(config) self.backend = DummyBackend()
def setUp(self): config = LBConfig() config.init_iters = 0 config.seed = 0 config.precision = 'single' config.block_size = 8 config.mem_alignment = 8 config.node_addressing = 'direct' config.lat_nx, config.lat_ny, config.lat_nz = self.lattice_size config.logger = DummyLogger() config.grid = 'D3Q19' config.mode = 'batch' config.periodic_x = False config.periodic_y = False config.periodic_z = False config.use_link_tags = False config.time_dependence = False config.space_dependence = False config.access_pattern = 'AB' self.sim = LBSim(config) self.backend = DummyBackend()