Program Listing for File SumQuantity.h

Return to documentation for file (/home/kpenev/projects/git/poet/poet_src/StellarEvolution/SumQuantity.h)

#ifndef __SUM_QUANTITY_H
#define __SUM_QUANTITY_H

#include "../Core/SharedLibraryExportMacros.h"
#include "EvolvingStellarQuantity.h"

namespace StellarEvolution {

    class LIB_LOCAL SumQuantity : public EvolvingStellarQuantity {
    private:
        EvolvingStellarQuantity *q1, *q2;

        bool destroy_qs;
    public:
        SumQuantity(EvolvingStellarQuantity *quantity1,
                    EvolvingStellarQuantity *quantity2,
                    bool delete_inputs=false)
            : q1(quantity1), q2(quantity2), destroy_qs(delete_inputs) {}

        virtual void select_interpolation_region(double age) const
        {
            q1->select_interpolation_region(age);
            q2->select_interpolation_region(age);
        }

        double operator()(double age) const
        {return (*q1)(age)+(*q2)(age);}

        const FunctionDerivatives *deriv(double age) const
        {return new SumDerivatives(q1->deriv(age), q2->deriv(age), true);}

        double range_high() const
        {return std::min(q1->range_high(), q2->range_high());}

        double range_low() const
        {return std::max(q1->range_low(), q2->range_low());}

        double next_discontinuity() const
        {return std::min(q1->next_discontinuity(), q2->next_discontinuity());}

        void enable_next_interpolation_region() const
        {
            if(q1->next_discontinuity() == q2->next_discontinuity()) {
                q1->enable_next_interpolation_region();
                q2->enable_next_interpolation_region();
            } else if(q1->next_discontinuity() < q2->next_discontinuity())
                q1->enable_next_interpolation_region();
            else
                q2->enable_next_interpolation_region();
        }

        InterpSolutionIterator crossings(double =0) const
        {
            throw Core::Error::Runtime(
                "Called EvolvingStellarQuantity::crossings, which are ill "
                "defined."
            );
        }

        ~SumQuantity()
        {if(destroy_qs) {delete q1; delete q2;}}
    }; //End SumQuantity declaration.


} //End StellarEvolution namespace.

#endif