Class: CalcSun

Inherits:
Object
  • Object
show all
Defined in:
lib/calc_sun/version.rb,
ext/calc_sun/calc_sun.c

Overview

class file CalcSun

Constant Summary collapse

VERSION =

version 1.2.5

'1.2.6'

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeObject

Create CalcSun class Ruby object.



34
35
36
# File 'ext/calc_sun/calc_sun.c', line 34

static VALUE t_init(VALUE self){
  return self;
}

Instance Attribute Details

#dateObject

Instance Method Details

#ajd(date) ⇒ Object

convert Date or DateTime object to AJD number.



70
71
72
73
# File 'ext/calc_sun/calc_sun.c', line 70

static VALUE func_get_ajd(VALUE self, VALUE vdatetime){
  double ajd = NUM2DBL(rb_funcall(vdatetime, rb_intern("ajd"), 0));
  return DBL2NUM(ajd);
}

#ajd2dt(ajd) ⇒ Object

convert input float to DateTime object.



56
57
58
59
60
61
62
# File 'ext/calc_sun/calc_sun.c', line 56

static VALUE func_ajd_2_datetime(VALUE self, VALUE vajd){
  VALUE cDateTime = rb_const_get(rb_cObject, rb_intern("DateTime"));
  double ajd = NUM2DBL(vajd) + 0.5;
  VALUE vfajd = DBL2NUM(ajd);
  VALUE vdatetime = rb_funcall(cDateTime, rb_intern("jd"), 1, vfajd);
  return vdatetime;
}

#altitude(vajd, vlat, vlon) ⇒ Object



548
549
550
551
552
553
554
555
556
# File 'ext/calc_sun/calc_sun.c', line 548

static VALUE func_altitude(VALUE self, VALUE vajd, VALUE vlat, VALUE vlon){
  double lat = NUM2DBL(vlat) * D2R;
  double delta = NUM2DBL(func_declination(self, vajd)) * D2R;
  double lha = NUM2DBL(func_lha(self, vajd, vlon)) * D2R;
  double alt =
  asin(sin(lat) * sin(delta) +
    cos(lat) * cos(delta) * cos(lha)) * R2D;
  return DBL2NUM(roundf(alt * RND12) / RND12);
}

#azimuth(vajd, vlat, vlon) ⇒ Object



558
559
560
561
562
563
564
565
566
567
# File 'ext/calc_sun/calc_sun.c', line 558

static VALUE func_azimuth(VALUE self, VALUE vajd, VALUE vlat, VALUE vlon){
  double lat = NUM2DBL(vlat) * D2R;
  double delta = NUM2DBL(func_declination(self, vajd)) * D2R;
  double lha = NUM2DBL(func_lha(self, vajd, vlon)) * D2R;
  double az;
  az =
  atan2(sin(lha), cos(lha) * sin(lat) -
            tan(delta) * cos(lat)) * R2D + 180.0;
  return DBL2NUM(roundf(az * RND12) / RND12);
}

#daylight_time(vajd, vlat) ⇒ Object



368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
# File 'ext/calc_sun/calc_sun.c', line 368

static VALUE func_dlt(VALUE self, VALUE vajd, VALUE vlat){
  double jd = floor(NUM2DBL(vajd));
  double vsin_alt = sin(-0.8333 * D2R);
  double vlat_r = NUM2DBL(vlat) * D2R;
  double vcos_lat = cos(vlat_r);
  double vsin_lat = sin(vlat_r);
  VALUE vjd = DBL2NUM(jd);
  double vooe =
  NUM2DBL(func_obliquity_of_ecliptic(self, vjd));
  double vtl =
  NUM2DBL(func_true_longitude(self, vjd));
  double vsin_dec = sin(vooe) * sin(vtl);
  double vcos_dec =
  sqrt( 1.0 - vsin_dec * vsin_dec );
  double vdl =
  acos(
    (vsin_alt - vsin_dec * vsin_lat) /
    (vcos_dec * vcos_lat));
  double vdla = vdl * R2D;
  double vdlt = vdla / 15.0 * 2.0;
  return DBL2NUM(roundf(vdlt * RND12) / RND12);
}

#declination(vajd) ⇒ Object



349
350
351
352
353
354
355
356
357
358
359
360
# File 'ext/calc_sun/calc_sun.c', line 349

