🛰️航天仿真算法库 SpaceAST 0.0.1
载入中...
搜索中...
未找到
GravityField.hpp
浏览该文件的文档.
1
20
21#pragma once
22
23#include "AstGlobal.h"
24#include "AstMath/LowerMatrix.hpp"
25#include "AstUtil/StringView.hpp"
26#include "AstCore/TimePoint.hpp"
27#include <string>
28#include <vector>
29
30AST_NAMESPACE_BEGIN
31
32class GravityField;
33class BKVParser;
34
37AST_CORE_CAPI void aGravityFieldNormalize(GravityField& gf);
38
41AST_CORE_CAPI void aGravityFieldUnnormalize(GravityField& gf);
42
45class AST_CORE_API GravityFieldHead
46{
47public:
48 errc_t load(StringView filepath, StringView dirpath=StringView());
49
51 double getGM() const { return gm_; }
52
54 const std::string& referenceFrame() const { return referenceFrame_; }
55protected:
56 int maxDegree_{0};
57 int maxOrder_{0};
58 std::string centralBody_;
59 std::string model_;
60 std::string referenceFrame_;
61 double gm_{0};
62 double refDistance_{0};
63 bool normalized_{false};
64 bool includesPermTide_{false};
65};
66
69{
70public:
71 struct Variation
72 {
73 bool isSin_{false};
74 int degree_{0};
75 int order_{0};
76 double linearRate_{0};
77 double originalCoefficient_{0};
78 };
79public:
80 bool normalized_{false};
81 TimePoint referenceEpoch_{};
82 std::vector<Variation> variations_;
83};
84
87class AST_CORE_API GravityField: protected GravityFieldHead
88{
89public:
92 ~GravityField() = default;
93
94 using GravityFieldHead::referenceFrame;
95
96 using GravityFieldHead::maxDegree_;
97 using GravityFieldHead::maxOrder_;
98 using GravityFieldHead::centralBody_;
99 using GravityFieldHead::model_;
100 using GravityFieldHead::referenceFrame_;
101 using GravityFieldHead::gm_;
102 using GravityFieldHead::refDistance_;
103 using GravityFieldHead::normalized_;
104 using GravityFieldHead::includesPermTide_;
105
106
109 const GravityFieldHead& getHead() const { return *this; }
110
113 const std::string& getModelName() const { return model_; }
114 void setModelName(StringView model) { model_ = std::string(model); }
115
118 const std::string& getCentralBodyName() const { return centralBody_; }
119
123 int getMaxDegree() const { return maxDegree_; }
126 int getMaxOrder() const { return maxOrder_; }
127
132 bool isValidDegreeOrder(int degree, int order) const;
133
136 double getGM() const { return gm_; }
137
140 double getRefDistance() const { return refDistance_; }
141
144 bool isNormalized() const { return normalized_; }
145
148 bool isIncludesPermTide() const { return includesPermTide_; }
149
158 void applyPermanentTideC20Correction(double k20);
159
164 double getSnm(int n, int m) const;
165
170 double getCnm(int n, int m) const;
171
172 double getSnmNormalized(int n, int m) const;
173 double getCnmNormalized(int n, int m) const;
174 double getSnmUnnormalized(int n, int m) const;
175 double getCnmUnnormalized(int n, int m) const;
176
178 double getJn(int n) const;
179
180#ifndef SWIG // 还没解决好swig封装StringView的问题,暂时屏蔽
181
186 errc_t load(StringView model, StringView dirpath=StringView{});
187
194 errc_t load(StringView model, int maxLoadDegree, int maxLoadOrder, StringView dirpath=StringView{});
195
196#endif
197
199 void normalize();
200
202 void unnormalize() ;
203
206 GravityField normalized() const;
207
210 GravityField unnormalized() const;
211
214 void updateVariations(const TimePoint& epoch);
215
217 SecularVariations& secularVariations() { return secularVariations_; }
218public:
219 double& snm(int n, int m);
220 double& cnm(int n, int m);
222 void initCoeffMatrices();
223protected:
227};
228
229inline double &GravityField::snm(int n, int m)
230{
231 return sinCoeff_(n, m);
232}
233
234inline double &GravityField::cnm(int n, int m)
235{
236 return cosCoeff_(n, m);
237}
238
239inline bool GravityField::isValidDegreeOrder(int degree, int order) const
240{
241 return degree <= this->getMaxDegree() && order <= this->getMaxOrder()
242 && degree >= order && order >= 0 && degree >= 0;
243}
244
245inline double GravityField::getSnm(int n, int m) const
246{
247 if(A_LIKELY(isValidDegreeOrder(n, m)))
248 return sinCoeff_(n, m);
249 return 0;
250}
251
252inline double GravityField::getCnm(int n, int m) const
253{
254 if(A_LIKELY(isValidDegreeOrder(n, m)))
255 return cosCoeff_(n, m);
256 return 0;
257}
258
259
260AST_NAMESPACE_END
Unit m
定义 Unit.cpp:426
重力场头信息
定义 GravityField.hpp:46
std::string referenceFrame_
重力场的参考系名称:例如月球的重力场参考系 PrincipalAxes_421、PrincipalAxes_403等,默认为天体固连系
定义 GravityField.hpp:60
std::string model_
重力场模型名称
定义 GravityField.hpp:59
std::string centralBody_
中心天体名称
定义 GravityField.hpp:58
const std::string & referenceFrame() const
获取重力场的参考系名称
定义 GravityField.hpp:54
double getGM() const
获取重力场的中心天体引力常数
定义 GravityField.hpp:51
重力场长期变化
定义 GravityField.hpp:69
std::vector< Variation > variations_
长期变化系数列表
定义 GravityField.hpp:82
重力场系数
定义 GravityField.hpp:88
bool isIncludesPermTide() const
是否包含潮汐
定义 GravityField.hpp:148
SecularVariations secularVariations_
重力场长期变化
定义 GravityField.hpp:226
int getMaxOrder() const
获取最大次数
定义 GravityField.hpp:126
SecularVariations & secularVariations()
获取重力场长期变化
定义 GravityField.hpp:217
int getMaxDegree() const
获取最大阶数
定义 GravityField.hpp:123
const GravityFieldHead & getHead() const
获取重力场头信息
定义 GravityField.hpp:109
bool isNormalized() const
是否归一化
定义 GravityField.hpp:144
const std::string & getCentralBodyName() const
获取中心天体名称
定义 GravityField.hpp:118
LowerMatrixd cosCoeff_
Cnm系数
定义 GravityField.hpp:225
const std::string & getModelName() const
获取重力场模型名称
定义 GravityField.hpp:113
double getGM() const
获取中心天体引力常数
定义 GravityField.hpp:136
LowerMatrixd sinCoeff_
Snm系数
定义 GravityField.hpp:224
double getRefDistance() const
获取参考距离
定义 GravityField.hpp:140
绝对时间点
定义 TimePoint.hpp:107
auto normalized(const Vector &vec) -> typename std::enable_if<!std::is_pointer< Vector >::value, Vector >::type
normalized
定义 MathOperator.hpp:352
double normalize(double *vec, size_t N)
normalize
定义 MathOperator.hpp:306
void aGravityFieldNormalize(GravityField &gf)
归一化重力场
定义 GravityField.cpp:31
void aGravityFieldUnnormalize(GravityField &gf)
反归一化重力场
定义 GravityField.cpp:36