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