equationoftime 4.0.0 → 4.1.1
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/.gitignore +8 -3
- data/Gemfile.lock +48 -0
- data/README.md +22 -19
- data/Rakefile +14 -7
- data/equationoftime.gemspec +9 -6
- data/ext/ceot/ceot.c +52 -0
- data/ext/ceot/eot.c +79 -0
- data/ext/ceot/eot.h +8 -0
- data/ext/ceot/extconf.rb +5 -0
- data/lib/eot.rb +2 -1
- data/lib/eot/angles.rb +44 -43
- data/lib/eot/init.rb +13 -6
- data/lib/eot/version.rb +1 -1
- data/wiki.md +6 -7
- metadata +26 -255
- data/.settings/org.eclipse.ltk.core.refactoring.prefs +0 -2
- data/Makefile +0 -238
- data/analemma_data.yml +0 -2925
- data/examples/Equation_of_Time.jpg +0 -0
- data/examples/analemma_data_generator.rb +0 -53
- data/examples/celes_parts/.RUBYARCHDIR.time +0 -0
- data/examples/celes_parts/.cproject +0 -56
- data/examples/celes_parts/.project +0 -78
- data/examples/celes_parts/a2af.c +0 -120
- data/examples/celes_parts/a2tf.c +0 -116
- data/examples/celes_parts/af2a.c +0 -107
- data/examples/celes_parts/anp.c +0 -82
- data/examples/celes_parts/anpm.c +0 -82
- data/examples/celes_parts/bi00.c +0 -116
- data/examples/celes_parts/bp00.c +0 -173
- data/examples/celes_parts/bp06.c +0 -136
- data/examples/celes_parts/bpn2xy.c +0 -100
- data/examples/celes_parts/c2i00a.c +0 -139
- data/examples/celes_parts/c2i00b.c +0 -139
- data/examples/celes_parts/c2i06a.c +0 -136
- data/examples/celes_parts/c2ibpn.c +0 -142
- data/examples/celes_parts/c2ixy.c +0 -131
- data/examples/celes_parts/c2ixys.c +0 -123
- data/examples/celes_parts/c2s.c +0 -96
- data/examples/celes_parts/c2t00a.c +0 -154
- data/examples/celes_parts/c2t00b.c +0 -150
- data/examples/celes_parts/c2t06a.c +0 -152
- data/examples/celes_parts/c2tcio.c +0 -122
- data/examples/celes_parts/c2teqx.c +0 -122
- data/examples/celes_parts/c2tpe.c +0 -167
- data/examples/celes_parts/c2txy.c +0 -159
- data/examples/celes_parts/cal2jd.c +0 -139
- data/examples/celes_parts/celes_core.c +0 -2522
- data/examples/celes_parts/cp.c +0 -80
- data/examples/celes_parts/cpv.c +0 -82
- data/examples/celes_parts/cr.c +0 -83
- data/examples/celes_parts/d2dtf.c +0 -206
- data/examples/celes_parts/d2tf.c +0 -160
- data/examples/celes_parts/dat.c +0 -289
- data/examples/celes_parts/depend +0 -25
- data/examples/celes_parts/dtdb.c +0 -1213
- data/examples/celes_parts/dtf2d.c +0 -196
- data/examples/celes_parts/ee00.c +0 -128
- data/examples/celes_parts/ee00a.c +0 -135
- data/examples/celes_parts/ee00b.c +0 -141
- data/examples/celes_parts/ee06a.c +0 -122
- data/examples/celes_parts/eect00.c +0 -282
- data/examples/celes_parts/eform.c +0 -147
- data/examples/celes_parts/eo06a.c +0 -131
- data/examples/celes_parts/eors.c +0 -108
- data/examples/celes_parts/epb.c +0 -96
- data/examples/celes_parts/epb2jd.c +0 -91
- data/examples/celes_parts/epj.c +0 -93
- data/examples/celes_parts/epj2jd.c +0 -91
- data/examples/celes_parts/epv00.c +0 -2589
- data/examples/celes_parts/eqeq94.c +0 -131
- data/examples/celes_parts/era00.c +0 -136
- data/examples/celes_parts/extconf.rb +0 -4
- data/examples/celes_parts/fad03.c +0 -103
- data/examples/celes_parts/fae03.c +0 -102
- data/examples/celes_parts/faf03.c +0 -106
- data/examples/celes_parts/faju03.c +0 -102
- data/examples/celes_parts/fal03.c +0 -103
- data/examples/celes_parts/falp03.c +0 -103
- data/examples/celes_parts/fama03.c +0 -102
- data/examples/celes_parts/fame03.c +0 -102
- data/examples/celes_parts/fane03.c +0 -99
- data/examples/celes_parts/faom03.c +0 -104
- data/examples/celes_parts/fapa03.c +0 -103
- data/examples/celes_parts/fasa03.c +0 -102
- data/examples/celes_parts/faur03.c +0 -99
- data/examples/celes_parts/fave03.c +0 -102
- data/examples/celes_parts/fk52h.c +0 -143
- data/examples/celes_parts/fk5hip.c +0 -126
- data/examples/celes_parts/fk5hz.c +0 -160
- data/examples/celes_parts/fw2m.c +0 -134
- data/examples/celes_parts/fw2xy.c +0 -120
- data/examples/celes_parts/gc2gd.c +0 -134
- data/examples/celes_parts/gc2gde.c +0 -200
- data/examples/celes_parts/gd2gc.c +0 -134
- data/examples/celes_parts/gd2gce.c +0 -138
- data/examples/celes_parts/gmst00.c +0 -145
- data/examples/celes_parts/gmst06.c +0 -136
- data/examples/celes_parts/gmst82.c +0 -151
- data/examples/celes_parts/gst00a.c +0 -138
- data/examples/celes_parts/gst00b.c +0 -146
- data/examples/celes_parts/gst06.c +0 -140
- data/examples/celes_parts/gst06a.c +0 -131
- data/examples/celes_parts/gst94.c +0 -131
- data/examples/celes_parts/h2fk5.c +0 -148
- data/examples/celes_parts/hfk5z.c +0 -175
- data/examples/celes_parts/ir.c +0 -83
- data/examples/celes_parts/jd2cal.c +0 -155
- data/examples/celes_parts/jdcalf.c +0 -161
- data/examples/celes_parts/num00a.c +0 -121
- data/examples/celes_parts/num00b.c +0 -121
- data/examples/celes_parts/num06a.c +0 -125
- data/examples/celes_parts/numat.c +0 -109
- data/examples/celes_parts/nut00a.c +0 -2047
- data/examples/celes_parts/nut00b.c +0 -372
- data/examples/celes_parts/nut06a.c +0 -153
- data/examples/celes_parts/nut80.c +0 -325
- data/examples/celes_parts/nutm80.c +0 -117
- data/examples/celes_parts/obl06.c +0 -118
- data/examples/celes_parts/obl80.c +0 -118
- data/examples/celes_parts/p06e.c +0 -321
- data/examples/celes_parts/p2pv.c +0 -83
- data/examples/celes_parts/p2s.c +0 -91
- data/examples/celes_parts/pap.c +0 -139
- data/examples/celes_parts/pas.c +0 -96
- data/examples/celes_parts/pb06.c +0 -144
- data/examples/celes_parts/pdp.c +0 -84
- data/examples/celes_parts/pfw06.c +0 -165
- data/examples/celes_parts/plan94.c +0 -514
- data/examples/celes_parts/pm.c +0 -83
- data/examples/celes_parts/pmat00.c +0 -118
- data/examples/celes_parts/pmat06.c +0 -122
- data/examples/celes_parts/pmat76.c +0 -141
- data/examples/celes_parts/pmp.c +0 -85
- data/examples/celes_parts/pn.c +0 -109
- data/examples/celes_parts/pn00.c +0 -177
- data/examples/celes_parts/pn00a.c +0 -162
- data/examples/celes_parts/pn00b.c +0 -162
- data/examples/celes_parts/pn06.c +0 -187
- data/examples/celes_parts/pn06a.c +0 -152
- data/examples/celes_parts/pnm00a.c +0 -121
- data/examples/celes_parts/pnm00b.c +0 -121
- data/examples/celes_parts/pnm06a.c +0 -124
- data/examples/celes_parts/pnm80.c +0 -126
- data/examples/celes_parts/pom00.c +0 -115
- data/examples/celes_parts/ppp.c +0 -85
- data/examples/celes_parts/ppsp.c +0 -94
- data/examples/celes_parts/pr00.c +0 -142
- data/examples/celes_parts/prec76.c +0 -148
- data/examples/celes_parts/pv2p.c +0 -81
- data/examples/celes_parts/pv2s.c +0 -144
- data/examples/celes_parts/pvdpv.c +0 -102
- data/examples/celes_parts/pvm.c +0 -86
- data/examples/celes_parts/pvmpv.c +0 -87
- data/examples/celes_parts/pvppv.c +0 -87
- data/examples/celes_parts/pvstar.c +0 -207
- data/examples/celes_parts/pvu.c +0 -93
- data/examples/celes_parts/pvup.c +0 -88
- data/examples/celes_parts/pvxpv.c +0 -107
- data/examples/celes_parts/pxp.c +0 -94
- data/examples/celes_parts/rm2v.c +0 -111
- data/examples/celes_parts/rv2m.c +0 -118
- data/examples/celes_parts/rx.c +0 -110
- data/examples/celes_parts/rxp.c +0 -99
- data/examples/celes_parts/rxpv.c +0 -86
- data/examples/celes_parts/rxr.c +0 -99
- data/examples/celes_parts/ry.c +0 -110
- data/examples/celes_parts/rz.c +0 -110
- data/examples/celes_parts/s00.c +0 -371
- data/examples/celes_parts/s00a.c +0 -143
- data/examples/celes_parts/s00b.c +0 -143
- data/examples/celes_parts/s06.c +0 -368
- data/examples/celes_parts/s06a.c +0 -145
- data/examples/celes_parts/s2c.c +0 -85
- data/examples/celes_parts/s2p.c +0 -88
- data/examples/celes_parts/s2pv.c +0 -103
- data/examples/celes_parts/s2xpv.c +0 -87
- data/examples/celes_parts/sepp.c +0 -105
- data/examples/celes_parts/seps.c +0 -93
- data/examples/celes_parts/sofa.h +0 -379
- data/examples/celes_parts/sofam.h +0 -155
- data/examples/celes_parts/sp00.c +0 -118
- data/examples/celes_parts/starpm.c +0 -205
- data/examples/celes_parts/starpv.c +0 -264
- data/examples/celes_parts/sxp.c +0 -84
- data/examples/celes_parts/sxpv.c +0 -85
- data/examples/celes_parts/taitt.c +0 -110
- data/examples/celes_parts/taiut1.c +0 -112
- data/examples/celes_parts/taiutc.c +0 -182
- data/examples/celes_parts/tcbtdb.c +0 -132
- data/examples/celes_parts/tcgtt.c +0 -109
- data/examples/celes_parts/tdbtcb.c +0 -137
- data/examples/celes_parts/tdbtt.c +0 -122
- data/examples/celes_parts/test_celes.rb +0 -48
- data/examples/celes_parts/tf2a.c +0 -107
- data/examples/celes_parts/tf2d.c +0 -107
- data/examples/celes_parts/tr.c +0 -93
- data/examples/celes_parts/trxp.c +0 -93
- data/examples/celes_parts/trxpv.c +0 -93
- data/examples/celes_parts/tttai.c +0 -110
- data/examples/celes_parts/tttcg.c +0 -112
- data/examples/celes_parts/tttdb.c +0 -121
- data/examples/celes_parts/ttut1.c +0 -110
- data/examples/celes_parts/ut1tai.c +0 -111
- data/examples/celes_parts/ut1tt.c +0 -110
- data/examples/celes_parts/ut1utc.c +0 -193
- data/examples/celes_parts/utctai.c +0 -163
- data/examples/celes_parts/utcut1.c +0 -151
- data/examples/celes_parts/xy06.c +0 -2758
- data/examples/celes_parts/xys00a.c +0 -133
- data/examples/celes_parts/xys00b.c +0 -133
- data/examples/celes_parts/xys06a.c +0 -133
- data/examples/celes_parts/zp.c +0 -77
- data/examples/celes_parts/zpv.c +0 -79
- data/examples/celes_parts/zr.c +0 -83
- data/examples/check_date_type.rb +0 -55
- data/examples/compare_geoc_long_ra.rb +0 -39
- data/examples/data_table_for_astro_dog.rb +0 -40
- data/examples/earth_rotation.rb +0 -38
- data/examples/eot.c +0 -15
- data/examples/eot.h +0 -2
- data/examples/eot_methods_list.rb +0 -43
- data/examples/eot_plot.r +0 -57
- data/examples/eot_suntimes.rb +0 -144
- data/examples/equation_of_time.py +0 -186
- data/examples/extconf.rb +0 -2
- data/examples/figure_1.jpg +0 -0
- data/examples/file_converter.rb +0 -31
- data/examples/from_readme.rb +0 -10
- data/examples/geo_locator.rb +0 -12
- data/examples/getjd.rb +0 -45
- data/examples/gmst_gast_non_sofa.rb +0 -404
- data/examples/input_suntimes.rb +0 -21
- data/examples/julian_day_formula.rb +0 -29
- data/examples/julian_day_formula.txt +0 -12
- data/examples/my_time_conversion.rb +0 -21
- data/examples/nutation_series.txt +0 -678
- data/examples/nutation_series.yaml +0 -14239
- data/examples/nutation_table5_3a.txt +0 -682
- data/examples/nutation_table5_3a.yaml +0 -9532
- data/examples/ptime.rb +0 -162
- data/examples/rbeot.c +0 -24
- data/examples/suntimes.rb +0 -28
- data/examples/suntimes_test.rb +0 -47
- data/examples/test_eot.rb +0 -17
- data/examples/test_poly_eval.rb +0 -27
- data/examples/time_scales.rb +0 -26
- data/examples/times_year.rb +0 -50
- data/examples/usage_example.rb +0 -23
- data/examples/use_angles.rb +0 -219
- data/rise_set_data.yml +0 -1461
- data/tests/minitest/aliased_angles_spec.rb +0 -241
- data/tests/minitest/aliased_displays_spec.rb +0 -108
- data/tests/minitest/aliased_utilities_spec.rb +0 -38
- data/tests/minitest/angles_spec.rb +0 -266
- data/tests/minitest/constants_spec.rb +0 -21
- data/tests/minitest/delta_epsilon_spec.rb +0 -32
- data/tests/minitest/displays_spec.rb +0 -113
- data/tests/minitest/geo_spec.rb +0 -40
- data/tests/minitest/init_spec.rb +0 -46
- data/tests/minitest/nutation_spec.rb +0 -39
- data/tests/minitest/times_spec.rb +0 -139
- data/tests/minitest/utilities_spec.rb +0 -37
- data/tests/spec_config.rb +0 -3
data/examples/ptime.rb
DELETED
|
@@ -1,162 +0,0 @@
|
|
|
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
|
-
|
data/examples/rbeot.c
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
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
|
-
}
|
data/examples/suntimes.rb
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
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
|
data/examples/suntimes_test.rb
DELETED
|
@@ -1,47 +0,0 @@
|
|
|
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
|
-
|
data/examples/test_eot.rb
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
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
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
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
|
-
# From astro-algo gem
|
|
7
|
-
# class Array
|
|
8
|
-
# Evaluate polynomial using Horner's method.
|
|
9
|
-
# Array consists of coefficients of a polynomial, the
|
|
10
|
-
# coefficient of the highest order term first, the
|
|
11
|
-
# constant coefficient last.
|
|
12
|
-
# Returns evaluation of polynomial at +x+.
|
|
13
|
-
#
|
|
14
|
-
# Example: evaluate the polynomial x**2 - 0.5*x + 3.0 where x = 2.0
|
|
15
|
-
# [1.0, -0.5, 3.0].poly_eval(2.0) # => 6.0
|
|
16
|
-
# def poly_eval(x)
|
|
17
|
-
# self.inject(0.0) {|p, a|
|
|
18
|
-
# p*x + a}
|
|
19
|
-
# end
|
|
20
|
-
# end
|
|
21
|
-
|
|
22
|
-
my_array = [1.0, -0.5, 3.0]
|
|
23
|
-
my_array.inject(0.0) {|sum, n| p sum * 2.0 + n }
|
|
24
|
-
|
|
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
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
# eot_methods_list.rb
|
|
2
|
-
|
|
3
|
-
lib = File.expand_path('../../lib', __FILE__)
|
|
4
|
-
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
5
|
-
|
|
6
|
-
require 'eot'
|
|
7
|
-
$DEBUG and set_trace_func proc { |event, file, line, id, binding, classname|
|
|
8
|
-
printf "%8s %s:%-2d %10s %8s\n", event, file, line, id, classname
|
|
9
|
-
}
|
|
10
|
-
eot = Eot.new
|
|
11
|
-
# puts eot.public_methods(false).sort
|
|
12
|
-
# puts eot.nil?
|
|
13
|
-
loop do
|
|
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
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
# puts Astro.solar_longitude(date)
|
|
21
|
-
# tjc = eot.time_julian_century( ajd)
|
|
22
|
-
# puts eot.tl_Sun(tjc)
|
|
23
|
-
|
|
24
|
-
# tjc = eot.time_julian_century( ajd + dt )
|
|
25
|
-
# puts eot.tl_Sun(tjc)
|
|
26
|
-
|
data/examples/times_year.rb
DELETED
|
@@ -1,50 +0,0 @@
|
|
|
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
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
# usage_example.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
|
-
# 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
DELETED
|
@@ -1,219 +0,0 @@
|
|
|
1
|
-
# use_angles.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
|
-
|
|
9
|
-
file = <<DISPLAY
|
|
10
|
-
|
|
11
|
-
This will explain how the equation of time is derived by showing each method that comprises the formula.
|
|
12
|
-
|
|
13
|
-
eot = Eot.new
|
|
14
|
-
|
|
15
|
-
Instance of Eot class eot = #{eot = Eot.new}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
Set the class attribute ajd for the deisired date ex : eot.ajd = Date.parse("yyyy, mm, dd").jd.to_f
|
|
19
|
-
|
|
20
|
-
eot.ajd = Date.today.jd.to_f
|
|
21
|
-
|
|
22
|
-
eot.ajd = #{eot.ajd = Date.today.jd.to_f}
|
|
23
|
-
|
|
24
|
-
The class attribute ajd has been set to a nice whole number even though it is a Float class now.
|
|
25
|
-
|
|
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.
|
|
27
|
-
|
|
28
|
-
DateTime.now.day_fraction.to_f = #{DateTime.now.day_fraction.to_f}
|
|
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.
|
|
83
|
-
|
|
84
|
-
It was calculated by using the equation of center formula which you may access also.
|
|
85
|
-
|
|
86
|
-
eot.center() = #{eot.center()} degrees.
|
|
87
|
-
|
|
88
|
-
nu = equation of center + M or mu or mean anomaly
|
|
89
|
-
|
|
90
|
-
The delta is M - nu.
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
The method inside the gem is called delta_orbit()
|
|
94
|
-
|
|
95
|
-
eot.delta_orbit = #{eot.delta_orbit} degrees
|
|
96
|
-
|
|
97
|
-
We could just change the sign of eot.center().
|
|
98
|
-
|
|
99
|
-
In fact let's just do that now. a1 = - eot.center()
|
|
100
|
-
|
|
101
|
-
- eot.center() = #{- eot.center()}
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
The next delta is calculated as follows.
|
|
105
|
-
|
|
106
|
-
lambda or apparent longitude of the Sun minus alpha or right ascension of the Sun.
|
|
107
|
-
|
|
108
|
-
a2 = lambda - alpha
|
|
109
|
-
|
|
110
|
-
lambda = mean longitude + equation of center
|
|
111
|
-
|
|
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.
|
|
117
|
-
|
|
118
|
-
Alpha is the Right Ascension of the sun in the celestial coordinate system.
|
|
119
|
-
|
|
120
|
-
alpha = eot.ra_Sun()
|
|
121
|
-
|
|
122
|
-
alpha = #{eot.ra_Sun()}
|
|
123
|
-
|
|
124
|
-
lambda - alpha = #{eot.tl_Sun - eot.ra_Sun()}
|
|
125
|
-
|
|
126
|
-
The method inside the gem is called delta_oblique.
|
|
127
|
-
|
|
128
|
-
eot.delta_oblique() = #{eot.delta_oblique()}
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
The sum of these two delta angles is the equation of time angle in degrees not time.
|
|
132
|
-
|
|
133
|
-
eot.eot() = #{eot.eot()}
|
|
134
|
-
|
|
135
|
-
That was for the time UTC now which was easy.
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
Now using your longitude to compute your mean solar transit from longitude / 15.0
|
|
139
|
-
|
|
140
|
-
my longitude is -88.74467 deg. so I'll set the longitude attribute in Eot class.
|
|
141
|
-
|
|
142
|
-
eot.longitude = #{eot.longitude = -88.74467}
|
|
143
|
-
|
|
144
|
-
|
|
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.
|
|
166
|
-
|
|
167
|
-
eot.longitude + eot.eot() = #{eot.longitude} + #{eot.eot()}
|
|
168
|
-
|
|
169
|
-
What's the time of solar transit here now?
|
|
170
|
-
|
|
171
|
-
12.0 - (eot.longitude + eot.eot()) / 15.0 = #{12.0 - (eot.longitude + eot.eot()) / 15.0}
|
|
172
|
-
|
|
173
|
-
That looks about right.
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
Let's make a time out of that by converting it to a fractional day.
|
|
178
|
-
|
|
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.
|
|
182
|
-
|
|
183
|
-
ajd = Date.today.ajd.to_f
|
|
184
|
-
|
|
185
|
-
ajd = #{Date.today.ajd.to_f}
|
|
186
|
-
|
|
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}
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
There is a method in Eot class to make that a DateTime object.
|
|
191
|
-
|
|
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.
|
|
205
|
-
|
|
206
|
-
Does GHA Sun = your longitude?
|
|
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
|
-
|
|
218
|
-
|
|
219
|
-
puts file
|