🛰️航天仿真算法库 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
51AST_CORE_API void aPointMassField(const Vector3d& position, double GM, Vector3d& acceleration, Matrix3d& hessian);
52
53class GravityCalculator1;
54class GravityCalculator2;
55class GravityCalculator3;
56
57#ifdef _AST_USE_GRAVITY_CALCULATOR_1
58 #define _AST_ENABLE_GRAVITY_CALCULATOR_1
59 using GravityCalculatorDefault = GravityCalculator1;
60#else
61 using GravityCalculatorDefault = GravityCalculator3;
62#endif
63
65class AST_CORE_API GravityCalculator
66{
67public:
69
74 GravityCalculator(const GravityField &gravityField, int degree=-1, int order=-1);
75
80 GravityCalculator(GravityField &&gravityField, int degree=-1, int order=-1);
81
82
85 const GravityField& getGravityField() const { return gravityField_; }
86
89 void updateVariations(const TimePoint& tp){gravityField_.updateVariations(tp);}
90
91 // 在这里不能公开提供返回可修改引用接口,否则会导致重力场系数等参数被修改
92 //
93 // 例如: 在初始化重力场计算对象后,
94 // 通过重力场的可修改引用调用load函数重新加载重力场模型
95 // 可能导致加载重力场阶次比计算所需的阶次小,从而导致执行崩溃问题
96 // 或者导致加载重力场阶次比计算所需的阶次大,但是计算时并没有使用高阶项,容易导致与预期不符
97 //
98 // 因此,在这里不能公开提供可修改引用,只能提供const引用
99protected:
100 GravityField& getGravityField() { return gravityField_; }
101public:
104 int getDegree() const { return degree_; }
105
108 int getOrder() const { return order_; }
109
111 void setDegreeForPartial(unsigned int degree);
112
114 void setOrderForPartial(unsigned int order);
115
118 int getDegreeForPartial() const { return degreeForPartial_; }
119
122 int getOrderForPartial() const { return orderForPartial_; }
123
124 virtual ~GravityCalculator () = default;
125
129 virtual void calcPertAcceleration (const Vector3d &positionCBF, Vector3d &accelerationCBF) = 0;
130
134 void calcTotalAcceleration (const Vector3d &positionCBF, Vector3d &accelerationCBF);
135private:
136 void initDegreeOrder(int degree, int order);
137protected:
139 unsigned int degree_{0};
140 unsigned int order_{0};
141 unsigned int degreeForPartial_{0};
142 unsigned int orderForPartial_{0};
143};
144
145#ifdef _AST_ENABLE_GRAVITY_CALCULATOR_1
146
148class AST_CORE_API GravityCalculator1 final: public GravityCalculator
149{
150public:
151 GravityCalculator1();
152 GravityCalculator1(const GravityField &gravityField, int degree, int order);
153 ~GravityCalculator1();
154
155 void calcPertAcceleration (const Vector3d &positionCBF, Vector3d &accelerationCBF) final;
156
157protected:
158 class Impl;
159 std::unique_ptr<Impl> impl_;
160};
161
162#endif
163
164
166class AST_CORE_API GravityCalculator2 final: public GravityCalculator
167{
168public:
169 GravityCalculator2(const GravityField &gravityField, int degree, int order);
170
172 void calcPertAcceleration (const Vector3d &positionCBF, Vector3d &accelerationCBF) final;
173
174private:
176 void initializeRecursionCoefficients();
177
179 void computeGradient(const Vector3d &position, Vector3d &gradient);
180
182 int computeTesseral(int m, int degree, int index, double t, double u, double tOu);
183
184private:
186 std::vector<double> gnmOj_{};
187
189 std::vector<double> hnmOj_{};
190
192 std::vector<double> enm_{};
193
195 std::vector<double> sectorial_{};
196private:
197 std::vector<double> pnm0Plus2{};
198 std::vector<double> pnm0Plus1{};
199 std::vector<double> pnm0{};
200 std::vector<double> pnm1{};
201private:
202 std::vector<double> aOrN{};
203 std::vector<double> cosLambdaN{};
204 std::vector<double> sinLambdaN{};
205};
206
207
210class AST_CORE_API GravityCalculator3 final: public GravityCalculator
211{
212public:
214 GravityCalculator3(const GravityField &gravityField, int degree, int order);
215 GravityCalculator3(GravityField &&gravityField, int degree, int order);
216
217 GravityCalculator3(const GravityCalculator3&) = delete;
218 GravityCalculator3& operator=(const GravityCalculator3&) = delete;
219
220 ~GravityCalculator3() override;
221
222 void calcPertAcceleration(const Vector3d &positionCBF, Vector3d &accelerationCBF) final;
223 void calcPertAcceleration(const Vector3d &positionCBF, Vector3d &accelerationCBF, Matrix3d &gradient);
224 template<bool fillgradient>
225 void calcPertAcceleration(const Vector3d &positionCBF, Vector3d &accelerationCBF, Matrix3d *gradient);
226 using GravityCalculator::calcTotalAcceleration;
227 void calcTotalAcceleration (const Vector3d &positionCBF, Vector3d &accelerationCBF, Matrix3d &gradient);
228protected:
229 void init();
230 void deinit();
231private:
232 double Factor; // Factor = 1 (magnetic) or -mu (gravity)
233 double** C{}; // Normalized harmonic coefficients
234 double** S{}; // Normalized harmonic coefficients
235 double** A{}; // Normalized 'derived' Assoc. Legendre Poly
236 double** V{}; // Normalization factor
237 double* Re{}; // powers of projection of pos onto x_ecf (re)
238 double* Im{}; // powers of projection of pos onto y_ecf (im)
239 double** N1{}; // Temporary
240 double** N2{}; // Temporary
241 double** VR01{}; // Temporary
242 double** VR11{}; // Temporary
243 double** VR02{}; // Temporary
244 double** VR12{}; // Temporary
245 double** VR22{}; // Temporary
246};
247
248
249class AST_CORE_API GravityCalculator4 final: public GravityCalculator
250{
251public:
252 using GravityCalculator::GravityCalculator;
253
254 void calcPertAcceleration (const Vector3d &positionCBF, Vector3d &accelerationCBF) final;
255};
256
257
258class AST_CORE_API GravityCalculator5 final: public GravityCalculator
259{
260public:
261 using GravityCalculator::GravityCalculator;
262
263 void calcPertAcceleration (const Vector3d &positionCBF, Vector3d &accelerationCBF) final;
264};
265
266
267AST_NAMESPACE_END
268
269AST_DECL_TYPE_ALIAS(GravityCalculator)
270AST_DECL_TYPE_ALIAS(GravityCalculator1)
271AST_DECL_TYPE_ALIAS(GravityCalculator2)
272AST_DECL_TYPE_ALIAS(GravityCalculator3)
273AST_DECL_TYPE_ALIAS(GravityCalculator4)
274AST_DECL_TYPE_ALIAS(GravityCalculator5)
重力加速度计算类2 - Holmes-Featherstone算法
定义 GravityCalculator.hpp:167
重力加速度计算类3
定义 GravityCalculator.hpp:211
定义 GravityCalculator.hpp:250
定义 GravityCalculator.hpp:259
重力加速度计算类
定义 GravityCalculator.hpp:66
int getDegree() const
获取计算阶数
定义 GravityCalculator.hpp:104
virtual void calcPertAcceleration(const Vector3d &positionCBF, Vector3d &accelerationCBF)=0
计算摄动加速度
const GravityField & getGravityField() const
获取重力场系数
定义 GravityCalculator.hpp:85
GravityField gravityField_
重力场系数
定义 GravityCalculator.hpp:138
int getOrder() const
获取计算次数
定义 GravityCalculator.hpp:108
int getDegreeForPartial() const
获取计算偏导数时使用的阶数
定义 GravityCalculator.hpp:118
void updateVariations(const TimePoint &tp)
更新重力场系数变化
定义 GravityCalculator.hpp:89
int getOrderForPartial() const
获取计算偏导数时使用的次数
定义 GravityCalculator.hpp:122
重力场系数
定义 GravityField.hpp:88
绝对时间点
定义 TimePoint.hpp:108
Unit A
安培
定义 Unit.cpp:483
Unit m
定义 Unit.cpp:456
void aPointMassField(const Vector3d &position, double GM, Vector3d &acceleration, Matrix3d &hessian)
计算质点引力场(加速度及 Hessian)
定义 GravityCalculator.cpp:29