calc_sun 1.2.8 → 1.2.9

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d2a97912158413d5cabb50716d0b96395b95558d
4
- data.tar.gz: 3d5d6b8e3936de236a62956205faf7616a97af66
3
+ metadata.gz: 17ba770fc7f7e5fba650d574db11d2f821628647
4
+ data.tar.gz: b2d518e421c8f5c4db7bfd9509f9e664c85f07ad
5
5
  SHA512:
6
- metadata.gz: a6c9e12783949cfb6cbeab472a39a43b27dc8e2d277e53185293b10867ac4f79c52af0f6009e811d95397eed820c0bcf39b331c57f99ca5dae3cb347fcdac775
7
- data.tar.gz: 0ed71a31906f0a06a05dccf772fdcd51ca26ac76682eeb66a236f65001d763f7baaa69ac64d447e3b69131438df5c37eaa87b44cdd85eefbabb978834001f941
6
+ metadata.gz: d901c66a7f59225201d44e0f110812a0f7dc799a68ff1684af2ff0a6e559effaeb8d308ea1c175215252ed4f99c9bcd235f426217c77bf20f3af55422c2548ea
7
+ data.tar.gz: 8b3d353868169de3fac48059028292444fdd5a2d4d4d3766578d02093db431c14661421b5fcd47d0280aa70f4e620fd894ac9c5ee97aa2d65ffc2a4a8e810330
checksums.yaml.gz.sig CHANGED
Binary file
data.tar.gz.sig CHANGED
Binary file
data/README.rdoc CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  Home :: https://rubygems.org/gems/calc_sun
7
7
  Code :: https://github.com/DouglasAllen/calc_sun
8
- RDoc :: http://www.rubydoc.info/gems/calc_sun/0.1.1
8
+ RDoc :: http://www.rubydoc.info/gems/calc_sun/1.2.9
9
9
  Issues :: https://github.com/DouglasAllen/calc_sun/issues
10
10
 
11
11
 
@@ -31,7 +31,7 @@ since version 1.2.6
31
31
  or make a batchfile to start your envirnment with 'run devkitvars'
32
32
  cd to calc_sun dir
33
33
  $> gem build calc_sun.gemspec
34
- $> gem install calc_sun-1.2.6.gem -l
34
+ $> gem install calc_sun-1.2.9.gem -l
35
35
 
36
36
  === DEVELOPERS:
37
37
 
@@ -66,11 +66,19 @@ and generate the RDoc.
66
66
 
67
67
  # set the date with set_date as date is just an ivar
68
68
  day = cs.set_datetime('2003-10-17 12:30:30')
69
- puts day
69
+ puts day.httpdate
70
70
 
71
- puts "Sun rise: #{cs.rise(day.ajd, lat, lon).httpdate}"
72
- puts "Sun noon: #{cs.noon(day.ajd, lat, lon).httpdate}"
73
- puts "Sun set: #{cs.set(day.ajd, lat, lon).httpdate}"
71
+ puts "Sun rise: #{cs.rise(day.jd, lat, lon).httpdate}"
72
+ puts "Sun noon: #{cs.noon(day.jd, lat, lon).httpdate}"
73
+ puts "Sun set: #{cs.set(day.jd, lat, lon).httpdate}"
74
+
75
+ puts "Sun AJD rise: #{cs.rise_jd(day.jd, lat, lon)}"
76
+ puts "Sun AJD noon: #{cs.noon_jd(day.jd, lat, lon)}"
77
+ puts "Sun AJD set: #{cs.set_jd(day.jd, lat, lon)}"
78
+
79
+ puts "Sun azimuth rise: #{cs.rise_az(day.jd, lat, lon)}"
80
+ puts "Sun azimuth noon: #{cs.noon_az(day.jd, lat, lon)}"
81
+ puts "Sun azimuth set: #{cs.set_az(day.jd, lat, lon)}"
74
82
 
75
83
  === LICENSE:
76
84
 
data/calc_sun.gemspec CHANGED
@@ -9,11 +9,13 @@ Gem::Specification.new do |spec|
9
9
  spec.author = 'Douglas Allen'
10
10
  spec.email = ['kb9agt@gmail.com']
11
11
  spec.summary = 'Calculates Sun Times ea. rise, noon, set'
12
- spec.description = 'supply the date as a Julian Day Number, latitude decimal, and
13
- longitude decimal in the calls to each method
12
+ spec.description = 'Given a Julian Day Number of day,
13
+ latitude decimal, and
14
+ longitude decimal in the calls to instance methods
14
15
  rise(jd, lat, lon),
15
16
  noon(jd, lat, lon), and
16
- set(jd, lat, lon)'
17
+ set(jd, lat, lon)
18
+ see source code for more details'
17
19
  spec.homepage = 'https://github.com/DouglasAllen/calc_sun'
18
20
  spec.license = 'MIT'
19
21
  require 'English'
@@ -16,7 +16,9 @@
16
16
  # define INV360 1.0 / 360.0
17
17
  # define DJ00 2451545.0L
18
18
  # define RND12 1000000000000.0L
19
-
19
+ /* macro for normalizing
20
+ * angles into 0-2pie range
21
+ */
20
22
  static inline double
