equationoftime 3.0.0 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (251) hide show
  1. checksums.yaml +4 -4
  2. data/.buildpath +5 -0
  3. data/.project +17 -0
  4. data/.rvmrc +1 -0
  5. data/.settings/org.eclipse.ltk.core.refactoring.prefs +2 -0
  6. data/Makefile +238 -0
  7. data/Rakefile +40 -3
  8. data/analemma_data.yml +2925 -0
  9. data/equationoftime.gemspec +6 -3
  10. data/examples/analemma_data_generator.rb +12 -12
  11. data/examples/celes_parts/.RUBYARCHDIR.time +0 -0
  12. data/examples/celes_parts/.cproject +56 -0
  13. data/examples/celes_parts/.project +78 -0
  14. data/examples/celes_parts/a2af.c +120 -0
  15. data/examples/celes_parts/a2tf.c +116 -0
  16. data/examples/celes_parts/af2a.c +107 -0
  17. data/examples/celes_parts/anp.c +82 -0
  18. data/examples/celes_parts/anpm.c +82 -0
  19. data/examples/celes_parts/bi00.c +116 -0
  20. data/examples/celes_parts/bp00.c +173 -0
  21. data/examples/celes_parts/bp06.c +136 -0
  22. data/examples/celes_parts/bpn2xy.c +100 -0
  23. data/examples/celes_parts/c2i00a.c +139 -0
  24. data/examples/celes_parts/c2i00b.c +139 -0
  25. data/examples/celes_parts/c2i06a.c +136 -0
  26. data/examples/celes_parts/c2ibpn.c +142 -0
  27. data/examples/celes_parts/c2ixy.c +131 -0
  28. data/examples/celes_parts/c2ixys.c +123 -0
  29. data/examples/celes_parts/c2s.c +96 -0
  30. data/examples/celes_parts/c2t00a.c +154 -0
  31. data/examples/celes_parts/c2t00b.c +150 -0
  32. data/examples/celes_parts/c2t06a.c +152 -0
  33. data/examples/celes_parts/c2tcio.c +122 -0
  34. data/examples/celes_parts/c2teqx.c +122 -0
  35. data/examples/celes_parts/c2tpe.c +167 -0
  36. data/examples/celes_parts/c2txy.c +159 -0
  37. data/examples/celes_parts/cal2jd.c +139 -0
  38. data/examples/celes_parts/celes_core.c +2522 -0
  39. data/examples/celes_parts/cp.c +80 -0
  40. data/examples/celes_parts/cpv.c +82 -0
  41. data/examples/celes_parts/cr.c +83 -0
  42. data/examples/celes_parts/d2dtf.c +206 -0
  43. data/examples/celes_parts/d2tf.c +160 -0
  44. data/examples/celes_parts/dat.c +289 -0
  45. data/examples/celes_parts/depend +25 -0
  46. data/examples/celes_parts/dtdb.c +1213 -0
  47. data/examples/celes_parts/dtf2d.c +196 -0
  48. data/examples/celes_parts/ee00.c +128 -0
  49. data/examples/celes_parts/ee00a.c +135 -0
  50. data/examples/celes_parts/ee00b.c +141 -0
  51. data/examples/celes_parts/ee06a.c +122 -0
  52. data/examples/celes_parts/eect00.c +282 -0
  53. data/examples/celes_parts/eform.c +147 -0
  54. data/examples/celes_parts/eo06a.c +131 -0
  55. data/examples/celes_parts/eors.c +108 -0
  56. data/examples/celes_parts/epb.c +96 -0
  57. data/examples/celes_parts/epb2jd.c +91 -0
  58. data/examples/celes_parts/epj.c +93 -0
  59. data/examples/celes_parts/epj2jd.c +91 -0
  60. data/examples/celes_parts/epv00.c +2589 -0
  61. data/examples/celes_parts/eqeq94.c +131 -0
  62. data/examples/celes_parts/era00.c +136 -0
  63. data/examples/celes_parts/extconf.rb +4 -0
  64. data/examples/celes_parts/fad03.c +103 -0
  65. data/examples/celes_parts/fae03.c +102 -0
  66. data/examples/celes_parts/faf03.c +106 -0
  67. data/examples/celes_parts/faju03.c +102 -0
  68. data/examples/celes_parts/fal03.c +103 -0
  69. data/examples/celes_parts/falp03.c +103 -0
  70. data/examples/celes_parts/fama03.c +102 -0
  71. data/examples/celes_parts/fame03.c +102 -0
  72. data/examples/celes_parts/fane03.c +99 -0
  73. data/examples/celes_parts/faom03.c +104 -0
  74. data/examples/celes_parts/fapa03.c +103 -0
  75. data/examples/celes_parts/fasa03.c +102 -0
  76. data/examples/celes_parts/faur03.c +99 -0
  77. data/examples/celes_parts/fave03.c +102 -0
  78. data/examples/celes_parts/fk52h.c +143 -0
  79. data/examples/celes_parts/fk5hip.c +126 -0
  80. data/examples/celes_parts/fk5hz.c +160 -0
  81. data/examples/celes_parts/fw2m.c +134 -0
  82. data/examples/celes_parts/fw2xy.c +120 -0
  83. data/examples/celes_parts/gc2gd.c +134 -0
  84. data/examples/celes_parts/gc2gde.c +200 -0
  85. data/examples/celes_parts/gd2gc.c +134 -0
  86. data/examples/celes_parts/gd2gce.c +138 -0
  87. data/examples/celes_parts/gmst00.c +145 -0
  88. data/examples/celes_parts/gmst06.c +136 -0
  89. data/examples/celes_parts/gmst82.c +151 -0
  90. data/examples/celes_parts/gst00a.c +138 -0
  91. data/examples/celes_parts/gst00b.c +146 -0
  92. data/examples/celes_parts/gst06.c +140 -0
  93. data/examples/celes_parts/gst06a.c +131 -0
  94. data/examples/celes_parts/gst94.c +131 -0
  95. data/examples/celes_parts/h2fk5.c +148 -0
  96. data/examples/celes_parts/hfk5z.c +175 -0
  97. data/examples/celes_parts/ir.c +83 -0
  98. data/examples/celes_parts/jd2cal.c +155 -0
  99. data/examples/celes_parts/jdcalf.c +161 -0
  100. data/examples/celes_parts/num00a.c +121 -0
  101. data/examples/celes_parts/num00b.c +121 -0
  102. data/examples/celes_parts/num06a.c +125 -0
  103. data/examples/celes_parts/numat.c +109 -0
  104. data/examples/celes_parts/nut00a.c +2047 -0
  105. data/examples/celes_parts/nut00b.c +372 -0
  106. data/examples/celes_parts/nut06a.c +153 -0
  107. data/examples/celes_parts/nut80.c +325 -0
  108. data/examples/celes_parts/nutm80.c +117 -0
  109. data/examples/celes_parts/obl06.c +118 -0
  110. data/examples/celes_parts/obl80.c +118 -0
  111. data/examples/celes_parts/p06e.c +321 -0
  112. data/examples/celes_parts/p2pv.c +83 -0
  113. data/examples/celes_parts/p2s.c +91 -0
  114. data/examples/celes_parts/pap.c +139 -0
  115. data/examples/celes_parts/pas.c +96 -0
  116. data/examples/celes_parts/pb06.c +144 -0
  117. data/examples/celes_parts/pdp.c +84 -0
  118. data/examples/celes_parts/pfw06.c +165 -0
  119. data/examples/celes_parts/plan94.c +514 -0
  120. data/examples/celes_parts/pm.c +83 -0
  121. data/examples/celes_parts/pmat00.c +118 -0
  122. data/examples/celes_parts/pmat06.c +122 -0
  123. data/examples/celes_parts/pmat76.c +141 -0
  124. data/examples/celes_parts/pmp.c +85 -0
  125. data/examples/celes_parts/pn.c +109 -0
  126. data/examples/celes_parts/pn00.c +177 -0
  127. data/examples/celes_parts/pn00a.c +162 -0
  128. data/examples/celes_parts/pn00b.c +162 -0
  129. data/examples/celes_parts/pn06.c +187 -0
  130. data/examples/celes_parts/pn06a.c +152 -0
  131. data/examples/celes_parts/pnm00a.c +121 -0
  132. data/examples/celes_parts/pnm00b.c +121 -0
  133. data/examples/celes_parts/pnm06a.c +124 -0
  134. data/examples/celes_parts/pnm80.c +126 -0
  135. data/examples/celes_parts/pom00.c +115 -0
  136. data/examples/celes_parts/ppp.c +85 -0
  137. data/examples/celes_parts/ppsp.c +94 -0
  138. data/examples/celes_parts/pr00.c +142 -0
  139. data/examples/celes_parts/prec76.c +148 -0
  140. data/examples/celes_parts/pv2p.c +81 -0
  141. data/examples/celes_parts/pv2s.c +144 -0
  142. data/examples/celes_parts/pvdpv.c +102 -0
  143. data/examples/celes_parts/pvm.c +86 -0
  144. data/examples/celes_parts/pvmpv.c +87 -0
  145. data/examples/celes_parts/pvppv.c +87 -0
  146. data/examples/celes_parts/pvstar.c +207 -0
  147. data/examples/celes_parts/pvu.c +93 -0
  148. data/examples/celes_parts/pvup.c +88 -0
  149. data/examples/celes_parts/pvxpv.c +107 -0
  150. data/examples/celes_parts/pxp.c +94 -0
  151. data/examples/celes_parts/rm2v.c +111 -0
  152. data/examples/celes_parts/rv2m.c +118 -0
  153. data/examples/celes_parts/rx.c +110 -0
  154. data/examples/celes_parts/rxp.c +99 -0
  155. data/examples/celes_parts/rxpv.c +86 -0
  156. data/examples/celes_parts/rxr.c +99 -0
  157. data/examples/celes_parts/ry.c +110 -0
  158. data/examples/celes_parts/rz.c +110 -0
  159. data/examples/celes_parts/s00.c +371 -0
  160. data/examples/celes_parts/s00a.c +143 -0
  161. data/examples/celes_parts/s00b.c +143 -0
  162. data/examples/celes_parts/s06.c +368 -0
  163. data/examples/celes_parts/s06a.c +145 -0
  164. data/examples/celes_parts/s2c.c +85 -0
  165. data/examples/celes_parts/s2p.c +88 -0
  166. data/examples/celes_parts/s2pv.c +103 -0
  167. data/examples/celes_parts/s2xpv.c +87 -0
  168. data/examples/celes_parts/sepp.c +105 -0
  169. data/examples/celes_parts/seps.c +93 -0
  170. data/examples/celes_parts/sofa.h +379 -0
  171. data/examples/celes_parts/sofam.h +155 -0
  172. data/examples/celes_parts/sp00.c +118 -0
  173. data/examples/celes_parts/starpm.c +205 -0
  174. data/examples/celes_parts/starpv.c +264 -0
  175. data/examples/celes_parts/sxp.c +84 -0
  176. data/examples/celes_parts/sxpv.c +85 -0
  177. data/examples/celes_parts/taitt.c +110 -0
  178. data/examples/celes_parts/taiut1.c +112 -0
  179. data/examples/celes_parts/taiutc.c +182 -0
  180. data/examples/celes_parts/tcbtdb.c +132 -0
  181. data/examples/celes_parts/tcgtt.c +109 -0
  182. data/examples/celes_parts/tdbtcb.c +137 -0
  183. data/examples/celes_parts/tdbtt.c +122 -0
  184. data/examples/celes_parts/test_celes.rb +48 -0
  185. data/examples/celes_parts/tf2a.c +107 -0
  186. data/examples/celes_parts/tf2d.c +107 -0
  187. data/examples/celes_parts/tr.c +93 -0
  188. data/examples/celes_parts/trxp.c +93 -0
  189. data/examples/celes_parts/trxpv.c +93 -0
  190. data/examples/celes_parts/tttai.c +110 -0
  191. data/examples/celes_parts/tttcg.c +112 -0
  192. data/examples/celes_parts/tttdb.c +121 -0
  193. data/examples/celes_parts/ttut1.c +110 -0
  194. data/examples/celes_parts/ut1tai.c +111 -0
  195. data/examples/celes_parts/ut1tt.c +110 -0
  196. data/examples/celes_parts/ut1utc.c +193 -0
  197. data/examples/celes_parts/utctai.c +163 -0
  198. data/examples/celes_parts/utcut1.c +151 -0
  199. data/examples/celes_parts/xy06.c +2758 -0
  200. data/examples/celes_parts/xys00a.c +133 -0
  201. data/examples/celes_parts/xys00b.c +133 -0
  202. data/examples/celes_parts/xys06a.c +133 -0
  203. data/examples/celes_parts/zp.c +77 -0
  204. data/examples/celes_parts/zpv.c +79 -0
  205. data/examples/celes_parts/zr.c +83 -0
  206. data/examples/check_date_type.rb +2 -4
  207. data/examples/compare_geoc_long_ra.rb +19 -11
  208. data/examples/data_table_for_astro_dog.rb +40 -0
  209. data/examples/earth_rotation.rb +28 -3
  210. data/examples/eot.c +15 -0
  211. data/examples/eot.h +2 -0
  212. data/examples/eot_methods_list.rb +30 -3
  213. data/examples/eot_suntimes.rb +99 -95
  214. data/examples/extconf.rb +2 -0
  215. data/examples/{read_nutation_data.rb → gmst_gast_non_sofa.rb} +103 -98
  216. data/examples/nutation_table5_3a.yaml +1658 -1658
  217. data/examples/rbeot.c +24 -0
  218. data/examples/test_eot.rb +17 -0
  219. data/examples/test_poly_eval.rb +6 -17
  220. data/examples/time_scales.rb +4 -7
  221. data/examples/times_year.rb +50 -0
  222. data/examples/usage_example.rb +15 -5
  223. data/examples/use_angles.rb +151 -87
  224. data/lib/eot/angles.rb +130 -177
  225. data/lib/eot/constants.rb +41 -44
  226. data/lib/eot/displays.rb +40 -37
  227. data/lib/eot/geo_lat_lng_smt.rb +7 -6
  228. data/lib/eot/init.rb +62 -39
  229. data/lib/eot/nutation.rb +53 -45
  230. data/lib/eot/times.rb +32 -41
  231. data/lib/eot/utilities.rb +11 -90
  232. data/lib/eot/version.rb +3 -2
  233. data/rise_set_data.yml +1461 -0
  234. data/run_tests_eclipse.rb +1 -0
  235. data/tests/minitest/aliased_angles_spec.rb +119 -165
  236. data/tests/minitest/aliased_displays_spec.rb +41 -39
  237. data/tests/minitest/aliased_utilities_spec.rb +11 -22
  238. data/tests/minitest/angles_spec.rb +134 -181
  239. data/tests/minitest/constants_spec.rb +4 -10
  240. data/tests/minitest/delta_epsilon_spec.rb +13 -16
  241. data/tests/minitest/displays_spec.rb +39 -37
  242. data/tests/minitest/geo_spec.rb +15 -11
  243. data/tests/minitest/init_spec.rb +30 -16
  244. data/tests/minitest/nutation_spec.rb +19 -13
  245. data/tests/minitest/times_spec.rb +77 -75
  246. data/tests/minitest/utilities_spec.rb +10 -94
  247. data/wiki.md +7 -9
  248. metadata +218 -26
  249. data/examples/data_table.rb +0 -26
  250. data/lib/eot/nutation_table5_3a.yaml +0 -9532
  251. 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
