def _verify_moments(self, grid, order): bgk = sym_equilibrium.bgk_equilibrium(grid, cfg, order=order) rho_ex = 0 momentum = [0, 0, 0] for ex, ei in zip(bgk.expression, grid.basis): rho_ex += ex for i, ei_c in enumerate(ei): momentum[i] += ei_c * ex self.assertEqual(sympy.simplify(rho_ex), sym.S.rho) self.assertEqual(sympy.simplify(momentum[0]), sym.S.rho * sym.S.vx) self.assertEqual(sympy.simplify(momentum[1]), sym.S.rho * sym.S.vy) if grid.dim == 3: self.assertEqual(sympy.simplify(momentum[2]), sym.S.rho * sym.S.vz)
def test_d3q19_2nd_order_bgk(self): """Verifies that the entropic equilibrium for D3Q19 is the same as the LBGK equilibrium up to 2nd order in velocity.""" grid = sym.D3Q19 bgk = sym_equilibrium.bgk_equilibrium(grid, cfg) elbm = sym_equilibrium.elbm_d3q19_equilibrium(grid, order=2) for i, (elbm_ex, bgk_ex) in enumerate(zip(elbm.expression, bgk.expression)): for x in elbm.local_vars: elbm_ex = elbm_ex.subs({x.lhs: x.rhs}) elbm_trunc = sym_codegen.truncate_velocity(Poly(elbm_ex), order=2).subs({ 'vsq': sym.S.vx**2 + sym.S.vy**2 + sym.S.vz**2}) self.assertEqual(elbm_trunc.expand(), bgk_ex.expand(), '%d component' % i)
def test_d3q19_2nd_order_bgk(self): """Verifies that the entropic equilibrium for D3Q19 is the same as the LBGK equilibrium up to 2nd order in velocity.""" grid = sym.D3Q19 bgk = sym_equilibrium.bgk_equilibrium(grid, cfg) elbm = sym_equilibrium.elbm_d3q19_equilibrium(grid, order=2) for i, (elbm_ex, bgk_ex) in enumerate(zip(elbm.expression, bgk.expression)): for x in elbm.local_vars: elbm_ex = elbm_ex.subs({x.lhs: x.rhs}) elbm_trunc = sym_codegen.truncate_velocity( Poly(elbm_ex), order=2).subs({'vsq': sym.S.vx**2 + sym.S.vy**2 + sym.S.vz**2}) self.assertEqual(elbm_trunc.expand(), bgk_ex.expand(), '%d component' % i)
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 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))