static VALUE func_declination(VALUE self, VALUE vajd){
  double vex =
  NUM2DBL(func_ecliptic_x(self, vajd));
  double vey =
  NUM2DBL(func_ecliptic_y(self, vajd));
  double vooe =
  NUM2DBL(func_obliquity_of_ecliptic(self, vajd));
  double ver = sqrt(vex * vex + vey * vey);
  double vz = vey * sin(vooe);
  double vdec = atan2(vz, ver);
  return DBL2NUM(roundf((vdec * R2D) * RND12) / RND12);
}

#diurnal_arc(vajd, vlat) ⇒ Object



391
392
393
394
395
396
# File 'ext/calc_sun/calc_sun.c', line 391

static VALUE func_diurnal_arc(VALUE self, VALUE vajd, VALUE vlat){
  double jd = floor(NUM2DBL(vajd));
  double dlt = NUM2DBL(func_dlt(self, DBL2NUM(jd), vlat));
  double da = dlt / 2.0;
  return DBL2NUM(roundf(da * RND12) / RND12);
}

#eccentric_anomaly(vajd) ⇒ Object



173
174
175
176
177
178
179
180
181
# File 'ext/calc_sun/calc_sun.c', line 173

static VALUE func_eccentric_anomaly(VALUE self, VALUE vajd){
  double ve =
  NUM2DBL(func_eccentricity(self, vajd));
  double vml =
  NUM2DBL(func_mean_longitude(self, vajd));
  double vea =
  vml + ve * sin(vml) * (1.0 + ve * cos(vml));
  return DBL2NUM(roundf(vea * RND12) / RND12);
}

#eccentricity(vajd) ⇒ Object



106
107
108
109
110
111
112
113
# File 'ext/calc_sun/calc_sun.c', line 106

static VALUE func_eccentricity(VALUE self, VALUE vajd){
  double jd = NUM2DBL(vajd);
  double d = jd - DJ00;
  double ve =
  0.016709 -
  1.151e-9 * d;
  return DBL2NUM(roundf(ve * RND12) / RND12);
}

#ecliptic_x(vajd) ⇒ Object



310
311
312
313
314
315
316
317
# File 'ext/calc_sun/calc_sun.c', line 310

static VALUE func_ecliptic_x(VALUE self, VALUE vajd){
  double vrv =
  NUM2DBL(func_rv(self, vajd));
  double vtl =
  NUM2DBL(func_true_longitude(self, vajd));
  double vex = vrv * cos(vtl);
  return DBL2NUM(roundf(vex * RND12) / RND12);
}

#ecliptic_y(vajd) ⇒ Object



319
320
321
322
323
324
325
326
# File 'ext/calc_sun/calc_sun.c', line 319

static VALUE func_ecliptic_y(VALUE self, VALUE vajd){
  double vrv =
  NUM2DBL(func_rv(self, vajd));
  double vtl =
  NUM2DBL(func_true_longitude(self, vajd));
  double vey = vrv * sin(vtl);
  return DBL2NUM(roundf(vey * RND12) / RND12);
}

#eot_min(vajd) ⇒ Object



532
533
534
535
# File 'ext/calc_sun/calc_sun.c', line 532

static VALUE func_eot_min(VALUE self, VALUE vajd){
  double eot = NUM2DBL(func_eot(self, vajd));
  return DBL2NUM(roundf((eot / 15 * 60) * RND12) / RND12);
}

#equation_of_center(vajd) ⇒ Object

static VALUE func_equation_of_center(VALUE self, VALUE vajd)

double vma =
NUM2DBL(func_mean_anomaly(self, vajd));
double ve =
NUM2DBL(func_eccentricity(self, vajd));
double ve2 = ve * 2.0;
double vesqr = ve * ve;
double vesqr54 = 5.0 / 4.0 * vesqr;
double vecube12 = (vesqr * ve) / 12.0;
double veoc =
ve2 * sin(vma) +
vesqr54 * sin(2 * vma) +
vecube12 * (13.0 * sin(3 * vma) - 3.0 * sin(vma));
return DBL2NUM(roundf(veoc * RND12) / RND12);



133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
# File 'ext/calc_sun/calc_sun.c', line 133

