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