calc_sun 0.1.1 → 1.2.6

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.
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
  }