calc_sun 0.1.1 → 1.2.6

Sign up to get free protection for your applications and to get access to all the features.
Binary file
data/example/sunriset.rb CHANGED
@@ -1,35 +1,23 @@
1
- require 'benchmark'
1
+ #!/usr/bin/env ruby
2
+
2
3
  lib = File.expand_path('../../lib', __FILE__)
3
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'calc_sun'
5
- cs = CalcSun.new
6
-
7
- require 'date'
8
- DJ00 = DateTime.parse('2000-01-01T12:00:00').jd
9
5
 
10
- lat = 41.95
11
- lon = -88.75
12
- day = Date.parse('2016-12-25')
13
- jd = day.jd - DJ00 - lon / 360.0
14
- rise = cs.t_rise(jd, lon, lat)
15
- midday = cs.t_mid_day(jd, lon, lat)
16
- set = cs.t_set(jd, lon, lat)
6
+ lat = 39.742476
7
+ lon = -105.1786
17
8
 
18
- printf("\n")
19
-
20
- printf("\tSun rises \t\t\t : %2.0f:%02.0f UTC\n",
21
- rise.floor, (rise % 1 * 60.0).floor)
9
+ require 'calc_sun'
10
+ cs = CalcSun.new
22
11
 
23
- printf("\tSun midday \t\t\t : %2.0f:%02.0f UTC\n",
24
- midday.floor, ((midday % 1.0) * 60).floor)
12
+ # require 'date' is included in CalcSun class
13
+ ajd = DateTime.new(2003, 10, 17, 12, 30, 30).ajd.to_f
14
+ puts cs.ajd2dt(ajd)
25
15
 
26
- printf("\tSun sets \t\t\t : %2.0f:%02.0f UTC\n",
27
- set.floor, (set % 1 * 60.0).floor)
16
+ # set the date/time with #set_datetime as date and time string.
17
+ # this just creates a DateTime object and you could create your own.
18
+ day = cs.set_datetime('2003-10-17 12:30:30')
19
+ puts day
28
20
 
29
- n = 1_000_000
30
- puts 'running three method calls 1_000_000 times'
31
- Benchmark.bm(7) do |x|
32
- x.report('rise:') { n.times { ; cs.t_rise(jd, lon, lat); } }
33
- x.report('midday:') { n.times { ; cs.t_mid_day(jd, lon, lat); } }
34
- x.report('set:') { n.times { ; cs.t_set(jd, lon, lat); } }
35
- end
21
+ puts "Sun rise: #{cs.rise(day.ajd, lat, lon).httpdate}"
22
+ puts "Sun noon: #{cs.noon(day.ajd, lat, lon).httpdate}"
23
+ puts "Sun set: #{cs.set(day.ajd, lat, lon).httpdate}"
@@ -0,0 +1,134 @@
1
+
2
+ require 'rubygems'
3
+ # gem 'minitest'
4
+ # require 'minitest/autorun'
5
+
6
+ require 'test/unit'
7
+ lib = File.expand_path('../../lib', __FILE__)
8
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
9
+ require 'calc_sun'
10
+
11
+ R2D = 180.0 / Math::PI
12
+ # doc
13
+ class TestMyTime < Test::Unit::TestCase # MiniTest::Test
14
+ LON = -88.743
15
+ def setup
16
+ @t = CalcSun.new
17
+ @time = Time.new(2017, 3, 17, 0, 0, 0, '+00:00').getgm
18
+ # p @time.zone
19
+ # p @time.gmt_offset
20
+ # p l = @time.getlocal
21
+ # p l.gmt_offset / 3600.0
22
+ @ajd0 = @time.to_datetime.ajd.to_f
23
+ @ajd = @ajd0 + @t.t_south(@ajd0 + 0.5, LON) / 24.0
24
+ end
25
+
26
+ def test_t_south_time
27
+ assert_equal(
28
+ '2017-03-17T18:03:17+00:00',
29
+ DateTime.jd(@ajd + 0.5).to_s
30
+ )
31
+ end
32
+
33
+ def test1_gmsa0
34
+ assert_equal(
35
+ 174.761497853952,
36
+ @t.gmsa0(@ajd0)
37
+ )
38
+ end
39
+
40
+ def test2_gmsa0
41
+ assert_equal(
42
+ 174.761497853952,
43
+ @t.gmsa0(@ajd)
44
+ )
45
+ end
46
+
47
+ def test1_gmst0
48
+ assert_equal(
49
+ 11.650766733312,
50
+ @t.gmst0(@ajd0)
51
+ )
52
+ end
53
+
54
+ def test2_gmst0
55
+ assert_equal(
56
+ 11.650766733312,
57
+ @t.gmst0(@ajd)
58
+ )
59
+ end
60
+
61
+ def test1_gmsa
62
+ assert_equal(
63
+ 86.326166683648,
64
+ @t.gmsa(@ajd)
65
+ )
66
+ end
67
+
68
+ def test1_gmst
69
+ assert_equal(
70
+ 5.75507791872,
71
+ @t.gmst(@ajd)
72
+ )
73
+ end
74
+
75
+ =begin
76
+ def test_t_south
77
+ assert_equal(
78
+ 18.054878593024,
79
+ @t.t_south(@ajd0, @lon)
80
+ )
81
+ end
82
+
83
+ def test_t_south_ajd
84
+ assert_equal(
85
+ 2_457_830.252286608,
86
+ @ajd0
87
+ )
88
+ end
89
+
90
+ def test_right_ascension
91
+ assert_equal(
92
+ 23.868102148096,
93
+ @t.right_ascension(@ajd0)
94
+ )
95
+ end
96
+
97
+ def test_mean_sidereal_time
98
+ assert_equal(
99
+ 11.871732105216,
100
+ @t.mean_sidereal_time(@ajd0)
101
+ )
102
+ end
103
+
104
+ def test_true_longitude
105
+ assert_equal(
106
+ 357.84379831549927,
107
+ @t.true_longitude(@ajd0) * R2D
108
+ )
109
+ end
110
+
111
+
112
+
113
+ def test_gha
114
+ assert_equal(
115
+ 177.89620630697482,
116
+ @t.gha(@ajd0)
117
+ )
118
+ end
119
+ =end
120
+ end
121
+
122
+ # doc
123
+ class TestMyTime100 < Test::Unit::TestCase # MiniTest::Test
124
+ def setup
125
+ @t = CalcSun.new
126
+ @date = '2017-03-17' # lucky day?
127
+ @ajd0 = Time.new(2017, 3, 17, 0, 0, 0, '+00:00').getgm.to_datetime.ajd.to_f
128
+ @jd0 = @ajd0.floor + 0.5
129
+ @lat = 41.9475
130
+ @lon = -88.743
131
+ @ajd = @ajd0 + @t.t_south(@jd0, @lon) / 24.0
132
+ @jd = @ajd + 0.5
133
+ end
134
+ end
@@ -1,60 +1,123 @@
1
1
  #include <ruby.h>
