Program Listing for File LogDerivatives.cpp

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

#include "LogDerivatives.h"

namespace StellarEvolution {

    double LogDerivatives::transform_log_x_deriv(unsigned order) const
    {
        switch(order) {
            case 0:
                return __underlying_deriv_values[0];
            case 1:
                return __underlying_deriv_values[1] / __x;
            case 2:
                return (
                    __underlying_deriv_values[2]
                    -
                    __underlying_deriv_values[1]
                )/(__x * __x);
            default:
                throw Core::Error::BadFunctionArguments(
                    "Transforming log-derivatives of order higher than 2 is"
                    " not implemented."
                );
        }
    }

    double LogDerivatives::transform_log_y_deriv(
        double uncorrected_derivative,
        unsigned order
    ) const
    {
        if(order == 0)
            return std::exp(uncorrected_derivative);
        else if(order == 1)
            return __deriv_values[0] * uncorrected_derivative;
        else if(order == 2) {
            if(__deriv_values[0] == 0) {
                assert(__deriv_values[1] == 0);
                return 0.0;
            } else {
                return (
                    __deriv_values[0] * uncorrected_derivative
                    +
                    __deriv_values[1] * __deriv_values[1] / __deriv_values[0]
                );
            }
        } else {
            throw Core::Error::BadFunctionArguments(
                "Requesting derivative of roder > 2 not supported!"
            );
        }
    }

    double LogDerivatives::order(unsigned deriv_order) const
    {
        if(__deriv_values.size() <= deriv_order) {
            for(
                unsigned order = __deriv_values.size();
                order <= deriv_order;
                ++order
            ) {
                __underlying_deriv_values.push_back(calc_deriv(order));
                double corrected_deriv_value = (
                    __log_x
                    ? transform_log_x_deriv(order)
                    : calc_deriv(order)
                );
                if(__log_y)
                    corrected_deriv_value = transform_log_y_deriv(
                        corrected_deriv_value,
                        order
                    );
                __deriv_values.push_back(corrected_deriv_value);
            }
        }
        return __deriv_values[deriv_order];
    }

} //End of StellarEvolution namespace.