Program Listing for File CInterface.cpp

Return to documentation for file (/home/kpenev/projects/git/poet/poet_src/Star/CInterface.cpp)

#define BUILDING_LIBRARY
#include "CInterface.h"
#include "../Evolve/CInterface.h"

const int NO_DERIV = Evolve::Dissipation::NO_DERIV;
const int AGE_DERIV = Evolve::Dissipation::AGE;
const int SPIN_FREQUENCY_DERIV = Evolve::Dissipation::SPIN_FREQUENCY;
const int ORBITAL_FREQUENCY_DERIV = Evolve::Dissipation::ORBITAL_FREQUENCY;

double lag_from_lgQ(double lgQ)
{
    return 15.0 / (16.0 * M_PI * std::pow(10.0, lgQ));
}

EvolvingStar *create_star(double mass,
                          double feh,
                          double wind_strength,
                          double wind_saturation_frequency,
                          double diff_rot_coupling_timescale,
                          const MESAInterpolator *interpolator)
{
    return reinterpret_cast<EvolvingStar*>(
        new Star::InterpolatedEvolutionStar(
            mass,
            feh,
            wind_strength,
            wind_saturation_frequency,
            diff_rot_coupling_timescale,
            *reinterpret_cast<const StellarEvolution::MESA::Interpolator*>(
                interpolator
            )
        )
    );
}

void destroy_star(EvolvingStar *star)
{
    delete reinterpret_cast<Star::InterpolatedEvolutionStar*>(star);
}

void set_star_dissipation(EvolvingStar *star,
                     unsigned zone_index,
                     unsigned num_tidal_frequency_breaks,
                     unsigned num_spin_frequency_breaks,
                     double *tidal_frequency_breaks,
                     double *spin_frequency_breaks,
                     double *tidal_frequency_powers,
                     double *spin_frequency_powers,
                     double reference_phase_lag)
{
    Star::InterpolatedEvolutionStar* real_star =
        reinterpret_cast<Star::InterpolatedEvolutionStar*>(star);
    Evolve::BrokenPowerlawPhaseLagZone *zone;
    if(zone_index == 0) zone = &(real_star->envelope());
    else zone = &(real_star->core());

#ifndef NDEBUG
    std::cerr << "Setting zone "
              << zone_index
              << " dissipation with "
              << num_tidal_frequency_breaks
              << " tidal and "
              << num_spin_frequency_breaks
              << " spin frequency breaks."
              << std::endl;
#endif

    set_zone_dissipation(
        reinterpret_cast<BrokenPowerlawPhaseLagZone*>(zone),
        num_tidal_frequency_breaks,
        num_spin_frequency_breaks,
        tidal_frequency_breaks,
        spin_frequency_breaks,
        tidal_frequency_powers,
        spin_frequency_powers,
        reference_phase_lag
    );
}

void detect_stellar_wind_saturation(EvolvingStar *star)
{
    reinterpret_cast<Star::InterpolatedEvolutionStar*>(
        star
    )->detect_saturation();
}

void select_interpolation_region(const EvolvingStar *star,
                                 double age)
{
    return reinterpret_cast<const Star::InterpolatedEvolutionStar*>(
        star
    )->select_interpolation_region(age);
}

double modified_phase_lag(const EvolvingStar *star,
                          unsigned zone_index,
                          int orbital_frequency_multiplier,
                          int spin_frequency_multiplier,
                          double forcing_frequency,
                          int entry,
                          double *above_lock_value)
{
    return reinterpret_cast<const Star::InterpolatedEvolutionStar*>(
        star
    )->zone(zone_index).modified_phase_lag(
        orbital_frequency_multiplier,
        spin_frequency_multiplier,
        forcing_frequency,
        static_cast<Evolve::Dissipation::QuantityEntry>(entry),
        *above_lock_value
    );
}

double core_formation_age(const EvolvingStar *star)
{
    return reinterpret_cast<const Star::InterpolatedEvolutionStar*>(
        star
    )->core().formation_age();
}

double lifetime(const EvolvingStar *star)
{
    return reinterpret_cast<const Star::InterpolatedEvolutionStar*>(
        star
    )->lifetime();
}

double luminosity(EvolvingStar *star, double age)
{
    const Star::InterpolatedEvolutionStar *actual_star =
        reinterpret_cast<const Star::InterpolatedEvolutionStar*>(
            star
        );
    actual_star->select_interpolation_region(age);
    return actual_star->luminosity(age);
}

void luminosity_array(EvolvingStar *star,
                      const double *age,
                      unsigned nvalues,
                      double *result)
{
    Star::InterpolatedEvolutionStar *actual_star =
        reinterpret_cast<Star::InterpolatedEvolutionStar*>(
            star
        );
    for(unsigned i = 0; i < nvalues; ++i) {
        if(
            i == 0
            ||
            age[i] < age[i - 1]
        )
            actual_star->select_interpolation_region(age[i]);
        else
            actual_star->reached_critical_age(age[i]);
        result[i] = actual_star->luminosity(age[i]);
    }
}

double core_inertia(EvolvingStar *star, double age)
{
    const Star::EvolvingStellarCore &core =
        reinterpret_cast<const Star::InterpolatedEvolutionStar*>(
            star
        )->core();
    core.select_interpolation_region(age);
    return core.moment_of_inertia(age);
}

void zone_inertia_array(Star::EvolvingStellarZone &zone,
                        const double *age,
                        unsigned nvalues,
                        double *result)
{
    for(unsigned i = 0; i < nvalues; ++i) {
        if(
            i == 0
            ||
            age[i] < age[i - 1]
        )
            zone.select_interpolation_region(age[i]);
        else
            zone.reached_critical_age(age[i]);
        result[i] = zone.moment_of_inertia(age[i]);
    }
}

void core_inertia_array(EvolvingStar *star,
                        const double *age,
                        unsigned nvalues,
                        double *result)
{
    zone_inertia_array(
        reinterpret_cast<Star::InterpolatedEvolutionStar*>(
            star
        )->core(),
        age,
        nvalues,
        result
    );
}

double envelope_inertia(EvolvingStar *star, double age)
{
    const Star::EvolvingStellarEnvelope &envelope =
        reinterpret_cast<const Star::InterpolatedEvolutionStar*>(
            star
        )->envelope();
    envelope.select_interpolation_region(age);
    return envelope.moment_of_inertia(age);
}

void envelope_inertia_array(EvolvingStar *star,
                            const double *age,
                            unsigned nvalues,
                            double *result)
{
    zone_inertia_array(
        reinterpret_cast<Star::InterpolatedEvolutionStar*>(
            star
        )->envelope(),
        age,
        nvalues,
        result
    );
}

double star_radius(EvolvingStar *star, double age)
{
    const Star::EvolvingStellarEnvelope &envelope =
        reinterpret_cast<const Star::InterpolatedEvolutionStar*>(
            star
        )->envelope();
    envelope.select_interpolation_region(age);
    return envelope.outer_radius(age);
}

void star_radius_array(EvolvingStar *star,
                       const double *age,
                       unsigned nvalues,
                       double *result)
{
    Star::EvolvingStellarZone &zone =
        reinterpret_cast<Star::InterpolatedEvolutionStar*>(
            star
        )->envelope();
    for(unsigned i = 0; i < nvalues; ++i) {
        if(
            i == 0
            ||
            age[i] < age[i - 1]
        )
            zone.select_interpolation_region(age[i]);
        else
            zone.reached_critical_age(age[i]);
        result[i] = zone.outer_radius(age[i]);
    }
}