def test_single_wall_mobility_zero_at_wall(self): ''' Test that single wall mobility from Swan Brady paper is zero for very small particles at the wall. ''' a = 0.0001 r_vectors = [np.array([0., 0., a]), np.array([1., 1., 8.])] mobility = mb.single_wall_fluid_mobility(r_vectors, 1., a) for j in range(3): for k in range(3): self.assertAlmostEqual(mobility[j, 3 + k], 0.0, places=6)
def test_finite_size_limit(self): ''' Test that the finite size mobility goes to the oseen for small a.''' n_particles = 4 a = 0.000001 # Random configuration, all above wall. r_vectors = [np.random.normal(5., 1., 3) for _ in range(n_particles)] mobility_finite = mb.single_wall_fluid_mobility(r_vectors, 1., a) mobility_point = mb.image_singular_stokeslet(r_vectors, 1.0, a) for j in range(3*n_particles): for k in range(3*n_particles): # We multiply by a to get reasonable numbers for mobility. self.assertAlmostEqual(a*mobility_finite[j,k], a*mobility_point[j,k])
def test_finite_size_limit(self): ''' Test that the finite size mobility goes to the oseen for small a.''' n_particles = 4 a = 0.000001 # Random configuration, all above wall. r_vectors = [np.random.normal(5., 1., 3) for _ in range(n_particles)] mobility_finite = mb.single_wall_fluid_mobility(r_vectors, 1., a) mobility_point = mb.image_singular_stokeslet(r_vectors, 1.0, a) for j in range(3 * n_particles): for k in range(3 * n_particles): # We multiply by a to get reasonable numbers for mobility. self.assertAlmostEqual(a * mobility_finite[j, k], a * mobility_point[j, k])
def test_boosted_v_python_agreement(self): ''' Test that for random R vectors, the boosted and python versions of mobility agree.''' location = [np.random.normal(10., 3., 3) for _ in range(4)] eta = 1.0 a = 0.25 fluid_mobility = mb.single_wall_fluid_mobility(location, eta, a) fluid_mobility_boost = mb.boosted_single_wall_fluid_mobility( location, eta, a) for i in range(len(fluid_mobility)): for j in range(len(fluid_mobility[0])): self.assertAlmostEqual(fluid_mobility[i, j], fluid_mobility_boost[i, j])
def test_single_wall_mobility_spd(self): ''' Test that single wall mobility from Swan Brady paper is SPD. ''' # Number of particles n_particles = 5 height = 10. def is_pos_def(x): return np.all(np.linalg.eigvals(x) > 0) # Random configuration. r_vectors = [np.random.normal(height, 1., 3) for _ in range(n_particles)] mobility = mb.single_wall_fluid_mobility(r_vectors, 1., 1.) self.assertTrue(is_pos_def(mobility)) for j in range(3*n_particles): for k in range(j+1, 3*n_particles): self.assertAlmostEqual(mobility[j, k], mobility[k, j])
def test_single_wall_mobility_spd(self): ''' Test that single wall mobility from Swan Brady paper is SPD. ''' # Number of particles n_particles = 5 height = 10. def is_pos_def(x): return np.all(np.linalg.eigvals(x) > 0) # Random configuration. r_vectors = [ np.random.normal(height, 1., 3) for _ in range(n_particles) ] mobility = mb.single_wall_fluid_mobility(r_vectors, 1., 1.) self.assertTrue(is_pos_def(mobility)) for j in range(3 * n_particles): for k in range(j + 1, 3 * n_particles): self.assertAlmostEqual(mobility[j, k], mobility[k, j])
u_no_wall_pycuda = mob.no_wall_mobility_trans_times_force_pycuda(r_vectors, force, eta, a) timer('zz_no_wall_pycuda') u_no_wall_pycuda = mob.no_wall_mobility_trans_times_force_pycuda(r_vectors, force, eta, a) timer('zz_no_wall_pycuda') # ================================================================ # WALL TESTS # ================================================================ timer('python_loops') mobility_loops = mob.single_wall_fluid_mobility_loops(r_vectors, eta, a) u_loops = np.dot(mobility_loops, force.flatten()) timer('python_loops') timer('python') mobility = mob.single_wall_fluid_mobility(r_vectors, eta, a) u = np.dot(mobility, force.flatten()) timer('python') u_numba = mob.single_wall_mobility_trans_times_force_numba(r_vectors, force, eta, a) timer('numba') u_numba = mob.single_wall_mobility_trans_times_force_numba(r_vectors, force, eta, a, periodic_length = L) timer('numba') if found_pycuda: u_gpu = mob.single_wall_mobility_trans_times_force_pycuda(r_vectors, force, eta, a) timer('pycuda') u_gpu = mob.single_wall_mobility_trans_times_force_pycuda(r_vectors, force, eta, a, periodic_length = L) timer('pycuda') if found_cpp:
u_no_wall_pycuda = mob.no_wall_mobility_trans_times_force_pycuda(r_vectors, force, eta, a) timer('zz_no_wall_pycuda') u_no_wall_pycuda = mob.no_wall_mobility_trans_times_force_pycuda(r_vectors, force, eta, a) timer('zz_no_wall_pycuda') # ================================================================ # WALL TESTS # ================================================================ timer('python_loops') mobility_loops = mob.single_wall_fluid_mobility_loops(r_vectors, eta, a) u_loops = np.dot(mobility_loops, force.flatten()) timer('python_loops') timer('python') mobility = mob.single_wall_fluid_mobility(r_vectors, eta, a) u = np.dot(mobility, force.flatten()) timer('python') if found_boost: timer('boost_full_matrix') mobility_boost = mob.boosted_single_wall_fluid_mobility(r_vectors, eta, a) u_boost_full = np.dot(mobility_boost, force.flatten()) timer('boost_full_matrix') timer('boost') force_hstack=np.hstack(force) u_boost = mob.boosted_mobility_vector_product(r_vectors, force_hstack, eta, a, periodic_length = L) timer('boost')