@@ -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
- require 'eot'
22
- eot = Eot.new
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
- @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 )
25
+ ecc = [-0.0000001235, -0.000042037, 0.016708617]
26
+ ta = 0.14
27
+ ecc.inject(0.0) {|sum, n| p sum * ta + n }
@@ -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
- p date = DateTime.now.to_time.utc.to_datetime
15
- #~ dt = Astro.delta_T(date) / 86400.0
16
- ajd = date.ajd
17
- #~ ajd1 = ajd + dt
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"
@@ -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
- p eot.date
10
- p eot.longitude
11
- p eot.latitude
12
- p eot.sunrise_dt
13
- p eot.sunset_dt
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
@@ -6,150 +6,214 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
6
6
  require 'eot'
7
7
 
8
8
 
9
- file = <<EOS
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
- Set the ajd instance to the deisired date ex : eot.ajd = Date.parse("yyyy, mm, dd").jd
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
- The Astronomical Julian Day Number plus the fractional day time now will be used to calculate current angles.
20
+ eot.ajd = Date.today.jd.to_f
25
21
 
26
- The current time expressed as an AJDN :
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
- mu is the solar Mean anomaly. It is an angle with respect to perihelion of Earth orbit around Sun.
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
- mu = eot.ma
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
- eqc = eot.center()
41
- #{eqc = eot.center()} deg.
86
+ eot.center() = #{eot.center()} degrees.
42
87
 
