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