🛰️航天仿真算法库 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//#define _AST_ENABLE_GRAVITY_CALCULATOR_1
39using GravityCalculatorDefault = GravityCalculator3;
40
42class AST_CORE_API GravityCalculator
43{
44public:
46
51 GravityCalculator(const GravityField &gravityField, int degree=-1, int order=-1);
52
57 GravityCalculator(GravityField &&gravityField, int degree=-1, int order=-1);
58
59
62 const GravityField& getGravityField() const { return gravityField_; }
63
64 // 在这里不能公开提供返回可修改引用接口,否则会导致重力场系数等参数被修改
65 //
66 // 例如: 在初始化重力场计算对象后,
67 // 通过重力场的可修改引用调用load函数重新加载重力场模型
68 // 可能导致加载重力场阶次比计算所需的阶次小,从而导致执行崩溃问题
69 // 或者导致加载重力场阶次比计算所需的阶次大,但是计算时并没有使用高阶项,容易导致与预期不符
70 //
71 // 因此,在这里不能公开提供可修改引用,只能提供const引用
72protected:
73 GravityField& getGravityField() { return gravityField_; }
74public:
77 int getDegree() const { return degree_; }
78
81 int getOrder() const { return order_; }
82
83 virtual ~GravityCalculator () = default;
84
88 virtual void calcPertAcceleration (const Vector3d &positionCBF, Vector3d &accelerationCBF) = 0;
89
93 virtual void calcTotalAcceleration (const Vector3d &positionCBF, Vector3d &accelerationCBF);
94private:
95 void initDegreeOrder(int degree, int order);
96protected:
98 int degree_{0};
99 int order_{0};
100};
101
102#ifdef _AST_ENABLE_GRAVITY_CALCULATOR_1
103
105class AST_CORE_API GravityCalculator1: public GravityCalculator
106{
107public:
108 GravityCalculator1(const GravityField &gravityField, int degree, int order);
109 ~GravityCalculator1();
110
111 void calcPertAcceleration (const Vector3d &positionCBF, Vector3d &accelerationCBF) final;
112
113protected:
114 class Impl;
115 std::unique_ptr<Impl> impl_;
116};
117
118#endif
119
120
122class AST_CORE_API GravityCalculator2: public GravityCalculator
123{
124public:
125 GravityCalculator2(const GravityField &gravityField, int degree, int order);
126
128 void calcPertAcceleration (const Vector3d &positionCBF, Vector3d &accelerationCBF) final;
129
130private:
132 void initializeRecursionCoefficients();
133
135 void computeGradient(const Vector3d &position, Vector3d &gradient);
136
138 int computeTesseral(int m, int degree, int index, double t, double u, double tOu);
139
140private:
142 std::vector<double> gnmOj_;
143
145 std::vector<double> hnmOj_;
146
148 std::vector<double> enm_;
149
151 std::vector<double> sectorial_;
152private:
153 std::vector<double> pnm0Plus2;
154 std::vector<double> pnm0Plus1;
155 std::vector<double> pnm0;
156 std::vector<double> pnm1;
157private:
158 std::vector<double> aOrN;
159 std::vector<double> cosLambdaN;
160 std::vector<double> sinLambdaN;
161};
162
163
166class AST_CORE_API GravityCalculator3: public GravityCalculator
167{
168public:
170 GravityCalculator3(const GravityField &gravityField, int degree, int order);
171 GravityCalculator3(GravityField &&gravityField, int degree, int order);
172
173 ~GravityCalculator3() override;
174
175 void calcPertAcceleration (const Vector3d &positionCBF, Vector3d &accelerationCBF) final;
176protected:
177 void init();
178 void deinit();
179private:
180 double Factor; // Factor = 1 (magnetic) or -mu (gravity)
181 double** C; // Normalized harmonic coefficients
182 double** S; // Normalized harmonic coefficients
183 double** A; // Normalized 'derived' Assoc. Legendre Poly
184 double** V; // Normalization factor
185 double* Re; // powers of projection of pos onto x_ecf (re)
186 double* Im; // powers of projection of pos onto y_ecf (im)
187 double** N1; // Temporary
188 double** N2; // Temporary
189 double** VR01; // Temporary
190 double** VR11; // Temporary
191 double** VR02; // Temporary
192 double** VR12; // Temporary
193 double** VR22; // Temporary
194};
195
196
197class AST_CORE_API GravityCalculator4: public GravityCalculator
198{
199public:
200 using GravityCalculator::GravityCalculator;
201
202 void calcPertAcceleration (const Vector3d &positionCBF, Vector3d &accelerationCBF) final;
203};
204
205
206class AST_CORE_API GravityCalculator5: public GravityCalculator
207{
208public:
209 using GravityCalculator::GravityCalculator;
210
211 void calcPertAcceleration (const Vector3d &positionCBF, Vector3d &accelerationCBF) final;
212};
213
214
215AST_NAMESPACE_END
216
217AST_DECL_TYPE_ALIAS(GravityCalculator)
218AST_DECL_TYPE_ALIAS(GravityCalculator1)
219AST_DECL_TYPE_ALIAS(GravityCalculator2)
220AST_DECL_TYPE_ALIAS(GravityCalculator3)
221AST_DECL_TYPE_ALIAS(GravityCalculator4)
222AST_DECL_TYPE_ALIAS(GravityCalculator5)
Unit A
安培
定义 Unit.cpp:443
Unit m
定义 Unit.cpp:416
重力加速度计算类2 - Holmes-Featherstone算法
定义 GravityCalculator.hpp:123
重力加速度计算类3
定义 GravityCalculator.hpp:167
定义 GravityCalculator.hpp:198
定义 GravityCalculator.hpp:207
重力加速度计算类
定义 GravityCalculator.hpp:43
int getDegree() const
获取计算阶数
定义 GravityCalculator.hpp:77
virtual void calcPertAcceleration(const Vector3d &positionCBF, Vector3d &accelerationCBF)=0
计算摄动加速度
const GravityField & getGravityField() const
获取重力场系数
定义 GravityCalculator.hpp:62
GravityField gravityField_
重力场系数
定义 GravityCalculator.hpp:97
int getOrder() const
获取计算次数
定义 GravityCalculator.hpp:81
重力场系数
定义 GravityField.hpp:63