N-body simulation using various methods.
Project members: Martin LAU, Ziyue QIU (William), Oscar PEYRON.
- C++17 compiler (e.g., g++ 7+)
- ImageMagick++ (for image creation)
- ffmpeg (for video creation)
- (Optional) NVIDIA CUDA Toolkit (for GPU mode)
- fftw3 Fast Fourier transform
- Make (optional, for convenience)
# Basic simulation with default parameters
make nbody
# Customize simulation parameters
make nbody NTHREADS=13 VISUALIZE=true PRINT_TELEMETRY=true EXPORT_CSV=true
Available Make Parameters
NTHREADS: Number of threads to use (default: 5)
VISUALIZE: Generate visualization (default: false)
PRINT_TELEMETRY: Print simulation data to console (default: false)
EXPORT_CSV: Export simulation data to CSV (default: false)
Make Targets
nbody: Run basic N-body simulation
nbody_particle: Run particle mesh simulation
bs: Run Barnes-Hut serial implementation
bsp: Run Barnes-Hut parallel implementation (13 threads)
# 1. Compile sources
g++ -std=c++17 -O3 -I./src \
-c src/core.cpp src/simplesimulation.cpp src/barneshutt.cpp main.cpp
# 2. Link into executable
g++ -O3 \
core.o simplesimulation.o barneshutt.o main.o \
-o nbody_cpu $(Magick++-config --cppflags --cxxflags --ldflags --libs)# 1. Compile sources
g++ -std=c++17 -O3 -I./src \
-c src/core.cpp src/simplesimulation.cpp src/particlemesh_thread.cpp src/particlemesh.cpp mainparticlemesh.cpp
# 2. Link into executable
g++ -O3 \
core.o simplesimulation.o particlemesh_thread.o particlemesh.o mainparticlemesh.o \
-o nbodyparticlemesh_cpu $(Magick++-config --cppflags --cxxflags --ldflags --libs)nvcc -std=c++14 -O3 -Xcompiler "-std=c++17 -I./src" -DUSE_CUDA \
src/core.cpp src/simplesimulation.cpp src/barneshutt.cpp main.cpp \
-o nbody_gpu $(Magick++-config --cppflags --cxxflags --ldflags --libs) -lcudartAll executables accept a -method= flag to select the simulation algorithm:
naive— simple (O(N^2)) CPU simulationbarneshut— Barnes–Hut (O(N \log N)) CPU simulation
# Naive
./nbody -method=naive
# Barnes–Hut sequential
./nbody -method=barneshut
# Barnes–Hut parallel
./nbody -method=barneshut -parallel
#Particle-mesh sequential
./nbodyparticlemesh_cpu -method=particlemesh
#Particle-mesh parallel
./nbodyparticlemesh_cpu -method=particlemesh_threadEach run will produce a GIF (e.g., naive_simulation.gif, barneshut_simulation.gif, or gpu_simulation.gif or particle_mesh.gif or particle_mesh_thread.gif) in the working directory.