123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287 |
- /**
- * \file GravityCircle.hpp
- * \brief Header for GeographicLib::GravityCircle class
- *
- * Copyright (c) Charles Karney (2011-2020) <charles@karney.com> and licensed
- * under the MIT/X11 License. For more information, see
- * https://geographiclib.sourceforge.io/
- **********************************************************************/
- #if !defined(GEOGRAPHICLIB_GRAVITYCIRCLE_HPP)
- #define GEOGRAPHICLIB_GRAVITYCIRCLE_HPP 1
- #include <vector>
- #include <GeographicLib/Constants.hpp>
- #include <GeographicLib/CircularEngine.hpp>
- #include <GeographicLib/GravityModel.hpp>
- namespace GeographicLib {
- /**
- * \brief Gravity on a circle of latitude
- *
- * Evaluate the earth's gravity field on a circle of constant height and
- * latitude. This uses a CircularEngine to pre-evaluate the inner sum of the
- * spherical harmonic sum, allowing the values of the field at several
- * different longitudes to be evaluated rapidly.
- *
- * Use GravityModel::Circle to create a GravityCircle object. (The
- * constructor for this class is private.)
- *
- * See \ref gravityparallel for an example of using GravityCircle (together
- * with OpenMP) to speed up the computation of geoid heights.
- *
- * Example of use:
- * \include example-GravityCircle.cpp
- *
- * <a href="Gravity.1.html">Gravity</a> is a command-line utility providing
- * access to the functionality of GravityModel and GravityCircle.
- **********************************************************************/
- class GEOGRAPHICLIB_EXPORT GravityCircle {
- private:
- typedef Math::real real;
- enum mask {
- NONE = GravityModel::NONE,
- GRAVITY = GravityModel::GRAVITY,
- DISTURBANCE = GravityModel::DISTURBANCE,
- DISTURBING_POTENTIAL = GravityModel::DISTURBING_POTENTIAL,
- GEOID_HEIGHT = GravityModel::GEOID_HEIGHT,
- SPHERICAL_ANOMALY = GravityModel::SPHERICAL_ANOMALY,
- ALL = GravityModel::ALL,
- };
- unsigned _caps;
- real _a, _f, _lat, _h, _Z, _Px, _invR, _cpsi, _spsi,
- _cphi, _sphi, _amodel, _GMmodel, _dzonal0,
- _corrmult, _gamma0, _gamma, _frot;
- CircularEngine _gravitational, _disturbing, _correction;
- GravityCircle(mask caps, real a, real f, real lat, real h,
- real Z, real P, real cphi, real sphi,
- real amodel, real GMmodel,
- real dzonal0, real corrmult,
- real gamma0, real gamma, real frot,
- const CircularEngine& gravitational,
- const CircularEngine& disturbing,
- const CircularEngine& correction);
- friend class GravityModel; // GravityModel calls the private constructor
- Math::real W(real slam, real clam,
- real& gX, real& gY, real& gZ) const;
- Math::real V(real slam, real clam,
- real& gX, real& gY, real& gZ) const;
- Math::real InternalT(real slam, real clam,
- real& deltaX, real& deltaY, real& deltaZ,
- bool gradp, bool correct) const;
- public:
- /**
- * A default constructor for the normal gravity. This sets up an
- * uninitialized object which can be later replaced by the
- * GravityModel::Circle.
- **********************************************************************/
- GravityCircle() : _a(-1) {}
- /** \name Compute the gravitational field
- **********************************************************************/
- ///@{
- /**
- * Evaluate the gravity.
- *
- * @param[in] lon the geographic longitude (degrees).
- * @param[out] gx the easterly component of the acceleration
- * (m s<sup>−2</sup>).
- * @param[out] gy the northerly component of the acceleration
- * (m s<sup>−2</sup>).
- * @param[out] gz the upward component of the acceleration
- * (m s<sup>−2</sup>); this is usually negative.
- * @return \e W the sum of the gravitational and centrifugal potentials
- * (m<sup>2</sup> s<sup>−2</sup>).
- *
- * The function includes the effects of the earth's rotation.
- **********************************************************************/
- Math::real Gravity(real lon, real& gx, real& gy, real& gz) const;
- /**
- * Evaluate the gravity disturbance vector.
- *
- * @param[in] lon the geographic longitude (degrees).
- * @param[out] deltax the easterly component of the disturbance vector
- * (m s<sup>−2</sup>).
- * @param[out] deltay the northerly component of the disturbance vector
- * (m s<sup>−2</sup>).
- * @param[out] deltaz the upward component of the disturbance vector
- * (m s<sup>−2</sup>).
- * @return \e T the corresponding disturbing potential
- * (m<sup>2</sup> s<sup>−2</sup>).
- **********************************************************************/
- Math::real Disturbance(real lon, real& deltax, real& deltay, real& deltaz)
- const;
- /**
- * Evaluate the geoid height.
- *
- * @param[in] lon the geographic longitude (degrees).
- * @return \e N the height of the geoid above the reference ellipsoid
- * (meters).
- *
- * Some approximations are made in computing the geoid height so that the
- * results of the NGA codes are reproduced accurately. Details are given
- * in \ref gravitygeoid.
- **********************************************************************/
- Math::real GeoidHeight(real lon) const;
- /**
- * Evaluate the components of the gravity anomaly vector using the
- * spherical approximation.
- *
- * @param[in] lon the geographic longitude (degrees).
- * @param[out] Dg01 the gravity anomaly (m s<sup>−2</sup>).
- * @param[out] xi the northerly component of the deflection of the vertical
- * (degrees).
- * @param[out] eta the easterly component of the deflection of the vertical
- * (degrees).
- *
- * The spherical approximation (see Heiskanen and Moritz, Sec 2-14) is used
- * so that the results of the NGA codes are reproduced accurately.
- * approximations used here. Details are given in \ref gravitygeoid.
- **********************************************************************/
- void SphericalAnomaly(real lon, real& Dg01, real& xi, real& eta)
- const;
- /**
- * Evaluate the components of the acceleration due to gravity and the
- * centrifugal acceleration in geocentric coordinates.
- *
- * @param[in] lon the geographic longitude (degrees).
- * @param[out] gX the \e X component of the acceleration
- * (m s<sup>−2</sup>).
- * @param[out] gY the \e Y component of the acceleration
- * (m s<sup>−2</sup>).
- * @param[out] gZ the \e Z component of the acceleration
- * (m s<sup>−2</sup>).
- * @return \e W = \e V + Φ the sum of the gravitational and
- * centrifugal potentials (m<sup>2</sup> s<sup>−2</sup>).
- **********************************************************************/
- Math::real W(real lon, real& gX, real& gY, real& gZ) const {
- real slam, clam;
- Math::sincosd(lon, slam, clam);
- return W(slam, clam, gX, gY, gZ);
- }
- /**
- * Evaluate the components of the acceleration due to gravity in geocentric
- * coordinates.
- *
- * @param[in] lon the geographic longitude (degrees).
- * @param[out] GX the \e X component of the acceleration
- * (m s<sup>−2</sup>).
- * @param[out] GY the \e Y component of the acceleration
- * (m s<sup>−2</sup>).
- * @param[out] GZ the \e Z component of the acceleration
- * (m s<sup>−2</sup>).
- * @return \e V = \e W - Φ the gravitational potential
- * (m<sup>2</sup> s<sup>−2</sup>).
- **********************************************************************/
- Math::real V(real lon, real& GX, real& GY, real& GZ) const {
- real slam, clam;
- Math::sincosd(lon, slam, clam);
- return V(slam, clam, GX, GY, GZ);
- }
- /**
- * Evaluate the components of the gravity disturbance in geocentric
- * coordinates.
- *
- * @param[in] lon the geographic longitude (degrees).
- * @param[out] deltaX the \e X component of the gravity disturbance
- * (m s<sup>−2</sup>).
- * @param[out] deltaY the \e Y component of the gravity disturbance
- * (m s<sup>−2</sup>).
- * @param[out] deltaZ the \e Z component of the gravity disturbance
- * (m s<sup>−2</sup>).
- * @return \e T = \e W - \e U the disturbing potential (also called the
- * anomalous potential) (m<sup>2</sup> s<sup>−2</sup>).
- **********************************************************************/
- Math::real T(real lon, real& deltaX, real& deltaY, real& deltaZ)
- const {
- real slam, clam;
- Math::sincosd(lon, slam, clam);
- return InternalT(slam, clam, deltaX, deltaY, deltaZ, true, true);
- }
- /**
- * Evaluate disturbing potential in geocentric coordinates.
- *
- * @param[in] lon the geographic longitude (degrees).
- * @return \e T = \e W - \e U the disturbing potential (also called the
- * anomalous potential) (m<sup>2</sup> s<sup>−2</sup>).
- **********************************************************************/
- Math::real T(real lon) const {
- real slam, clam, dummy;
- Math::sincosd(lon, slam, clam);
- return InternalT(slam, clam, dummy, dummy, dummy, false, true);
- }
- ///@}
- /** \name Inspector functions
- **********************************************************************/
- ///@{
- /**
- * @return true if the object has been initialized.
- **********************************************************************/
- bool Init() const { return _a > 0; }
- /**
- * @return \e a the equatorial radius of the ellipsoid (meters). This is
- * the value inherited from the GravityModel object used in the
- * constructor.
- **********************************************************************/
- Math::real EquatorialRadius() const
- { return Init() ? _a : Math::NaN(); }
- /**
- * @return \e f the flattening of the ellipsoid. This is the value
- * inherited from the GravityModel object used in the constructor.
- **********************************************************************/
- Math::real Flattening() const
- { return Init() ? _f : Math::NaN(); }
- /**
- * @return the latitude of the circle (degrees).
- **********************************************************************/
- Math::real Latitude() const
- { return Init() ? _lat : Math::NaN(); }
- /**
- * @return the height of the circle (meters).
- **********************************************************************/
- Math::real Height() const
- { return Init() ? _h : Math::NaN(); }
- /**
- * @return \e caps the computational capabilities that this object was
- * constructed with.
- **********************************************************************/
- unsigned Capabilities() const { return _caps; }
- /**
- * @param[in] testcaps a set of bitor'ed GravityModel::mask values.
- * @return true if the GravityCircle object has all these capabilities.
- **********************************************************************/
- bool Capabilities(unsigned testcaps) const {
- return (_caps & testcaps) == testcaps;
- }
- /**
- * \deprecated An old name for EquatorialRadius().
- **********************************************************************/
- GEOGRAPHICLIB_DEPRECATED("Use EquatorialRadius()")
- Math::real MajorRadius() const { return EquatorialRadius(); }
- ///@}
- };
- } // namespace GeographicLib
- #endif // GEOGRAPHICLIB_GRAVITYCIRCLE_HPP
|