205 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			205 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/**
 | 
						|
 * \file MagneticCircle.hpp
 | 
						|
 * \brief Header for GeographicLib::MagneticCircle class
 | 
						|
 *
 | 
						|
 * Copyright (c) Charles Karney (2011-2021) <charles@karney.com> and licensed
 | 
						|
 * under the MIT/X11 License.  For more information, see
 | 
						|
 * https://geographiclib.sourceforge.io/
 | 
						|
 **********************************************************************/
 | 
						|
 | 
						|
#if !defined(GEOGRAPHICLIB_MAGNETICCIRCLE_HPP)
 | 
						|
#define GEOGRAPHICLIB_MAGNETICCIRCLE_HPP 1
 | 
						|
 | 
						|
#include <vector>
 | 
						|
#include <GeographicLib/Constants.hpp>
 | 
						|
#include <GeographicLib/CircularEngine.hpp>
 | 
						|
 | 
						|
namespace GeographicLib {
 | 
						|
 | 
						|
  /**
 | 
						|
   * \brief Geomagnetic field on a circle of latitude
 | 
						|
   *
 | 
						|
   * Evaluate the earth's magnetic 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 MagneticModel::Circle to create a MagneticCircle object.  (The
 | 
						|
   * constructor for this class is private.)
 | 
						|
   *
 | 
						|
   * Example of use:
 | 
						|
   * \include example-MagneticCircle.cpp
 | 
						|
   *
 | 
						|
   * <a href="MagneticField.1.html">MagneticField</a> is a command-line utility
 | 
						|
   * providing access to the functionality of MagneticModel and MagneticCircle.
 | 
						|
   **********************************************************************/
 | 
						|
 | 
						|
  class GEOGRAPHICLIB_EXPORT MagneticCircle {
 | 
						|
  private:
 | 
						|
    typedef Math::real real;
 | 
						|
 | 
						|
    real _a, _f, _lat, _h, _t, _cphi, _sphi, _t1, _dt0;
 | 
						|
    bool _interpolate, _constterm;
 | 
						|
    CircularEngine _circ0, _circ1, _circ2;
 | 
						|
 | 
						|
    MagneticCircle(real a, real f, real lat, real h, real t,
 | 
						|
                   real cphi, real sphi, real t1, real dt0,
 | 
						|
                   bool interpolate,
 | 
						|
                   const CircularEngine& circ0, const CircularEngine& circ1)
 | 
						|
      : _a(a)
 | 
						|
      , _f(f)
 | 
						|
      , _lat(Math::LatFix(lat))
 | 
						|
      , _h(h)
 | 
						|
      , _t(t)
 | 
						|
      , _cphi(cphi)
 | 
						|
      , _sphi(sphi)
 | 
						|
      , _t1(t1)
 | 
						|
      , _dt0(dt0)
 | 
						|
      , _interpolate(interpolate)
 | 
						|
      , _constterm(false)
 | 
						|
      , _circ0(circ0)
 | 
						|
      , _circ1(circ1)
 | 
						|
    {}
 | 
						|
 | 
						|
    MagneticCircle(real a, real f, real lat, real h, real t,
 | 
						|
                   real cphi, real sphi, real t1, real dt0,
 | 
						|
                   bool interpolate,
 | 
						|
                   const CircularEngine& circ0, const CircularEngine& circ1,
 | 
						|
                   const CircularEngine& circ2)
 | 
						|
      : _a(a)
 | 
						|
      , _f(f)
 | 
						|
      , _lat(lat)
 | 
						|
      , _h(h)
 | 
						|
      , _t(t)
 | 
						|
      , _cphi(cphi)
 | 
						|
      , _sphi(sphi)
 | 
						|
      , _t1(t1)
 | 
						|
      , _dt0(dt0)
 | 
						|
      , _interpolate(interpolate)
 | 
						|
      , _constterm(true)
 | 
						|
      , _circ0(circ0)
 | 
						|
      , _circ1(circ1)
 | 
						|
      , _circ2(circ2)
 | 
						|
    {}
 | 
						|
 | 
						|
    void Field(real lon, bool diffp,
 | 
						|
               real& Bx, real& By, real& Bz,
 | 
						|
               real& Bxt, real& Byt, real& Bzt) const;
 | 
						|
 | 
						|
    void FieldGeocentric(real slam, real clam,
 | 
						|
                         real& BX, real& BY, real& BZ,
 | 
						|
                         real& BXt, real& BYt, real& BZt) const;
 | 
						|
 | 
						|
    friend class MagneticModel; // MagneticModel calls the private constructor
 | 
						|
 | 
						|
  public:
 | 
						|
 | 
						|
    /**
 | 
						|
     * A default constructor for the normal gravity.  This sets up an
 | 
						|
     * uninitialized object which can be later replaced by the
 | 
						|
     * MagneticModel::Circle.
 | 
						|
     **********************************************************************/
 | 
						|
    MagneticCircle() : _a(-1) {}
 | 
						|
 | 
						|
    /** \name Compute the magnetic field
 | 
						|
     **********************************************************************/
 | 
						|
    ///@{
 | 
						|
    /**
 | 
						|
     * Evaluate the components of the geomagnetic field at a particular
 | 
						|
     * longitude.
 | 
						|
     *
 | 
						|
     * @param[in] lon longitude of the point (degrees).
 | 
						|
     * @param[out] Bx the easterly component of the magnetic field (nanotesla).
 | 
						|
     * @param[out] By the northerly component of the magnetic field
 | 
						|
     *   (nanotesla).
 | 
						|
     * @param[out] Bz the vertical (up) component of the magnetic field
 | 
						|
     *   (nanotesla).
 | 
						|
     **********************************************************************/
 | 
						|
    void operator()(real lon, real& Bx, real& By, real& Bz) const {
 | 
						|
      real dummy;
 | 
						|
      Field(lon, false, Bx, By, Bz, dummy, dummy, dummy);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Evaluate the components of the geomagnetic field and their time
 | 
						|
     * derivatives at a particular longitude.
 | 
						|
     *
 | 
						|
     * @param[in] lon longitude of the point (degrees).
 | 
						|
     * @param[out] Bx the easterly component of the magnetic field (nanotesla).
 | 
						|
     * @param[out] By the northerly component of the magnetic field
 | 
						|
     *   (nanotesla).
 | 
						|
     * @param[out] Bz the vertical (up) component of the magnetic field
 | 
						|
     *   (nanotesla).
 | 
						|
     * @param[out] Bxt the rate of change of \e Bx (nT/yr).
 | 
						|
     * @param[out] Byt the rate of change of \e By (nT/yr).
 | 
						|
     * @param[out] Bzt the rate of change of \e Bz (nT/yr).
 | 
						|
     **********************************************************************/
 | 
						|
    void operator()(real lon, real& Bx, real& By, real& Bz,
 | 
						|
                    real& Bxt, real& Byt, real& Bzt) const {
 | 
						|
      Field(lon, true, Bx, By, Bz, Bxt, Byt, Bzt);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Evaluate the components of the geomagnetic field and their time
 | 
						|
     * derivatives at a particular longitude.
 | 
						|
     *
 | 
						|
     * @param[in] lon longitude of the point (degrees).
 | 
						|
     * @param[out] BX the \e X component of the magnetic field (nT).
 | 
						|
     * @param[out] BY the \e Y component of the magnetic field (nT).
 | 
						|
     * @param[out] BZ the \e Z component of the magnetic field (nT).
 | 
						|
     * @param[out] BXt the rate of change of \e BX (nT/yr).
 | 
						|
     * @param[out] BYt the rate of change of \e BY (nT/yr).
 | 
						|
     * @param[out] BZt the rate of change of \e BZ (nT/yr).
 | 
						|
     **********************************************************************/
 | 
						|
    void FieldGeocentric(real lon, real& BX, real& BY, real& BZ,
 | 
						|
                         real& BXt, real& BYt, real& BZt) const;
 | 
						|
    ///@}
 | 
						|
 | 
						|
    /** \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 MagneticModel 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 MagneticModel 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 the time (fractional years).
 | 
						|
     **********************************************************************/
 | 
						|
    Math::real Time() const
 | 
						|
    { return Init() ? _t : Math::NaN(); }
 | 
						|
 | 
						|
    /**
 | 
						|
     * \deprecated An old name for EquatorialRadius().
 | 
						|
     **********************************************************************/
 | 
						|
    GEOGRAPHICLIB_DEPRECATED("Use EquatorialRadius()")
 | 
						|
    Math::real MajorRadius() const { return EquatorialRadius(); }
 | 
						|
    ///@}
 | 
						|
  };
 | 
						|
 | 
						|
} // namespace GeographicLib
 | 
						|
 | 
						|
#endif  // GEOGRAPHICLIB_MAGNETICCIRCLE_HPP
 |