Program Listing for File TidalPotentialExpansion.cpp

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

#include "TidalPotentialExpansion.h"

namespace Evolve {

    double TidalPotentialExpansion::tidal_term(int mprime,
                                               double radial_distance,
                                               double azimuthal_angle,
                                               double polar_angle,
                                               double orbital_phase) const
    {
        double result = 0.0;
        for(int m=-2; m<=2; ++m) {
            std::complex<double> no_deriv,
                                 inclination_deriv,
                                 eccentricity_deriv,
                                 error;
            __expansion_coef(__eccentricity,
                             m,
                             mprime,
                             no_deriv,
                             inclination_deriv,
                             eccentricity_deriv,
                             error);
            assert(std::isfinite(no_deriv.real()));
            result += (
                no_deriv
                *
                std::pow(radial_distance, 2)
                *
                boost::math::spherical_harmonic(
                    2,
                    m,
                    polar_angle,
                    azimuthal_angle
                )
                *
                std::complex<double>(std::cos(mprime * orbital_phase),
                                     -std::sin(mprime * orbital_phase))
            ).real();
            assert(std::isfinite(result));
        }
        return result;
    }

    double TidalPotentialExpansion::evaluate_spherical_coords(
        double radial_distance,
        double azimuthal_angle,
        double polar_angle,
        double time
    )
    {
        assert(radial_distance >= 0);
        assert(azimuthal_angle >= 0);
        assert(azimuthal_angle < 2 * M_PI);
        assert(polar_angle >= 0);
        assert(polar_angle <= M_PI);

        __expansion_coef.configure(__inclination, __arg_of_periapsis);

        double orbital_phase = (
            2.0 * M_PI * time
            /
            EccentricOrbit(__primary_mass,
                           __secondary_mass,
                           __semimajor,
                           __eccentricity).orbital_period()
        );

        double potential_norm = -(
            Core::AstroConst::G
            *
            __secondary_mass * Core::AstroConst::solar_mass
            /
            std::pow(__semimajor, 3)
        ) /  Core::AstroConst::solar_radius;

        double result = 0.0;
        int mprime_range = (static_cast<int>(__expansion_coef.current_e_order())
                            +
                            2);
        for(
            int mprime = -mprime_range;
            mprime <= mprime_range;
            ++mprime
        ) {
            result += tidal_term(mprime,
                                 radial_distance,
                                 azimuthal_angle,
                                 polar_angle,
                                 orbital_phase);
        }
        return potential_norm * result;
    }

}//End Evolve namespace