static VALUE func_equation_of_center(VALUE self, VALUE vajd){
  double mas =
  NUM2DBL(func_mean_anomaly(self, vajd));
  double eoe =
  NUM2DBL(func_eccentricity(self, vajd));
  double sin1a = sin(1.0 * mas) * 1.0 / 4.0;
  double sin1b = sin(1.0 * mas) * 5.0 / 96.0;
  double sin2a = sin(2.0 * mas) * 11.0 / 24.0;
  double sin2b = sin(2.0 * mas) * 5.0 / 4.0;
  double sin3a = sin(3.0 * mas) * 13.0 / 12.0;
  double sin3b = sin(3.0 * mas) * 43.0 / 64.0;
  double sin4 = sin(4.0 * mas) * 103.0 / 96.0;
  double sin5 = sin(5.0 * mas) * 1097.0 / 960.0;
  double ad3 = sin3a - sin1a;
  double ad4 = sin4 - sin2a;
  double ad5 = sin5 + sin1b - sin3b;
  double veoc = eoe * (sin1a * 8.0 + eoe * (sin2b + eoe * (ad3 + eoe * (ad4 + eoe * ad5))));
  return DBL2NUM(roundf(veoc * RND12) / RND12);
}

#equation_of_time(vajd) ⇒ Object



520
521
522
523
524
525
526
527
528
529
530
# File 'ext/calc_sun/calc_sun.c', line 520

static VALUE func_eot(VALUE self, VALUE vajd){
  double ma =
  NUM2DBL(func_mean_anomaly(self, vajd));
  double ta =
  NUM2DBL(func_true_anomaly(self, vajd));
  double tl =
  NUM2DBL(func_true_longitude(self, vajd));
  double ra = 15.0 * D2R *
  NUM2DBL(func_right_ascension(self, vajd));
  return DBL2NUM(roundf(anp(ma - ta + tl - ra) * R2D * RND12) / RND12 );
}

#gha(vajd) ⇒ Object



340
341
342
343
344
345
346
347
# File 'ext/calc_sun/calc_sun.c', line 340

static VALUE func_gha(VALUE self, VALUE vajd){
  double gmsa =
  NUM2DBL(func_mean_sidetime(self, vajd)) * 15 * D2R;
  double ra =
  NUM2DBL(func_right_ascension(self, vajd)) * 15 * D2R;
  double gha = anp(gmsa - ra);
  return DBL2NUM(roundf(gha * R2D * RND12) / RND12);
}

#gmsa(vajd) ⇒ Object



280
281
282
283
284
285
286
287
# File 'ext/calc_sun/calc_sun.c', line 280

static VALUE func_gmsa(VALUE self, VALUE vajd){
  double ajd = NUM2DBL(vajd) - 0.5;
  double ajdt = fmod(ajd, 1.0);
  double vtr = ajdt * 24.0 * 1.00273790935 * 15 * D2R;
  double msar0 = NUM2DBL(func_gmsa0(self, vajd)) * D2R;
  double msa = anp(msar0 + vtr) * R2D;
  return DBL2NUM(roundf(msa * RND12) / RND12);
}

#gmsa0(vajd) ⇒ Object



264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
# File 'ext/calc_sun/calc_sun.c', line 264

static VALUE func_gmsa0(VALUE self, VALUE vajd){
  double msa0;
  double ajd0 = NUM2DBL(vajd);
  double ajdt = fmod(ajd0, 1.0);
  if (ajdt <= 0.5){
    ajd0 -= 0.5;
    ajd0 = floor(ajd0) + 0.5;
  }
  else{
    ajd0 = floor(ajd0) + 0.5;
  }
  msa0 =
  NUM2DBL(func_mean_sidetime(self, DBL2NUM(ajd0))) * 15;
  return DBL2NUM(roundf(msa0 * RND12) / RND12);
}

#gmst(vajd) ⇒ Object



295
296
297
298
# File 'ext/calc_sun/calc_sun.c', line 295

static VALUE func_gmst(VALUE self, VALUE vajd){
  double vmst = NUM2DBL(func_gmsa(self, vajd)) / 15.0;
  return DBL2NUM(roundf(vmst * RND12) / RND12);
}

#gmst0(vajd) ⇒ Object



289
290
291
292
293
# File 'ext/calc_sun/calc_sun.c', line 289

static VALUE func_gmst0(VALUE self, VALUE vajd){
  double era0 =
  NUM2DBL(func_gmsa0(self, vajd)) / 15.0;
  return DBL2NUM(roundf(era0 * RND12) / RND12);
}