21
23
  anp(double angle){
22
24
  double w = fmod(angle, M2PI);
@@ -28,7 +30,7 @@ anp(double angle){
28
30
  * call-seq:
29
31
  * initialize()
30
32
  *
31
- * Create CalcSun class Ruby object.
33
+ * Create CalcSun class instance Ruby object.
32
34
  *
33
35
  */
34
36
  static VALUE t_init(VALUE self){
@@ -36,9 +38,14 @@ static VALUE t_init(VALUE self){
36
38
  }
37
39
  /*
38
40
  * call-seq:
39
- * date('yyyy-mm-dd')
41
+ * date('yyyy-mm-ddT00:00:00+/-zoneoffset')
42
+ * or
43
+ * date('20010203T040506+0700')
44
+ * or
45
+ * date('3rd Feb 2001 04:05:06 PM')
40
46
  *
41
- * convert input string to DateTime object.
47
+ * given a string representing date time
48
+ * convert to DateTime object.
42
49
  *
43
50
  */
44
51
  static VALUE func_set_datetime(VALUE self, VALUE vdatetime){
@@ -50,7 +57,8 @@ static VALUE func_set_datetime(VALUE self, VALUE vdatetime){
50
57
  * call-seq:
51
58
  * ajd2dt(ajd)
52
59
  *
53
- * convert input float to DateTime object.
60
+ * give Astronomical Julian Day Number
61
+ * convert to DateTime object.
54
62
  *
55
63
  */
56
64
  static VALUE func_ajd_2_datetime(VALUE self, VALUE vajd){
@@ -64,7 +72,8 @@ static VALUE func_ajd_2_datetime(VALUE self, VALUE vajd){
64
72
  * call-seq:
65
73
  * ajd(date)
66
74
  *
67
- * convert Date or DateTime object to AJD number.
75
+ * given Date or DateTime object
76
+ * convert to Astronomical Julian Day Number.
68
77
  *
69
78
  */
70
79
  static VALUE func_get_ajd(VALUE self, VALUE vdatetime){
@@ -75,7 +84,8 @@ static VALUE func_get_ajd(VALUE self, VALUE vdatetime){
75
84
  * call-seq:
76
85
  * jd(date)
77
86
  *
78
- * convert Date or DateTime object to JD number.
87
+ * given Date or DateTime object
88
+ * convert to JD number.
79
89
  *
80
90
  */
81
91
  static VALUE func_get_jd(VALUE self, VALUE vdatetime){
@@ -85,10 +95,10 @@ static VALUE func_get_jd(VALUE self, VALUE vdatetime){
85
95
 
86
96
  /*
87
97
  * call-seq:
88
- * mean_anomaly(date)
98
+ * mean_anomaly(ajd)
89
99
  *
90
- * convert Date or DateTime object to float
91
- * representing Solar Mean Anomaly in radians.
100
+ * given an Astronomical Julian Day Number
101
+ * returns Mean Anomaly of Sun in radians.
92
102
  *
93
103
  */
94
104
  static VALUE func_mean_anomaly(VALUE self, VALUE vajd){
@@ -102,7 +112,14 @@ static VALUE func_mean_anomaly(VALUE self, VALUE vajd){
102
112
  t * (1.0 / -313315926.8929504))))) * D2R, M2PI);
103
113
  return DBL2NUM(roundf(vma * RND12) / RND12);
104
114
  }
105
-
115
+ /*
116
+ * call-seq:
117
+ * eccentricity(ajd)
118
+ *
119
+ * given an Astronomical Julian Day Number
120
+ * returns Eccentriciy of Earth Orbit around Sun.
121
+ *
122
+ */
106
123
  static VALUE func_eccentricity(VALUE self, VALUE vajd){
107
124
  double jd = NUM2DBL(vajd);
108
125
  double d = jd - DJ00;
@@ -113,21 +130,12 @@ static VALUE func_eccentricity(VALUE self, VALUE vajd){
113
130
  }
114
131
 
115
132
  /*
116
- static VALUE func_equation_of_center(VALUE self, VALUE vajd){
117
- double vma =
118
- NUM2DBL(func_mean_anomaly(self, vajd));
119
- double ve =
120
- NUM2DBL(func_eccentricity(self, vajd));
121
- double ve2 = ve * 2.0;
122
- double vesqr = ve * ve;
123
- double vesqr54 = 5.0 / 4.0 * vesqr;
124
- double vecube12 = (vesqr * ve) / 12.0;
125
- double veoc =
126
- ve2 * sin(vma) +
127
- vesqr54 * sin(2 * vma) +
128
- vecube12 * (13.0 * sin(3 * vma) - 3.0 * sin(vma));
129
- return DBL2NUM(roundf(veoc * RND12) / RND12);
130
- }
133
+ * call-seq:
134
+ * equation_of_center(ajd)
135
+ *
136
+ * given an Astronomical Julian Day Number
137
+ * returns Equation of Center in radians.
138
+ *
131
139
  */
132
140
 
133
141
  static VALUE func_equation_of_center(VALUE self, VALUE vajd){
@@ -149,7 +157,14 @@ static VALUE func_equation_of_center(VALUE self, VALUE vajd){
149
157
  double veoc = eoe * (sin1a * 8.0 + eoe * (sin2b + eoe * (ad3 + eoe * (ad4 + eoe * ad5))));
150
158
  return DBL2NUM(roundf(veoc * RND12) / RND12);
151
159
  }
152
-
160
+ /*
161
+ * call-seq:
162
+ * true_anomaly(ajd)
163
+ *
164
+ * given an Astronomical Julian Day Number
165
+ * returns True Anomaly of Sun in radians.
166
+ *
167
+ */
153
168
  static VALUE func_true_anomaly(VALUE self, VALUE vajd){
154
169
  double vma =
155
170
  NUM2DBL(func_mean_anomaly(self, vajd));
@@ -158,7 +173,14 @@ static VALUE func_true_anomaly(VALUE self, VALUE vajd){
158
173
  double vta = vma + veoc;
159
174
  return DBL2NUM(roundf(vta * RND12) / RND12);
160
175
  }
161
-
176
+ /*
177
+ * call-seq:
178
+ * mean_longitude(ajd)
179
+ *
180
+ * given an Astronomical Julian Day Number
181
+ * returns Mean Longitude of Sun in radians.
182
+ *
183
+ */
162
184
  static VALUE func_mean_longitude(VALUE self, VALUE vajd){
163
185
  double jd = NUM2DBL(vajd);
164
186
  double d = jd - DJ00;
@@ -169,7 +191,14 @@ static VALUE func_mean_longitude(VALUE self, VALUE vajd){
169
191
  ) * D2R, M2PI);
170
192
  return DBL2NUM(roundf(vml * RND12) / RND12);
171
193
  }
172
-
194
+ /*
195
+ * call-seq:
196
+ * eccentric_anomaly(ajd)
197
+ *
198
+ * given an Astronomical Julian Day Number
199
+ * returns Eccentric Anomaly of Sun in radians.
200
+ *
201
+ */
173
202
  static VALUE func_eccentric_anomaly(VALUE self, VALUE vajd){
174
203
  double ve =
175
204
  NUM2DBL(func_eccentricity(self, vajd));
@@ -179,7 +208,14 @@ static VALUE func_eccentric_anomaly(VALUE self, VALUE vajd){
179
208
  vml + ve * sin(vml) * (1.0 + ve * cos(vml));
180
209
  return DBL2NUM(roundf(vea * RND12) / RND12);
181
210
  }
182
-
211
+ /*
212
+ * call-seq:
213
+ * obliquity_of_ecliptic(ajd)
214
+ *
215
+ * given an Astronomical Julian Day Number
216
+ * returns Earth Tilt (Obliquity) in radians.
217
+ *
218
+ */
183
219
  static VALUE func_obliquity_of_ecliptic(VALUE self, VALUE vajd){
184
220
  double jd = NUM2DBL(vajd);
185
221
  double d = jd - DJ00;
@@ -187,18 +223,30 @@ static VALUE func_obliquity_of_ecliptic(VALUE self, VALUE vajd){
187
223
  (23.439291 - 3.563E-7 * d) * D2R;
188
224
  return DBL2NUM(roundf(vooe * RND12) / RND12);
189
225
  }
190
-
226
+ /*
227
+ * call-seq:
228
+ * longitude_of_perihelion(ajd)
229
+ *
230
+ * given an Astronomical Julian Day Number
231
+ * returns Longitude of Sun at Perihelion in radians.
232
+ *
233
+ *
234
+ */
191
235
  static VALUE func_longitude_of_perihelion(VALUE self, VALUE vajd){
192
- double jd = NUM2DBL(vajd);
193
- double d = jd - DJ00;
194
- double vlop =
195
- fmod(
196
- (282.9404 +
197
- 4.70935e-05 * d
198
- ) * D2R, M2PI);
236
+ double vml = NUM2DBL(func_mean_longitude(self, vajd));
237
+ double vma = NUM2DBL(func_mean_anomaly(self, vajd));
238
+ double vlop = anp(vml - vma);
199
239
  return DBL2NUM(roundf(vlop * RND12) / RND12);
200
240
  }
201
-
241
+ /*
242
+ * call-seq:
243
+ * xv(ajd)
244
+ *
245
+ * given an Astronomical Julian Day Number
246
+ * returns X component of Radius Vector in radians.
247
+ *
248
+ *
249
+ */
202
250
  static VALUE func_xv(VALUE self, VALUE vajd){
203
251
  double vea =
204
252
  NUM2DBL(func_eccentric_anomaly(self, vajd));
@@ -207,7 +255,15 @@ static VALUE func_xv(VALUE self, VALUE vajd){
207
255
  double vxv = cos(vea) - ve;
208
256
  return DBL2NUM(roundf(vxv * RND12) / RND12);
209
257
  }
210
-
258
+ /*
259
+ * call-seq:
260
+ * xv(ajd)
261
+ *
262
+ * given an Astronomical Julian Day Number
263
+ * returns Y component of Radius Vector in radians.
264
+ *
265
+ *
266
+ */
211
267
  static VALUE func_yv(VALUE self, VALUE vajd){
212
268
  double vea =
213
269
  NUM2DBL(func_eccentric_anomaly(self, vajd));
@@ -217,34 +273,44 @@ static VALUE func_yv(VALUE self, VALUE vajd){
217
273
  sqrt(1.0 - ve * ve) * sin(vea);
218
274
  return DBL2NUM(roundf(vyv * RND12) / RND12);
219
275
  }
220
-
276
+ /*
277
+ * call-seq:
278
+ * true_anomaly1(ajd)
279
+ *
280
+ * given an Astronomical Julian Day Number
281
+ * returns True Anomaly of Sun in radians.
282
+ *
283
+ */
221
284
  static VALUE func_true_anomaly1(VALUE self, VALUE vajd){
222
285
  double xv = NUM2DBL(func_xv(self, vajd));
223
286
  double yv = NUM2DBL(func_yv(self, vajd));
224
287
  double vta = anp(atan2(yv, xv));
225
288
  return DBL2NUM(roundf(vta * RND12) / RND12);
226
289
  }
227
-
290
+ /*
291
+ * call-seq:
292
+ * true_longitude1(ajd)
293
+ *
294
+ * given an Astronomical Julian Day Number
295
+ * returns True Longitude of Sun in radians.
296
+ *
297
+ */
228
298
  static VALUE func_true_longitude(VALUE self, VALUE vajd){
229
- double vta =
230
- NUM2DBL(func_true_anomaly(self, vajd));
231
- double vlop =
232
- NUM2DBL(func_longitude_of_perihelion(self, vajd));
233
- double vtl =
234
- fmod(vta + vlop, M2PI);
299
+ double vml =
300
+ NUM2DBL(func_mean_longitude(self, vajd));
301
+ double veoc =
302
+ NUM2DBL(func_equation_of_center(self, vajd));
303
+ double vtl = anp(vml + veoc);
235
304
  return DBL2NUM(roundf(vtl * RND12) / RND12);
236
305
  }
237
-
238
306
  /*
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
- }
307
+ * call-seq:
308
+ * mean_sidereal_time(ajd)
309
+ *
310
+ * given an Astronomical Julian Day Number
311
+ * returns Greenwich Mean Sidereal Time in hours.
312
+ *
246
313
  */
247
-
248
314
  static VALUE func_mean_sidetime(VALUE self, VALUE vajd){
249
315
  double ajd = NUM2DBL(vajd);
250
316
  long double sidereal;
@@ -260,7 +326,14 @@ static VALUE func_mean_sidetime(VALUE self, VALUE vajd){
260
326
  /* change to hours */
261
327
  return DBL2NUM(fmod(roundf((sidereal / 15.0) * RND12) / RND12, 24.0));
262
328
  }
263
-
329
+ /*
330
+ * call-seq:
331
+ * gmsa0(ajd)
332
+ *
333
+ * given an Astronomical Julian Day Number
334
+ * returns Greenwich Mean Sidereal Time at midnight as angle.
335
+ *
336
+ */
264
337
  static VALUE func_gmsa0(VALUE self, VALUE vajd){
265
338
  double msa0;
266
339
  double ajd0 = NUM2DBL(vajd);
@@ -276,7 +349,14 @@ static VALUE func_gmsa0(VALUE self, VALUE vajd){
276
349
  NUM2DBL(func_mean_sidetime(self, DBL2NUM(ajd0))) * 15;
277
350
  return DBL2NUM(roundf(msa0 * RND12) / RND12);
278
351
  }
279
-
352
+ /*
353
+ * call-seq:
354
+ * gmsa(ajd)
355
+ *
356
+ * given an Astronomical Julian Day Number
357
+ * returns Greenwich Mean Sidereal Time as angle.
358
+ *
359
+ */
280
360
  static VALUE func_gmsa(VALUE self, VALUE vajd){
281
361
  double ajd = NUM2DBL(vajd) - 0.5;
282
362
  double ajdt = fmod(ajd, 1.0);
@@ -285,18 +365,39 @@ static VALUE func_gmsa(VALUE self, VALUE vajd){
285
365
  double msa = anp(msar0 + vtr) * R2D;
286
366
  return DBL2NUM(roundf(msa * RND12) / RND12);
287
367
  }
288
-
368
+ /*
369
+ * call-seq:
370
+ * gmst0(ajd)
371
+ *
372
+ * given an Astronomical Julian Day Number
373
+ * returns Greenwich Mean Sidereal Time at midnight in hours.
374
+ *
375
+ */
289
376
  static VALUE func_gmst0(VALUE self, VALUE vajd){
290
377
  double era0 =
291
378
  NUM2DBL(func_gmsa0(self, vajd)) / 15.0;
292
379
  return DBL2NUM(roundf(era0 * RND12) / RND12);
293
380
  }
294
-
381
+ /*
382
+ * call-seq:
383
+ * gmst(ajd)
384
+ *
385
+ * given an Astronomical Julian Day Number
386
+ * returns Greenwich Mean Sidereal Time in hours.
387
+ *
388
+ */
295
389
  static VALUE func_gmst(VALUE self, VALUE vajd){
296
390
  double vmst = NUM2DBL(func_gmsa(self, vajd)) / 15.0;
297
391
  return DBL2NUM(roundf(vmst * RND12) / RND12);
298
392
  }
299
-
393
+ /*
394
+ * call-seq:
395
+ * radius_vector(ajd)
396
+ *
397
+ * given an Astronomical Julian Day Number
398
+ * returns radius vector.
399
+ *
400
+ */
300
401
  static VALUE func_rv(VALUE self, VALUE vajd){
301
402
  double vxv =
302
403
  NUM2DBL(func_xv(self, vajd));
@@ -306,7 +407,14 @@ static VALUE func_rv(VALUE self, VALUE vajd){
306
407
  sqrt(vxv * vxv + vyv * vyv);
307
408
  return DBL2NUM(roundf(vrv * RND12) / RND12);
308
409
  }
309
-
410
+ /*
411
+ * call-seq:
412
+ * ecliptic_x(ajd)
413
+ *
414
+ * given an Astronomical Julian Day Number
415
+ * returns ecliptic x component.
416
+ *
417
+ */
310
418
  static VALUE func_ecliptic_x(VALUE self, VALUE vajd){
311
419
  double vrv =
312
420
  NUM2DBL(func_rv(self, vajd));
@@ -315,7 +423,14 @@ static VALUE func_ecliptic_x(VALUE self, VALUE vajd){
315
423
  double vex = vrv * cos(vtl);
316
424
  return DBL2NUM(roundf(vex * RND12) / RND12);
317
425
  }
318
-
426
+ /*
427
+ * call-seq:
428
+ * ecliptic_y(ajd)
429
+ *
430
+ * given an Astronomical Julian Day Number
431
+ * returns ecliptic y component.
432
+ *
433
+ */
319
434
  static VALUE func_ecliptic_y(VALUE self, VALUE vajd){
320
435
  double vrv =
321
436
  NUM2DBL(func_rv(self, vajd));
@@ -324,7 +439,14 @@ static VALUE func_ecliptic_y(VALUE self, VALUE vajd){
324
439
  double vey = vrv * sin(vtl);
325
440
  return DBL2NUM(roundf(vey * RND12) / RND12);
326
441
  }
327
-
442
+ /*
443
+ * call-seq:
444
+ * right_ascension(ajd)
445
+ *
446
+ * given an Astronomical Julian Day Number
447
+ * returns Right Ascension of Sun in hours.
448
+ *
449
+ */
328
450
  static VALUE func_right_ascension(VALUE self, VALUE vajd){
329
451
  double vey =
330
452
  NUM2DBL(func_ecliptic_y(self, vajd));
@@ -336,7 +458,14 @@ static VALUE func_right_ascension(VALUE self, VALUE vajd){
336
458
  fmod(atan2(vey * cos(vooe), vex) + M2PI, M2PI);
337
459
  return DBL2NUM(fmod(roundf((vra * R2D / 15.0) * RND12) / RND12, 24.0));
338
460
  }
339
-
461
+ /*
462
+ * call-seq:
463
+ * gha(ajd)
464
+ *
465
+ * given an Astronomical Julian Day Number
466
+ * returns Greenwich Hour Angle in degrees.
467
+ *
468
+ */
340
469
  static VALUE func_gha(VALUE self, VALUE vajd){
341
470
  double gmsa =
342
471
  NUM2DBL(func_mean_sidetime(self, vajd)) * 15 * D2R;
@@ -345,7 +474,14 @@ static VALUE func_gha(VALUE self, VALUE vajd){
345
474
  double gha = anp(gmsa - ra);
346
475
  return DBL2NUM(roundf(gha * R2D * RND12) / RND12);
347
476
  }
348
-
477
+ /*
478
+ * call-seq:
479
+ * declination(ajd)
480
+ *
481
+ * given an Astronomical Julian Day Number
482
+ * returns Declination of Sun in degrees.
483
+ *
484
+ */
349
485
  static VALUE func_declination(VALUE self, VALUE vajd){
350
486
  double vex =
351
487
  NUM2DBL(func_ecliptic_x(self, vajd));
@@ -358,13 +494,29 @@ static VALUE func_declination(VALUE self, VALUE vajd){
358
494
  double vdec = atan2(vz, ver);
359
495
  return DBL2NUM(roundf((vdec * R2D) * RND12) / RND12);
360
496
  }
361
-
497
+ /*
498
+ * call-seq:
499
+ * local_sidereal_time(ajd, lon)
500
+ *
501
+ * given an Astronomical Julian Day Number and
502
+ * local Longitude,
503
+ * returns Local Mean Sidereal Time in hours.
504
+ *
505
+ */
362
506
  static VALUE func_local_sidetime(VALUE self, VALUE vajd, VALUE vlon){
363
507
  double vst = NUM2DBL(func_mean_sidetime(self, vajd));
364
508
  double vlst = vst + NUM2DBL(vlon) / 15.0 ;
365
509
  return DBL2NUM(fmod(roundf(vlst * RND12) / RND12, 24.0));
366
510
  }
367
-
511
+ /*
512
+ * call-seq:
513
+ * daylight_time(ajd, lat)
514
+ *
515
+ * given an Astronomical Julian Day Number and
516
+ * local Latitude,
517
+ * returns Hours of Day Light.
518
+ *
519
+ */
368
520
  static VALUE func_dlt(VALUE self, VALUE vajd, VALUE vlat){
369
521
  double jd = floor(NUM2DBL(vajd));
370
522
  double vsin_alt = sin(-0.8333 * D2R);
@@ -387,77 +539,152 @@ static VALUE func_dlt(VALUE self, VALUE vajd, VALUE vlat){
387
539
  double vdlt = vdla / 15.0 * 2.0;
388
540
  return DBL2NUM(roundf(vdlt * RND12) / RND12);
389
541
  }
390
-
542
+ /*
543
+ * call-seq:
544
+ * diurnal_arc(ajd, lat)
545
+ *
546
+ * given an Astronomical Julian Day Number and
547
+ * local Latitude,
548
+ * returns Hours from Noon or half Day Light Time.
549
+ *
550
+ */
391
551
  static VALUE func_diurnal_arc(VALUE self, VALUE vajd, VALUE vlat){
392
552
  double jd = floor(NUM2DBL(vajd));
393
553
  double dlt = NUM2DBL(func_dlt(self, DBL2NUM(jd), vlat));
394
554
  double da = dlt / 2.0;
395
555
  return DBL2NUM(roundf(da * RND12) / RND12);
396
556
  }
397
-
557
+ /*
558
+ * call-seq:
559
+ * t_south(ajd, lon)
560
+ *
561
+ * given an Astronomical Julian Day Number and
562
+ * local Longitude,
563
+ * returns Time in Hours when Sun transits local meridian.
564
+ *
565
+ */
398
566
  static VALUE func_t_south(VALUE self, VALUE vajd, VALUE vlon){
399
567
  double jd = floor(NUM2DBL(vajd));
400
568
  double lst = NUM2DBL(func_local_sidetime(self, DBL2NUM(jd), vlon));
401
569
  double ra = NUM2DBL(func_right_ascension(self, DBL2NUM(jd)));
402
570
  double vx = lst - ra;
403
571
  double vt = vx - 24.0 * floor(vx * INV24 + 0.5);
404
- //printf("%f", jd);
405
572
  return DBL2NUM(fmod(roundf((12.0 - vt) * RND12) / RND12, 24.0));
406
- //return DBL2NUM(fmod(-vx, 24.0));
407
- //return DBL2NUM(lst - ra);
408
573
  }
409
-
574
+ /*
575
+ * call-seq:
576
+ * t_rise(ajd, lat, lon)
577
+ *
578
+ * given an Astronomical Julian Day Number and
579
+ * local Latitude and Longitude,
580
+ * returns Time in Hours when Sun rises.
581
+ *
582
+ */
410
583
  static VALUE func_t_rise(VALUE self, VALUE vajd, VALUE vlat, VALUE vlon){
411
584
  double ts = NUM2DBL(func_t_south(self, vajd, vlon));
412
585
  double da = NUM2DBL(func_diurnal_arc(self, vajd, vlat));
413
586
  return DBL2NUM(fmod(roundf((ts - da) * RND12) / RND12, 24.0));
414
587
  }
415
-
588
+ /*
589
+ * call-seq:
590
+ * t_mid_day(ajd, lat, lon)
591
+ *
592
+ * given an Astronomical Julian Day Number and
593
+ * local Latitude and Longitude,
594
+ * returns Time in Hours when Sun transits local meridian.
595
+ *
596
+ */
416
597
  static VALUE func_t_mid_day(VALUE self, VALUE vajd, VALUE vlat, VALUE vlon){
417
598
  double ts = NUM2DBL(func_t_south(self, vajd, vlon));
418
599
  return DBL2NUM(fmod(roundf(ts * RND12) / RND12, 24.0));
419
600
  }
420
-
601
+ /*
602
+ * call-seq:
603
+ * t_set(ajd, lat, lon)
604
+ *
605
+ * given an Astronomical Julian Day Number and
606
+ * local Latitude and Longitude,
607
+ * returns Time in Hours when Sun sets.
608
+ *
609
+ */
421
610
  static VALUE func_t_set(VALUE self, VALUE vajd, VALUE vlat, VALUE vlon){
422
611
  double ts = NUM2DBL(func_t_south(self, vajd, vlon));
423
612
  double da = NUM2DBL(func_diurnal_arc(self, vajd, vlat));
424
613
  return DBL2NUM(roundf(fmod((ts + da), 24.0) * RND12) / RND12);
425
614
  }
426
-
615
+ /*
616
+ * call-seq:
617
+ * rise(ajd. lat, lon)
618
+ *
619
+ * given an Astronomical Julian Day Number and
620
+ * local Latitude and Longitude,
621
+ * returns a Ruby DateTime object when Sun rises.
622
+ *
623
+ */
427
624
  static VALUE func_rise(VALUE self, VALUE vajd, VALUE vlat, VALUE vlon){
428
625
  double rt = NUM2DBL(func_t_rise(self, vajd, vlat, vlon));
429
626
  double ajd = NUM2DBL(vajd);
430
627
  double rtajd = floor(ajd) - 0.5 + rt / 24.0;
431
628
  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
629
  return func_ajd_2_datetime(self, vrt);
435
630
  }
436
-
631
+ /*
632
+ * call-seq:
633
+ * rise_jd(ajd, lat, lon)
634
+ *
635
+ * given an Astronomical Julian Day Number and
636
+ * local Latitude and Longitude,
637
+ * returns a Astronomical Julian Day Number when Sun rises.
638
+ *
639
+ */
437
640
  static VALUE func_rise_jd(VALUE self, VALUE vajd, VALUE vlat, VALUE vlon){
438
641
  double rt = NUM2DBL(func_t_rise(self, vajd, vlat, vlon));
439
642
  double ajd = NUM2DBL(vajd);
440
643
  double rtajd = floor(ajd) - 0.5 + rt / 24.0;
441
644
  return DBL2NUM(rtajd);
442
645
  }
443
-
646
+ /*
647
+ * call-seq:
648
+ * noon(ajd, lat, lon)
649
+ *
650
+ * given an Astronomical Julian Day Number and
651
+ * local Latitude and Longitude,
652
+ * returns a Ruby DateTime object when Sun transits
653
+ * local meridian.
654
+ *
655
+ */
444
656
  static VALUE func_noon(VALUE self, VALUE vajd, VALUE vlat, VALUE vlon){
445
657
  double nt = NUM2DBL(func_t_south(self, vajd, vlon));
446
658
  double ajd = NUM2DBL(vajd);
447
659
  double ntajd = floor(ajd) - 0.5 + nt / 24.0;
448
660
  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
661
  return func_ajd_2_datetime(self, vnt);
452
662
  }
453
-
663
+ /*
664
+ * call-seq:
665
+ * noon_jd(ajd, lat, lon)
666
+ *
667
+ * given an Astronomical Julian Day Number and
668
+ * local Latitude and Longitude,
669
+ * returns a Astronomical Julian Day Number when Sun
670
+ * transits local meridian.
671
+ *
672
+ */
454
673
  static VALUE func_noon_jd(VALUE self, VALUE vajd, VALUE vlat, VALUE vlon){
455
674
  double nt = NUM2DBL(func_t_south(self, vajd, vlon));
456
675
  double ajd = NUM2DBL(vajd);
457
676
  double ntajd = floor(ajd) - 0.5 + nt / 24.0;
458
677
  return DBL2NUM(ntajd);
459
678
  }
460
-
679
+ /*
680
+ * call-seq:
681
+ * set(ajd, lat, lon)
682
+ *
683
+ * given an Astronomical Julian Day Number and
684
+ * local Latitude and Longitude,
685
+ * returns a Ruby DateTime object when Sun sets.
686
+ *
687
+ */
461
688
  static VALUE func_set(VALUE self, VALUE vajd, VALUE vlat, VALUE vlon){
462
689
  VALUE vst;
463
690
  double stajd;
@@ -473,7 +700,15 @@ static VALUE func_set(VALUE self, VALUE vajd, VALUE vlat, VALUE vlon){
473
700
  //floor(st), floor(fmod(st, 1.0) * 60.0));
474
701
  return func_ajd_2_datetime(self, vst);
475
702
  }
476
-
703
+ /*
704
+ * call-seq:
705
+ * set_jd(ajd, lat, lon)
706
+ *
707
+ * given an Astronomical Julian Day Number and
708
+ * local Latitude and Longitude,
709
+ * returns a Astronomical Julian Day Number when Sun sets.
710
+ *
711
+ */
477
712
  static VALUE func_set_jd(VALUE self, VALUE vajd, VALUE vlat, VALUE vlon){
478
713
  double stajd;
479
714
  double st = NUM2DBL(func_t_set(self, vajd, vlat, vlon));
@@ -485,38 +720,49 @@ static VALUE func_set_jd(VALUE self, VALUE vajd, VALUE vlat, VALUE vlon){
485
720
  stajd = floor(ajd) - 0.5 + st / 24.0;
486
721
  return DBL2NUM(stajd);
487
722
  }
488
-
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);
496
- }
723
+ /*
724
+ * macro for days since JD 2000
497
725
  */
498
-
499
726
  #define days_since_2000_Jan_0(y,m,d) \
500
727
  (367L * (y) - ((7 * ((y) + (((m) + 9) / 12))) / 4) + ((275 * (m)) /9) + (d) - 730531.5L)
501
-
728
+ /*
729
+ * call-seq:
730
+ * jd2000_dif(ajd)
731
+ *
732
+ * given an Astronomical Julian Day Number
733
+ * returns the number of days and decimal time
734
+ * since JD 2000.
735
+ *
736
+ */
502
737
  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
738
  double ajd = NUM2DBL(vajd);
509
739
  double days = ajd - 2451545.0;
510
740
  return INT2NUM(days);
511
741
  }
512
-
742
+ /*
743
+ * call-seq:
744
+ * jd2000_dif_lon(ajd, lon)
745
+ *
746
+ * given an Astronomical Julian Day Number and
747
+ * local Longitude,
748
+ * returns the number of days and decimal time
749
+ * since JD 2000.
750
+ *
751
+ */
513
752
  static VALUE func_days_from_2000(VALUE self, VALUE vajd, VALUE vlon){
514
753
  double jd = NUM2DBL(vajd);
515
754
  double lon = NUM2DBL(vlon);
516
755
  double days = jd - DJ00 - lon / 360;
517
756
  return DBL2NUM(roundf(days * RND12) / RND12);
518
757
  }
519
-
758
+ /*
759
+ * call-seq:
760
+ * eot(ajd)
761
+ *
762
+ * given an Astronomical Julian Day Number
763
+ * returns equation of time in degrees
764
+ *
765
+ */
520
766
  static VALUE func_eot(VALUE self, VALUE vajd){
521
767
  double ma =
522
768
  NUM2DBL(func_mean_anomaly(self, vajd));
@@ -528,23 +774,57 @@ static VALUE func_eot(VALUE self, VALUE vajd){
528
774
  NUM2DBL(func_right_ascension(self, vajd));
529
775
  return DBL2NUM(roundf(anp(ma - ta + tl - ra) * R2D * RND12) / RND12 );
530
776
  }
531
-
777
+ /*
778
+ * call-seq:
779
+ * eot_jd(ajd)
780
+ *
781
+ * given an Astronomical Julian Day Number
782
+ * returns equation of time as time of a fractional
783
+ * day for easy Julian Number work
784
+ *
785
+ */
786
+ static VALUE func_eot_jd(VALUE self, VALUE vajd){
787
+ double veot =
788
+ NUM2DBL(func_eot(self, vajd));
789
+ double jdeot = veot / 360.0;
790
+ return DBL2NUM(roundf(jdeot * RND12) / RND12);
791
+ }
792
+ /*
793
+ * call-seq:
794
+ * eot_min(ajd)
795
+ *
796
+ * given an Astronomical Julian Day Number
797
+ * returns equation of time in minutes
798
+ *
799
+ */
532
800
  static VALUE func_eot_min(VALUE self, VALUE vajd){
533
801
  double eot = NUM2DBL(func_eot(self, vajd));
534
802
  return DBL2NUM(roundf((eot / 15 * 60) * RND12) / RND12);
535
803
  }
536
-
537
- static VALUE func_min_to_s(VALUE self, VALUE vmin){
538
- return Qnil;
539
- }
540
-
804
+ /*
805
+ * call-seq:
806
+ * lha(ajd, lon)
807
+ *
808
+ * given an Astronomical Julian Day Number and
809
+ * local Longitude,
810
+ * returns Local Hour Angle in degrees.
811
+ *
812
+ */
541
813
  static VALUE func_lha(VALUE self, VALUE vajd, VALUE vlon){
542
814
  double lon = NUM2DBL(vlon) * D2R;
543
815
  double gha = NUM2DBL(func_gha(self, vajd)) * D2R;
544
816
  double lha = anp(gha + lon) * R2D;
545
817
  return DBL2NUM(roundf(lha * RND12) / RND12);
546
818
  }
547
-
819
+ /*
820
+ * call-seq:
821
+ * altitude(ajd, lat, lon)
822
+ *
823
+ * given an Astronomical Julian Day Number and
824
+ * local Latitude and Longitude,
825
+ * returns the Altitude of the Sun in degrees.
826
+ *
827
+ */
548
828
  static VALUE func_altitude(VALUE self, VALUE vajd, VALUE vlat, VALUE vlon){
549
829
  double lat = NUM2DBL(vlat) * D2R;
550
830
  double delta = NUM2DBL(func_declination(self, vajd)) * D2R;
@@ -554,7 +834,15 @@ static VALUE func_altitude(VALUE self, VALUE vajd, VALUE vlat, VALUE vlon){
554
834
  cos(lat) * cos(delta) * cos(lha)) * R2D;
555
835
  return DBL2NUM(roundf(alt * RND12) / RND12);
556
836
  }
557
-
837
+ /*
838
+ * call-seq:
839
+ * azimuth(ajd, lat, lon)
840
+ *
841
+ * given an Astronomical Julian Day Number and
842
+ * local Latitude and Longitude,
843
+ * returns the Azimuth of the Sun in degrees.
844
+ *
845
+ */
558
846
  static VALUE func_azimuth(VALUE self, VALUE vajd, VALUE vlat, VALUE vlon){
559
847
  double lat = NUM2DBL(vlat) * D2R;
560
848
  double delta = NUM2DBL(func_declination(self, vajd)) * D2R;
@@ -565,30 +853,50 @@ static VALUE func_azimuth(VALUE self, VALUE vajd, VALUE vlat, VALUE vlon){
565
853
  tan(delta) * cos(lat)) * R2D + 180.0;
566
854
  return DBL2NUM(roundf(az * RND12) / RND12);
567
855
  }
568
-
856
+ /*
857
+ * call-seq:
858
+ * rise_az(ajd, lat, lon)
859
+ *
860
+ * given an Astronomical Julian Day Number and
861
+ * local Latitude and Longitude,
862
+ * returns the Azimuth of the Sun rise in degrees.
863
+ *
864
+ */
569
865
  static VALUE func_rise_az(VALUE self, VALUE vajd, VALUE vlat, VALUE vlon){
570
866
  double rjd = NUM2DBL(func_rise_jd(self, vajd, vlat, vlon));
571
867
  double raz = NUM2DBL(func_azimuth(self, DBL2NUM(rjd), vlat, vlon));
572
868
  return DBL2NUM(raz);
573
869
  }
574
-
870
+ /*
871
+ * call-seq:
872
+ * noon_az(ajd, lat, lon)
873
+ *
874
+ * given an Astronomical Julian Day Number and
875
+ * local Latitude and Longitude,
876
+ * returns the Azimuth of the Sun at transit in degrees.
877
+ * Note : should be very close to 180 degrees.
878
+ *
879
+ */
575
880
  static VALUE func_noon_az(VALUE self, VALUE vajd, VALUE vlat, VALUE vlon){
576
881
  double njd = NUM2DBL(func_noon_jd(self, vajd, vlat, vlon));
577
882
  double naz = NUM2DBL(func_azimuth(self, DBL2NUM(njd), vlat, vlon));
578
883
  return DBL2NUM(naz);
579
884
  }
580
-
885
+ /*
886
+ * call-seq:
887
+ * set_az(ajd, lat, lon)
888
+ *
889
+ * given an Astronomical Julian Day Number and
890
+ * local Latitude and Longitude,
891
+ * returns the Azimuth of the Sun set in degrees.
892
+ *
893
+ */
581
894
  static VALUE func_set_az(VALUE self, VALUE vajd, VALUE vlat, VALUE vlon){
582
895
  double sjd = NUM2DBL(func_set_jd(self, vajd, vlat, vlon));
583
896
  double saz = NUM2DBL(func_azimuth(self, DBL2NUM(sjd), vlat, vlon));
584
897
  return DBL2NUM(saz);
585
898
  }
586
899
 
587
- static VALUE func_rev12(VALUE self, VALUE vx){
588
- double x = NUM2DBL(vx);
589
- return DBL2NUM(x - 24.0 * floor(x * INV24 + 0.5));
590
- }
591
-
592
900
  void Init_calc_sun(void){
593
901
  VALUE cCalcSun = rb_define_class("CalcSun", rb_cObject);
594
902
  rb_require("date");
@@ -609,9 +917,10 @@ void Init_calc_sun(void){
609
917
  rb_define_method(cCalcSun, "eccentric_anomaly", func_eccentric_anomaly, 1);
610
918
  rb_define_method(cCalcSun, "ecliptic_x", func_ecliptic_x, 1);
611
919
  rb_define_method(cCalcSun, "ecliptic_y", func_ecliptic_y, 1);
920
+ rb_define_method(cCalcSun, "eot", func_eot, 1);
921
+ rb_define_method(cCalcSun, "eot_jd", func_eot_jd, 1);
612
922
  rb_define_method(cCalcSun, "eot_min", func_eot_min, 1);
613
923
  rb_define_method(cCalcSun, "equation_of_center", func_equation_of_center, 1);
614
- rb_define_method(cCalcSun, "equation_of_time", func_eot, 1);
615
924
  rb_define_method(cCalcSun, "gha", func_gha, 1);
616
925
  rb_define_method(cCalcSun, "gmsa0", func_gmsa0, 1);
617
926
  rb_define_method(cCalcSun, "gmsa", func_gmsa, 1);
@@ -626,13 +935,11 @@ void Init_calc_sun(void){
626
935
  rb_define_method(cCalcSun, "mean_anomaly", func_mean_anomaly, 1);
627
936
  rb_define_method(cCalcSun, "mean_longitude", func_mean_longitude, 1);
628
937
  rb_define_method(cCalcSun, "mean_sidereal_time", func_mean_sidetime, 1);
629
- rb_define_method(cCalcSun, "min_to_s", func_min_to_s, 1);
630
938
  rb_define_method(cCalcSun, "noon", func_noon, 3);
631
939
  rb_define_method(cCalcSun, "noon_jd", func_noon_jd, 3);
632
940
  rb_define_method(cCalcSun, "noon_az", func_noon_az, 3);
633
941
  rb_define_method(cCalcSun, "obliquity_of_ecliptic", func_obliquity_of_ecliptic, 1);
634
942
  rb_define_method(cCalcSun, "radius_vector", func_rv, 1);
635
- rb_define_method(cCalcSun, "reverse_12", func_rev12, 1);
636
943
  rb_define_method(cCalcSun, "right_ascension", func_right_ascension, 1);
637
944
  rb_define_method(cCalcSun, "rise", func_rise, 3);
638
945
  rb_define_method(cCalcSun, "rise_jd", func_rise_jd, 3);
@@ -2,5 +2,5 @@
2
2
 
3
3
  # class file CalcSun
4
4
  class CalcSun
5
- VERSION = '1.2.8'.freeze
5
+ VERSION = '1.2.9'.freeze
6
6
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: calc_sun
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.8
4
+ version: 1.2.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Douglas Allen
@@ -30,14 +30,16 @@ cert_chain:
30
30
  J4L8DCnzZFU8ARwINSdPvhk8WzXpVgErPQezTziVg7gAtBjqdJO5qVlAiOp+z7m2
31
31
  gT57pae1qMGtqvMp
32
32
  -----END CERTIFICATE-----
33
- date: 2017-04-06 00:00:00.000000000 Z
33
+ date: 2017-04-07 00:00:00.000000000 Z
34
34
  dependencies: []
35
35
  description: |-
36
- supply the date as a Julian Day Number, latitude decimal, and
37
- longitude decimal in the calls to each method
36
+ Given a Julian Day Number of day,
37
+ latitude decimal, and
38
+ longitude decimal in the calls to instance methods
38
39
  rise(jd, lat, lon),
39
40
  noon(jd, lat, lon), and
40
41
  set(jd, lat, lon)
42
+ see source code for more details
41
43
  email:
42
44
  - kb9agt@gmail.com
43
45
  executables: []
metadata.gz.sig CHANGED
@@ -1,2 +1,3 @@
1
- gŤ� ����$*�$/e
2
- )��_�@�d�l�����>��nLgIW���.V2\;*jeaf�U�kU] {������JE:ٺ�,*����r[֥x\�+(^�q��8#w����紡�oF����󓫛gV�^��~\��<�hu3TV������9e����r>'�(6���U�Y=���J���O�Ee��e�S��iP�l����C�򗶴>A�'Ȗ�
1
+ y���'�2�^����e����8J<�2�itd�E��$9�Ÿ��l��K�QnX'�w�$�B�ᦀ�TzEDF�"Kc�J
2
+ �/p5{f|Z�]dQ7}mvG'��c.$P�O��Vq��3�Q_���'�3)R����lW_
3
+ Q��:5