2
-
2
+ #include <math.h>
3
+ #include <time.h>
4
+ /* if PI's not defined, define it */
5
+ #ifndef PI
6
+ #define PI 3.1415926535897932384626433832795028841971L
7
+ #endif
3
8
  #ifndef DBL2NUM
4
9
  # define DBL2NUM(dbl) rb_float_new(dbl)
5
10
  #endif
11
+ # define PI2 PI * 2.0
12
+ # define R2D 57.295779513082320876798154814105L
13
+ # define D2R 0.017453292519943295769236907684886L
14
+ # define M2PI M_PI * 2.0
15
+ # define INV24 1.0 / 24.0
16
+ # define INV360 1.0 / 360.0
17
+ # define DJ00 2451545.0L
18
+ # define RND12 1000000000000.0L
6
19
 
7
- #define R2D 57.295779513082320876798154814105
8
- #define D2R 0.017453292519943295769236907684886
9
- #define M2PI M_PI * 2.0
10
- #define INV24 1.0 / 24.0
11
- #define INV360 1.0 / 360.0
12
- #define DJ00 2451545.0
13
-
14
- // static ID id_status;
20
+ static inline double
21
+ anp(double angle){
22
+ double w = fmod(angle, M2PI);
23
+ if (w < 0) w += M2PI;
24
+ return w;
25
+ }
15
26
 
