Program Listing for File Oblique10LinearQuantity.cpp

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

#include "Oblique10LinearQuantity.h"

double Oblique10LinearQuantity::indefinite_integral(double star_angmom) const
{
    double t2minus1 = std::pow(__total_angmom, 2) - 1.0;
    return (
        (2.0 * star_angmom) / (t2minus1 - std::pow(star_angmom, 2))
        +
        (1.0 / __total_angmom - 1.0) * std::atanh((__total_angmom - 1.0)
                                                  /
                                                  star_angmom)
        -
        2.0 * atanh(star_angmom / std::sqrt(t2minus1)) / std::sqrt(t2minus1)
        +
        (0.5 / __total_angmom + 0.5) * (
            std::log((1.0 + __total_angmom) / star_angmom + 1.0)
            -
            std::log((1.0 + __total_angmom) / star_angmom - 1.0)
        )
    );
}

Oblique10LinearQuantity::Oblique10LinearQuantity(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_indefinite_integral));
}

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

const Core::FunctionDerivatives *Oblique10LinearQuantity::deriv(
    double star_angmom
) const
{
    star_angmom /= __angmom_scale;
    double s2 = std::pow(star_angmom, 2),
           t2 = std::pow(__total_angmom, 2);
    return new Core::CubicSplineDerivatives(
        operator()(star_angmom),
        (
            (__total_angmom + star_angmom - 1.0)
            *
            (1.0 + star_angmom - __total_angmom)
            *
            (1.0 + __total_angmom - star_angmom)
            *
            (1.0 + __total_angmom + star_angmom)
            *
            std::pow(1.0 + s2 - t2, 2)
            /
            std::pow(4.0 * s2, 2)
        ) * __angmom_scale,
        (
            (1.0 - s2 - t2)
            *
            (1.0 + s2 - t2)
            *
            (1.0 + s2 * s2 - 2.0 * (1.0 + s2) * t2 + t2 * t2)
            /
            (4.0 * s2 * s2 * star_angmom)
        ) * __angmom_scale
    );
}