#jd(date) ⇒ Object

convert Date or DateTime object to JD number.



81
82
83
84
# File 'ext/calc_sun/calc_sun.c', line 81

static VALUE func_get_jd(VALUE self, VALUE vdatetime){
  double jd = NUM2DBL(rb_funcall(vdatetime, rb_intern("jd"), 0));
  return DBL2NUM(jd);
}

#jd2000_dif(vajd) ⇒ Object



502
503
504
505
506
507
508
509
510
511
# File 'ext/calc_sun/calc_sun.c', line 502

static VALUE func_jd_from_2000(VALUE self, VALUE vajd){
  /*VALUE vdatetime = func_ajd_2_datetime(self, vajd);
  int year = NUM2INT(rb_funcall(vdatetime, rb_intern("year"), 0));
  int month = NUM2INT(rb_funcall(vdatetime, rb_intern("month"), 0));
  int day = NUM2INT(rb_funcall(vdatetime, rb_intern("day"), 0));
  double days = days_since_2000_Jan_0(year, month, day);*/
  double ajd = NUM2DBL(vajd);
  double days = ajd - 2451545.0;
  return INT2NUM(days);
}

#jd2000_dif_lon(vajd, vlon) ⇒ Object



513
514
515
516
517
518
# File 'ext/calc_sun/calc_sun.c', line 513

static VALUE func_days_from_2000(VALUE self, VALUE vajd, VALUE vlon){
  double jd = NUM2DBL(vajd);
  double lon = NUM2DBL(vlon);
  double days = jd - DJ00 - lon / 360;
  return DBL2NUM(roundf(days * RND12) / RND12);
}

#lha(vajd, vlon) ⇒ Object



541
542
543
544
545
546
# File 'ext/calc_sun/calc_sun.c', line 541

static VALUE func_lha(VALUE self, VALUE vajd, VALUE vlon){
  double lon = NUM2DBL(vlon) * D2R;
  double gha = NUM2DBL(func_gha(self, vajd)) * D2R;
  double lha = anp(gha + lon) * R2D;
  return DBL2NUM(roundf(lha * RND12) / RND12);
}

#local_sidereal_time(vajd, vlon) ⇒ Object



362
363
364
365
366
# File 'ext/calc_sun/calc_sun.c', line 362

static VALUE func_local_sidetime(VALUE self, VALUE vajd, VALUE vlon){
  double vst = NUM2DBL(func_mean_sidetime(self, vajd));
  double vlst = vst + NUM2DBL(vlon) / 15.0 ;
  return DBL2NUM(fmod(roundf(vlst * RND12) / RND12, 24.0));
}

#longitude_of_perihelion(vajd) ⇒ Object



191
192
193
194
195
196
197
198
199
200
# File 'ext/calc_sun/calc_sun.c', line 191

static VALUE func_longitude_of_perihelion(VALUE self, VALUE vajd){
  double jd = NUM2DBL(vajd);
  double d = jd - DJ00;
  double vlop =
  fmod(
    (282.9404 +
     4.70935e-05 * d
    ) * D2R, M2PI);
  return DBL2NUM(roundf(vlop * RND12) / RND12);
}

#mean_anomaly(date) ⇒ Object

convert Date or DateTime object to float representing Solar Mean Anomaly in radians.



94
95
96
97
98
99
100
101
102
103
104
# File 'ext/calc_sun/calc_sun.c', line 94

static VALUE func_mean_anomaly(VALUE self, VALUE vajd){
  double ajd = NUM2DBL(vajd);
  double t = (ajd - DJ00) / 36525;
  double vma =
  fmod((              357.52910918     +
    t * (           35999.05029113889  +
    t * (     1.0 / -6507.592190889371 +
    t * (  1.0 / 26470588.235294115    +
    t * (1.0 / -313315926.8929504))))) * D2R, M2PI);
  return DBL2NUM(roundf(vma * RND12) / RND12);
}

#mean_longitude(vajd) ⇒ Object



162
163
164
165
166
167
168
169
170
171
# File 'ext/calc_sun/calc_sun.c', line 162

