In-Class Example: Orbit Integrator Class

Let’s go back to our Example: Planetary Orbit example and make the OrbitState a class and define the ability to add OrbitState objects together and multiply them by a scalar. This would allow us to do something like:

OrbitState orbit{};
OrbitState dodt{};
double dt{};

...

orbit = orbit + dt * dodt;

and make our evolution code look simpler as a result.

The addition will look like:

OrbitState operator+(const OrbitState& orbit);

Note

The += operator is a different operator, and we’d need to write a separate function for it. We’ll look at this later.

We will need to define two multiplications, one for the case where our class is to the left of the *, e.g., orbit * dt and one for the case where our class is on the right of the *, e.g., dt * orbit.

The first case can be a class member and will have the signature:

OrbitState operator*(double a);

The second will be a friend, and have the signature:

friend OrbitState operator*(double a, const OrbitState& orbit);

Note

Our OrbitState contains position, velocity, and time. Previously we were not defining the time in the output from rhs(), but now we will need to, since our operators will act on it. Since the output of rhs() is just the time-derivative of the state, we can just set dodt.t = 1 in the output, since \(d/dt (t) = 1\).

Here’s the version of the code split up into files (we did this in In-Class Example: Splitting Up Our Orbit Code)—we’ll use this as the starting point: