equationoftime 3.0.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 (84) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +19 -0
  3. data/.rspec +1 -0
  4. data/Gemfile +4 -0
  5. data/LICENSE.md +22 -0
  6. data/LICENSE.txt +22 -0
  7. data/README.md +80 -0
  8. data/README2.txt +70 -0
  9. data/Rakefile +80 -0
  10. data/doc/GeoLatLng.html +770 -0
  11. data/doc/_index.html +123 -0
  12. data/doc/class_list.html +54 -0
  13. data/doc/css/common.css +1 -0
  14. data/doc/css/full_list.css +57 -0
  15. data/doc/css/style.css +339 -0
  16. data/doc/file.README.html +179 -0
  17. data/doc/file_list.html +56 -0
  18. data/doc/frames.html +26 -0
  19. data/doc/index.html +179 -0
  20. data/doc/js/app.js +219 -0
  21. data/doc/js/full_list.js +178 -0
  22. data/doc/js/jquery.js +4 -0
  23. data/doc/method_list.html +611 -0
  24. data/doc/top-level-namespace.html +112 -0
  25. data/equationoftime.gemspec +35 -0
  26. data/examples/Equation_of_Time.jpg +0 -0
  27. data/examples/analemma_data_generator.rb +53 -0
  28. data/examples/check_date_type.rb +57 -0
  29. data/examples/compare_geoc_long_ra.rb +31 -0
  30. data/examples/data_table.rb +26 -0
  31. data/examples/earth_rotation.rb +13 -0
  32. data/examples/eot_methods_list.rb +16 -0
  33. data/examples/eot_plot.r +57 -0
  34. data/examples/eot_suntimes.rb +140 -0
  35. data/examples/equation_of_time.py +186 -0
  36. data/examples/figure_1.jpg +0 -0
  37. data/examples/file_converter.rb +31 -0
  38. data/examples/from_readme.rb +10 -0
  39. data/examples/geo_locator.rb +12 -0
  40. data/examples/getjd.rb +45 -0
  41. data/examples/input_suntimes.rb +21 -0
  42. data/examples/julian_day_formula.rb +29 -0
  43. data/examples/julian_day_formula.txt +12 -0
  44. data/examples/my_time_conversion.rb +21 -0
  45. data/examples/nutation_series.txt +678 -0
  46. data/examples/nutation_series.yaml +14239 -0
  47. data/examples/nutation_table5_3a.txt +682 -0
  48. data/examples/nutation_table5_3a.yaml +9532 -0
  49. data/examples/ptime.rb +162 -0
  50. data/examples/read_nutation_data.rb +399 -0
  51. data/examples/suntimes.rb +28 -0
  52. data/examples/suntimes_test.rb +47 -0
  53. data/examples/test_poly_eval.rb +38 -0
  54. data/examples/time_scales.rb +29 -0
  55. data/examples/usage_example.rb +13 -0
  56. data/examples/use_angles.rb +155 -0
  57. data/lib/eot/angles.rb +337 -0
  58. data/lib/eot/constants.rb +168 -0
  59. data/lib/eot/displays.rb +213 -0
  60. data/lib/eot/geo_lat_lng_smt.rb +80 -0
  61. data/lib/eot/init.rb +93 -0
  62. data/lib/eot/nutation.rb +70 -0
  63. data/lib/eot/nutation_table5_3a.yaml +9532 -0
  64. data/lib/eot/times.rb +130 -0
  65. data/lib/eot/utilities.rb +129 -0
  66. data/lib/eot/version.rb +6 -0
  67. data/lib/eot.rb +11 -0
  68. data/tests/minitest/aliased_angles_spec.rb +287 -0
  69. data/tests/minitest/aliased_displays_spec.rb +106 -0
  70. data/tests/minitest/aliased_times_spec.rb +36 -0
  71. data/tests/minitest/aliased_utilities_spec.rb +49 -0
  72. data/tests/minitest/angles_spec.rb +313 -0
  73. data/tests/minitest/constants_spec.rb +27 -0
  74. data/tests/minitest/delta_epsilon_spec.rb +35 -0
  75. data/tests/minitest/displays_spec.rb +111 -0
  76. data/tests/minitest/geo_spec.rb +36 -0
  77. data/tests/minitest/init_spec.rb +32 -0
  78. data/tests/minitest/nutation_spec.rb +33 -0
  79. data/tests/minitest/times_spec.rb +137 -0
  80. data/tests/minitest/utilities_spec.rb +121 -0
  81. data/tests/spec_config.rb +3 -0
  82. data/wiki.md +46 -0
  83. data/wiki2.md +4 -0
  84. metadata +240 -0
