Velocity Verlet C++ implementation

Click For Summary
SUMMARY

The discussion centers on a C++ implementation of the Velocity Verlet integrator for a solar system simulator, where the user reports inaccuracies in planetary movement, specifically planets moving away from the sun by 10^10 km. The provided code snippet outlines the integrator's structure, which includes position and velocity updates based on accelerations. A key recommendation is to utilize a debugger to set breakpoints and compare computed results against theoretical values to identify errors in the calculations.

PREREQUISITES
  • Understanding of C++ programming, including vector manipulation
  • Familiarity with numerical integration methods, specifically the Velocity Verlet algorithm
  • Basic knowledge of gravitational physics and solar system dynamics
  • Experience with debugging techniques in C++
NEXT STEPS
  • Learn how to effectively use a debugger in C++ to trace variable values
  • Study the mathematical foundations of the Velocity Verlet algorithm
  • Explore best practices for implementing physics simulations in C++
  • Investigate common pitfalls in numerical integration and how to avoid them
USEFUL FOR

Developers working on physics simulations, C++ programmers seeking to improve their debugging skills, and anyone interested in implementing numerical methods for dynamic systems.

madsmh
Messages
32
Reaction score
2
I have been working on implementing a solar system system simulator in C++ - but am getting incorrect results on the order of 10^10 km, and it seems that the planets are moving directly away from the sun. I suspect that there is a mistake in the integrator (Velocity Verlet) that I have posted below. It would be appreciated if I could get someone to check that, assuming that the rest of the program is correct, the integrator is working. The code should be self-explanatory.

Thanks!

Code:
void verlet(System& system, Trajectory& trajectory, double delta){

    long n = trajectory.get_number_of_rows();
    long n_bodies = system.get_number_of_bodies();

    double delta2 = pow(delta, 2);

    std::count << "Starting integrator." << std::endl;

    for (int i = 0; i < n; ++i) {
        if(i == 0){
            std::vector<Vector3 > x0 = system.get_positions();
            std::vector<Vector3> v0 = system.get_velocities();

            trajectory.set_position(x0, v0);
            system.set_positions(x0);
            system.set_velocities(v0);
        }
        else {

            std::vector<Vector3> x0 = trajectory.get_positions_at_index(i-1);
            std::vector<Vector3> v0 = trajectory.get_velocities_at_index(i-1);

            std::vector<Vector3> a0 = system.get_accelerations();

            std::vector<Vector3> x1 {};

            for (long j = 0; j < n_bodies; ++j) {
                x1.emplace_back(x0[j] + v0[j] * delta + delta2 * 0.5 * a0[j]);
            }

            system.set_positions(x1);

            std::vector<Vector3 > a1 = system.get_accelerations();

            std::vector<Vector3 > v1;

            for (long k = 0; k < n_bodies; ++k) {
                v1.emplace_back(v0[k] + 0.5 *( a0[k] + a1[k]) * delta );
            }

            system.set_velocities(v1);

            trajectory.set_position(x1, v1);
        }
    }
    std::count << "Integration finished." << std::endl;
}
 
Technology news on Phys.org
Since your results are so far off, I suggest you use a debugger and put breakpoints in, and compare the computed results with results done on paper to see where the calculations are going wrong. I would put the first breakpoint on the last statement of the first if block in the outer for loop. If the calculations are OK when i == 0, I would put another breakpoint just after the calculation for a0 in the else block. Again, compare the results of your program with results obtained with paper and pencil. Possibly you'll find the error within just a couple of iterations.

Since you are new to C++ (which you said in another thread), do yourself a favor and learn at least the rudimentary use of a debugger.
 
  • Like
Likes   Reactions: jim mcnamara
Thank you, Mark44, for your reply. It was helpful in finding the bug.

.. Mads
 

Similar threads

  • · Replies 5 ·
Replies
5
Views
3K
  • · Replies 2 ·
Replies
2
Views
4K
  • · Replies 10 ·
Replies
10
Views
2K
  • · Replies 2 ·
Replies
2
Views
2K
  • · Replies 9 ·
Replies
9
Views
3K
  • · Replies 15 ·
Replies
15
Views
3K
  • · Replies 19 ·
Replies
19
Views
5K
  • · Replies 4 ·
Replies
4
Views
3K
  • · Replies 1 ·
Replies
1
Views
3K
Replies
4
Views
11K