tengai 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. data/.gitignore +3 -0
  2. data/.ruby-gemset +1 -0
  3. data/.ruby-version +1 -0
  4. data/.travis.yml +8 -0
  5. data/Gemfile +3 -0
  6. data/README.md +47 -0
  7. data/Rakefile +52 -0
  8. data/ext/horizons/body_data_sheet_parser.rb +350 -0
  9. data/ext/horizons/body_data_sheet_parser.rl +52 -0
  10. data/ext/horizons/vector_ephemeris_parser.rb +4400 -0
  11. data/ext/horizons/vector_ephemeris_parser.rl +115 -0
  12. data/lib/tengai/body.rb +22 -0
  13. data/lib/tengai/client.rb +34 -0
  14. data/lib/tengai/ephemeris.rb +56 -0
  15. data/lib/tengai/parsers/ephemeris_table_parser.rb +20 -0
  16. data/lib/tengai/requests/ephemeris_request.rb +131 -0
  17. data/lib/tengai/vector_ephemeris_table.rb +36 -0
  18. data/lib/tengai/version.rb +5 -0
  19. data/lib/tengai.rb +27 -0
  20. data/tengai.gemspec +63 -0
  21. data/test/fixtures/bodies/10.txt +23 -0
  22. data/test/fixtures/bodies/399.txt +29 -0
  23. data/test/fixtures/bodies/499.txt +25 -0
  24. data/test/fixtures/bodies/501.txt +13 -0
  25. data/test/fixtures/ephemerides/mars_observed_by_earth_from_2012_12_28_to_29.txt +270 -0
  26. data/test/fixtures/ephemerides/mars_vectors_from_solar_system_center.txt +61 -0
  27. data/test/fixtures/major_bodies.txt +300 -0
  28. data/test/fixtures.rb +21 -0
  29. data/test/integration/body_integration_test.rb +26 -0
  30. data/test/integration/ephemeris_integration_test.rb +32 -0
  31. data/test/test_helper.rb +13 -0
  32. data/test/unit/body_data_sheet_parser_test.rb +25 -0
  33. data/test/unit/body_test.rb +35 -0
  34. data/test/unit/ephemeris_table_parser_test.rb +19 -0
  35. data/test/unit/ephemeris_test.rb +22 -0
  36. data/test/unit/vector_ephemeris_parser_test.rb +47 -0
  37. data/test/unit/vector_ephemeris_table_test.rb +30 -0
  38. metadata +178 -0
