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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/.autotest +15 -0
- data/.gitignore +12 -0
- data/.source_index +0 -0
- data/.travis.yml +5 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +19 -28
- data/Guardfile +41 -0
- data/LICENSE.txt +21 -21
- data/Manifest.txt +20 -4
- data/README.rdoc +45 -37
- data/Rakefile +76 -11
- data/calc_sun.gemspec +10 -15
- data/dev.md +49 -0
- data/example/Almanac.html +1456 -0
- data/example/Makefile +10 -0
- data/example/adt_helper.rb +91 -0
- data/example/askgeo_query.rb +32 -0
- data/example/eq_center.md +15 -0
- data/example/sunriset.c +670 -0
- data/example/sunriset.exe +0 -0
- data/example/sunriset.rb +16 -28
- data/example/test_my_times.rb +134 -0
- data/ext/calc_sun/calc_sun.c +491 -224
- data/ext/side_time/extconf.rb +5 -0
- data/ext/side_time/side_time.c +117 -0
- data/lib/calc_sun.rb +1 -0
- data/lib/calc_sun/version.rb +3 -2
- data/lib/side_time/side_time.so +0 -0
- data/lib/side_time/version.rb +7 -0
- data/lib/sidereal_time.rb +4 -0
- metadata +37 -62
- metadata.gz.sig +0 -0
- data/test/calc_sun_test.rb +0 -230
Binary file
|
data/example/sunriset.rb
CHANGED
@@ -1,35 +1,23 @@
|
|
1
|
-
|
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 =
|
11
|
-
lon = -
|
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
|
-
|
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
|
-
|
24
|
-
|
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
|
-
|
27
|
-
|
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
|
-
|
30
|
-
puts
|
31
|
-
|
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
|
data/ext/calc_sun/calc_sun.c
CHANGED
@@ -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
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
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
|
-
|
17
|
-
|
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
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
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
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
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
|
-
(
|
36
|
-
0.
|
37
|
-
|
38
|
-
|
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
|
-
|
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
|
-
|
52
|
-
func_equation_of_center(VALUE self, VALUE
|
53
|
-
{
|
115
|
+
/*
|
116
|
+
static VALUE func_equation_of_center(VALUE self, VALUE vajd){
|
54
117
|
double vma =
|
55
|
-
NUM2DBL(
|
118
|
+
NUM2DBL(func_mean_anomaly(self, vajd));
|
56
119
|
double ve =
|
57
|
-
NUM2DBL(func_eccentricity(self,
|
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(
|
155
|
+
NUM2DBL(func_mean_anomaly(self, vajd));
|
74
156
|
double veoc =
|
75
|
-
NUM2DBL(func_equation_of_center(self,
|
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
|
-
|
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,
|
175
|
+
NUM2DBL(func_eccentricity(self, vajd));
|
97
176
|
double vml =
|
98
|
-
NUM2DBL(func_mean_longitude(self,
|
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
|
-
|
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
|
-
|
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(
|
204
|
+
NUM2DBL(func_eccentric_anomaly(self, vajd));
|
130
205
|
double ve =
|
131
|
-
NUM2DBL(func_eccentricity(self,
|
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(
|
213
|
+
NUM2DBL(func_eccentric_anomaly(self, vajd));
|
141
214
|
double ve =
|
142
|
-
NUM2DBL(func_eccentricity(self,
|
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(
|
230
|
+
NUM2DBL(func_true_anomaly(self, vajd));
|
153
231
|
double vlop =
|
154
|
-
NUM2DBL(func_longitude_of_perihelion(self,
|
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
|
-
|
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,
|
302
|
+
NUM2DBL(func_xv(self, vajd));
|
165
303
|
double vyv =
|
166
|
-
NUM2DBL(func_yv(self,
|
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,
|
312
|
+
NUM2DBL(func_rv(self, vajd));
|
177
313
|
double vtl =
|
178
|
-
NUM2DBL(func_true_longitude(self,
|
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,
|
321
|
+
NUM2DBL(func_rv(self, vajd));
|
188
322
|
double vtl =
|
189
|
-
NUM2DBL(func_true_longitude(self,
|
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,
|
330
|
+
NUM2DBL(func_ecliptic_y(self, vajd));
|
199
331
|
double vooe =
|
200
|
-
NUM2DBL(func_obliquity_of_ecliptic(self,
|
332
|
+
NUM2DBL(func_obliquity_of_ecliptic(self, vajd));
|
201
333
|
double vex =
|
202
|
-
NUM2DBL(func_ecliptic_x(self,
|
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,
|
351
|
+
NUM2DBL(func_ecliptic_x(self, vajd));
|
213
352
|
double vey =
|
214
|
-
NUM2DBL(func_ecliptic_y(self,
|
353
|
+
NUM2DBL(func_ecliptic_y(self, vajd));
|
215
354
|
double vooe =
|
216
|
-
NUM2DBL(func_obliquity_of_ecliptic(self,
|
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
|
-
|
225
|
-
|
226
|
-
|
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
|
-
|
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,
|
376
|
+
NUM2DBL(func_obliquity_of_ecliptic(self, vjd));
|
251
377
|
double vtl =
|
252
|
-
NUM2DBL(func_true_longitude(self,
|
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
|
-
|
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
|
-
|
275
|
-
|
276
|
-
double
|
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
|
-
|
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
|
-
|
284
|
-
|
285
|
-
{
|
286
|
-
double
|
287
|
-
|
288
|
-
|
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
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
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
|
-
|
301
|
-
|
302
|
-
double
|
303
|
-
|
304
|
-
|
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
|
-
|
310
|
-
|
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
|
-
|
313
|
-
"
|
314
|
-
rb_define_method(cCalcSun,
|
315
|
-
"
|
316
|
-
rb_define_method(cCalcSun,
|
317
|
-
"
|
318
|
-
rb_define_method(cCalcSun,
|
319
|
-
"
|
320
|
-
rb_define_method(cCalcSun,
|
321
|
-
"
|
322
|
-
rb_define_method(cCalcSun,
|
323
|
-
"
|
324
|
-
rb_define_method(cCalcSun,
|
325
|
-
"
|
326
|
-
|
327
|
-
rb_define_method(cCalcSun,
|
328
|
-
"
|
329
|
-
|
330
|
-
rb_define_method(cCalcSun,
|
331
|
-
"
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
rb_define_method(cCalcSun,
|
338
|
-
"
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
rb_define_method(cCalcSun,
|
346
|
-
"
|
347
|
-
rb_define_method(cCalcSun,
|
348
|
-
"
|
349
|
-
rb_define_method(cCalcSun,
|
350
|
-
"
|
351
|
-
rb_define_method(cCalcSun,
|
352
|
-
"
|
353
|
-
rb_define_method(cCalcSun,
|
354
|
-
"
|
355
|
-
rb_define_method(cCalcSun,
|
356
|
-
"
|
357
|
-
rb_define_method(cCalcSun,
|
358
|
-
"
|
359
|
-
rb_define_method(cCalcSun,
|
360
|
-
"
|
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
|
}
|