Program Listing for File TidalPotential.h

Return to documentation for file (/home/kpenev/projects/git/poet/poet_src/unit_tests/testEvolve/TidalPotential.h)

#ifndef __UNIT_TESTS_TIDAL_POTENTIAL_H
#define __UNIT_TESTS_TIDAL_POTENTIAL_H

#include "EccentricOrbit.h"
#include <cmath>

namespace Evolve {
    class TidalPotential {
    private:
        EccentricOrbit __orbit;

        double
            __inclination,

            __arg_of_periapsis;

    public:
        TidalPotential(
            double primary_mass=Core::NaN,

            double secondary_mass=Core::NaN,

            double semimajor=Core::NaN,

            double eccentricity=Core::NaN,

            double inclination=Core::NaN,

            double arg_of_periapsis=Core::NaN
        ) :
            __orbit(primary_mass, secondary_mass, semimajor, eccentricity),
            __inclination(inclination),
            __arg_of_periapsis(arg_of_periapsis)
        {}

        double inclination() const {return __inclination;}

        double &inclination() {return __inclination;}

        double arg_of_periapsis() const {return __arg_of_periapsis;}

        double &arg_of_periapsis() {return __arg_of_periapsis;}

        const EccentricOrbit &orbit() const {return __orbit;}

        EccentricOrbit &orbit() {return __orbit;}

        template<class POSITION_TYPE>
            double operator()(
                const POSITION_TYPE &position,

                double time
            ) const;
    };

    template<class POSITION_TYPE>
        double TidalPotential::operator()(const POSITION_TYPE &position,
                                          double time) const
        {
            Eigen::Vector3d secondary_position = __orbit.secondary_position(
                2.0 * M_PI * time / __orbit.orbital_period()
            );


            //Rotate around L_hat to a coordinate system with z along L and y
            //along SxL
            double z_rotated_secondary_x = (
                secondary_position[0] * std::cos(__arg_of_periapsis)
                -
                secondary_position[1] * std::sin(__arg_of_periapsis)
            );
            double z_rotated_secondary_y = (
                secondary_position[0] * std::sin(__arg_of_periapsis)
                +
                secondary_position[1] * std::cos(__arg_of_periapsis)
            );

            //Rotated around SxL to the final coordinate system.
            Eigen::Vector3d transformed_secondary_position(
                (
                    z_rotated_secondary_x * std::cos(__inclination)
                    +
                    secondary_position[2] * std::sin(__inclination)
                ),
                z_rotated_secondary_y,
                (
                    -z_rotated_secondary_x * std::sin(__inclination)
                    +
                    secondary_position[2] * std::cos(__inclination)
                )
            );

            double center_to_secondary = transformed_secondary_position.norm();
            double position_to_secondary = (
                position
                -
                transformed_secondary_position
            ).norm();
            return (
                Core::AstroConst::G
                *
                __orbit.secondary_mass() * Core::AstroConst::solar_mass
                *
                (
                    position.dot(transformed_secondary_position)
                    /
                    std::pow(center_to_secondary, 3)
                    -
                    1.0 / position_to_secondary
                    +
                    1.0 / center_to_secondary
                ) / Core::AstroConst::solar_radius
            );
        }
} //End Evolve namespace

#endif