Program Listing for File TidalPotentialExpansion.h

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

#ifndef __UNIT_TESTS_TIDAL_POTENTIAL_EXPANSION_H
#define __UNIT_TESTS_TIDAL_POTENTIAL_EXPANSION_H

#include "EccentricOrbit.h"

#include "../../Evolve/TidalPotentialTerms.h"

#include <boost/math/special_functions/spherical_harmonic.hpp>
#include <cassert>

namespace Evolve {
    class TidalPotentialExpansion {
    private:
        TidalPotentialTerms __expansion_coef;

        double
            __primary_mass,

            __secondary_mass,

            __semimajor,

            __eccentricity,

            __inclination,

            __arg_of_periapsis;

        double tidal_term(
            int mprime,

            double radial_distance,

            double azimuthal_angle,

            double polar_angle,

            double orbital_phase
        ) const;
    public:
        TidalPotentialExpansion(
            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
        ) :
            __primary_mass(primary_mass),
            __secondary_mass(secondary_mass),
            __semimajor(semimajor),
            __eccentricity(eccentricity),
            __inclination(inclination),
            __arg_of_periapsis(arg_of_periapsis)
        {}

        double evaluate_spherical_coords(
            double radial_distance,

            double azimuthal_angle,

            double polar_angle,

            double time
        );

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

                double time
            );

        void set_eccentricity_order(unsigned e_order)
        {__expansion_coef.change_e_order(e_order);}
    }; //End TidalPotentialExpansion class.

    template<class POSITION_TYPE>
        double TidalPotentialExpansion::operator()(
            const POSITION_TYPE &position,
            double time
        )
        {
            double radial_distance = position.norm(),
                   polar_angle = (
                       radial_distance == 0
                       ? 0
                       : std::acos(position[2]/radial_distance)
                   ),
                   azimuthal_angle = std::atan2(position[1], position[0]);

            if(azimuthal_angle < 0)
                azimuthal_angle += 2.0 * M_PI;

            return evaluate_spherical_coords(
                radial_distance,
                azimuthal_angle,
                polar_angle,
                time
            );
        }
} //End Evolve namespace.
#endif