File Coverage

lib/Astro/Montenbruck/Ephemeris/Pert.pm
Criterion Covered Total %
statement 56 59 94.9
branch 2 2 100.0
condition 2 2 100.0
subroutine 8 8 100.0
pod 2 2 100.0
total 70 73 95.8


line stmt bran cond sub pod time code
1             package Astro::Montenbruck::Ephemeris::Pert;
2              
3 1     1   5 use strict;
  1         2  
  1         24  
4 1     1   5 use warnings;
  1         1  
  1         22  
5 1     1   4 use Exporter qw/import/;
  1         2  
  1         43  
6             our @EXPORT_OK = qw(pert addthe);
7              
8             our $VERSION = 0.01;
9              
10 1     1   5 use constant OFFSET => 16;
  1         2  
  1         77  
11             use constant {
12 1         535 OFFSET_M => OFFSET - 1,
13             OFFSET_P => OFFSET + 1,
14 1     1   6 };
  1         1  
15              
16             sub addthe {
17 2212     2212 1 4371 $_[0] * $_[2] - $_[1] * $_[3], $_[1] * $_[2] + $_[0] * $_[3];
18             }
19              
20             sub pert {
21 74     74 1 308 my %arg = @_;
22             my ($callback, $t, $M, $m, $I_min, $I_max, $i_min, $i_max, $phi) =
23 74         133 map{ $arg{$_} } qw/callback T M m I_min I_max i_min i_max phi/;
  666         926  
24 74   100     307 $phi //= 0;
25              
26 74         124 my $cos_m = cos( $M );
27 74         105 my $sin_m = sin( $M );
28 74         171 my @C;
29             my @S;
30 74         0 my @c;
31 74         0 my @s;
32              
33 74         129 $C[OFFSET] = cos($phi);
34 74         99 $S[OFFSET] = sin($phi);
35              
36 74         149 for ( my $i = 0; $i < $I_max; $i++ ) {
37 348         415 my $j = OFFSET + $i;
38 348         389 my $k = $j + 1;
39 348         512 ( $C[$k], $S[$k] ) = addthe( $C[$j], $S[$j], $cos_m, $sin_m );
40             }
41 74         140 for ( my $i = 0; $i > $I_min; $i-- ) {
42 26         35 my $j = OFFSET + $i;
43 26         35 my $k = $j - 1;
44 26         42 ( $C[$k], $S[$k] ) = addthe( $C[$j], $S[$j], $cos_m, -$sin_m );
45             }
46 74         113 $c[OFFSET] = 1.0;
47 74         122 $c[OFFSET_P] = cos( $m );
48 74         95 $c[OFFSET_M] = $c[OFFSET_P];
49 74         101 $s[OFFSET] = 0.0;
50 74         117 $s[OFFSET_P] = sin( $m );
51 74         104 $s[OFFSET_M] = -$s[OFFSET_P];
52 74         132 for ( my $i = 1; $i < $i_max; $i++ ) {
53 0         0 my $j = OFFSET + $i;
54 0         0 my $k = $j + 1;
55 0         0 ( $c[$k], $s[$k] ) = addthe( $c[$j], $s[$j], $c[OFFSET_P], $s[OFFSET_P] );
56             }
57 74         117 for ( my $i = -1; $i > $i_min; $i-- ) {
58 238         277 my $j = OFFSET + $i;
59 238         270 my $k = $j - 1;
60 238         313 ( $c[$k], $s[$k] ) = addthe( $c[$j], $s[$j], $c[OFFSET_M], $s[OFFSET_M] );
61             }
62              
63 74         112 my ($u, $v) = (0, 0);
64              
65             sub {
66 1168     1168   1817 my ( $I, $i, $iT, $dlc, $dls, $drc, $drs, $dbc, $dbs ) = @_;
67 1168         1334 my $k = OFFSET + $I;
68 1168         1307 my $j = OFFSET + $i;
69 1168 100       1531 if ( $iT == 0 ) {
70 1048         1501 ( $u, $v ) = addthe( $C[$k], $S[$k], $c[$j], $s[$j] );
71             }
72             else {
73 120         137 $u *= $t;
74 120         123 $v *= $t;
75             }
76 1168         2405 $callback->(
77             $dlc * $u + $dls * $v,
78             $drc * $u + $drs * $v,
79             $dbc * $u + $dbs * $v
80             );
81             }
82 74         734 }
83              
84             1;
85              
86             __END__
87              
88             =pod
89              
90             =encoding UTF-8
91              
92             =head1 NAME
93              
94             Astro::Montenbruck::Ephemeris::Pert - Calculation of perturbations.
95              
96             =head1 SYNOPSIS
97              
98             use Astro::Montenbruck::Ephemeris::Pert qw /pert/;
99              
100             ($dl, $dr, $db) = (0, 0, 0); # Corrections in longitude ["],
101             $pert_cb = sub { $dl += $_[0]; $dr += $_[1]; $db += $_[2] };
102              
103             $term
104             = pert( T => $t,
105             M => $m1,
106             m => $m3,
107             I_min => 0,
108             I_max => 2,
109             i_min =>-4,
110             i_max =>-1,
111             callback => $pert_cb);
112             $term->(-1, -1,0, -0.2, 1.4, 2.0, 0.6, 0.1, -0.2);
113             $term->( 0, -1,0, 9.4, 8.9, 3.9, -8.3, -0.4, -1.4);
114             ...
115              
116             =head1 DESCRIPTION
117              
118             Calculates perturbations for Sun, Moon and the 8 planets. Used internally by
119             L<Astro::Montenbruck::Ephemeris> module.
120              
121             =head2 EXPORT
122              
123             =over
124              
125             =item * L<pert(%args)>
126              
127             =item * L<addthe($a, $b, $c, $d)>
128              
129             =back
130              
131             =head1 SUBROUTINES/METHODS
132              
133             =head2 pert(%args)
134              
135             Calculates perturbations to ecliptic heliocentric coordinates of the planet.
136              
137             =head3 Named arguments
138              
139             =over
140              
141             =item * B<T> — time in centuries since epoch 2000.0
142              
143             =item *
144              
145             B<M>, B<m>, B<I_min>, B<I_max>, B<i_min>, B<i_max> — internal indices
146              
147             =item *
148              
149             B<callback> — reference to a function which recievs corrections to the 3
150             coordinates and typically applies them (see L</SYNOPSIS>)
151              
152             =back
153              
154             =head2 addthe($a, $b, $c, $d)
155              
156             Calculates C<c=cos(a1+a2)> and C<s=sin(a1+a2)> from the addition theorems for
157             C<c1=cos(a1), s1=sin(a1), c2=cos(a2) and s2=sin(a2)>
158              
159             =head3 Arguments
160              
161             c1, s1, c2, s2
162              
163              
164             =head1 AUTHOR
165              
166             Sergey Krushinsky, C<< <krushi at cpan.org> >>
167              
168             =head1 COPYRIGHT AND LICENSE
169              
170             Copyright (C) 2009-2019 by Sergey Krushinsky
171              
172             This library is free software; you can redistribute it and/or modify
173             it under the same terms as Perl itself.
174              
175             =cut