static VALUE func_mean_longitude(VALUE self, VALUE vajd){
  double jd = NUM2DBL(vajd);
  double d = jd - DJ00;
  double vml =
  fmod(
    (280.4664567 +
     0.9856473601037645 * d
    ) * D2R, M2PI);
  return DBL2NUM(roundf(vml * RND12) / RND12);
}

#mean_sidereal_time(vajd) ⇒ Object

static VALUE func_gmsa0(VALUE self, VALUE vajd)

double tl =
NUM2DBL(func_true_longitude(self, vajd));
double st =
anp(PI + tl) * R2D;
return DBL2NUM(roundf(st * RND12) / RND12);



248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
# File 'ext/calc_sun/calc_sun.c', line 248

static VALUE func_mean_sidetime(VALUE self, VALUE vajd){
  double ajd = NUM2DBL(vajd);
  long double sidereal;
  long double t;
  t = (ajd - 2451545.0) / 36525.0;
  /* calc mean angle */
  sidereal =
  280.46061837 +
  (360.98564736629 * (ajd - 2451545.0)) +
  (0.000387933 * t * t) -
  (t * t * t / 38710000.0);
  sidereal = anp(sidereal * D2R) * R2D;
  /* change to hours */
  return DBL2NUM(fmod(roundf((sidereal / 15.0) * RND12) / RND12, 24.0));
}

#min_to_s(vmin) ⇒ Object



537
538
539
# File 'ext/calc_sun/calc_sun.c', line 537

static VALUE func_min_to_s(VALUE self, VALUE vmin){
  return Qnil;
}

#noon(vajd, vlat, vlon) ⇒ Object



444
445
446
447
448
449
450
451
452
# File 'ext/calc_sun/calc_sun.c', line 444

static VALUE func_noon(VALUE self, VALUE vajd, VALUE vlat, VALUE vlon){
  double nt = NUM2DBL(func_t_south(self, vajd, vlon));
  double ajd = NUM2DBL(vajd);
  double ntajd = floor(ajd) - 0.5 + nt / 24.0;
  VALUE vnt = DBL2NUM(ntajd);
  //VALUE date = rb_sprintf("Sun noon: %2.0f:%02.0f UTC\n",
  //floor(nt), floor(fmod(nt, 1.0) * 60.0));
  return func_ajd_2_datetime(self, vnt);
}

#noon_jd(vajd, vlat, vlon) ⇒ Object



454
455
456
457
458
459
# File 'ext/calc_sun/calc_sun.c', line 454

static VALUE func_noon_jd(VALUE self, VALUE vajd, VALUE vlat, VALUE vlon){
  double nt = NUM2DBL(func_t_south(self, vajd, vlon));
  double ajd = NUM2DBL(vajd);
  double ntajd = floor(ajd) - 0.5 + nt / 24.0;
  return DBL2NUM(ntajd);
}

#obliquity_of_ecliptic(vajd) ⇒ Object



183
184
185
186
187
188
189
# File 'ext/calc_sun/calc_sun.c', line 183

static VALUE func_obliquity_of_ecliptic(VALUE self, VALUE vajd){
  double jd = NUM2DBL(vajd);
  double d = jd - DJ00;
  double vooe =
  (23.439291 - 3.563E-7 * d) * D2R;
  return DBL2NUM(roundf(vooe * RND12) / RND12);
}

#radius_vector(vajd) ⇒ Object



300
301
302
303
304
305
306
307
308
# File 'ext/calc_sun/calc_sun.c', line 300

static VALUE func_rv(VALUE self, VALUE vajd){
  double vxv =
  NUM2DBL(func_xv(self, vajd));
  double vyv =
  NUM2DBL(func_yv(self, vajd));
  double vrv =
  sqrt(vxv * vxv + vyv * vyv);
  return DBL2NUM(roundf(vrv * RND12) / RND12);
}

#reverse_12(vx) ⇒ Object



569
570
571
572
# File 'ext/calc_sun/calc_sun.c', line 569

static VALUE func_rev12(VALUE self, VALUE vx){
  double x = NUM2DBL(vx);
  return DBL2NUM(x - 24.0 * floor(x * INV24 + 0.5));
}

#right_ascension(vajd) ⇒ Object



328
329
330
331
332
333
334
335
336
337
338
# File 'ext/calc_sun/calc_sun.c', line 328