43
- nu = eot.ta_Sun()
44
- #{nu = eot.ta_Sun()} deg.
88
+ nu = equation of center + M or mu or mean anomaly
45
89
 
46
- We find the delta or difference of these first two angles.
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 next delta is calculated as follows.
93
+ The method inside the gem is called delta_orbit()
53
94
 
54
- lambda = mean longitude + equation of center
95
+ eot.delta_orbit = #{eot.delta_orbit} degrees
55
96
 
56
- mean_longitude = eot.gml_Sun()
57
- #{mean_longitude = eot.gml_Sun()} deg.
97
+ We could just change the sign of eot.center().
58
98
 
59
- eqc = eot.center(eot.time_julian_century())
60
- #{eqc = eot.center(eot.time_julian_century())} deg
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
- Lambda is the \"ecliptic coordinate system\" angle of the sun.
104
+ The next delta is calculated as follows.
66
105
 
67
- lambda_1 = eot.tl_Sun(eot.time_julian_century())
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
- This may also be used and is a very small difference to lambda 1
108
+ a2 = lambda - alpha
109
+
110
+ lambda = mean longitude + equation of center
71
111
 
72
- lambda_2 = eot.al_Sun(eot.time_julian_century())
73
- #{lambda_2 = eot.al_Sun(eot.time_julian_century())} deg
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(eot.time_julian_century())
78
- #{alpha = eot.ra_Sun(eot.time_julian_century())} deg
120
+ alpha = eot.ra_Sun()
121
+
122
+ alpha = #{eot.ra_Sun()}
123
+
124
+ lambda - alpha = #{eot.tl_Sun - eot.ra_Sun()}
79
125
 
