Program Listing for File Oblique20LinearQuantity.cpp

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

#include "Oblique20LinearQuantity.h"

double Oblique20LinearQuantity::indefinite_integral(double star_angmom) const
{
    double s2 = std::pow(star_angmom, 2),
           t2 = std::pow(__total_angmom, 2),
           t3 = t2 * __total_angmom,
           atanh_good_arg = star_angmom / (1.0 + __total_angmom),
           atanh_bad_arg = star_angmom / (1.0 - __total_angmom);
    return (
        (
            2.0 * star_angmom * __total_angmom
            *
            (1.0 - s2 * t2 + t2 * t2 - (s2 + 2.0 * t2))
            /
            (1.0 + std::pow(s2 - t2, 2) - 2.0 * (s2 + t2))
        )
        +
        (t3 - 1.0) * (std::log(std::abs(atanh_bad_arg + 1.0))
                      -
                      std::log(std::abs(atanh_bad_arg - 1.0))) / 2.0
        +
        (1.0 + t3) * std::atanh(atanh_good_arg)
    ) / (2.0 * t3);
}

Oblique20LinearQuantity::Oblique20LinearQuantity(double total_angmom,
                                                 double orbital_angmom,
                                                 double initial_star_angmom) :
    __total_angmom(total_angmom / orbital_angmom),
    __initial_star_angmom(initial_star_angmom / orbital_angmom),
    __angmom_scale(orbital_angmom),
    __initial_indefinite_integral(indefinite_integral(__initial_star_angmom))
{
    assert(total_angmom > 0);
    assert(orbital_angmom > 0);
    assert(initial_star_angmom > 0);
    assert(total_angmom <= orbital_angmom + initial_star_angmom);
    assert(orbital_angmom <= total_angmom + initial_star_angmom);
    assert(initial_star_angmom <= orbital_angmom + total_angmom);
    assert(std::pow(total_angmom, 2) - std::pow(orbital_angmom, 2)
           >
           std::pow(initial_star_angmom, 2));
    assert(!std::isnan(__initial_star_angmom));
    assert(!std::isnan(__initial_indefinite_integral));
}

double Oblique20LinearQuantity::operator()(double star_angmom) const
{
    return (indefinite_integral(star_angmom / __angmom_scale)
            -
            __initial_indefinite_integral) * __angmom_scale;
}

const Core::FunctionDerivatives *Oblique20LinearQuantity::deriv(
    double
) const
{
    throw Core::Error::Runtime("Differentiating m=2, m' = 0 linearly evolving "
                               "function of the stellar angular momentum is not"
                               " supported.");
}