static VALUE func_right_ascension(VALUE self, VALUE vajd){
  double vey =
  NUM2DBL(func_ecliptic_y(self, vajd));
  double vooe =
  NUM2DBL(func_obliquity_of_ecliptic(self, vajd));
  double vex =
  NUM2DBL(func_ecliptic_x(self, vajd));
  double vra =
  fmod(atan2(vey * cos(vooe), vex) + M2PI, M2PI);
  return DBL2NUM(fmod(roundf((vra * R2D / 15.0) * RND12) / RND12, 24.0));
}

#rise(vajd, vlat, vlon) ⇒ Object



427
428
429
430
431
432
433
434
435
# File 'ext/calc_sun/calc_sun.c', line 427

static VALUE func_rise(VALUE self, VALUE vajd, VALUE vlat, VALUE vlon){
  double rt = NUM2DBL(func_t_rise(self, vajd, vlat, vlon));
  double ajd = NUM2DBL(vajd);
  double rtajd = floor(ajd) - 0.5 + rt / 24.0;
  VALUE vrt = DBL2NUM(rtajd);
  //VALUE date = rb_sprintf("Sun rises: %2.0f:%02.0f UTC\n",
  //floor(rt), floor(fmod(rt, 1) * 60.0));
  return func_ajd_2_datetime(self, vrt);
}

#rise_jd(vajd, vlat, vlon) ⇒ Object



437
438
439
440
441
442
# File 'ext/calc_sun/calc_sun.c', line 437

static VALUE func_rise_jd(VALUE self, VALUE vajd, VALUE vlat, VALUE vlon){
  double rt = NUM2DBL(func_t_rise(self, vajd, vlat, vlon));
  double ajd = NUM2DBL(vajd);
  double rtajd = floor(ajd) - 0.5 + rt / 24.0;
  return DBL2NUM(rtajd);
}

#set(vajd, vlat, vlon) ⇒ Object



461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
# File 'ext/calc_sun/calc_sun.c', line 461

static VALUE func_set(VALUE self, VALUE vajd, VALUE vlat, VALUE vlon){
  VALUE vst;
  double stajd;
  double st = NUM2DBL(func_t_set(self, vajd, vlat, vlon));
  double nt = NUM2DBL(func_t_mid_day(self, vajd, vlat, vlon));
  double ajd = NUM2DBL(vajd);
  if (st < nt){
    st += 24.0;
  }
  stajd = floor(ajd) - 0.5 + st / 24.0;
  vst = DBL2NUM(stajd);
  //VALUE date = rb_sprintf("Sun set: %2.0f:%02.0f UTC\n",
  //floor(st), floor(fmod(st, 1.0) * 60.0));
  return func_ajd_2_datetime(self, vst);
}

#date('yyyy-mm-dd') ⇒ Object

convert input string to DateTime object.



44
45
46
47
48
# File 'ext/calc_sun/calc_sun.c', line 44

static VALUE func_set_datetime(VALUE self, VALUE vdatetime){
  VALUE cDateTime = rb_const_get(rb_cObject, rb_intern("DateTime"));
  VALUE vdate = rb_funcall(cDateTime, rb_intern("parse"), 1, vdatetime);
  return vdate;
}

#set_jd(vajd, vlat, vlon) ⇒ Object



477
478
479
480
481
482
483
484
485
486
487
# File 'ext/calc_sun/calc_sun.c', line 477

static VALUE func_set_jd(VALUE self, VALUE vajd, VALUE vlat, VALUE vlon){
  double stajd;
  double st = NUM2DBL(func_t_set(self, vajd, vlat, vlon));
  double nt = NUM2DBL(func_t_mid_day(self, vajd, vlat, vlon));
  double ajd = NUM2DBL(vajd);
  if (st < nt){
    st += 24.0;
  }
  stajd = floor(ajd) - 0.5 + st / 24.0;
  return DBL2NUM(stajd);
}

#t_mid_day(vajd, vlat, vlon) ⇒ Object



416
417
418
419
# File 'ext/calc_sun/calc_sun.c', line 416

static VALUE func_t_mid_day(VALUE self, VALUE vajd, VALUE vlat, VALUE vlon){
  double ts = NUM2DBL(func_t_south(self, vajd, vlon));
  return DBL2NUM(fmod(roundf(ts * RND12) / RND12, 24.0));
}

#t_rise(vajd, vlat, vlon) ⇒ Object

return DBL2NUM(lst - ra);



