Beispiel #1
0
        /// <summary>
        /// 计算绕地航天器主要的加速度。
        ///   Computes the acceleration of an Earth orbiting satellite due to
        ///    - the Earth's harmonic gravity field,
        ///    - the gravitational perturbations of the Sun and Moon
        ///    - the solar radiation pressure and
        ///    - the atmospheric drag
        /// </summary>
        /// <param name="Mjd_TT"> Mjd_TT  Terrestrial Time (Modified Julian Date)</param>
        /// <param name="satXyzIcrf"> r 卫星在国际天球参考框架的位置  Satellite position vector in the ICRF/EME2000 system</param>
        /// <param name="satVelocityIcrf"> v 卫星在国际天球参考框架的速度 Satellite velocity vector in the ICRF/EME2000 system</param>
        /// <param name="Area">  Area    Cross-section </param>
        /// <param name="mass">  mass 质量  Spacecraft mass</param>
        /// <param name="solarRadiPresCoeff"> coefOfRadiation  光压系数  Radiation pressure coefficient</param>
        /// <param name="atmDragCoefficient"> coefOfDrag  大气阻力系数  Drag coefficient</param>
        /// <returns> Acceleration (a=d^2r/dt^2) in the ICRF/EME2000 system</returns>
        public static Geo.Algorithm.Vector AccelerOfMainForces(double Mjd_TT, Geo.Algorithm.Vector satXyzIcrf, Geo.Algorithm.Vector satVelocityIcrf, double Area, double mass, double solarRadiPresCoeff, double atmDragCoefficient)
        {
            double Mjd_UT1;

            Geo.Algorithm.Vector a = new Geo.Algorithm.Vector(3), r_Sun = new Geo.Algorithm.Vector(3), r_Moon = new Geo.Algorithm.Vector(3);
            Matrix T = new Matrix(3, 3), E = new Matrix(3, 3);

            // Acceleration due to harmonic gravity field
            Mjd_UT1 = Mjd_TT;

            T = IERS.NutMatrix(Mjd_TT) * IERS.PrecessionMatrix(MJD_J2000, Mjd_TT);
            E = IERS.GreenwichHourAngleMatrix(Mjd_UT1) * T;

            a = AccelerOfHarmonicGraviFiled(satXyzIcrf, E, Grav.GM, Grav.R_ref, Grav.CS, Grav.n_max, Grav.m_max);

            // Luni-solar perturbations
            r_Sun  = CelestialUtil.Sun(Mjd_TT);
            r_Moon = CelestialUtil.Moon(Mjd_TT);

            a += AccelerOfPointMass(satXyzIcrf, r_Sun, OrbitConsts.GM_Sun);
            a += AccelerOfPointMass(satXyzIcrf, r_Moon, OrbitConsts.GM_Moon);

            // Solar radiation pressure
            a += CelestialUtil.Illumination(satXyzIcrf, r_Sun) * AccelerOfSolarRadiPressure(satXyzIcrf, r_Sun, Area, mass, solarRadiPresCoeff, OrbitConsts.PressureOfSolarRadiationPerAU, AU);

            // Atmospheric drag
            a += AccelerDragOfAtmos(Mjd_TT, satXyzIcrf, satVelocityIcrf, T, Area, mass, atmDragCoefficient);

            // Acceleration
            return(a);
        }
Beispiel #2
0
        /// <summary>
        ///   Computes the acceleration of an Earth orbiting satellite due to
        ///    - the Earth's harmonic gravity field,
        ///    - the gravitational perturbations of the Sun and Moon
        ///    - the solar radiation pressure and
        ///    - the atmospheric drag
        /// </summary>
        /// <param name="Mjd_TT">Mjd_TT      Terrestrial Time (Modified Julian Date)</param>
        /// <param name="r">r           Satellite position vector in the ICRF/EME2000 system</param>
        /// <param name="v">v           Satellite velocity vector in the ICRF/EME2000 system</param>
        /// <param name="Area"> Area        Cross-section </param>
        /// <param name="mass"> mass        Spacecraft mass</param>
        /// <param name="coefOfRadiation">coefOfRadiation          Radiation pressure coefficient</param>
        /// <param name="coefOfDrag">coefOfDrag          Drag coefficient</param>
        /// <param name="n"></param>
        /// <param name="m"></param>
        /// <param name="isConsiderSun">是否启用太阳质量影响</param>
        /// <param name="isConsiderMoon">是否启用月亮质量影响</param>
        /// <param name="isConsiderSolarRadi">是否启用太阳光压影响</param>
        /// <param name="isConsiderDrag">是否考虑大气影响</param>
        /// <returns>Acceleration (a=d^2r/dt^2) in the ICRF/EME2000 system</returns>
        public Geo.Algorithm.Vector GetAcceleration(double Mjd_TT, Geo.Algorithm.Vector r, Geo.Algorithm.Vector v)
        {
            // Acceleration due to harmonic gravity field
            var Mjd_UT1 = Mjd_TT + (IERS.GetUT1_UTC(Mjd_TT) - IERS.GetTT_UTC(Mjd_TT)) / 86400.0;

            var T = IERS.NutMatrix(Mjd_TT) * IERS.PrecessionMatrix(OrbitConsts.MJD_J2000, Mjd_TT);
            var E = IERS.GreenwichHourAngleMatrix(Mjd_UT1) * T;

            var a = Force.AccelerOfHarmonicGraviFiled(r, E, Force.Grav.GM, Force.Grav.R_ref, Force.Grav.CS, Option.MaxDegree, Option.MaxOrder);

            // Luni-solar perturbations
            var r_Sun = CelestialUtil.Sun(Mjd_TT);

            if (Option.EnableSun)
            {
                a += Force.AccelerOfPointMass(r, r_Sun, OrbitConsts.GM_Sun);
            }
            if (Option.EnableMoon)
            {
                var r_Moon = CelestialUtil.Moon(Mjd_TT);
                a += Force.AccelerOfPointMass(r, r_Moon, OrbitConsts.GM_Moon);
            }

            // Solar radiation pressure
            if (Option.EnableSolarRadiation)
            {
                a += Force.AccelerOfSolarRadiPressure(r, r_Sun, Option.Area, Option.Mass, Option.CoefOfRadiation, OrbitConsts.PressureOfSolarRadiationPerAU, OrbitConsts.AU);
            }
            // Atmospheric drag
            if (Option.EnableDrag)
            {
                a += Force.AccelerDragOfAtmos(Mjd_TT, r, v, T, Option.Area, Option.Mass, Option.CoefOfDrag);
            }
            // Acceleration
            return(a);
        }