Program Listing for File SaturatingSkumanichWindBody.h

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

#ifndef __SATURATING_SKUMANICH_WIND_BODY_H
#define __SATURATING_SKUMANICH_WIND_BODY_H

#include "../Core/SharedLibraryExportMacros.h"
#include "../Evolve/DissipatingBody.h"
#include "../Evolve/BinarySystem.h"

namespace Star {

    class LIB_PUBLIC SaturatingSkumanichWindBody :
        virtual public Evolve::DissipatingBody {
    private:
        double __wind_strength,

            __saturation_freq;

        bool __saturated;

        std::list<bool> __saturation_evolution;

#ifndef NDEBUG
        bool __detected_saturation;
#endif
    public:
        SaturatingSkumanichWindBody(
            double wind_strength,

            double saturation_frequency
        ) :
            __wind_strength(wind_strength),
            __saturation_freq(saturation_frequency)
#ifndef NDEBUG
            , __detected_saturation(false)
#endif
            {}

        double angular_momentum_loss(
            Evolve::Dissipation::QuantityEntry entry = Evolve::Dissipation::NO_DERIV
        ) const;

        double saturation_frequency() {return __saturation_freq;}

        void detect_saturation()
        {
            __saturated = (std::abs(spin_frequency()) > __saturation_freq);
#ifndef NDEBUG
            __detected_saturation = true;
#endif
        }

        bool saturated() {return __saturated;}

        void saturation_freq_crossed(
                short
#ifndef NDEBUG
                deriv_sign
#endif
                )
        {
            assert(deriv_sign == (__saturated ? -1 : 1));

            __saturated = !__saturated;
        }

        virtual void add_to_evolution()
        {
            __saturation_evolution.push_back(__saturated);
            Evolve::DissipatingBody::add_to_evolution();
        }

        virtual void rewind_evolution(
                unsigned nsteps
        )
        {
            for(unsigned i = 0; i < nsteps; ++i)
                __saturation_evolution.pop_back();
            Evolve::DissipatingBody::rewind_evolution(nsteps);
        }

        virtual void reset_evolution()
        {
            __saturation_evolution.clear();
            Evolve::DissipatingBody::reset_evolution();
        }

        virtual Evolve::CombinedStoppingCondition *stopping_conditions(
                Evolve::BinarySystem &system,

                bool primary
        );

        const std::list<bool> &wind_saturation_evolution() const
        {return __saturation_evolution;}

        void spin_jumped()
        {
            detect_saturation();
            Evolve::DissipatingBody::spin_jumped();
        }

        virtual ~SaturatingSkumanichWindBody() {}
    };//End SaturatingSkumanichWindBody class.

}//End Star namespace.

#endif