astronoby 0.6.0 → 0.8.0

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 (96) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -0
  3. data/.standard.yml +1 -0
  4. data/CHANGELOG.md +203 -3
  5. data/README.md +69 -288
  6. data/UPGRADING.md +267 -0
  7. data/docs/README.md +196 -0
  8. data/docs/angles.md +137 -0
  9. data/docs/celestial_bodies.md +107 -0
  10. data/docs/configuration.md +98 -0
  11. data/docs/coordinates.md +167 -0
  12. data/docs/ephem.md +85 -0
  13. data/docs/equinoxes_solstices_times.md +31 -0
  14. data/docs/glossary.md +152 -0
  15. data/docs/instant.md +139 -0
  16. data/docs/moon_phases.md +79 -0
  17. data/docs/observer.md +65 -0
  18. data/docs/reference_frames.md +138 -0
  19. data/docs/rise_transit_set_times.md +119 -0
  20. data/docs/twilight_times.md +123 -0
  21. data/lib/astronoby/aberration.rb +56 -31
  22. data/lib/astronoby/angle.rb +20 -16
  23. data/lib/astronoby/angles/dms.rb +2 -2
  24. data/lib/astronoby/angles/hms.rb +2 -2
  25. data/lib/astronoby/bodies/earth.rb +62 -0
  26. data/lib/astronoby/bodies/jupiter.rb +28 -0
  27. data/lib/astronoby/bodies/mars.rb +28 -0
  28. data/lib/astronoby/bodies/mercury.rb +32 -0
  29. data/lib/astronoby/bodies/moon.rb +51 -298
  30. data/lib/astronoby/bodies/neptune.rb +32 -0
  31. data/lib/astronoby/bodies/saturn.rb +37 -0
  32. data/lib/astronoby/bodies/solar_system_body.rb +232 -0
  33. data/lib/astronoby/bodies/sun.rb +33 -214
  34. data/lib/astronoby/bodies/uranus.rb +16 -0
  35. data/lib/astronoby/bodies/venus.rb +36 -0
  36. data/lib/astronoby/cache.rb +188 -0
  37. data/lib/astronoby/configuration.rb +92 -0
  38. data/lib/astronoby/constants.rb +17 -2
  39. data/lib/astronoby/constellation.rb +12 -0
  40. data/lib/astronoby/constellations/data.rb +42 -0
  41. data/lib/astronoby/constellations/finder.rb +35 -0
  42. data/lib/astronoby/constellations/repository.rb +20 -0
  43. data/lib/astronoby/coordinates/ecliptic.rb +2 -37
  44. data/lib/astronoby/coordinates/equatorial.rb +28 -10
  45. data/lib/astronoby/coordinates/horizontal.rb +0 -46
  46. data/lib/astronoby/corrections/light_time_delay.rb +90 -0
  47. data/lib/astronoby/data/constellations/constellation_names.dat +88 -0
  48. data/lib/astronoby/data/constellations/indexed_abbreviations.dat +88 -0
  49. data/lib/astronoby/data/constellations/radec_to_index.dat +238 -0
  50. data/lib/astronoby/data/constellations/sorted_declinations.dat +202 -0
  51. data/lib/astronoby/data/constellations/sorted_right_ascensions.dat +237 -0
  52. data/lib/astronoby/deflection.rb +187 -0
  53. data/lib/astronoby/distance.rb +9 -0
  54. data/lib/astronoby/ephem.rb +39 -0
  55. data/lib/astronoby/equinox_solstice.rb +22 -19
  56. data/lib/astronoby/errors.rb +4 -0
  57. data/lib/astronoby/events/moon_phases.rb +15 -13
  58. data/lib/astronoby/events/rise_transit_set_calculator.rb +376 -0
  59. data/lib/astronoby/events/rise_transit_set_event.rb +13 -0
  60. data/lib/astronoby/events/rise_transit_set_events.rb +13 -0
  61. data/lib/astronoby/events/twilight_calculator.rb +221 -0
  62. data/lib/astronoby/events/twilight_event.rb +28 -0
  63. data/lib/astronoby/events/twilight_events.rb +22 -115
  64. data/lib/astronoby/instant.rb +176 -0
  65. data/lib/astronoby/julian_date.rb +78 -0
  66. data/lib/astronoby/mean_obliquity.rb +24 -13
  67. data/lib/astronoby/nutation.rb +235 -42
  68. data/lib/astronoby/observer.rb +55 -0
  69. data/lib/astronoby/precession.rb +102 -18
  70. data/lib/astronoby/reference_frame.rb +50 -0
  71. data/lib/astronoby/reference_frames/apparent.rb +60 -0
  72. data/lib/astronoby/reference_frames/astrometric.rb +21 -0
  73. data/lib/astronoby/reference_frames/geometric.rb +20 -0
  74. data/lib/astronoby/reference_frames/mean_of_date.rb +38 -0
  75. data/lib/astronoby/reference_frames/topocentric.rb +72 -0
  76. data/lib/astronoby/time/greenwich_sidereal_time.rb +2 -2
  77. data/lib/astronoby/true_obliquity.rb +3 -3
  78. data/lib/astronoby/util/maths.rb +70 -73
  79. data/lib/astronoby/util/time.rb +455 -32
  80. data/lib/astronoby/vector.rb +36 -0
  81. data/lib/astronoby/velocity.rb +116 -0
  82. data/lib/astronoby/version.rb +1 -1
  83. data/lib/astronoby.rb +33 -5
  84. metadata +117 -24
  85. data/.tool-versions +0 -1
  86. data/Gemfile +0 -5
  87. data/Gemfile.lock +0 -80
  88. data/benchmark/README.md +0 -131
  89. data/benchmark/benchmark.rb +0 -259
  90. data/benchmark/data/imcce.csv.zip +0 -0
  91. data/benchmark/data/sun_calc.csv.zip +0 -0
  92. data/lib/astronoby/astronomical_models/ephemeride_lunaire_parisienne.rb +0 -143
  93. data/lib/astronoby/epoch.rb +0 -22
  94. data/lib/astronoby/events/observation_events.rb +0 -285
  95. data/lib/astronoby/events/rise_transit_set_iteration.rb +0 -218
  96. data/lib/astronoby/util/astrodynamics.rb +0 -60