410
411
412
413
414
# File 'ext/calc_sun/calc_sun.c', line 410

static VALUE func_t_rise(VALUE self, VALUE vajd, VALUE vlat, VALUE vlon){
  double ts = NUM2DBL(func_t_south(self, vajd, vlon));
  double da = NUM2DBL(func_diurnal_arc(self, vajd, vlat));
  return DBL2NUM(fmod(roundf((ts - da) * RND12) / RND12, 24.0));
}

#t_set(vajd, vlat, vlon) ⇒ Object



421
422
423
424
425
# File 'ext/calc_sun/calc_sun.c', line 421

static VALUE func_t_set(VALUE self, VALUE vajd, VALUE vlat, VALUE vlon){
  double ts = NUM2DBL(func_t_south(self, vajd, vlon));
  double da = NUM2DBL(func_diurnal_arc(self, vajd, vlat));
  return DBL2NUM(roundf(fmod((ts + da), 24.0) * RND12) / RND12);
}

#t_south(vajd, vlon) ⇒ Object



398
399
400
401
402
403
404
405
406
407
408
# File 'ext/calc_sun/calc_sun.c', line 398

static VALUE func_t_south(VALUE self, VALUE vajd, VALUE vlon){
  double jd = floor(NUM2DBL(vajd));
  double lst = NUM2DBL(func_local_sidetime(self, DBL2NUM(jd), vlon));
  double ra = NUM2DBL(func_right_ascension(self, DBL2NUM(jd)));
  double vx = lst - ra;
  double vt = vx - 24.0 * floor(vx * INV24 + 0.5);
  //printf("%f", jd);
  return DBL2NUM(fmod(roundf((12.0 - vt) * RND12) / RND12, 24.0));
  //return DBL2NUM(fmod(-vx, 24.0));
  //return DBL2NUM(lst - ra);
}

#true_anomaly(vajd) ⇒ Object



153
154
155
156
157
158
159
160
# File 'ext/calc_sun/calc_sun.c', line 153

static VALUE func_true_anomaly(VALUE self, VALUE vajd){
  double vma =
  NUM2DBL(func_mean_anomaly(self, vajd));
  double veoc =
  NUM2DBL(func_equation_of_center(self, vajd));
  double vta = vma + veoc;
  return DBL2NUM(roundf(vta * RND12) / RND12);
}

#true_anomaly1(vajd) ⇒ Object



221
222
223
224
225
226
# File 'ext/calc_sun/calc_sun.c', line 221

static VALUE func_true_anomaly1(VALUE self, VALUE vajd){
  double xv = NUM2DBL(func_xv(self, vajd));
  double yv = NUM2DBL(func_yv(self, vajd));
  double vta = anp(atan2(yv, xv));
  return DBL2NUM(roundf(vta * RND12) / RND12);
}

#true_longitude(vajd) ⇒ Object



228
229
230
231
232
233
234
235
236
# File 'ext/calc_sun/calc_sun.c', line 228

static VALUE func_true_longitude(VALUE self, VALUE vajd){
  double vta =
  NUM2DBL(func_true_anomaly(self, vajd));
  double vlop =
  NUM2DBL(func_longitude_of_perihelion(self, vajd));
  double vtl =
  fmod(vta + vlop, M2PI);
  return DBL2NUM(roundf(vtl * RND12) / RND12);
}

#xv(vajd) ⇒ Object



202
203
204
205
206
207
208
209
# File 'ext/calc_sun/calc_sun.c', line 202

static VALUE func_xv(VALUE self, VALUE vajd){
  double vea =
  NUM2DBL(func_eccentric_anomaly(self, vajd));
  double ve =
  NUM2DBL(func_eccentricity(self, vajd));
  double vxv = cos(vea) - ve;
  return DBL2NUM(roundf(vxv * RND12) / RND12);
}

#yv(vajd) ⇒ Object



211
212
213
214
215
216
217
218
219
# File 'ext/calc_sun/calc_sun.c', line 211

static VALUE func_yv(VALUE self, VALUE vajd){
  double vea =
  NUM2DBL(func_eccentric_anomaly(self, vajd));
  double ve =
  NUM2DBL(func_eccentricity(self, vajd));
  double vyv =
  sqrt(1.0 - ve * ve) * sin(vea);
  return DBL2NUM(roundf(vyv * RND12) / RND12);
}