| line | stmt | bran | cond | sub | pod | time | code | 
| 1 |  |  |  |  |  |  | package Astro::Montenbruck::Ephemeris::Planet::Moon; | 
| 2 |  |  |  |  |  |  |  | 
| 3 | 2 |  |  | 2 |  | 1358 | use strict; | 
|  | 2 |  |  |  |  | 5 |  | 
|  | 2 |  |  |  |  | 59 |  | 
| 4 | 2 |  |  | 2 |  | 11 | use warnings; | 
|  | 2 |  |  |  |  | 4 |  | 
|  | 2 |  |  |  |  | 62 |  | 
| 5 |  |  |  |  |  |  |  | 
| 6 | 2 |  |  | 2 |  | 10 | use Readonly; | 
|  | 2 |  |  |  |  | 3 |  | 
|  | 2 |  |  |  |  | 117 |  | 
| 7 | 2 |  |  | 2 |  | 11 | use Math::Trig qw/:pi rad2deg deg2rad/; | 
|  | 2 |  |  |  |  | 3 |  | 
|  | 2 |  |  |  |  | 287 |  | 
| 8 | 2 |  |  | 2 |  | 13 | use Astro::Montenbruck::Ephemeris::Planet; | 
|  | 2 |  |  |  |  | 4 |  | 
|  | 2 |  |  |  |  | 79 |  | 
| 9 | 2 |  |  | 2 |  | 12 | use base qw/Astro::Montenbruck::Ephemeris::Planet/; | 
|  | 2 |  |  |  |  | 4 |  | 
|  | 2 |  |  |  |  | 220 |  | 
| 10 | 2 |  |  | 2 |  | 13 | use Astro::Montenbruck::Ephemeris::Planet qw/$MO/; | 
|  | 2 |  |  |  |  | 3 |  | 
|  | 2 |  |  |  |  | 165 |  | 
| 11 | 2 |  |  | 2 |  | 14 | use Astro::Montenbruck::MathUtils qw /frac sine ARCS reduce_deg cart polar/; | 
|  | 2 |  |  |  |  | 3 |  | 
|  | 2 |  |  |  |  | 129 |  | 
| 12 | 2 |  |  | 2 |  | 13 | use Astro::Montenbruck::Ephemeris::Pert qw /addthe/; | 
|  | 2 |  |  |  |  | 4 |  | 
|  | 2 |  |  |  |  | 4715 |  | 
| 13 |  |  |  |  |  |  |  | 
| 14 |  |  |  |  |  |  | our $VERSION = 0.02; | 
| 15 |  |  |  |  |  |  |  | 
| 16 |  |  |  |  |  |  | Readonly our $ARC => 206264.81; # 3600 * 180 / PI = arcsec per radian | 
| 17 |  |  |  |  |  |  | Readonly our $RADII_TO_AU => 4.26354E-5; | 
| 18 |  |  |  |  |  |  |  | 
| 19 |  |  |  |  |  |  | sub new { | 
| 20 | 219 |  |  | 219 | 1 | 445 | my $class = shift; | 
| 21 | 219 |  |  |  |  | 999 | $class->SUPER::new( id => $MO ); | 
| 22 |  |  |  |  |  |  | } | 
| 23 |  |  |  |  |  |  |  | 
| 24 |  |  |  |  |  |  | # calculate long-periodic changes of the mean elements | 
| 25 |  |  |  |  |  |  | # l,l',F,D and L0 as well as dgamma | 
| 26 |  |  |  |  |  |  | sub _long_periodic { | 
| 27 | 219 |  |  | 219 |  | 356 | my $t = shift; | 
| 28 |  |  |  |  |  |  |  | 
| 29 | 219 |  |  |  |  | 982 | my $s1 = sine( 0.19833 + 0.05611 * $t ); | 
| 30 | 219 |  |  |  |  | 565 | my $s2 = sine( 0.27869 + 0.04508 * $t ); | 
| 31 | 219 |  |  |  |  | 632 | my $s3 = sine( 0.16827 - 0.36903 * $t ); | 
| 32 | 219 |  |  |  |  | 617 | my $s4 = sine( 0.34734 - 5.37261 * $t ); | 
| 33 | 219 |  |  |  |  | 563 | my $s5 = sine( 0.10498 - 5.37899 * $t ); | 
| 34 | 219 |  |  |  |  | 552 | my $s6 = sine( 0.42681 - 0.41855 * $t ); | 
| 35 | 219 |  |  |  |  | 670 | my $s7 = sine( 0.14943 - 5.37511 * $t ); | 
| 36 | 219 |  |  |  |  | 636 | my $dl0 = | 
| 37 |  |  |  |  |  |  | 0.84 * $s1 + | 
| 38 |  |  |  |  |  |  | 0.31 * $s2 + | 
| 39 |  |  |  |  |  |  | 14.27 * $s3 + | 
| 40 |  |  |  |  |  |  | 7.26 * $s4 + | 
| 41 |  |  |  |  |  |  | 0.28 * $s5 + | 
| 42 |  |  |  |  |  |  | 0.24 * $s6; | 
| 43 | 219 |  |  |  |  | 527 | my $dl = | 
| 44 |  |  |  |  |  |  | 2.94 * $s1 + | 
| 45 |  |  |  |  |  |  | 0.31 * $s2 + | 
| 46 |  |  |  |  |  |  | 14.27 * $s3 + | 
| 47 |  |  |  |  |  |  | 9.34 * $s4 + | 
| 48 |  |  |  |  |  |  | 1.12 * $s5 + | 
| 49 |  |  |  |  |  |  | 0.83 * $s6; | 
| 50 | 219 |  |  |  |  | 505 | my $dls = -6.40 * $s1 - 1.89 * $s6; | 
| 51 | 219 |  |  |  |  | 577 | my $df = | 
| 52 |  |  |  |  |  |  | 0.21 * $s1 + | 
| 53 |  |  |  |  |  |  | 0.31 * $s2 + | 
| 54 |  |  |  |  |  |  | 14.27 * $s3 - | 
| 55 |  |  |  |  |  |  | 88.70 * $s4 - | 
| 56 |  |  |  |  |  |  | 15.30 * $s5 + | 
| 57 |  |  |  |  |  |  | 0.24 * $s6 - | 
| 58 |  |  |  |  |  |  | 1.86 * $s7; | 
| 59 | 219 |  |  |  |  | 404 | my $dd = $dl0 - $dls; | 
| 60 | 219 |  |  |  |  | 561 | my $dgam = | 
| 61 |  |  |  |  |  |  | -3332e-9 * sine( 0.59734 - 5.37261 * $t ) - | 
| 62 |  |  |  |  |  |  | 539e-9 * sine( 0.35498 - 5.37899 * $t ) - | 
| 63 |  |  |  |  |  |  | 64e-9 * sine( 0.39943 - 5.37511 * $t ); | 
| 64 |  |  |  |  |  |  |  | 
| 65 | 219 |  |  |  |  | 833 | $dl0, $dl, $dls, $df, $dd, $dgam; | 
| 66 |  |  |  |  |  |  | } | 
| 67 |  |  |  |  |  |  |  | 
| 68 |  |  |  |  |  |  | sub moonpos { | 
| 69 | 219 |  |  | 219 | 1 | 531 | my ( $self, $t ) = @_; | 
| 70 | 219 |  |  |  |  | 780 | my ( %co, %si ); | 
| 71 | 219 |  |  |  |  | 0 | my ( $dlam, $ds, $gam1c, $n ); | 
| 72 | 219 |  |  |  |  | 320 | my $sinpi = 3422.7; | 
| 73 | 219 |  |  |  |  | 402 | my ( $dl0, $dl, $dls, $df, $dd, $dgam, $l, $l0, $ls, $f, $d ); | 
| 74 |  |  |  |  |  |  |  | 
| 75 |  |  |  |  |  |  | # INIT: calculates the mean elements and their sine and cosine | 
| 76 |  |  |  |  |  |  | # l mean anomaly of the Moon | 
| 77 |  |  |  |  |  |  | # l' mean anomaly of the Sun | 
| 78 |  |  |  |  |  |  | # F mean distance from the node | 
| 79 |  |  |  |  |  |  | # D  mean elongation from the Sun | 
| 80 |  |  |  |  |  |  | my $init = sub { | 
| 81 | 219 |  |  | 219 |  | 482 | my $t2 = $t * $t; | 
| 82 |  |  |  |  |  |  |  | 
| 83 | 219 |  |  |  |  | 474 | ( $dl0, $dl, $dls, $df, $dd, $dgam ) = _long_periodic($t); | 
| 84 |  |  |  |  |  |  |  | 
| 85 | 219 |  |  |  |  | 685 | $l0 = pi2 * frac( 0.60643382 + 1336.85522467 * $t - 0.00000313 * $t2 ) + | 
| 86 |  |  |  |  |  |  | $dl0 / ARCS; | 
| 87 | 219 |  |  |  |  | 618 | $l = pi2 * frac( 0.37489701 + 1325.55240982 * $t + 0.00002565 * $t2 ) + | 
| 88 |  |  |  |  |  |  | $dl / ARCS; | 
| 89 | 219 |  |  |  |  | 670 | $ls = pi2 * frac( 0.99312619 + 99.99735956 * $t - 0.00000044 * $t2 ) + | 
| 90 |  |  |  |  |  |  | $dls / ARCS; | 
| 91 | 219 |  |  |  |  | 636 | $f = pi2 * frac( 0.25909118 + 1342.22782980 * $t - 0.00000892 * $t2 ) + | 
| 92 |  |  |  |  |  |  | $df / ARCS; | 
| 93 | 219 |  |  |  |  | 647 | $d = pi2 * frac( 0.82736186 + 1236.85308708 * $t - 0.00000397 * $t2 ) + | 
| 94 |  |  |  |  |  |  | $dd / ARCS; | 
| 95 |  |  |  |  |  |  |  | 
| 96 | 219 |  |  |  |  | 826 | for my $i ( 1 .. 4 ) { | 
| 97 |  |  |  |  |  |  |  | 
| 98 |  |  |  |  |  |  | my ( $arg, $max, $fac ) = ( | 
| 99 | 219 |  |  |  |  | 760 | sub { $l,  4, 1.000002208 }, | 
| 100 | 219 |  |  |  |  | 605 | sub { $ls, 3, 0.997504612 - 0.002495388 * $t }, | 
| 101 | 219 |  |  |  |  | 508 | sub { $f,  4, 1.000002708 + 139.978 * $dgam }, | 
| 102 | 219 |  |  |  |  | 461 | sub { $d,  6, 1.0 } | 
| 103 | 876 |  |  |  |  | 5061 | )[ $i - 1 ]->(); | 
| 104 |  |  |  |  |  |  |  | 
| 105 | 876 |  |  |  |  | 3993 | $co{0}->{$i} = 1.0; | 
| 106 | 876 |  |  |  |  | 1888 | $co{1}->{$i} = cos($arg) * $fac; | 
| 107 | 876 |  |  |  |  | 1420 | $si{0}->{$i} = 0.0; | 
| 108 | 876 |  |  |  |  | 1726 | $si{1}->{$i} = sin($arg) * $fac; | 
| 109 |  |  |  |  |  |  |  | 
| 110 | 876 |  |  |  |  | 1547 | for ( 2 .. $max ) { | 
| 111 | 2847 |  |  |  |  | 3868 | my $k = $_ - 1; | 
| 112 |  |  |  |  |  |  | ( $co{$_}->{$i}, $si{$_}->{$i} ) = addthe( | 
| 113 |  |  |  |  |  |  | $co{$k}->{$i}, $si{$k}->{$i}, | 
| 114 | 2847 |  |  |  |  | 6261 | $co{1}->{$i},  $si{1}->{$i} | 
| 115 |  |  |  |  |  |  | ); | 
| 116 |  |  |  |  |  |  | } | 
| 117 | 876 |  |  |  |  | 1606 | for ( 1 .. $max ) { | 
| 118 | 3723 |  |  |  |  | 7856 | $co{ -$_ }->{$i} = $co{$_}->{$i}; | 
| 119 | 3723 |  |  |  |  | 7242 | $si{ -$_ }->{$i} = -$si{$_}->{$i}; | 
| 120 |  |  |  |  |  |  | } | 
| 121 |  |  |  |  |  |  | } | 
| 122 | 219 |  |  |  |  | 1484 | }; | 
| 123 |  |  |  |  |  |  |  | 
| 124 |  |  |  |  |  |  | # TERM calculates X = cos(p * arg1 + q * arg2 + r * arg3 + s * arg4) | 
| 125 |  |  |  |  |  |  | #             and Y = sin(p * arg1 + q * arg2 + r * arg3 + s * arg4) | 
| 126 |  |  |  |  |  |  | my $term = sub { | 
| 127 | 24747 |  |  | 24747 |  | 35306 | my @pqrs = @_; | 
| 128 | 24747 |  |  |  |  | 33627 | my %i    = map { $_ + 1, $pqrs[$_] } ( 0 .. 3 ); | 
|  | 98988 |  |  |  |  | 159041 |  | 
| 129 | 24747 |  |  |  |  | 37400 | my $x    = 1.0; | 
| 130 | 24747 |  |  |  |  | 28097 | my $y    = 0.0; | 
| 131 |  |  |  |  |  |  |  | 
| 132 | 24747 |  |  |  |  | 34618 | for ( 1 .. 4 ) { | 
| 133 | 98988 | 100 |  |  |  | 166825 | if ( $i{$_} != 0 ) { | 
| 134 | 57597 |  |  |  |  | 69320 | my $j = $i{$_}; | 
| 135 | 57597 |  |  |  |  | 114689 | ( $x, $y ) = addthe( $x, $y, $co{$j}->{$_}, $si{$j}->{$_} ); | 
| 136 |  |  |  |  |  |  | } | 
| 137 |  |  |  |  |  |  | } | 
| 138 | 24747 |  |  |  |  | 47510 | $x, $y; | 
| 139 | 219 |  |  |  |  | 909 | }; | 
| 140 |  |  |  |  |  |  |  | 
| 141 |  |  |  |  |  |  | my $addsol = sub { | 
| 142 | 22776 |  |  | 22776 |  | 34448 | my ( $coeffl, $coeffs, $coeffg, $coeffp, $p, $q, $r, $s ) = @_; | 
| 143 | 22776 |  |  |  |  | 32487 | my ( $x, $y ) = $term->( $p, $q, $r, $s ); | 
| 144 |  |  |  |  |  |  |  | 
| 145 | 22776 |  |  |  |  | 29602 | $dlam  += $coeffl * $y; | 
| 146 | 22776 |  |  |  |  | 26936 | $ds    += $coeffs * $y; | 
| 147 | 22776 |  |  |  |  | 26187 | $gam1c += $coeffg * $x; | 
| 148 | 22776 |  |  |  |  | 29249 | $sinpi += $coeffp * $x; | 
| 149 | 219 |  |  |  |  | 799 | }; | 
| 150 |  |  |  |  |  |  |  | 
| 151 |  |  |  |  |  |  | my $solar_1 = sub { | 
| 152 | 219 |  |  | 219 |  | 835 | $addsol->( 13.902,    14.06,    -0.001, 0.2607,   0, 0, 0, 4 ); | 
| 153 | 219 |  |  |  |  | 667 | $addsol->( 0.403,     -4.01,    +0.394, 0.0023,   0, 0, 0, 3 ); | 
| 154 | 219 |  |  |  |  | 705 | $addsol->( 2369.912,  2373.36,  +0.601, 28.2333,  0, 0, 0, 2 ); | 
| 155 | 219 |  |  |  |  | 550 | $addsol->( -125.154,  -112.79,  -0.725, -0.9781,  0, 0, 0, 1 ); | 
| 156 | 219 |  |  |  |  | 1075 | $addsol->( 1.979,     6.98,     -0.445, 0.0433,   1, 0, 0, 4 ); | 
| 157 | 219 |  |  |  |  | 514 | $addsol->( 191.953,   192.72,   +0.029, 3.0861,   1, 0, 0, 2 ); | 
| 158 | 219 |  |  |  |  | 581 | $addsol->( -8.466,    -13.51,   +0.455, -0.1093,  1, 0, 0, 1 ); | 
| 159 | 219 |  |  |  |  | 742 | $addsol->( 22639.500, 22609.07, +0.079, 186.5398, 1, 0, 0, 0 ); | 
| 160 | 219 |  |  |  |  | 696 | $addsol->( 18.609,    3.59,     -0.094, 0.0118,   1, 0, 0, -1 ); | 
| 161 | 219 |  |  |  |  | 649 | $addsol->( -4586.465, -4578.13, -0.077, 34.3117,  1, 0, 0, -2 ); | 
| 162 | 219 |  |  |  |  | 547 | $addsol->( +3.215,    5.44,     +0.192, -0.0386,  1, 0, 0, -3 ); | 
| 163 | 219 |  |  |  |  | 525 | $addsol->( -38.428,   -38.64,   +0.001, 0.6008,   1, 0, 0, -4 ); | 
| 164 | 219 |  |  |  |  | 512 | $addsol->( -0.393,    -1.43,    -0.092, 0.0086,   1, 0, 0, -6 ); | 
| 165 | 219 |  |  |  |  | 588 | $addsol->( -0.289,    -1.59,    +0.123, -0.0053,  0, 1, 0, 4 ); | 
| 166 | 219 |  |  |  |  | 657 | $addsol->( -24.420,   -25.10,   +0.040, -0.3000,  0, 1, 0, 2 ); | 
| 167 | 219 |  |  |  |  | 693 | $addsol->( 18.023,    17.93,    +0.007, 0.1494,   0, 1, 0, 1 ); | 
| 168 | 219 |  |  |  |  | 575 | $addsol->( -668.146,  -126.98,  -1.302, -0.3997,  0, 1, 0, 0 ); | 
| 169 | 219 |  |  |  |  | 638 | $addsol->( 0.560,     0.32,     -0.001, -0.0037,  0, 1, 0, -1 ); | 
| 170 | 219 |  |  |  |  | 539 | $addsol->( -165.145,  -165.06,  +0.054, 1.9178,   0, 1, 0, -2 ); | 
| 171 | 219 |  |  |  |  | 641 | $addsol->( -1.877,    -6.46,    -0.416, 0.0339,   0, 1, 0, -4 ); | 
| 172 | 219 |  |  |  |  | 583 | $addsol->( 0.213,     1.02,     -0.074, 0.0054,   2, 0, 0, 4 ); | 
| 173 | 219 |  |  |  |  | 520 | $addsol->( 14.387,    14.78,    -0.017, 0.2833,   2, 0, 0, 2 ); | 
| 174 | 219 |  |  |  |  | 734 | $addsol->( -0.586,    -1.20,    +0.054, -0.0100,  2, 0, 0, 1 ); | 
| 175 | 219 |  |  |  |  | 858 | $addsol->( 769.016,   767.96,   +0.107, 10.1657,  2, 0, 0, 0 ); | 
| 176 | 219 |  |  |  |  | 631 | $addsol->( +1.750,    2.01,     -0.018, 0.0155,   2, 0, 0, -1 ); | 
| 177 | 219 |  |  |  |  | 680 | $addsol->( -211.656,  -152.53,  +5.679, -0.3039,  2, 0, 0, -2 ); | 
| 178 | 219 |  |  |  |  | 593 | $addsol->( +1.225,    0.91,     -0.030, -0.0088,  2, 0, 0, -3 ); | 
| 179 | 219 |  |  |  |  | 575 | $addsol->( -30.773,   -34.07,   -0.308, 0.3722,   2, 0, 0, -4 ); | 
| 180 | 219 |  |  |  |  | 638 | $addsol->( -0.570,    -1.40,    -0.074, 0.0109,   2, 0, 0, -6 ); | 
| 181 | 219 |  |  |  |  | 524 | $addsol->( -2.921,    -11.75,   +0.787, -0.0484,  1, 1, 0, 2 ); | 
| 182 | 219 |  |  |  |  | 510 | $addsol->( +1.267,    1.52,     -0.022, 0.0164,   1, 1, 0, 1 ); | 
| 183 | 219 |  |  |  |  | 785 | $addsol->( -109.673,  -115.18,  +0.461, -0.9490,  1, 1, 0, 0 ); | 
| 184 | 219 |  |  |  |  | 652 | $addsol->( -205.962,  -182.36,  +2.056, +1.4437,  1, 1, 0, -2 ); | 
| 185 | 219 |  |  |  |  | 699 | $addsol->( 0.233,     0.36,     0.012,  -0.0025,  1, 1, 0, -3 ); | 
| 186 | 219 |  |  |  |  | 572 | $addsol->( -4.391,    -9.66,    -0.471, 0.0673,   1, 1, 0, -4 ); | 
| 187 | 219 |  |  |  |  | 1553 | }; | 
| 188 |  |  |  |  |  |  |  | 
| 189 |  |  |  |  |  |  | my $solar_2 = sub { | 
| 190 | 219 |  |  | 219 |  | 578 | $addsol->( 0.283,    1.53,   -0.111, +0.0060, 1, -1, 0,  +4 ); | 
| 191 | 219 |  |  |  |  | 581 | $addsol->( 14.577,   31.70,  -1.540, +0.2302, 1, -1, 0,  2 ); | 
| 192 | 219 |  |  |  |  | 704 | $addsol->( 147.687,  138.76, +0.679, +1.1528, 1, -1, 0,  0 ); | 
| 193 | 219 |  |  |  |  | 518 | $addsol->( -1.089,   0.55,   +0.021, 0.0,     1, -1, 0,  -1 ); | 
| 194 | 219 |  |  |  |  | 622 | $addsol->( 28.475,   23.59,  -0.443, -0.2257, 1, -1, 0,  -2 ); | 
| 195 | 219 |  |  |  |  | 677 | $addsol->( -0.276,   -0.38,  -0.006, -0.0036, 1, -1, 0,  -3 ); | 
| 196 | 219 |  |  |  |  | 649 | $addsol->( 0.636,    2.27,   +0.146, -0.0102, 1, -1, 0,  -4 ); | 
| 197 | 219 |  |  |  |  | 723 | $addsol->( -0.189,   -1.68,  +0.131, -0.0028, 0, 2,  0,  2 ); | 
| 198 | 219 |  |  |  |  | 646 | $addsol->( -7.486,   -0.66,  -0.037, -0.0086, 0, 2,  0,  0 ); | 
| 199 | 219 |  |  |  |  | 643 | $addsol->( -8.096,   -16.35, -0.740, 0.0918,  0, 2,  0,  -2 ); | 
| 200 | 219 |  |  |  |  | 643 | $addsol->( -5.741,   -0.04,  0.0,    -0.0009, 0, 0,  2,  2 ); | 
| 201 | 219 |  |  |  |  | 642 | $addsol->( 0.255,    0.0,    0.0,    0.0,     0, 0,  2,  1 ); | 
| 202 | 219 |  |  |  |  | 673 | $addsol->( -411.608, -0.20,  0.0,    -0.0124, 0, 0,  2,  0 ); | 
| 203 | 219 |  |  |  |  | 541 | $addsol->( 0.584,    0.84,   0.0,    +0.0071, 0, 0,  2,  -1 ); | 
| 204 | 219 |  |  |  |  | 602 | $addsol->( -55.173,  -52.14, 0.0,    -0.1052, 0, 0,  2,  -2 ); | 
| 205 | 219 |  |  |  |  | 595 | $addsol->( 0.254,    0.25,   0.0,    -0.0017, 0, 0,  2,  -3 ); | 
| 206 | 219 |  |  |  |  | 588 | $addsol->( +0.025,   -1.67,  0.0,    +0.0031, 0, 0,  2,  -4 ); | 
| 207 | 219 |  |  |  |  | 567 | $addsol->( 1.060,    2.96,   -0.166, 0.0243,  3, 0,  0,  +2 ); | 
| 208 | 219 |  |  |  |  | 703 | $addsol->( 36.124,   50.64,  -1.300, 0.6215,  3, 0,  0,  0 ); | 
| 209 | 219 |  |  |  |  | 639 | $addsol->( -13.193,  -16.40, +0.258, -0.1187, 3, 0,  0,  -2 ); | 
| 210 | 219 |  |  |  |  | 628 | $addsol->( -1.187,   -0.74,  +0.042, 0.0074,  3, 0,  0,  -4 ); | 
| 211 | 219 |  |  |  |  | 666 | $addsol->( -0.293,   -0.31,  -0.002, 0.0046,  3, 0,  0,  -6 ); | 
| 212 | 219 |  |  |  |  | 773 | $addsol->( -0.290,   -1.45,  +0.116, -0.0051, 2, 1,  0,  2 ); | 
| 213 | 219 |  |  |  |  | 668 | $addsol->( -7.649,   -10.56, +0.259, -0.1038, 2, 1,  0,  0 ); | 
| 214 | 219 |  |  |  |  | 752 | $addsol->( -8.627,   -7.59,  +0.078, -0.0192, 2, 1,  0,  -2 ); | 
| 215 | 219 |  |  |  |  | 691 | $addsol->( -2.740,   -2.54,  +0.022, 0.0324,  2, 1,  0,  -4 ); | 
| 216 | 219 |  |  |  |  | 531 | $addsol->( 1.181,    3.32,   -0.212, 0.0213,  2, -1, 0,  +2 ); | 
| 217 | 219 |  |  |  |  | 758 | $addsol->( 9.703,    11.67,  -0.151, 0.1268,  2, -1, 0,  0 ); | 
| 218 | 219 |  |  |  |  | 621 | $addsol->( -0.352,   -0.37,  +0.001, -0.0028, 2, -1, 0,  -1 ); | 
| 219 | 219 |  |  |  |  | 649 | $addsol->( -2.494,   -1.17,  -0.003, -0.0017, 2, -1, 0,  -2 ); | 
| 220 | 219 |  |  |  |  | 679 | $addsol->( 0.360,    0.20,   -0.012, -0.0043, 2, -1, 0,  -4 ); | 
| 221 | 219 |  |  |  |  | 607 | $addsol->( -1.167,   -1.25,  +0.008, -0.0106, 1, 2,  0,  0 ); | 
| 222 | 219 |  |  |  |  | 557 | $addsol->( -7.412,   -6.12,  +0.117, 0.0484,  1, 2,  0,  -2 ); | 
| 223 | 219 |  |  |  |  | 602 | $addsol->( -0.311,   -0.65,  -0.032, 0.0044,  1, 2,  0,  -4 ); | 
| 224 | 219 |  |  |  |  | 749 | $addsol->( +0.757,   1.82,   -0.105, 0.0112,  1, -2, 0,  2 ); | 
| 225 | 219 |  |  |  |  | 663 | $addsol->( +2.580,   2.32,   +0.027, 0.0196,  1, -2, 0,  0 ); | 
| 226 | 219 |  |  |  |  | 611 | $addsol->( +2.533,   2.40,   -0.014, -0.0212, 1, -2, 0,  -2 ); | 
| 227 | 219 |  |  |  |  | 587 | $addsol->( -0.344,   -0.57,  -0.025, +0.0036, 0, 3,  0,  -2 ); | 
| 228 | 219 |  |  |  |  | 598 | $addsol->( -0.992,   -0.02,  0.0,    0.0,     1, 0,  2,  2 ); | 
| 229 | 219 |  |  |  |  | 633 | $addsol->( -45.099,  -0.02,  0.0,    -0.0010, 1, 0,  2,  0 ); | 
| 230 | 219 |  |  |  |  | 651 | $addsol->( -0.179,   -9.52,  0.0,    -0.0833, 1, 0,  2,  -2 ); | 
| 231 | 219 |  |  |  |  | 644 | $addsol->( -0.301,   -0.33,  0.0,    0.0014,  1, 0,  2,  -4 ); | 
| 232 | 219 |  |  |  |  | 601 | $addsol->( -6.382,   -3.37,  0.0,    -0.0481, 1, 0,  -2, 2 ); | 
| 233 | 219 |  |  |  |  | 606 | $addsol->( 39.528,   85.13,  0.0,    -0.7136, 1, 0,  -2, 0 ); | 
| 234 | 219 |  |  |  |  | 726 | $addsol->( 9.366,    0.71,   0.0,    -0.0112, 1, 0,  -2, -2 ); | 
| 235 | 219 |  |  |  |  | 538 | $addsol->( 0.202,    0.02,   0.0,    0.0,     1, 0,  -2, -4 ); | 
| 236 | 219 |  |  |  |  | 3028 | }; | 
| 237 |  |  |  |  |  |  |  | 
| 238 |  |  |  |  |  |  | my $solar_3 = sub { | 
| 239 | 219 |  |  | 219 |  | 653 | $addsol->( 0.415,  0.10,  0.0,    0.0013,  0, 1,  2,  0 ); | 
| 240 | 219 |  |  |  |  | 565 | $addsol->( -2.152, -2.26, 0.0,    -0.0066, 0, 1,  2,  -2 ); | 
| 241 | 219 |  |  |  |  | 796 | $addsol->( -1.440, -1.30, 0.0,    +0.0014, 0, 1,  -2, 2 ); | 
| 242 | 219 |  |  |  |  | 727 | $addsol->( 0.384,  -0.04, 0.0,    0.0,     0, 1,  -2, -2 ); | 
| 243 | 219 |  |  |  |  | 729 | $addsol->( +1.938, +3.60, -0.145, +0.0401, 4, 0,  0,  0 ); | 
| 244 | 219 |  |  |  |  | 612 | $addsol->( -0.952, -1.58, +0.052, -0.0130, 4, 0,  0,  -2 ); | 
| 245 | 219 |  |  |  |  | 579 | $addsol->( -0.551, -0.94, +0.032, -0.0097, 3, 1,  0,  0 ); | 
| 246 | 219 |  |  |  |  | 633 | $addsol->( -0.482, -0.57, +0.005, -0.0045, 3, 1,  0,  -2 ); | 
| 247 | 219 |  |  |  |  | 663 | $addsol->( 0.681,  0.96,  -0.026, 0.0115,  3, -1, 0,  0 ); | 
| 248 | 219 |  |  |  |  | 607 | $addsol->( -0.297, -0.27, 0.002,  -0.0009, 2, 2,  0,  -2 ); | 
| 249 | 219 |  |  |  |  | 642 | $addsol->( 0.254,  +0.21, -0.003, 0.0,     2, -2, 0,  -2 ); | 
| 250 | 219 |  |  |  |  | 537 | $addsol->( -0.250, -0.22, 0.004,  0.0014,  1, 3,  0,  -2 ); | 
| 251 | 219 |  |  |  |  | 729 | $addsol->( -3.996, 0.0,   0.0,    +0.0004, 2, 0,  2,  0 ); | 
| 252 | 219 |  |  |  |  | 596 | $addsol->( 0.557,  -0.75, 0.0,    -0.0090, 2, 0,  2,  -2 ); | 
| 253 | 219 |  |  |  |  | 609 | $addsol->( -0.459, -0.38, 0.0,    -0.0053, 2, 0,  -2, 2 ); | 
| 254 | 219 |  |  |  |  | 682 | $addsol->( -1.298, 0.74,  0.0,    +0.0004, 2, 0,  -2, 0 ); | 
| 255 | 219 |  |  |  |  | 612 | $addsol->( 0.538,  1.14,  0.0,    -0.0141, 2, 0,  -2, -2 ); | 
| 256 | 219 |  |  |  |  | 613 | $addsol->( 0.263,  0.02,  0.0,    0.0,     1, 1,  2,  0 ); | 
| 257 | 219 |  |  |  |  | 548 | $addsol->( 0.426,  +0.07, 0.0,    -0.0006, 1, 1,  -2, -2 ); | 
| 258 | 219 |  |  |  |  | 620 | $addsol->( -0.304, +0.03, 0.0,    +0.0003, 1, -1, 2,  0 ); | 
| 259 | 219 |  |  |  |  | 664 | $addsol->( -0.372, -0.19, 0.0,    -0.0027, 1, -1, -2, 2 ); | 
| 260 | 219 |  |  |  |  | 630 | $addsol->( +0.418, 0.0,   0.0,    0.0,     0, 0,  4,  0 ); | 
| 261 | 219 |  |  |  |  | 704 | $addsol->( -0.330, -0.04, 0.0,    0.0,     3, 0,  2,  0 ); | 
| 262 | 219 |  |  |  |  | 1351 | }; | 
| 263 |  |  |  |  |  |  |  | 
| 264 |  |  |  |  |  |  | # part N of the perturbations of ecliptic latitude | 
| 265 |  |  |  |  |  |  | my $solar_n = sub { | 
| 266 |  |  |  |  |  |  | my $addn = sub { | 
| 267 | 1971 |  |  |  |  | 2563 | my $coeffn = shift; | 
| 268 | 1971 |  |  |  |  | 2877 | my ( $x, $y ) = $term->(@_); | 
| 269 | 1971 |  |  |  |  | 3876 | $n += $coeffn * $y; | 
| 270 | 219 |  |  | 219 |  | 2374 | }; | 
| 271 |  |  |  |  |  |  |  | 
| 272 | 219 |  |  |  |  | 735 | $addn->( -526.069, 0,  0,  1, -2 ); | 
| 273 | 219 |  |  |  |  | 671 | $addn->( -3.352,   0,  0,  1, -4 ); | 
| 274 | 219 |  |  |  |  | 618 | $addn->( +44.297,  +1, 0,  1, -2 ); | 
| 275 | 219 |  |  |  |  | 737 | $addn->( -6.000,   +1, 0,  1, -4 ); | 
| 276 | 219 |  |  |  |  | 585 | $addn->( +20.599,  -1, 0,  1, 0 ); | 
| 277 | 219 |  |  |  |  | 598 | $addn->( -30.598,  -1, 0,  1, -2 ); | 
| 278 | 219 |  |  |  |  | 622 | $addn->( -24.649,  -2, 0,  1, 0 ); | 
| 279 | 219 |  |  |  |  | 631 | $addn->( -2.000,   -2, 0,  1, -2 ); | 
| 280 | 219 |  |  |  |  | 480 | $addn->( -22.571,  0,  +1, 1, -2 ); | 
| 281 | 219 |  |  |  |  | 945 | }; | 
| 282 |  |  |  |  |  |  |  | 
| 283 |  |  |  |  |  |  | # perturbations of ecliptic latitude by Venus and Moon | 
| 284 |  |  |  |  |  |  | my $planetary = sub { | 
| 285 | 219 |  |  | 219 |  | 1328 | $dlam += | 
| 286 |  |  |  |  |  |  | +0.82 * sine( 0.7736 - 62.5512 * $t ) + | 
| 287 |  |  |  |  |  |  | 0.31 * sine( 0.0466 - 125.1025 * $t ) + | 
| 288 |  |  |  |  |  |  | 0.35 * sine( 0.5785 - 25.1042 * $t ) + | 
| 289 |  |  |  |  |  |  | 0.66 * sine( 0.4591 + 1335.8075 * $t ) + | 
| 290 |  |  |  |  |  |  | 0.64 * sine( 0.3130 - 91.5680 * $t ) + | 
| 291 |  |  |  |  |  |  | 1.14 * sine( 0.1480 + 1331.2898 * $t ) + | 
| 292 |  |  |  |  |  |  | 0.21 * sine( 0.5918 + 1056.5859 * $t ) + | 
| 293 |  |  |  |  |  |  | 0.44 * sine( 0.5784 + 1322.8595 * $t ) + | 
| 294 |  |  |  |  |  |  | 0.24 * sine( 0.2275 - 5.7374 * $t ) + | 
| 295 |  |  |  |  |  |  | 0.28 * sine( 0.2965 + 2.6929 * $t ) + | 
| 296 |  |  |  |  |  |  | 0.33 * sine( 0.3132 + 6.3368 * $t ); | 
| 297 | 219 |  |  |  |  | 1103 | }; | 
| 298 |  |  |  |  |  |  |  | 
| 299 |  |  |  |  |  |  | # | 
| 300 |  |  |  |  |  |  | # start | 
| 301 |  |  |  |  |  |  | # | 
| 302 | 219 |  |  |  |  | 592 | $init->(); | 
| 303 | 219 |  |  |  |  | 651 | $solar_1->(); | 
| 304 | 219 |  |  |  |  | 710 | $solar_2->(); | 
| 305 | 219 |  |  |  |  | 710 | $solar_3->(); | 
| 306 | 219 |  |  |  |  | 606 | $solar_n->(); | 
| 307 | 219 |  |  |  |  | 632 | $planetary->(); | 
| 308 |  |  |  |  |  |  |  | 
| 309 | 219 |  |  |  |  | 1339 | my $lambda = reduce_deg( rad2deg( $l0 + $dlam / ARCS ) ); | 
| 310 | 219 |  |  |  |  | 479 | my $s      = $f + $ds / ARCS; | 
| 311 | 219 |  |  |  |  | 393 | my $fac    = 1.000002708 + 139.978 * $dgam; | 
| 312 | 219 |  |  |  |  | 700 | my $beta = | 
| 313 |  |  |  |  |  |  | ( $fac * ( 18518.511 + 1.189 + $gam1c ) * sin($s) - | 
| 314 |  |  |  |  |  |  | 6.24 * sin( 3 * $s ) + | 
| 315 |  |  |  |  |  |  | $n ) / 3600.0; | 
| 316 |  |  |  |  |  |  |  | 
| 317 |  |  |  |  |  |  | # equatorial horizontal parallax | 
| 318 | 219 |  |  |  |  | 337 | $sinpi *= 0.999953253; | 
| 319 |  |  |  |  |  |  | # my $delta = 8.794 / $sinpi; | 
| 320 | 219 |  |  |  |  | 1980 | my $delta = $ARC /  $sinpi * $RADII_TO_AU; | 
| 321 |  |  |  |  |  |  |  | 
| 322 | 219 |  |  |  |  | 19364 | $lambda, $beta, $delta | 
| 323 |  |  |  |  |  |  | } | 
| 324 |  |  |  |  |  |  |  | 
| 325 |  |  |  |  |  |  |  | 
| 326 |  |  |  |  |  |  | sub apparent { | 
| 327 | 219 |  |  | 219 | 1 | 643 | my $self = shift; | 
| 328 | 219 |  |  |  |  | 593 | my ($mean, $nut_func) = @_; | 
| 329 | 219 |  |  |  |  | 518 | my ($l, $b, $r) = @$mean; | 
| 330 |  |  |  |  |  |  | # polar -> rectangular | 
| 331 | 219 |  |  |  |  | 972 | my ($x, $y, $z) = cart($r, deg2rad($b), deg2rad($l)); | 
| 332 |  |  |  |  |  |  | # true equinox of date | 
| 333 | 219 |  |  |  |  | 1117 | my @date = $nut_func->([$x, $y, $z]); | 
| 334 |  |  |  |  |  |  | # rectangular -> polar | 
| 335 | 219 |  |  |  |  | 805 | ($r, $b, $l) = polar(@date); | 
| 336 | 219 |  |  |  |  | 611 | rad2deg($l), rad2deg($b), $r | 
| 337 |  |  |  |  |  |  | } | 
| 338 |  |  |  |  |  |  |  | 
| 339 |  |  |  |  |  |  | 1; | 
| 340 |  |  |  |  |  |  |  | 
| 341 |  |  |  |  |  |  | __END__ | 
| 342 |  |  |  |  |  |  |  | 
| 343 |  |  |  |  |  |  | =pod | 
| 344 |  |  |  |  |  |  |  | 
| 345 |  |  |  |  |  |  | =encoding UTF-8 | 
| 346 |  |  |  |  |  |  |  | 
| 347 |  |  |  |  |  |  | =head1 NAME | 
| 348 |  |  |  |  |  |  |  | 
| 349 |  |  |  |  |  |  | Astro::Montenbruck::Ephemeris::Planet::Moon - Moon. | 
| 350 |  |  |  |  |  |  |  | 
| 351 |  |  |  |  |  |  | =head1 SYNOPSIS | 
| 352 |  |  |  |  |  |  |  | 
| 353 |  |  |  |  |  |  | use Astro::Montenbruck::Ephemeris::Planet::Moon; | 
| 354 |  |  |  |  |  |  | my $planet = Astro::Montenbruck::Ephemeris::Planet::Moon->new(); | 
| 355 |  |  |  |  |  |  | my @geo = $planet->moonpos($t); # apparent geocentric ecliptical coordinates | 
| 356 |  |  |  |  |  |  |  | 
| 357 |  |  |  |  |  |  | =head1 DESCRIPTION | 
| 358 |  |  |  |  |  |  |  | 
| 359 |  |  |  |  |  |  | Child class of L<Astro::Montenbruck::Ephemeris::Planet>, responsible for calculating | 
| 360 |  |  |  |  |  |  | B<Moon> position for the I<mean equinox of date>. | 
| 361 |  |  |  |  |  |  |  | 
| 362 |  |  |  |  |  |  | Formulae are based on analytical theory of by E.E.Brown (Improved Lunar Ephemeris) | 
| 363 |  |  |  |  |  |  | with accuracy of approx. 1 arc-second. | 
| 364 |  |  |  |  |  |  |  | 
| 365 |  |  |  |  |  |  | =head1 METHODS | 
| 366 |  |  |  |  |  |  |  | 
| 367 |  |  |  |  |  |  | =head2 Astro::Montenbruck::Ephemeris::Planet::Moon->new | 
| 368 |  |  |  |  |  |  |  | 
| 369 |  |  |  |  |  |  | Constructor. | 
| 370 |  |  |  |  |  |  |  | 
| 371 |  |  |  |  |  |  | =head2 $self->moonpos($t) | 
| 372 |  |  |  |  |  |  |  | 
| 373 |  |  |  |  |  |  | Geocentric ecliptic coordinates of the Moon. The coordinates are referred to the I<mean equinox od date> | 
| 374 |  |  |  |  |  |  |  | 
| 375 |  |  |  |  |  |  | =head3 Arguments | 
| 376 |  |  |  |  |  |  |  | 
| 377 |  |  |  |  |  |  | =over | 
| 378 |  |  |  |  |  |  |  | 
| 379 |  |  |  |  |  |  | =item B<$t> — time in Julian centuries since J2000: C<(JD-2451545.0)/36525.0> | 
| 380 |  |  |  |  |  |  |  | 
| 381 |  |  |  |  |  |  | =back | 
| 382 |  |  |  |  |  |  |  | 
| 383 |  |  |  |  |  |  | =head3 Returns | 
| 384 |  |  |  |  |  |  |  | 
| 385 |  |  |  |  |  |  | Hash of geocentric ecliptical coordinates. | 
| 386 |  |  |  |  |  |  |  | 
| 387 |  |  |  |  |  |  | =over | 
| 388 |  |  |  |  |  |  |  | 
| 389 |  |  |  |  |  |  | =item * B<x> — geocentric longitude, arc-degrees | 
| 390 |  |  |  |  |  |  |  | 
| 391 |  |  |  |  |  |  | =item * B<y> — geocentric latitude, arc-degrees | 
| 392 |  |  |  |  |  |  |  | 
| 393 |  |  |  |  |  |  | =item * B<z> — distance from Earth, AU | 
| 394 |  |  |  |  |  |  |  | 
| 395 |  |  |  |  |  |  | =back | 
| 396 |  |  |  |  |  |  |  | 
| 397 |  |  |  |  |  |  |  | 
| 398 |  |  |  |  |  |  | =head1 AUTHOR | 
| 399 |  |  |  |  |  |  |  | 
| 400 |  |  |  |  |  |  | Sergey Krushinsky, C<< <krushi at cpan.org> >> | 
| 401 |  |  |  |  |  |  |  | 
| 402 |  |  |  |  |  |  | =head1 COPYRIGHT AND LICENSE | 
| 403 |  |  |  |  |  |  |  | 
| 404 |  |  |  |  |  |  | Copyright (C) 2009-2022 by Sergey Krushinsky | 
| 405 |  |  |  |  |  |  |  | 
| 406 |  |  |  |  |  |  | This library is free software; you can redistribute it and/or modify | 
| 407 |  |  |  |  |  |  | it under the same terms as Perl itself. | 
| 408 |  |  |  |  |  |  |  | 
| 409 |  |  |  |  |  |  | =cut |