static double sun_ecliptic_long ( double t ) { // Returns ecliptic longitude of the Sun in radians // given the fraction of a Julian century from J2000.0 double dr = M_PI / 180.0 ; return( sun_mean_longitude( t ) + (1.915 * sin ( sun_mean_anomaly( t ) ) + 0.020 * sin ( 2.0 * sun_mean_anomaly( t ) ) ) * dr ); }
void calculate_eot_and_sun_rise_transit_set(spa_data *spa) { spa_data sun_rts; double nu, m, h0, n; double alpha[JD_COUNT], delta[JD_COUNT]; double m_rts[SUN_COUNT], nu_rts[SUN_COUNT], h_rts[SUN_COUNT]; double alpha_prime[SUN_COUNT], delta_prime[SUN_COUNT], h_prime[SUN_COUNT]; double h0_prime = -1*(SUN_RADIUS + spa->atmos_refract); int i; sun_rts = *spa; m = sun_mean_longitude(spa->jme); spa->eot = eot(m, spa->alpha, spa->del_psi, spa->epsilon); sun_rts.hour = sun_rts.minute = sun_rts.second = 0; sun_rts.timezone = 0.0; sun_rts.jd = julian_day (sun_rts.year, sun_rts.month, sun_rts.day, sun_rts.hour, sun_rts.minute, sun_rts.second, sun_rts.timezone); calculate_geocentric_sun_right_ascension_and_declination(&sun_rts); nu = sun_rts.nu; sun_rts.delta_t = 0; sun_rts.jd--; for (i = 0; i < JD_COUNT; i++) { calculate_geocentric_sun_right_ascension_and_declination(&sun_rts); alpha[i] = sun_rts.alpha; delta[i] = sun_rts.delta; sun_rts.jd++; } m_rts[SUN_TRANSIT] = approx_sun_transit_time(alpha[JD_ZERO], spa->longitude, nu); h0 = sun_hour_angle_at_rise_set(spa->latitude, delta[JD_ZERO], h0_prime); if (h0 >= 0) { approx_sun_rise_and_set(m_rts, h0); for (i = 0; i < SUN_COUNT; i++) { nu_rts[i] = nu + 360.985647*m_rts[i]; n = m_rts[i] + spa->delta_t/86400.0; alpha_prime[i] = rts_alpha_delta_prime(alpha, n); delta_prime[i] = rts_alpha_delta_prime(delta, n); h_prime[i] = limit_degrees180pm(nu_rts[i] + spa->longitude - alpha_prime[i]); h_rts[i] = rts_sun_altitude(spa->latitude, delta_prime[i], h_prime[i]); } spa->srha = h_prime[SUN_RISE]; spa->ssha = h_prime[SUN_SET]; spa->sta = h_rts[SUN_TRANSIT]; spa->suntransit = dayfrac_to_local_hr(m_rts[SUN_TRANSIT] - h_prime[SUN_TRANSIT] / 360.0, spa->timezone); spa->sunrise = dayfrac_to_local_hr(sun_rise_and_set(m_rts, h_rts, delta_prime, spa->latitude, h_prime, h0_prime, SUN_RISE), spa->timezone); spa->sunset = dayfrac_to_local_hr(sun_rise_and_set(m_rts, h_rts, delta_prime, spa->latitude, h_prime, h0_prime, SUN_SET), spa->timezone); } else spa->srha= spa->ssha= spa->sta= spa->suntransit= spa->sunrise= spa->sunset= -99999; }