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
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])