@@ -1,259 +0,0 @@
1
- require "astronoby"
2
- require "csv"
3
- require "zip"
4
-
5
- class Source
6
- NAMES = [
7
- ASTRONOBY = "astronoby",
8
- IMCCE = "imcce",
9
- SUN_CALC = "sun_calc"
10
- ].freeze
11
-
12
- attr_accessor :name,
13
- :sun_rising_time,
14
- :sun_transit_time,
15
- :sun_setting_time,
16
- :moon_rising_time,
17
- :moon_transit_time,
18
- :moon_setting_time,
19
- :moon_illuminated_fraction
20
- end
21
-
22
- class Comparison
23
- SUN_CALC = "sun_calc"
24
- ASTRONOBY = "astronoby"
25
- NON_APPLICABLE = "n/a"
26
-
27
- TOO_FAR_THRESHOLD = 60 * 5 # 5 minutes
28
-
29
- attr_accessor :sources, :truth
30
-
31
- def initialize
32
- @sources = []
33
- end
34
-
35
- %i[
36
- sun_rising_time
37
- sun_transit_time
38
- sun_setting_time
39
- moon_rising_time
40
- moon_transit_time
41
- moon_setting_time
42
- ].each do |attribute|
43
- define_method(:"closest_#{attribute}") do
44
- compare(attribute)
45
- end
46
-
47
- define_method(:"#{attribute}_too_far?") do
48
- too_far?(attribute)
49
- end
50
- end
51
-
52
- def closest_moon_illuminated_fraction
53
- compare(:moon_illuminated_fraction)
54
- end
55
-
56
- private
57
-
58
- def compare(attribute)
59
- unless truth.public_send(attribute) && sources.all? { |source| source.public_send(attribute) }
60
- return NON_APPLICABLE
61
- end
62
-
63
- closest_source = sources.min_by do |source|
64
- (truth.public_send(attribute) - source.public_send(attribute)).abs
65
- end
66
-
67
- closest_source.name
68
- end
69
-
70
- def too_far?(attribute)
71
- truth_attribute = truth.public_send(attribute)
72
- astronoby_attribute = sources
73
- .find { _1.name == Source::ASTRONOBY }
74
- .public_send(attribute)
75
-
76
- return false unless truth_attribute && astronoby_attribute
77
-
78
- (truth_attribute - astronoby_attribute).abs > TOO_FAR_THRESHOLD
79
- end
80
- end
81
-
82
- class Result
83
- def initialize
84
- @sun_rising_time = []
85
- @sun_transit_time = []
86
- @sun_setting_time = []
87
- @moon_rising_time = []
88
- @moon_transit_time = []
89
- @moon_setting_time = []
90
- @illuminated_fraction = []
91
- @sun_rising_time_too_far = []
92
- @sun_transit_time_too_far = []
93
- @sun_setting_time_too_far = []
94
- @moon_rising_time_too_far = []
95
- @moon_transit_time_too_far = []
96
- @moon_setting_time_too_far = []
97
- end
98
-
99
- def add_comparison(comparison)
100
- @sun_rising_time << comparison.closest_sun_rising_time
101
- @sun_transit_time << comparison.closest_sun_transit_time
102
- @sun_setting_time << comparison.closest_sun_setting_time
103
- @moon_rising_time << comparison.closest_moon_rising_time
104
- @moon_transit_time << comparison.closest_moon_transit_time
105
- @moon_setting_time << comparison.closest_moon_setting_time
106
- @illuminated_fraction << comparison.closest_moon_illuminated_fraction
107
- @sun_rising_time_too_far << comparison.sun_rising_time_too_far?
108
- @sun_transit_time_too_far << comparison.sun_transit_time_too_far?
109
- @sun_setting_time_too_far << comparison.sun_setting_time_too_far?
110
- @moon_rising_time_too_far << comparison.moon_rising_time_too_far?
111
- @moon_transit_time_too_far << comparison.moon_transit_time_too_far?
112
- @moon_setting_time_too_far << comparison.moon_setting_time_too_far?
113
- end
114
-
115
- def display
116
- puts "Sun rising time:"
117
- tally(@sun_rising_time)
118
- puts "Sun transit time:"
119
- tally(@sun_transit_time)
120
- puts "Sun setting time:"
121
- tally(@sun_setting_time)
122
- puts "Moon rising time:"
123
- tally(@moon_rising_time)
124
- puts "Moon transit time:"
125
- tally(@moon_transit_time)
126
- puts "Moon setting time:"
127
- tally(@moon_setting_time)
128
- puts "Moon illuminated fraction:"
129
- tally(@illuminated_fraction)
130
- puts "Sun rising time too far:"
131
- tally(@sun_rising_time_too_far)
132
- puts "Sun transit time too far:"
133
- tally(@sun_transit_time_too_far)
134
- puts "Sun setting time too far:"
135
- tally(@sun_setting_time_too_far)
136
- puts "Moon rising time too far:"
137
- tally(@moon_rising_time_too_far)
138
- puts "Moon transit time too far:"
139
- tally(@moon_transit_time_too_far)
140
- puts "Moon setting time too far:"
141
- tally(@moon_setting_time_too_far)
142
- end
143
-
144
- private
145
-
146
- def tally(data)
147
- t = data.tally
148
- t.sort_by { |_key, value| -value }.each do |key, value|
149
- puts "#{key}: #{value} (#{(value.to_f / t.values.sum * 100).round(2)}%)"
150
- end
151
- puts "\n"
152
- end
153
- end
154
-
155
- data = {}
156
- result = Result.new
157
-
158
- sun_calc_zip_file = File.join(File.dirname(__FILE__), "data/sun_calc.csv.zip")
159
- imcce_zip_file = File.join(File.dirname(__FILE__), "data/imcce.csv.zip")
160
-
161
- puts "Unarchiving sun_calc.csv.zip..."
162
-
163
- Zip::File.open(sun_calc_zip_file) do |zip_file|
164
- puts "Done unarchiving sun_calc.csv.zip."
165
-
166
- csv_file = zip_file.find { |entry| entry.name.end_with?(".csv") }
167
- break unless csv_file
168
-
169
- puts "Parsing sun_calc.csv..."
170
-
171
- csv_content = csv_file.get_input_stream.read
172
- CSV.parse(csv_content, headers: true) do |row|
173
- data[row["date"]] ||= {}
174
- data[row["date"]][row["latitude"]] ||= {}
175
- data[row["date"]][row["latitude"]][row["longitude"]] = Comparison.new.tap do |comparison|
176
- source = Source.new.tap do |source|
177
- source.name = Source::SUN_CALC
178
- source.sun_rising_time = Time.new(row["sun_rising_time"]) if row["sun_rising_time"]
179
- source.sun_transit_time = Time.new(row["sun_transit_time"]) if row["sun_transit_time"]
180
- source.sun_setting_time = Time.new(row["sun_setting_time"]) if row["sun_setting_time"]
181
- source.moon_rising_time = Time.new(row["moon_rising_time"]) if row["moon_rising_time"]
182
- source.moon_transit_time = Time.new(row["moon_transit_time"]) if row["moon_transit_time"]
183
- source.moon_setting_time = Time.new(row["moon_setting_time"]) if row["moon_setting_time"]
184
- source.moon_illuminated_fraction = row["illuminated_fraction"].to_f
185
- end
186
- comparison.sources << source
187
- end
188
- end
189
-
190
- puts "Done parsing sun_calc.csv."
191
- end
192
-
193
- puts "Unarchiving imcce.csv.zip..."
194
-
195
- Zip::File.open(imcce_zip_file) do |zip_file|
196
- puts "Done unarchiving imcce.csv.zip."
197
-
198
- csv_file = zip_file.find { |entry| entry.name.end_with?(".csv") }
199
- break unless csv_file
200
-
201
- puts "Parsing imcce.csv..."
202
-
203
- csv_content = csv_file.get_input_stream.read
204
- CSV.parse(csv_content, headers: true) do |row|
205
- comparison = data[row["date"]][row["latitude"]][row["longitude"]]
206
- comparison.truth = Source.new.tap do |source|
207
- source.name = Source::IMCCE
208
- source.sun_rising_time = Time.new(row["sun_rising_time"] + " UTC") if row["sun_rising_time"]
209
- source.sun_transit_time = Time.new(row["sun_transit_time"] + " UTC") if row["sun_transit_time"]
210
- source.sun_setting_time = Time.new(row["sun_setting_time"] + " UTC") if row["sun_setting_time"]
211
- source.moon_rising_time = Time.new(row["moon_rising_time"] + " UTC") if row["moon_rising_time"]
212
- source.moon_transit_time = Time.new(row["moon_transit_time"] + " UTC") if row["moon_transit_time"]
213
- source.moon_setting_time = Time.new(row["moon_setting_time"] + " UTC") if row["moon_setting_time"]
214
- source.moon_illuminated_fraction = row["illuminated_fraction"].to_f
215
- end
216
- end
217
-
218
- puts "Done parsing imcce.csv."
219
- end
220
-
221
- puts "Comparing data..."
222
-
223
- data.each do |date, latitudes|
224
- latitudes.each do |latitude, longitudes|
225
- longitudes.each do |longitude, comparison|
226
- noon = Time.new("#{date}T12:00:00Z")
227
- observer = Astronoby::Observer.new(
228
- latitude: Astronoby::Angle.from_degrees(latitude.to_i),
229
- longitude: Astronoby::Angle.from_degrees(longitude.to_i)
230
- )
231
- sun = Astronoby::Sun.new(time: noon)
232
- sun_observation_events = sun.observation_events(observer: observer)
233
- moon = Astronoby::Moon.new(time: noon)
234
- moon_observation_events = moon.observation_events(observer: observer)
235
-
236
- source = Source.new.tap do |source|
237
- source.name = Source::ASTRONOBY
238
- source.sun_rising_time = sun_observation_events.rising_time
239
- source.sun_transit_time = sun_observation_events.transit_time
240
- source.sun_setting_time = sun_observation_events.setting_time
241
- source.moon_rising_time = moon_observation_events.rising_time
242
- source.moon_transit_time = moon_observation_events.transit_time
243
- source.moon_setting_time = moon_observation_events.setting_time
244
- source.moon_illuminated_fraction = moon.illuminated_fraction
245
- end
246
-
247
- comparison.sources << source
248
- result.add_comparison(comparison)
249
- end
250
- end
251
-
252
- puts "#{date}: Done."
253
- end
254
-
255
- puts "Done comparing data."
256
- puts
257
- puts
258
-
259
- puts result.display
Binary file
Binary file
@@ -1,143 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Astronoby
4
- class EphemerideLunaireParisienne
5
- # Lunar theory: Éphéméride Lunaire Parisienne
6
- # By Jean Chapront, Michelle Chapront-Touzé
7
- # https://en.wikipedia.org/wiki/Ephemeride_Lunaire_Parisienne
8
-
9
- DEGREES_UNIT = 10**-6
10
-
11
- # @return [Array] Periodic terms for the Moon's longitude and distance
12
- def self.periodic_terms_for_moon_longitude_and_distance
13
- [
14
- [0, 0, 1, 0, 6288774, -20905355],
15
- [2, 0, -1, 0, 1274027, -3699111],
16
- [2, 0, 0, 0, 658314, -2955968],
17
- [0, 0, 2, 0, 213618, -569925],
18
- [0, 1, 0, 0, -185116, 48888],
19
- [0, 0, 0, 2, -114332, -3149],
20
- [2, 0, -2, 0, 58793, 246158],
21
- [2, -1, -1, 0, 57066, -152138],
22
- [2, 0, 1, 0, 53322, -170733],
23
- [2, -1, 0, 0, 45758, -204586],
24
- [0, 1, -1, 0, -40923, -129620],
25
- [1, 0, 0, 0, -34720, 108743],
26
- [0, 1, 1, 0, -30383, 104755],
27
- [2, 0, 0, -2, 15327, 10321],
28
- [0, 0, 1, 2, -12528, 0],
29
- [0, 0, 1, -2, 10980, 79661],
30
- [4, 0, -1, 0, 10675, -34782],
31
- [0, 0, 3, 0, 10034, -23210],
32
- [4, 0, -2, 0, 8548, -21636],
33
- [2, 1, -1, 0, -7888, 24208],
34
- [2, 1, 0, 0, -6766, 30824],
35
- [1, 0, -1, 0, -5163, -8379],
36
- [1, 1, 0, 0, 4987, -16675],
37
- [2, -1, 1, 0, 4036, -12831],
38
- [2, 0, 2, 0, 3994, -10445],
39
- [4, 0, 0, 0, 3861, -11650],
40
- [2, 0, -3, 0, 3665, 14403],
41
- [0, 1, -2, 0, -2689, -7003],
42
- [2, 0, -1, 2, -2602, 0],
43
- [2, -1, -2, 0, 2390, 10056],
44
- [1, 0, 1, 0, -2348, 6322],
45
- [2, -2, 0, 0, 2236, -9884],
46
- [0, 1, 2, 0, -2120, 5751],
47
- [0, 2, 0, 0, -2069, 0],
48
- [2, -2, -1, 0, 2048, -4950],
49
- [2, 0, 1, -2, -1773, 4130],
50
- [2, 0, 0, 2, -1595, 0],
51
- [4, -1, -1, 0, 1215, -3958],
52
- [0, 0, 2, 2, -1110, 0],
53
- [3, 0, -1, 0, -892, 3258],
54
- [2, 1, 1, 0, -810, 2616],
55
- [4, -1, -2, 0, 759, -1897],
56
- [0, 2, -1, 0, -713, -2117],
57
- [2, 2, -1, 0, -700, 2354],
58
- [2, 1, -2, 0, 691, 0],
59
- [2, -1, 0, -2, 596, 0],
60
- [4, 0, 1, 0, 549, -1423],
61
- [0, 0, 4, 0, 537, -1117],
62
- [4, -1, 0, 0, 520, -1571],
63
- [1, 0, -2, 0, -487, -1739],
64
- [2, 1, 0, -2, -399, 0],
65
- [0, 0, 2, -2, -381, -4421],
66
- [1, 1, 1, 0, 351, 0],
67
- [3, 0, -2, 0, -340, 0],
68
- [4, 0, -3, 0, 330, 0],
69
- [2, -1, 2, 0, 327, 0],
70
- [0, 2, 1, 0, -323, 1165],
71
- [1, 1, -1, 0, 299, 0],
72
- [2, 0, 3, 0, 294, 0],
73
- [2, 0, -1, -2, 0, 8752]
74
- ]
75
- end
76
-
77
- # @return [Array] Periodic terms for the Moon's latitude
78
- def self.periodic_terms_for_moon_latitude
79
- [
80
- [0, 0, 0, 1, 5128122],
81
- [0, 0, 1, 1, 280602],
82
- [0, 0, 1, -1, 277693],
83
- [2, 0, 0, -1, 173237],
84
- [2, 0, -1, 1, 55413],
85
- [2, 0, -1, -1, 46271],
86
- [2, 0, 0, 1, 32573],
87
- [0, 0, 2, 1, 17198],
88
- [2, 0, 1, -1, 9266],
89
- [0, 0, 2, -1, 8822],
90
- [2, -1, 0, -1, 8216],
91
- [2, 0, -2, -1, 4324],
92
- [2, 0, 1, 1, 4200],
93
- [2, 1, 0, -1, -3359],
94
- [2, -1, -1, 1, 2463],
95
- [2, -1, 0, 1, 2211],
96
- [2, -1, -1, -1, 2065],
97
- [0, 1, -1, -1, -1870],
98
- [4, 0, -1, -1, 1828],
99
- [0, 1, 0, 1, -1794],
100
- [0, 0, 0, 3, -1749],
101
- [0, 1, -1, 1, -1565],
102
- [1, 0, 0, 1, -1491],
103
- [0, 1, 1, 1, -1475],
104
- [0, 1, 1, -1, -1410],
105
- [0, 1, 0, -1, -1344],
106
- [1, 0, 0, -1, -1335],
107
- [0, 0, 3, 1, 1107],
108
- [4, 0, 0, -1, 1021],
109
- [4, 0, -1, 1, 833],
110
- [0, 0, 1, -3, 777],
111
- [4, 0, -2, 1, 671],
112
- [2, 0, 0, -3, 607],
113
- [2, 0, 2, -1, 596],
114
- [2, -1, 1, -1, 491],
115
- [2, 0, -2, 1, -451],
116
- [0, 0, 3, -1, 439],
117
- [2, 0, 2, 1, 422],
118
- [2, 0, -3, -1, 421],
119
- [2, 1, -1, 1, -366],
120
- [2, 1, 0, 1, -351],
121
- [4, 0, 0, 1, 331],
122
- [2, -1, 1, 1, 315],
123
- [2, -2, 0, -1, 302],
124
- [0, 0, 1, 3, -283],
125
- [2, 1, 1, -1, -229],
126
- [1, 1, 0, -1, 223],
127
- [1, 1, 0, 1, 223],
128
- [0, 1, -2, -1, -220],
129
- [2, 1, -1, -1, -220],
130
- [1, 0, 1, 1, -185],
131
- [2, -1, -2, -1, 181],
132
- [0, 1, 2, 1, -177],
133
- [4, 0, -2, -1, 176],
134
- [4, -1, -1, -1, 166],
135
- [1, 0, 1, -1, -164],
136
- [4, 0, 1, -1, 132],
137
- [1, 0, -1, -1, -119],
138
- [4, -1, 0, -1, 115],
139
- [2, -2, 0, 1, 107]
140
- ]
141
- end
142
- end
143
- end
@@ -1,22 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Astronoby
4
- class Epoch
5
- B1900 = 2415020.3135
6
- J1900 = 2415020.0
7
- B1950 = 2433282.4235
8
- J1950 = 2433282.5
9
- J2000 = 2451545.0
10
-
11
- DEFAULT_EPOCH = J2000
12
- JULIAN_DAY_NUMBER_OFFSET = 0.5
13
-
14
- def self.from_time(time)
15
- time.to_datetime.ajd
16
- end
17
-
18
- def self.to_utc(epoch)
19
- DateTime.jd(epoch + JULIAN_DAY_NUMBER_OFFSET).to_time.utc
20
- end
21
- end
22
- end