Program Listing for File ZoneOrientation.cpp

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

#define BUILDING_LIBRARY
#include "ZoneOrientation.h"

namespace Evolve {

    Eigen::Vector3d zone_to_zone_transform(const ZoneOrientation &from_zone,
                                           const ZoneOrientation &to_zone,
                                           const Eigen::Vector3d &vector,
                                           Dissipation::QuantityEntry deriv,
                                           bool with_respect_to_from)
    {
        assert(deriv == Dissipation::NO_DERIV
               ||
               deriv == Dissipation::INCLINATION
               ||
               deriv == Dissipation::PERIAPSIS);

        double cos_dw=std::cos(to_zone.periapsis()-from_zone.periapsis()),
               sin_dw=std::sin(to_zone.periapsis()-from_zone.periapsis()),
               sin_from=std::sin(from_zone.inclination()),
               cos_from=std::cos(from_zone.inclination()),
               sin_to=std::sin(to_zone.inclination()),
               cos_to=std::cos(to_zone.inclination()),
               sin_sin, cos_cos, sin_cos, cos_sin;
        if(deriv==Dissipation::PERIAPSIS) {
            double buffer=cos_dw;
            if(with_respect_to_from) {cos_dw=sin_dw; sin_dw=-buffer;}
            else {cos_dw=-sin_dw; sin_dw=buffer;}
        }
        if(deriv==Dissipation::INCLINATION) {
            if(with_respect_to_from) {
                sin_sin=sin_to*cos_from;
                cos_cos=-cos_to*sin_from;
                sin_cos=-sin_to*sin_from;
                cos_sin=cos_to*cos_from;
            } else {
                sin_sin=cos_to*sin_from;
                cos_cos=-sin_to*cos_from;
                sin_cos=cos_to*cos_from;
                cos_sin=-sin_to*sin_from;
            }
        } else {
            sin_sin=sin_to*sin_from;
            cos_cos=cos_to*cos_from;
            sin_cos=sin_to*cos_from;
            cos_sin=cos_to*sin_from;
        }
        return Eigen::Vector3d(
            (sin_sin + cos_cos * cos_dw) * vector[0]
            -
            cos_to * sin_dw * vector[1]
            +
            (sin_cos - cos_sin * cos_dw) * vector[2],


            cos_from * sin_dw * vector[0]
            +
            cos_dw * vector[1]
            -
            sin_from * sin_dw * vector[2],

            (cos_sin - sin_cos * cos_dw) * vector[0]
            +
            sin_to * sin_dw * vector[1]
            +
            (cos_cos + sin_sin * cos_dw) * vector[2]
        );
    }

    /*
    void transform_zone_orientation(const ZoneOrientation &zone,
            const ZoneOrientation &reference, double &inclination,
            double &periapsis)
    {
        Eigen::Vector3d zone_z_dir=zone_to_zone_transform(zone,
                reference, Eigen::Vector3d(0, 0, 1));
        inclination=std::atan2(-zone_z_dir[0], zone_z_dir[2]);
        if(zone_z_dir[1]==0 && zone_z_dir[0]==0) periapsis=0;
        else periapsis=M_PI/2+std::atan2(zone_z_dir[1], -zone_z_dir[0]);

        assert(inclination>=0);
        assert(inclination<M_PI);
    }
    */

}//End Evolve namespace.