equationoftime 3.0.0 → 4.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.
- checksums.yaml +4 -4
- data/.buildpath +5 -0
- data/.project +17 -0
- data/.rvmrc +1 -0
- data/.settings/org.eclipse.ltk.core.refactoring.prefs +2 -0
- data/Makefile +238 -0
- data/Rakefile +40 -3
- data/analemma_data.yml +2925 -0
- data/equationoftime.gemspec +6 -3
- data/examples/analemma_data_generator.rb +12 -12
- data/examples/celes_parts/.RUBYARCHDIR.time +0 -0
- data/examples/celes_parts/.cproject +56 -0
- data/examples/celes_parts/.project +78 -0
- data/examples/celes_parts/a2af.c +120 -0
- data/examples/celes_parts/a2tf.c +116 -0
- data/examples/celes_parts/af2a.c +107 -0
- data/examples/celes_parts/anp.c +82 -0
- data/examples/celes_parts/anpm.c +82 -0
- data/examples/celes_parts/bi00.c +116 -0
- data/examples/celes_parts/bp00.c +173 -0
- data/examples/celes_parts/bp06.c +136 -0
- data/examples/celes_parts/bpn2xy.c +100 -0
- data/examples/celes_parts/c2i00a.c +139 -0
- data/examples/celes_parts/c2i00b.c +139 -0
- data/examples/celes_parts/c2i06a.c +136 -0
- data/examples/celes_parts/c2ibpn.c +142 -0
- data/examples/celes_parts/c2ixy.c +131 -0
- data/examples/celes_parts/c2ixys.c +123 -0
- data/examples/celes_parts/c2s.c +96 -0
- data/examples/celes_parts/c2t00a.c +154 -0
- data/examples/celes_parts/c2t00b.c +150 -0
- data/examples/celes_parts/c2t06a.c +152 -0
- data/examples/celes_parts/c2tcio.c +122 -0
- data/examples/celes_parts/c2teqx.c +122 -0
- data/examples/celes_parts/c2tpe.c +167 -0
- data/examples/celes_parts/c2txy.c +159 -0
- data/examples/celes_parts/cal2jd.c +139 -0
- data/examples/celes_parts/celes_core.c +2522 -0
- data/examples/celes_parts/cp.c +80 -0
- data/examples/celes_parts/cpv.c +82 -0
- data/examples/celes_parts/cr.c +83 -0
- data/examples/celes_parts/d2dtf.c +206 -0
- data/examples/celes_parts/d2tf.c +160 -0
- data/examples/celes_parts/dat.c +289 -0
- data/examples/celes_parts/depend +25 -0
- data/examples/celes_parts/dtdb.c +1213 -0
- data/examples/celes_parts/dtf2d.c +196 -0
- data/examples/celes_parts/ee00.c +128 -0
- data/examples/celes_parts/ee00a.c +135 -0
- data/examples/celes_parts/ee00b.c +141 -0
- data/examples/celes_parts/ee06a.c +122 -0
- data/examples/celes_parts/eect00.c +282 -0
- data/examples/celes_parts/eform.c +147 -0
- data/examples/celes_parts/eo06a.c +131 -0
- data/examples/celes_parts/eors.c +108 -0
- data/examples/celes_parts/epb.c +96 -0
- data/examples/celes_parts/epb2jd.c +91 -0
- data/examples/celes_parts/epj.c +93 -0
- data/examples/celes_parts/epj2jd.c +91 -0
- data/examples/celes_parts/epv00.c +2589 -0
- data/examples/celes_parts/eqeq94.c +131 -0
- data/examples/celes_parts/era00.c +136 -0
- data/examples/celes_parts/extconf.rb +4 -0
- data/examples/celes_parts/fad03.c +103 -0
- data/examples/celes_parts/fae03.c +102 -0
- data/examples/celes_parts/faf03.c +106 -0
- data/examples/celes_parts/faju03.c +102 -0
- data/examples/celes_parts/fal03.c +103 -0
- data/examples/celes_parts/falp03.c +103 -0
- data/examples/celes_parts/fama03.c +102 -0
- data/examples/celes_parts/fame03.c +102 -0
- data/examples/celes_parts/fane03.c +99 -0
- data/examples/celes_parts/faom03.c +104 -0
- data/examples/celes_parts/fapa03.c +103 -0
- data/examples/celes_parts/fasa03.c +102 -0
- data/examples/celes_parts/faur03.c +99 -0
- data/examples/celes_parts/fave03.c +102 -0
- data/examples/celes_parts/fk52h.c +143 -0
- data/examples/celes_parts/fk5hip.c +126 -0
- data/examples/celes_parts/fk5hz.c +160 -0
- data/examples/celes_parts/fw2m.c +134 -0
- data/examples/celes_parts/fw2xy.c +120 -0
- data/examples/celes_parts/gc2gd.c +134 -0
- data/examples/celes_parts/gc2gde.c +200 -0
- data/examples/celes_parts/gd2gc.c +134 -0
- data/examples/celes_parts/gd2gce.c +138 -0
- data/examples/celes_parts/gmst00.c +145 -0
- data/examples/celes_parts/gmst06.c +136 -0
- data/examples/celes_parts/gmst82.c +151 -0
- data/examples/celes_parts/gst00a.c +138 -0
- data/examples/celes_parts/gst00b.c +146 -0
- data/examples/celes_parts/gst06.c +140 -0
- data/examples/celes_parts/gst06a.c +131 -0
- data/examples/celes_parts/gst94.c +131 -0
- data/examples/celes_parts/h2fk5.c +148 -0
- data/examples/celes_parts/hfk5z.c +175 -0
- data/examples/celes_parts/ir.c +83 -0
- data/examples/celes_parts/jd2cal.c +155 -0
- data/examples/celes_parts/jdcalf.c +161 -0
- data/examples/celes_parts/num00a.c +121 -0
- data/examples/celes_parts/num00b.c +121 -0
- data/examples/celes_parts/num06a.c +125 -0
- data/examples/celes_parts/numat.c +109 -0
- data/examples/celes_parts/nut00a.c +2047 -0
- data/examples/celes_parts/nut00b.c +372 -0
- data/examples/celes_parts/nut06a.c +153 -0
- data/examples/celes_parts/nut80.c +325 -0
- data/examples/celes_parts/nutm80.c +117 -0
- data/examples/celes_parts/obl06.c +118 -0
- data/examples/celes_parts/obl80.c +118 -0
- data/examples/celes_parts/p06e.c +321 -0
- data/examples/celes_parts/p2pv.c +83 -0
- data/examples/celes_parts/p2s.c +91 -0
- data/examples/celes_parts/pap.c +139 -0
- data/examples/celes_parts/pas.c +96 -0
- data/examples/celes_parts/pb06.c +144 -0
- data/examples/celes_parts/pdp.c +84 -0
- data/examples/celes_parts/pfw06.c +165 -0
- data/examples/celes_parts/plan94.c +514 -0
- data/examples/celes_parts/pm.c +83 -0
- data/examples/celes_parts/pmat00.c +118 -0
- data/examples/celes_parts/pmat06.c +122 -0
- data/examples/celes_parts/pmat76.c +141 -0
- data/examples/celes_parts/pmp.c +85 -0
- data/examples/celes_parts/pn.c +109 -0
- data/examples/celes_parts/pn00.c +177 -0
- data/examples/celes_parts/pn00a.c +162 -0
- data/examples/celes_parts/pn00b.c +162 -0
- data/examples/celes_parts/pn06.c +187 -0
- data/examples/celes_parts/pn06a.c +152 -0
- data/examples/celes_parts/pnm00a.c +121 -0
- data/examples/celes_parts/pnm00b.c +121 -0
- data/examples/celes_parts/pnm06a.c +124 -0
- data/examples/celes_parts/pnm80.c +126 -0
- data/examples/celes_parts/pom00.c +115 -0
- data/examples/celes_parts/ppp.c +85 -0
- data/examples/celes_parts/ppsp.c +94 -0
- data/examples/celes_parts/pr00.c +142 -0
- data/examples/celes_parts/prec76.c +148 -0
- data/examples/celes_parts/pv2p.c +81 -0
- data/examples/celes_parts/pv2s.c +144 -0
- data/examples/celes_parts/pvdpv.c +102 -0
- data/examples/celes_parts/pvm.c +86 -0
- data/examples/celes_parts/pvmpv.c +87 -0
- data/examples/celes_parts/pvppv.c +87 -0
- data/examples/celes_parts/pvstar.c +207 -0
- data/examples/celes_parts/pvu.c +93 -0
- data/examples/celes_parts/pvup.c +88 -0
- data/examples/celes_parts/pvxpv.c +107 -0
- data/examples/celes_parts/pxp.c +94 -0
- data/examples/celes_parts/rm2v.c +111 -0
- data/examples/celes_parts/rv2m.c +118 -0
- data/examples/celes_parts/rx.c +110 -0
- data/examples/celes_parts/rxp.c +99 -0
- data/examples/celes_parts/rxpv.c +86 -0
- data/examples/celes_parts/rxr.c +99 -0
- data/examples/celes_parts/ry.c +110 -0
- data/examples/celes_parts/rz.c +110 -0
- data/examples/celes_parts/s00.c +371 -0
- data/examples/celes_parts/s00a.c +143 -0
- data/examples/celes_parts/s00b.c +143 -0
- data/examples/celes_parts/s06.c +368 -0
- data/examples/celes_parts/s06a.c +145 -0
- data/examples/celes_parts/s2c.c +85 -0
- data/examples/celes_parts/s2p.c +88 -0
- data/examples/celes_parts/s2pv.c +103 -0
- data/examples/celes_parts/s2xpv.c +87 -0
- data/examples/celes_parts/sepp.c +105 -0
- data/examples/celes_parts/seps.c +93 -0
- data/examples/celes_parts/sofa.h +379 -0
- data/examples/celes_parts/sofam.h +155 -0
- data/examples/celes_parts/sp00.c +118 -0
- data/examples/celes_parts/starpm.c +205 -0
- data/examples/celes_parts/starpv.c +264 -0
- data/examples/celes_parts/sxp.c +84 -0
- data/examples/celes_parts/sxpv.c +85 -0
- data/examples/celes_parts/taitt.c +110 -0
- data/examples/celes_parts/taiut1.c +112 -0
- data/examples/celes_parts/taiutc.c +182 -0
- data/examples/celes_parts/tcbtdb.c +132 -0
- data/examples/celes_parts/tcgtt.c +109 -0
- data/examples/celes_parts/tdbtcb.c +137 -0
- data/examples/celes_parts/tdbtt.c +122 -0
- data/examples/celes_parts/test_celes.rb +48 -0
- data/examples/celes_parts/tf2a.c +107 -0
- data/examples/celes_parts/tf2d.c +107 -0
- data/examples/celes_parts/tr.c +93 -0
- data/examples/celes_parts/trxp.c +93 -0
- data/examples/celes_parts/trxpv.c +93 -0
- data/examples/celes_parts/tttai.c +110 -0
- data/examples/celes_parts/tttcg.c +112 -0
- data/examples/celes_parts/tttdb.c +121 -0
- data/examples/celes_parts/ttut1.c +110 -0
- data/examples/celes_parts/ut1tai.c +111 -0
- data/examples/celes_parts/ut1tt.c +110 -0
- data/examples/celes_parts/ut1utc.c +193 -0
- data/examples/celes_parts/utctai.c +163 -0
- data/examples/celes_parts/utcut1.c +151 -0
- data/examples/celes_parts/xy06.c +2758 -0
- data/examples/celes_parts/xys00a.c +133 -0
- data/examples/celes_parts/xys00b.c +133 -0
- data/examples/celes_parts/xys06a.c +133 -0
- data/examples/celes_parts/zp.c +77 -0
- data/examples/celes_parts/zpv.c +79 -0
- data/examples/celes_parts/zr.c +83 -0
- data/examples/check_date_type.rb +2 -4
- data/examples/compare_geoc_long_ra.rb +19 -11
- data/examples/data_table_for_astro_dog.rb +40 -0
- data/examples/earth_rotation.rb +28 -3
- data/examples/eot.c +15 -0
- data/examples/eot.h +2 -0
- data/examples/eot_methods_list.rb +30 -3
- data/examples/eot_suntimes.rb +99 -95
- data/examples/extconf.rb +2 -0
- data/examples/{read_nutation_data.rb → gmst_gast_non_sofa.rb} +103 -98
- data/examples/nutation_table5_3a.yaml +1658 -1658
- data/examples/rbeot.c +24 -0
- data/examples/test_eot.rb +17 -0
- data/examples/test_poly_eval.rb +6 -17
- data/examples/time_scales.rb +4 -7
- data/examples/times_year.rb +50 -0
- data/examples/usage_example.rb +15 -5
- data/examples/use_angles.rb +151 -87
- data/lib/eot/angles.rb +130 -177
- data/lib/eot/constants.rb +41 -44
- data/lib/eot/displays.rb +40 -37
- data/lib/eot/geo_lat_lng_smt.rb +7 -6
- data/lib/eot/init.rb +62 -39
- data/lib/eot/nutation.rb +53 -45
- data/lib/eot/times.rb +32 -41
- data/lib/eot/utilities.rb +11 -90
- data/lib/eot/version.rb +3 -2
- data/rise_set_data.yml +1461 -0
- data/run_tests_eclipse.rb +1 -0
- data/tests/minitest/aliased_angles_spec.rb +119 -165
- data/tests/minitest/aliased_displays_spec.rb +41 -39
- data/tests/minitest/aliased_utilities_spec.rb +11 -22
- data/tests/minitest/angles_spec.rb +134 -181
- data/tests/minitest/constants_spec.rb +4 -10
- data/tests/minitest/delta_epsilon_spec.rb +13 -16
- data/tests/minitest/displays_spec.rb +39 -37
- data/tests/minitest/geo_spec.rb +15 -11
- data/tests/minitest/init_spec.rb +30 -16
- data/tests/minitest/nutation_spec.rb +19 -13
- data/tests/minitest/times_spec.rb +77 -75
- data/tests/minitest/utilities_spec.rb +10 -94
- data/wiki.md +7 -9
- metadata +218 -26
- data/examples/data_table.rb +0 -26
- data/lib/eot/nutation_table5_3a.yaml +0 -9532
- data/tests/minitest/aliased_times_spec.rb +0 -36
data/examples/rbeot.c
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
#include "ruby.h"
|
|
2
|
+
|
|
3
|
+
#ifndef DBL2NUM
|
|
4
|
+
# define DBL2NUM(dbl) rb_float_new(dbl)
|
|
5
|
+
#endif
|
|
6
|
+
|
|
7
|
+
VALUE cEot;
|
|
8
|
+
ID id_status;
|
|
9
|
+
|
|
10
|
+
static VALUE
|
|
11
|
+
ma_Sun(VALUE self, VALUE vt) {
|
|
12
|
+
|
|
13
|
+
rb_ivar_set(self, id_status, INT2FIX(0));
|
|
14
|
+
return DBL2NUM(maSun(NUM2DBL(vt)));
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
void
|
|
19
|
+
Init_rbeot(void) {
|
|
20
|
+
|
|
21
|
+
cEot = rb_define_class("EOT", rb_cObject);
|
|
22
|
+
id_status = rb_intern("@status");
|
|
23
|
+
rb_define_method(cEot, "ma", ma_Sun, 1);
|
|
24
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
require_relative 'rbeot'
|
|
2
|
+
require_relative '../lib/eot'
|
|
3
|
+
|
|
4
|
+
rbeot = EOT.new
|
|
5
|
+
eot = Eot.new
|
|
6
|
+
|
|
7
|
+
p eot.ta
|
|
8
|
+
p rbeot.ma(eot.ta)
|
|
9
|
+
#~ p eot.ma_Sun
|
|
10
|
+
|
|
11
|
+
require 'benchmark'
|
|
12
|
+
|
|
13
|
+
n = 5_000
|
|
14
|
+
Benchmark.bm do |x|
|
|
15
|
+
x.report("eot") { n.times { rbeot.ma(eot.ta) } }
|
|
16
|
+
#~ x.report("ruby") { n.times {eot.ma_Sun() } }
|
|
17
|
+
end
|
data/examples/test_poly_eval.rb
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
lib = File.expand_path('../../lib', __FILE__)
|
|
4
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
5
5
|
|
|
6
|
+
# From astro-algo gem
|
|
6
7
|
# class Array
|
|
7
8
|
# Evaluate polynomial using Horner's method.
|
|
8
9
|
# Array consists of coefficients of a polynomial, the
|
|
@@ -18,21 +19,9 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
|
18
19
|
# end
|
|
19
20
|
# end
|
|
20
21
|
|
|
21
|
-
|
|
22
|
-
|
|
22
|
+
my_array = [1.0, -0.5, 3.0]
|
|
23
|
+
my_array.inject(0.0) {|sum, n| p sum * 2.0 + n }
|
|
23
24
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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 )
|
|
25
|
+
ecc = [-0.0000001235, -0.000042037, 0.016708617]
|
|
26
|
+
ta = 0.14
|
|
27
|
+
ecc.inject(0.0) {|sum, n| p sum * ta + n }
|
data/examples/time_scales.rb
CHANGED
|
@@ -11,13 +11,10 @@ eot = Eot.new
|
|
|
11
11
|
# puts eot.public_methods(false).sort
|
|
12
12
|
# puts eot.nil?
|
|
13
13
|
loop do
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
p date2 = DateTime.jd(ajd + 0.5)
|
|
19
|
-
sleep 0.7
|
|
20
|
-
puts
|
|
14
|
+
puts DateTime.now.to_time.utc.nsec.inspect
|
|
15
|
+
puts DateTime.jd(DateTime.now.to_time.utc.to_datetime.ajd + 0.5).to_time.nsec.inspect
|
|
16
|
+
sleep 0.7
|
|
17
|
+
puts
|
|
21
18
|
end
|
|
22
19
|
|
|
23
20
|
# puts Astro.solar_longitude(date)
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# a list of sunrise and sunset times for a year of dates.
|
|
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
|
+
require 'time'
|
|
9
|
+
|
|
10
|
+
eot = Eot.new
|
|
11
|
+
|
|
12
|
+
# set your latitude and longitude first.
|
|
13
|
+
eot.latitude = 41.9474
|
|
14
|
+
eot.longitude = -88.74467
|
|
15
|
+
|
|
16
|
+
# make some start and finish dates.
|
|
17
|
+
start = "2014-1-1"
|
|
18
|
+
finish = "2014-12-31"
|
|
19
|
+
|
|
20
|
+
start_time = Time.utc( 2014, "jan", 1, 12, 0, 0 )
|
|
21
|
+
finish_time = Time.utc( 2014, "dec", 31, 12, 0, 0 )
|
|
22
|
+
|
|
23
|
+
start_jd = Date.parse(start).jd
|
|
24
|
+
finish_jd = Date.parse(finish).jd
|
|
25
|
+
|
|
26
|
+
fstr = "%b %d"
|
|
27
|
+
|
|
28
|
+
@data, @group, @group_id = [], {}, 1
|
|
29
|
+
|
|
30
|
+
(start_jd..finish_jd).each do |jd|
|
|
31
|
+
# date = DateTime.jd(jd + 0.5).to_date
|
|
32
|
+
eot.ajd = jd
|
|
33
|
+
rise = eot.sunrise_dt().to_time.to_json
|
|
34
|
+
trans = eot.local_noon_dt().to_time.to_json
|
|
35
|
+
set = eot.sunset_dt().to_time.to_json
|
|
36
|
+
@group = { "id" => @group_id,
|
|
37
|
+
"rise" => rise,
|
|
38
|
+
"noon" => trans,
|
|
39
|
+
"sset" => set
|
|
40
|
+
}
|
|
41
|
+
@data << @group
|
|
42
|
+
@group_id += 1
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
file_path = "rise_set_data.yml"
|
|
46
|
+
File::open( file_path, "w" ) do |f|
|
|
47
|
+
YAML.dump( @data, f )
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
puts "File rise_set_data.yml processed"
|
data/examples/usage_example.rb
CHANGED
|
@@ -6,8 +6,18 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
|
6
6
|
require 'eot'
|
|
7
7
|
|
|
8
8
|
eot = Eot.new()
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
9
|
+
# find what the defaults are set to
|
|
10
|
+
show = <<RAN
|
|
11
|
+
ajd = #{eot.ajd}
|
|
12
|
+
date = #{eot.date}
|
|
13
|
+
jd = #{eot.jd}
|
|
14
|
+
longitude = #{eot.longitude}
|
|
15
|
+
latitude = #{eot.latitude}
|
|
16
|
+
sunrise = #{eot.sunrise_dt}
|
|
17
|
+
trnasit = #{eot.local_noon_dt}
|
|
18
|
+
min eot = #{eot.time_eot}
|
|
19
|
+
sunset = #{eot.sunset_dt}
|
|
20
|
+
gasa = #{eot.tl_Aries}
|
|
21
|
+
RAN
|
|
22
|
+
|
|
23
|
+
puts show
|
data/examples/use_angles.rb
CHANGED
|
@@ -6,150 +6,214 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
|
6
6
|
require 'eot'
|
|
7
7
|
|
|
8
8
|
|
|
9
|
-
file = <<
|
|
9
|
+
file = <<DISPLAY
|
|
10
10
|
|
|
11
|
-
This will explain how the equation of time is derived by showing
|
|
12
|
-
each method that comprises the formula.
|
|
11
|
+
This will explain how the equation of time is derived by showing each method that comprises the formula.
|
|
13
12
|
|
|
14
13
|
eot = Eot.new
|
|
15
|
-
#{eot = Eot.new}
|
|
16
14
|
|
|
17
|
-
|
|
15
|
+
Instance of Eot class eot = #{eot = Eot.new}
|
|
18
16
|
|
|
19
|
-
eot.ajd = Date.today.jd
|
|
20
|
-
#{eot.ajd = Date.today.jd}
|
|
21
|
-
The ajd has been set to #{eot.ajd}
|
|
22
17
|
|
|
18
|
+
Set the class attribute ajd for the deisired date ex : eot.ajd = Date.parse("yyyy, mm, dd").jd.to_f
|
|
23
19
|
|
|
24
|
-
|
|
20
|
+
eot.ajd = Date.today.jd.to_f
|
|
25
21
|
|
|
26
|
-
|
|
27
|
-
#{eot.ajd}
|
|
22
|
+
eot.ajd = #{eot.ajd = Date.today.jd.to_f}
|
|
28
23
|
|
|
24
|
+
The class attribute ajd has been set to a nice whole number even though it is a Float class now.
|
|
29
25
|
|
|
30
|
-
|
|
31
|
-
It is calculated as if the Earths orbit were circular.
|
|
26
|
+
The Astronomical Julian Day Number is a half day less than Julian Day Number with the fractional day time included when we DateTime class.
|
|
32
27
|
|
|
33
|
-
|
|
34
|
-
#{mu = eot.ma} deg.
|
|
28
|
+
DateTime.now.day_fraction.to_f = #{DateTime.now.day_fraction.to_f}
|
|
35
29
|
|
|
30
|
+
DateTime class has the method day_fraction and Date class does not.
|
|
31
|
+
|
|
32
|
+
We used Date class which doesn't give us the UTC time of date. It yields your time zone date.
|
|
33
|
+
|
|
34
|
+
Let's just prove this.
|
|
35
|
+
|
|
36
|
+
Date.today.to_time.utc = #{Date.today.to_time.utc}
|
|
37
|
+
|
|
38
|
+
It looks like that was your midnight in UTC time.
|
|
39
|
+
|
|
40
|
+
Maybe we could get away with getting the ajd from that.
|
|
41
|
+
|
|
42
|
+
Date.today.to_time.utc.to_date.ajd.to_f = #{Date.today.to_time.utc.to_date.ajd.to_f}
|
|
43
|
+
|
|
44
|
+
No. That's a half day less than the Julian Day Number.
|
|
45
|
+
|
|
46
|
+
So let's start over setting the adj correctly for UTC using the DateTime class.
|
|
47
|
+
|
|
48
|
+
eot.ajd = DateTime.now.to_time.utc.to_datetime.ajd.to_f
|
|
49
|
+
|
|
50
|
+
eot.ajd = #{eot.ajd = DateTime.now.to_time.utc.to_datetime.ajd.to_f}
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
Because this gem is going to calculate the sunrise and sunset times it's okay to set the day for noon and is encouraged.
|
|
54
|
+
|
|
55
|
+
So go ahead and set the ajd using the Date class and jd method as was first done.
|
|
56
|
+
|
|
57
|
+
The class init.rb sets everything to defaults and one of them is today's datetime.jd
|
|
58
|
+
|
|
59
|
+
But for right now we won't do that so we get current angles of the present time UTC.
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
eot.ma is the solar Mean anomaly mu(M) and is called quite often hence the attribute.
|
|
64
|
+
|
|
65
|
+
eot.ma was set using eot.ma_Sun() method.
|
|
66
|
+
|
|
67
|
+
It is an angle with respect to perihelion of Earth orbit around Sun in an assumed circular orbit.
|
|
68
|
+
|
|
69
|
+
M is calculated within the nutation.rb file under delta_equinox() method and returned as the third element of an array.
|
|
70
|
+
|
|
71
|
+
eot.ma = #{eot.ma}
|
|
72
|
+
|
|
73
|
+
eot.ma_Sun() = #{eot.ma_Sun()}
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
angle one = eot.ma_Sun() - eot.ta_Sun()
|
|
77
|
+
|
|
78
|
+
a1 = #{eot.ma_Sun() - eot.ta_Sun()} degrees
|
|
79
|
+
|
|
80
|
+
a1 is a delta angle difference for mean and true anomalies in degrees.
|
|
81
|
+
|
|
82
|
+
True anomaly (nu) is the actual angle with respect to perihelion in an eliptical orbit.
|
|
36
83
|
|
|
37
|
-
nu is the True anomaly. It is the actual angle with respect to perihelion in an eliptical orbit.
|
|
38
84
|
It was calculated by using the equation of center formula which you may access also.
|
|
39
85
|
|
|
40
|
-
|
|
41
|
-
#{eqc = eot.center()} deg.
|
|
86
|
+
eot.center() = #{eot.center()} degrees.
|
|
42
87
|
|
|
43
|
-
nu =
|
|
44
|
-
#{nu = eot.ta_Sun()} deg.
|
|
88
|
+
nu = equation of center + M or mu or mean anomaly
|
|
45
89
|
|
|
46
|
-
|
|
47
|
-
Notice it is counter sign of equation of center. It just may have taken longer to calculate.
|
|
90
|
+
The delta is M - nu.
|
|
48
91
|
|
|
49
|
-
delta_eccentric = mu - nu
|
|
50
|
-
#{delta_eccentric = mu - nu} deg.
|
|
51
92
|
|
|
52
|
-
The
|
|
93
|
+
The method inside the gem is called delta_orbit()
|
|
53
94
|
|
|
54
|
-
|
|
95
|
+
eot.delta_orbit = #{eot.delta_orbit} degrees
|
|
55
96
|
|
|
56
|
-
|
|
57
|
-
#{mean_longitude = eot.gml_Sun()} deg.
|
|
97
|
+
We could just change the sign of eot.center().
|
|
58
98
|
|
|
59
|
-
|
|
60
|
-
|
|
99
|
+
In fact let's just do that now. a1 = - eot.center()
|
|
100
|
+
|
|
101
|
+
- eot.center() = #{- eot.center()}
|
|
61
102
|
|
|
62
|
-
true longitude = mean longitude + equation of center
|
|
63
|
-
#{mean_longitude + eqc}
|
|
64
103
|
|
|
65
|
-
|
|
104
|
+
The next delta is calculated as follows.
|
|
66
105
|
|
|
67
|
-
|
|
68
|
-
#{lambda_1 = eot.tl_Sun(eot.time_julian_century())} deg
|
|
106
|
+
lambda or apparent longitude of the Sun minus alpha or right ascension of the Sun.
|
|
69
107
|
|
|
70
|
-
|
|
108
|
+
a2 = lambda - alpha
|
|
109
|
+
|
|
110
|
+
lambda = mean longitude + equation of center
|
|
71
111
|
|
|
72
|
-
|
|
73
|
-
|
|
112
|
+
eot.gml_Sun() + eot.center() = #{eot.gml_Sun() + eot.center()} or
|
|
113
|
+
|
|
114
|
+
eot.tl_Sun = #{eot.tl_Sun}
|
|
115
|
+
|
|
116
|
+
Lambda is the \"ecliptic coordinate system\" angle of the sun.
|
|
74
117
|
|
|
75
118
|
Alpha is the Right Ascension of the sun in the celestial coordinate system.
|
|
76
119
|
|
|
77
|
-
alpha = eot.ra_Sun(
|
|
78
|
-
|
|
120
|
+
alpha = eot.ra_Sun()
|
|
121
|
+
|
|
122
|
+
alpha = #{eot.ra_Sun()}
|
|
123
|
+
|
|
124
|
+
lambda - alpha = #{eot.tl_Sun - eot.ra_Sun()}
|
|
79
125
|
|
|
80
|
-
|
|
126
|
+
The method inside the gem is called delta_oblique.
|
|
81
127
|
|
|
82
|
-
|
|
83
|
-
#{delta_ecliptic = lambda_1 - alpha} deg.
|
|
128
|
+
eot.delta_oblique() = #{eot.delta_oblique()}
|
|
84
129
|
|
|
85
|
-
The method inside the gem is called angle_delta_oblique.
|
|
86
130
|
|
|
87
|
-
The sum of these two delta angles is
|
|
131
|
+
The sum of these two delta angles is the equation of time angle in degrees not time.
|
|
88
132
|
|
|
89
|
-
|
|
90
|
-
#{delta_total = delta_eccentric + delta_ecliptic} deg.
|
|
133
|
+
eot.eot() = #{eot.eot()}
|
|
91
134
|
|
|
92
135
|
That was for the time UTC now which was easy.
|
|
93
136
|
|
|
137
|
+
|
|
94
138
|
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
139
|
|
|
98
|
-
|
|
140
|
+
my longitude is -88.74467 deg. so I'll set the longitude attribute in Eot class.
|
|
99
141
|
|
|
100
|
-
|
|
101
|
-
#{mean_noon = 12 - my_longitude / 15.0} hr.
|
|
142
|
+
eot.longitude = #{eot.longitude = -88.74467}
|
|
102
143
|
|
|
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
144
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
145
|
+
So my mean solar transit UTC is 12.0 - my_longitude / 15.0
|
|
146
|
+
|
|
147
|
+
my_mean_noon = #{12.0 - -88.74467 / 15.0} hr.
|
|
148
|
+
|
|
149
|
+
Be sure to set everything for UTC noon before adding it to your longitude because we were doing angles for time now.
|
|
150
|
+
|
|
151
|
+
eot.ajd = #{eot.ajd = Date.today.jd.to_f}
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
Using the Eot class I may also compute it with eot.mean_local_noon_dt() method if I have the ajd set right.
|
|
156
|
+
|
|
157
|
+
eot.mean_local_noon_dt() = #{eot.mean_local_noon_dt()}
|
|
158
|
+
|
|
159
|
+
I'm showing what time mean noon for my_longitude normally is without the equation of time considered.
|
|
160
|
+
|
|
161
|
+
This time is true only four days a year. Lets get the right one for today to be sure.
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
We can add longitude plus equation of time as angles.
|
|
111
166
|
|
|
112
|
-
eot.
|
|
113
|
-
#{eot.mean_local_noon_dt()}
|
|
167
|
+
eot.longitude + eot.eot() = #{eot.longitude} + #{eot.eot()}
|
|
114
168
|
|
|
115
|
-
|
|
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.
|
|
169
|
+
What's the time of solar transit here now?
|
|
121
170
|
|
|
122
|
-
|
|
123
|
-
|
|
171
|
+
12.0 - (eot.longitude + eot.eot()) / 15.0 = #{12.0 - (eot.longitude + eot.eot()) / 15.0}
|
|
172
|
+
|
|
173
|
+
That looks about right.
|
|
124
174
|
|
|
125
|
-
delta_total = eot.eot()
|
|
126
|
-
#{delta_total = eot.eot()} min
|
|
127
175
|
|
|
128
|
-
Let us convert that to an angle.
|
|
129
176
|
|
|
130
|
-
|
|
131
|
-
#{delta_deg = delta_total / 4.0 * 360.0 / 360.98564736629} deg.
|
|
177
|
+
Let's make a time out of that by converting it to a fractional day.
|
|
132
178
|
|
|
133
|
-
|
|
179
|
+
(12.0 - (eot.longitude + eot.eot()) / 15.0) / 24.0 = #{(12.0 - (eot.longitude + eot.eot()) / 15.0) / 24.0}
|
|
180
|
+
|
|
181
|
+
We'll add that to the ajd then.
|
|
134
182
|
|
|
135
|
-
|
|
136
|
-
#{noon_angle = my_longitude + delta_deg}
|
|
183
|
+
ajd = Date.today.ajd.to_f
|
|
137
184
|
|
|
138
|
-
|
|
185
|
+
ajd = #{Date.today.ajd.to_f}
|
|
139
186
|
|
|
140
|
-
|
|
187
|
+
#{Date.today.ajd.to_f} + #{(12.0 - (eot.longitude + eot.eot()) / 15.0) / 24.0} = #{Date.today.ajd.to_f + (12.0 - (eot.longitude + eot.eot()) / 15.0) / 24.0}
|
|
141
188
|
|
|
142
|
-
12 - noon_angle / 15.0
|
|
143
|
-
#{12 - noon_angle / 15.0}
|
|
144
189
|
|
|
145
|
-
|
|
146
|
-
#{my_transit = eot.ajd + (12 - noon_angle / 15.0) / 24.0}
|
|
190
|
+
There is a method in Eot class to make that a DateTime object.
|
|
147
191
|
|
|
148
|
-
|
|
149
|
-
|
|
192
|
+
eot.ajd_to_datetime(ajd + transit)
|
|
193
|
+
|
|
194
|
+
#{eot.ajd_to_datetime(Date.today.ajd.to_f + (12.0 - (eot.longitude + eot.eot()) / 15.0) / 24.0)}
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
Be sure to set your latitude attribute as well when you want to compute sunrise and sunset times for the days of interest.
|
|
198
|
+
|
|
199
|
+
eot.latitude = my_latitude
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
Your longitude and the GHA of the Sun will match at True Solar Transit time.
|
|
203
|
+
|
|
204
|
+
Check it here http://douglasallen.github.io/planets/ just put in the correct time and date then hit calculate.
|
|
150
205
|
|
|
151
|
-
check it here http://douglasallen.github.io/planets/ just put in the correct time and date then hit calculate.
|
|
152
206
|
Does GHA Sun = your longitude?
|
|
153
|
-
|
|
207
|
+
|
|
208
|
+
It's off a little bit because that site uses a different formula that is commonly used in older programs.
|
|
209
|
+
|
|
210
|
+
I get about 3 seconds difference in the EOT is all.
|
|
211
|
+
DISPLAY
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
|
|
154
218
|
|
|
155
219
|
puts file
|