/* 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; }
//////////////////////////////////////////////////////////////////////////////////////////////// // 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); }