nbody.jl 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. include("nbody_display.jl")
  2. function mod2(v ::Vector{Float64})
  3. return sqrt(v[1]^2 + v[2]^2)
  4. end
  5. function compute_accelerations(positions ::Vector{Vector{Float64}}, accelerations ::Vector{Vector{Float64}}, masses ::Vector{Float64}, eps ::Float64)
  6. G ::Float64 = 6.67E-11
  7. n ::Int64 = length(accelerations)
  8. for i = 1:n
  9. sumacc ::Vector{Float64} = [0,0]
  10. for j = 1:n
  11. if i != j
  12. dv ::Vector{Float64} = positions[j] - positions[i]
  13. sumacc = sumacc + G * masses[j] * dv / (mod2(dv) + eps)^3
  14. end
  15. end
  16. accelerations[i] = sumacc
  17. end
  18. end
  19. function update_pos_vel(positions ::Vector{Vector{Float64}}, velocities ::Vector{Vector{Float64}}, accelerations ::Vector{Vector{Float64}}, dt ::Float64)
  20. n ::Int64 = length(positions)
  21. for i = 1:n
  22. velocities[i] = velocities[i] + accelerations[i] * dt
  23. positions[i] = positions[i] + velocities[i] * dt
  24. end
  25. end
  26. function nbody_jl(positions ::Vector{Vector{Float64}}, velocities ::Vector{Vector{Float64}}, accelerations ::Vector{Vector{Float64}}, masses ::Vector{Float64}, nbr_simulations ::Int64, eps ::Float64, dt ::Float64)
  27. for i = 1:nbr_simulations
  28. compute_accelerations(positions, accelerations, masses, eps)
  29. update_pos_vel(positions, velocities, accelerations,dt)
  30. # pixels ::Array{Array{Int64}} = [[0,0,0] for i = 1:1000*1000]
  31. # graph_planets(pixels, positions, -4E8, 4E8, 1000, 1000, "nbody$i.ppm")
  32. end
  33. end