🛰️航天仿真算法库 SpaceAST 0.3.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_; }
55
57 double refDistance() const { return refDistance_; }
58protected:
59 int maxDegree_{0};
60 int maxOrder_{0};
61 std::string centralBody_{};
62 std::string model_{};
63 std::string referenceFrame_{};
64 double gm_{0};
65 double refDistance_{0};
66 bool normalized_{false};
67 bool includesPermTide_{false};
68};
69
72{
73public:
74 struct Variation
75 {
76 bool isSin_{false};
77 int degree_{0};
78 int order_{0};
79 double linearRate_{0};
80 double originalCoefficient_{0};
81 };
82public:
83 bool normalized_{false};
84 TimePoint referenceEpoch_{};
85 std::vector<Variation> variations_{};
86};
87
90class AST_CORE_API GravityField: protected GravityFieldHead
91{
92public:
95 ~GravityField() = default;
96
97 using GravityFieldHead::referenceFrame;
98 using GravityFieldHead::refDistance;
99
100 using GravityFieldHead::maxDegree_;
101 using GravityFieldHead::maxOrder_;
102 using GravityFieldHead::centralBody_;
103 using GravityFieldHead::model_;
104 using GravityFieldHead::referenceFrame_;
105 using GravityFieldHead::gm_;
106 using GravityFieldHead::refDistance_;
107 using GravityFieldHead::normalized_;
108 using GravityFieldHead::includesPermTide_;
109
110
113 const GravityFieldHead& getHead() const { return *this; }
114
117 const std::string& getModelName() const { return model_; }
118 void setModelName(StringView model) { model_ = std::string(model); }
119
122 const std::string& getCentralBodyName() const { return centralBody_; }
123
127 int getMaxDegree() const { return maxDegree_; }
130 int getMaxOrder() const { return maxOrder_; }
131
136 bool isValidDegreeOrder(int degree, int order) const;
137
140 double getGM() const { return gm_; }
141
144 double getRefDistance() const { return refDistance_; }
145
148 bool isNormalized() const { return normalized_; }
149
152 bool isIncludesPermTide() const { return includesPermTide_; }
153
162 void applyPermanentTideC20Correction(double k20);
163
168 double getSnm(int n, int m) const;
169
174 double getCnm(int n, int m) const;
175
176 double getSnmNormalized(int n, int m) const;
177 double getCnmNormalized(int n, int m) const;
178 double getSnmUnnormalized(int n, int m) const;
179 double getCnmUnnormalized(int n, int m) const;
180
182 double getJn(int n) const;
183
184#ifndef SWIG // 还没解决好swig封装StringView的问题,暂时屏蔽
185
190 errc_t load(StringView model, StringView dirpath=StringView{});
191
198 errc_t load(StringView model, int maxLoadDegree, int maxLoadOrder, StringView dirpath=StringView{});
199
200#endif
201
203 void normalize();
204
206 void unnormalize() ;
207
210 GravityField normalized() const;
211
214 GravityField unnormalized() const;
215
218 void updateVariations(const TimePoint& epoch);
219
221 SecularVariations& secularVariations() { return secularVariations_; }
222public:
223 double& snm(int n, int m);
224 double& cnm(int n, int m);
226 void initCoeffMatrices();
227protected:
228 LowerMatrixd sinCoeff_{};
229 LowerMatrixd cosCoeff_{};
230 SecularVariations secularVariations_{};
231};
232
233inline double &GravityField::snm(int n, int m)
234{
235 return sinCoeff_(n, m);
236}
237
238inline double &GravityField::cnm(int n, int m)
239{
240 return cosCoeff_(n, m);
241}
242
243inline bool GravityField::isValidDegreeOrder(int degree, int order) const
244{
245 return degree <= this->getMaxDegree() && order <= this->getMaxOrder()
246 && degree >= order && order >= 0 && degree >= 0;
247}
248
249inline double GravityField::getSnm(int n, int m) const
250{
251 if(A_LIKELY(isValidDegreeOrder(n, m)))
252 return sinCoeff_(n, m);
253 return 0;
254}
255
256inline double GravityField::getCnm(int n, int m) const
257{
258 if(A_LIKELY(isValidDegreeOrder(n, m)))
259 return cosCoeff_(n, m);
260 return 0;
261}
262
263
264AST_NAMESPACE_END
重力场头信息
定义 GravityField.hpp:46
double refDistance() const
获取重力场的参考半径
定义 GravityField.hpp:57
const std::string & referenceFrame() const
获取重力场的参考系名称
定义 GravityField.hpp:54
double getGM() const
获取重力场的中心天体引力常数
定义 GravityField.hpp:51
重力场长期变化
定义 GravityField.hpp:72
重力场系数
定义 GravityField.hpp:91
bool isIncludesPermTide() const
是否包含潮汐
定义 GravityField.hpp:152
int getMaxOrder() const
获取最大次数
定义 GravityField.hpp:130
SecularVariations & secularVariations()
获取重力场长期变化
定义 GravityField.hpp:221
int getMaxDegree() const
获取最大阶数
定义 GravityField.hpp:127
const GravityFieldHead & getHead() const
获取重力场头信息
定义 GravityField.hpp:113
bool isNormalized() const
是否归一化
定义 GravityField.hpp:148
const std::string & getCentralBodyName() const
获取中心天体名称
定义 GravityField.hpp:122
const std::string & getModelName() const
获取重力场模型名称
定义 GravityField.hpp:117
double getGM() const
获取中心天体引力常数
定义 GravityField.hpp:140
double getRefDistance() const
获取参考距离
定义 GravityField.hpp:144
绝对时间点
定义 TimePoint.hpp:108
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
Unit m
米
定义 Unit.cpp:456
void aGravityFieldNormalize(GravityField &gf)
归一化重力场
定义 GravityField.cpp:31
void aGravityFieldUnnormalize(GravityField &gf)
反归一化重力场
定义 GravityField.cpp:36