5#include <janus/janus.hpp>
13inline constexpr double B0 = 3.12e-5;
38template <
typename Scalar>
42 const Scalar x = r_ecef(0);
43 const Scalar y = r_ecef(1);
44 const Scalar z = r_ecef(2);
46 const Scalar r2 = x * x + y * y + z * z;
47 const Scalar r = janus::sqrt(r2);
48 const Scalar r5 = r2 * r2 * r;
51 const Scalar coeff = B0 * (R * R * R) / r5;
58 B(0) = 3.0 * coeff * x * z;
59 B(1) = 3.0 * coeff * y * z;
60 B(2) = coeff * (2.0 * z * z - x * x - y * y);
70template <
typename Scalar>
74 return janus::norm(B);
87template <
typename Scalar>
88Vec3<Scalar>
field_ned(
const Scalar &lat, [[maybe_unused]]
const Scalar &lon,
92 const Scalar r = R + alt;
95 const Scalar phi = lat;
99 const Scalar R_over_r_cubed = (R * R * R) / (r * r * r);
101 const Scalar sin_phi = janus::sin(phi);
102 const Scalar cos_phi = janus::cos(phi);
104 const Scalar B_r = -2.0 * B0 * R_over_r_cubed * sin_phi;
105 const Scalar B_theta = B0 * R_over_r_cubed * cos_phi;
113 B_ned(1) = Scalar(0.0);
127template <
typename Scalar>
129 const Scalar sin_lat = janus::sin(lat);
130 return B0 * janus::sqrt(1.0 + 3.0 * sin_lat * sin_lat);
142 const Scalar tan_lat = janus::tan(lat);
143 return janus::atan(2.0 * tan_lat);
constexpr double deg2rad
Degrees to radians conversion factor.
Definition Constants.hpp:156
constexpr double R_eq
Equatorial radius [m] (WGS84).
Definition Constants.hpp:16
Definition MagneticField.hpp:11
constexpr double pole_longitude
Magnetic pole longitude (West is negative) [rad].
Definition MagneticField.hpp:19
constexpr double B0
Reference magnetic field at equator surface [T] (~31.2 μT).
Definition MagneticField.hpp:13
constexpr double dipole_tilt
Magnetic dipole tilt angle from rotation axis [rad] (~11.5°).
Definition MagneticField.hpp:16
Definition MagneticField.hpp:9
Scalar field_magnitude(const Vec3< Scalar > &r_ecef, double B0=constants::B0, double R=vulcan::constants::earth::R_eq)
Magnetic field magnitude at given position.
Definition MagneticField.hpp:71
Scalar inclination(const Scalar &lat)
Magnetic inclination (dip angle) at given latitude.
Definition MagneticField.hpp:141
Vec3< Scalar > dipole_field_ecef(const Vec3< Scalar > &r_ecef, double B0=constants::B0, double R=vulcan::constants::earth::R_eq)
Centered dipole magnetic field in ECEF.
Definition MagneticField.hpp:39
Vec3< Scalar > field_ned(const Scalar &lat, const Scalar &lon, const Scalar &alt, double B0=constants::B0, double R=vulcan::constants::earth::R_eq)
Magnetic field in local NED frame at geodetic coordinates.
Definition MagneticField.hpp:88
Scalar surface_intensity(const Scalar &lat, double B0=constants::B0)
Total field intensity at surface for given latitude.
Definition MagneticField.hpp:128