🛰️航天仿真算法库 SpaceAST 0.0.1
载入中...
搜索中...
未找到
GravityCalculator.hpp
1
20
21#pragma once
22
23#include "AstGlobal.h"
24#include "GravityField.hpp"
25#include "AstUtil/StringView.hpp"
26// #include "AstMath/Matrix.hpp"
27// #include "AstMath/Vector.hpp"
28#include <cmath>
29#include <vector>
30#include <memory>
31
32AST_NAMESPACE_BEGIN
33
34class GravityCalculator1;
35class GravityCalculator2;
36class GravityCalculator3;
37
38#ifdef _AST_USE_GRAVITY_CALCULATOR_1
39 #define _AST_ENABLE_GRAVITY_CALCULATOR_1
40 using GravityCalculatorDefault = GravityCalculator1;
41#else
42 using GravityCalculatorDefault = GravityCalculator3;
43#endif
44
46class AST_CORE_API GravityCalculator
47{
48public:
50
55 GravityCalculator(const GravityField &gravityField, int degree=-1, int order=-1);
56
61 GravityCalculator(GravityField &&gravityField, int degree=-1, int order=-1);
62
63
66 const GravityField& getGravityField() const { return gravityField_; }
67
70 void updateVariations(const TimePoint& tp){gravityField_.updateVariations(tp);}
71
72 // 在这里不能公开提供返回可修改引用接口,否则会导致重力场系数等参数被修改
73 //
74 // 例如: 在初始化重力场计算对象后,
75 // 通过重力场的可修改引用调用load函数重新加载重力场模型
76 // 可能导致加载重力场阶次比计算所需的阶次小,从而导致执行崩溃问题
77 // 或者导致加载重力场阶次比计算所需的阶次大,但是计算时并没有使用高阶项,容易导致与预期不符
78 //
79 // 因此,在这里不能公开提供可修改引用,只能提供const引用
80protected:
81 GravityField& getGravityField() { return gravityField_; }
82public:
85 int getDegree() const { return degree_; }
86
89 int getOrder() const { return order_; }
90
91 virtual ~GravityCalculator () = default;
92
96 virtual void calcPertAcceleration (const Vector3d &positionCBF, Vector3d &accelerationCBF) = 0;
97
101 virtual void calcTotalAcceleration (const Vector3d &positionCBF, Vector3d &accelerationCBF);
102private:
103 void initDegreeOrder(int degree, int order);
104protected:
106 int degree_{0};
107 int order_{0};
108};
109
110#ifdef _AST_ENABLE_GRAVITY_CALCULATOR_1
111
113class AST_CORE_API GravityCalculator1 final: public GravityCalculator
114{
115public:
116 GravityCalculator1();
117 GravityCalculator1(const GravityField &gravityField, int degree, int order);
118 ~GravityCalculator1();
119
120 void calcPertAcceleration (const Vector3d &positionCBF, Vector3d &accelerationCBF) final;
121
122protected:
123 class Impl;
124 std::unique_ptr<Impl> impl_;
125};
126
127#endif
128
129
131class AST_CORE_API GravityCalculator2 final: public GravityCalculator
132{
133public:
134 GravityCalculator2(const GravityField &gravityField, int degree, int order);
135
137 void calcPertAcceleration (const Vector3d &positionCBF, Vector3d &accelerationCBF) final;
138
139private:
141 void initializeRecursionCoefficients();
142
144 void computeGradient(const Vector3d &position, Vector3d &gradient);
145
147 int computeTesseral(int m, int degree, int index, double t, double u, double tOu);
148
149private:
151 std::vector<double> gnmOj_;
152
154 std::vector<double> hnmOj_;
155
157 std::vector<double> enm_;
158
160 std::vector<double> sectorial_;
161private:
162 std::vector<double> pnm0Plus2;
163 std::vector<double> pnm0Plus1;
164 std::vector<double> pnm0;
165 std::vector<double> pnm1;
166private:
167 std::vector<double> aOrN;
168 std::vector<double> cosLambdaN;
169 std::vector<double> sinLambdaN;
170};
171
172
175class AST_CORE_API GravityCalculator3 final: public GravityCalculator
176{
177public:
179 GravityCalculator3(const GravityField &gravityField, int degree, int order);
180 GravityCalculator3(GravityField &&gravityField, int degree, int order);
181
182 ~GravityCalculator3() override;
183
184 void calcPertAcceleration (const Vector3d &positionCBF, Vector3d &accelerationCBF) final;
185protected:
186 void init();
187 void deinit();
188private:
189 double Factor; // Factor = 1 (magnetic) or -mu (gravity)
190 double** C{}; // Normalized harmonic coefficients
191 double** S{}; // Normalized harmonic coefficients
192 double** A{}; // Normalized 'derived' Assoc. Legendre Poly
193 double** V{}; // Normalization factor
194 double* Re{}; // powers of projection of pos onto x_ecf (re)
195 double* Im{}; // powers of projection of pos onto y_ecf (im)
196 double** N1{}; // Temporary
197 double** N2{}; // Temporary
198 double** VR01{}; // Temporary
199 double** VR11{}; // Temporary
200 double** VR02{}; // Temporary
201 double** VR12{}; // Temporary
202 double** VR22{}; // Temporary
203};
204
205
206class AST_CORE_API GravityCalculator4 final: public GravityCalculator
207{
208public:
209 using GravityCalculator::GravityCalculator;
210
211 void calcPertAcceleration (const Vector3d &positionCBF, Vector3d &accelerationCBF) final;
212};
213
214
215class AST_CORE_API GravityCalculator5 final: public GravityCalculator
216{
217public:
218 using GravityCalculator::GravityCalculator;
219
220 void calcPertAcceleration (const Vector3d &positionCBF, Vector3d &accelerationCBF) final;
221};
222
223
224AST_NAMESPACE_END
225
226AST_DECL_TYPE_ALIAS(GravityCalculator)
227AST_DECL_TYPE_ALIAS(GravityCalculator1)
228AST_DECL_TYPE_ALIAS(GravityCalculator2)
229AST_DECL_TYPE_ALIAS(GravityCalculator3)
230AST_DECL_TYPE_ALIAS(GravityCalculator4)
231AST_DECL_TYPE_ALIAS(GravityCalculator5)
Unit A
安培
定义 Unit.cpp:453
Unit m
定义 Unit.cpp:426
重力加速度计算类2 - Holmes-Featherstone算法
定义 GravityCalculator.hpp:132
重力加速度计算类3
定义 GravityCalculator.hpp:176
定义 GravityCalculator.hpp:207
定义 GravityCalculator.hpp:216
重力加速度计算类
定义 GravityCalculator.hpp:47
int getDegree() const
获取计算阶数
定义 GravityCalculator.hpp:85
virtual void calcPertAcceleration(const Vector3d &positionCBF, Vector3d &accelerationCBF)=0
计算摄动加速度
const GravityField & getGravityField() const
获取重力场系数
定义 GravityCalculator.hpp:66
GravityField gravityField_
重力场系数
定义 GravityCalculator.hpp:105
int getOrder() const
获取计算次数
定义 GravityCalculator.hpp:89
void updateVariations(const TimePoint &tp)
更新重力场系数变化
定义 GravityCalculator.hpp:70
重力场系数
定义 GravityField.hpp:88
绝对时间点
定义 TimePoint.hpp:107