Exemplo n.º 1
0
    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)
Exemplo n.º 2
0
    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)
Exemplo n.º 3
0
    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)
Exemplo n.º 4
0
    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)
Exemplo n.º 5
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))
Exemplo n.º 6
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))