equationoftime 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
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