@@ -0,0 +1,115 @@
1
+ =begin
2
+ %%{
3
+
4
+ machine ephemeris_parser;
5
+
6
+ action mark { mark = p }
7
+
8
+ action target_body_id {
9
+ target_body_id = data[mark..p].pack('c*')
10
+ }
11
+
12
+ action center_body_id {
13
+ center_body_id = data[mark..p].pack('c*')
14
+ }
15
+
16
+ action start_time {
17
+ start_time = data[mark..p].pack('c*')
18
+ }
19
+
20
+ action stop_time {
21
+ stop_time = data[mark..p].pack('c*')
22
+ }
23
+
24
+ action step_size {
25
+ step_size = data[mark..p].pack('c*')
26
+ }
27
+
28
+ action ephemeris_table {
29
+ ephemeris_table = data[mark..p - 1].pack('c*')
30
+ }
31
+
32
+ action ephemeris_columns {
33
+ ephemeris_columns = data[mark..p].pack('c*')
34
+ }
35
+
36
+ ws = [ \t\r\n];
37
+
38
+ adbc = ('A.D.'|'B.C.');
39
+ year = digit{4};
40
+ month = upper lower{2};
41
+ date = digit{2};
42
+ hours = digit{2};
43
+ minutes = digit{2};
44
+ seconds = digit{2} '.' digit{4};
45
+ tz = ('C'|'U') 'T';
46
+ datetime = adbc ' ' year '-' month '-' date ' ' hours ':' minutes ':' seconds ' ' tz;
47
+
48
+ hr = '*'+ '\n';
49
+
50
+ time_unit = ('minute' [s]? | 'calendar year' [s]?);
51
+
52
+ body_name = (alnum | space)*;
53
+ body_id = digit*;
54
+
55
+ target_body = 'Target body name:' space body_name space
56
+ '(' body_id >mark @target_body_id ')'
57
+ ws* '{' any* '}' '\n';
58
+
59
+ center_body = 'Center body name:' space body_name space
60
+ '(' body_id >mark @center_body_id ')'
61
+ ws* '{' any* '}' '\n';
62
+
63
+ start_time = 'Start time' ' '* ':' ' ' datetime >mark %start_time space* '\n';
64
+ stop_time = 'Stop time' ' '* ':' ' ' datetime >mark %stop_time space* '\n';
65
+ step_size = 'Step-size' ' '* ':' ' ' (digit+ ' '* time_unit) >mark $step_size '\n';
66
+
67
+ ephemeris_columns = ('JDCT' (' ' | alpha | ',')*)
68
+ >mark @ephemeris_columns :> '\n';
69
+
70
+ soe = '$$SOE' '\n';
71
+ eoe = '$$EOE' '\n';
72
+ ephemeris_table = any*;
73
+ ephemeris = soe any* >mark %ephemeris_table :> eoe;
74
+
75
+ main := (
76
+ any*
77
+ target_body
78
+ center_body
79
+ any*
80
+ start_time
81
+ stop_time
82
+ step_size
83
+ any*
84
+ hr
85
+ ephemeris_columns
86
+ hr
87
+ ephemeris
88
+ any*
89
+ );
90
+
91
+ }%%
92
+ =end
93
+
94
+ require 'date'
95
+ module Tengai
96
+ class VectorEphemerisParser
97
+ def self.parse(data, ephemeris_table_parser=EphemerisTableParser)
98
+ data = data.unpack('c*') if data.is_a? String
99
+ eof = data.length
100
+
101
+ %% write init;
102
+ %% write exec;
103
+
104
+ { target_body_id: target_body_id.to_i,
105
+ center_body_id: center_body_id.to_i,
106
+ start_time: DateTime.parse(start_time),
107
+ stop_time: DateTime.parse(stop_time),
108
+ step_size: step_size,
109
+ ephemeris_table: ephemeris_table_parser.parse(
110
+ "#{ephemeris_columns}\n#{ephemeris_table}") }
111
+ end
112
+
113
+ %% write data;
114
+ end
115
+ end
@@ -0,0 +1,22 @@
1
+ $:.unshift File.dirname(File.dirname(File.dirname(__FILE__)))
2
+ require 'ext/horizons/body_data_sheet_parser'
3
+ require 'virtus'
4
+
5
+ module Tengai
6
+ class Body
7
+ include Virtus
8
+ attribute :revised_on, Date
9
+ attribute :name, String
10
+ attribute :id, Integer
11
+
12
+ def self.find(client, body, parser=BodyDataSheetParser)
13
+ data = client.cmd('String' => body.to_s, 'Match' => /<cr>:\s*$/)
14
+ data = parser.parse(data)
15
+ self.new(data)
16
+ end
17
+
18
+ def ==(other)
19
+ id == other.id
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,34 @@
1
+ require 'net/telnet'
2
+
3
+ module Tengai
4
+ class Client
5
+ HOST = 'horizons.jpl.nasa.gov'.freeze
6
+ PORT = '6775'.freeze
7
+ PROMPT = /Horizons>/.freeze
8
+
9
+ def initialize(telnet=Net::Telnet)
10
+ @telnet = telnet
11
+ connect!
12
+ end
13
+
14
+ def connect!
15
+ @connection = @telnet.new(
16
+ 'Host' => HOST,
17
+ 'Port' => PORT,
18
+ 'Prompt' => PROMPT)
19
+ @connection.waitfor 'Match' => PROMPT
20
+ end
21
+
22
+ def disconnect
23
+ @connection.close
24
+ end
25
+
26
+ def connection
27
+ @connection
28
+ end
29
+
30
+ def cmd(*args, &blk)
31
+ connection.cmd(*args, &blk)
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,56 @@
1
+ $:.unshift File.dirname(File.dirname(__FILE__))
2
+ require 'tengai/requests/ephemeris_request'
3
+ require 'tengai/vector_ephemeris_table'
4
+ require 'virtus'
5
+
6
+ module Tengai
7
+ class Ephemeris
8
+ include Virtus
9
+ attribute :target_body_id, Integer
10
+ attribute :center_body_id, Integer
11
+ attribute :start_time, DateTime
12
+ attribute :stop_time, DateTime
13
+ attribute :step_size, Integer
14
+ attribute :ephemeris_table, VectorEphemerisTable
15
+
16
+ def initialize(client, data)
17
+ super(data)
18
+ @client = client
19
+ end
20
+
21
+ def target_body
22
+ @target_body ||= Tengai::Body.find(@client, target_body_id)
23
+ end
24
+
25
+ def ephemeris_table=(table)
26
+ @ephemeris_table = VectorEphemerisTable.new_with_table(table)
27
+ end
28
+
29
+ # Public: fetch an ephemeris table for a given body using the client
30
+ #
31
+ # client - Tengai::Client
32
+ # body - a Tengai::Body instance whose ephemeris is needed
33
+ # options - A Hash of options for refining the ephemeris table
34
+ # :start_time - The Time beginning of the ephemeris
35
+ # :stop_time - The Time end of the ephemeris
36
+ # :interval - The resolution of the table in minutes
37
+ def self.fetch(client, body, options={})
38
+ start_time = options[:start_time] || Date.today.to_time # defaults start at today
39
+ stop_time = options[:stop_time] || (Date.today + 1).to_time # and end tomorrow
40
+ interval = options[:interval] || 1440
41
+
42
+ # Inject dependencies
43
+ request = options[:request] || EphemerisRequest
44
+ parser = options[:parser] || VectorEphemerisParser
45
+
46
+ data = request.fetch(
47
+ client, body.id,
48
+ start_time: start_time,
49
+ stop_time: stop_time,
50
+ interval: interval)
51
+ data = parser.parse(data)
52
+
53
+ new(client, data)
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,20 @@
1
+ require 'csv'
2
+
3
+ module Tengai
4
+ class EphemerisTableParser
5
+ def self.parse(table)
6
+ empty_nils = ->(value) { value || '' }
7
+ strip = ->(value) { value.strip }
8
+
9
+ table = CSV.parse(
10
+ table,
11
+ headers: true,
12
+ header_converters: [empty_nils, strip, :symbol],
13
+ converters: [empty_nils, strip])
14
+
15
+ table.map do |row|
16
+ row.to_hash.tap {|r| r.delete(:'') }
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,131 @@
1
+ module Tengai
2
+ class EphemerisRequest
3
+ SYSTEM_PROMPT = %r{Horizons>}.freeze
4
+ DEFAULT_PROMPT = %r{<cr>:\s*$}
5
+ TABLE_PROMPT = %r{Observe, Elements, Vectors \[o,e,v,\?\] :\s*$}.freeze
6
+ FIRST_OBSERVER_PROMPT = %r{Coordinate center \[ <id>,coord,geo \] :\s*$}.freeze
7
+ SUBSEQUENT_OBSERVER_PROMPT = %r{Use previous center \[ cr=\(y\), n, \? \] :\s*$}.freeze
8
+ OBSERVER_PROMPT = Regexp.union(FIRST_OBSERVER_PROMPT, SUBSEQUENT_OBSERVER_PROMPT).freeze
9
+ CONFIRM_OBSERVER_PROMPT = %r{Confirm selected station \[ y/n \] -->\s*$}.freeze
10
+ REFERNCE_PLANE_PROMPT = %r{Reference plane \[eclip, frame, body \] :\s*}.freeze
11
+ START_TIME_PROMPT = %r{Starting (C|U)T .* :\s*$}.freeze
12
+ END_TIME_PROMPT = %r{Ending \s* (C|U)T .* :\s*$}.freeze
13
+ INTERVAL_PROMPT = %r{Output interval \[ex: 10m, 1h, 1d, \? \] :\s*$}.freeze
14
+ ACCEPT_DEFAULT_OUTPUT_PROMPT = %r{Accept default output \[ cr=\(y\), n, \?\] :\s*$}.freeze
15
+ OUTPUT_REFERENCE_FRAME_PROMPT = %r{Output reference frame \[J2000, B1950\] :\s*$}.freeze
16
+ CORRECTIONS_PROMPT = %r{Corrections \[ 1=NONE, 2=LT, 3=LT\+S \] :\s*$}.freeze
17
+ OUTPUT_UNITS = %r{Output units \[1=KM-S, 2=AU-D, 3=KM-D\] :\s*$}.freeze
18
+ CSV_FORMAT_PROMPT = %r{Spreadsheet CSV format \[ YES, NO \] :\s*$}.freeze
19
+ LABEL_CARTESIAN_OUTPUT_PROMPT = %r{Label cartesian output \[ YES, NO \] :\s*$}.freeze
20
+ SELECT_OUTPUT_TABLE_TYPE_PROMPT = %r{Select output table type \[ 1-6, \? \] :\s*$}.freeze
21
+ SELECT_QUANTITIES_PROMPT = %r{Select table quantities \[ <#,#\.\.>, \?\] :\s*$}.freeze
22
+ COMPLETED_PROMPT = %r{>>> Select\.\.\. \[A\]gain, \[N\]ew-case, \[F\]tp, \[K\]ermit, \[M\]ail, \[R\]edisplay, \? :\s*$}.freeze
23
+
24
+ ANY_PROMPT = Regexp.union(
25
+ DEFAULT_PROMPT, TABLE_PROMPT, OBSERVER_PROMPT, CONFIRM_OBSERVER_PROMPT,
26
+ REFERNCE_PLANE_PROMPT, START_TIME_PROMPT, END_TIME_PROMPT, INTERVAL_PROMPT,
27
+ ACCEPT_DEFAULT_OUTPUT_PROMPT, SELECT_QUANTITIES_PROMPT, COMPLETED_PROMPT,
28
+ OUTPUT_REFERENCE_FRAME_PROMPT, CORRECTIONS_PROMPT, OUTPUT_UNITS,
29
+ CSV_FORMAT_PROMPT, LABEL_CARTESIAN_OUTPUT_PROMPT,
30
+ SELECT_OUTPUT_TABLE_TYPE_PROMPT, SYSTEM_PROMPT).freeze
31
+
32
+ TIME_FORMAT = '%Y-%b-%d %H:%M'.freeze
33
+
34
+ def initialize(client, body, options={})
35
+ @client = client
36
+ @body = body.to_s
37
+ @start_time = options[:start_time]
38
+ @stop_time = options[:stop_time]
39
+ @interval = options[:interval] || 1440
40
+ @options = options
41
+ @state = :ready
42
+ end
43
+
44
+ def self.fetch(client, body, options={})
45
+ new(client, body, options).fetch
46
+ end
47
+
48
+ # Public: initiates the ephemeris request
49
+ #
50
+ # Examples:
51
+ #
52
+ # Tengai::EphemerisRequest.new(Tengai::Client.new, 499).fetch
53
+ # # => #<Tengai::EphemerisRequest @data=""B\n \r\n Working ... \b\b- \r\n\e[?1h\e=\r*...">
54
+ #
55
+ # Returns the the request (self)
56
+ def fetch
57
+ raise "Not ready" unless @state == :ready
58
+ @state = :fetching
59
+ send_command(@body)
60
+ @data
61
+ end
62
+
63
+ private
64
+ def table
65
+ case @options[:table]
66
+ when :observer then 'o'
67
+ when :vector then 'v'
68
+ when :orbital_elements then 'e'
69
+ else 'v'
70
+ end
71
+ end
72
+
73
+ def observer
74
+ @options[:observer] || '500@0'
75
+ end
76
+
77
+ def send_command(command, prompt=ANY_PROMPT)
78
+ Tengai.log "> #{command}"
79
+ result = @client.cmd('String' => command, 'Match' => prompt) do |data|
80
+ Tengai.log '< ' + data
81
+ end
82
+ receive_data(result)
83
+ end
84
+
85
+ def receive_data(data)
86
+ case data
87
+ when DEFAULT_PROMPT
88
+ send_command 'E'
89
+ when TABLE_PROMPT
90
+ send_command table
91
+ when FIRST_OBSERVER_PROMPT
92
+ send_command observer
93
+ when SUBSEQUENT_OBSERVER_PROMPT
94
+ send_command 'n'
95
+ when CONFIRM_OBSERVER_PROMPT
96
+ send_command 'y'
97
+ when REFERNCE_PLANE_PROMPT
98
+ send_command 'frame'
99
+ when START_TIME_PROMPT
100
+ send_command @start_time.strftime(TIME_FORMAT)
101
+ when END_TIME_PROMPT
102
+ send_command @stop_time.strftime(TIME_FORMAT)
103
+ when INTERVAL_PROMPT
104
+ send_command @interval.to_s + 'm'
105
+ when ACCEPT_DEFAULT_OUTPUT_PROMPT
106
+ send_command 'n'
107
+ when OUTPUT_REFERENCE_FRAME_PROMPT
108
+ send_command 'J2000'
109
+ when CORRECTIONS_PROMPT
110
+ send_command '1'
111
+ when OUTPUT_UNITS
112
+ send_command '2'
113
+ when CSV_FORMAT_PROMPT
114
+ send_command 'YES'
115
+ when LABEL_CARTESIAN_OUTPUT_PROMPT
116
+ send_command 'YES'
117
+ when SELECT_OUTPUT_TABLE_TYPE_PROMPT
118
+ send_command '03'
119
+ when SELECT_QUANTITIES_PROMPT
120
+ send_command 'B'
121
+ when COMPLETED_PROMPT
122
+ @data = data
123
+ send_command 'N'
124
+ when Client::PROMPT
125
+ @state = :ready
126
+ else
127
+ puts "Unexpected data: #{data}"
128
+ end
129
+ end
130
+ end
131
+ end
@@ -0,0 +1,36 @@
1
+ require 'date'
2
+ require 'virtus'
3
+
4
+ class VectorEphemerisTable
5
+ include Enumerable
6
+
7
+ def initialize(rows)
8
+ @rows = rows
9
+ end
10
+
11
+ def self.new_with_table(rows)
12
+ new(rows.map(&Row.method(:new)))
13
+ end
14
+
15
+ def each(&block)
16
+ @rows.each(&block)
17
+ end
18
+
19
+ class Row
20
+ include Virtus
21
+ attribute :jdct, DateTime
22
+ attribute :x, Float
23
+ attribute :y, Float
24
+ attribute :z, Float
25
+ attribute :vx, Float
26
+ attribute :vy, Float
27
+ attribute :vz, Float
28
+ attribute :lt, Float
29
+ attribute :rg, Float
30
+ attribute :rr, Float
31
+
32
+ def jdct=(julian)
33
+ super DateTime.jd(julian.to_f)
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,5 @@
1
+ module Tengai
2
+ unless defined?(Tengai::VERSION)
3
+ VERSION = '0.0.1'.freeze
4
+ end
5
+ end
data/lib/tengai.rb ADDED
@@ -0,0 +1,27 @@
1
+ $:.unshift File.dirname(__FILE__)
2
+ $:.unshift File.join(File.dirname(File.dirname(__FILE__)), 'ext')
3
+
4
+ require 'logger'
5
+
6
+ require 'tengai/version'
7
+ require 'tengai/client'
8
+ require 'tengai/body'
9
+ require 'tengai/ephemeris'
10
+
11
+ require 'horizons/vector_ephemeris_parser'
12
+ require 'tengai/parsers/ephemeris_table_parser'
13
+
14
+ module Tengai
15
+ class << self
16
+ attr_accessor :debug
17
+ attr_reader :logger
18
+
19
+ def log(message)
20
+ logger.debug { message } if debug
21
+ end
22
+ end
23
+
24
+ @logger ||= ::Logger.new(STDOUT)
25
+
26
+ self.debug = false
27
+ end
data/tengai.gemspec ADDED
@@ -0,0 +1,63 @@
1
+ $LOAD_PATH.unshift 'lib'
2
+ $LOAD_PATH.unshift 'ext'
3
+ require 'tengai/version'
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = 'tengai'
7
+ s.version = Tengai::VERSION.dup
8
+ s.summary = 'Ruby wrapper for the NASA HORIZONS telnet system'
9
+ s.description = 'Ruby wrapper for the NASA HORIZONS telnet system'
10
+ s.homepage = 'http://github.com/zacstewart/tengai'
11
+ s.authors = ['Zac Stewart']
12
+ s.email = ['zgstewart@gmail.com']
13
+
14
+ s.require_paths = ['lib']
15
+
16
+ s.add_dependency 'virtus'
17
+
18
+ s.add_development_dependency 'pry'
19
+ s.add_development_dependency 'rake'
20
+ s.add_development_dependency 'mocha'
21
+ s.add_development_dependency 'simplecov'
22
+ s.add_development_dependency 'forgery'
23
+
24
+ s.files = %w(
25
+ .gitignore
26
+ .ruby-gemset
27
+ .ruby-version
28
+ .travis.yml
29
+ Gemfile
30
+ README.md
31
+ Rakefile
32
+ ext/horizons/body_data_sheet_parser.rb
33
+ ext/horizons/body_data_sheet_parser.rl
34
+ ext/horizons/vector_ephemeris_parser.rb
35
+ ext/horizons/vector_ephemeris_parser.rl
36
+ lib/tengai.rb
37
+ lib/tengai/body.rb
38
+ lib/tengai/client.rb
39
+ lib/tengai/ephemeris.rb
40
+ lib/tengai/parsers/ephemeris_table_parser.rb
41
+ lib/tengai/requests/ephemeris_request.rb
42
+ lib/tengai/vector_ephemeris_table.rb
43
+ lib/tengai/version.rb
44
+ tengai.gemspec
45
+ test/fixtures.rb
46
+ test/fixtures/bodies/10.txt
47
+ test/fixtures/bodies/399.txt
48
+ test/fixtures/bodies/499.txt
49
+ test/fixtures/bodies/501.txt
50
+ test/fixtures/ephemerides/mars_observed_by_earth_from_2012_12_28_to_29.txt
51
+ test/fixtures/ephemerides/mars_vectors_from_solar_system_center.txt
52
+ test/fixtures/major_bodies.txt
53
+ test/integration/body_integration_test.rb
54
+ test/integration/ephemeris_integration_test.rb
55
+ test/test_helper.rb
56
+ test/unit/body_data_sheet_parser_test.rb
57
+ test/unit/body_test.rb
58
+ test/unit/ephemeris_table_parser_test.rb
59
+ test/unit/ephemeris_test.rb
60
+ test/unit/vector_ephemeris_parser_test.rb
61
+ test/unit/vector_ephemeris_table_test.rb
62
+ )
63
+ end
@@ -0,0 +1,23 @@
1
+ *******************************************************************************
2
+ Revised : Sep 12, 1996 Sun 10
3
+ Physical: May 29, 2012
4
+
5
+ PHYSICAL PROPERTIES:
6
+ GM (10^11 km^3/s^2) = 1.32712440018 Mass (10^30 kg) = 1.9891
7
+ Radius (photosphere) = 6.963(10^5) km Angular diam at 1 AU = 1919.3"
8
+ Solar Radius (IAU) = 6.955(10^5) km Mean density = 1.408 g/cm^3
9
+ Surface gravity = 274.0 m/s^2 Moment of inertia = 0.059
10
+ Escape velocity = 617.7 km/s Adopted sidereal per = 25.38 d
11
+ Pole (RA,DEC in deg.) = 286.13,63.87 Obliquity to ecliptic = 7 deg 15'
12
+ Solar constant (1 AU) = 1367.6 W/m^2 Solar lumin.(erg/s) = 3.846(10^33)
13
+ Mass-energy conv rate = 4.3(10^12 gm/s) Effective temp (K) = 5778
14
+ Surf. temp (photosphr)= 6600 K (bottom) Surf. temp (photosphr)= 4400 K (top)
15
+ Photospheric depth = ~400 km Chromospheric depth = ~2500 km
16
+ Sunspot cycle = 11.4 yr Cycle 22 sunspot min. = 1991 A.D.
17
+
18
+ Motn. rel to nrby strs= apex : RA=271 deg; DEC=+30 deg
19
+ speed: 19.4 km/s = 0.0112 AU/day
20
+ Motn. rel to 2.73K BB = apex : l=264.7+-0.8; b=48.2+-0.5
21
+ speed: 369 +-11 km/s
22
+ *******************************************************************************
23
+ Select ... [E]phemeris, [F]tp, [M]ail, [R]edisplay, ?, <cr>:
@@ -0,0 +1,29 @@
1
+ *******************************************************************************
2
+ Revised: Apr 03, 2003 Earth 399
3
+
4
+ PHYSICAL PROPERTIES:
5
+ Mean radius, km = 6371.01+-0.02 Mass, 10^24 kg = 5.9736
6
+ Equ. radius, km = 6378.136 Mass layers:
7
+ Polar axis, km = 6356.752 Atmos = 5.1 x 10^18 kg
8
+ Flattening = 1/298.257 oceans = 1.4 x 10^21 kg
9
+ Density, gm cm^-3 = 5.515 crust = 2.6 x 10^22 kg
10
+ J2 (GEM T2, 1990) = 0.0010826265 mantle = 4.043 x 10^24 kg
11
+ gp, m s^-2 (polar) = 9.8321863685 outer core = 1.835 x 10^24 kg
12
+ ge, m s^-2 (equatorial) = 9.7803267715 inner core = 9.675 x 10^22 kg
13
+ go, m s^-2 = 9.82022 Fluid core rad = 3480 km
14
+ GM, km^3 s^-2 = 398600.440 Inner core rad = 1215 km
15
+ Mean rot. rate, rad s^-1 = 7.292115*10^-5 Surface Area:
16
+ Sidereal period, hr = 23.93419 land = 1.48 x 10^8 km
17
+ Mean solar day, days = 1.002738 sea = 3.62 x 10^8 km
18
+ Moment of inertia = 0.3308 Love no., k2 = 0.299
19
+ Mean Temperature, K = 270 Atm. pressure = 1.0 bar
20
+ Solar constant, W/m^2 = 1367.6 Vis. mag. V(1,0) = -3.86
21
+ Volume, 10^10 km^3 = 108.321 Geometric albedo = 0.367
22
+
23
+ DYNAMICAL CHARACTERISTICS:
24
+ Obliquity to orbit, deg = 23.45 Sidereal period = 1.0000174 yrs
25
+ Orbit velocity, km s^-1 = 29.7859 Sidereal period = 365.25636 days
26
+ Mean daily motion, n = 0.9856474 deg/d Escape velocity = 11.186 km s^-2
27
+ Hill's sphere radius = 234.9 Magnetic moment = 0.61 gauss Rp^3
28
+ *******************************************************************************
29
+ Select ... [E]phemeris, [F]tp, [M]ail, [R]edisplay, ?, <cr>:
@@ -0,0 +1,25 @@
1
+ *******************************************************************************
2
+ Revised: Sep 28, 2012 Mars 499 / 4
3
+
4
+ GEOPHYSICAL DATA (updated 2009-May-26):
5
+ Mean radius (km) = 3389.9(2+-4) Density (g cm^-3) = 3.933(5+-4)
6
+ Mass (10^23 kg ) = 6.4185 Flattening, f = 1/154.409
7
+ Volume (x10^10 km^3) = 16.318 Semi-major axis = 3397+-4
8
+ Sidereal rot. period = 24.622962 hr Rot. Rate (x10^5 s) = 7.088218
9
+ Mean solar day = 1.0274907 d Polar gravity ms^-2 = 3.758
10
+ Mom. of Inertia = 0.366 Equ. gravity ms^-2 = 3.71
11
+ Core radius (km) = ~1700 Potential Love # k2 = 0.153 +-.017
12
+
13
+ Grav spectral fact u = 14 (x10^5) Topo. spectral fact t = 96 (x10^5)
14
+ Fig. offset (Rcf-Rcm) = 2.50+-0.07 km Offset (lat./long.) = 62d / 88d
15
+ GM (km^3 s^-2) = 42828.3 Equatorial Radius, Re = 3394.0 km
16
+ GM 1-sigma (km^3 s^-2)= +- 0.1 Mass ratio (Sun/Mars) = 3098708+-9
17
+
18
+ Atmos. pressure (bar) = 0.0056 Max. angular diam. = 17.9"
19
+ Mean Temperature (K) = 210 Visual mag. V(1,0) = -1.52
20
+ Geometric albedo = 0.150 Obliquity to orbit = 25.19 deg
21
+ Mean sidereal orb per = 1.88081578 y Orbit vel. km/s = 24.1309
22
+ Mean sidereal orb per = 686.98 d Escape vel. km/s = 5.027
23
+ Hill's sphere rad. Rp = 319.8 Mag. mom (gauss Rp^3) = < 1x10^-4
24
+ *******************************************************************************
25
+ Select ... [E]phemeris, [F]tp, [M]ail, [R]edisplay, ?, <cr>:
@@ -0,0 +1,13 @@
1
+ *******************************************************************************
2
+ Revised: Jan 08, 2004 Io / (Jupiter) 501
3
+
4
+ SATELLITE PHYSICAL PROPERTIES:
5
+ Radius (km) = 1821.3 +- 0.2 Density (g cm^-3) = 3.530 +-.006
6
+ Mass (10^20 kg ) = 893.3 +- 1.5 Geometric Albedo = 0.6
7
+
8
+ SATELLITE ORBITAL DATA:
9
+ Semi-major axis, a (km) = 421.769 (10^3) Orbital period = 1.769138 d
10
+ Eccentricity, e = 0.0041 Rotational period = Synchronous
11
+ Inclination, i (deg) = 0.036
12
+ *******************************************************************************
13
+ Select ... [E]phemeris, [F]tp, [M]ail, [R]edisplay, ?, <cr>: