Astro-Montenbruck

 view release on metacpan or  search on metacpan

lib/Astro/Montenbruck/Ephemeris/Planet/Mercury.pm  view on Meta::CPAN

use strict;
use warnings;

use Math::Trig qw/:pi/;
use base qw/Astro::Montenbruck::Ephemeris::Planet/;

use Astro::Montenbruck::Ephemeris::Pert qw /pert/;
use Astro::Montenbruck::MathUtils qw /frac ARCS/;
use Astro::Montenbruck::Ephemeris::Planet qw/$ME/;

our $VERSION = 0.01;

sub new {
    my $class = shift;
    $class->SUPER::new( id => $ME );
}

sub heliocentric {
    my ( $self, $t ) = @_;

    # Mean anomalies of planets in [rad]
    my $m1 = pi2 * frac( 0.4855407 + 415.2014314 * $t );
    my $m2 = pi2 * frac( 0.1394222 + 162.5490444 * $t );
    my $m3 = pi2 * frac( 0.9937861 + 99.9978139 * $t );
    my $m5 = pi2 * frac( 0.0558417 + 8.4298417 * $t );
    my $m6 = pi2 * frac( 0.8823333 + 3.3943333 * $t );

    my ( $dl, $dr, $db ) = ( 0, 0, 0 );    # Corrections in longitude ["],
    my $pert_cb = sub { $dl += $_[0]; $dr += $_[1]; $db += $_[2] };

    # Keplerian motion and perturbations by Venus
    my $term = pert(
        T        => $t,
        M        => $m1,
        m        => $m2,
        I_min    => -1,
        I_max    => 9,
        i_min    => -5,
        i_max    => 0,
        callback => $pert_cb
    );

    $term->( 1, 0, 0, 259.74,  84547.39, -78342.34, 0.01, 11683.22, 21203.79 );
    $term->( 1, 0, 1, 2.30,    5.04,     -7.52,     0.02, 138.55,   -71.01 );
    $term->( 1, 0, 2, 0.01,    -0.01,    0.01,      0.01, -0.19,    -0.54 );
    $term->( 2, 0, 0, -549.71, 10394.44, -7955.45,  0.00, 2390.29,  4306.79 );
    $term->( 2, 0, 1, -4.77,   8.97,     -1.53,     0.00, 28.49,    -14.18 );
    $term->( 2, 0, 2, 0.00,    0.00,     0.00,      0.00, -0.04,    -0.11 );
    $term->( 3, 0, 0, -234.04, 1748.74,  -1212.86,  0.00, 535.41,   984.33 );
    $term->( 3, 0, 1, -2.03,   3.48,     -0.35,     0.00, 6.56,     -2.91 );
    $term->( 4, 0, 0, -77.64,  332.63,   -219.23,   0.00, 124.40,   237.03 );
    $term->( 4, 0, 1, -0.70,   1.10,     -0.08,     0.00, 1.59,     -0.59 );
    $term->( 5, 0, 0, -23.59,  67.28,    -43.54,    0.00, 29.44,    58.77 );
    $term->( 5, 0, 1, -0.23,   0.32,     -0.02,     0.00, 0.39,     -0.11 );
    $term->( 6, 0, 0, -6.86,   14.06,    -9.18,     0.00, 7.03,     14.84 );
    $term->( 6, 0, 1, -0.07,   0.09,     -0.01,     0.00, 0.10,     -0.02 );
    $term->( 7, 0, 0, -1.94,   2.98,     -2.02,     0.00, 1.69,     3.80 );
    $term->( 8, 0, 0, -0.54,   0.63,     -0.46,     0.00, 0.41,     0.98 );
    $term->( 9, 0, 0, -0.15,   0.13,     -0.11,     0.00, 0.10,     0.25 );
    $term->( -1, -2, 0, -0.17, -0.06, -0.05, 0.14,  -0.06, -0.07 );
    $term->( 0,  -1, 0, 0.24,  -0.16, -0.11, -0.16, 0.04,  -0.01 );
    $term->( 0,  -2, 0, -0.68, -0.25, -0.26, 0.73,  -0.16, -0.18 );
    $term->( 0,  -5, 0, 0.37,  0.08,  0.06,  -0.28, 0.13,  0.12 );
    $term->( 1,  -1, 0, 0.58,  -0.41, 0.26,  0.36,  0.01,  -0.01 );
    $term->( 1,  -2, 0, -3.51, -1.23, 0.23,  -0.63, -0.05, -0.06 );
    $term->( 1,  -3, 0, 0.08,  0.53,  -0.11, 0.04,  0.02,  -0.09 );
    $term->( 1,  -5, 0, 1.44,  0.31,  0.30,  -1.39, 0.34,  0.29 );
    $term->( 2,  -1, 0, 0.15,  -0.11, 0.09,  0.12,  0.02,  -0.04 );
    $term->( 2,  -2, 0, -1.99, -0.68, 0.65,  -1.91, -0.20, 0.03 );
    $term->( 2,  -3, 0, -0.34, -1.28, 0.97,  -0.26, 0.03,  0.03 );
    $term->( 2,  -4, 0, -0.33, 0.35,  -0.13, -0.13, -0.01, 0.00 );
    $term->( 2,  -5, 0, 7.19,  1.56,  -0.05, 0.12,  0.06,  0.05 );
    $term->( 3,  -2, 0, -0.52, -0.18, 0.13,  -0.39, -0.16, 0.03 );
    $term->( 3,  -3, 0, -0.11, -0.42, 0.36,  -0.10, -0.05, -0.05 );
    $term->( 3,  -4, 0, -0.19, 0.22,  -0.23, -0.20, -0.01, 0.02 );
    $term->( 3,  -5, 0, 2.77,  0.49,  -0.45, 2.56,  0.40,  -0.12 );
    $term->( 4,  -5, 0, 0.67,  0.12,  -0.09, 0.47,  0.24,  -0.08 );
    $term->( 5,  -5, 0, 0.18,  0.03,  -0.02, 0.12,  0.09,  -0.03 );

    # Perturbations by the Earth
    $term = pert(
        T        => $t,
        M        => $m1,
        m        => $m3,
        I_min    => 0,
        I_max    => 2,
        i_min    => -4,
        i_max    => -1,
        callback => $pert_cb
    );

    $term->( 0, -4, 0, -0.11, -0.07, -0.08, 0.11,  -0.02, -0.04 );
    $term->( 1, -1, 0, 0.10,  -0.20, 0.15,  0.07,  0.00,  0.00 );
    $term->( 1, -2, 0, -0.35, 0.28,  -0.13, -0.17, -0.01, 0.00 );
    $term->( 1, -4, 0, -0.67, -0.45, 0.00,  0.01,  -0.01, -0.01 );
    $term->( 2, -2, 0, -0.20, 0.16,  -0.16, -0.20, -0.01, 0.02 );
    $term->( 2, -3, 0, 0.13,  -0.02, 0.02,  0.14,  0.01,  0.00 );
    $term->( 2, -4, 0, -0.33, -0.18, 0.17,  -0.31, -0.04, 0.00 );

    # Perturbations by Mercury
    $term = pert(
        T        => $t,
        M        => $m1,
        m        => $m5,
        I_min    => -1,
        I_max    => 3,
        i_min    => -3,
        i_max    => -1,
        callback => $pert_cb
    );

    $term->( -1, -1, 0, -0.08, 0.16,  0.15,  0.08,  -0.04, 0.01 );
    $term->( -1, -2, 0, 0.10,  -0.06, -0.07, -0.12, 0.07,  -0.01 );
    $term->( 0,  -1, 0, -0.31, 0.48,  -0.02, 0.13,  -0.03, -0.02 );
    $term->( 0,  -2, 0, 0.42,  -0.26, -0.38, -0.50, 0.20,  -0.03 );
    $term->( 1,  -1, 0, -0.70, 0.01,  -0.02, -0.63, 0.00,  0.03 );
    $term->( 1,  -2, 0, 2.61,  -1.97, 1.74,  2.32,  0.01,  0.01 );
    $term->( 1,  -3, 0, 0.32,  -0.15, 0.13,  0.28,  0.00,  0.00 );
    $term->( 2,  -1, 0, -0.18, 0.01,  0.00,  -0.13, -0.03, 0.03 );
    $term->( 2,  -2, 0, 0.75,  -0.56, 0.45,  0.60,  0.08,  -0.17 );
    $term->( 3,  -2, 0, 0.20,  -0.15, 0.10,  0.14,  0.04,  -0.08 );

    # Perturbations by Saturn
    $term = pert(
        T        => $t,
        M        => $m1,
        m        => $m6,
        I_min    => 1,
        I_max    => 1,
        i_min    => -2,
        i_max    => -2,
        callback => $pert_cb
    );

    $term->( 1, -2, 0, -0.19, 0.33, 0.0, 0.0, 0.0, 0.0 );
    $dl += 2.8 + 3.2 * $t;



( run in 1.064 second using v1.01-cache-2.11-cpan-800906f7e73 )