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,213 @@
1
+ # displays.rb
2
+
3
+ class Eot
4
+
5
+ # From displays.rb<br>
6
+ # String formatter for d:m:s display
7
+ def degrees_to_s( degrees = 0.0 )
8
+ degrees.nil? ? degrees = 0.0 : degrees
9
+ degrees < 0 ? sign_string = "-" : sign_string = "+"
10
+ absolute_degrees = degrees.abs
11
+ absolute_degrees_integer = Integer( absolute_degrees )
12
+ absolute_decimal_minutes = 60.0 *
13
+ (
14
+ absolute_degrees -
15
+ absolute_degrees_integer
16
+ )
17
+ absolute_minutes_integer = Integer( absolute_decimal_minutes )
18
+ absolute_decimal_seconds = bd( 60.0 *
19
+ (
20
+ absolute_decimal_minutes -
21
+ absolute_minutes_integer
22
+ )
23
+ )
24
+ absolute_seconds_integer = Integer( absolute_decimal_seconds )
25
+ absolute_milli_seconds_integer = Integer(1000.0 *
26
+ (
27
+ absolute_decimal_seconds -
28
+ absolute_seconds_integer
29
+ )
30
+ )
31
+ sign_string +
32
+ "%03d" % absolute_degrees_integer +
33
+ ":" +
34
+ "%02d" % absolute_minutes_integer +
35
+ ":" +
36
+ "%02d" % absolute_seconds_integer +
37
+ "." +
38
+ "%3.3d" % absolute_milli_seconds_integer
39
+ end
40
+
41
+ # From displays.rb<br>
42
+ # String formatter for + and - time
43
+ def show_minutes(min = 0.0)
44
+ min.nil? ? min = 0.0 : min
45
+ time = Time.utc(1, 1, 1, 0, 0, 0, 0.0)
46
+ time = time + (min.abs * 60.0)
47
+ if min < 0.0
48
+ sign = "-"
49
+ else
50
+ sign = "+"
51
+ end
52
+ time.strftime("#{sign}%M:%S.%3N")
53
+ end
54
+
55
+ # From displays.rb<br>
56
+ # String for time now
57
+ def show_now(now = now(Time.now.utc))
58
+ show_minutes(now)
59
+ end
60
+
61
+ # From displays.rb<br>
62
+ # String format of apparent longitude
63
+ def string_al_Sun( ta = A2000 )
64
+ degrees_to_s( al_Sun( ta ) )
65
+ end
66
+ alias_method :apparent_longitude_string, :string_al_Sun
67
+
68
+ # From displays.rb<br>
69
+ # String formatter for fraction of Julian day number
70
+ def string_day_fraction_to_time( jpd_time = 0.0 )
71
+ jpd_time.nil? ? jpd_time = 0.0 : jpd_time
72
+ fraction = jpd_time + 0.5 - Integer( jpd_time )
73
+ hours = Integer( fraction * DAY_HOURS )
74
+ minutes = Integer(( fraction - hours / DAY_HOURS ) * DAY_MINUTES )
75
+ seconds = Integer(( fraction - hours / 24.0 - minutes / DAY_MINUTES ) * DAY_SECONDS )
76
+ "%02d" % hours +
77
+ ":" +
78
+ "%02d" % minutes +
79
+ ":" +
80
+ "%02d" % seconds
81
+ end
82
+ alias_method :julian_period_day_fraction_to_time, :string_day_fraction_to_time
83
+
84
+ # From displays.rb<br>
85
+ # String format of declination
86
+ def string_dec_Sun( ta = A2000 )
87
+ degrees_to_s( dec_Sun( ta ) )
88
+ end
89
+ alias_method :declination_string, :string_dec_Sun
90
+
91
+ # From displays.rb<br>
92
+ # String format for delta oblique
93
+ def string_delta_oblique( ta = A2000 )
94
+ show_minutes(delta_oblique( ta ))
95
+ end
96
+
97
+ # From displays.rb<br>
98
+ # String format for delta orbit
99
+ def string_delta_orbit( ta = A2000 )
100
+ show_minutes(delta_orbit( ta ))
101
+ end
102
+
103
+ # From displays.rb<br>
104
+ # String format for centre
105
+ def string_eqc( ta = A2000 )
106
+ degrees_to_s( center( ta ))
107
+ end
108
+
109
+ # From displays.rb<br>
110
+ # Equation of time output for minutes and seconds
111
+ def string_eot()
112
+ eot = time_eot()
113
+ min_eot = eot
114
+ if min_eot < 0.0
115
+ sign = "-"
116
+ else
117
+ sign = "+"
118
+ end
119
+ eot = min_eot.abs
120
+ minutes = Integer( eot )
121
+ seconds = ( eot - minutes ) * 60.0
122
+ decimal_seconds = ( seconds - Integer( seconds )) * 100.0
123
+ min = "%02d" % minutes
124
+ sec = "%02d" % seconds
125
+ dec_sec = "%01d" % decimal_seconds
126
+ sign << min << "m, " << sec << "." << dec_sec << "s"
127
+ end
128
+ alias_method :display_equation_of_time, :string_eot
129
+
130
+ # From displays.rb<br>
131
+ # String format conversion of jd to date
132
+ def string_jd_to_date( jd = J2000 )
133
+ jd = check_jd_zero( jd )
134
+ Date.jd( jd ).to_s
135
+ end
136
+ alias_method :jd_to_date_string, :string_jd_to_date
137
+
138
+ # From displays.rb<br>
139
+ # String format of mean anomaly
140
+ def string_ma_Sun()
141
+ degrees_to_s( @ma )
142
+ end
143
+ alias_method :mean_anomaly_string, :string_ma_Sun
144
+
145
+ # From displays.rb<br>
146
+ # String format of right ascension
147
+ def string_ra_Sun( ta = A2000 )
148
+ degrees_to_s( ra_Sun( ta ) )
149
+ end
150
+ alias_method :right_ascension_string, :string_ra_Sun
151
+
152
+ # From displays.rb<br>
153
+ # String format of true anomaly
154
+ def string_ta_Sun( ta = A2000 )
155
+ degrees_to_s( ta_Sun( ta ) )
156
+ end
157
+ alias_method :true_anomaly_string, :string_ta_Sun
158
+
159
+ # From displays.rb<br>
160
+ # String formatter for h:m:s display
161
+ def string_time( dt = DT2000 )
162
+ dt = check_t_zero( dt )
163
+
164
+ if dt.class == DateTime
165
+ hours = dt.hour
166
+ minutes = dt.min
167
+ seconds = dt.sec
168
+ intsecs = Integer( seconds )
169
+ decsecs = Integer(( seconds - intsecs ).round( 3 ) * 1000.0 )
170
+ else
171
+ decimal = dt % DAY_HOURS
172
+ hours = Integer( decimal )
173
+ mindecimal = bd( 60.0 * ( decimal - hours )) * 1.0
174
+ minutes = Integer( mindecimal )
175
+ seconds = bd( 60.0 * ( mindecimal - minutes )) * 1.0
176
+ intsecs = Integer( seconds )
177
+ decsecs = Integer(( seconds - intsecs ).round( 3 ) * 1000.0 )
178
+ end
179
+
180
+ "%02d" % hours +
181
+ ":" +
182
+ "%02d" % minutes +
183
+ ":" +
184
+ "%02d" % intsecs +
185
+ "." +
186
+ "%3.3d" % decsecs
187
+ end
188
+ alias_method :display_time_string, :string_time
189
+
190
+ # From displays.rb<br>
191
+ # String format of true longitude
192
+ def string_tl_Sun( ta = A2000 )
193
+ degrees_to_s( tl_Sun( ta ) )
194
+ end
195
+ alias_method :true_longitude_string, :string_tl_Sun
196
+
197
+ # From displays.rb<br>
198
+ # String format of true obliquity
199
+ def string_to_Earth( ta = A2000 )
200
+ degrees_to_s( to_Earth( ta ) )
201
+ end
202
+ alias_method :true_obliquity_string, :string_to_Earth
203
+
204
+ end
205
+
206
+ if __FILE__ == $PROGRAM_NAME
207
+
208
+ spec = File.expand_path('../../../tests/minitest', __FILE__)
209
+ $LOAD_PATH.unshift(spec) unless $LOAD_PATH.include?(spec)
210
+ require 'displays_spec'
211
+ require 'aliased_displays_spec'
212
+
213
+ end
@@ -0,0 +1,80 @@
1
+ # geo_lat_lng_smt.rb
2
+
3
+ require 'multi_xml'
4
+ require 'rest-client'
5
+
6
+ # class for location lookup
7
+ # in geo_lat_lng_smt.rb
8
+ class GeoLatLng
9
+
10
+ # Base address for Google maps api
11
+ attr_reader :base
12
+
13
+ # Default US set to PARCS
14
+ attr_reader :default_us
15
+
16
+ # Default International set to GMT Museum
17
+ attr_reader :default_int
18
+
19
+ # Address entered
20
+ attr_accessor :addr
21
+
22
+ # Latitude returned
23
+ attr_accessor :lat
24
+
25
+ # Longitude returned
26
+ attr_accessor :lng
27
+
28
+ # Base Google URL
29
+ attr_reader :base
30
+
31
+ # Instance variables
32
+ def initialize
33
+
34
+ @base = "http://maps.googleapis.com/maps/api/geocode/xml?sensor=false&address="
35
+ @default_us = "3333 Coyote Hill Road, Palo Alto, CA, 94304, USA"#do you copy? :D
36
+ @default_int = "Blackheath Ave, London SE10 8XJ, UK"
37
+ @lat = 0.0
38
+ @lng = 0.0
39
+ MultiXml.parser = :rexml#:libxml#:ox # :nokogiri
40
+
41
+ end
42
+
43
+ # set address
44
+ def addr=(addr = @default_int)
45
+ @addr = addr
46
+ end
47
+
48
+ # coordinates lookup
49
+ def get_coordinates_from_address
50
+ res = RestClient.get(
51
+ URI.encode(
52
+ "#{ @base }#{ @addr }"
53
+ )
54
+ )
55
+ parsed_res = MultiXml.parse( res )
56
+ result = parsed_res[ "GeocodeResponse" ][ "result" ]
57
+ status = parsed_res[ "GeocodeResponse" ][ "status" ]
58
+ if status != "OK"
59
+ @default
60
+ else
61
+ if result.count != 4
62
+ @default
63
+ else
64
+ @lat = parsed_res[ "GeocodeResponse" ][ "result" ][ "geometry" ][ "location" ][ "lat" ]
65
+ @lng = parsed_res[ "GeocodeResponse" ][ "result" ][ "geometry" ][ "location" ][ "lng" ]
66
+ end
67
+ end
68
+
69
+ end
70
+
71
+ end
72
+
73
+ if __FILE__ == $PROGRAM_NAME
74
+
75
+ spec = File.expand_path('../../../tests/minitest', __FILE__)
76
+ $LOAD_PATH.unshift(spec) unless $LOAD_PATH.include?(spec)
77
+ require 'geo_spec'
78
+
79
+ end
80
+
data/lib/eot/init.rb ADDED
@@ -0,0 +1,93 @@
1
+ # init.rb
2
+
3
+ class Eot
4
+
5
+ # From init.rb:<br>
6
+ # Astronomical Julian Day Number is an instance of Date class.
7
+ # When new Equation of Time class is initialized @ajd = jd = today DateTime.jd
8
+ # Used for getting the equation of time now if it is set for that. There is
9
+ # always a slight delay in the computation though.
10
+ attr_accessor :ajd
11
+
12
+ # From init.rb:<br>
13
+ # Nutation Data is an instance of Array class.
14
+ # @data = nutation_table5_3a.yaml
15
+ # YAML File loaded when new Eot class is initialized.
16
+ attr_reader :data
17
+
18
+ # From init.rb:<br>
19
+ # @date is an instance of Date class.
20
+ # When new Eot class is initialized @date = today
21
+ attr_accessor :date
22
+
23
+ # From init.rb:<br>
24
+ # Julian Day Number is an instance of Date class.
25
+ # When new Eot class is initialized @jd = jd today
26
+ attr_accessor :jd
27
+
28
+ # From init.rb:<br>
29
+ # Latitude input is an instance of Float class.
30
+ # When new Eot class is initialized @latitude = 0.0
31
+ # May use GeoLatLng class to set it also but is commented out or will fail if no
32
+ # internet connection is present.
33
+ attr_accessor :latitude
34
+
35
+ # From init.rb:<br>
36
+ # Longitude input is an instance of Float class.
37
+ # When new Eot class is initialized @longitude = 0.0
38
+ # May use GeoLatLng class to set it also but is commented out or will fail if no
39
+ # internet connection is present.
40
+ attr_accessor :longitude
41
+
42
+ # From init.rb:<br>
43
+ # Mean Anomaly gets called a lot so attribute accessor saves time
44
+ attr_accessor :ma
45
+
46
+ # From init.rb:<br>
47
+ # address used for GeoLatLng.addr when used.(commented out)
48
+ attr_accessor :addr
49
+
50
+
51
+ # From init.rb:<br>
52
+ # Initialize loads nutation data with safe_yaml and is frozen, atrributes are set.
53
+ # You may use GeoLatLng to set up @latitude and @longitude but you need to have
54
+ # internet so that is commented out for now.
55
+ def initialize(addr=nil)
56
+
57
+ file_path = File.expand_path( File.dirname( __FILE__ ) + "/nutation_table5_3a.yaml" )
58
+ @data = YAML::load( File.open( file_path, 'r'), :safe => true ).freeze
59
+
60
+ @ajd.nil? ? @ajd = DateTime.now.to_time.utc.to_datetime.jd.to_f : @ajd = self.ajd
61
+ @date.nil? ? @date = DateTime.now.to_time.utc.to_date : @date = self.date
62
+ @jd.nil? ? @jd = DateTime.now.to_time.utc.to_datetime.jd.to_f : @jd = self.jd
63
+ @latitude.nil? ? @latitude = 0.0 : @latitude = self.latitude
64
+ @longitude.nil? ? @longitude = 0.0 : @longitude = self.longitude
65
+ @ma.nil? ? @ma = ma_Sun() : @ma
66
+
67
+ #geo = GeoLatLng.new
68
+ @addr = addr
69
+ #addr.nil? ? geo.addr=(geo.default_int) : geo.addr=addr
70
+ # uncomment below if you have internet connection
71
+ #geo.get_coordinates_from_address
72
+ #@latitude = geo.lat.to_f
73
+ #@longitude = geo.lng.to_f
74
+ end
75
+
76
+ end
77
+
78
+
79
+ # we can run some tests from inside this file.
80
+ if __FILE__ == $PROGRAM_NAME
81
+
82
+ lib = File.expand_path('../../../lib', __FILE__)
83
+ puts "Loading gem from #{lib}/eot.rb"
84
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
85
+ require 'eot'
86
+ e = Eot.new
87
+ p e.date
88
+
89
+ spec = File.expand_path('../../../tests/minitest', __FILE__)
90
+ $LOAD_PATH.unshift(spec) unless $LOAD_PATH.include?(spec)
91
+ require 'init_spec'
92
+
93
+ end
@@ -0,0 +1,70 @@
1
+ # nutation.rb
2
+
3
+ require 'mutex_m'
4
+
5
+ class Eot
6
+
7
+ # From nutation.rb<br>
8
+ # nutation data terms are used here.
9
+ # arc seconds are used for these terms
10
+ # see http://aa.usno.navy.mil/publications/docs/Circular_179.pdf page 46 (5.19)
11
+ def delta_equinox( ta = A2000 )
12
+ ta = check_jct_zero( ta )
13
+
14
+ ma_moon = [-0.00024470, 0.051635, 31.8792, 1717915923.2178, 485868.249036].inject(0.0) {|p, a| p * ta[0] + a}
15
+
16
+ ma_sun = [-0.00001149, 0.000136, -0.5532, 129596581.0481, 1287104.79305].inject(0.0) {|p, a| p * ta[0] + a}
17
+
18
+ md_moon = [0.00000417, -0.001037, -12.7512, 1739527262.8478, 335779.526232].inject(0.0) {|p, a| p * ta[0] + a}
19
+
20
+ me_moon = [-0.00003169, 0.006593, -6.3706, 1602961601.2090, 1072260.70369].inject(0.0) {|p, a| p * ta[0] + a}
21
+
22
+ omega = [-0.00005939, 0.007702, 7.4722, -6962890.5431, 450160.398036].inject(0.0) {|p, a| p * ta[0] + a}
23
+
24
+ # declare and clear these two variables for the sigma loop
25
+ delta_psi, delta_eps = 0, 0
26
+
27
+ lines = data.size - 1
28
+ for i in 0..lines
29
+ fma_sun = data[i][0].to_i
30
+ fma_moon = data[i][1].to_i
31
+ fmd_moon = data[i][2].to_i
32
+ fme_moon = data[i][3].to_i
33
+ fomega = data[i][4].to_i
34
+
35
+ sine = sind(fma_moon * ma_moon +
36
+ fma_sun * ma_sun +
37
+ fmd_moon * md_moon +
38
+ fme_moon * me_moon +
39
+ fomega * omega)
40
+
41
+ cosine = cosd(fma_moon * ma_moon +
42
+ fma_sun * ma_sun +
43
+ fmd_moon * md_moon +
44
+ fme_moon * me_moon +
45
+ fomega * omega)
46
+
47
+ delta_psi += (data[i][6].to_f +
48
+ data[i][7].to_f * ta[0]) * sine +
49
+ data[i][10].to_f * cosine
50
+
51
+ delta_eps += (data[i][8].to_f +
52
+ data[i][9].to_f * ta[0]) * cosine +
53
+ data[i][12].to_f * sine
54
+
55
+ end
56
+
57
+ delta_eps = to_deg( delta_eps ) / 1000.0
58
+ delta_psi = to_deg( delta_psi ) / 1000.0
59
+
60
+ [ delta_eps, delta_psi, ma_sun, omega, ma_moon, md_moon, me_moon]
61
+ end
62
+
63
+ end
64
+ if __FILE__ == $PROGRAM_NAME
65
+
66
+ spec = File.expand_path('../../../tests/minitest', __FILE__)
67
+ $LOAD_PATH.unshift(spec) unless $LOAD_PATH.include?(spec)
68
+ require 'nutation_spec'
69
+
70
+ end