/// <summary>
        /// J2积分器(惯性系中计算,无岁差章动),右函数采用J2Gravity模型
        /// <para>积分变量仅位置、速度</para>
        /// <para>给position仅添加J2项右函数</para>
        /// <para>RKF7(8)数值积分器,缺省绝对和相对精度皆为1e-13</para>
        /// <para>Epoch属性需手动赋值</para>
        /// </summary>
        /// <param name="position">PropagationNewtonianPoint,单位:m,m/s</param>
        /// <param name="centralBody"></param>
        /// <param name="gravitationalParameter">引力常数GM(m^3/s^2)</param>
        /// <param name="j2UnnormalizedValue">J2</param>
        /// <param name="referenceDistance">Re(m)</param>
        /// <param name="absTolerance">RKF7(8)的绝对精度</param>
        /// <param name="relRolerance">RKF7(8)的相对精度</param>
        public PropagatorDefinitionPureJ2(PropagationNewtonianPoint position, CentralBody centralBody, double gravitationalParameter = 3.986004418e14, double j2UnnormalizedValue = 0.001082629989052, double referenceDistance = 6378137.0, double absTolerance = 1e-13, double relRolerance = 1e-13)
        {
            //  中心天体的J2项引力摄动(含中心引力,中心天体的惯性系中计算),无岁差章动
            J2Gravity gravity = new J2Gravity(position.IntegrationPoint, centralBody, gravitationalParameter, j2UnnormalizedValue, referenceDistance);

            //  添加右函数
            position.AppliedForces.Clear();
            position.AppliedForces.Add(gravity);

            //  积分变量
            this.IntegrationElements.Add(position);

            //  RKF7(8)数值积分器
            RungeKuttaFehlberg78Integrator integrator = new RungeKuttaFehlberg78Integrator();

            integrator.AbsoluteTolerance = absTolerance;
            integrator.RelativeTolerance = relRolerance;
            integrator.InitialStepSize   = 60.0;
            integrator.StepSizeBehavior  = KindOfStepSize.Relative;
            integrator.MaximumStepSize   = 200.0;
            integrator.MinimumStepSize   = 1.0;
            //* This is STK's default and truncates each step to 3 decimal places
            integrator.StepTruncationOrder = -3;

            this.Integrator = integrator;
        }
 /// <summary>
 /// Gets the integrator as configured.
 /// </summary>
 public NumericalIntegrator GetIntegrator()
 {
     if (m_integrator.SelectedItem.ToString() == RKF78)
     {
         RungeKuttaFehlberg78Integrator integrator = new RungeKuttaFehlberg78Integrator
         {
             Direction         = IntegrationSense.Increasing,
             InitialStepSize   = double.Parse(m_stepSize.Text),
             MaximumStepSize   = double.Parse(m_maxStep.Text),
             MinimumStepSize   = double.Parse(m_minStep.Text),
             AbsoluteTolerance = double.Parse(m_maxError.Text)
         };
         if (m_fixedOrRelative.SelectedItem.ToString() == RELATIVE)
         {
             integrator.StepSizeBehavior = KindOfStepSize.Relative;
         }
         else if (m_fixedOrRelative.SelectedItem.ToString() == FIXED)
         {
             integrator.StepSizeBehavior = KindOfStepSize.Fixed;
         }
         return(integrator);
     }
     if (m_integrator.SelectedItem.ToString() == RK4)
     {
         return(new RungeKutta4Integrator
         {
             InitialStepSize = double.Parse(m_stepSize.Text)
         });
     }
     throw new InvalidOperationException("Unknown integrator");
 }
예제 #3
0
        /// <summary>
        /// J2积分器(惯性系中计算,含岁差章动),右函数采用SphericalHarmonicGravity模型
        /// <para>积分变量仅位置、速度</para>
        /// <para>给position仅添加J2项右函数</para>
        /// <para>RKF7(8)数值积分器,缺省绝对和相对精度皆为1e-13</para>
        /// <para>Epoch属性需手动赋值</para>
        /// </summary>
        /// <param name="position">PropagationNewtonianPoint,单位:m,m/s</param>
        /// <param name="centralBody"></param>
        /// <param name="gravitationalParameter">引力常数GM(m^3/s^2)</param>
        /// <param name="j2UnnormalizedValue">J2</param>
        /// <param name="referenceDistance">Re(m)</param>
        /// <param name="absTolerance">RKF7(8)的绝对精度</param>
        /// <param name="relRolerance">RKF7(8)的相对精度</param>
        public PropagatorDefinitionJ2(PropagationNewtonianPoint position, CentralBody centralBody, double gravitationalParameter = 3.986004418e14, double j2UnnormalizedValue = 0.001082629989052, double referenceDistance = 6378137.0, double absTolerance = 1e-13, double relRolerance = 1e-13)
        {
            //  中心天体的J2项引力摄动(含中心引力,中心天体的惯性系中计算),含岁差章动
            SphericalHarmonicGravity gravity = new SphericalHarmonicGravity();

            gravity.TargetPoint = position.IntegrationPoint; //* Will represent the position during propagation

            double[][] coe = new double[3][];
            coe[0] = new double[1];
            coe[1] = new double[2];
            coe[2] = new double[3];
            SphericalHarmonicGravityModel gravityModel = new SphericalHarmonicGravityModel("WGS84", centralBody.Name, gravitationalParameter, referenceDistance, new double[] { 1.0, 0.0, j2UnnormalizedValue }, coe, coe, false, false);
            int  degree = 2;
            int  order  = 0;
            bool includeTwoBodyForce = true;

            gravity.GravityField = new SphericalHarmonicGravityField(gravityModel, degree, order, includeTwoBodyForce, SphericalHarmonicsTideType.None);

            //  添加右函数
            position.AppliedForces.Clear();
            position.AppliedForces.Add(gravity);

            //  积分变量
            this.IntegrationElements.Add(position);

            //  RKF7(8)数值积分器
            RungeKuttaFehlberg78Integrator integrator = new RungeKuttaFehlberg78Integrator();

            integrator.AbsoluteTolerance = absTolerance;
            integrator.RelativeTolerance = relRolerance;
            integrator.InitialStepSize   = 60.0;
            integrator.StepSizeBehavior  = KindOfStepSize.Relative;
            integrator.MaximumStepSize   = 200.0;
            integrator.MinimumStepSize   = 1.0;
            //* This is STK's default and truncates each step to 3 decimal places
            integrator.StepTruncationOrder = -3;

            this.Integrator = integrator;
        }