16
- static VALUE
17
- t_init(VALUE self)
18
- {
27
+ /*
28
+ * call-seq:
29
+ * initialize()
30
+ *
31
+ * Create CalcSun class Ruby object.
32
+ *
33
+ */
34
+ static VALUE t_init(VALUE self){
19
35
  return self;
20
36
  }
21
-
22
- static VALUE
23
- func_rev12(VALUE self, VALUE vx)
24
- {
25
- double x = NUM2DBL(vx);
26
- return DBL2NUM(x - 24.0 * floor(x * INV24 + 0.5));
37
+ /*
38
+ * call-seq:
39
+ * date('yyyy-mm-dd')
40
+ *
41
+ * convert input string to DateTime object.
42
+ *
43
+ */
44
+ static VALUE func_set_datetime(VALUE self, VALUE vdatetime){
45
+ VALUE cDateTime = rb_const_get(rb_cObject, rb_intern("DateTime"));
46
+ VALUE vdate = rb_funcall(cDateTime, rb_intern("parse"), 1, vdatetime);
47
+ return vdate;
48
+ }
49
+ /*
50
+ * call-seq:
51
+ * ajd2dt(ajd)
52
+ *
53
+ * convert input float to DateTime object.
54
+ *
55
+ */
56
+ static VALUE func_ajd_2_datetime(VALUE self, VALUE vajd){
57
+ VALUE cDateTime = rb_const_get(rb_cObject, rb_intern("DateTime"));
58
+ double ajd = NUM2DBL(vajd) + 0.5;
59
+ VALUE vfajd = DBL2NUM(ajd);
60
+ VALUE vdatetime = rb_funcall(cDateTime, rb_intern("jd"), 1, vfajd);
61
+ return vdatetime;
62
+ }
63
+ /*
64
+ * call-seq:
65
+ * ajd(date)
66
+ *
67
+ * convert Date or DateTime object to AJD number.
68
+ *
69
+ */
70
+ static VALUE func_get_ajd(VALUE self, VALUE vdatetime){
71
+ double ajd = NUM2DBL(rb_funcall(vdatetime, rb_intern("ajd"), 0));
72
+ return DBL2NUM(ajd);
73
+ }
74
+ /*
75
+ * call-seq:
76
+ * jd(date)
77
+ *
78
+ * convert Date or DateTime object to JD number.
79
+ *
80
+ */
81
+ static VALUE func_get_jd(VALUE self, VALUE vdatetime){
82
+ double jd = NUM2DBL(rb_funcall(vdatetime, rb_intern("jd"), 0));
83
+ return DBL2NUM(jd);
27
84
  }
28
85
 
29
- static VALUE
30
- func_mean_anomally(VALUE self, VALUE vd)
31
- {
32
- double d = NUM2DBL(vd);
86
+ /*
87
+ * call-seq:
88
+ * mean_anomaly(date)
89
+ *
90
+ * convert Date or DateTime object to float
91
+ * representing Solar Mean Anomaly in radians.
92
+ *
93
+ */
94
+ static VALUE func_mean_anomaly(VALUE self, VALUE vajd){
95
+ double ajd = NUM2DBL(vajd);
96
+ double t = (ajd - DJ00) / 36525;
33
97
  double vma =
34
- fmod(
35
- (357.5291 +
36
- 0.98560028 * d
37
- ) * D2R, M2PI);
38
- return DBL2NUM(vma);
98
+ fmod(( 357.52910918 +
99
+ t * ( 35999.05029113889 +
100
+ t * ( 1.0 / -6507.592190889371 +
101
+ t * ( 1.0 / 26470588.235294115 +
102
+ t * (1.0 / -313315926.8929504))))) * D2R, M2PI);
103
+ return DBL2NUM(roundf(vma * RND12) / RND12);
39
104
  }
40
105
 
41
- static VALUE
42
- func_eccentricity(VALUE self, VALUE vd)
43
- {
44
- double d = NUM2DBL(vd);
106
+ static VALUE func_eccentricity(VALUE self, VALUE vajd){
107
+ double jd = NUM2DBL(vajd);
108
+ double d = jd - DJ00;
45
109
  double ve =
46
110
  0.016709 -
47
111
  1.151e-9 * d;
48
- return DBL2NUM(ve);
112
+ return DBL2NUM(roundf(ve * RND12) / RND12);
49
113
  }
50
114
 
51
- static VALUE
52
- func_equation_of_center(VALUE self, VALUE vd)
53
- {
115
+ /*
116
+ static VALUE func_equation_of_center(VALUE self, VALUE vajd){
54
117
  double vma =
55
- NUM2DBL(func_mean_anomally(self, vd));
118
+ NUM2DBL(func_mean_anomaly(self, vajd));
56
119
  double ve =
57
- NUM2DBL(func_eccentricity(self, vd));
120
+ NUM2DBL(func_eccentricity(self, vajd));
58
121
  double ve2 = ve * 2.0;
59
122
  double vesqr = ve * ve;
60
123
  double vesqr54 = 5.0 / 4.0 * vesqr;
@@ -63,193 +126,256 @@ func_equation_of_center(VALUE self, VALUE vd)
63
126
  ve2 * sin(vma) +
64
127
  vesqr54 * sin(2 * vma) +
65
128
  vecube12 * (13.0 * sin(3 * vma) - 3.0 * sin(vma));
66
- return DBL2NUM(veoc);
129
+ return DBL2NUM(roundf(veoc * RND12) / RND12);
130
+ }
131
+ */
132
+
133
+ static VALUE func_equation_of_center(VALUE self, VALUE vajd){
134
+ double mas =
135
+ NUM2DBL(func_mean_anomaly(self, vajd));
136
+ double eoe =
137
+ NUM2DBL(func_eccentricity(self, vajd));
138
+ double sin1a = sin(1.0 * mas) * 1.0 / 4.0;
139
+ double sin1b = sin(1.0 * mas) * 5.0 / 96.0;
140
+ double sin2a = sin(2.0 * mas) * 11.0 / 24.0;
141
+ double sin2b = sin(2.0 * mas) * 5.0 / 4.0;
142
+ double sin3a = sin(3.0 * mas) * 13.0 / 12.0;
143
+ double sin3b = sin(3.0 * mas) * 43.0 / 64.0;
144
+ double sin4 = sin(4.0 * mas) * 103.0 / 96.0;
145
+ double sin5 = sin(5.0 * mas) * 1097.0 / 960.0;
146
+ double ad3 = sin3a - sin1a;
147
+ double ad4 = sin4 - sin2a;
148
+ double ad5 = sin5 + sin1b - sin3b;
149
+ double veoc = eoe * (sin1a * 8.0 + eoe * (sin2b + eoe * (ad3 + eoe * (ad4 + eoe * ad5))));
150
+ return DBL2NUM(roundf(veoc * RND12) / RND12);
67
151
  }
68
152
 
69
- static VALUE
70
- func_true_anomally(VALUE self, VALUE vd)
71
- {
153
+ static VALUE func_true_anomaly(VALUE self, VALUE vajd){
72
154
  double vma =
73
- NUM2DBL(func_mean_anomally(self, vd));
155
+ NUM2DBL(func_mean_anomaly(self, vajd));
74
156
  double veoc =
75
- NUM2DBL(func_equation_of_center(self, vd));
157
+ NUM2DBL(func_equation_of_center(self, vajd));
76
158
  double vta = vma + veoc;
77
- return DBL2NUM(vta);
159
+ return DBL2NUM(roundf(vta * RND12) / RND12);
78
160
  }
79
161
 
80
- static VALUE
81
- func_mean_longitude(VALUE self, VALUE vd)
82
- {
83
- double d = NUM2DBL(vd);
162
+ static VALUE func_mean_longitude(VALUE self, VALUE vajd){
163
+ double jd = NUM2DBL(vajd);
164
+ double d = jd - DJ00;
84
165
  double vml =
85
166
  fmod(
86
167
  (280.4664567 +
87
168
  0.9856473601037645 * d
88
169
  ) * D2R, M2PI);
89
- return DBL2NUM(vml);
170
+ return DBL2NUM(roundf(vml * RND12) / RND12);
90
171
  }
91
172
 
92
- static VALUE
93
- func_eccentric_anomally(VALUE self, VALUE vd)
94
- {
173
+ static VALUE func_eccentric_anomaly(VALUE self, VALUE vajd){
95
174
  double ve =
96
- NUM2DBL(func_eccentricity(self, vd));
175
+ NUM2DBL(func_eccentricity(self, vajd));
97
176
  double vml =
98
- NUM2DBL(func_mean_longitude(self, vd));
177
+ NUM2DBL(func_mean_longitude(self, vajd));
99
178
  double vea =
100
179
  vml + ve * sin(vml) * (1.0 + ve * cos(vml));
101
- return DBL2NUM(vea);
180
+ return DBL2NUM(roundf(vea * RND12) / RND12);
102
181
  }
103
182
 
104
- static VALUE
105
- func_obliquity_of_ecliptic(VALUE self, VALUE vd)
106
- {
107
- double d = NUM2DBL(vd);
183
+ static VALUE func_obliquity_of_ecliptic(VALUE self, VALUE vajd){
184
+ double jd = NUM2DBL(vajd);
185
+ double d = jd - DJ00;
108
186
  double vooe =
109
187
  (23.439291 - 3.563E-7 * d) * D2R;
110
- return DBL2NUM(vooe);
188
+ return DBL2NUM(roundf(vooe * RND12) / RND12);
111
189
  }
112
190
 
113
- static VALUE
114
- func_longitude_of_perihelion(VALUE self, VALUE vd)
115
- {
116
- double d = NUM2DBL(vd);
191
+ static VALUE func_longitude_of_perihelion(VALUE self, VALUE vajd){
192
+ double jd = NUM2DBL(vajd);
193
+ double d = jd - DJ00;
117
194
  double vlop =
118
195
  fmod(
119
196
  (282.9404 +
120
197
  4.70935e-05 * d
121
198
  ) * D2R, M2PI);
122
- return DBL2NUM(vlop);
199
+ return DBL2NUM(roundf(vlop * RND12) / RND12);
123
200
  }
124
201
 
125
- static VALUE
126
- func_xv(VALUE self, VALUE vd)
127
- {
202
+ static VALUE func_xv(VALUE self, VALUE vajd){
128
203
  double vea =
129
- NUM2DBL(func_eccentric_anomally(self, vd));
204
+ NUM2DBL(func_eccentric_anomaly(self, vajd));
130
205
  double ve =
131
- NUM2DBL(func_eccentricity(self, vd));
206
+ NUM2DBL(func_eccentricity(self, vajd));
132
207
  double vxv = cos(vea) - ve;
133
- return DBL2NUM(vxv);
208
+ return DBL2NUM(roundf(vxv * RND12) / RND12);
134
209
  }
135
210
 
136
- static VALUE
137
- func_yv(VALUE self, VALUE vd)
138
- {
211
+ static VALUE func_yv(VALUE self, VALUE vajd){
139
212
  double vea =
140
- NUM2DBL(func_eccentric_anomally(self, vd));
213
+ NUM2DBL(func_eccentric_anomaly(self, vajd));
141
214
  double ve =
142
- NUM2DBL(func_eccentricity(self, vd));
215
+ NUM2DBL(func_eccentricity(self, vajd));
143
216
  double vyv =
144
217
  sqrt(1.0 - ve * ve) * sin(vea);
145
- return DBL2NUM(vyv);
218
+ return DBL2NUM(roundf(vyv * RND12) / RND12);
219
+ }
220
+
221
+ static VALUE func_true_anomaly1(VALUE self, VALUE vajd){
222
+ double xv = NUM2DBL(func_xv(self, vajd));
223
+ double yv = NUM2DBL(func_yv(self, vajd));
224
+ double vta = anp(atan2(yv, xv));
225
+ return DBL2NUM(roundf(vta * RND12) / RND12);
146
226
  }
147
227
 
148
- static VALUE
149
- func_true_longitude(VALUE self, VALUE vd)
150
- {
228
+ static VALUE func_true_longitude(VALUE self, VALUE vajd){
151
229
  double vta =
152
- NUM2DBL(func_true_anomally(self, vd));
230
+ NUM2DBL(func_true_anomaly(self, vajd));
153
231
  double vlop =
154
- NUM2DBL(func_longitude_of_perihelion(self, vd));
232
+ NUM2DBL(func_longitude_of_perihelion(self, vajd));
155
233
  double vtl =
156
234
  fmod(vta + vlop, M2PI);
157
- return DBL2NUM(vtl);
235
+ return DBL2NUM(roundf(vtl * RND12) / RND12);
236
+ }
237
+
238
+ /*
239
+ static VALUE func_gmsa0(VALUE self, VALUE vajd){
240
+ double tl =
241
+ NUM2DBL(func_true_longitude(self, vajd));
242
+ double st =
243
+ anp(PI + tl) * R2D;
244
+ return DBL2NUM(roundf(st * RND12) / RND12);
245
+ }
246
+ */
247
+
248
+ static VALUE func_mean_sidetime(VALUE self, VALUE vajd){
249
+ double ajd = NUM2DBL(vajd);
250
+ long double sidereal;
251
+ long double t;
252
+ t = (ajd - 2451545.0) / 36525.0;
253
+ /* calc mean angle */
254
+ sidereal =
255
+ 280.46061837 +
256
+ (360.98564736629 * (ajd - 2451545.0)) +
257
+ (0.000387933 * t * t) -
258
+ (t * t * t / 38710000.0);
259
+ sidereal = anp(sidereal * D2R) * R2D;
260
+ /* change to hours */
261
+ return DBL2NUM(fmod(roundf((sidereal / 15.0) * RND12) / RND12, 24.0));
262
+ }
263
+
264
+ static VALUE func_gmsa0(VALUE self, VALUE vajd){
265
+ double msa0;
266
+ double ajd0 = NUM2DBL(vajd);
267
+ double ajdt = fmod(ajd0, 1.0);
268
+ if (ajdt <= 0.5){
269
+ ajd0 -= 0.5;
270
+ ajd0 = floor(ajd0) + 0.5;
271
+ }
272
+ else{
273
+ ajd0 = floor(ajd0) + 0.5;
274
+ }
275
+ msa0 =
276
+ NUM2DBL(func_mean_sidetime(self, DBL2NUM(ajd0))) * 15;
277
+ return DBL2NUM(roundf(msa0 * RND12) / RND12);
278
+ }
279
+
280
+ static VALUE func_gmsa(VALUE self, VALUE vajd){
281
+ double ajd = NUM2DBL(vajd) - 0.5;
282
+ double ajdt = fmod(ajd, 1.0);
283
+ double vtr = ajdt * 24.0 * 1.00273790935 * 15 * D2R;
284
+ double msar0 = NUM2DBL(func_gmsa0(self, vajd)) * D2R;
285
+ double msa = anp(msar0 + vtr) * R2D;
286
+ return DBL2NUM(roundf(msa * RND12) / RND12);
287
+ }
288
+
289
+ static VALUE func_gmst0(VALUE self, VALUE vajd){
290
+ double era0 =
291
+ NUM2DBL(func_gmsa0(self, vajd)) / 15.0;
292
+ return DBL2NUM(roundf(era0 * RND12) / RND12);
158
293
  }
159
294
 
160
- static VALUE
161
- func_rv(VALUE self, VALUE vd)
162
- {
295
+ static VALUE func_gmst(VALUE self, VALUE vajd){
296
+ double vmst = NUM2DBL(func_gmsa(self, vajd)) / 15.0;
297
+ return DBL2NUM(roundf(vmst * RND12) / RND12);
298
+ }
299
+
300
+ static VALUE func_rv(VALUE self, VALUE vajd){
163
301
  double vxv =
164
- NUM2DBL(func_xv(self, vd));
302
+ NUM2DBL(func_xv(self, vajd));
165
303
  double vyv =
166
- NUM2DBL(func_yv(self, vd));
304
+ NUM2DBL(func_yv(self, vajd));
167
305
  double vrv =
168
306
  sqrt(vxv * vxv + vyv * vyv);
169
- return DBL2NUM(vrv);
307
+ return DBL2NUM(roundf(vrv * RND12) / RND12);
170
308
  }
171
309
 
172
- static VALUE
173
- func_ecliptic_x(VALUE self, VALUE vd)
174
- {
310
+ static VALUE func_ecliptic_x(VALUE self, VALUE vajd){
175
311
  double vrv =
176
- NUM2DBL(func_rv(self, vd));
312
+ NUM2DBL(func_rv(self, vajd));
177
313
  double vtl =
178
- NUM2DBL(func_true_longitude(self, vd));
314
+ NUM2DBL(func_true_longitude(self, vajd));
179
315
  double vex = vrv * cos(vtl);
180
- return DBL2NUM(vex);
316
+ return DBL2NUM(roundf(vex * RND12) / RND12);
181
317
  }
182
318
 
183
- static VALUE
184
- func_ecliptic_y(VALUE self, VALUE vd)
185
- {
319
+ static VALUE func_ecliptic_y(VALUE self, VALUE vajd){
186
320
  double vrv =
187
- NUM2DBL(func_rv(self, vd));
321
+ NUM2DBL(func_rv(self, vajd));
188
322
  double vtl =
189
- NUM2DBL(func_true_longitude(self, vd));
323
+ NUM2DBL(func_true_longitude(self, vajd));
190
324
  double vey = vrv * sin(vtl);
191
- return DBL2NUM(vey);
325
+ return DBL2NUM(roundf(vey * RND12) / RND12);
192
326
  }
193
327
 
194
- static VALUE
195
- func_right_ascension(VALUE self, VALUE vd)
196
- {
328
+ static VALUE func_right_ascension(VALUE self, VALUE vajd){
197
329
  double vey =
198
- NUM2DBL(func_ecliptic_y(self, vd));
330
+ NUM2DBL(func_ecliptic_y(self, vajd));
199
331
  double vooe =
200
- NUM2DBL(func_obliquity_of_ecliptic(self, vd));
332
+ NUM2DBL(func_obliquity_of_ecliptic(self, vajd));
201
333
  double vex =
202
- NUM2DBL(func_ecliptic_x(self, vd));
334
+ NUM2DBL(func_ecliptic_x(self, vajd));
203
335
  double vra =
204
336
  fmod(atan2(vey * cos(vooe), vex) + M2PI, M2PI);
205
- return DBL2NUM(vra * R2D / 15.0);
337
+ return DBL2NUM(fmod(roundf((vra * R2D / 15.0) * RND12) / RND12, 24.0));
338
+ }
339
+
340
+ static VALUE func_gha(VALUE self, VALUE vajd){
341
+ double gmsa =
342
+ NUM2DBL(func_mean_sidetime(self, vajd)) * 15 * D2R;
343
+ double ra =
344
+ NUM2DBL(func_right_ascension(self, vajd)) * 15 * D2R;
345
+ double gha = anp(gmsa - ra);
346
+ return DBL2NUM(roundf(gha * R2D * RND12) / RND12);
206
347
  }
207
348
 
208
- static VALUE
209
- func_declination(VALUE self, VALUE vd)
210
- {
349
+ static VALUE func_declination(VALUE self, VALUE vajd){
211
350
  double vex =
212
- NUM2DBL(func_ecliptic_x(self, vd));
351
+ NUM2DBL(func_ecliptic_x(self, vajd));
213
352
  double vey =
214
- NUM2DBL(func_ecliptic_y(self, vd));
353
+ NUM2DBL(func_ecliptic_y(self, vajd));
215
354
  double vooe =
216
- NUM2DBL(func_obliquity_of_ecliptic(self, vd));
355
+ NUM2DBL(func_obliquity_of_ecliptic(self, vajd));
217
356
  double ver = sqrt(vex * vex + vey * vey);
218
357
  double vz = vey * sin(vooe);
219
358
  double vdec = atan2(vz, ver);
220
- return DBL2NUM(vdec);
359
+ return DBL2NUM(roundf((vdec * R2D) * RND12) / RND12);
221
360
  }
222
361
 
223
- static VALUE
224
- func_sidetime(VALUE self, VALUE vjd)
225
- {
226
- double vd = NUM2DBL(vjd);
227
- double vst =
228
- fmod(
229
- (180 + 357.52911 + 282.9404) +
230
- (0.985600281725 + 4.70935E-5) * vd, 360.0);
231
- return DBL2NUM(vst / 15.0);
232
- }
233
-
234
- static VALUE
235
- func_local_sidetime(VALUE self, VALUE vjd, VALUE vlon)
236
- {
237
- double vst = NUM2DBL(func_sidetime(self, vjd));
238
- double vlst = NUM2DBL(vlon) / 15.0 + 12.0 + vst;
239
- return DBL2NUM(fmod(vlst, 24.0));
362
+ static VALUE func_local_sidetime(VALUE self, VALUE vajd, VALUE vlon){
363
+ double vst = NUM2DBL(func_mean_sidetime(self, vajd));
364
+ double vlst = vst + NUM2DBL(vlon) / 15.0 ;
365
+ return DBL2NUM(fmod(roundf(vlst * RND12) / RND12, 24.0));
240
366
  }
241
367
 
242
- static VALUE
243
- func_dlt(VALUE self, VALUE vd, VALUE vlat)
244
- {
368
+ static VALUE func_dlt(VALUE self, VALUE vajd, VALUE vlat){
369
+ double jd = floor(NUM2DBL(vajd));
245
370
  double vsin_alt = sin(-0.8333 * D2R);
246
371
  double vlat_r = NUM2DBL(vlat) * D2R;
247
372
  double vcos_lat = cos(vlat_r);
248
373
  double vsin_lat = sin(vlat_r);
374
+ VALUE vjd = DBL2NUM(jd);
249
375
  double vooe =
250
- NUM2DBL(func_obliquity_of_ecliptic(self, vd));
376
+ NUM2DBL(func_obliquity_of_ecliptic(self, vjd));
251
377
  double vtl =
252
- NUM2DBL(func_true_longitude(self, vd));
378
+ NUM2DBL(func_true_longitude(self, vjd));
253
379
  double vsin_dec = sin(vooe) * sin(vtl);
254
380
  double vcos_dec =
255
381
  sqrt( 1.0 - vsin_dec * vsin_dec );
@@ -259,107 +385,248 @@ func_dlt(VALUE self, VALUE vd, VALUE vlat)
259
385
  (vcos_dec * vcos_lat));
260
386
  double vdla = vdl * R2D;
261
387
  double vdlt = vdla / 15.0 * 2.0;
262
- return DBL2NUM(vdlt);
388
+ return DBL2NUM(roundf(vdlt * RND12) / RND12);
263
389
  }
264
390
 
265
- static VALUE
266
- func_diurnal_arc(VALUE self, VALUE vjd, VALUE vlat)
267
- {
268
- double dlt = NUM2DBL(func_dlt(self, vjd, vlat));
391
+ static VALUE func_diurnal_arc(VALUE self, VALUE vajd, VALUE vlat){
392
+ double jd = floor(NUM2DBL(vajd));
393
+ double dlt = NUM2DBL(func_dlt(self, DBL2NUM(jd), vlat));
269
394
  double da = dlt / 2.0;
270
- return DBL2NUM(da);
395
+ return DBL2NUM(roundf(da * RND12) / RND12);
271
396
  }
272
397
 
273
- static VALUE
274
- func_t_south(VALUE self, VALUE vjd, VALUE vlon)
275
- {
276
- double lst = NUM2DBL(func_local_sidetime(self, vjd, vlon));
277
- double ra = NUM2DBL(func_right_ascension(self, vjd));
398
+ static VALUE func_t_south(VALUE self, VALUE vajd, VALUE vlon){
399
+ double jd = floor(NUM2DBL(vajd));
400
+ double lst = NUM2DBL(func_local_sidetime(self, DBL2NUM(jd), vlon));
401
+ double ra = NUM2DBL(func_right_ascension(self, DBL2NUM(jd)));
278
402
  double vx = lst - ra;
279
403
  double vt = vx - 24.0 * floor(vx * INV24 + 0.5);
280
- return DBL2NUM(12 - vt);
404
+ //printf("%f", jd);
405
+ return DBL2NUM(fmod(roundf((12.0 - vt) * RND12) / RND12, 24.0));
406
+ //return DBL2NUM(fmod(-vx, 24.0));
407
+ //return DBL2NUM(lst - ra);
408
+ }
409
+
410
+ static VALUE func_t_rise(VALUE self, VALUE vajd, VALUE vlat, VALUE vlon){
411
+ double ts = NUM2DBL(func_t_south(self, vajd, vlon));
412
+ double da = NUM2DBL(func_diurnal_arc(self, vajd, vlat));
413
+ return DBL2NUM(fmod(roundf((ts - da) * RND12) / RND12, 24.0));
414
+ }
415
+
416
+ static VALUE func_t_mid_day(VALUE self, VALUE vajd, VALUE vlat, VALUE vlon){
417
+ double ts = NUM2DBL(func_t_south(self, vajd, vlon));
418
+ return DBL2NUM(fmod(roundf(ts * RND12) / RND12, 24.0));
419
+ }
420
+
421
+ static VALUE func_t_set(VALUE self, VALUE vajd, VALUE vlat, VALUE vlon){
422
+ double ts = NUM2DBL(func_t_south(self, vajd, vlon));
423
+ double da = NUM2DBL(func_diurnal_arc(self, vajd, vlat));
424
+ return DBL2NUM(roundf(fmod((ts + da), 24.0) * RND12) / RND12);
425
+ }
426
+
427
+ static VALUE func_rise(VALUE self, VALUE vajd, VALUE vlat, VALUE vlon){
428
+ double rt = NUM2DBL(func_t_rise(self, vajd, vlat, vlon));
429
+ double ajd = NUM2DBL(vajd);
430
+ double rtajd = floor(ajd) - 0.5 + rt / 24.0;
431
+ VALUE vrt = DBL2NUM(rtajd);
432
+ //VALUE date = rb_sprintf("Sun rises: %2.0f:%02.0f UTC\n",
433
+ //floor(rt), floor(fmod(rt, 1) * 60.0));
434
+ return func_ajd_2_datetime(self, vrt);
435
+ }
436
+
437
+ static VALUE func_rise_jd(VALUE self, VALUE vajd, VALUE vlat, VALUE vlon){
438
+ double rt = NUM2DBL(func_t_rise(self, vajd, vlat, vlon));
439
+ double ajd = NUM2DBL(vajd);
440
+ double rtajd = floor(ajd) - 0.5 + rt / 24.0;
441
+ return DBL2NUM(rtajd);
442
+ }
443
+
444
+ static VALUE func_noon(VALUE self, VALUE vajd, VALUE vlat, VALUE vlon){
445
+ double nt = NUM2DBL(func_t_south(self, vajd, vlon));
446
+ double ajd = NUM2DBL(vajd);
447
+ double ntajd = floor(ajd) - 0.5 + nt / 24.0;
448
+ VALUE vnt = DBL2NUM(ntajd);
449
+ //VALUE date = rb_sprintf("Sun noon: %2.0f:%02.0f UTC\n",
450
+ //floor(nt), floor(fmod(nt, 1.0) * 60.0));
451
+ return func_ajd_2_datetime(self, vnt);
452
+ }
453
+
454
+ static VALUE func_noon_jd(VALUE self, VALUE vajd, VALUE vlat, VALUE vlon){
455
+ double nt = NUM2DBL(func_t_south(self, vajd, vlon));
456
+ double ajd = NUM2DBL(vajd);
457
+ double ntajd = floor(ajd) - 0.5 + nt / 24.0;
458
+ return DBL2NUM(ntajd);
459
+ }
460
+
461
+ static VALUE func_set(VALUE self, VALUE vajd, VALUE vlat, VALUE vlon){
462
+ VALUE vst;
463
+ double stajd;
464
+ double st = NUM2DBL(func_t_set(self, vajd, vlat, vlon));
465
+ double nt = NUM2DBL(func_t_mid_day(self, vajd, vlat, vlon));
466
+ double ajd = NUM2DBL(vajd);
467
+ if (st < nt){
468
+ st += 24.0;
469
+ }
470
+ stajd = floor(ajd) - 0.5 + st / 24.0;
471
+ vst = DBL2NUM(stajd);
472
+ //VALUE date = rb_sprintf("Sun set: %2.0f:%02.0f UTC\n",
473
+ //floor(st), floor(fmod(st, 1.0) * 60.0));
474
+ return func_ajd_2_datetime(self, vst);
475
+ }
476
+
477
+ static VALUE func_set_jd(VALUE self, VALUE vajd, VALUE vlat, VALUE vlon){
478
+ double stajd;
479
+ double st = NUM2DBL(func_t_set(self, vajd, vlat, vlon));
480
+ double nt = NUM2DBL(func_t_mid_day(self, vajd, vlat, vlon));
481
+ double ajd = NUM2DBL(vajd);
482
+ if (st < nt){
483
+ st += 24.0;
484
+ }
485
+ stajd = floor(ajd) - 0.5 + st / 24.0;
486
+ return DBL2NUM(stajd);
281
487
  }
282
488
 
283
- static VALUE
284
- func_t_rise(VALUE self, VALUE vjd, VALUE vlon, VALUE vlat)
285
- {
286
- double ts = NUM2DBL(func_t_south(self, vjd, vlon));
287
- double da = NUM2DBL(func_diurnal_arc(self, vjd, vlat));
288
- return DBL2NUM(ts - da);
489
+ /* Get the days to J2000 h is UT in decimal hours only works between 1901 to 2099
490
+ static inline double
491
+ days_since_2000_Jan_0(int year, int month, int day, double hours){
492
+ double days_till_J2000;
493
+ days_till_J2000 = 367 * year - (7 * (
494
+ year + (month + 9) / 12) / 4) + 275 * month / 9 + day - 730531.5 + hours / 24;
495
+ return(days_till_J2000);
289
496
  }
497
+ */
290
498
 
291
- static VALUE
292
- func_t_set(VALUE self, VALUE vjd, VALUE vlon, VALUE vlat)
293
- {
294
- double ts = NUM2DBL(func_t_south(self, vjd, vlon));
295
- double da = NUM2DBL(func_diurnal_arc(self, vjd, vlat));
296
- return DBL2NUM(ts + da);
499
+ #define days_since_2000_Jan_0(y,m,d) \
500
+ (367L * (y) - ((7 * ((y) + (((m) + 9) / 12))) / 4) + ((275 * (m)) /9) + (d) - 730531.5L)
501
+
502
+ static VALUE func_jd_from_2000(VALUE self, VALUE vajd){
503
+ /*VALUE vdatetime = func_ajd_2_datetime(self, vajd);
504
+ int year = NUM2INT(rb_funcall(vdatetime, rb_intern("year"), 0));
505
+ int month = NUM2INT(rb_funcall(vdatetime, rb_intern("month"), 0));
506
+ int day = NUM2INT(rb_funcall(vdatetime, rb_intern("day"), 0));
507
+ double days = days_since_2000_Jan_0(year, month, day);*/
508
+ double ajd = NUM2DBL(vajd);
509
+ double days = ajd - 2451545.0;
510
+ return INT2NUM(days);
511
+ }
512
+
513
+ static VALUE func_days_from_2000(VALUE self, VALUE vajd, VALUE vlon){
514
+ double jd = NUM2DBL(vajd);
515
+ double lon = NUM2DBL(vlon);
516
+ double days = jd - DJ00 - lon / 360;
517
+ return DBL2NUM(roundf(days * RND12) / RND12);
518
+ }
519
+
520
+ static VALUE func_eot(VALUE self, VALUE vajd){
521
+ double ma =
522
+ NUM2DBL(func_mean_anomaly(self, vajd));
523
+ double ta =
524
+ NUM2DBL(func_true_anomaly(self, vajd));
525
+ double tl =
526
+ NUM2DBL(func_true_longitude(self, vajd));
527
+ double ra = 15.0 * D2R *
528
+ NUM2DBL(func_right_ascension(self, vajd));
529
+ return DBL2NUM(roundf(anp(ma - ta + tl - ra) * R2D * RND12) / RND12 );
530
+ }
531
+
532
+ static VALUE func_eot_min(VALUE self, VALUE vajd){
533
+ double eot = NUM2DBL(func_eot(self, vajd));
534
+ return DBL2NUM(roundf((eot / 15 * 60) * RND12) / RND12);
535
+ }
536
+
537
+ static VALUE func_min_to_s(VALUE self, VALUE vmin){
538
+ return Qnil;
297
539
  }
298
540
 
299
- static VALUE
300
- func_t_mid_day(VALUE self, VALUE vjd, VALUE vlon, VALUE vlat)
301
- {
302
- double tr = NUM2DBL(func_t_rise(self, vjd, vlon, vlat));
303
- double ts = NUM2DBL(func_t_set(self, vjd, vlon, vlat));
304
- return DBL2NUM((tr + ts) / 2.0);
541
+ static VALUE func_lha(VALUE self, VALUE vajd, VALUE vlon){
542
+ double lon = NUM2DBL(vlon) * D2R;
543
+ double gha = NUM2DBL(func_gha(self, vajd)) * D2R;
544
+ double lha = anp(gha + lon) * R2D;
545
+ return DBL2NUM(roundf(lha * RND12) / RND12);
546
+ }
547
+
548
+ static VALUE func_altitude(VALUE self, VALUE vajd, VALUE vlat, VALUE vlon){
549
+ double lat = NUM2DBL(vlat) * D2R;
550
+ double delta = NUM2DBL(func_declination(self, vajd)) * D2R;
551
+ double lha = NUM2DBL(func_lha(self, vajd, vlon)) * D2R;
552
+ double alt =
553
+ asin(sin(lat) * sin(delta) +
554
+ cos(lat) * cos(delta) * cos(lha)) * R2D;
555
+ return DBL2NUM(roundf(alt * RND12) / RND12);
556
+ }
557
+
558
+ static VALUE func_azimuth(VALUE self, VALUE vajd, VALUE vlat, VALUE vlon){
559
+ double lat = NUM2DBL(vlat) * D2R;
560
+ double delta = NUM2DBL(func_declination(self, vajd)) * D2R;
561
+ double lha = NUM2DBL(func_lha(self, vajd, vlon)) * D2R;
562
+ double az;
563
+ az =
564
+ atan2(sin(lha), cos(lha) * sin(lat) -
565
+ tan(delta) * cos(lat)) * R2D + 180.0;
566
+ return DBL2NUM(roundf(az * RND12) / RND12);
567
+ }
568
+
569
+ static VALUE func_rev12(VALUE self, VALUE vx){
570
+ double x = NUM2DBL(vx);
571
+ return DBL2NUM(x - 24.0 * floor(x * INV24 + 0.5));
305
572
  }
306
573
 
307
- void Init_calc_sun(void)
308
- {
309
- VALUE cCalcSun =
310
- rb_define_class("CalcSun", rb_cObject);
574
+ void Init_calc_sun(void){
575
+ VALUE cCalcSun = rb_define_class("CalcSun", rb_cObject);
576
+ rb_require("date");
577
+ // rb_define_const(cCalcSun, "DJ00", DBL2NUM(DJ00));
578
+ //VALUE cDate = rb_const_get(rb_cObject, rb_intern("Date"));
579
+ //VALUE rb_date = rb_funcall(cDate, rb_intern("new"), 0);
580
+ //rb_iv_set(self, "@date", rb_date);
311
581
  rb_define_method(cCalcSun, "initialize", t_init, 0);
312
- rb_define_method(cCalcSun,
313
- "reverse_12", func_rev12, 1);
314
- rb_define_method(cCalcSun,
315
- "mean_anomally", func_mean_anomally, 1);
316
- rb_define_method(cCalcSun,
317
- "eccentricity", func_eccentricity, 1);
318
- rb_define_method(cCalcSun,
319
- "equation_of_center", func_equation_of_center, 1);
320
- rb_define_method(cCalcSun,
321
- "true_anomally", func_true_anomally, 1);
322
- rb_define_method(cCalcSun,
323
- "mean_longitude", func_mean_longitude, 1);
324
- rb_define_method(cCalcSun,
325
- "eccentric_anomally",
326
- func_eccentric_anomally, 1);
327
- rb_define_method(cCalcSun,
328
- "obliquity_of_ecliptic",
329
- func_obliquity_of_ecliptic, 1);
330
- rb_define_method(cCalcSun,
331
- "longitude_of_perihelion",
332
- func_longitude_of_perihelion, 1);
333
- // rb_define_method(cCalcSun,
334
- // "xv", func_xv, 1);
335
- // rb_define_method(cCalcSun,
336
- // "yv", func_yv, 1);
337
- rb_define_method(cCalcSun,
338
- "true_longitude", func_true_longitude, 1);
339
- // rb_define_method(cCalcSun,
340
- // "rv", func_rv, 1);
341
- // rb_define_method(cCalcSun,
342
- // "ecliptic_x", func_ecliptic_x, 1);
343
- // rb_define_method(cCalcSun,
344
- // "ecliptic_y", func_ecliptic_y, 1);
345
- rb_define_method(cCalcSun,
346
- "right_ascension", func_right_ascension, 1);
347
- rb_define_method(cCalcSun,
348
- "declination", func_declination, 1);
349
- rb_define_method(cCalcSun,
350
- "sidereal_time", func_sidetime, 1);
351
- rb_define_method(cCalcSun,
352
- "local_sidereal_time", func_local_sidetime, 2);
353
- rb_define_method(cCalcSun,
354
- "dlt", func_dlt, 2);
355
- rb_define_method(cCalcSun,
356
- "diurnal_arc", func_diurnal_arc, 2);
357
- rb_define_method(cCalcSun,
358
- "t_south", func_t_south, 2);
359
- rb_define_method(cCalcSun,
360
- "t_rise", func_t_rise, 3);
361
- rb_define_method(cCalcSun,
362
- "t_set", func_t_set, 3);
363
- rb_define_method(cCalcSun,
364
- "t_mid_day", func_t_mid_day, 3);
582
+ rb_define_attr(cCalcSun, "date", 1, 1);
583
+ rb_define_method(cCalcSun, "ajd", func_get_ajd, 1);
584
+ rb_define_method(cCalcSun, "ajd2dt", func_ajd_2_datetime, 1);
585
+ rb_define_method(cCalcSun, "altitude", func_altitude, 3);
586
+ rb_define_method(cCalcSun, "azimuth", func_azimuth, 3);
587
+ rb_define_method(cCalcSun, "daylight_time", func_dlt, 2);
588
+ rb_define_method(cCalcSun, "declination", func_declination, 1);
589
+ rb_define_method(cCalcSun, "diurnal_arc", func_diurnal_arc, 2);
590
+ rb_define_method(cCalcSun, "eccentricity", func_eccentricity, 1);
591
+ rb_define_method(cCalcSun, "eccentric_anomaly", func_eccentric_anomaly, 1);
592
+ rb_define_method(cCalcSun, "ecliptic_x", func_ecliptic_x, 1);
593
+ rb_define_method(cCalcSun, "ecliptic_y", func_ecliptic_y, 1);
594
+ rb_define_method(cCalcSun, "eot_min", func_eot_min, 1);
595
+ rb_define_method(cCalcSun, "equation_of_center", func_equation_of_center, 1);
596
+ rb_define_method(cCalcSun, "equation_of_time", func_eot, 1);
597
+ rb_define_method(cCalcSun, "gha", func_gha, 1);
598
+ rb_define_method(cCalcSun, "gmsa0", func_gmsa0, 1);
599
+ rb_define_method(cCalcSun, "gmsa", func_gmsa, 1);
600
+ rb_define_method(cCalcSun, "gmst0", func_gmst0, 1);
601
+ rb_define_method(cCalcSun, "gmst", func_gmst, 1);
602
+ rb_define_method(cCalcSun, "jd", func_get_jd, 1);
603
+ rb_define_method(cCalcSun, "jd2000_dif", func_jd_from_2000, 1);
604
+ rb_define_method(cCalcSun, "jd2000_dif_lon", func_days_from_2000, 2);
605
+ rb_define_method(cCalcSun, "lha", func_lha, 2);
606
+ rb_define_method(cCalcSun, "local_sidereal_time", func_local_sidetime, 2);
607
+ rb_define_method(cCalcSun, "longitude_of_perihelion", func_longitude_of_perihelion, 1);
608
+ rb_define_method(cCalcSun, "mean_anomaly", func_mean_anomaly, 1);
609
+ rb_define_method(cCalcSun, "mean_longitude", func_mean_longitude, 1);
610
+ rb_define_method(cCalcSun, "mean_sidereal_time", func_mean_sidetime, 1);
611
+ rb_define_method(cCalcSun, "min_to_s", func_min_to_s, 1);
612
+ rb_define_method(cCalcSun, "noon", func_noon, 3);
613
+ rb_define_method(cCalcSun, "noon_jd", func_noon_jd, 3);
614
+ rb_define_method(cCalcSun, "obliquity_of_ecliptic", func_obliquity_of_ecliptic, 1);
615
+ rb_define_method(cCalcSun, "radius_vector", func_rv, 1);
616
+ rb_define_method(cCalcSun, "reverse_12", func_rev12, 1);
617
+ rb_define_method(cCalcSun, "right_ascension", func_right_ascension, 1);
618
+ rb_define_method(cCalcSun, "rise", func_rise, 3);
619
+ rb_define_method(cCalcSun, "rise_jd", func_rise_jd, 3);
620
+ rb_define_method(cCalcSun, "set", func_set, 3);
621
+ rb_define_method(cCalcSun, "set_jd", func_set_jd, 3);
622
+ rb_define_method(cCalcSun, "set_datetime", func_set_datetime, 1);
623
+ rb_define_method(cCalcSun, "t_mid_day", func_t_mid_day, 3);
624
+ rb_define_method(cCalcSun, "t_rise", func_t_rise, 3);
625
+ rb_define_method(cCalcSun, "t_set", func_t_set, 3);
626
+ rb_define_method(cCalcSun, "t_south", func_t_south, 2);
627
+ rb_define_method(cCalcSun, "true_anomaly", func_true_anomaly, 1);
628
+ rb_define_method(cCalcSun, "true_anomaly1", func_true_anomaly1, 1);
629
+ rb_define_method(cCalcSun, "true_longitude", func_true_longitude, 1);
630
+ rb_define_method(cCalcSun, "xv", func_xv, 1);
631
+ rb_define_method(cCalcSun, "yv", func_yv, 1);
365
632
  }