示例#1
0
        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);
        }
示例#2
0
        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;
            }
        }
示例#3
0
        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);
        }