80
- Delta ecliptic is the difference in these two angles.
126
+ The method inside the gem is called delta_oblique.
81
127
 
82
- delta_ecliptic = lambda_1 - alpha
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
- delta_total = delta_eccentric + delta_ecliptic
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
- So my mean solar transit UTC is
140
+ my longitude is -88.74467 deg. so I'll set the longitude attribute in Eot class.
99
141
 
100
- mean_noon = 12 - my_longitude / 15.0
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
- Be sure to set your longitude and latitude as attributes.
108
- eot.longitude = my_longitude
109
- eot.latitude = my_latitude
110
- #{eot.longitude = my_longitude}
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.mean_local_noon_dt()
113
- #{eot.mean_local_noon_dt()}
167
+ eot.longitude + eot.eot() = #{eot.longitude} + #{eot.eot()}
114
168
 
115
- Now we need to calculate the delta total for our mean solar transit.
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
- mean_noon = Time.utc(DateTime.now.to_time.utc.to_datetime.year, DateTime.now.to_time.utc.to_datetime.month, DateTime.now.to_time.utc.to_datetime.day, 12, 0, 0) - (my_longitude / 15.0) * 3600.0}
123
- #{mean_noon = Time.utc(DateTime.now.to_time.utc.to_datetime.year, DateTime.now.to_time.utc.to_datetime.month, DateTime.now.to_time.utc.to_datetime.day, 12, 0, 0) - (my_longitude / 15.0) * 3600.0}
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
- delta_deg = delta_total / 4.0 * 360.0 / 360.98564736629 Note: not quite 4 minutes per degree.
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
- Now we can add that from our longitude or mean noon angle
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
- noon_angle = my_longitude + delta_deg
136
- #{noon_angle = my_longitude + delta_deg}
183
+ ajd = Date.today.ajd.to_f
137
184
 
138
- Your longitude and the GHA of the Sun will match atTrue Solar Transit time.
185
+ ajd = #{Date.today.ajd.to_f}
139
186
 
140
- So lets convert that angle to a time now.
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
- my_transit = eot.ajd + (12 - noon_angle / 15.0) / 24.0
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
- DateTime.jd(my_transit)
149
- #{DateTime.jd(my_transit)}
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
- EOS
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