From fe6d88306f190cdd774c6a8ea4dbcf98bf02be78 Mon Sep 17 00:00:00 2001 From: Alex Selimov Date: Fri, 12 Sep 2025 06:16:37 -0400 Subject: [PATCH] Fix force tests --- kernels/forces.cuh | 6 -- tests/cuda_unit_tests/test_forces.cu | 125 +++++++++++++-------------- 2 files changed, 62 insertions(+), 69 deletions(-) diff --git a/kernels/forces.cuh b/kernels/forces.cuh index b96f412..640da42 100644 --- a/kernels/forces.cuh +++ b/kernels/forces.cuh @@ -21,13 +21,7 @@ __global__ void calc_forces_and_energies(real *xs, real *forces, real *energies, PotentialType potential) { int i = blockIdx.x * blockDim.x + threadIdx.x; - if (i == 0) { - printf("n_particles: %d\n", n_particles); - printf("box_len: %f %f %f\n", box_len[0], box_len[1], box_len[2]); - } - if (i < n_particles) { - printf("Thread %d, Block %d\n", threadIdx.x, blockIdx.x); real xi = xs[3 * i]; real yi = xs[3 * i + 1]; real zi = xs[3 * i + 2]; diff --git a/tests/cuda_unit_tests/test_forces.cu b/tests/cuda_unit_tests/test_forces.cu index a576ec8..3576dbb 100644 --- a/tests/cuda_unit_tests/test_forces.cu +++ b/tests/cuda_unit_tests/test_forces.cu @@ -92,7 +92,7 @@ TEST_F(CudaForceKernelTest, BasicFunctionalityTest) { // Set up test data - simple 2x2 grid of particles std::vector positions = { 0.0, 0.0, 0.0, // particle 0 - 1.0, 0.0, 0.0, // particle 1 + 0.5, 0.0, 0.0, // particle 1 }; std::vector box_dimensions = {10.0, 10.0, 10.0}; @@ -124,67 +124,66 @@ TEST_F(CudaForceKernelTest, BasicFunctionalityTest) { EXPECT_TRUE(has_nonzero_energy) << "Expected non-zero energies for particles "; } -// -// TEST_F(CudaKernelTest, PeriodicBoundaryConditionsTest) { -// const int n_particles = 2; -// const real tolerance = 1e-5; -// -// // Place particles near opposite edges of a small box -// std::vector positions = { -// 0.1, 0.0, 0.0, // particle 0 near left edge -// 4.9, 0.0, 0.0 // particle 1 near right edge -// }; -// std::vector box_dimensions = {5.0, 5.0, 5.0}; // Small box to test -// PBC -// -// auto [result_forces, result_energies] = -// run_force_calculation(n_particles, &positions, &box_dimensions); -// -// // With PBC, particles should interact as if they're close (distance ~0.2) -// // rather than far apart (distance ~4.8) -// EXPECT_GT(std::abs(result_forces[0]), tolerance) -// << "Expected significant force due to PBC"; -// EXPECT_GT(std::abs(result_energies[0]), tolerance) -// << "Expected significant energy due to PBC"; -// } -// TEST_F(CudaForceKernelTest, SingleParticleTest) { -// const int n_particles = 1; -// -// std::vector positions = {0.0, 0.0, 0.0}; -// std::vector box_dimensions = {10.0, 10.0, 10.0}; -// -// auto [result_forces, result_energies] = -// run_force_calculation(n_particles, positions, box_dimensions); -// // Single particle should have zero force and energy -// EXPECT_NEAR(result_forces[0], 0.0, 1e-10); -// EXPECT_NEAR(result_forces[1], 0.0, 1e-10); -// EXPECT_NEAR(result_forces[2], 0.0, 1e-10); -// EXPECT_NEAR(result_energies[0], 0.0, 1e-10); -// } +TEST_F(CudaForceKernelTest, PeriodicBoundaryConditionsTest) { + const int n_particles = 2; + const real tolerance = 1e-5; -// TEST_F(CudaKernelTest, ForceSymmetryTest) { -// const int n_particles = 2; -// const real tolerance = 1e-5; -// -// std::vector positions = { -// 0.0, 0.0, 0.0, // particle 0 -// 1.5, 0.0, 0.0 // particle 1 -// }; -// std::vector box_dimensions = {10.0, 10.0, 10.0}; -// -// auto [result_forces, result_energies] = -// run_force_calculation(n_particles, &positions, &box_dimensions); -// -// // Newton's third law: forces should be equal and opposite -// EXPECT_NEAR(result_forces[0], -result_forces[3], tolerance) -// << "Force x-components should be opposite"; -// EXPECT_NEAR(result_forces[1], -result_forces[4], tolerance) -// << "Force y-components should be opposite"; -// EXPECT_NEAR(result_forces[2], -result_forces[5], tolerance) -// << "Force z-components should be opposite"; -// -// // Energies should be equal for symmetric particles -// EXPECT_NEAR(result_energies[0], result_energies[1], tolerance) -// << "Energies should be equal"; -// } + // Place particles near opposite edges of a small box + std::vector positions = { + 0.1, 0.0, 0.0, // particle 0 near left edge + 4.9, 0.0, 0.0 // particle 1 near right edge + }; + std::vector box_dimensions = {5.0, 5.0, 5.0}; // Small box to test PBC + + auto [result_forces, result_energies] = + run_force_calculation(n_particles, positions, box_dimensions); + + // With PBC, particles should interact as if they're close (distance ~0.2) + // rather than far apart (distance ~4.8) + EXPECT_GT(std::abs(result_forces[0]), tolerance) + << "Expected significant force due to PBC"; + EXPECT_GT(std::abs(result_energies[0]), tolerance) + << "Expected significant energy due to PBC"; +} + +TEST_F(CudaForceKernelTest, SingleParticleTest) { + const int n_particles = 1; + + std::vector positions = {0.0, 0.0, 0.0}; + std::vector box_dimensions = {10.0, 10.0, 10.0}; + + auto [result_forces, result_energies] = + run_force_calculation(n_particles, positions, box_dimensions); + // Single particle should have zero force and energy + EXPECT_NEAR(result_forces[0], 0.0, 1e-10); + EXPECT_NEAR(result_forces[1], 0.0, 1e-10); + EXPECT_NEAR(result_forces[2], 0.0, 1e-10); + EXPECT_NEAR(result_energies[0], 0.0, 1e-10); +} + +TEST_F(CudaForceKernelTest, ForceSymmetryTest) { + const int n_particles = 2; + const real tolerance = 1e-5; + + std::vector positions = { + 0.0, 0.0, 0.0, // particle 0 + 1.5, 0.0, 0.0 // particle 1 + }; + std::vector box_dimensions = {10.0, 10.0, 10.0}; + + auto [result_forces, result_energies] = + run_force_calculation(n_particles, positions, box_dimensions); + + // Newton's third law: forces should be equal and opposite + EXPECT_NEAR(result_forces[0], -result_forces[3], tolerance) + << "Force x-components should be opposite"; + EXPECT_NEAR(result_forces[1], -result_forces[4], tolerance) + << "Force y-components should be opposite"; + EXPECT_NEAR(result_forces[2], -result_forces[5], tolerance) + << "Force z-components should be opposite"; + + // Energies should be equal for symmetric particles + EXPECT_NEAR(result_energies[0], result_energies[1], tolerance) + << "Energies should be equal"; +}