Astro-Coord-ECI-VSOP87D
view release on metacpan or search on metacpan
lib/Astro/Coord/ECI/VSOP87D.pm view on Meta::CPAN
}
# The model computes nutations in milli arc seconds, but we
# return them in radians
return ( @memoize_result =
map { deg2rad( $_ / 3600_0000 ) } $delta_psi, $delta_eps );
}
}
sub __get_attr {
my ( $self ) = @_;
my $ref = ref $self
or confess 'Can not call as static method';
return $self->{$ref} ||= {
model_cutoff_definition => dclone( $self->__model_definition(
'default_model_cutoff' ) ),
};
}
sub __default {
my ( $class, $arg ) = @_;
my $name = $class->__model_definition( 'body' );
defined $arg->{id}
or $arg->{id} = $name;
defined $arg->{name}
or $arg->{name} = $name;
defined $arg->{diameter}
or $arg->{diameter} = $class->__model_definition( 'diameter' );
defined $arg->{model_cutoff}
or $arg->{model_cutoff} = 'Meeus';
defined $arg->{nutation_cutoff}
or $arg->{nutation_cutoff} = 3;
return;
}
sub __mutate_model_cutoff {
my ( $self, $name, $val ) = @_;
defined $val
or croak "model cutoff must be defined";
$self->model_cutoff_definition( $val )
or croak "model cutoff '$val' is unknown";
$self->__get_attr()->{$name} = $val;
return $self;
}
sub model_cutoff_definition {
my ( $self, $name, @arg ) = @_;
defined $name
or $name = $self->get( 'model_cutoff' );
my $attr = $self->__get_attr();
if ( @arg ) {
if ( defined( my $val = $arg[0] ) ) {
unless ( ref $val ) {
looks_like_number( $val )
and $val !~ m/ \A Inf (?: inity )? | NaN \z /smx
or croak 'Scalar model cutoff definition must be a number';
my $num = $val;
$val = sub {
my ( @model ) = @_;
my %cutoff;
foreach my $series ( @model ) {
my $count = 0;
foreach my $term ( @{ $series->{terms} } ) {
last if $term->[0] < $num;
$count++;
}
$count
and $cutoff{$series->{series}} = $count;
}
return \%cutoff;
};
}
if ( CODE_REF eq ref $val ) {
$val = $val->(
map { @{ $_ } } @{
$self->__model_definition( 'model' ) }
);
$val->{name} = $name;
}
HASH_REF eq ref $val
or croak 'The model cutoff definition value must be a hash ref';
my $terms = $self->__model_definition(
'default_model_cutoff')->{none};
foreach my $name ( keys %{ $val } ) {
'name' eq $name
and next;
exists $terms->{$name}
or croak "Series '$name' not in this model";
$val->{$name} > $terms->{$name}
and croak "Series '$name' has only $terms->{$name} terms";
}
$attr->{model_cutoff_definition}{$name} = $val;
} else {
$self->__model_definition( 'default_model_cutoff' )->{$name}
and croak "You may not delete model cutoff definition '$name'";
delete $attr->{model_cutoff_definition}{$name};
}
return $self;
} else {
return $attr->{model_cutoff_definition}{$name};
}
}
# Static method
# Given dynamical time in seconds, return Ecliptic position in Ecliptic
# longitude (radians), Ecliptic latitude (radians), Range (AU) and
# AU and velocity in AU/day
sub __model {
my ( $self, $time, %arg ) = @_;
DEBUG
and printf <<'EOD',
__model:
invocant: %s
( run in 0.916 second using v1.01-cache-2.11-cpan-54e63673c56 )