Program Listing for File BrokenPowerlawPhaseLagZone.h

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

#ifndef __BROKEN_POWERLAW_PHASE_LAG_ZONE
#define __BROKEN_POWERLAW_PHASE_LAG_ZONE

#include "../Core/SharedLibraryExportMacros.h"
#include "DissipatingZone.h"
#include "DissipatingBody.h"
#include "BinarySystem.h"
#include "LagForcingFrequencyBreakCondition.h"
#include "LagSpinBreakCondition.h"


namespace Evolve {

    class LIB_PUBLIC BrokenPowerlawPhaseLagZone : virtual public DissipatingZone {
        friend class LagForcingFrequencyBreakCondition;
        friend class LagSpinBreakCondition;
    private:
        bool __dissipative;

        std::vector<double>
            __tidal_frequency_breaks,

            __spin_frequency_breaks,

            __tidal_frequency_powers,

            __spin_frequency_powers,

            __break_phase_lags;

        std::vector<double>::size_type __spin_index;

        std::vector< std::vector<double>::size_type > __tidal_indices;

        inline std::vector< std::vector<double>::size_type >::size_type
            tidal_term_index(
                int orbital_frequency_multiplier,

                int spin_frequency_multiplier
            ) const
            {
                return (
                    2
                    +
                    (orbital_frequency_multiplier > 0 ? 1 : -1)
                    *
                    (
                        spin_frequency_multiplier
                        +
                        5 * orbital_frequency_multiplier
                    )
                );
            }

        double get_orbital_frequency(const BinarySystem &system) const;

        void reset();

        void set_spin_index();

        std::vector<double>::size_type get_tidal_index(
            double abs_forcing_frequency
        ) const;

        void add_tidal_frequency_conditions(
            BinarySystem &system,

            bool primary,

            unsigned zone_index,

            CombinedStoppingCondition &result
        );

        void print_configuration(std::ostream &out_stream = std::clog);

    public:
        BrokenPowerlawPhaseLagZone() : __dissipative(false) {}

        void setup(
            const std::vector<double> &tidal_frequency_breaks,

            const std::vector<double> &spin_frequency_breaks,

            const std::vector<double> &tidal_frequency_powers,

            const std::vector<double> &spin_frequency_powers,

            double reference_phase_lag
        );

        virtual void configure(
            bool initialize,
            double age,
            double orbital_frequency,
            double eccentricity,
            double orbital_angmom,
            double spin,
            double inclination,
            double periapsis,
            bool spin_is_frequency
        );

        virtual double modified_phase_lag(
            int orbital_frequency_multiplier,

            int spin_frequency_multiplier,

            double forcing_frequency,

            Dissipation::QuantityEntry entry,

            double &above_lock_value
        ) const;

        virtual double love_coefficient(
            int,

            int,

            Dissipation::QuantityEntry
        ) const
        {return 0;}

        virtual CombinedStoppingCondition *stopping_conditions(
            BinarySystem &system,

            bool primary,

            unsigned zone_index
        );

        virtual void change_e_order(
            unsigned new_e_order,

            BinarySystem &system,

            bool primary,

            unsigned zone_index
        );

        virtual bool dissipative() const
        {return __dissipative;}

        ~BrokenPowerlawPhaseLagZone() {
#ifndef NDEBUG
            std::cerr << "Destroying powerlaw lag zone:"
                      << "Tidal breaks:";
            for(
                std::vector<double>::const_iterator
                    br_i = __tidal_frequency_breaks.begin();
                br_i != __tidal_frequency_breaks.end();
                ++br_i
            )
                std::cerr << " " << *br_i;
            std::cerr << "Spin breaks: ";
            for(
                std::vector<double>::const_iterator
                    br_i = __spin_frequency_breaks.begin();
                br_i != __spin_frequency_breaks.end();
                ++br_i
            )
                std::cerr << " " << *br_i;
            std::cerr << std::endl;
#endif
            reset();
        }

    }; //End BrokenPowerlawPhaseLagZone class.

} //End BinarySystem namespace.

#endif