diff --git a/lbmpy_tests/test_shear_flow.py b/lbmpy_tests/test_shear_flow.py index a1fe04995adf55661df61e2be21e6920934333ce..e985a8f72fb42385978d1c727aad80069d0ec8b7 100644 --- a/lbmpy_tests/test_shear_flow.py +++ b/lbmpy_tests/test_shear_flow.py @@ -1,5 +1,5 @@ """ -Test Poiseuille flow against analytical solution +Test shear flow velocity and pressureagainst analytical solutions """ @@ -49,13 +49,13 @@ def shear_flow(x, t, nu, v, h, k_max): return -v * u -rho_0 = 1.0 # density +rho_0 = 2.2 # density eta = 1.6 # kinematic viscosity -width = 41 # of box +width = 40 # of box wall_thickness = 2 -actual_width = width - 2*wall_thickness # subtract boundary layer from box width -shear_velocity = 0.2 # scale by width to keep stable -t_max = 2000 +actual_width = width - wall_thickness # subtract boundary layer from box width +shear_velocity = 0.2 # scale by width to keep stable +t_max = 20000 @pytest.mark.parametrize('target', ('cpu', 'gpu', 'opencl')) @@ -118,7 +118,7 @@ def test_poiseuille_channel(target, stencil_name): getter_eqs = cqc.output_equations_from_pdfs(src.center_vector, {'moment2': p}) - kernel_compute_p = ps.create_kernel(getter_eqs, ghost_layers=0 ).compile() + kernel_compute_p = ps.create_kernel(getter_eqs, ghost_layers=0).compile() # ## Set up the simulation @@ -126,13 +126,13 @@ def test_poiseuille_channel(target, stencil_name): pdfs=src.center_vector, density=ρ.center) init_kernel = ps.create_kernel(init, ghost_layers=0).compile() - vel_vec = sp.Matrix([0.5*shear_velocity] + [0] * (dim-1)) + vel_vec = sp.Matrix([0.5 * shear_velocity] + [0] * (dim - 1)) if dim == 2: lbbh.set_boundary(UBB(velocity=vel_vec), ps.make_slice[:, :wall_thickness]) - lbbh.set_boundary(UBB(velocity=-1*vel_vec), ps.make_slice[:, -wall_thickness:]) + lbbh.set_boundary(UBB(velocity=-vel_vec), ps.make_slice[:, -wall_thickness:]) elif dim == 3: lbbh.set_boundary(UBB(velocity=vel_vec), ps.make_slice[:, :wall_thickness, :]) - lbbh.set_boundary(UBB(velocity=-1*vel_vec), ps.make_slice[:, -wall_thickness:, :]) + lbbh.set_boundary(UBB(velocity=-vel_vec), ps.make_slice[:, -wall_thickness:, :]) else: raise Exception() @@ -146,7 +146,6 @@ def test_poiseuille_channel(target, stencil_name): dh.run_kernel(init_kernel) - sync_pdfs = dh.synchronization_function([src.name]) # Time loop @@ -177,41 +176,44 @@ def test_poiseuille_channel(target, stencil_name): pp = np.average(pp, axis=2) pp = np.average(pp, axis=0) - # cut off wall regions uu = uu[wall_thickness:-wall_thickness] pp = pp[wall_thickness:-wall_thickness] - return uu, pp.reshape((len(pp),3,3)) + if(dh.dim == 2): + pp = pp.reshape((len(pp), 2, 2)) + if(dh.dim == 3): + pp = pp.reshape((len(pp), 3, 3)) + return uu, pp init() # Simulation profile, pressure_profile = time_loop(t_max) - # compare against analytical solution - # The profile is of shape (n,3). Force is in x-direction - y = np.arange(len(profile[:, 0])) - mid = (y[-1] - y[0]) / 2 # Mid point of channel - - expected = shear_flow( - x=(np.arange(0, actual_width+2) + .5), - t=t_max, - nu=eta/rho_0, - v=shear_velocity, - h=actual_width+2, - k_max=100) + expected = shear_flow(x=(np.arange(0, actual_width) + .5), + t=t_max, + nu=eta / rho_0, + v=shear_velocity, + h=actual_width, + k_max=100) - - shear_direction = np.array((1, 0, 0), dtype=float) - shear_plane_normal = np.array((0, 1, 0), dtype=float) + if(dh.dim == 2): + shear_direction = np.array((1, 0), dtype=float) + shear_plane_normal = np.array((0, 1), dtype=float) + if(dh.dim == 3): + shear_direction = np.array((1, 0, 0), dtype=float) + shear_plane_normal = np.array((0, 1, 0), dtype=float) shear_rate = shear_velocity / actual_width dynamic_viscosity = eta * rho_0 + correction_factor = eta / (eta - 1. / 6.) + + p_expected = rho_0 * np.identity(dh.dim) / 3.0 + dynamic_viscosity * shear_rate / correction_factor * ( + np.outer(shear_plane_normal, shear_direction) + np.transpose(np.outer(shear_plane_normal, shear_direction))) - p_expected = rho_0 * np.identity(3) /3.0 - dynamic_viscosity * shear_rate * ( - np.outer(shear_plane_normal, shear_direction) + np.transpose(np.outer(shear_plane_normal, shear_direction))) - pressure_profile[:,0,0] -= rho_0*profile[:,0]**2 + # Sustract the tensorproduct of the velosity to get the pressure + pressure_profile[:, 0, 0] -= rho_0 * profile[:, 0]**2 np.testing.assert_allclose(profile[:, 0], expected[1:-1], atol=1E-9) - for i in range(actual_width): - np.testing.assert_allclose(pressure_profile[i], p_expected, atol=1E-9, rtol=1E-3) + for i in range(actual_width - 2): + np.testing.assert_allclose(pressure_profile[i], p_expected, atol=1E-9, rtol=1E-3)