Program Listing for File SecondaryDeathCondition.cpp¶
↰ Return to documentation for file (/home/kpenev/projects/git/poet/poet_src/Evolve/SecondaryDeathCondition.cpp)
#define BUILDING_LIBRARY
#include "SecondaryDeathCondition.h"
#include "BinarySystem.h"
namespace Evolve {
std::valarray<double> SecondaryDeathCondition::operator()(
Core::EvolModeType
#ifndef NDEBUG
evol_mode
#endif
,
const std::valarray<double> &orbit,
const std::valarray<double> &derivatives,
std::valarray<double> &stop_deriv) const
{
assert(evol_mode == Core::BINARY);
assert(orbit.size() == (1
+
3 * __system.number_zones()
-
__system.number_locked_zones()));
assert(orbit.size() == derivatives.size());
double min_semimajor = __system.minimum_separation(),
semimajor = __system.semimajor(),
e = __system.eccentricity(),
dsemimajor_dt = derivatives[0],
de_dt = derivatives[1];
if(__system.number_locked_zones() == 0)
dsemimajor_dt *= semimajor/(6.5 * orbit[0]);
stop_deriv.resize(
1,
(
(1.0 - e) * (
dsemimajor_dt * min_semimajor
-
semimajor * __system.minimum_separation(true)
)
-
semimajor * min_semimajor * de_dt
)
/
std::pow(min_semimajor, 2));
#ifdef VERBOSE_DEBUG
std::cerr << "amin = " << min_semimajor
<< ", a = " << semimajor
<< ", da/dt = " << dsemimajor_dt
<< ", e = " << e
<< ", de/dt = " << de_dt
<< ", d(death cond)/dt: " << stop_deriv[0] << std::endl;
#endif
return std::valarray<double>(
(semimajor * (1 - e) - min_semimajor) / min_semimajor,
1
);
}
void SecondaryDeathCondition::reached(short deriv_sign,
unsigned index)
{
assert(index == 0);
assert(deriv_sign == -1);
StoppingCondition::reached(deriv_sign, index);
__system.secondary_died();
}
std::string SecondaryDeathCondition::describe(int ) const
{
std::ostringstream description;
description << "Semimajor axis crossing death boundary of "
<< __system.minimum_separation();
return description.str();
}
} //End Evolve namespace.