equationoftime 4.1.5 → 4.1.6
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.
- checksums.yaml +13 -5
- data/.ruby-version +1 -1
- data/Gemfile +8 -2
- data/Gemfile.lock +18 -18
- data/Manifest.txt +5 -1
- data/README.rdoc +40 -17
- data/Rakefile +3 -3
- data/examples/{Equation_of_Time.jpg → Equation_of_Time.png} +0 -0
- data/examples/my_lst.rb +3 -1
- data/ext/eot/ceot.c +31 -6
- data/ext/eot/ceot.h +4 -0
- data/ext/eot/eot.c +19 -0
- data/lib/eot.rb +12 -10
- data/lib/eot/angle_displays.rb +3 -20
- data/lib/eot/angles.rb +39 -19
- data/lib/eot/constants.rb +2 -1
- data/lib/eot/deltas.rb +1 -0
- data/lib/eot/geo_lat_lng_smt.rb +1 -2
- data/lib/eot/init.rb +41 -35
- data/lib/eot/time_displays.rb +21 -4
- data/lib/eot/times.rb +37 -65
- data/lib/eot/trigonometric.rb +7 -7
- data/lib/eot/utilities.rb +15 -2
- data/lib/eot/version.rb +3 -1
- data/run_tests_eclipse.rb +1 -0
- data/test/eot/aliased_angles_spec.rb +45 -43
- data/test/eot/aliased_displays_spec.rb +10 -9
- data/test/eot/aliased_utilities_spec.rb +15 -13
- data/test/eot/angles_spec.rb +130 -127
- data/test/eot/constants_spec.rb +2 -1
- data/test/eot/displays_spec.rb +54 -51
- data/test/eot/geo_spec.rb +5 -5
- data/test/eot/init_spec.rb +4 -4
- data/test/eot/times_spec.rb +127 -65
- metadata +42 -59
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -1
- metadata.gz.sig +0 -0
data/lib/eot/angles.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
# class Eot file = angles.rb
|
2
|
+
# methods for non delta angle calculations
|
2
3
|
class Eot
|
3
|
-
include Math
|
4
4
|
# From angles.rb:
|
5
5
|
# Apparent solar longitude = true longitude - aberation
|
6
6
|
def al_sun
|
7
|
-
Celes.anp(al(@ma, @ta,
|
7
|
+
Celes.anp(al(@ma, @ta, omega))
|
8
8
|
end
|
9
9
|
alias_method :apparent_longitude, :al_sun
|
10
10
|
alias_method :alsun, :al_sun
|
@@ -20,8 +20,7 @@ class Eot
|
|
20
20
|
# From angles.rb:
|
21
21
|
# solar declination
|
22
22
|
def dec_sun
|
23
|
-
|
24
|
-
sin(al(@ma, @ta, Celes.faom03(@ta))))
|
23
|
+
sun_dec(al_sun, to_earth)
|
25
24
|
end
|
26
25
|
alias_method :declination, :dec_sun
|
27
26
|
|
@@ -37,10 +36,17 @@ class Eot
|
|
37
36
|
# equation of equinox
|
38
37
|
# used for true longitude of Aries
|
39
38
|
# Depricated by Celes.gst06a()
|
39
|
+
# compinents are still used
|
40
|
+
# see: #cosine_to_earth and #angle_delta_psi
|
40
41
|
def eq_of_equinox
|
41
|
-
|
42
|
-
|
43
|
-
|
42
|
+
Celes.ee06a(@ajd, 0.0)
|
43
|
+
end
|
44
|
+
|
45
|
+
# From angles.rb:
|
46
|
+
# Earth rotation angle (for comparison to tl_aries
|
47
|
+
# which uses gmst06)
|
48
|
+
def era
|
49
|
+
Celes.era00(@ajd, 0.0)
|
44
50
|
end
|
45
51
|
|
46
52
|
# From angles.rb:
|
@@ -50,17 +56,30 @@ class Eot
|
|
50
56
|
ml(@ta)
|
51
57
|
end
|
52
58
|
alias_method :geometric_mean_longitude, :gml_sun
|
59
|
+
alias_method :ml_sun, :gml_sun
|
60
|
+
|
61
|
+
# From angles.rb:
|
62
|
+
# used by ha_sun method
|
63
|
+
# to select rise set and civil, nautical, astronomical twilights.
|
64
|
+
def choice(c)
|
65
|
+
case c
|
66
|
+
when 1
|
67
|
+
return 90.8333 # Sunrise and Sunset
|
68
|
+
when 2
|
69
|
+
return 96 # Civil Twilight
|
70
|
+
when 3
|
71
|
+
return 102 # Nautical Twilight
|
72
|
+
when 4
|
73
|
+
return 108 # Astronomical Twilight
|
74
|
+
end
|
75
|
+
end
|
53
76
|
|
54
77
|
# From angles.rb:
|
55
78
|
# horizon angle for provided geo coordinates
|
56
|
-
# used for angles from transit to horizons
|
57
|
-
def ha_sun
|
58
|
-
zenith
|
59
|
-
|
60
|
-
bottom = cos_dec_sun(dec_sun) * cos_lat(@latitude * D2R)
|
61
|
-
t_cosine = top / bottom
|
62
|
-
t_cosine > 1.0 || t_cosine < -1.0 ? cos = 1.0 : cos = t_cosine
|
63
|
-
acos(cos)
|
79
|
+
# used for angles from transit to horizons.
|
80
|
+
def ha_sun(c)
|
81
|
+
zenith = choice(c)
|
82
|
+
sun(zenith, dec_sun, @latitude)
|
64
83
|
end
|
65
84
|
alias_method :horizon_angle, :ha_sun
|
66
85
|
|
@@ -106,9 +125,10 @@ class Eot
|
|
106
125
|
# From angles.rb:
|
107
126
|
# solar right ascension
|
108
127
|
def ra_sun
|
109
|
-
y0 =
|
110
|
-
|
111
|
-
Celes.anp(PI + atan2(-y0, -
|
128
|
+
y0 = sine_al_sun * cosine_to_earth
|
129
|
+
ra = sun_ra(y0, cosine_al_sun)
|
130
|
+
# Celes.anp(PI + atan2(-y0, -cosine_al_sun))
|
131
|
+
Celes.anp(PI + ra)
|
112
132
|
end
|
113
133
|
alias_method :right_ascension, :ra_sun
|
114
134
|
|
@@ -143,7 +163,7 @@ class Eot
|
|
143
163
|
# From angles.rb:
|
144
164
|
# true obliquity considers nutation
|
145
165
|
def to_earth
|
146
|
-
|
166
|
+
mo_earth + angle_delta_epsilon
|
147
167
|
end
|
148
168
|
alias_method :obliquity_correction, :to_earth
|
149
169
|
alias_method :true_obliquity, :to_earth
|
data/lib/eot/constants.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# class Eot file = constants.rb
|
2
|
+
# has the constants used and more
|
2
3
|
class Eot
|
3
4
|
# Array result for time_julian_century default = [0.0, 0.0, 0.0, 0.0, 0.0]
|
4
5
|
# A2000 = [0.0, 0.0, 0.0, 0.0, 0.0]
|
@@ -121,7 +122,7 @@ class Eot
|
|
121
122
|
|
122
123
|
# Julian Date of Modified Julian Date zero
|
123
124
|
# 1858, 11, 17, 0.0 midnight start of calendar reform = 2400000.5
|
124
|
-
# MJD0 = 2400000.5
|
125
|
+
# MJD0 = 2400000.5
|
125
126
|
|
126
127
|
# from desktop calculator PI = 3.1415926535897932384626433832795
|
127
128
|
PI = 3.1415926535897932384626433832795
|
data/lib/eot/deltas.rb
CHANGED
data/lib/eot/geo_lat_lng_smt.rb
CHANGED
data/lib/eot/init.rb
CHANGED
@@ -1,67 +1,71 @@
|
|
1
1
|
# class Eot file = int.rb
|
2
|
+
# attributes, a setter and init method
|
2
3
|
class Eot
|
3
4
|
# From init.rb:
|
4
|
-
# address
|
5
|
+
# address is a String ex: "houston, tx"
|
5
6
|
attr_accessor :addr
|
6
7
|
|
7
8
|
# From init.rb:
|
8
|
-
# Astronomical Julian Day Number
|
9
|
-
#
|
10
|
-
#
|
11
|
-
|
9
|
+
# Astronomical Julian Day Number
|
10
|
+
# instance of Float class.
|
11
|
+
# ajd or jd. Use ajd for time now and jd for noon
|
12
|
+
# init sets ajd = DateTime.now.to_time.utc.to_datetime.jd.to_f
|
13
|
+
attr_accessor :ajd
|
12
14
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
15
|
+
# From init.rb
|
16
|
+
# method to reset ma and ta after initialization
|
17
|
+
# init sets them using ajd initial Float value
|
18
|
+
# see: :ajd attribute
|
19
|
+
def ma_ta_set
|
20
|
+
@ta = ((@ajd - DJ00) / DJC).to_f
|
21
|
+
@ma = Celes.falp03(@ta)
|
17
22
|
end
|
18
23
|
|
19
24
|
# From init.rb:
|
20
|
-
#
|
21
|
-
#
|
25
|
+
# Date
|
26
|
+
# instance of DateTime class
|
27
|
+
# initialized to = ajd_to_datetime(@ajd)
|
22
28
|
attr_accessor :date
|
23
29
|
|
24
30
|
# From init.rb:
|
25
|
-
# Julian Day Number
|
26
|
-
#
|
31
|
+
# Julian Day Number
|
32
|
+
# instance of Float class
|
33
|
+
# initialized to = ajd
|
27
34
|
attr_accessor :jd
|
28
35
|
|
29
36
|
# From init.rb:
|
30
|
-
# Latitude input
|
31
|
-
#
|
32
|
-
#
|
37
|
+
# Latitude input
|
38
|
+
# instance of Float class
|
39
|
+
# initialized to = 0.0
|
33
40
|
attr_accessor :latitude
|
34
41
|
|
35
42
|
# From init.rb:
|
36
|
-
# Longitude input
|
37
|
-
#
|
38
|
-
#
|
43
|
+
# Longitude input
|
44
|
+
# instance of Float class
|
45
|
+
# initialized to = 0.0
|
39
46
|
attr_accessor :longitude
|
40
47
|
|
41
48
|
# From init.rb:
|
42
|
-
#
|
43
|
-
#
|
44
|
-
#
|
49
|
+
# Julian Century gets called often
|
50
|
+
# instance of Float class
|
51
|
+
# ta = (( @ajd - DJ00 ) / DJC).to_f
|
45
52
|
attr_accessor :ta
|
46
53
|
|
47
54
|
# From init.rb:
|
48
|
-
# Mean Anomaly gets called
|
49
|
-
#
|
55
|
+
# Mean Anomaly gets called often
|
56
|
+
# instance of Float class
|
57
|
+
# ma = Celes.falp03(@ta) see: celes gem
|
50
58
|
attr_accessor :ma
|
51
59
|
|
52
60
|
# From init.rb:
|
53
61
|
# Initialize to set attributes
|
54
|
-
# You may use GeoLatLng to set up @latitude and @longitude
|
55
62
|
def initialize
|
56
|
-
|
57
|
-
|
58
|
-
@
|
59
|
-
|
60
|
-
@date, @jd = ajd_to_datetime(@ajd), @ajd
|
61
|
-
@
|
62
|
-
# queries could excede quotas or you get disconnected.
|
63
|
-
@geo.lat.zero? ? @latitude = 0.0 : @latitude = @geo.lat
|
64
|
-
@geo.lng.zero? ? @longitude = 0.0 : @longitude = @geo.lng
|
63
|
+
d = DateTime.now.to_time.utc.to_datetime
|
64
|
+
djm0, djm = Celes::cal2jd(d.year, d.month, d.day + d.day_fraction)
|
65
|
+
@ajd = djm0 + djm + 0.5
|
66
|
+
ma_ta_set
|
67
|
+
@date, @jd = ajd_to_datetime(@ajd), @ajd
|
68
|
+
@latitude, @longitude = 0.0, 0.0
|
65
69
|
end
|
66
70
|
end
|
67
71
|
|
@@ -79,8 +83,10 @@ if __FILE__ == $PROGRAM_NAME
|
|
79
83
|
p eot.addr
|
80
84
|
p eot.latitude
|
81
85
|
p eot.longitude
|
86
|
+
list = eot.public_methods(false).sort
|
87
|
+
list.each { |i| puts i.to_sym }
|
82
88
|
spec = File.expand_path('../../../test/eot', __FILE__)
|
83
89
|
$LOAD_PATH.unshift(spec) unless $LOAD_PATH.include?(spec)
|
84
90
|
require 'init_spec'
|
85
|
-
|
91
|
+
# bundle exec rake
|
86
92
|
end
|
data/lib/eot/time_displays.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# class Eot file = time_displays.rb
|
2
|
+
# methods for time displays
|
2
3
|
class Eot
|
3
4
|
# From displays.rb
|
4
5
|
# String formatter for + and - time
|
@@ -24,14 +25,24 @@ class Eot
|
|
24
25
|
h = Integer(fraction * DAY_HOURS)
|
25
26
|
m = Integer((fraction - h / DAY_HOURS) * DAY_MINUTES)
|
26
27
|
s = Integer((fraction - h / 24.0 - m / DAY_MINUTES) * DAY_SECONDS)
|
27
|
-
format('%02d', h)
|
28
|
-
':'
|
28
|
+
format('%02d:', h) +
|
29
|
+
# ':' +
|
29
30
|
format('%02d', m) +
|
30
|
-
|
31
|
+
':' +
|
31
32
|
format('%02d', s)
|
32
33
|
end
|
33
34
|
alias_method :julian_period_day_fraction_to_time, :string_day_fraction_to_time
|
34
35
|
|
36
|
+
# From displays.rb
|
37
|
+
# radians to time method
|
38
|
+
def string_deg_to_time(radians = 0.0)
|
39
|
+
radians.nil? ? radians = 0.0 : radians
|
40
|
+
s, ihmsf = Celes.a2tf(3, radians)
|
41
|
+
f_string(s, ihmsf[0], ihmsf[1], ihmsf[2], ihmsf[3])
|
42
|
+
end
|
43
|
+
|
44
|
+
# From displays.rb
|
45
|
+
# displays + or - sign
|
35
46
|
def sign_min(min)
|
36
47
|
if min < 0.0
|
37
48
|
sign = '-'
|
@@ -65,6 +76,8 @@ class Eot
|
|
65
76
|
end
|
66
77
|
alias_method :jd_to_date_string, :string_jd_to_date
|
67
78
|
|
79
|
+
# From displays.rb
|
80
|
+
# formats time components
|
68
81
|
def format_time(h, m, s, ds)
|
69
82
|
format('%02d', h) +
|
70
83
|
':' +
|
@@ -75,8 +88,10 @@ class Eot
|
|
75
88
|
format('%3.3d', ds)
|
76
89
|
end
|
77
90
|
|
91
|
+
# From displays.rb
|
92
|
+
# creates [h,m,s,ds] array from Time or DateTime
|
78
93
|
def dt_parts(val)
|
79
|
-
h
|
94
|
+
h = val.hour
|
80
95
|
m = val.min
|
81
96
|
s = val.sec
|
82
97
|
is = Integer(s)
|
@@ -84,6 +99,8 @@ class Eot
|
|
84
99
|
[h, m, is, ds]
|
85
100
|
end
|
86
101
|
|
102
|
+
# From displays.rb
|
103
|
+
# creates [h,m,s,ds] from hours Float
|
87
104
|
def float_parts(val)
|
88
105
|
hours = Integer(val % DAY_HOURS)
|
89
106
|
mins = 60.0 * (val % DAY_HOURS - hours)
|
data/lib/eot/times.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# class Eot file = times.rb
|
2
|
+
# methods calculating times
|
2
3
|
class Eot
|
3
4
|
# From times.rb:
|
4
5
|
# Pass in an AJD number
|
@@ -9,104 +10,75 @@ class Eot
|
|
9
10
|
|
10
11
|
# From times.rb:
|
11
12
|
# Uses @ajd attribute
|
12
|
-
# Returns
|
13
|
-
def
|
14
|
-
|
13
|
+
# Returns astronomical twilight end as a DateTime
|
14
|
+
def astronomical_twilight_end_dt
|
15
|
+
ajd_to_datetime(astronomical_twilight_end_jd)
|
15
16
|
end
|
16
17
|
|
17
18
|
# From times.rb:
|
18
|
-
# Uses @ajd
|
19
|
-
# Returns
|
20
|
-
def
|
21
|
-
ajd_to_datetime(
|
22
|
-
end
|
23
|
-
|
24
|
-
# From times.rb:
|
25
|
-
# Uses @ajd and @longitude attributes
|
26
|
-
# Returns DateTime object of local mean noon or solar transit
|
27
|
-
def mean_local_noon_dt
|
28
|
-
ajd_to_datetime(@ajd - @longitude / 360.0)
|
29
|
-
end
|
30
|
-
|
31
|
-
# From times.rb:
|
32
|
-
# sets @ajd to DateTime.now
|
33
|
-
# Returns EOT (equation of time) now in decimal minutes form
|
34
|
-
def now
|
35
|
-
@ajd = DateTime.now.to_time.utc.to_datetime.ajd
|
36
|
-
@ta = (@ajd - DJ00) / DJC
|
37
|
-
time_eot
|
19
|
+
# Uses @ajd attribute
|
20
|
+
# Returns astronomical twilight start as a DateTime
|
21
|
+
def astronomical_twilight_start_dt
|
22
|
+
ajd_to_datetime(astronomical_twilight_start_jd)
|
38
23
|
end
|
39
24
|
|
40
25
|
# From times.rb:
|
41
26
|
# Uses @ajd attribute
|
42
|
-
# Returns
|
43
|
-
def
|
44
|
-
ajd_to_datetime(
|
27
|
+
# Returns civil twilight end as a DateTime
|
28
|
+
def civil_twilight_end_dt
|
29
|
+
ajd_to_datetime(civil_twilight_end_jd)
|
45
30
|
end
|
46
31
|
|
47
32
|
# From times.rb:
|
48
33
|
# Uses @ajd attribute
|
49
|
-
# Returns
|
50
|
-
def
|
51
|
-
|
34
|
+
# Returns civil twilight start as a DateTime
|
35
|
+
def civil_twilight_start_dt
|
36
|
+
ajd_to_datetime(civil_twilight_start_jd)
|
52
37
|
end
|
53
38
|
|
54
39
|
# From times.rb:
|
55
|
-
# Uses @ajd
|
56
|
-
# Returns
|
57
|
-
def
|
58
|
-
ajd_to_datetime(
|
40
|
+
# Uses @ajd and @longitude attributes
|
41
|
+
# Returns DateTime object of local noon or solar transit
|
42
|
+
def local_noon_dt
|
43
|
+
ajd_to_datetime(mean_local_noon_jd - eot_jd)
|
59
44
|
end
|
60
45
|
|
61
46
|
# From times.rb:
|
62
47
|
# Uses @ajd attribute
|
63
|
-
# Returns
|
64
|
-
def
|
65
|
-
|
48
|
+
# Returns nautical twilight end as a DateTime
|
49
|
+
def nautical_twilight_end_dt
|
50
|
+
ajd_to_datetime(nautical_twilight_end_jd)
|
66
51
|
end
|
67
52
|
|
68
53
|
# From times.rb:
|
69
54
|
# Uses @ajd attribute
|
70
|
-
# Returns
|
71
|
-
def
|
72
|
-
(
|
55
|
+
# Returns nautical twilight start as a DateTime
|
56
|
+
def nautical_twilight_start_dt
|
57
|
+
ajd_to_datetime(nautical_twilight_start_jd)
|
73
58
|
end
|
74
59
|
|
75
60
|
# From times.rb:
|
76
|
-
#
|
77
|
-
# Returns
|
78
|
-
def
|
79
|
-
|
61
|
+
# sets @ajd to DateTime.now
|
62
|
+
# Returns EOT (equation of time) now in decimal minutes form
|
63
|
+
def now
|
64
|
+
@ajd = DateTime.now.to_time.utc.to_datetime.ajd
|
65
|
+
@ta = (@ajd - DJ00) / DJC
|
66
|
+
time_eot
|
80
67
|
end
|
81
68
|
|
82
69
|
# From times.rb:
|
83
70
|
# Uses @ajd attribute
|
84
|
-
# Returns
|
85
|
-
def
|
86
|
-
|
71
|
+
# Returns a DateTime object of local sunrise
|
72
|
+
def sunrise_dt
|
73
|
+
ajd_to_datetime(sunrise_jd)
|
87
74
|
end
|
88
75
|
|
89
76
|
# From times.rb:
|
90
|
-
#
|
91
|
-
#
|
92
|
-
|
93
|
-
|
94
|
-
# Deprecated
|
95
|
-
def time_julian_century
|
96
|
-
t1 = (@ajd - DJ00) / DJC
|
97
|
-
# t2 = t1 * t1
|
98
|
-
# t3 = t1 * t2
|
99
|
-
# t4 = t2 * t2
|
100
|
-
# t5 = t2 * t3
|
101
|
-
# t6 = t3 * t3
|
102
|
-
# t7 = t3 * t4
|
103
|
-
# t8 = t4 * t4
|
104
|
-
# t9 = t4 * t5
|
105
|
-
# t10 = t5 * t5
|
106
|
-
# @ta = [ t1, t2, t3, t4, t5, t6, t7, t8, t9, t10 ]
|
107
|
-
@ta = t1
|
77
|
+
# Uses @ajd attribute
|
78
|
+
# Returns a DateTime object of local sunset
|
79
|
+
def sunset_dt
|
80
|
+
ajd_to_datetime(sunset_jd)
|
108
81
|
end
|
109
|
-
alias_method :time_julian_centurey, :time_julian_century
|
110
82
|
end
|
111
83
|
|
112
84
|
if __FILE__ == $PROGRAM_NAME
|