equationoftime 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +19 -0
- data/.rspec +1 -0
- data/Gemfile +4 -0
- data/LICENSE.md +22 -0
- data/LICENSE.txt +22 -0
- data/README.md +80 -0
- data/README2.txt +70 -0
- data/Rakefile +80 -0
- data/doc/GeoLatLng.html +770 -0
- data/doc/_index.html +123 -0
- data/doc/class_list.html +54 -0
- data/doc/css/common.css +1 -0
- data/doc/css/full_list.css +57 -0
- data/doc/css/style.css +339 -0
- data/doc/file.README.html +179 -0
- data/doc/file_list.html +56 -0
- data/doc/frames.html +26 -0
- data/doc/index.html +179 -0
- data/doc/js/app.js +219 -0
- data/doc/js/full_list.js +178 -0
- data/doc/js/jquery.js +4 -0
- data/doc/method_list.html +611 -0
- data/doc/top-level-namespace.html +112 -0
- data/equationoftime.gemspec +35 -0
- data/examples/Equation_of_Time.jpg +0 -0
- data/examples/analemma_data_generator.rb +53 -0
- data/examples/check_date_type.rb +57 -0
- data/examples/compare_geoc_long_ra.rb +31 -0
- data/examples/data_table.rb +26 -0
- data/examples/earth_rotation.rb +13 -0
- data/examples/eot_methods_list.rb +16 -0
- data/examples/eot_plot.r +57 -0
- data/examples/eot_suntimes.rb +140 -0
- data/examples/equation_of_time.py +186 -0
- data/examples/figure_1.jpg +0 -0
- data/examples/file_converter.rb +31 -0
- data/examples/from_readme.rb +10 -0
- data/examples/geo_locator.rb +12 -0
- data/examples/getjd.rb +45 -0
- data/examples/input_suntimes.rb +21 -0
- data/examples/julian_day_formula.rb +29 -0
- data/examples/julian_day_formula.txt +12 -0
- data/examples/my_time_conversion.rb +21 -0
- data/examples/nutation_series.txt +678 -0
- data/examples/nutation_series.yaml +14239 -0
- data/examples/nutation_table5_3a.txt +682 -0
- data/examples/nutation_table5_3a.yaml +9532 -0
- data/examples/ptime.rb +162 -0
- data/examples/read_nutation_data.rb +399 -0
- data/examples/suntimes.rb +28 -0
- data/examples/suntimes_test.rb +47 -0
- data/examples/test_poly_eval.rb +38 -0
- data/examples/time_scales.rb +29 -0
- data/examples/usage_example.rb +13 -0
- data/examples/use_angles.rb +155 -0
- data/lib/eot/angles.rb +337 -0
- data/lib/eot/constants.rb +168 -0
- data/lib/eot/displays.rb +213 -0
- data/lib/eot/geo_lat_lng_smt.rb +80 -0
- data/lib/eot/init.rb +93 -0
- data/lib/eot/nutation.rb +70 -0
- data/lib/eot/nutation_table5_3a.yaml +9532 -0
- data/lib/eot/times.rb +130 -0
- data/lib/eot/utilities.rb +129 -0
- data/lib/eot/version.rb +6 -0
- data/lib/eot.rb +11 -0
- data/tests/minitest/aliased_angles_spec.rb +287 -0
- data/tests/minitest/aliased_displays_spec.rb +106 -0
- data/tests/minitest/aliased_times_spec.rb +36 -0
- data/tests/minitest/aliased_utilities_spec.rb +49 -0
- data/tests/minitest/angles_spec.rb +313 -0
- data/tests/minitest/constants_spec.rb +27 -0
- data/tests/minitest/delta_epsilon_spec.rb +35 -0
- data/tests/minitest/displays_spec.rb +111 -0
- data/tests/minitest/geo_spec.rb +36 -0
- data/tests/minitest/init_spec.rb +32 -0
- data/tests/minitest/nutation_spec.rb +33 -0
- data/tests/minitest/times_spec.rb +137 -0
- data/tests/minitest/utilities_spec.rb +121 -0
- data/tests/spec_config.rb +3 -0
- data/wiki.md +46 -0
- data/wiki2.md +4 -0
- metadata +240 -0
data/examples/ptime.rb
ADDED
@@ -0,0 +1,162 @@
|
|
1
|
+
require 'date'
|
2
|
+
require 'bigdecimal'
|
3
|
+
include Math
|
4
|
+
|
5
|
+
|
6
|
+
def degrees_to_radians(degrees)
|
7
|
+
bd(degrees * PI / 180.0)
|
8
|
+
end
|
9
|
+
|
10
|
+
def radians_to_degrees(radians)
|
11
|
+
bd(radians * 180.0 / PI)
|
12
|
+
end
|
13
|
+
|
14
|
+
# Truncate large angles
|
15
|
+
def truncate(x)
|
16
|
+
bd(360.0 * ( x / 360.0 - Integer( x / 360.0)))
|
17
|
+
end
|
18
|
+
|
19
|
+
def bd(var)
|
20
|
+
BigDecimal(var.to_s).round(16)# * 1.0
|
21
|
+
end
|
22
|
+
|
23
|
+
def calc_time_julian_century(t)
|
24
|
+
# Julian Day Number j(2000) subtracted
|
25
|
+
(t - 2451545.0)/36525.0
|
26
|
+
# Time in fractional centurey
|
27
|
+
end
|
28
|
+
|
29
|
+
def calc_eccentricity_earth_orbit(t)
|
30
|
+
0.016708617 - t * (0.000042037 + 0.0000001235 * t)#unitless
|
31
|
+
#~ puts "EccentricityEarthOrbit = #{eccentricity}"
|
32
|
+
end
|
33
|
+
|
34
|
+
def mean_anomaly(t)
|
35
|
+
(357.527723333 + truncate(35640.0 * t) \
|
36
|
+
+ t * (359.05034 - t * (0.0001602777778 \
|
37
|
+
+ t / 300000.0))) % 360.0
|
38
|
+
#~ t2 = t **2
|
39
|
+
#~ t3 = t **3
|
40
|
+
#~ t4 = t **4
|
41
|
+
#~ @mean_anomaly = 1287104.79305 + 129596581.0481 * t - 0.5532 * t2 + 0.000136 * t3 - 0.00001149 * t4
|
42
|
+
#~ @mean_anomaly = 357.527723333 + 359.05034 * t + trunc(35640.0 * t) - 0.0001602777778 * t2 - t3/300000.0
|
43
|
+
#~ @mean_anomaly = 357.52910 + t * 35999.05034 - t2 * 0.0001559 - t3 * 0.00000048
|
44
|
+
#~ puts "GeomMeanAnomalySun = #{mean_anomaly%360}"
|
45
|
+
#~ return mean_anomaly % 360 # in degrees
|
46
|
+
end
|
47
|
+
|
48
|
+
def calc_geom_mean_long_sun(t)
|
49
|
+
#~ //Mean longitude of the sun
|
50
|
+
t2 = t * t
|
51
|
+
t3 = t2 * t
|
52
|
+
t4 = t3 * t
|
53
|
+
t5 = t4 * t
|
54
|
+
truncate(280.4664567 + t * 36000.76982779 \
|
55
|
+
+ t2 * 0.0003032028 + t3/49931.0 \
|
56
|
+
- t4/15299.0 - t5/1988000.0)
|
57
|
+
end
|
58
|
+
|
59
|
+
def sun_eq_of_center(t)
|
60
|
+
#t2 = t **2
|
61
|
+
mean_anomaly = mean_anomaly(t)
|
62
|
+
#~ puts "GeomMeanAnomalySun = #{m}"
|
63
|
+
marad = degrees_to_radians(mean_anomaly)
|
64
|
+
sinmarad = sin(marad)
|
65
|
+
eccentricity = calc_eccentricity_earth_orbit(t)
|
66
|
+
sin2marad = sin(2.0 * marad)
|
67
|
+
sin3marad = sin(3.0 * marad)
|
68
|
+
sinmarad * (1.914602 - t * (0.004817 + 0.000014 * t))\
|
69
|
+
+ sin2marad * (0.019993 - 0.000101 * t)\
|
70
|
+
+ sin3marad * 0.000289
|
71
|
+
end
|
72
|
+
|
73
|
+
def true_anomaly(t)
|
74
|
+
mean_anomaly = mean_anomaly(t)
|
75
|
+
eqc = sun_eq_of_center(t)
|
76
|
+
bd(mean_anomaly + eqc) * 1.0
|
77
|
+
end
|
78
|
+
|
79
|
+
def calc_sun_true_long(t)
|
80
|
+
mean_lon = calc_geom_mean_long_sun(t)
|
81
|
+
eqc = sun_eq_of_center(t)
|
82
|
+
mean_lon + eqc - 0.01397 * (Time.now.year - 2000)
|
83
|
+
end
|
84
|
+
|
85
|
+
def mean_obliquity_of_ecliptic(t)
|
86
|
+
bd(23.4392911111 - t * (0.0130041666667 + t * (1.63888888889e-07 - (5.03611111111e-07 * t)))) * 1.0
|
87
|
+
end
|
88
|
+
|
89
|
+
def omega(t)
|
90
|
+
bd(125.04455501 - truncate(1800.0 * t) \
|
91
|
+
- t * (134.136261972 \
|
92
|
+
- t * (0.00207561111111 \
|
93
|
+
+ t * (2.13944444444e-06 \
|
94
|
+
- t * 1.64972222222e-08 \
|
95
|
+
)))) * 1.0
|
96
|
+
bd(125.04455501 - truncate(1800.0 * t) \
|
97
|
+
- t * 134.136261972 \
|
98
|
+
+ t * t * 0.00207561111111 \
|
99
|
+
+ t * t * t * 2.13944444444e-06 \
|
100
|
+
- t * t * t * t * 1.64972222222e-08 \
|
101
|
+
) * 1.0
|
102
|
+
end
|
103
|
+
|
104
|
+
def obliquity_correction(t)
|
105
|
+
eps0 = mean_obliquity_of_ecliptic(t)
|
106
|
+
omega = omega(t)
|
107
|
+
delta_eps = bd(0.00256 * cos(degrees_to_radians(omega)))
|
108
|
+
bd(eps0 + delta_eps)
|
109
|
+
end
|
110
|
+
|
111
|
+
def sun_right_ascension(t)
|
112
|
+
lambda = calc_sun_true_long(t)
|
113
|
+
epsilon = obliquity_correction(t)
|
114
|
+
y0 = bd(sin(degrees_to_radians(lambda)))
|
115
|
+
x0 = bd(cos(degrees_to_radians(lambda)))
|
116
|
+
y0 = bd(y0 * cos(degrees_to_radians(epsilon)))
|
117
|
+
bd(radians_to_degrees(atan2(-y0, -x0)) + 180.0) * 1.0
|
118
|
+
end
|
119
|
+
|
120
|
+
def mean_long_aries(t)
|
121
|
+
d = bd(t * 36525.0)
|
122
|
+
bd(truncate(280.46061666 + d * 360.98564736629\
|
123
|
+
+ t * (t * 0.000387933\
|
124
|
+
- t * (t / 38710000.0)))) * 1.0
|
125
|
+
end
|
126
|
+
|
127
|
+
pdate = Date.new(2014, 1, 3)
|
128
|
+
pd = pdate.ajd * 1.0
|
129
|
+
#puts pd
|
130
|
+
daysecs = 2 * 84600.0
|
131
|
+
|
132
|
+
for seconds in 1..daysecs
|
133
|
+
#puts seconds / 84600.0
|
134
|
+
jdt = calc_time_julian_century(pd + seconds / 84600.0)
|
135
|
+
mas = bd(mean_anomaly(jdt)).round(3) * 1.0
|
136
|
+
#puts mas
|
137
|
+
tas = bd(true_anomaly(jdt)).round(3) * 1.0
|
138
|
+
#puts tas
|
139
|
+
if (mas + tas) == 720
|
140
|
+
d = pd + seconds / 84600.0
|
141
|
+
#puts d
|
142
|
+
pt = jdt % 1.0
|
143
|
+
break
|
144
|
+
#~ else
|
145
|
+
#~ d = 0
|
146
|
+
#~ pt = 0
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
#~ puts d
|
151
|
+
#~ puts pt
|
152
|
+
puts "2014 perihelion occurred at #{d}"
|
153
|
+
tls = calc_sun_true_long(pt)
|
154
|
+
puts "lambda perihelion = #{tls}"
|
155
|
+
sra = sun_right_ascension(pt)
|
156
|
+
puts "Right ascesion = #{sra}"
|
157
|
+
ma = mean_long_aries(pt)
|
158
|
+
puts "GHA Aries = #{ma}"
|
159
|
+
|
160
|
+
|
161
|
+
|
162
|
+
|
@@ -0,0 +1,399 @@
|
|
1
|
+
# read_nutation_data.rb
|
2
|
+
|
3
|
+
lib = File.expand_path('../../lib', __FILE__)
|
4
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
|
+
|
6
|
+
require 'eot'
|
7
|
+
#~ require 'safe_yaml'
|
8
|
+
|
9
|
+
# create an instance of Equation_of_Time class
|
10
|
+
eot = Eot.new
|
11
|
+
|
12
|
+
|
13
|
+
=begin
|
14
|
+
|
15
|
+
The file this data comes from is 'Circular_179.pdf' IAU 2000A Nutation Series.
|
16
|
+
The first 678 lines are for lunisolar data.
|
17
|
+
|
18
|
+
# Try to make an array using each line of the file
|
19
|
+
filename = 'nutation_series.txt'
|
20
|
+
temp_array = []
|
21
|
+
data = File.readlines(filename)
|
22
|
+
# Clean out whitespace and new line breaks.
|
23
|
+
data.each {|i| temp_array << i.strip}
|
24
|
+
# Make new muti-dimensional data array.
|
25
|
+
data = []
|
26
|
+
temp_array.each {|i| data << i.split}
|
27
|
+
# Save the array in a file.
|
28
|
+
File::open( "nutation_series.data", "w" ) do |f|
|
29
|
+
f << data
|
30
|
+
end
|
31
|
+
|
32
|
+
# Make new muti-dimensional data array using yaml
|
33
|
+
data = []
|
34
|
+
temp_array.each {|i| data << i.split}
|
35
|
+
# Save the array in a yaml file.
|
36
|
+
File::open( "nutation_series.yaml", "w" ) do |f|
|
37
|
+
f << data.to_yaml
|
38
|
+
end
|
39
|
+
|
40
|
+
|
41
|
+
# $:.unshift(File.expand_path(File.dirname(__FILE__)))
|
42
|
+
# require 'nutation_series_data'
|
43
|
+
# or for => Ruby 1.9.2
|
44
|
+
require_relative 'nutation_series_data'
|
45
|
+
# I manually added @data = to the beginning of the new array file nutation_series.rb so we may use it
|
46
|
+
# data = @data
|
47
|
+
|
48
|
+
# load in the yaml data
|
49
|
+
data = []
|
50
|
+
File.open( "nutation_series2.yaml" ) do |f|
|
51
|
+
YAML.load_documents( f ) do |doc|
|
52
|
+
data = doc
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
=end
|
57
|
+
|
58
|
+
# data was initialized when the class instance was via nutation_series2.yaml file.
|
59
|
+
#data = eot.data
|
60
|
+
file_path = File.expand_path( File.dirname( __FILE__ ) + "/nutation_table5_3a.yaml" )
|
61
|
+
data = YAML::load( File.open( file_path, 'r'), :safe => true ).freeze
|
62
|
+
# Arc seconds to radians formula
|
63
|
+
ARCSEC = 3600.0
|
64
|
+
dtr = Math::PI / 180.0 / ARCSEC # adjusted for working in the arc seconds values
|
65
|
+
|
66
|
+
# sine degrees
|
67
|
+
def sind(dtr, x)
|
68
|
+
Math::sin(dtr*x)
|
69
|
+
end
|
70
|
+
# cod degrees
|
71
|
+
def cosd(dtr, x)
|
72
|
+
Math::cos(dtr*x)
|
73
|
+
end
|
74
|
+
|
75
|
+
|
76
|
+
# The JD is at Noon 12:00 UTC for today
|
77
|
+
# In all of these expressions, T is the number of Julian centuries of TDB since 2000 Jan 1, 12h TDB (or,
|
78
|
+
# with negligible error, the number of Julian centuries of TT since J2000.0).
|
79
|
+
jd2000 = 2451545.0 # the J2000 Julian Day Number
|
80
|
+
|
81
|
+
ajd = DateTime.now.to_time.utc.to_datetime.ajd.to_f
|
82
|
+
|
83
|
+
# calculate time to julian centuries
|
84
|
+
t = eot.time_julian_century(ajd)
|
85
|
+
|
86
|
+
# Values are in arc seconds see below for definitions of terms
|
87
|
+
ma_moon = 485868.249036 + 1717915923.2178 * t[0] + 31.8792 * t[1] + 0.051635 * t[2] - 0.00024470 * t[3]
|
88
|
+
ma_sun = 1287104.79305 + 129596581.0481 * t[0] - 0.5532 * t[1] + 0.000136 * t[2] - 0.00001149 * t[3]
|
89
|
+
md_moon = 335779.526232 + 1739527262.8478 * t[0] - 12.7512 * t[1] - 0.001037 * t[2] + 0.00000417 * t[3]
|
90
|
+
me_moon = 1072260.70369 + 1602961601.2090 * t[0] - 6.3706 * t[1] + 0.006593 * t[2] - 0.00003169 * t[3]
|
91
|
+
omega = 450160.398036 - 6962890.5431 * t[0] + 7.4722 * t[1] + 0.007702 * t[2] - 0.00005939 * t[3]
|
92
|
+
|
93
|
+
# declare and clear these two variables for the sigma loop
|
94
|
+
delta_psi, delta_eps = 0, 0
|
95
|
+
|
96
|
+
lines = data.size - 1
|
97
|
+
for i in 0..lines
|
98
|
+
fma_sun = data[i][0].to_i
|
99
|
+
fma_moon = data[i][1].to_i
|
100
|
+
fmd_moon = data[i][2].to_i
|
101
|
+
fme_moon = data[i][3].to_i
|
102
|
+
fomega = data[i][4].to_i
|
103
|
+
sine = sind(dtr, fma_moon * ma_moon +
|
104
|
+
fma_sun * ma_sun +
|
105
|
+
fmd_moon * md_moon +
|
106
|
+
fme_moon * me_moon +
|
107
|
+
fomega * omega)
|
108
|
+
cosine = cosd(dtr, fma_moon * ma_moon +
|
109
|
+
fma_sun * ma_sun +
|
110
|
+
fmd_moon * md_moon +
|
111
|
+
fme_moon * me_moon +
|
112
|
+
fomega * omega)
|
113
|
+
delta_psi += (data[i][6].to_f +
|
114
|
+
data[i][7].to_f * t[0]) * sine +
|
115
|
+
data[i][10].to_f * cosine
|
116
|
+
|
117
|
+
delta_eps += (data[i][8].to_f +
|
118
|
+
data[i][9].to_f * t[0]) * cosine +
|
119
|
+
data[i][12].to_f * sine
|
120
|
+
|
121
|
+
end
|
122
|
+
|
123
|
+
# convert arc seconds to degree
|
124
|
+
def to_deg( arc_secs )
|
125
|
+
arc_secs / ARCSEC
|
126
|
+
end
|
127
|
+
|
128
|
+
delta_eps = to_deg( delta_eps ) / 1000.0
|
129
|
+
delta_eps = eot.delta_epsilon(t)
|
130
|
+
|
131
|
+
delta_psi = to_deg( delta_psi ) / 1000.0
|
132
|
+
delta_psi = eot.delta_psi(t)
|
133
|
+
|
134
|
+
#Delta epsilon degrees decimal = #{to_deg(delta_eps)}
|
135
|
+
|
136
|
+
#Mean Obliquity of Ecliptic degrees = #{eot.display_degrees(eps0)}
|
137
|
+
eps0 = eot.mo_Earth(t)
|
138
|
+
#True Obliquity of Ecliptic degrees = #{eot.display_degrees(eps)}
|
139
|
+
eps = eot.to_Earth(t)
|
140
|
+
|
141
|
+
#Delta psi needs to be degrees and eps is degrees but dtr uses ARCSEC constant also we need the result back in ARCSEC / 15 to get time in secs.
|
142
|
+
# eoe = delta_psi / ARCSEC * cosd( dtr * ARCSEC, eps ) * ARCSEC / 15.0
|
143
|
+
eoe = eot.eq_of_equinox(t) / 15.0
|
144
|
+
#p eot.ml_Aries(t)
|
145
|
+
gmst = eot.ml_Aries(t) / 15.0 # make angle to time.
|
146
|
+
# eoe is ARCSEC so convert it to hours.
|
147
|
+
gast = gmst + eoe
|
148
|
+
|
149
|
+
#~ puts gmst
|
150
|
+
|
151
|
+
run = <<EOS
|
152
|
+
|
153
|
+
#{DateTime.now.to_time.utc.to_datetime}
|
154
|
+
|
155
|
+
The JD = #{ajd}
|
156
|
+
|
157
|
+
Mean Obliquity of Ecliptic = #{eot.degrees_to_s(eps0)}
|
158
|
+
|
159
|
+
Delta epsilon in arc seconds = #{delta_eps * 3600}
|
160
|
+
|
161
|
+
True Obliquity of Ecliptic degrees = #{eot.degrees_to_s(eps)}
|
162
|
+
|
163
|
+
Delta psi in arc seconds = #{delta_psi * 3600}
|
164
|
+
|
165
|
+
Equation of equinox in seconds = Delta psi * cos epsilon = #{eoe * 3600}
|
166
|
+
|
167
|
+
Greenwich Mean Sidereal Time = #{eot.string_time(gmst)}
|
168
|
+
|
169
|
+
Greenwich Apparent Sideral Time = #{eot.string_time(gast)}
|
170
|
+
|
171
|
+
To compare results enter the date and time into http://www.celnav.de/longterm.htm
|
172
|
+
|
173
|
+
You can use the methods in EOT instead of this example as this just shows how it works.
|
174
|
+
|
175
|
+
EOS
|
176
|
+
|
177
|
+
puts run
|
178
|
+
|
179
|
+
# Helpful info
|
180
|
+
=begin
|
181
|
+
these values are in arc seconds
|
182
|
+
|
183
|
+
Mean anomaly of the moon
|
184
|
+
ma_moon = 485868.249036 + 1717915923.2178 * t + 31.8792 * t2 + 0.051635 * t3 - 0.00024470 * t4
|
185
|
+
|
186
|
+
Mean anomaly of the sun
|
187
|
+
ma_sun = 1287104.79305 + 129596581.0481 * t - 0.5532 * t2 + 0.000136 * t3 - 0.00001149 * t4
|
188
|
+
|
189
|
+
|
190
|
+
Mean distance of the moon from the ascending node
|
191
|
+
md_moon = 335779.526232 + 1739527262.8478 * t - 12.7512 * t2 - 0.001037 * t3 + 0.00000417 * t4
|
192
|
+
|
193
|
+
|
194
|
+
Mean elongation of the moon
|
195
|
+
me_moon = 1072260.70369 + 1602961601.2090 * t - 6.3706 * t2 + 0.006593 * t3 - 0.00003169 * t4
|
196
|
+
|
197
|
+
|
198
|
+
Longitude of the ascending node of the moon
|
199
|
+
omega = 450160.398036 - 6962890.5431 * t + 7.4722 * t2 + 0.007702 * t3 - 0.00005939 * t4
|
200
|
+
|
201
|
+
=end
|
202
|
+
|
203
|
+
=begin
|
204
|
+
|
205
|
+
Manualy converted values from arc seconds to dergrees(not used here)
|
206
|
+
|
207
|
+
ma_moon = 134.96340251 + 477198.8675605 * t + t2 / 112.92629677 + t3 / 69720.15106 - t4 / 14711892.112791
|
208
|
+
ma_sun = 357.52910918 + 35999.0502911389 * t - t2 / 6507.592191 + t3 / 26470588.2353 - t4 / 313315926.89295
|
209
|
+
md_moon = 93.27209062 + 483202.01745772 * t - t2 / 282.3264 - t3 / 3471552.555 + t4 / 863309352.5179856
|
210
|
+
me_moon = 297.8501954694 + 445267.11144694 * t - t2 / 565.0959 + t3 / 546033.672 - t4 / 113600504.891
|
211
|
+
omega = 125.04455501 - 1934.136261972 * t + t2 / 481.78582 + 0.007702 * t3 / 467411.062 - t4 / 60616265.3645
|
212
|
+
|
213
|
+
=end
|
214
|
+
|
215
|
+
|
216
|
+
=begin
|
217
|
+
|
218
|
+
An example of usage for 'Circular_179.pdf' IAU 2000A Nutation Series
|
219
|
+
The JavaScript from: view-source:http://www.celnav.de/longterm.htm
|
220
|
+
//Nutation, obliquity of the ecliptic
|
221
|
+
function Nutation()
|
222
|
+
{
|
223
|
+
//IAU 1980 nutation theory:
|
224
|
+
|
225
|
+
//Mean anomaly of the moon
|
226
|
+
var Mm = 134.962981389+198.867398056*TE+trunc(477000*TE)+0.008697222222*TE2+TE3/56250;
|
227
|
+
|
228
|
+
//Mean anomaly of the sun
|
229
|
+
var M = 357.527723333+359.05034*TE+trunc(35640*TE)-0.0001602777778*TE2-TE3/300000;
|
230
|
+
|
231
|
+
//Mean distance of the moon from the ascending node
|
232
|
+
var F = 93.271910277+82.017538055*TE+trunc(483120*TE)-0.0036825*TE2+TE3/327272.7273;
|
233
|
+
|
234
|
+
//Mean elongation of the moon
|
235
|
+
var D = 297.850363055+307.11148*TE+trunc(444960*TE)-0.001914166667*TE2+TE3/189473.6842;
|
236
|
+
|
237
|
+
//Longitude of the ascending node of the moon
|
238
|
+
var omega = 125.044522222-134.136260833*TE-trunc(1800*TE)+0.002070833333*TE2+TE3/450000;
|
239
|
+
|
240
|
+
//Periodic terms for nutation
|
241
|
+
var nut = new Array(106);
|
242
|
+
nut[0] = " 0 0 0 0 1-171996-174.2 92025 8.9 ";
|
243
|
+
nut[1] = " 0 0 2-2 2 -13187 -1.6 5736-3.1 ";
|
244
|
+
nut[2] = " 0 0 2 0 2 -2274 -0.2 977-0.5 ";
|
245
|
+
nut[3] = " 0 0 0 0 2 2062 0.2 -895 0.5 ";
|
246
|
+
nut[4] = " 0-1 0 0 0 -1426 3.4 54-0.1 ";
|
247
|
+
nut[5] = " 1 0 0 0 0 712 0.1 -7 0.0 ";
|
248
|
+
nut[6] = " 0 1 2-2 2 -517 1.2 224-0.6 ";
|
249
|
+
nut[7] = " 0 0 2 0 1 -386 -0.4 200 0.0 ";
|
250
|
+
nut[8] = " 1 0 2 0 2 -301 0.0 129-0.1 ";
|
251
|
+
nut[9] = " 0-1 2-2 2 217 -0.5 -95 0.3 ";
|
252
|
+
nut[10] = "-1 0 0 2 0 158 0.0 -1 0.0 ";
|
253
|
+
nut[11] = " 0 0 2-2 1 129 0.1 -70 0.0 ";
|
254
|
+
nut[12] = "-1 0 2 0 2 123 0.0 -53 0.0 ";
|
255
|
+
nut[13] = " 1 0 0 0 1 63 0.1 -33 0.0 ";
|
256
|
+
nut[14] = " 0 0 0 2 0 63 0.0 -2 0.0 ";
|
257
|
+
nut[15] = "-1 0 2 2 2 -59 0.0 26 0.0 ";
|
258
|
+
nut[16] = "-1 0 0 0 1 -58 -0.1 32 0.0 ";
|
259
|
+
nut[17] = " 1 0 2 0 1 -51 0.0 27 0.0 ";
|
260
|
+
nut[18] = "-2 0 0 2 0 -48 0.0 1 0.0 ";
|
261
|
+
nut[19] = "-2 0 2 0 1 46 0.0 -24 0.0 ";
|
262
|
+
nut[20] = " 0 0 2 2 2 -38 0.0 16 0.0 ";
|
263
|
+
nut[21] = " 2 0 2 0 2 -31 0.0 13 0.0 ";
|
264
|
+
nut[22] = " 2 0 0 0 0 29 0.0 -1 0.0 ";
|
265
|
+
nut[23] = " 1 0 2-2 2 29 0.0 -12 0.0 ";
|
266
|
+
nut[24] = " 0 0 2 0 0 26 0.0 -1 0.0 ";
|
267
|
+
nut[25] = " 0 0 2-2 0 -22 0.0 0 0.0 ";
|
268
|
+
nut[26] = "-1 0 2 0 1 21 0.0 -10 0.0 ";
|
269
|
+
nut[27] = " 0 2 0 0 0 17 -0.1 0 0.0 ";
|
270
|
+
nut[28] = " 0 2 2-2 2 -16 0.1 7 0.0 ";
|
271
|
+
nut[29] = "-1 0 0 2 1 16 0.0 -8 0.0 ";
|
272
|
+
nut[30] = " 0 1 0 0 1 -15 0.0 9 0.0 ";
|
273
|
+
nut[31] = " 1 0 0-2 1 -13 0.0 7 0.0 ";
|
274
|
+
nut[32] = " 0-1 0 0 1 -12 0.0 6 0.0 ";
|
275
|
+
nut[33] = " 2 0-2 0 0 11 0.0 0 0.0 ";
|
276
|
+
nut[34] = "-1 0 2 2 1 -10 0.0 5 0.0 ";
|
277
|
+
nut[35] = " 1 0 2 2 2 -8 0.0 3 0.0 ";
|
278
|
+
nut[36] = " 0-1 2 0 2 -7 0.0 3 0.0 ";
|
279
|
+
nut[37] = " 0 0 2 2 1 -7 0.0 3 0.0 ";
|
280
|
+
nut[38] = " 1 1 0-2 0 -7 0.0 0 0.0 ";
|
281
|
+
nut[39] = " 0 1 2 0 2 7 0.0 -3 0.0 ";
|
282
|
+
nut[40] = "-2 0 0 2 1 -6 0.0 3 0.0 ";
|
283
|
+
nut[41] = " 0 0 0 2 1 -6 0.0 3 0.0 ";
|
284
|
+
nut[42] = " 2 0 2-2 2 6 0.0 -3 0.0 ";
|
285
|
+
nut[43] = " 1 0 0 2 0 6 0.0 0 0.0 ";
|
286
|
+
nut[44] = " 1 0 2-2 1 6 0.0 -3 0.0 ";
|
287
|
+
nut[45] = " 0 0 0-2 1 -5 0.0 3 0.0 ";
|
288
|
+
nut[46] = " 0-1 2-2 1 -5 0.0 3 0.0 ";
|
289
|
+
nut[47] = " 2 0 2 0 1 -5 0.0 3 0.0 ";
|
290
|
+
nut[48] = " 1-1 0 0 0 5 0.0 0 0.0 ";
|
291
|
+
nut[49] = " 1 0 0-1 0 -4 0.0 0 0.0 ";
|
292
|
+
nut[50] = " 0 0 0 1 0 -4 0.0 0 0.0 ";
|
293
|
+
nut[51] = " 0 1 0-2 0 -4 0.0 0 0.0 ";
|
294
|
+
nut[52] = " 1 0-2 0 0 4 0.0 0 0.0 ";
|
295
|
+
nut[53] = " 2 0 0-2 1 4 0.0 -2 0.0 ";
|
296
|
+
nut[54] = " 0 1 2-2 1 4 0.0 -2 0.0 ";
|
297
|
+
nut[55] = " 1 1 0 0 0 -3 0.0 0 0.0 ";
|
298
|
+
nut[56] = " 1-1 0-1 0 -3 0.0 0 0.0 ";
|
299
|
+
nut[57] = "-1-1 2 2 2 -3 0.0 1 0.0 ";
|
300
|
+
nut[58] = " 0-1 2 2 2 -3 0.0 1 0.0 ";
|
301
|
+
nut[59] = " 1-1 2 0 2 -3 0.0 1 0.0 ";
|
302
|
+
nut[60] = " 3 0 2 0 2 -3 0.0 1 0.0 ";
|
303
|
+
nut[61] = "-2 0 2 0 2 -3 0.0 1 0.0 ";
|
304
|
+
nut[62] = " 1 0 2 0 0 3 0.0 0 0.0 ";
|
305
|
+
nut[63] = "-1 0 2 4 2 -2 0.0 1 0.0 ";
|
306
|
+
nut[64] = " 1 0 0 0 2 -2 0.0 1 0.0 ";
|
307
|
+
nut[65] = "-1 0 2-2 1 -2 0.0 1 0.0 ";
|
308
|
+
nut[66] = " 0-2 2-2 1 -2 0.0 1 0.0 ";
|
309
|
+
nut[67] = "-2 0 0 0 1 -2 0.0 1 0.0 ";
|
310
|
+
nut[68] = " 2 0 0 0 1 2 0.0 -1 0.0 ";
|
311
|
+
nut[69] = " 3 0 0 0 0 2 0.0 0 0.0 ";
|
312
|
+
nut[70] = " 1 1 2 0 2 2 0.0 -1 0.0 ";
|
313
|
+
nut[71] = " 0 0 2 1 2 2 0.0 -1 0.0 ";
|
314
|
+
nut[72] = " 1 0 0 2 1 -1 0.0 0 0.0 ";
|
315
|
+
nut[73] = " 1 0 2 2 1 -1 0.0 1 0.0 ";
|
316
|
+
nut[74] = " 1 1 0-2 1 -1 0.0 0 0.0 ";
|
317
|
+
nut[75] = " 0 1 0 2 0 -1 0.0 0 0.0 ";
|
318
|
+
nut[76] = " 0 1 2-2 0 -1 0.0 0 0.0 ";
|
319
|
+
nut[77] = " 0 1-2 2 0 -1 0.0 0 0.0 ";
|
320
|
+
nut[78] = " 1 0-2 2 0 -1 0.0 0 0.0 ";
|
321
|
+
nut[79] = " 1 0-2-2 0 -1 0.0 0 0.0 ";
|
322
|
+
nut[80] = " 1 0 2-2 0 -1 0.0 0 0.0 ";
|
323
|
+
nut[81] = " 1 0 0-4 0 -1 0.0 0 0.0 ";
|
324
|
+
nut[82] = " 2 0 0-4 0 -1 0.0 0 0.0 ";
|
325
|
+
nut[83] = " 0 0 2 4 2 -1 0.0 0 0.0 ";
|
326
|
+
nut[84] = " 0 0 2-1 2 -1 0.0 0 0.0 ";
|
327
|
+
nut[85] = "-2 0 2 4 2 -1 0.0 1 0.0 ";
|
328
|
+
nut[86] = " 2 0 2 2 2 -1 0.0 0 0.0 ";
|
329
|
+
nut[87] = " 0-1 2 0 1 -1 0.0 0 0.0 ";
|
330
|
+
nut[88] = " 0 0-2 0 1 -1 0.0 0 0.0 ";
|
331
|
+
nut[89] = " 0 0 4-2 2 1 0.0 0 0.0 ";
|
332
|
+
nut[90] = " 0 1 0 0 2 1 0.0 0 0.0 ";
|
333
|
+
nut[91] = " 1 1 2-2 2 1 0.0 -1 0.0 ";
|
334
|
+
nut[92] = " 3 0 2-2 2 1 0.0 0 0.0 ";
|
335
|
+
nut[93] = "-2 0 2 2 2 1 0.0 -1 0.0 ";
|
336
|
+
nut[94] = "-1 0 0 0 2 1 0.0 -1 0.0 ";
|
337
|
+
nut[95] = " 0 0-2 2 1 1 0.0 0 0.0 ";
|
338
|
+
nut[96] = " 0 1 2 0 1 1 0.0 0 0.0 ";
|
339
|
+
nut[97] = "-1 0 4 0 2 1 0.0 0 0.0 ";
|
340
|
+
nut[98] = " 2 1 0-2 0 1 0.0 0 0.0 ";
|
341
|
+
nut[99] = " 2 0 0 2 0 1 0.0 0 0.0 ";
|
342
|
+
nut[100]= " 2 0 2-2 1 1 0.0 -1 0.0 ";
|
343
|
+
nut[101]= " 2 0-2 0 1 1 0.0 0 0.0 ";
|
344
|
+
nut[102]= " 1-1 0-2 0 1 0.0 0 0.0 ";
|
345
|
+
nut[103]= "-1 0 0 1 1 1 0.0 0 0.0 ";
|
346
|
+
nut[104]= "-1-1 0 2 1 1 0.0 0 0.0 ";
|
347
|
+
nut[105]= " 0 1 0 1 0 1 0.0 0 0.0 ";
|
348
|
+
|
349
|
+
//Reading periodic terms
|
350
|
+
var fMm, fM, fF, fD, f_omega, dp=0, de=0;
|
351
|
+
|
352
|
+
for (x=0; x<105; x++)
|
353
|
+
{
|
354
|
+
fMm = eval(nut[x].substring(0,2));
|
355
|
+
fM = eval(nut[x].substring(2,4));
|
356
|
+
fF = eval(nut[x].substring(4,6));
|
357
|
+
fD = eval(nut[x].substring(6,8));
|
358
|
+
f_omega = eval(nut[x].substring(8,10));
|
359
|
+
dp += (eval(nut[x].substring(10,17))+TE*eval(nut[x].substring(17,23)))*sind(fD*D+fM*M+fMm*Mm+fF*F+f_omega*omega);
|
360
|
+
de += (eval(nut[x].substring(23,29))+TE*eval(nut[x].substring(29,33)))*cosd(fD*D+fM*M+fMm*Mm+fF*F+f_omega*omega);
|
361
|
+
}
|
362
|
+
|
363
|
+
//Corrections (Herring, 1987)
|
364
|
+
/*
|
365
|
+
var corr = new Array(4);
|
366
|
+
corr[0] = " 0 0 0 0 1-725 417 213 224 ";
|
367
|
+
corr[1] = " 0 1 0 0 0 523 61 208 -24 ";
|
368
|
+
corr[2] = " 0 0 2-2 2 102-118 -41 -47 ";
|
369
|
+
corr[3] = " 0 0 2 0 2 -81 0 32 0 ";
|
370
|
+
|
371
|
+
for (x=0; x<4; x++)
|
372
|
+
{
|
373
|
+
fMm = eval(corr[x].substring(0,2));
|
374
|
+
fM = eval(corr[x].substring(2,4));
|
375
|
+
fF = eval(corr[x].substring(4,6));
|
376
|
+
fD = eval(corr[x].substring(6,8));
|
377
|
+
f_omega = eval(corr[x].substring(8,10));
|
378
|
+
dp += 0.1*(eval(corr[x].substring(10,14))*sind(fD*D+fM*M+fMm*Mm+fF*F+f_omega*omega)+eval(corr[x].substring(14,18))*cosd(fD*D+fM*M+fMm*Mm+fF*F+f_omega*omega));
|
379
|
+
de += 0.1*(eval(corr[x].substring(18,22))*cosd(fD*D+fM*M+fMm*Mm+fF*F+f_omega*omega)+eval(corr[x].substring(22,26))*sind(fD*D+fM*M+fMm*Mm+fF*F+f_omega*omega));
|
380
|
+
}
|
381
|
+
*/
|
382
|
+
|
383
|
+
//Nutation in longitude
|
384
|
+
delta_psi = dp/36000000;
|
385
|
+
|
386
|
+
//Nutation in obliquity
|
387
|
+
delta_eps = de/36000000;
|
388
|
+
|
389
|
+
//Mean obliquity of the ecliptic
|
390
|
+
eps0 = (84381.448-46.815*TE-0.00059*TE2+0.001813*TE3)/3600;
|
391
|
+
|
392
|
+
//True obliquity of the ecliptic
|
393
|
+
eps = eps0+delta_eps;
|
394
|
+
}
|
395
|
+
|
396
|
+
//Equation of the equinoxes
|
397
|
+
EoE = 240*delta_psi*cosd(eps);
|
398
|
+
|
399
|
+
=end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# suntimes.rb
|
2
|
+
|
3
|
+
lib = File.expand_path('../../lib', __FILE__)
|
4
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
|
+
|
6
|
+
# The following gem is not in rubygems.org yet. Please use the gem on github. Thanks!
|
7
|
+
require 'eot'
|
8
|
+
|
9
|
+
eot = Eot.new
|
10
|
+
# Change these for your geo location
|
11
|
+
@latitude = 41.9474 # + in Northern Hemishere, - in Southern Hemisphere
|
12
|
+
@longitude = -88.74467 # + East of zulu time zone, - West of zulu time zone
|
13
|
+
@zone = -5 # Time offset for zone.
|
14
|
+
|
15
|
+
|
16
|
+
eot.longitude= @longitude
|
17
|
+
eot.latitude= @latitude
|
18
|
+
puts
|
19
|
+
@date = Date.today
|
20
|
+
# get the times for a few more days.
|
21
|
+
for i in 0..10
|
22
|
+
|
23
|
+
eot.ajd = (@date.jd + i)
|
24
|
+
|
25
|
+
puts "Sunrise #{(eot.sunrise_dt().to_time).strftime("%c")}"
|
26
|
+
puts "Sunset #{(eot.sunset_dt().to_time).strftime("%c")}"
|
27
|
+
puts
|
28
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# suntimes_test.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
|
+
|
10
|
+
# Change these for your geographic location Ex: of mine.
|
11
|
+
# Note the two coordinate parameters must be passed as floats.
|
12
|
+
# All parameters may be passed at any time.
|
13
|
+
# eot.date = @date
|
14
|
+
# eot.longitude = @longitude
|
15
|
+
# eot.latitude = @latitude
|
16
|
+
@latitude = 0.0 # sign in Northern Hemishere is none, - (minus)for Southern Hemisphere
|
17
|
+
@longitude = 0.0 # East of UTC is none, - (minus)West of UTC
|
18
|
+
@date = "2000-01-01"
|
19
|
+
eot.jd = Date.parse(@date).jd
|
20
|
+
|
21
|
+
print "Enter your longitude in decimal format Ex: -125.099 \n"
|
22
|
+
|
23
|
+
lng = gets
|
24
|
+
|
25
|
+
lng.nil? ? eot.longitude = @longitude : eot.longitude = lng.chomp.to_f
|
26
|
+
|
27
|
+
puts "Your longitude is #{eot.longitude}"
|
28
|
+
|
29
|
+
print "Enter your latitude in decimal format Ex: 39.3339 \n"
|
30
|
+
|
31
|
+
lat = gets
|
32
|
+
|
33
|
+
lat.nil? ? eot.latitude = @latitude : eot.latitude = lat.chomp.to_f
|
34
|
+
|
35
|
+
puts "Your latitude is #{eot.latitude}"
|
36
|
+
|
37
|
+
print "Enter the date you want to compute sun times for Ex: yyyy-mm-dd \n"
|
38
|
+
|
39
|
+
date = gets
|
40
|
+
|
41
|
+
date.nil? ? eot.date = @date : eot.date = date.chomp.to_f
|
42
|
+
|
43
|
+
puts "The date is #{eot.date}"
|
44
|
+
|
45
|
+
puts "Sunrise #{eot.sunrise_dt.to_time}"
|
46
|
+
puts "Sunset #{eot.sunset_dt.to_time}"
|
47
|
+
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# test_poly_eval.rb
|
2
|
+
|
3
|
+
lib = File.expand_path('../../lib', __FILE__)
|
4
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
|
+
|
6
|
+
# class Array
|
7
|
+
# Evaluate polynomial using Horner's method.
|
8
|
+
# Array consists of coefficients of a polynomial, the
|
9
|
+
# coefficient of the highest order term first, the
|
10
|
+
# constant coefficient last.
|
11
|
+
# Returns evaluation of polynomial at +x+.
|
12
|
+
#
|
13
|
+
# Example: evaluate the polynomial x**2 - 0.5*x + 3.0 where x = 2.0
|
14
|
+
# [1.0, -0.5, 3.0].poly_eval(2.0) # => 6.0
|
15
|
+
# def poly_eval(x)
|
16
|
+
# self.inject(0.0) {|p, a|
|
17
|
+
# p*x + a}
|
18
|
+
# end
|
19
|
+
# end
|
20
|
+
|
21
|
+
require 'eot'
|
22
|
+
eot = Eot.new
|
23
|
+
|
24
|
+
@current = DateTime.now.to_time.utc
|
25
|
+
# comparing the difference for two methods of day_fraction
|
26
|
+
df1 = @current.to_datetime.day_fraction.to_f
|
27
|
+
df2 = @current.hour / 24.0 + @current.min / 1_440.0 + @current.sec / 86_400.0 + @current.usec / 86_400_000_000.0
|
28
|
+
|
29
|
+
ajd = @current.to_datetime.ajd.to_f
|
30
|
+
|
31
|
+
# setting up to test poly_eval in each angle method using it.
|
32
|
+
tjc = eot.time_julian_century(2456734.00110875)
|
33
|
+
#t = (Date.today.jd - 2451545.0)/365250.0
|
34
|
+
|
35
|
+
eot.eccentricity_Earth( tjc )
|
36
|
+
eot.gml_Sun( tjc )
|
37
|
+
p eot.ml_Aries( tjc )
|
38
|
+
eot.mo_Earth( tjc )
|