Example #1
0
/* Calculate the position of the sun at a given time.  pages 89-91 */
void
sun_position (time_t unix_time, gdouble *lat, gdouble *lon)
{
  gdouble jd, D, N, M, E, x, v, lambda;
  gdouble ra, dec;
  jd = unix_time_to_julian_date (unix_time);

  /* Calculate number of days since the epoch */
  D = jd - EPOCH;

  N = D*360/365.242191;

  /* normalize to 0 - 360 degrees */
  NORMALIZE (N);

  /* Step 4: */
  M = N + EPSILON_G - MU_G;
  NORMALIZE (M);

  /* Step 5: convert to radians */
  M = DEG_TO_RADS (M);

  /* Step 6: */
  E = solve_keplers_equation (ECCENTRICITY, M);

  /* Step 7: */
  x = sqrt ((1 + ECCENTRICITY)/(1 - ECCENTRICITY)) * tan (E/2);

  /* Step 8, 9 */
  v = 2 * RADS_TO_DEG (atan (x));
  NORMALIZE (v);

  /* Step 10 */
  lambda = v + MU_G;
  NORMALIZE (lambda);

  /* convert the ecliptic longitude to right ascension and declination */
  ecliptic_to_equatorial (DEG_TO_RADS (lambda), 0.0, &ra, &dec);

  ra = ra - (G_PI/12) * greenwich_sidereal_time (unix_time);
  ra = RADS_TO_DEG (ra);
  dec = RADS_TO_DEG (dec);
  NORMALIZE (ra);
  NORMALIZE (dec);

  *lat = dec;
  *lon = ra;
}
Example #2
0
////////////////////////////////////////////////////////////////////////////////////////////////
// Calculate required SPA parameters to get the right ascension (alpha) and declination (delta)
// Note: JD must be already calculated and in structure
////////////////////////////////////////////////////////////////////////////////////////////////
void calculate_geocentric_sun_right_ascension_and_declination(spa_data *spa)
{
	double x[TERM_X_COUNT];

	spa->jc = julian_century(spa->jd);

	spa->jde = julian_ephemeris_day(spa->jd, spa->delta_t);
	spa->jce = julian_ephemeris_century(spa->jde);
	spa->jme = julian_ephemeris_millennium(spa->jce);

	spa->l = earth_heliocentric_longitude(spa->jme);
	spa->b = earth_heliocentric_latitude(spa->jme);
	spa->r = earth_radius_vector(spa->jme);

	spa->theta = geocentric_longitude(spa->l);
	spa->beta  = geocentric_latitude(spa->b);

	spa->x0 = mean_elongation_moon_sun(spa->jce);
	spa->x1 = mean_anomaly_sun(spa->jce);
	spa->x2 = mean_anomaly_moon(spa->jce);
	spa->x3 = argument_latitude_moon(spa->jce);
	spa->x4 = ascending_longitude_moon(spa->jce);

	x[TERM_X0] = spa->x0;
	x[TERM_X1] = spa->x1;
	x[TERM_X2] = spa->x2;
	x[TERM_X3] = spa->x3;
	x[TERM_X4] = spa->x4;

	nutation_longitude_and_obliquity(spa->jce, x, &(spa->del_psi), &(spa->del_epsilon));

	spa->epsilon0 = ecliptic_mean_obliquity(spa->jme);
	spa->epsilon  = ecliptic_true_obliquity(spa->del_epsilon, spa->epsilon0);

	spa->del_tau	= aberration_correction(spa->r);
	spa->lamda		= apparent_sun_longitude(spa->theta, spa->del_psi, spa->del_tau);
	spa->nu0		= greenwich_mean_sidereal_time (spa->jd, spa->jc);
	spa->nu			= greenwich_sidereal_time (spa->nu0, spa->del_psi, spa->epsilon);

	spa->alpha = geocentric_sun_right_ascension(spa->lamda, spa->epsilon, spa->beta);
	spa->delta = geocentric_sun_declination(spa->beta, spa->epsilon, spa->lamda);
}