GeographicLib 2.1.2
MagneticCircle.cpp
Go to the documentation of this file.
1/**
2 * \file MagneticCircle.cpp
3 * \brief Implementation for GeographicLib::MagneticCircle class
4 *
5 * Copyright (c) Charles Karney (2011-2021) <charles@karney.com> and licensed
6 * under the MIT/X11 License. For more information, see
7 * https://geographiclib.sourceforge.io/
8 **********************************************************************/
9
11#include <fstream>
12#include <sstream>
14
15namespace GeographicLib {
16
17 using namespace std;
18
19 void MagneticCircle::FieldGeocentric(real slam, real clam,
20 real& BX, real& BY, real& BZ,
21 real& BXt, real& BYt, real& BZt) const {
22 real BXc = 0, BYc = 0, BZc = 0;
23 _circ0(slam, clam, BX, BY, BZ);
24 _circ1(slam, clam, BXt, BYt, BZt);
25 if (_constterm)
26 _circ2(slam, clam, BXc, BYc, BZc);
27 if (_interpolate) {
28 BXt = (BXt - BX) / _dt0;
29 BYt = (BYt - BY) / _dt0;
30 BZt = (BZt - BZ) / _dt0;
31 }
32 BX += _t1 * BXt + BXc;
33 BY += _t1 * BYt + BYc;
34 BZ += _t1 * BZt + BZc;
35
36 BXt *= - _a;
37 BYt *= - _a;
38 BZt *= - _a;
39
40 BX *= - _a;
41 BY *= - _a;
42 BZ *= - _a;
43 }
44
45 void MagneticCircle::FieldGeocentric(real lon,
46 real& BX, real& BY, real& BZ,
47 real& BXt, real& BYt, real& BZt) const {
48 real slam, clam;
49 Math::sincosd(lon, slam, clam);
50 FieldGeocentric(slam, clam, BX, BY, BZ, BXt, BYt, BZt);
51 }
52
53 void MagneticCircle::Field(real lon, bool diffp,
54 real& Bx, real& By, real& Bz,
55 real& Bxt, real& Byt, real& Bzt) const {
56 real slam, clam;
57 Math::sincosd(lon, slam, clam);
58 real M[Geocentric::dim2_];
59 Geocentric::Rotation(_sphi, _cphi, slam, clam, M);
60 real BX, BY, BZ, BXt, BYt, BZt; // Components in geocentric basis
61 FieldGeocentric(slam, clam, BX, BY, BZ, BXt, BYt, BZt);
62 if (diffp)
63 Geocentric::Unrotate(M, BXt, BYt, BZt, Bxt, Byt, Bzt);
64 Geocentric::Unrotate(M, BX, BY, BZ, Bx, By, Bz);
65 }
66
67} // namespace GeographicLib
Header for GeographicLib::Geocentric class.
GeographicLib::Math::real real
Definition: GeodSolve.cpp:31
Header for GeographicLib::MagneticCircle class.
static void sincosd(T x, T &sinx, T &cosx)
Definition: Math.cpp:106
Namespace for GeographicLib.
Definition: Accumulator.cpp:12