Beispiel #1
0
def test_initialization(dtype_device, use_jacobi):
    dtype, device = dtype_device
    lattice = Lattice(D2Q9, device, dtype)
    flow = TaylorGreenVortex2D(resolution=24,
                               reynolds_number=10,
                               mach_number=0.05,
                               lattice=lattice)
    collision = BGKCollision(lattice, tau=flow.units.relaxation_parameter_lu)
    streaming = StandardStreaming(lattice)
    simulation = Simulation(flow=flow,
                            lattice=lattice,
                            collision=collision,
                            streaming=streaming)
    # set initial pressure to 0 everywhere
    p, u = flow.initial_solution(flow.grid)
    u0 = lattice.convert_to_tensor(flow.units.convert_velocity_to_lu(u))
    rho0 = lattice.convert_to_tensor(np.ones_like(u0[0, ...].cpu()))
    simulation.f = lattice.equilibrium(rho0, u0)
    if use_jacobi:
        simulation.initialize_pressure(1000, 1e-6)
        num_iterations = 0
    else:
        num_iterations = simulation.initialize(500, 1e-3)
    piter = lattice.convert_to_numpy(
        flow.units.convert_density_lu_to_pressure_pu(lattice.rho(
            simulation.f)))
    # assert that pressure is converged up to 0.05 (max p
    assert piter == pytest.approx(p, rel=0.0, abs=5e-2)
    assert num_iterations < 500
Beispiel #2
0
def test_equilibrium_pressure_outlet(dtype_device):
    dtype, device = dtype_device
    lattice = Lattice(D2Q9, dtype=dtype, device=device)

    class MyObstacle(Obstacle2D):
        @property
        def boundaries(self, *args):
            x, y = self.grid
            return [
                EquilibriumBoundaryPU(
                    np.abs(x) < 1e-6, self.units.lattice, self.units,
                    np.array([self.units.characteristic_velocity_pu, 0])),
                EquilibriumOutletP(self.units.lattice, [0, -1]),
                EquilibriumOutletP(self.units.lattice, [0, 1]),
                EquilibriumOutletP(self.units.lattice, [1, 0]),
                BounceBackBoundary(self.mask, self.units.lattice)
            ]

    flow = MyObstacle(30,
                      30,
                      reynolds_number=10,
                      mach_number=0.1,
                      lattice=lattice,
                      char_length_lu=10)
    mask = np.zeros_like(flow.grid[0], dtype=np.bool)
    mask[10:20, 10:20] = 1
    flow.mask = mask
    simulation = Simulation(
        flow, lattice,
        RegularizedCollision(lattice, flow.units.relaxation_parameter_lu),
        StandardStreaming(lattice))
    simulation.step(20)
    rho = lattice.rho(simulation.f)
    u = lattice.u(simulation.f)
    feq = lattice.equilibrium(torch.ones_like(rho), u)
    p = flow.units.convert_density_lu_to_pressure_pu(rho)
    zeros = torch.zeros_like(p[0, -1, :])
    assert torch.allclose(zeros, p[:, -1, :], rtol=0, atol=1e-4)
    assert torch.allclose(zeros, p[:, :, 0], rtol=0, atol=1e-4)
    assert torch.allclose(zeros, p[:, :, -1], rtol=0, atol=1e-4)
    assert torch.allclose(feq[:, -1, 1:-1], feq[:, -2, 1:-1])