123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400 |
- #if !defined(GEOGRAPHICLIB_NORMALGRAVITY_HPP)
- #define GEOGRAPHICLIB_NORMALGRAVITY_HPP 1
- #include <GeographicLib/Constants.hpp>
- #include <GeographicLib/Geocentric.hpp>
- namespace GeographicLib {
-
- class GEOGRAPHICLIB_EXPORT NormalGravity {
- private:
- static const int maxit_ = 20;
- typedef Math::real real;
- friend class GravityModel;
- real _a, _GM, _omega, _f, _J2, _omega2, _aomega2;
- real _e2, _ep2, _b, _E, _U0, _gammae, _gammap, _Q0, _k, _fstar;
- Geocentric _earth;
- static real atanzz(real x, bool alt) {
-
-
-
-
-
- using std::sqrt; using std::abs; using std::atan; using std::asin;
- using std::asinh; using std::atanh;
- real z = sqrt(abs(x));
- return x == 0 ? 1 :
- (alt ?
- (!(x < 0) ? asinh(z) : asin(z)) / sqrt(abs(x) / (1 + x)) :
- (!(x < 0) ? atan(z) : atanh(z)) / z);
- }
- static real atan7series(real x);
- static real atan5series(real x);
- static real Qf(real x, bool alt);
- static real Hf(real x, bool alt);
- static real QH3f(real x, bool alt);
- real Jn(int n) const;
- void Initialize(real a, real GM, real omega, real f_J2, bool geometricp);
- public:
-
-
-
- NormalGravity(real a, real GM, real omega, real f_J2,
- bool geometricp = true);
-
- NormalGravity() : _a(-1) {}
-
-
-
-
- Math::real SurfaceGravity(real lat) const;
-
- Math::real Gravity(real lat, real h, real& gammay, real& gammaz)
- const;
-
- Math::real U(real X, real Y, real Z,
- real& gammaX, real& gammaY, real& gammaZ) const;
-
- Math::real V0(real X, real Y, real Z,
- real& GammaX, real& GammaY, real& GammaZ) const;
-
- Math::real Phi(real X, real Y, real& fX, real& fY) const;
-
-
-
-
- bool Init() const { return _a > 0; }
-
- Math::real EquatorialRadius() const
- { return Init() ? _a : Math::NaN(); }
-
- Math::real MassConstant() const
- { return Init() ? _GM : Math::NaN(); }
-
- Math::real DynamicalFormFactor(int n = 2) const
- { return Init() ? ( n == 2 ? _J2 : Jn(n)) : Math::NaN(); }
-
- Math::real AngularVelocity() const
- { return Init() ? _omega : Math::NaN(); }
-
- Math::real Flattening() const
- { return Init() ? _f : Math::NaN(); }
-
- Math::real EquatorialGravity() const
- { return Init() ? _gammae : Math::NaN(); }
-
- Math::real PolarGravity() const
- { return Init() ? _gammap : Math::NaN(); }
-
- Math::real GravityFlattening() const
- { return Init() ? _fstar : Math::NaN(); }
-
- Math::real SurfacePotential() const
- { return Init() ? _U0 : Math::NaN(); }
-
- const Geocentric& Earth() const { return _earth; }
-
- GEOGRAPHICLIB_DEPRECATED("Use EquatorialRadius()")
- Math::real MajorRadius() const { return EquatorialRadius(); }
-
-
- static const NormalGravity& WGS84();
-
- static const NormalGravity& GRS80();
-
- static Math::real J2ToFlattening(real a, real GM, real omega, real J2);
-
- static Math::real FlatteningToJ2(real a, real GM, real omega, real f);
- };
- }
- #endif
|