Program Listing for File WindSaturationCondition.cpp¶
↰ Return to documentation for file (/home/kpenev/projects/git/poet/poet_src/Star/WindSaturationCondition.cpp)
#define BUILDING_LIBRARY
#include "WindSaturationCondition.h"
namespace Star {
std::valarray<double> WindSaturationCondition::operator()(
Core::EvolModeType evol_mode,
const std::valarray<double> &,
const std::valarray<double> &derivatives,
std::valarray<double> &stop_deriv) const
{
#ifdef DEBUG
assert(evol_mode != Core::LOCKED_SURFACE_SPIN);
if(evol_mode != Core::BINARY) assert(__primary);
#endif
unsigned angmom_index = 1 + 2 * __body.number_zones();
if(evol_mode == Core::BINARY)
angmom_index += 2 * __other_body.number_zones()
+
(__primary ? 0
: __other_body.number_zones()
-__other_body.number_locked_zones());
else angmom_index -= 3;
assert(angmom_index <= derivatives.size());
double wsurf = __body.spin_frequency(),
surf_angmom_deriv,
result = (
(std::abs(wsurf) - __saturation_freq)
/ __saturation_freq
),
wsurf_sign = (wsurf < 0 ? -1.0 : 1.0);
if(std::isinf(__saturation_freq)) result=-1;
if(__body.zone(0).locked()) return std::valarray<double>(result, 1);
surf_angmom_deriv = derivatives[angmom_index];
stop_deriv.resize(
1
,
(
wsurf_sign * surf_angmom_deriv
-
__body.zone(0).moment_of_inertia(1) * std::abs(wsurf)
)
/
(__body.zone(0).moment_of_inertia() * __saturation_freq)
);
return std::valarray<double>(result, 1);
}
std::string WindSaturationCondition::describe(
int
#ifndef NDEBUG
index
#endif
) const
{
assert(index <= 0);
std::ostringstream description;
description << (__primary ? "Primary" : "Secondary")
<< " surface spin "
<< (expected_crossing_deriv_sign() > 0
? "exceeding"
: "falling below")
<< " the wind saturation threshold of"
<< __saturation_freq
<< " rad/day";
return description.str();
}
}//End Star namespace.