private void calculate_geocentric_sun_right_ascension_and_declination(ref SPAData spa_calc) { double[] x = new double[TERM_X_COUNT]; spa_calc.jc = julian_century(spa_calc.jd); spa_calc.jde = julian_ephemeris_day(spa_calc.jd, spa_calc.delta_t); spa_calc.jce = julian_ephemeris_century(spa_calc.jde); spa_calc.jme = julian_ephemeris_millennium(spa_calc.jce); spa_calc.l = earth_heliocentric_longitude(spa_calc.jme); spa_calc.b = earth_heliocentric_latitude(spa_calc.jme); spa_calc.r = earth_radius_vector(spa_calc.jme); spa_calc.theta = geocentric_longitude(spa_calc.l); spa_calc.beta = geocentric_latitude(spa_calc.b); x[TERM_X0] = spa_calc.x0 = mean_elongation_moon_sun(spa_calc.jce); x[TERM_X1] = spa_calc.x1 = mean_anomaly_sun(spa_calc.jce); x[TERM_X2] = spa_calc.x2 = mean_anomaly_moon(spa_calc.jce); x[TERM_X3] = spa_calc.x3 = argument_latitude_moon(spa_calc.jce); x[TERM_X4] = spa_calc.x4 = ascending_longitude_moon(spa_calc.jce); nutation_longitude_and_obliquity(spa_calc.jce, x, ref spa_calc.del_psi, ref spa_calc.del_epsilon); spa_calc.epsilon0 = ecliptic_mean_obliquity(spa_calc.jme); spa_calc.epsilon = ecliptic_true_obliquity(spa_calc.del_epsilon, spa_calc.epsilon0); spa_calc.del_tau = aberration_correction(spa_calc.r); spa_calc.lamda = apparent_sun_longitude(spa_calc.theta, spa_calc.del_psi, spa_calc.del_tau); spa_calc.nu0 = greenwich_mean_sidereal_time(spa_calc.jd, spa_calc.jc); spa_calc.nu = greenwich_sidereal_time(spa_calc.nu0, spa_calc.del_psi, spa_calc.epsilon); spa_calc.alpha = geocentric_sun_right_ascension(spa_calc.lamda, spa_calc.epsilon, spa_calc.beta); spa_calc.delta = geocentric_sun_declination(spa_calc.beta, spa_calc.epsilon, spa_calc.lamda); }
private void calculate_eot_and_sun_rise_transit_set(ref SPAData spa_calc) { SPAData sun_rts = spa_calc; double nu, m, h0, n; double[] alpha = new double[JD_COUNT]; double[] delta = new double[JD_COUNT]; double[] m_rts = new double[SUN_COUNT]; double[] nu_rts = new double[SUN_COUNT]; double[] h_rts = new double[SUN_COUNT]; double[] alpha_prime = new double[SUN_COUNT]; double[] delta_prime = new double[SUN_COUNT]; double[] h_prime = new double[SUN_COUNT]; double h0_prime = -1 * (SUN_RADIUS + spa_calc.atmos_refract); int i; m = sun_mean_longitude(spa_calc.jme); spa_calc.eot = eot(m, spa_calc.alpha, spa_calc.del_psi, spa_calc.epsilon); sun_rts.hour = sun_rts.minute = sun_rts.second = 0; sun_rts.timezone = 0.0f; 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(ref 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(ref 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_calc.longitude, nu); h0 = sun_hour_angle_at_rise_set(spa_calc.latitude, delta[JD_ZERO], h0_prime); if (h0 >= 0) { approx_sun_rise_and_set(ref m_rts, h0); for (i = 0; i < SUN_COUNT; i++) { nu_rts[i] = nu + 360.985647 * m_rts[i]; n = m_rts[i] + spa_calc.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_calc.longitude - alpha_prime[i]); h_rts[i] = rts_sun_altitude(spa_calc.latitude, delta_prime[i], h_prime[i]); } spa_calc.srha = h_prime[SUN_RISE]; spa_calc.ssha = h_prime[SUN_SET]; spa_calc.sta = h_rts[SUN_TRANSIT]; spa_calc.suntransit = dayfrac_to_local_hr(m_rts[SUN_TRANSIT] - h_prime[SUN_TRANSIT] / 360.0, spa_calc.timezone); spa_calc.sunrise = dayfrac_to_local_hr(sun_rise_and_set(m_rts, h_rts, delta_prime, spa_calc.latitude, h_prime, h0_prime, SUN_RISE), spa_calc.timezone); spa_calc.sunset = dayfrac_to_local_hr(sun_rise_and_set(m_rts, h_rts, delta_prime, spa_calc.latitude, h_prime, h0_prime, SUN_SET), spa_calc.timezone); } else { spa_calc.srha = spa_calc.ssha = spa_calc.sta = spa_calc.suntransit = spa_calc.sunrise = spa_calc.sunset = -99999; } }
private int validate_inputs(ref SPAData spa_validate) { if ((spa_validate.year < -2000) || (spa_validate.year > 6000)) { return(1); } if ((spa_validate.month < 1) || (spa_validate.month > 12)) { return(2); } if ((spa_validate.day < 1) || (spa_validate.day > 31)) { return(3); } if ((spa_validate.hour < 0) || (spa_validate.hour > 24)) { return(4); } if ((spa_validate.minute < 0) || (spa_validate.minute > 59)) { return(5); } if ((spa_validate.second < 0) || (spa_validate.second > 59)) { return(6); } if ((spa_validate.pressure < 0) || (spa_validate.pressure > 5000)) { return(12); } if ((spa_validate.temperature <= -273) || (spa_validate.temperature > 6000)) { return(13); } if ((spa_validate.hour == 24) && (spa_validate.minute > 0)) { return(5); } if ((spa_validate.hour == 24) && (spa_validate.second > 0)) { return(6); } if (fabs(spa_validate.delta_t) > 8000) { return(7); } if (fabs(spa_validate.timezone) > 12) { return(8); } if (fabs(spa_validate.longitude) > 180) { return(9); } if (fabs(spa_validate.latitude) > 90) { return(10); } if (fabs(spa_validate.atmos_refract) > 5) { return(16); } if (spa_validate.elevation < -6500000) { return(11); } if ((spa_validate.function == SPAFunctionType.SPA_ZA_INC) || (spa_validate.function == SPAFunctionType.SPA_ALL)) { if (fabs(spa_validate.slope) > 360) { return(14); } if (fabs(spa_validate.azm_rotation) > 360) { return(15); } } return(0); }