@@ -0,0 +1,29 @@
1
+ # eot_methods_list.rb
2
+
3
+ lib = File.expand_path('../../lib', __FILE__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+
6
+ require 'eot'
7
+ $DEBUG and set_trace_func proc { |event, file, line, id, binding, classname|
8
+ printf "%8s %s:%-2d %10s %8s\n", event, file, line, id, classname
9
+ }
10
+ eot = Eot.new
11
+ # puts eot.public_methods(false).sort
12
+ # puts eot.nil?
13
+ loop do
14
+ p date = DateTime.now.to_time.utc.to_datetime
15
+ #~ dt = Astro.delta_T(date) / 86400.0
16
+ ajd = date.ajd
17
+ #~ ajd1 = ajd + dt
18
+ p date2 = DateTime.jd(ajd + 0.5)
19
+ sleep 0.7
20
+ puts
21
+ end
22
+
23
+ # puts Astro.solar_longitude(date)
24
+ # tjc = eot.time_julian_century( ajd)
25
+ # puts eot.tl_Sun(tjc)
26
+
27
+ # tjc = eot.time_julian_century( ajd + dt )
28
+ # puts eot.tl_Sun(tjc)
29
+
@@ -0,0 +1,13 @@
1
+ # usage_example.rb
2
+
3
+ lib = File.expand_path('../../lib', __FILE__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+
6
+ require 'eot'
7
+
8
+ eot = Eot.new()
9
+ p eot.date
10
+ p eot.longitude
11
+ p eot.latitude
12
+ p eot.sunrise_dt
13
+ p eot.sunset_dt
@@ -0,0 +1,155 @@
1
+ # use_angles.rb
2
+
3
+ lib = File.expand_path('../../lib', __FILE__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+
6
+ require 'eot'
7
+
8
+
9
+ file = <<EOS
10
+
11
+ This will explain how the equation of time is derived by showing
12
+ each method that comprises the formula.
13
+
14
+ eot = Eot.new
15
+ #{eot = Eot.new}
16
+
17
+ Set the ajd instance to the deisired date ex : eot.ajd = Date.parse("yyyy, mm, dd").jd
18
+
19
+ eot.ajd = Date.today.jd
20
+ #{eot.ajd = Date.today.jd}
21
+ The ajd has been set to #{eot.ajd}
22
+
23
+
24
+ The Astronomical Julian Day Number plus the fractional day time now will be used to calculate current angles.
25
+
26
+ The current time expressed as an AJDN :
27
+ #{eot.ajd}
28
+
29
+
30
+ mu is the solar Mean anomaly. It is an angle with respect to perihelion of Earth orbit around Sun.
31
+ It is calculated as if the Earths orbit were circular.
32
+
33
+ mu = eot.ma
34
+ #{mu = eot.ma} deg.
35
+
36
+
37
+ nu is the True anomaly. It is the actual angle with respect to perihelion in an eliptical orbit.
38
+ It was calculated by using the equation of center formula which you may access also.
39
+
40
+ eqc = eot.center()
41
+ #{eqc = eot.center()} deg.
42
+
43
+ nu = eot.ta_Sun()
44
+ #{nu = eot.ta_Sun()} deg.
45
+
46
+ We find the delta or difference of these first two angles.
47
+ Notice it is counter sign of equation of center. It just may have taken longer to calculate.
48
+
49
+ delta_eccentric = mu - nu
50
+ #{delta_eccentric = mu - nu} deg.
51
+
52
+ The next delta is calculated as follows.
53
+
54
+ lambda = mean longitude + equation of center
55
+
56
+ mean_longitude = eot.gml_Sun()
57
+ #{mean_longitude = eot.gml_Sun()} deg.
58
+
59
+ eqc = eot.center(eot.time_julian_century())
60
+ #{eqc = eot.center(eot.time_julian_century())} deg
61
+
62
+ true longitude = mean longitude + equation of center
63
+ #{mean_longitude + eqc}
64
+
65
+ Lambda is the \"ecliptic coordinate system\" angle of the sun.
66
+
67
+ lambda_1 = eot.tl_Sun(eot.time_julian_century())
68
+ #{lambda_1 = eot.tl_Sun(eot.time_julian_century())} deg
69
+
70
+ This may also be used and is a very small difference to lambda 1
71
+
72
+ lambda_2 = eot.al_Sun(eot.time_julian_century())
73
+ #{lambda_2 = eot.al_Sun(eot.time_julian_century())} deg
74
+
75
+ Alpha is the Right Ascension of the sun in the celestial coordinate system.
76
+
77
+ alpha = eot.ra_Sun(eot.time_julian_century())
78
+ #{alpha = eot.ra_Sun(eot.time_julian_century())} deg
79
+
80
+ Delta ecliptic is the difference in these two angles.
81
+
82
+ delta_ecliptic = lambda_1 - alpha
83
+ #{delta_ecliptic = lambda_1 - alpha} deg.
84
+
85
+ The method inside the gem is called angle_delta_oblique.
86
+
87
+ The sum of these two delta angles is
88
+
89
+ delta_total = delta_eccentric + delta_ecliptic
90
+ #{delta_total = delta_eccentric + delta_ecliptic} deg.
91
+
92
+ That was for the time UTC now which was easy.
93
+
94
+ Now using your longitude to compute your mean solar transit from longitude / 15.0
95
+ my longitude is #{my_longitude = -88.74467}
96
+ #{my_longitude} deg. note: -deg. because I'm west of UTC or 0.0 deg.
97
+
98
+ So my mean solar transit UTC is
99
+
100
+ mean_noon = 12 - my_longitude / 15.0
101
+ #{mean_noon = 12 - my_longitude / 15.0} hr.
102
+
103
+ using the equation of time library method get_time(Date.today.to_datetime + mean_noon)
104
+ I'm showing what time mean noon for my_longitude normally is without
105
+ the equation of time considered and this is true only four days a year.
106
+
107
+ Be sure to set your longitude and latitude as attributes.
108
+ eot.longitude = my_longitude
109
+ eot.latitude = my_latitude
110
+ #{eot.longitude = my_longitude}
111
+
112
+ eot.mean_local_noon_dt()
113
+ #{eot.mean_local_noon_dt()}
114
+
115
+ Now we need to calculate the delta total for our mean solar transit.
116
+ We will use the mean noon time to get equation of time.
117
+ We will be using mean_noon as a time object.
118
+ First create a time object for the date at 12:00 and subtract
119
+ (my_longitude / 15.0) * 3600.0 to get the time object.
120
+ This is what get_time did without the longitude because it was provided before.
121
+
122
+ mean_noon = Time.utc(DateTime.now.to_time.utc.to_datetime.year, DateTime.now.to_time.utc.to_datetime.month, DateTime.now.to_time.utc.to_datetime.day, 12, 0, 0) - (my_longitude / 15.0) * 3600.0}
123
+ #{mean_noon = Time.utc(DateTime.now.to_time.utc.to_datetime.year, DateTime.now.to_time.utc.to_datetime.month, DateTime.now.to_time.utc.to_datetime.day, 12, 0, 0) - (my_longitude / 15.0) * 3600.0}
124
+
125
+ delta_total = eot.eot()
126
+ #{delta_total = eot.eot()} min
127
+
128
+ Let us convert that to an angle.
129
+
130
+ delta_deg = delta_total / 4.0 * 360.0 / 360.98564736629 Note: not quite 4 minutes per degree.
131
+ #{delta_deg = delta_total / 4.0 * 360.0 / 360.98564736629} deg.
132
+
133
+ Now we can add that from our longitude or mean noon angle
134
+
135
+ noon_angle = my_longitude + delta_deg
136
+ #{noon_angle = my_longitude + delta_deg}
137
+
138
+ Your longitude and the GHA of the Sun will match atTrue Solar Transit time.
139
+
140
+ So lets convert that angle to a time now.
141
+
142
+ 12 - noon_angle / 15.0
143
+ #{12 - noon_angle / 15.0}
144
+
145
+ my_transit = eot.ajd + (12 - noon_angle / 15.0) / 24.0
146
+ #{my_transit = eot.ajd + (12 - noon_angle / 15.0) / 24.0}
147
+
148
+ DateTime.jd(my_transit)
149
+ #{DateTime.jd(my_transit)}
150
+
151
+ check it here http://douglasallen.github.io/planets/ just put in the correct time and date then hit calculate.
152
+ Does GHA Sun = your longitude?
153
+ EOS
154
+
155
+ puts file
data/lib/eot/angles.rb ADDED
@@ -0,0 +1,337 @@
1
+ # angles.rb
2
+
3
+ class Eot
4
+
5
+ # From angles.rb:<br>
6
+ # Apparent solar longitude = true longitude - aberation
7
+ def al_Sun( ta = A2000 )
8
+ ta = check_jct_zero( ta )
9
+ tl_Sun( ta ) -
10
+ 0.00569 -
11
+ 0.00478 * sin( deg_to_rad( omega( ta ) ) )
12
+ end
13
+ alias_method :apparent_longitude, :al_Sun
14
+
15
+ # From angles.rb:<br>
16
+ # one time component to total equation of time
17
+ def angle_delta_oblique( ta = A2000 )
18
+ ta = check_jct_zero( ta )
19
+ tl_Sun( ta ) -
20
+ ra_Sun( ta )
21
+ end
22
+
23
+ # From angles.rb:<br>
24
+ # one time component to total equation of time
25
+ def angle_delta_orbit( ta = A2000 )
26
+ ta = check_jct_zero( ta )
27
+ @ma - ta_Sun( ta )
28
+ end
29
+
30
+ # From angles.rb:<br>
31
+ # component of equation of equinox
32
+ def angle_delta_psi( ta = A2000 )
33
+ ta = check_jct_zero( ta )
34
+ delta_equinox( ta )[ 1 ]
35
+ end
36
+
37
+ # From angles.rb:<br>
38
+ # total equation of time
39
+ def angle_equation_of_time( ta = A2000 )
40
+ ta = check_jct_zero( ta )
41
+ @ma = ma_Sun()
42
+ angle_delta_oblique( ta ) +
43
+ angle_delta_orbit( ta )
44
+ end
45
+
46
+ # From angles.rb:<br>
47
+ # equation of centre
48
+ # added to mean anomaly to get true anomaly.
49
+ def center( ta = A2000)
50
+ ta = check_jct_zero( ta )
51
+ sine_1M = sin( 1.0 * deg_to_rad( @ma ) )
52
+ sine_2M = sin( 2.0 * deg_to_rad( @ma ) )
53
+ sine_3M = sin( 3.0 * deg_to_rad( @ma ) )
54
+ sine_4M = sin( 4.0 * deg_to_rad( @ma ) )
55
+ sine_5M = sin( 5.0 * deg_to_rad( @ma ) )
56
+ e = eccentricity_Earth( ta )
57
+ rad_to_deg( sine_1M * ( 2.0 * e - e**3/4.0 + 5/96.0 * e**5 ) +
58
+ sine_2M * ( 5/4.0 * e**2 - 11/24.0 * e**4 ) +
59
+ sine_3M * ( 13/12.0 * e**3 - 43/64.0 * e**5 ) +
60
+ sine_4M * 103/96.0 * e**4 +
61
+ sine_5M * 1097/960.0 * e**5 )
62
+ # sine_1M *( 1.914602 - ta[ 0 ] * ( 0.004817 + ta[ 0 ] * 0.000014 )) + +
63
+ # sine_2M *( 0.019993 - ta[ 0 ] * 0.000101 ) + +
64
+ # sine_3M * 0.000289
65
+ end
66
+ alias_method :equation_of_center, :center
67
+
68
+ # From angles.rb:<br>
69
+ # cosine apparent longitude
70
+ # could be useful when dividing
71
+ def cosine_al_Sun( ta = A2000 )
72
+ ta = check_jct_zero( ta )
73
+ cos( deg_to_rad( al_Sun( ta ) ) )
74
+ end
75
+ alias_method :cosine_apparent_longitude, :cosine_al_Sun
76
+
77
+ # From angles.rb:<br>
78
+ # cosine true longitude
79
+ # used in solar right ascension
80
+ def cosine_tl_Sun( ta = A2000 )
81
+ ta = check_jct_zero( ta )
82
+ cos( deg_to_rad( tl_Sun( ta ) ) )
83
+ end
84
+ alias_method :cosine_true_longitude, :cosine_tl_Sun
85
+
86
+ # From angles.rb:<br>
87
+ # cosine true obliquity
88
+ # used in solar right ascension
89
+ def cosine_to_Earth( ta = A2000 )
90
+ ta = check_jct_zero( ta )
91
+ cos( deg_to_rad( to_Earth( ta ) ) )
92
+ end
93
+ alias_method :cosine_true_obliquity, :cosine_to_Earth
94
+
95
+ # From angles.rb:<br>
96
+ # solar declination
97
+ def dec_Sun( ta = A2000 )
98
+ ta = check_jct_zero( ta )
99
+ sine_declination = sin( deg_to_rad( to_Earth( ta ) ) ) *
100
+ sine_al_Sun( ta )
101
+ rad_to_deg( asin( sine_declination ) )
102
+ end
103
+ alias_method :declination, :dec_Sun
104
+
105
+ # From angles.rb:<br>
106
+ # delta epsilon
107
+ # component of equation of equinox
108
+ def delta_epsilon( ta = A2000 )
109
+ ta = check_jct_zero( ta )
110
+ delta_equinox( ta )[ 0 ]
111
+ end
112
+
113
+ # From angles.rb:<br>
114
+ # one time component to total equation of time
115
+ def delta_oblique( ta = A2000 )
116
+ ta = check_jct_zero( ta )
117
+ tl_Sun( ta ) -
118
+ ra_Sun( ta )
119
+ end
120
+ alias_method :delta_t_ecliptic, :delta_oblique
121
+
122
+ # From angles.rb:<br>
123
+ # one time component to total equation of time
124
+ def delta_orbit( ta = A2000 )
125
+ ta = check_jct_zero( ta )
126
+ @ma - ta_Sun( ta )
127
+ end
128
+ alias_method :delta_t_elliptic, :delta_orbit
129
+
130
+ # From angles.rb:<br>
131
+ # component of equation of equinox
132
+ def delta_psi( ta = A2000 )
133
+ ta = check_jct_zero( ta )
134
+ delta_equinox( ta )[ 1 ]
135
+ end
136
+
137
+ # From angles.rb:<br>
138
+ # eccentricity of elliptical Earth orbit around Sun
139
+ # Horner calculation method
140
+ def eccentricity_Earth( ta = A2000 )
141
+ ta = check_jct_zero( ta )
142
+ # 0.016708617 - ta[ 0 ] * ( 0.000042037 + ta[ 0 ] * 0.0000001235 )
143
+ [-0.0000001235, -0.000042037, 0.016708617].inject(0.0) {|p, a| p * ta[0] + a}
144
+ end
145
+ alias_method :eccentricity_earth_orbit, :eccentricity_Earth
146
+
147
+ # From angles.rb:<br>
148
+ # equation of equinox
149
+ def eq_of_equinox( ta = A2000 )
150
+ ta = check_jct_zero( ta )
151
+ cosine_to_Earth( ta ) *
152
+ delta_psi( ta )
153
+ end
154
+
155
+ # From angles.rb:<br>
156
+ # total equation of time
157
+ def eot()
158
+ ta = time_julian_century( @ajd )
159
+ @ma = ma_Sun()
160
+ delta_orbit( ta ) + delta_oblique( ta )
161
+ end
162
+
163
+ # From angles.rb:<br>
164
+ # angle factor for daily sidereal time (experimental)
165
+ def factor
166
+ jda = Date.parse("2000-01-01").jd
167
+ jdb = jda + 1
168
+ tjca = time_julian_century( jda )
169
+ tjcb = time_julian_century( jdb )
170
+ tlaa = tl_Aries( tjca )
171
+ tlab = tl_Aries( tjcb )
172
+ dif = tlab - tlaa
173
+ dr = dif + 360.0
174
+ 360 / dr
175
+ end
176
+
177
+ # From angles.rb:<br>
178
+ # angle geometric mean longitude
179
+ # needed to get true longitude for low accuracy.
180
+ def gml_Sun( ta = A2000 )
181
+ ta = check_jct_zero( ta )
182
+ total = [ 1.0/-19880000.0, 1.0/-152990.0, 1.0/499310.0,
183
+ 0.0003032028, 36000.76982779, 280.4664567 ]
184
+ mod_360( total.inject(0.0) {|p, a| p * ta[0] + a} )
185
+ end
186
+ alias_method :geometric_mean_longitude, :gml_Sun
187
+
188
+ # From angles.rb:<br>
189
+ # horizon angle for provided geo coordinates
190
+ # used for angles from transit to horizon
191
+ def ha_Sun( ta = A2000 )
192
+ ta = check_jct_zero( ta )
193
+ zenith = 90.8333
194
+ cosine_zenith = cos( deg_to_rad( zenith ) )
195
+ cosine_declination = cos( deg_to_rad( dec_Sun( ta ) ) )
196
+ sine_declination = sin( deg_to_rad( dec_Sun( ta ) ) )
197
+ cosine_latitude = cos( deg_to_rad( @latitude ) )
198
+ sine_latitude = sin( deg_to_rad( @latitude ) )
199
+ top = cosine_zenith - sine_declination * sine_latitude
200
+ bottom = cosine_declination * cosine_latitude
201
+ t_cosine = top / bottom
202
+ t_cosine > 1.0 || t_cosine < -1.0 ? cos = 1.0 : cos = t_cosine
203
+ rad_to_deg( acos( cos ) )
204
+ end
205
+ alias_method :horizon_angle, :ha_Sun
206
+
207
+ # From angles.rb:<br>
208
+ # angle of Suns' mean anomaly
209
+ # used in equation of time
210
+ # and to get true anomaly.
211
+ def ma_Sun()
212
+ ta = time_julian_century( @ajd )
213
+ ade = delta_equinox( ta )[ 2 ] / ASD
214
+ @ma = mod_360 ade
215
+ end
216
+ alias_method :mean_anomaly, :ma_Sun
217
+
218
+ # From angles.rb:<br>
219
+ # Mean equinox point where right ascension is measured from as zero hours.
220
+ # # see http://www.iausofa.org/publications/aas04.pdf
221
+ def ml_Aries( ta = A2000 )
222
+ ta = check_jct_zero( ta )
223
+ jd = ta[ 0 ] * DJC # convert first term back to jdn - J2000
224
+ # old terms
225
+ # angle = (36000.770053608 / DJC + 360) * jd # 36000.770053608 = 0.9856473662862 * DJC
226
+ # total = [ -1.0/3.8710000e7, 3.87930e-4, 0, 100.460618375 ].inject(0.0) {|p, a| p * ta[0] + a} + 180 + angle
227
+ # newer terms seem to be in arcseconds / 15.0
228
+ # 0.0000013, - 0.0000062, 0.0931118, 307.4771600, 8639877.3173760, 24110.5493771
229
+ angle = (35999.4888224 / DJC + 360) * jd
230
+ total = angle + 280.460622404583 +
231
+ ta[ 0 ] * 1.281154833333 +
232
+ ta[ 1 ] * 3.87965833333e-4 +
233
+ ta[ 2 ] * -2.58333333333e-8 +
234
+ ta[ 3 ] * 5.41666666666e-9
235
+ mod_360( total )
236
+ end
237
+ alias_method :mean_longitude_aries, :ml_Aries
238
+
239
+ # From angles.rb:<br>
240
+ # mean obliquity of Earth
241
+ def mo_Earth( ta = A2000 )
242
+ ta = check_jct_zero( ta )
243
+ [ -0.0000000434, -0.000000576, 0.00200340,
244
+ -0.0001831, -46.836769, 84381.406 ].inject(0.0) {|p, a| p * ta[0] + a} / ASD
245
+ end
246
+ alias_method :mean_obliquity_of_ecliptic, :mo_Earth
247
+ alias_method :mean_obliquity, :mo_Earth
248
+
249
+ # From angles.rb:<br>
250
+ # omega is a component of nutation and used
251
+ # in apparent longitude
252
+ # omega is the longitude of the mean ascending node of the lunar orbit
253
+ # on the ecliptic plane measured from the mean equinox of date.
254
+ def omega( ta = A2000 )
255
+ ta = check_jct_zero( ta )
256
+ delta_equinox( ta )[ 3 ] / ASD
257
+ end
258
+
259
+ # From angles.rb:<br>
260
+ # solar right ascension
261
+ def ra_Sun( ta = A2000 )
262
+ ta = check_jct_zero( ta )
263
+ y0 = sine_al_Sun( ta ) * cosine_to_Earth( ta )
264
+ 180.0 +
265
+ rad_to_deg( atan2( -y0, -cosine_al_Sun( ta ) ) )
266
+ end
267
+ alias_method :right_ascension, :ra_Sun
268
+
269
+ # From angles.rb:<br>
270
+ # sine apparent longitude
271
+ # used in solar declination
272
+ def sine_al_Sun( ta = A2000 )
273
+ ta = check_jct_zero( ta )
274
+ sin( deg_to_rad( al_Sun( ta ) ) )
275
+ end
276
+ alias_method :sine_apparent_longitude, :sine_al_Sun
277
+
278
+ # From angles.rb:<br>
279
+ # sine true longitude
280
+ # used in solar right ascension
281
+ def sine_tl_Sun( ta = A2000 )
282
+ ta = check_jct_zero( ta )
283
+ sin( deg_to_rad( tl_Sun( ta ) ) )
284
+ end
285
+ alias_method :sine_true_longitude, :sine_tl_Sun
286
+
287
+ # From angles.rb:<br>
288
+ # angle true anomaly
289
+ # used in equation of time
290
+ def ta_Sun( ta = A2000 )
291
+ ta = check_jct_zero( ta )
292
+ @ma + center( ta )
293
+ end
294
+ alias_method :true_anomaly, :ta_Sun
295
+
296
+ # From angles.rb:<br>
297
+ # true longitude of equinox 'first point of aries'
298
+ # considers nutation
299
+ def tl_Aries( ta = A2000 )
300
+ ta = check_jct_zero( ta )
301
+ eq_of_equinox( ta ) +
302
+ ml_Aries( ta )
303
+ end
304
+ alias_method :true_longitude_aries, :tl_Aries
305
+
306
+ # From angles.rb:<br>
307
+ # angle of true longitude sun
308
+ # used in equation of time
309
+ def tl_Sun( ta = A2000 )
310
+ ta = check_jct_zero( ta )
311
+ mod_360(
312
+ gml_Sun( ta ) +
313
+ center( ta )
314
+ )
315
+ end
316
+ alias_method :true_longitude, :tl_Sun
317
+
318
+ # From angles.rb:<br>
319
+ # true obliquity considers nutation
320
+ def to_Earth( ta = A2000 )
321
+ ta = check_jct_zero( ta )
322
+ delta_epsilon( ta ) +
323
+ mo_Earth( ta )
324
+ end
325
+ alias_method :obliquity_correction, :to_Earth
326
+ alias_method :true_obliquity, :to_Earth
327
+
328
+ end
329
+
330
+ if __FILE__ == $PROGRAM_NAME
331
+
332
+ spec = File.expand_path('../../../tests/minitest', __FILE__)
333
+ $LOAD_PATH.unshift(spec) unless $LOAD_PATH.include?(spec)
334
+ require 'angles_spec'
335
+ require 'aliased_angles_spec'
336
+
337
+ end
@@ -0,0 +1,168 @@
1
+ # constants.rb
2
+ require 'date'
3
+
4
+ class Eot
5
+
6
+ include Math
7
+
8
+ # Array result for time_julian_century default = [0.0, 0.0, 0.0, 0.0, 0.0]
9
+ A2000 = [0.0, 0.0, 0.0, 0.0, 0.0]
10
+
11
+ # Arc seconds in a degree = 3_600.0
12
+ ARCSEC = 3_600.0
13
+
14
+ # Arc seconds in a degree = 3_600.0
15
+ ASD = 3_600.0
16
+
17
+ # Arc seconds in an hour = 240.0
18
+ ASH = 240.0
19
+
20
+ # Light time for 1 au (s) = 499.004782
21
+ AULT = 499.004782
22
+
23
+ # Speed of light (m/s) = 299792458.0
24
+ CMPS = 299792458.0
25
+
26
+ # Default date string = "2000-01-01"
27
+ D2000 = "2000-01-01"
28
+
29
+ # 2Pi = 6.283185307179586476925287
30
+ D2PI = 6.283185307179586476925287
31
+
32
+ # Arcseconds to radians = 4.848136811095359935899141e-6
33
+ DAS2R = 4.848136811095359935899141e-6
34
+
35
+ # Astronomical unit (m) = 149597870e3
36
+ DAU = 149597870e3
37
+
38
+ # Hours in a day = 24.0
39
+ DAY_HOURS = 24.0
40
+
41
+ # Minutes in a day = 1_440.0
42
+ DAY_MINUTES = 1_440.0
43
+
44
+ # Seconds in a day = 86_400.0
45
+ DAY_SECONDS = 86_400.0
46
+
47
+ # Seconds in a day = 86_400.0
48
+ DAYSEC = 86400.0
49
+
50
+ # Micro Seconds in a day = 86_400_000_000.0
51
+ DAY_USECS = 86_400_000_000.0
52
+
53
+ # Speed of light (AU per day) = DAYSEC / AULT
54
+ DC = DAYSEC / AULT
55
+
56
+ # Degrees to radians = 1.745329251994329576923691e-2
57
+ DD2R = 1.745329251994329576923691e-2
58
+
59
+ # dint(A) - truncate to nearest whole number towards zero (double)
60
+ # dint(A) = ((A)<0.0?ceil(A):floor(A))
61
+
62
+ # dnint(A) - round to nearest whole number (double)
63
+ # dnint(A) = ((A)<0.0?ceil((A)-0.5):floor((A)+0.5))
64
+
65
+ # dsign(A,B) - magnitude of A with sign of B (double)
66
+ # dsign(A,B) = ((B)<0.0?-fabs(A):fabs(A))
67
+
68
+ # Reference epoch (J2000.0), Julian Date
69
+ # Default Julian Number = 2451545.0
70
+ DJ00 = 2451545.0
71
+
72
+ # Days per Julian century = 36525.0
73
+ DJC = 36525.0
74
+
75
+ # Days per Julian millennium = 365250.0
76
+ DJM = 365250.0
77
+
78
+ # Julian Date of Modified Julian Date zero
79
+ # 1858, 11, 17, 0.0 midnight start of calendar reform = 2400000.5
80
+ # Removed from Julian Date to get Modified Julian Date
81
+ DJM0 = 2400000.5
82
+
83
+ # Reference epoch (J2000.0), Modified Julian Date = 51544.5
84
+ DJM00 = 51544.5
85
+
86
+ # 1977 Jan 1.0 as MJD = 43144.0
87
+ DJM77 = 43144.0
88
+
89
+ # Days per Julian year = 365.25
90
+ DJY = 365.25
91
+
92
+ # Milli-arc-seconds to radians = DAS2R / 1e3
93
+ DMAS2R = DAS2R / 1e3
94
+
95
+ # Pi = 3.141592653589793238462643
96
+ DPI = 3.141592653589793238462643
97
+
98
+ # Radians to arc seconds = 206264.8062470963551564734
99
+ DR2AS = 206264.8062470963551564734
100
+
101
+ # Radians to degrees = 57.29577951308232087679815
102
+ DR2D = 57.29577951308232087679815
103
+
104
+ # Seconds of time to radians = 7.272205216643039903848712e-5
105
+ DS2R = 7.272205216643039903848712e-5
106
+
107
+ # Default DateTime = DateTime.new( 2000, 01, 01, 12, 00, 00, "+00:00" )
108
+ DT2000 = DateTime.new( 2000, 01, 01, 12, 00, 00, "+00:00" )
109
+
110
+ # arc seconds degrees to radians = PI / 180.0 / ARCSEC
111
+ DTR = PI / 180.0 / ARCSEC
112
+
113
+ # Length of tropical year B1900 (days) = 365.242198781
114
+ DTY = 365.242198781
115
+
116
+ # L_G = 1 - d(TT)/d(TCG) = 6.969290134e-10
117
+ ELG = 6.969290134e-10
118
+
119
+ # L_B = 1 - d(TDB)/d(TCB) = 1.550519768e-8
120
+ ELB = 1.550519768e-8
121
+
122
+ # max(A,B) - larger (most +ve) of two numbers (generic)
123
+ # gmax(A,B) = (((A)>(B))?(A):(B))
124
+
125
+ # min(A,B) - smaller (least +ve) of two numbers (generic)
126
+ # gmin(A,B) = (((A)<(B))?(A):(B))
127
+
128
+ # Reference epoch (J2000.0), Julian Date
129
+ # Default Julian Number = 2451545.0
130
+ J2000 = 2451545.0
131
+
132
+ # Julian Date of Modified Julian Date zero
133
+ # 1858, 11, 17, 0.0 midnight start of calendar reform = 2400000.5
134
+ MJD0 = 2400000.5
135
+
136
+ # 2Pi from Math module = Math::PI * 2.0
137
+ P2 = PI * 2.0
138
+
139
+ # pi from Math module = Math::PI
140
+ PI
141
+
142
+ # arc seconds radians to degrees = 180.0 / PI * ARCSEC
143
+ RTD = 180.0 / PI * ARCSEC
144
+
145
+ # Sidereal minutes = 4.0 / 1.0027379093507953456536618754278
146
+ SM = 4.0 / 1.0027379093507953456536618754278
147
+
148
+ # Schwarzschild radius of the Sun (au) = 2 * 1.32712440041e20 / (2.99792458e8)^2 / 1.49597870700e11
149
+ SRS = 1.97412574336e-8
150
+
151
+ # TDB (s) at TAI 1977/1/1.0 = -6.55e-5
152
+ TDB0 = -6.55e-5
153
+
154
+ # TT minus TAI (s) = 32.184
155
+ TTMTAI = 32.184
156
+
157
+ # Arcseconds in a full circle = 1296000.0
158
+ TURNAS = 1296000.0
159
+
160
+ end
161
+
162
+ if __FILE__ == $PROGRAM_NAME
163
+
164
+ spec = File.expand_path('../../../tests/minitest', __FILE__)
165
+ $LOAD_PATH.unshift(spec) unless $LOAD_PATH.include?(spec)
166
+ require 'constants_spec'
167
+
168
+ end