gps_pvt 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.rspec +3 -0
- data/CHANGELOG.md +5 -0
- data/CODE_OF_CONDUCT.md +84 -0
- data/Gemfile +10 -0
- data/README.md +86 -0
- data/Rakefile +86 -0
- data/bin/console +15 -0
- data/bin/setup +8 -0
- data/ext/gps_pvt/Coordinate/Coordinate_wrap.cxx +6613 -0
- data/ext/gps_pvt/GPS/GPS_wrap.cxx +16019 -0
- data/ext/gps_pvt/SylphideMath/SylphideMath_wrap.cxx +21050 -0
- data/ext/gps_pvt/extconf.rb +70 -0
- data/ext/ninja-scan-light/tool/navigation/EGM.h +2971 -0
- data/ext/ninja-scan-light/tool/navigation/GPS.h +2432 -0
- data/ext/ninja-scan-light/tool/navigation/GPS_Solver.h +479 -0
- data/ext/ninja-scan-light/tool/navigation/GPS_Solver_Base.h +1081 -0
- data/ext/ninja-scan-light/tool/navigation/GPS_Solver_MultiFrequency.h +199 -0
- data/ext/ninja-scan-light/tool/navigation/GPS_Solver_RAIM.h +210 -0
- data/ext/ninja-scan-light/tool/navigation/MagneticField.h +928 -0
- data/ext/ninja-scan-light/tool/navigation/NTCM.h +211 -0
- data/ext/ninja-scan-light/tool/navigation/RINEX.h +1781 -0
- data/ext/ninja-scan-light/tool/navigation/WGS84.h +186 -0
- data/ext/ninja-scan-light/tool/navigation/coordinate.h +406 -0
- data/ext/ninja-scan-light/tool/param/bit_array.h +145 -0
- data/ext/ninja-scan-light/tool/param/complex.h +558 -0
- data/ext/ninja-scan-light/tool/param/matrix.h +4049 -0
- data/ext/ninja-scan-light/tool/param/matrix_fixed.h +665 -0
- data/ext/ninja-scan-light/tool/param/matrix_special.h +562 -0
- data/ext/ninja-scan-light/tool/param/quaternion.h +765 -0
- data/ext/ninja-scan-light/tool/param/vector3.h +651 -0
- data/ext/ninja-scan-light/tool/swig/Coordinate.i +177 -0
- data/ext/ninja-scan-light/tool/swig/GPS.i +1102 -0
- data/ext/ninja-scan-light/tool/swig/SylphideMath.i +1234 -0
- data/ext/ninja-scan-light/tool/swig/extconf.rb +5 -0
- data/ext/ninja-scan-light/tool/swig/makefile +53 -0
- data/ext/ninja-scan-light/tool/swig/spec/GPS_spec.rb +417 -0
- data/ext/ninja-scan-light/tool/swig/spec/SylphideMath_spec.rb +489 -0
- data/gps_pvt.gemspec +57 -0
- data/lib/gps_pvt/receiver.rb +375 -0
- data/lib/gps_pvt/ubx.rb +148 -0
- data/lib/gps_pvt/version.rb +5 -0
- data/lib/gps_pvt.rb +9 -0
- data/sig/gps_pvt.rbs +4 -0
- metadata +117 -0
@@ -0,0 +1,928 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright (c) 2015, M.Naruoka (fenrir)
|
3
|
+
* All rights reserved.
|
4
|
+
*
|
5
|
+
* Redistribution and use in source and binary forms, with or without modification,
|
6
|
+
* are permitted provided that the following conditions are met:
|
7
|
+
*
|
8
|
+
* - Redistributions of source code must retain the above copyright notice,
|
9
|
+
* this list of conditions and the following disclaimer.
|
10
|
+
* - Redistributions in binary form must reproduce the above copyright notice,
|
11
|
+
* this list of conditions and the following disclaimer in the documentation
|
12
|
+
* and/or other materials provided with the distribution.
|
13
|
+
* - Neither the name of the naruoka.org nor the names of its contributors
|
14
|
+
* may be used to endorse or promote products derived from this software
|
15
|
+
* without specific prior written permission.
|
16
|
+
*
|
17
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
18
|
+
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
19
|
+
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
20
|
+
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS
|
21
|
+
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
|
22
|
+
* OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
23
|
+
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
24
|
+
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
25
|
+
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
26
|
+
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
27
|
+
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
28
|
+
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
29
|
+
*
|
30
|
+
*/
|
31
|
+
|
32
|
+
#ifndef __MAGNETIC_FIELD_H__
|
33
|
+
#define __MAGNETIC_FIELD_H__
|
34
|
+
|
35
|
+
#define _USE_MATH_DEFINES
|
36
|
+
#include <cmath>
|
37
|
+
|
38
|
+
#include "WGS84.h"
|
39
|
+
|
40
|
+
template <class FloatT>
|
41
|
+
class MagneticFieldGeneric {
|
42
|
+
public:
|
43
|
+
struct model_t {
|
44
|
+
const char *name;
|
45
|
+
FloatT year;
|
46
|
+
int dof;
|
47
|
+
FloatT coef[256];
|
48
|
+
};
|
49
|
+
|
50
|
+
static void model_inter_extra_polation(
|
51
|
+
model_t &model_new,
|
52
|
+
const model_t &model_early, const model_t &model_late){
|
53
|
+
FloatT factor((model_new.year - model_early.year)
|
54
|
+
/ (model_late.year - model_early.year));
|
55
|
+
|
56
|
+
model_new.name = "(generated)";
|
57
|
+
int coef_common;
|
58
|
+
|
59
|
+
if(model_new.dof > 0){ // fixed DOF
|
60
|
+
coef_common = model_new.dof * (model_new.dof + 2);
|
61
|
+
}else{ // automatically determine DOF
|
62
|
+
if(model_early.dof >= model_late.dof){
|
63
|
+
coef_common = model_late.dof * (model_late.dof + 2);
|
64
|
+
model_new.dof = model_early.dof;
|
65
|
+
|
66
|
+
for(int i(coef_common); i < model_early.dof * (model_early.dof + 2); i--){
|
67
|
+
model_new.coef[i] = model_early.coef[i] * (1.0 - factor);
|
68
|
+
}
|
69
|
+
}else{
|
70
|
+
coef_common = model_early.dof * (model_early.dof + 2);
|
71
|
+
model_new.dof = model_late.dof;
|
72
|
+
|
73
|
+
for(int i(coef_common); i < model_late.dof * (model_late.dof + 2); i--){
|
74
|
+
model_new.coef[i] = model_late.coef[i] * factor;
|
75
|
+
}
|
76
|
+
}
|
77
|
+
}
|
78
|
+
for(int i(0); i < coef_common; i++){
|
79
|
+
model_new.coef[i] = model_early.coef[i]
|
80
|
+
+ factor * (model_late.coef[i] - model_early.coef[i]);
|
81
|
+
}
|
82
|
+
}
|
83
|
+
static model_t model_inter_extra_polation(
|
84
|
+
const FloatT &year,
|
85
|
+
const model_t &model_early, const model_t &model_late,
|
86
|
+
const int &dof = 0){
|
87
|
+
model_t model_new;
|
88
|
+
model_new.year = year;
|
89
|
+
model_new.dof = dof; // default(0): automatically determine DOF
|
90
|
+
model_inter_extra_polation(model_new, model_early, model_late);
|
91
|
+
return model_new;
|
92
|
+
}
|
93
|
+
|
94
|
+
static void make_model(
|
95
|
+
model_t &model_new, const model_t *models[], const unsigned int &models_size){
|
96
|
+
if(models_size < 1){
|
97
|
+
return;
|
98
|
+
}else if(models_size == 1){
|
99
|
+
model_new = *models[0];
|
100
|
+
return;
|
101
|
+
}
|
102
|
+
const model_t *a(models[0]), *b(models[1]);
|
103
|
+
FloatT a_dist(std::abs(model_new.year - a->year)), b_dist(std::abs(model_new.year - b->year));
|
104
|
+
for(unsigned int i(2); i < models_size; ++i){
|
105
|
+
FloatT dist(std::abs(model_new.year - models[i]->year));
|
106
|
+
if(dist < a_dist){
|
107
|
+
if(a_dist < b_dist){
|
108
|
+
b = models[i];
|
109
|
+
b_dist = dist;
|
110
|
+
}else{
|
111
|
+
a = models[i];
|
112
|
+
a_dist = dist;
|
113
|
+
}
|
114
|
+
}else if(dist < b_dist){
|
115
|
+
b = models[i];
|
116
|
+
b_dist = dist;
|
117
|
+
}
|
118
|
+
}
|
119
|
+
model_inter_extra_polation(model_new, *a, *b);
|
120
|
+
}
|
121
|
+
static model_t make_model(
|
122
|
+
const FloatT &year,
|
123
|
+
const model_t *models[], const unsigned int &models_size,
|
124
|
+
const int &dof = 0){
|
125
|
+
model_t res;
|
126
|
+
res.year = year;
|
127
|
+
res.dof = dof; // default(0): automatically determine DOF
|
128
|
+
make_model(res, models, models_size);
|
129
|
+
return res;
|
130
|
+
}
|
131
|
+
|
132
|
+
struct field_components_res_t {FloatT north, east, down;};
|
133
|
+
protected:
|
134
|
+
static field_components_res_t field_components_geocentric(
|
135
|
+
const model_t &model,
|
136
|
+
const FloatT &sin_geocentric_latitude, const FloatT &cos_geocentric_latitude,
|
137
|
+
const FloatT &longitude_rad,
|
138
|
+
const FloatT &radius_meter){
|
139
|
+
using std::cos;
|
140
|
+
using std::sin;
|
141
|
+
using std::pow;
|
142
|
+
using std::sqrt;
|
143
|
+
field_components_res_t res;
|
144
|
+
|
145
|
+
// @see http://mooring.ucsd.edu/software/matlab/mfiles/toolbox/geo/IGRF/geomag60.c
|
146
|
+
|
147
|
+
const FloatT slat(sin_geocentric_latitude);
|
148
|
+
const FloatT clat(cos_geocentric_latitude);
|
149
|
+
|
150
|
+
FloatT sl[13] = {sin(longitude_rad)};
|
151
|
+
FloatT cl[13] = {cos(longitude_rad)};
|
152
|
+
|
153
|
+
res.north = res.east = res.down = 0;
|
154
|
+
|
155
|
+
FloatT aa, bb, cc, rr;
|
156
|
+
|
157
|
+
aa = sqrt(3.0);
|
158
|
+
FloatT p[118] = {
|
159
|
+
2.0 * slat,
|
160
|
+
2.0 * clat,
|
161
|
+
4.5 * slat * slat - 1.5,
|
162
|
+
3.0 * aa * clat * slat};
|
163
|
+
FloatT q[118] = {
|
164
|
+
-clat,
|
165
|
+
slat,
|
166
|
+
-3.0 * clat * slat,
|
167
|
+
aa * (slat * slat - clat * clat)};
|
168
|
+
|
169
|
+
for(int k(0), l(0), m(0), n(-1); k < ((model.dof * (model.dof + 3)) / 2); k++, m++){
|
170
|
+
if(m > n){
|
171
|
+
m = -1;
|
172
|
+
n++;
|
173
|
+
static const FloatT earths_radius(6371.2E3);
|
174
|
+
rr = pow(earths_radius / radius_meter, n + 3);
|
175
|
+
}
|
176
|
+
FloatT fm(m + 1), fn(n + 1);
|
177
|
+
if (k > 3){
|
178
|
+
if (m == n){
|
179
|
+
aa = sqrt(1.0 - 0.5 / fm);
|
180
|
+
int j(k - n - 2);
|
181
|
+
p[k] = (1.0 + 1.0 / fm) * aa * clat * p[j];
|
182
|
+
q[k] = aa * (clat * q[j] + slat/fm * p[j]);
|
183
|
+
sl[m] = sl[m-1] * cl[0] + cl[m-1] * sl[0];
|
184
|
+
cl[m] = cl[m-1] * cl[0] - sl[m-1] * sl[0];
|
185
|
+
}else{
|
186
|
+
aa = sqrt(fn * fn - fm * fm);
|
187
|
+
bb = sqrt(((fn - 1.0) * (fn - 1.0)) - (fm * fm)) / aa;
|
188
|
+
cc = (2.0 * fn - 1.0) / aa;
|
189
|
+
int i(k - n - 1), j(k - 2 * n - 1);
|
190
|
+
p[k] = (fn + 1.0) * (cc * slat / fn * p[i] - bb / (fn - 1.0) * p[j]);
|
191
|
+
q[k] = cc * (slat * q[i] - clat / fn * p[i]) - bb * q[j];
|
192
|
+
}
|
193
|
+
}
|
194
|
+
aa = rr * model.coef[l];
|
195
|
+
|
196
|
+
if(m < 0){
|
197
|
+
res.north += aa * q[k];
|
198
|
+
res.down -= aa * p[k];
|
199
|
+
l++;
|
200
|
+
}else{
|
201
|
+
bb = rr * model.coef[l + 1];
|
202
|
+
cc = aa * cl[m] + bb * sl[m];
|
203
|
+
res.north += cc * q[k];
|
204
|
+
res.down -= cc * p[k];
|
205
|
+
if (clat > 0){
|
206
|
+
res.east += (aa * sl[m] - bb * cl[m]) * fm * p[k]/((fn + 1.0) * clat);
|
207
|
+
}else{
|
208
|
+
res.east += (aa * sl[m] - bb * cl[m]) * q[k] * slat;
|
209
|
+
}
|
210
|
+
l += 2;
|
211
|
+
}
|
212
|
+
}
|
213
|
+
|
214
|
+
return res;
|
215
|
+
}
|
216
|
+
|
217
|
+
public:
|
218
|
+
static field_components_res_t field_components_geocentric(
|
219
|
+
const model_t &model,
|
220
|
+
const FloatT &geocentric_latitude,
|
221
|
+
const FloatT &longitude_rad,
|
222
|
+
const FloatT &radius_meter = 6371.2E3){
|
223
|
+
|
224
|
+
return field_components_geocentric(model,
|
225
|
+
std::sin(geocentric_latitude), std::cos(geocentric_latitude),
|
226
|
+
longitude_rad,
|
227
|
+
radius_meter);
|
228
|
+
}
|
229
|
+
|
230
|
+
static field_components_res_t field_components(
|
231
|
+
const model_t &model,
|
232
|
+
const FloatT &latitude_rad, const FloatT &longitude_rad,
|
233
|
+
const FloatT &height_meter){
|
234
|
+
using std::cos;
|
235
|
+
using std::sin;
|
236
|
+
using std::pow;
|
237
|
+
using std::sqrt;
|
238
|
+
|
239
|
+
FloatT slat(sin(latitude_rad)), clat(cos(latitude_rad));
|
240
|
+
FloatT sd, cd, r;
|
241
|
+
|
242
|
+
{
|
243
|
+
// Correction of latitude
|
244
|
+
FloatT latitude_deg(latitude_rad / M_PI * 180);
|
245
|
+
if((90.0 - latitude_deg) < 1E-3){
|
246
|
+
clat = cos((90.0 - 1E-3) / 180 * M_PI); // 300 ft. from North pole
|
247
|
+
}else if((90.0 + latitude_deg) < 1E-3){
|
248
|
+
clat = cos((-90.0 + 1E-3) / 180 * M_PI); // 300 ft. from South pole
|
249
|
+
}
|
250
|
+
}
|
251
|
+
|
252
|
+
{
|
253
|
+
// Convert geographic lat/lng(�n���ܓx�o�x) to geocentric lat/lng(�n�S�ܓx�o�x)
|
254
|
+
FloatT aa, bb, cc, dd;
|
255
|
+
static const FloatT a2(40680631.59E6); /* WGS84, a*a (m^2) */
|
256
|
+
static const FloatT b2(40408299.98E6); /* WGS84, b*b (m^2) */
|
257
|
+
aa = a2 * clat * clat;
|
258
|
+
bb = b2 * slat * slat;
|
259
|
+
cc = aa + bb;
|
260
|
+
dd = sqrt(cc);
|
261
|
+
r = sqrt(height_meter * (height_meter + 2.0 * dd) + (a2 * aa + b2 * bb) / cc);
|
262
|
+
cd = (height_meter + dd) / r;
|
263
|
+
sd = (a2 - b2) / dd * slat * clat / r;
|
264
|
+
}
|
265
|
+
|
266
|
+
field_components_res_t res(field_components_geocentric(
|
267
|
+
model,
|
268
|
+
slat * cd - clat * sd, clat * cd + slat * sd,
|
269
|
+
longitude_rad, r));
|
270
|
+
|
271
|
+
{ // coordinate transform
|
272
|
+
FloatT _north(res.north);
|
273
|
+
res.north = _north * cd + res.down * sd;
|
274
|
+
res.down = res.down * cd - _north * sd;
|
275
|
+
}
|
276
|
+
|
277
|
+
return res;
|
278
|
+
}
|
279
|
+
|
280
|
+
struct latlng_t {
|
281
|
+
FloatT latitude, longitude;
|
282
|
+
};
|
283
|
+
/**
|
284
|
+
* Calculate geomagnetic latitude and longitude
|
285
|
+
*
|
286
|
+
* @see "Magnetic Coordinate Systems" DOI 10.1007/s11214-016-0275-y
|
287
|
+
*/
|
288
|
+
static latlng_t geomagnetic_latlng(
|
289
|
+
const model_t &model,
|
290
|
+
const FloatT &geocentric_latitude, const FloatT &longitude){
|
291
|
+
const FloatT &g10(model.coef[0]), &g11(model.coef[1]), &h11(model.coef[2]);
|
292
|
+
FloatT m[] = {g11, h11, g10}; // Eq.(11)
|
293
|
+
FloatT b0(-std::sqrt(std::pow(m[0], 2) + std::pow(m[1], 2) + std::pow(m[2], 2))); // Eq.(12)
|
294
|
+
FloatT z_cd[] = {m[0] / b0, m[1] / b0, m[2] / b0}; // Eq.(16)
|
295
|
+
FloatT y_cd_denom(-std::sqrt((h11 * h11) + (g11 * g11)));
|
296
|
+
FloatT y_cd[] = {-h11 / y_cd_denom, g11 / y_cd_denom, 0}; /* = [0,0,1] * z_cd */
|
297
|
+
FloatT x_cd[] = { /* y_cd * z_cd */
|
298
|
+
y_cd[1] * z_cd[2] - y_cd[2] * z_cd[1],
|
299
|
+
y_cd[2] * z_cd[0] - y_cd[0] * z_cd[2],
|
300
|
+
y_cd[0] * z_cd[1] - y_cd[1] * z_cd[0],
|
301
|
+
};
|
302
|
+
FloatT
|
303
|
+
clat(std::cos(geocentric_latitude)), slat(std::sin(geocentric_latitude)),
|
304
|
+
clng(std::cos(longitude)), slng(std::sin(longitude));
|
305
|
+
FloatT vec_geoc[] = {clat * clng, clat * slng, slat}; // Eq.(13) Theta_N = (pi - lat)
|
306
|
+
FloatT vec_geom[] = {
|
307
|
+
x_cd[0] * vec_geoc[0] + x_cd[1] * vec_geoc[1] + x_cd[2] * vec_geoc[2],
|
308
|
+
y_cd[0] * vec_geoc[0] + y_cd[1] * vec_geoc[1] + y_cd[2] * vec_geoc[2],
|
309
|
+
z_cd[0] * vec_geoc[0] + z_cd[1] * vec_geoc[1] + z_cd[2] * vec_geoc[2],
|
310
|
+
};
|
311
|
+
latlng_t res = {
|
312
|
+
std::asin(vec_geom[2]),
|
313
|
+
std::atan2(vec_geom[1], vec_geom[0])
|
314
|
+
};
|
315
|
+
return res;
|
316
|
+
}
|
317
|
+
};
|
318
|
+
|
319
|
+
typedef MagneticFieldGeneric<double> MagneticField;
|
320
|
+
|
321
|
+
template <class FloatT, template <class> class Binder>
|
322
|
+
struct MagneticFieldGeneric2 : public MagneticFieldGeneric<FloatT> {
|
323
|
+
static typename MagneticFieldGeneric<FloatT>::model_t get_model(
|
324
|
+
const FloatT &year, const int &dof = 0){
|
325
|
+
return MagneticFieldGeneric<FloatT>::make_model(
|
326
|
+
year,
|
327
|
+
Binder<FloatT>::models,
|
328
|
+
#if defined(__GNUC__)
|
329
|
+
sizeof(Binder<FloatT>::models) / sizeof(Binder<FloatT>::models[0]),
|
330
|
+
#else
|
331
|
+
Binder<FloatT>::models_num,
|
332
|
+
#endif
|
333
|
+
dof);
|
334
|
+
}
|
335
|
+
static typename MagneticFieldGeneric<FloatT>::latlng_t geomagnetic_latlng(
|
336
|
+
const FloatT &year,
|
337
|
+
const FloatT &geocentric_latitude, const FloatT &longitude){
|
338
|
+
return MagneticFieldGeneric<FloatT>::geomagnetic_latlng(
|
339
|
+
get_model(year, 1),
|
340
|
+
geocentric_latitude, longitude);
|
341
|
+
}
|
342
|
+
};
|
343
|
+
|
344
|
+
/* IGRF11 is the eleventh generation standard main field model adopted
|
345
|
+
* by the International Association of Geomagnetism and Aeronomy (IAGA).
|
346
|
+
* This is a degree and order 10 model from 1900 to 1995 and a degree and
|
347
|
+
* order 13 model from 2000 to 2015, providing estimates of the main field
|
348
|
+
* for dates between January 1, 1900 and January 1, 2015. For more information
|
349
|
+
* on the IGRF and IAGA, visit the IAGA Working Group V-MOD Web site at:
|
350
|
+
* http://www.ngdc.noaa.gov/IAGA/vmod/
|
351
|
+
*/
|
352
|
+
|
353
|
+
template <class FloatT>
|
354
|
+
struct IGRF11Preset {
|
355
|
+
static const typename MagneticFieldGeneric<FloatT>::model_t DGRF2000;
|
356
|
+
static const typename MagneticFieldGeneric<FloatT>::model_t DGRF2005;
|
357
|
+
static const typename MagneticFieldGeneric<FloatT>::model_t DGRF45;
|
358
|
+
static const typename MagneticFieldGeneric<FloatT>::model_t DGRF50;
|
359
|
+
static const typename MagneticFieldGeneric<FloatT>::model_t DGRF55;
|
360
|
+
static const typename MagneticFieldGeneric<FloatT>::model_t DGRF60;
|
361
|
+
static const typename MagneticFieldGeneric<FloatT>::model_t DGRF65;
|
362
|
+
static const typename MagneticFieldGeneric<FloatT>::model_t DGRF70;
|
363
|
+
static const typename MagneticFieldGeneric<FloatT>::model_t DGRF75;
|
364
|
+
static const typename MagneticFieldGeneric<FloatT>::model_t DGRF80;
|
365
|
+
static const typename MagneticFieldGeneric<FloatT>::model_t DGRF85;
|
366
|
+
static const typename MagneticFieldGeneric<FloatT>::model_t DGRF90;
|
367
|
+
static const typename MagneticFieldGeneric<FloatT>::model_t DGRF95;
|
368
|
+
static const typename MagneticFieldGeneric<FloatT>::model_t IGRF00;
|
369
|
+
static const typename MagneticFieldGeneric<FloatT>::model_t IGRF05;
|
370
|
+
static const typename MagneticFieldGeneric<FloatT>::model_t IGRF10;
|
371
|
+
static const typename MagneticFieldGeneric<FloatT>::model_t IGRF15;
|
372
|
+
static const typename MagneticFieldGeneric<FloatT>::model_t IGRF20;
|
373
|
+
static const typename MagneticFieldGeneric<FloatT>::model_t IGRF2010;
|
374
|
+
static const typename MagneticFieldGeneric<FloatT>::model_t IGRF25;
|
375
|
+
static const typename MagneticFieldGeneric<FloatT>::model_t IGRF30;
|
376
|
+
static const typename MagneticFieldGeneric<FloatT>::model_t IGRF35;
|
377
|
+
static const typename MagneticFieldGeneric<FloatT>::model_t IGRF40;
|
378
|
+
};
|
379
|
+
|
380
|
+
template <class FloatT>
|
381
|
+
struct IGRF11Generic : public MagneticFieldGeneric2<FloatT, IGRF11Generic>, public IGRF11Preset<FloatT> {
|
382
|
+
typedef IGRF11Preset<FloatT> preset_t;
|
383
|
+
static const typename MagneticFieldGeneric<FloatT>::model_t *models[];
|
384
|
+
static const int models_num;
|
385
|
+
};
|
386
|
+
|
387
|
+
typedef IGRF11Generic<double> IGRF11;
|
388
|
+
|
389
|
+
template <class FloatT>
|
390
|
+
const typename MagneticFieldGeneric<FloatT>::model_t IGRF11Preset<FloatT>::DGRF2000 = {
|
391
|
+
"DGRF2000",
|
392
|
+
2000.0,
|
393
|
+
13,
|
394
|
+
{-29619.4, -1728.2, 5186.1, // 1
|
395
|
+
-2267.7, 3068.4, -2481.6, 1670.9, -458.0, // 2
|
396
|
+
1339.6, -2288.0, -227.6, 1252.1, 293.4, 714.5, -491.1, // 3
|
397
|
+
932.3, 786.8, 272.6, 250.0, -231.9, -403.0, 119.8, 111.3, -303.8, // 4
|
398
|
+
-218.8, 351.4, 43.8, 222.3, 171.9, -130.4, -133.1, -168.6, -39.3, -12.9, 106.3, // 5
|
399
|
+
72.3, 68.2, -17.4, 74.2, 63.7, -160.9, 65.1, -5.9, -61.2, 16.9, 0.7, -90.4, 43.8, // 6
|
400
|
+
79.0, -74.0, -64.6, 0.0, -24.2, 33.3, 6.2, 9.1, 24.0, 6.9, 14.8, 7.3, -25.4, -1.2, -5.8, // 7
|
401
|
+
24.4, 6.6, 11.9, -9.2, -21.5, -7.9, 8.5, -16.6, -21.5, 9.1, 15.5, 7.0, 8.9, -7.9, -14.9, -7.0, -2.1, // 8
|
402
|
+
5.0, 9.4, -19.7, 3.0, 13.4, -8.4, 12.5, 6.3, -6.2, -8.9, -8.4, -1.5, 8.4, 9.3, 3.8, -4.3, -8.2, -8.2, 4.8, // 9
|
403
|
+
-2.6, -6.0, 1.7, 1.7, 0.0, -3.1, 4.0, -0.5, 4.9, 3.7, -5.9, 1.0, -1.2, 2.0, -2.9, 4.2, 0.2, 0.3, -2.2, -1.1, -7.4, // 10
|
404
|
+
2.7, -1.7, 0.1, -1.9, 1.3, 1.5, -0.9, -0.1, -2.6, 0.1, 0.9, -0.7, -0.7, 0.7, -2.8, 1.7, -0.9, 0.1, -1.2, 1.2, -1.9, 4.0, -0.9, // 11
|
405
|
+
-2.2, -0.3, -0.4, 0.2, 0.3, 0.9, 2.5, -0.2, -2.6, 0.9, 0.7, -0.5, 0.3, 0.3, 0.0, -0.3, 0.0, -0.4, 0.3, -0.1, -0.9, -0.2, -0.4, -0.4, 0.8, // 12
|
406
|
+
-0.2, -0.9, -0.9, 0.3, 0.2, 0.1, 1.8, -0.4, -0.4, 1.3, -1.0, -0.4, -0.1, 0.7, 0.7, -0.4, 0.3, 0.3, 0.6, -0.1, 0.3, 0.4, -0.2, 0.0, -0.5, 0.1, -0.9, } // 13
|
407
|
+
};
|
408
|
+
template <class FloatT>
|
409
|
+
const typename MagneticFieldGeneric<FloatT>::model_t IGRF11Preset<FloatT>::DGRF2005 = {
|
410
|
+
"DGRF2005",
|
411
|
+
2005.0,
|
412
|
+
13,
|
413
|
+
{-29554.63, -1669.05, 5077.99, // 1
|
414
|
+
-2337.24, 3047.69, -2594.5, 1657.76, -515.43, // 2
|
415
|
+
1336.3, -2305.83, -198.86, 1246.39, 269.72, 672.51, -524.72, // 3
|
416
|
+
920.55, 797.96, 282.07, 210.65, -225.23, -379.86, 145.15, 100.0, -305.36, // 4
|
417
|
+
-227.0, 354.41, 42.72, 208.95, 180.25, -136.54, -123.45, -168.05, -19.57, -13.55, 103.85, // 5
|
418
|
+
73.6, 69.56, -20.33, 76.74, 54.75, -151.34, 63.63, -14.58, -63.53, 14.58, 0.24, -86.36, 50.94, // 6
|
419
|
+
79.88, -74.46, -61.14, -1.65, -22.57, 38.73, 6.82, 12.3, 25.35, 9.37, 10.93, 5.42, -26.32, 1.94, -4.64, // 7
|
420
|
+
24.8, 7.62, 11.2, -11.73, -20.88, -6.88, 9.83, -18.11, -19.71, 10.17, 16.22, 9.36, 7.61, -11.25, -12.76, -4.87, -0.06, // 8
|
421
|
+
5.58, 9.76, -20.11, 3.58, 12.69, -6.94, 12.67, 5.01, -6.72, -10.76, -8.16, -1.25, 8.1, 8.76, 2.92, -6.66, -7.73, -9.22, 6.01, // 9
|
422
|
+
-2.17, -6.12, 2.19, 1.42, 0.1, -2.35, 4.46, -0.15, 4.76, 3.06, -6.58, 0.29, -1.01, 2.06, -3.47, 3.77, -0.86, -0.21, -2.31, -2.09, -7.93, // 10
|
423
|
+
2.95, -1.6, 0.26, -1.88, 1.44, 1.44, -0.77, -0.31, -2.27, 0.29, 0.9, -0.79, -0.58, 0.53, -2.69, 1.8, -1.08, 0.16, -1.58, 0.96, -1.9, 3.99, -1.39, // 11
|
424
|
+
-2.15, -0.29, -0.55, 0.21, 0.23, 0.89, 2.38, -0.38, -2.63, 0.96, 0.61, -0.3, 0.4, 0.46, 0.01, -0.35, 0.02, -0.36, 0.28, 0.08, -0.87, -0.49, -0.34, -0.08, 0.88, // 12
|
425
|
+
-0.16, -0.88, -0.76, 0.3, 0.33, 0.28, 1.72, -0.43, -0.54, 1.18, -1.07, -0.37, -0.04, 0.75, 0.63, -0.26, 0.21, 0.35, 0.53, -0.05, 0.38, 0.41, -0.22, -0.1, -0.57, -0.18, -0.82, } // 13
|
426
|
+
};
|
427
|
+
template <class FloatT>
|
428
|
+
const typename MagneticFieldGeneric<FloatT>::model_t IGRF11Preset<FloatT>::DGRF45 = {
|
429
|
+
"DGRF45",
|
430
|
+
1945.0,
|
431
|
+
10,
|
432
|
+
{-30594.0, -2285.0, 5810.0, // 1
|
433
|
+
-1244.0, 2990.0, -1702.0, 1578.0, 477.0, // 2
|
434
|
+
1282.0, -1834.0, -499.0, 1255.0, 186.0, 913.0, -11.0, // 3
|
435
|
+
944.0, 776.0, 144.0, 544.0, -276.0, -421.0, -55.0, 304.0, -178.0, // 4
|
436
|
+
-253.0, 346.0, -12.0, 194.0, 95.0, -20.0, -67.0, -142.0, -119.0, -82.0, 82.0, // 5
|
437
|
+
59.0, 57.0, 6.0, 6.0, 100.0, -246.0, 16.0, -25.0, -9.0, 21.0, -16.0, -104.0, -39.0, // 6
|
438
|
+
70.0, -40.0, -45.0, 0.0, -18.0, 0.0, 2.0, -29.0, 6.0, -10.0, 28.0, 15.0, -17.0, 29.0, -22.0, // 7
|
439
|
+
13.0, 7.0, 12.0, -8.0, -21.0, -5.0, -12.0, 9.0, -7.0, 7.0, 2.0, -10.0, 18.0, 7.0, 3.0, 2.0, -11.0, // 8
|
440
|
+
5.0, -21.0, -27.0, 1.0, 17.0, -11.0, 29.0, 3.0, -9.0, 16.0, 4.0, -3.0, 9.0, -4.0, 6.0, -3.0, 1.0, -4.0, 8.0, // 9
|
441
|
+
-3.0, 11.0, 5.0, 1.0, 1.0, 2.0, -20.0, -5.0, -1.0, -1.0, -6.0, 8.0, 6.0, -1.0, -4.0, -3.0, -2.0, 5.0, 0.0, -2.0, -2.0, } // 10
|
442
|
+
};
|
443
|
+
template <class FloatT>
|
444
|
+
const typename MagneticFieldGeneric<FloatT>::model_t IGRF11Preset<FloatT>::DGRF50 = {
|
445
|
+
"DGRF50",
|
446
|
+
1950.0,
|
447
|
+
10,
|
448
|
+
{-30554.0, -2250.0, 5815.0, // 1
|
449
|
+
-1341.0, 2998.0, -1810.0, 1576.0, 381.0, // 2
|
450
|
+
1297.0, -1889.0, -476.0, 1274.0, 206.0, 896.0, -46.0, // 3
|
451
|
+
954.0, 792.0, 136.0, 528.0, -278.0, -408.0, -37.0, 303.0, -210.0, // 4
|
452
|
+
-240.0, 349.0, 3.0, 211.0, 103.0, -20.0, -87.0, -147.0, -122.0, -76.0, 80.0, // 5
|
453
|
+
54.0, 57.0, -1.0, 4.0, 99.0, -247.0, 33.0, -16.0, -12.0, 12.0, -12.0, -105.0, -30.0, // 6
|
454
|
+
65.0, -55.0, -35.0, 2.0, -17.0, 1.0, 0.0, -40.0, 10.0, -7.0, 36.0, 5.0, -18.0, 19.0, -16.0, // 7
|
455
|
+
22.0, 15.0, 5.0, -4.0, -22.0, -1.0, 0.0, 11.0, -21.0, 15.0, -8.0, -13.0, 17.0, 5.0, -4.0, -1.0, -17.0, // 8
|
456
|
+
3.0, -7.0, -24.0, -1.0, 19.0, -25.0, 12.0, 10.0, 2.0, 5.0, 2.0, -5.0, 8.0, -2.0, 8.0, 3.0, -11.0, 8.0, -7.0, // 9
|
457
|
+
-8.0, 4.0, 13.0, -1.0, -2.0, 13.0, -10.0, -4.0, 2.0, 4.0, -3.0, 12.0, 6.0, 3.0, -3.0, 2.0, 6.0, 10.0, 11.0, 3.0, 8.0, } // 10
|
458
|
+
};
|
459
|
+
template <class FloatT>
|
460
|
+
const typename MagneticFieldGeneric<FloatT>::model_t IGRF11Preset<FloatT>::DGRF55 = {
|
461
|
+
"DGRF55",
|
462
|
+
1955.0,
|
463
|
+
10,
|
464
|
+
{-30500.0, -2215.0, 5820.0, // 1
|
465
|
+
-1440.0, 3003.0, -1898.0, 1581.0, 291.0, // 2
|
466
|
+
1302.0, -1944.0, -462.0, 1288.0, 216.0, 882.0, -83.0, // 3
|
467
|
+
958.0, 796.0, 133.0, 510.0, -274.0, -397.0, -23.0, 290.0, -230.0, // 4
|
468
|
+
-229.0, 360.0, 15.0, 230.0, 110.0, -23.0, -98.0, -152.0, -121.0, -69.0, 78.0, // 5
|
469
|
+
47.0, 57.0, -9.0, 3.0, 96.0, -247.0, 48.0, -8.0, -16.0, 7.0, -12.0, -107.0, -24.0, // 6
|
470
|
+
65.0, -56.0, -50.0, 2.0, -24.0, 10.0, -4.0, -32.0, 8.0, -11.0, 28.0, 9.0, -20.0, 18.0, -18.0, // 7
|
471
|
+
11.0, 9.0, 10.0, -6.0, -15.0, -14.0, 5.0, 6.0, -23.0, 10.0, 3.0, -7.0, 23.0, 6.0, -4.0, 9.0, -13.0, // 8
|
472
|
+
4.0, 9.0, -11.0, -4.0, 12.0, -5.0, 7.0, 2.0, 6.0, 4.0, -2.0, 1.0, 10.0, 2.0, 7.0, 2.0, -6.0, 5.0, 5.0, // 9
|
473
|
+
-3.0, -5.0, -4.0, -1.0, 0.0, 2.0, -8.0, -3.0, -2.0, 7.0, -4.0, 4.0, 1.0, -2.0, -3.0, 6.0, 7.0, -2.0, -1.0, 0.0, -3.0, } // 10
|
474
|
+
};
|
475
|
+
template <class FloatT>
|
476
|
+
const typename MagneticFieldGeneric<FloatT>::model_t IGRF11Preset<FloatT>::DGRF60 = {
|
477
|
+
"DGRF60",
|
478
|
+
1960.0,
|
479
|
+
10,
|
480
|
+
{-30421.0, -2169.0, 5791.0, // 1
|
481
|
+
-1555.0, 3002.0, -1967.0, 1590.0, 206.0, // 2
|
482
|
+
1302.0, -1992.0, -414.0, 1289.0, 224.0, 878.0, -130.0, // 3
|
483
|
+
957.0, 800.0, 135.0, 504.0, -278.0, -394.0, 3.0, 269.0, -255.0, // 4
|
484
|
+
-222.0, 362.0, 16.0, 242.0, 125.0, -26.0, -117.0, -156.0, -114.0, -63.0, 81.0, // 5
|
485
|
+
46.0, 58.0, -10.0, 1.0, 99.0, -237.0, 60.0, -1.0, -20.0, -2.0, -11.0, -113.0, -17.0, // 6
|
486
|
+
67.0, -56.0, -55.0, 5.0, -28.0, 15.0, -6.0, -32.0, 7.0, -7.0, 23.0, 17.0, -18.0, 8.0, -17.0, // 7
|
487
|
+
15.0, 6.0, 11.0, -4.0, -14.0, -11.0, 7.0, 2.0, -18.0, 10.0, 4.0, -5.0, 23.0, 10.0, 1.0, 8.0, -20.0, // 8
|
488
|
+
4.0, 6.0, -18.0, 0.0, 12.0, -9.0, 2.0, 1.0, 0.0, 4.0, -3.0, -1.0, 9.0, -2.0, 8.0, 3.0, 0.0, -1.0, 5.0, // 9
|
489
|
+
1.0, -3.0, 4.0, 4.0, 1.0, 0.0, 0.0, -1.0, 2.0, 4.0, -5.0, 6.0, 1.0, 1.0, -1.0, -1.0, 6.0, 2.0, 0.0, 0.0, -7.0, } // 10
|
490
|
+
};
|
491
|
+
template <class FloatT>
|
492
|
+
const typename MagneticFieldGeneric<FloatT>::model_t IGRF11Preset<FloatT>::DGRF65 = {
|
493
|
+
"DGRF65",
|
494
|
+
1965.0,
|
495
|
+
10,
|
496
|
+
{-30334.0, -2119.0, 5776.0, // 1
|
497
|
+
-1662.0, 2997.0, -2016.0, 1594.0, 114.0, // 2
|
498
|
+
1297.0, -2038.0, -404.0, 1292.0, 240.0, 856.0, -165.0, // 3
|
499
|
+
957.0, 804.0, 148.0, 479.0, -269.0, -390.0, 13.0, 252.0, -269.0, // 4
|
500
|
+
-219.0, 358.0, 19.0, 254.0, 128.0, -31.0, -126.0, -157.0, -97.0, -62.0, 81.0, // 5
|
501
|
+
45.0, 61.0, -11.0, 8.0, 100.0, -228.0, 68.0, 4.0, -32.0, 1.0, -8.0, -111.0, -7.0, // 6
|
502
|
+
75.0, -57.0, -61.0, 4.0, -27.0, 13.0, -2.0, -26.0, 6.0, -6.0, 26.0, 13.0, -23.0, 1.0, -12.0, // 7
|
503
|
+
13.0, 5.0, 7.0, -4.0, -12.0, -14.0, 9.0, 0.0, -16.0, 8.0, 4.0, -1.0, 24.0, 11.0, -3.0, 4.0, -17.0, // 8
|
504
|
+
8.0, 10.0, -22.0, 2.0, 15.0, -13.0, 7.0, 10.0, -4.0, -1.0, -5.0, -1.0, 10.0, 5.0, 10.0, 1.0, -4.0, -2.0, 1.0, // 9
|
505
|
+
-2.0, -3.0, 2.0, 2.0, 1.0, -5.0, 2.0, -2.0, 6.0, 4.0, -4.0, 4.0, 0.0, 0.0, -2.0, 2.0, 3.0, 2.0, 0.0, 0.0, -6.0, } // 10
|
506
|
+
};
|
507
|
+
template <class FloatT>
|
508
|
+
const typename MagneticFieldGeneric<FloatT>::model_t IGRF11Preset<FloatT>::DGRF70 = {
|
509
|
+
"DGRF70",
|
510
|
+
1970.0,
|
511
|
+
10,
|
512
|
+
{-30220.0, -2068.0, 5737.0, // 1
|
513
|
+
-1781.0, 3000.0, -2047.0, 1611.0, 25.0, // 2
|
514
|
+
1287.0, -2091.0, -366.0, 1278.0, 251.0, 838.0, -196.0, // 3
|
515
|
+
952.0, 800.0, 167.0, 461.0, -266.0, -395.0, 26.0, 234.0, -279.0, // 4
|
516
|
+
-216.0, 359.0, 26.0, 262.0, 139.0, -42.0, -139.0, -160.0, -91.0, -56.0, 83.0, // 5
|
517
|
+
43.0, 64.0, -12.0, 15.0, 100.0, -212.0, 72.0, 2.0, -37.0, 3.0, -6.0, -112.0, 1.0, // 6
|
518
|
+
72.0, -57.0, -70.0, 1.0, -27.0, 14.0, -4.0, -22.0, 8.0, -2.0, 23.0, 13.0, -23.0, -2.0, -11.0, // 7
|
519
|
+
14.0, 6.0, 7.0, -2.0, -15.0, -13.0, 6.0, -3.0, -17.0, 5.0, 6.0, 0.0, 21.0, 11.0, -6.0, 3.0, -16.0, // 8
|
520
|
+
8.0, 10.0, -21.0, 2.0, 16.0, -12.0, 6.0, 10.0, -4.0, -1.0, -5.0, 0.0, 10.0, 3.0, 11.0, 1.0, -2.0, -1.0, 1.0, // 9
|
521
|
+
-3.0, -3.0, 1.0, 2.0, 1.0, -5.0, 3.0, -1.0, 4.0, 6.0, -4.0, 4.0, 0.0, 1.0, -1.0, 0.0, 3.0, 3.0, 1.0, -1.0, -4.0, } // 10
|
522
|
+
};
|
523
|
+
template <class FloatT>
|
524
|
+
const typename MagneticFieldGeneric<FloatT>::model_t IGRF11Preset<FloatT>::DGRF75 = {
|
525
|
+
"DGRF75",
|
526
|
+
1975.0,
|
527
|
+
10,
|
528
|
+
{-30100.0, -2013.0, 5675.0, // 1
|
529
|
+
-1902.0, 3010.0, -2067.0, 1632.0, -68.0, // 2
|
530
|
+
1276.0, -2144.0, -333.0, 1260.0, 262.0, 830.0, -223.0, // 3
|
531
|
+
946.0, 791.0, 191.0, 438.0, -265.0, -405.0, 39.0, 216.0, -288.0, // 4
|
532
|
+
-218.0, 356.0, 31.0, 264.0, 148.0, -59.0, -152.0, -159.0, -83.0, -49.0, 88.0, // 5
|
533
|
+
45.0, 66.0, -13.0, 28.0, 99.0, -198.0, 75.0, 1.0, -41.0, 6.0, -4.0, -111.0, 11.0, // 6
|
534
|
+
71.0, -56.0, -77.0, 1.0, -26.0, 16.0, -5.0, -14.0, 10.0, 0.0, 22.0, 12.0, -23.0, -5.0, -12.0, // 7
|
535
|
+
14.0, 6.0, 6.0, -1.0, -16.0, -12.0, 4.0, -8.0, -19.0, 4.0, 6.0, 0.0, 18.0, 10.0, -10.0, 1.0, -17.0, // 8
|
536
|
+
7.0, 10.0, -21.0, 2.0, 16.0, -12.0, 7.0, 10.0, -4.0, -1.0, -5.0, -1.0, 10.0, 4.0, 11.0, 1.0, -3.0, -2.0, 1.0, // 9
|
537
|
+
-3.0, -3.0, 1.0, 2.0, 1.0, -5.0, 3.0, -2.0, 4.0, 5.0, -4.0, 4.0, -1.0, 1.0, -1.0, 0.0, 3.0, 3.0, 1.0, -1.0, -5.0, } // 10
|
538
|
+
};
|
539
|
+
template <class FloatT>
|
540
|
+
const typename MagneticFieldGeneric<FloatT>::model_t IGRF11Preset<FloatT>::DGRF80 = {
|
541
|
+
"DGRF80",
|
542
|
+
1980.0,
|
543
|
+
10,
|
544
|
+
{-29992.0, -1956.0, 5604.0, // 1
|
545
|
+
-1997.0, 3027.0, -2129.0, 1663.0, -200.0, // 2
|
546
|
+
1281.0, -2180.0, -336.0, 1251.0, 271.0, 833.0, -252.0, // 3
|
547
|
+
938.0, 782.0, 212.0, 398.0, -257.0, -419.0, 53.0, 199.0, -297.0, // 4
|
548
|
+
-218.0, 357.0, 46.0, 261.0, 150.0, -74.0, -151.0, -162.0, -78.0, -48.0, 92.0, // 5
|
549
|
+
48.0, 66.0, -15.0, 42.0, 93.0, -192.0, 71.0, 4.0, -43.0, 14.0, -2.0, -108.0, 17.0, // 6
|
550
|
+
72.0, -59.0, -82.0, 2.0, -27.0, 21.0, -5.0, -12.0, 16.0, 1.0, 18.0, 11.0, -23.0, -2.0, -10.0, // 7
|
551
|
+
18.0, 6.0, 7.0, 0.0, -18.0, -11.0, 4.0, -7.0, -22.0, 4.0, 9.0, 3.0, 16.0, 6.0, -13.0, -1.0, -15.0, // 8
|
552
|
+
5.0, 10.0, -21.0, 1.0, 16.0, -12.0, 9.0, 9.0, -5.0, -3.0, -6.0, -1.0, 9.0, 7.0, 10.0, 2.0, -6.0, -5.0, 2.0, // 9
|
553
|
+
-4.0, -4.0, 1.0, 2.0, 0.0, -5.0, 3.0, -2.0, 6.0, 5.0, -4.0, 3.0, 0.0, 1.0, -1.0, 2.0, 4.0, 3.0, 0.0, 0.0, -6.0, } // 10
|
554
|
+
};
|
555
|
+
template <class FloatT>
|
556
|
+
const typename MagneticFieldGeneric<FloatT>::model_t IGRF11Preset<FloatT>::DGRF85 = {
|
557
|
+
"DGRF85",
|
558
|
+
1985.0,
|
559
|
+
10,
|
560
|
+
{-29873.0, -1905.0, 5500.0, // 1
|
561
|
+
-2072.0, 3044.0, -2197.0, 1687.0, -306.0, // 2
|
562
|
+
1296.0, -2208.0, -310.0, 1247.0, 284.0, 829.0, -297.0, // 3
|
563
|
+
936.0, 780.0, 232.0, 361.0, -249.0, -424.0, 69.0, 170.0, -297.0, // 4
|
564
|
+
-214.0, 355.0, 47.0, 253.0, 150.0, -93.0, -154.0, -164.0, -75.0, -46.0, 95.0, // 5
|
565
|
+
53.0, 65.0, -16.0, 51.0, 88.0, -185.0, 69.0, 4.0, -48.0, 16.0, -1.0, -102.0, 21.0, // 6
|
566
|
+
74.0, -62.0, -83.0, 3.0, -27.0, 24.0, -2.0, -6.0, 20.0, 4.0, 17.0, 10.0, -23.0, 0.0, -7.0, // 7
|
567
|
+
21.0, 6.0, 8.0, 0.0, -19.0, -11.0, 5.0, -9.0, -23.0, 4.0, 11.0, 4.0, 14.0, 4.0, -15.0, -4.0, -11.0, // 8
|
568
|
+
5.0, 10.0, -21.0, 1.0, 15.0, -12.0, 9.0, 9.0, -6.0, -3.0, -6.0, -1.0, 9.0, 7.0, 9.0, 1.0, -7.0, -5.0, 2.0, // 9
|
569
|
+
-4.0, -4.0, 1.0, 3.0, 0.0, -5.0, 3.0, -2.0, 6.0, 5.0, -4.0, 3.0, 0.0, 1.0, -1.0, 2.0, 4.0, 3.0, 0.0, 0.0, -6.0, } // 10
|
570
|
+
};
|
571
|
+
template <class FloatT>
|
572
|
+
const typename MagneticFieldGeneric<FloatT>::model_t IGRF11Preset<FloatT>::DGRF90 = {
|
573
|
+
"DGRF90",
|
574
|
+
1990.0,
|
575
|
+
10,
|
576
|
+
{-29775.0, -1848.0, 5406.0, // 1
|
577
|
+
-2131.0, 3059.0, -2279.0, 1686.0, -373.0, // 2
|
578
|
+
1314.0, -2239.0, -284.0, 1248.0, 293.0, 802.0, -352.0, // 3
|
579
|
+
939.0, 780.0, 247.0, 325.0, -240.0, -423.0, 84.0, 141.0, -299.0, // 4
|
580
|
+
-214.0, 353.0, 46.0, 245.0, 154.0, -109.0, -153.0, -165.0, -69.0, -36.0, 97.0, // 5
|
581
|
+
61.0, 65.0, -16.0, 59.0, 82.0, -178.0, 69.0, 3.0, -52.0, 18.0, 1.0, -96.0, 24.0, // 6
|
582
|
+
77.0, -64.0, -80.0, 2.0, -26.0, 26.0, 0.0, -1.0, 21.0, 5.0, 17.0, 9.0, -23.0, 0.0, -4.0, // 7
|
583
|
+
23.0, 5.0, 10.0, -1.0, -19.0, -10.0, 6.0, -12.0, -22.0, 3.0, 12.0, 4.0, 12.0, 2.0, -16.0, -6.0, -10.0, // 8
|
584
|
+
4.0, 9.0, -20.0, 1.0, 15.0, -12.0, 11.0, 9.0, -7.0, -4.0, -7.0, -2.0, 9.0, 7.0, 8.0, 1.0, -7.0, -6.0, 2.0, // 9
|
585
|
+
-3.0, -4.0, 2.0, 2.0, 1.0, -5.0, 3.0, -2.0, 6.0, 4.0, -4.0, 3.0, 0.0, 1.0, -2.0, 3.0, 3.0, 3.0, -1.0, 0.0, -6.0, } // 10
|
586
|
+
};
|
587
|
+
template <class FloatT>
|
588
|
+
const typename MagneticFieldGeneric<FloatT>::model_t IGRF11Preset<FloatT>::DGRF95 = {
|
589
|
+
"DGRF95",
|
590
|
+
1995.0,
|
591
|
+
10,
|
592
|
+
{-29692.0, -1784.0, 5306.0, // 1
|
593
|
+
-2200.0, 3070.0, -2366.0, 1681.0, -413.0, // 2
|
594
|
+
1335.0, -2267.0, -262.0, 1249.0, 302.0, 759.0, -427.0, // 3
|
595
|
+
940.0, 780.0, 262.0, 290.0, -236.0, -418.0, 97.0, 122.0, -306.0, // 4
|
596
|
+
-214.0, 352.0, 46.0, 235.0, 165.0, -118.0, -143.0, -166.0, -55.0, -17.0, 107.0, // 5
|
597
|
+
68.0, 67.0, -17.0, 68.0, 72.0, -170.0, 67.0, -1.0, -58.0, 19.0, 1.0, -93.0, 36.0, // 6
|
598
|
+
77.0, -72.0, -69.0, 1.0, -25.0, 28.0, 4.0, 5.0, 24.0, 4.0, 17.0, 8.0, -24.0, -2.0, -6.0, // 7
|
599
|
+
25.0, 6.0, 11.0, -6.0, -21.0, -9.0, 8.0, -14.0, -23.0, 9.0, 15.0, 6.0, 11.0, -5.0, -16.0, -7.0, -4.0, // 8
|
600
|
+
4.0, 9.0, -20.0, 3.0, 15.0, -10.0, 12.0, 8.0, -6.0, -8.0, -8.0, -1.0, 8.0, 10.0, 5.0, -2.0, -8.0, -8.0, 3.0, // 9
|
601
|
+
-3.0, -6.0, 1.0, 2.0, 0.0, -4.0, 4.0, -1.0, 5.0, 4.0, -5.0, 2.0, -1.0, 2.0, -2.0, 5.0, 1.0, 1.0, -2.0, 0.0, -7.0, } // 10
|
602
|
+
};
|
603
|
+
template <class FloatT>
|
604
|
+
const typename MagneticFieldGeneric<FloatT>::model_t IGRF11Preset<FloatT>::IGRF00 = {
|
605
|
+
"IGRF00",
|
606
|
+
1900.0,
|
607
|
+
10,
|
608
|
+
{-31543.0, -2298.0, 5922.0, // 1
|
609
|
+
-677.0, 2905.0, -1061.0, 924.0, 1121.0, // 2
|
610
|
+
1022.0, -1469.0, -330.0, 1256.0, 3.0, 572.0, 523.0, // 3
|
611
|
+
876.0, 628.0, 195.0, 660.0, -69.0, -361.0, -210.0, 134.0, -75.0, // 4
|
612
|
+
-184.0, 328.0, -210.0, 264.0, 53.0, 5.0, -33.0, -86.0, -124.0, -16.0, 3.0, // 5
|
613
|
+
63.0, 61.0, -9.0, -11.0, 83.0, -217.0, 2.0, -58.0, -35.0, 59.0, 36.0, -90.0, -69.0, // 6
|
614
|
+
70.0, -55.0, -45.0, 0.0, -13.0, 34.0, -10.0, -41.0, -1.0, -21.0, 28.0, 18.0, -12.0, 6.0, -22.0, // 7
|
615
|
+
11.0, 8.0, 8.0, -4.0, -14.0, -9.0, 7.0, 1.0, -13.0, 2.0, 5.0, -9.0, 16.0, 5.0, -5.0, 8.0, -18.0, // 8
|
616
|
+
8.0, 10.0, -20.0, 1.0, 14.0, -11.0, 5.0, 12.0, -3.0, 1.0, -2.0, -2.0, 8.0, 2.0, 10.0, -1.0, -2.0, -1.0, 2.0, // 9
|
617
|
+
-3.0, -4.0, 2.0, 2.0, 1.0, -5.0, 2.0, -2.0, 6.0, 6.0, -4.0, 4.0, 0.0, 0.0, -2.0, 2.0, 4.0, 2.0, 0.0, 0.0, -6.0, } // 10
|
618
|
+
};
|
619
|
+
template <class FloatT>
|
620
|
+
const typename MagneticFieldGeneric<FloatT>::model_t IGRF11Preset<FloatT>::IGRF05 = {
|
621
|
+
"IGRF05",
|
622
|
+
1905.0,
|
623
|
+
10,
|
624
|
+
{-31464.0, -2298.0, 5909.0, // 1
|
625
|
+
-728.0, 2928.0, -1086.0, 1041.0, 1065.0, // 2
|
626
|
+
1037.0, -1494.0, -357.0, 1239.0, 34.0, 635.0, 480.0, // 3
|
627
|
+
880.0, 643.0, 203.0, 653.0, -77.0, -380.0, -201.0, 146.0, -65.0, // 4
|
628
|
+
-192.0, 328.0, -193.0, 259.0, 56.0, -1.0, -32.0, -93.0, -125.0, -26.0, 11.0, // 5
|
629
|
+
62.0, 60.0, -7.0, -11.0, 86.0, -221.0, 4.0, -57.0, -32.0, 57.0, 32.0, -92.0, -67.0, // 6
|
630
|
+
70.0, -54.0, -46.0, 0.0, -14.0, 33.0, -11.0, -41.0, 0.0, -20.0, 28.0, 18.0, -12.0, 6.0, -22.0, // 7
|
631
|
+
11.0, 8.0, 8.0, -4.0, -15.0, -9.0, 7.0, 1.0, -13.0, 2.0, 5.0, -8.0, 16.0, 5.0, -5.0, 8.0, -18.0, // 8
|
632
|
+
8.0, 10.0, -20.0, 1.0, 14.0, -11.0, 5.0, 12.0, -3.0, 1.0, -2.0, -2.0, 8.0, 2.0, 10.0, 0.0, -2.0, -1.0, 2.0, // 9
|
633
|
+
-3.0, -4.0, 2.0, 2.0, 1.0, -5.0, 2.0, -2.0, 6.0, 6.0, -4.0, 4.0, 0.0, 0.0, -2.0, 2.0, 4.0, 2.0, 0.0, 0.0, -6.0, } // 10
|
634
|
+
};
|
635
|
+
template <class FloatT>
|
636
|
+
const typename MagneticFieldGeneric<FloatT>::model_t IGRF11Preset<FloatT>::IGRF10 = {
|
637
|
+
"IGRF10",
|
638
|
+
1910.0,
|
639
|
+
10,
|
640
|
+
{-31354.0, -2297.0, 5898.0, // 1
|
641
|
+
-769.0, 2948.0, -1128.0, 1176.0, 1000.0, // 2
|
642
|
+
1058.0, -1524.0, -389.0, 1223.0, 62.0, 705.0, 425.0, // 3
|
643
|
+
884.0, 660.0, 211.0, 644.0, -90.0, -400.0, -189.0, 160.0, -55.0, // 4
|
644
|
+
-201.0, 327.0, -172.0, 253.0, 57.0, -9.0, -33.0, -102.0, -126.0, -38.0, 21.0, // 5
|
645
|
+
62.0, 58.0, -5.0, -11.0, 89.0, -224.0, 5.0, -54.0, -29.0, 54.0, 28.0, -95.0, -65.0, // 6
|
646
|
+
71.0, -54.0, -47.0, 1.0, -14.0, 32.0, -12.0, -40.0, 1.0, -19.0, 28.0, 18.0, -13.0, 6.0, -22.0, // 7
|
647
|
+
11.0, 8.0, 8.0, -4.0, -15.0, -9.0, 6.0, 1.0, -13.0, 2.0, 5.0, -8.0, 16.0, 5.0, -5.0, 8.0, -18.0, // 8
|
648
|
+
8.0, 10.0, -20.0, 1.0, 14.0, -11.0, 5.0, 12.0, -3.0, 1.0, -2.0, -2.0, 8.0, 2.0, 10.0, 0.0, -2.0, -1.0, 2.0, // 9
|
649
|
+
-3.0, -4.0, 2.0, 2.0, 1.0, -5.0, 2.0, -2.0, 6.0, 6.0, -4.0, 4.0, 0.0, 0.0, -2.0, 2.0, 4.0, 2.0, 0.0, 0.0, -6.0, } // 10
|
650
|
+
};
|
651
|
+
template <class FloatT>
|
652
|
+
const typename MagneticFieldGeneric<FloatT>::model_t IGRF11Preset<FloatT>::IGRF15 = {
|
653
|
+
"IGRF15",
|
654
|
+
1915.0,
|
655
|
+
10,
|
656
|
+
{-31212.0, -2306.0, 5875.0, // 1
|
657
|
+
-802.0, 2956.0, -1191.0, 1309.0, 917.0, // 2
|
658
|
+
1084.0, -1559.0, -421.0, 1212.0, 84.0, 778.0, 360.0, // 3
|
659
|
+
887.0, 678.0, 218.0, 631.0, -109.0, -416.0, -173.0, 178.0, -51.0, // 4
|
660
|
+
-211.0, 327.0, -148.0, 245.0, 58.0, -16.0, -34.0, -111.0, -126.0, -51.0, 32.0, // 5
|
661
|
+
61.0, 57.0, -2.0, -10.0, 93.0, -228.0, 8.0, -51.0, -26.0, 49.0, 23.0, -98.0, -62.0, // 6
|
662
|
+
72.0, -54.0, -48.0, 2.0, -14.0, 31.0, -12.0, -38.0, 2.0, -18.0, 28.0, 19.0, -15.0, 6.0, -22.0, // 7
|
663
|
+
11.0, 8.0, 8.0, -4.0, -15.0, -9.0, 6.0, 2.0, -13.0, 3.0, 5.0, -8.0, 16.0, 6.0, -5.0, 8.0, -18.0, // 8
|
664
|
+
8.0, 10.0, -20.0, 1.0, 14.0, -11.0, 5.0, 12.0, -3.0, 1.0, -2.0, -2.0, 8.0, 2.0, 10.0, 0.0, -2.0, -1.0, 2.0, // 9
|
665
|
+
-3.0, -4.0, 2.0, 2.0, 1.0, -5.0, 2.0, -2.0, 6.0, 6.0, -4.0, 4.0, 0.0, 0.0, -2.0, 1.0, 4.0, 2.0, 0.0, 0.0, -6.0, } // 10
|
666
|
+
};
|
667
|
+
template <class FloatT>
|
668
|
+
const typename MagneticFieldGeneric<FloatT>::model_t IGRF11Preset<FloatT>::IGRF20 = {
|
669
|
+
"IGRF20",
|
670
|
+
1920.0,
|
671
|
+
10,
|
672
|
+
{-31060.0, -2317.0, 5845.0, // 1
|
673
|
+
-839.0, 2959.0, -1259.0, 1407.0, 823.0, // 2
|
674
|
+
1111.0, -1600.0, -445.0, 1205.0, 103.0, 839.0, 293.0, // 3
|
675
|
+
889.0, 695.0, 220.0, 616.0, -134.0, -424.0, -153.0, 199.0, -57.0, // 4
|
676
|
+
-221.0, 326.0, -122.0, 236.0, 58.0, -23.0, -38.0, -119.0, -125.0, -62.0, 43.0, // 5
|
677
|
+
61.0, 55.0, 0.0, -10.0, 96.0, -233.0, 11.0, -46.0, -22.0, 44.0, 18.0, -101.0, -57.0, // 6
|
678
|
+
73.0, -54.0, -49.0, 2.0, -14.0, 29.0, -13.0, -37.0, 4.0, -16.0, 28.0, 19.0, -16.0, 6.0, -22.0, // 7
|
679
|
+
11.0, 7.0, 8.0, -3.0, -15.0, -9.0, 6.0, 2.0, -14.0, 4.0, 5.0, -7.0, 17.0, 6.0, -5.0, 8.0, -19.0, // 8
|
680
|
+
8.0, 10.0, -20.0, 1.0, 14.0, -11.0, 5.0, 12.0, -3.0, 1.0, -2.0, -2.0, 9.0, 2.0, 10.0, 0.0, -2.0, -1.0, 2.0, // 9
|
681
|
+
-3.0, -4.0, 2.0, 2.0, 1.0, -5.0, 2.0, -2.0, 6.0, 6.0, -4.0, 4.0, 0.0, 0.0, -2.0, 1.0, 4.0, 3.0, 0.0, 0.0, -6.0, } // 10
|
682
|
+
};
|
683
|
+
template <class FloatT>
|
684
|
+
const typename MagneticFieldGeneric<FloatT>::model_t IGRF11Preset<FloatT>::IGRF2010 = {
|
685
|
+
"IGRF2010",
|
686
|
+
2010.0,
|
687
|
+
13,
|
688
|
+
{-29496.5, -1585.9, 4945.1, // 1
|
689
|
+
-2396.6, 3026.0, -2707.7, 1668.6, -575.4, // 2
|
690
|
+
1339.7, -2326.3, -160.5, 1231.7, 251.7, 634.2, -536.8, // 3
|
691
|
+
912.6, 809.0, 286.4, 166.6, -211.2, -357.1, 164.4, 89.7, -309.2, // 4
|
692
|
+
-231.1, 357.2, 44.7, 200.3, 188.9, -141.2, -118.1, -163.1, 0.1, -7.7, 100.9, // 5
|
693
|
+
72.8, 68.6, -20.8, 76.0, 44.2, -141.4, 61.5, -22.9, -66.3, 13.1, 3.1, -77.9, 54.9, // 6
|
694
|
+
80.4, -75.0, -57.8, -4.7, -21.2, 45.3, 6.6, 14.0, 24.9, 10.4, 7.0, 1.6, -27.7, 4.9, -3.4, // 7
|
695
|
+
24.3, 8.2, 10.9, -14.5, -20.0, -5.7, 11.9, -19.3, -17.4, 11.6, 16.7, 10.9, 7.1, -14.1, -10.8, -3.7, 1.7, // 8
|
696
|
+
5.4, 9.4, -20.5, 3.4, 11.6, -5.3, 12.8, 3.1, -7.2, -12.4, -7.4, -0.8, 8.0, 8.4, 2.2, -8.4, -6.1, -10.1, 7.0, // 9
|
697
|
+
-2.0, -6.3, 2.8, 0.9, -0.1, -1.1, 4.7, -0.2, 4.4, 2.5, -7.2, -0.3, -1.0, 2.2, -4.0, 3.1, -2.0, -1.0, -2.0, -2.8, -8.3, // 10
|
698
|
+
3.0, -1.5, 0.1, -2.1, 1.7, 1.6, -0.6, -0.5, -1.8, 0.5, 0.9, -0.8, -0.4, 0.4, -2.5, 1.8, -1.3, 0.2, -2.1, 0.8, -1.9, 3.8, -1.8, // 11
|
699
|
+
-2.1, -0.2, -0.8, 0.3, 0.3, 1.0, 2.2, -0.7, -2.5, 0.9, 0.5, -0.1, 0.6, 0.5, 0.0, -0.4, 0.1, -0.4, 0.3, 0.2, -0.9, -0.8, -0.2, 0.0, 0.8, // 12
|
700
|
+
-0.2, -0.9, -0.8, 0.3, 0.3, 0.4, 1.7, -0.4, -0.6, 1.1, -1.2, -0.3, -0.1, 0.8, 0.5, -0.2, 0.1, 0.4, 0.5, 0.0, 0.4, 0.4, -0.2, -0.3, -0.5, -0.3, -0.8, } // 13
|
701
|
+
};
|
702
|
+
template <class FloatT>
|
703
|
+
const typename MagneticFieldGeneric<FloatT>::model_t IGRF11Preset<FloatT>::IGRF25 = {
|
704
|
+
"IGRF25",
|
705
|
+
1925.0,
|
706
|
+
10,
|
707
|
+
{-30926.0, -2318.0, 5817.0, // 1
|
708
|
+
-893.0, 2969.0, -1334.0, 1471.0, 728.0, // 2
|
709
|
+
1140.0, -1645.0, -462.0, 1202.0, 119.0, 881.0, 229.0, // 3
|
710
|
+
891.0, 711.0, 216.0, 601.0, -163.0, -426.0, -130.0, 217.0, -70.0, // 4
|
711
|
+
-230.0, 326.0, -96.0, 226.0, 58.0, -28.0, -44.0, -125.0, -122.0, -69.0, 51.0, // 5
|
712
|
+
61.0, 54.0, 3.0, -9.0, 99.0, -238.0, 14.0, -40.0, -18.0, 39.0, 13.0, -103.0, -52.0, // 6
|
713
|
+
73.0, -54.0, -50.0, 3.0, -14.0, 27.0, -14.0, -35.0, 5.0, -14.0, 29.0, 19.0, -17.0, 6.0, -21.0, // 7
|
714
|
+
11.0, 7.0, 8.0, -3.0, -15.0, -9.0, 6.0, 2.0, -14.0, 4.0, 5.0, -7.0, 17.0, 7.0, -5.0, 8.0, -19.0, // 8
|
715
|
+
8.0, 10.0, -20.0, 1.0, 14.0, -11.0, 5.0, 12.0, -3.0, 1.0, -2.0, -2.0, 9.0, 2.0, 10.0, 0.0, -2.0, -1.0, 2.0, // 9
|
716
|
+
-3.0, -4.0, 2.0, 2.0, 1.0, -5.0, 2.0, -2.0, 6.0, 6.0, -4.0, 4.0, 0.0, 0.0, -2.0, 1.0, 4.0, 3.0, 0.0, 0.0, -6.0, } // 10
|
717
|
+
};
|
718
|
+
template <class FloatT>
|
719
|
+
const typename MagneticFieldGeneric<FloatT>::model_t IGRF11Preset<FloatT>::IGRF30 = {
|
720
|
+
"IGRF30",
|
721
|
+
1930.0,
|
722
|
+
10,
|
723
|
+
{-30805.0, -2316.0, 5808.0, // 1
|
724
|
+
-951.0, 2980.0, -1424.0, 1517.0, 644.0, // 2
|
725
|
+
1172.0, -1692.0, -480.0, 1205.0, 133.0, 907.0, 166.0, // 3
|
726
|
+
896.0, 727.0, 205.0, 584.0, -195.0, -422.0, -109.0, 234.0, -90.0, // 4
|
727
|
+
-237.0, 327.0, -72.0, 218.0, 60.0, -32.0, -53.0, -131.0, -118.0, -74.0, 58.0, // 5
|
728
|
+
60.0, 53.0, 4.0, -9.0, 102.0, -242.0, 19.0, -32.0, -16.0, 32.0, 8.0, -104.0, -46.0, // 6
|
729
|
+
74.0, -54.0, -51.0, 4.0, -15.0, 25.0, -14.0, -34.0, 6.0, -12.0, 29.0, 18.0, -18.0, 6.0, -20.0, // 7
|
730
|
+
11.0, 7.0, 8.0, -3.0, -15.0, -9.0, 5.0, 2.0, -14.0, 5.0, 5.0, -6.0, 18.0, 8.0, -5.0, 8.0, -19.0, // 8
|
731
|
+
8.0, 10.0, -20.0, 1.0, 14.0, -12.0, 5.0, 12.0, -3.0, 1.0, -2.0, -2.0, 9.0, 3.0, 10.0, 0.0, -2.0, -2.0, 2.0, // 9
|
732
|
+
-3.0, -4.0, 2.0, 2.0, 1.0, -5.0, 2.0, -2.0, 6.0, 6.0, -4.0, 4.0, 0.0, 0.0, -2.0, 1.0, 4.0, 3.0, 0.0, 0.0, -6.0, } // 10
|
733
|
+
};
|
734
|
+
template <class FloatT>
|
735
|
+
const typename MagneticFieldGeneric<FloatT>::model_t IGRF11Preset<FloatT>::IGRF35 = {
|
736
|
+
"IGRF35",
|
737
|
+
1935.0,
|
738
|
+
10,
|
739
|
+
{-30715.0, -2306.0, 5812.0, // 1
|
740
|
+
-1018.0, 2984.0, -1520.0, 1550.0, 586.0, // 2
|
741
|
+
1206.0, -1740.0, -494.0, 1215.0, 146.0, 918.0, 101.0, // 3
|
742
|
+
903.0, 744.0, 188.0, 565.0, -226.0, -415.0, -90.0, 249.0, -114.0, // 4
|
743
|
+
-241.0, 329.0, -51.0, 211.0, 64.0, -33.0, -64.0, -136.0, -115.0, -76.0, 64.0, // 5
|
744
|
+
59.0, 53.0, 4.0, -8.0, 104.0, -246.0, 25.0, -25.0, -15.0, 25.0, 4.0, -106.0, -40.0, // 6
|
745
|
+
74.0, -53.0, -52.0, 4.0, -17.0, 23.0, -14.0, -33.0, 7.0, -11.0, 29.0, 18.0, -19.0, 6.0, -19.0, // 7
|
746
|
+
11.0, 7.0, 8.0, -3.0, -15.0, -9.0, 5.0, 1.0, -15.0, 6.0, 5.0, -6.0, 18.0, 8.0, -5.0, 7.0, -19.0, // 8
|
747
|
+
8.0, 10.0, -20.0, 1.0, 15.0, -12.0, 5.0, 11.0, -3.0, 1.0, -3.0, -2.0, 9.0, 3.0, 11.0, 0.0, -2.0, -2.0, 2.0, // 9
|
748
|
+
-3.0, -4.0, 2.0, 2.0, 1.0, -5.0, 2.0, -2.0, 6.0, 6.0, -4.0, 4.0, 0.0, 0.0, -1.0, 2.0, 4.0, 3.0, 0.0, 0.0, -6.0, } // 10
|
749
|
+
};
|
750
|
+
template <class FloatT>
|
751
|
+
const typename MagneticFieldGeneric<FloatT>::model_t IGRF11Preset<FloatT>::IGRF40 = {
|
752
|
+
"IGRF40",
|
753
|
+
1940.0,
|
754
|
+
10,
|
755
|
+
{-30654.0, -2292.0, 5821.0, // 1
|
756
|
+
-1106.0, 2981.0, -1614.0, 1566.0, 528.0, // 2
|
757
|
+
1240.0, -1790.0, -499.0, 1232.0, 163.0, 916.0, 43.0, // 3
|
758
|
+
914.0, 762.0, 169.0, 550.0, -252.0, -405.0, -72.0, 265.0, -141.0, // 4
|
759
|
+
-241.0, 334.0, -33.0, 208.0, 71.0, -33.0, -75.0, -141.0, -113.0, -76.0, 69.0, // 5
|
760
|
+
57.0, 54.0, 4.0, -7.0, 105.0, -249.0, 33.0, -18.0, -15.0, 18.0, 0.0, -107.0, -33.0, // 6
|
761
|
+
74.0, -53.0, -52.0, 4.0, -18.0, 20.0, -14.0, -31.0, 7.0, -9.0, 29.0, 17.0, -20.0, 5.0, -19.0, // 7
|
762
|
+
11.0, 7.0, 8.0, -3.0, -14.0, -10.0, 5.0, 1.0, -15.0, 6.0, 5.0, -5.0, 19.0, 9.0, -5.0, 7.0, -19.0, // 8
|
763
|
+
8.0, 10.0, -21.0, 1.0, 15.0, -12.0, 5.0, 11.0, -3.0, 1.0, -3.0, -2.0, 9.0, 3.0, 11.0, 1.0, -2.0, -2.0, 2.0, // 9
|
764
|
+
-3.0, -4.0, 2.0, 2.0, 1.0, -5.0, 2.0, -2.0, 6.0, 6.0, -4.0, 4.0, 0.0, 0.0, -1.0, 2.0, 4.0, 3.0, 0.0, 0.0, -6.0, } // 10
|
765
|
+
};
|
766
|
+
|
767
|
+
template <class FloatT>
|
768
|
+
const typename MagneticFieldGeneric<FloatT>::model_t *IGRF11Generic<FloatT>::models[] = {
|
769
|
+
&preset_t::IGRF00,
|
770
|
+
&preset_t::IGRF05,
|
771
|
+
&preset_t::IGRF10,
|
772
|
+
&preset_t::IGRF15,
|
773
|
+
&preset_t::IGRF20,
|
774
|
+
&preset_t::IGRF25,
|
775
|
+
&preset_t::IGRF30,
|
776
|
+
&preset_t::IGRF35,
|
777
|
+
&preset_t::IGRF40,
|
778
|
+
&preset_t::DGRF45,
|
779
|
+
&preset_t::DGRF50,
|
780
|
+
&preset_t::DGRF55,
|
781
|
+
&preset_t::DGRF60,
|
782
|
+
&preset_t::DGRF65,
|
783
|
+
&preset_t::DGRF70,
|
784
|
+
&preset_t::DGRF75,
|
785
|
+
&preset_t::DGRF80,
|
786
|
+
&preset_t::DGRF85,
|
787
|
+
&preset_t::DGRF90,
|
788
|
+
&preset_t::DGRF95,
|
789
|
+
&preset_t::DGRF2000,
|
790
|
+
&preset_t::DGRF2005,
|
791
|
+
&preset_t::IGRF2010,
|
792
|
+
};
|
793
|
+
|
794
|
+
template <class FloatT>
|
795
|
+
const int IGRF11Generic<FloatT>::models_num = sizeof(models) / sizeof(models[0]);
|
796
|
+
|
797
|
+
template <class FloatT>
|
798
|
+
struct IGRF12Preset : public IGRF11Preset<FloatT> {
|
799
|
+
static const typename MagneticFieldGeneric<FloatT>::model_t DGRF2010;
|
800
|
+
static const typename MagneticFieldGeneric<FloatT>::model_t IGRF2015;
|
801
|
+
};
|
802
|
+
|
803
|
+
template <class FloatT>
|
804
|
+
struct IGRF12Generic : public MagneticFieldGeneric2<FloatT, IGRF12Generic>, public IGRF12Preset<FloatT> {
|
805
|
+
typedef IGRF12Preset<FloatT> preset_t;
|
806
|
+
static const typename MagneticFieldGeneric<FloatT>::model_t *models[];
|
807
|
+
static const int models_num;
|
808
|
+
};
|
809
|
+
|
810
|
+
typedef IGRF12Generic<double> IGRF12;
|
811
|
+
|
812
|
+
template <class FloatT>
|
813
|
+
const typename MagneticFieldGeneric<FloatT>::model_t IGRF12Preset<FloatT>::DGRF2010 = {
|
814
|
+
"DGRF2010",
|
815
|
+
2010.0,
|
816
|
+
13,
|
817
|
+
{-29496.57, -1586.42, 4944.26, // 1
|
818
|
+
-2396.06, 3026.34, -2708.54, 1668.17, -575.73, // 2
|
819
|
+
1339.85, -2326.54, -160.4, 1232.1, 251.75, 633.73, -537.03, // 3
|
820
|
+
912.66, 808.97, 286.48, 166.58, -211.03, -356.83, 164.46, 89.4, -309.72, // 4
|
821
|
+
-230.87, 357.29, 44.58, 200.26, 189.01, -141.05, -118.06, -163.17, -0.01, -8.03, 101.04, // 5
|
822
|
+
72.78, 68.69, -20.9, 75.92, 44.18, -141.4, 61.54, -22.83, -66.26, 13.1, 3.02, -78.09, 55.4, // 6
|
823
|
+
80.44, -75.0, -57.8, -4.55, -21.2, 45.24, 6.54, 14.0, 24.96, 10.46, 7.03, 1.64, -27.61, 4.92, -3.28, // 7
|
824
|
+
24.41, 8.21, 10.84, -14.5, -20.03, -5.59, 11.83, -19.34, -17.41, 11.61, 16.71, 10.85, 6.96, -14.05, -10.74, -3.54, 1.64, // 8
|
825
|
+
5.5, 9.45, -20.54, 3.45, 11.51, -5.27, 12.75, 3.13, -7.14, -12.38, -7.42, -0.76, 7.97, 8.43, 2.14, -8.42, -6.08, -10.08, 7.01, // 9
|
826
|
+
-1.94, -6.24, 2.73, 0.89, -0.1, -1.07, 4.71, -0.16, 4.44, 2.45, -7.22, -0.33, -0.96, 2.13, -3.95, 3.09, -1.99, -1.03, -1.97, -2.8, -8.31, // 10
|
827
|
+
3.05, -1.48, 0.13, -2.03, 1.67, 1.65, -0.66, -0.51, -1.76, 0.54, 0.85, -0.79, -0.39, 0.37, -2.51, 1.79, -1.27, 0.12, -2.11, 0.75, -1.94, 3.75, -1.86, // 11
|
828
|
+
-2.12, -0.21, -0.87, 0.3, 0.27, 1.04, 2.13, -0.63, -2.49, 0.95, 0.49, -0.11, 0.59, 0.52, 0.0, -0.39, 0.13, -0.37, 0.27, 0.21, -0.86, -0.77, -0.23, 0.04, 0.87, // 12
|
829
|
+
-0.09, -0.89, -0.87, 0.31, 0.3, 0.42, 1.66, -0.45, -0.59, 1.08, -1.14, -0.31, -0.07, 0.78, 0.54, -0.18, 0.1, 0.38, 0.49, 0.02, 0.44, 0.42, -0.25, -0.26, -0.53, -0.26, -0.79, } // 13
|
830
|
+
};
|
831
|
+
template <class FloatT>
|
832
|
+
const typename MagneticFieldGeneric<FloatT>::model_t IGRF12Preset<FloatT>::IGRF2015 = {
|
833
|
+
"IGRF2015",
|
834
|
+
2015.0,
|
835
|
+
13,
|
836
|
+
{-29442.0, -1501.0, 4797.1, // 1
|
837
|
+
-2445.1, 3012.9, -2845.6, 1676.7, -641.9, // 2
|
838
|
+
1350.7, -2352.3, -115.3, 1225.6, 244.9, 582.0, -538.4, // 3
|
839
|
+
907.6, 813.7, 283.3, 120.4, -188.7, -334.9, 180.9, 70.4, -329.5, // 4
|
840
|
+
-232.6, 360.1, 47.3, 192.4, 197.0, -140.9, -119.3, -157.5, 16.0, 4.1, 100.2, // 5
|
841
|
+
70.0, 67.7, -20.8, 72.7, 33.2, -129.9, 58.9, -28.9, -66.7, 13.2, 7.3, -70.9, 62.6, // 6
|
842
|
+
81.6, -76.1, -54.1, -6.8, -19.5, 51.8, 5.7, 15.0, 24.4, 9.4, 3.4, -2.8, -27.4, 6.8, -2.2, // 7
|
843
|
+
24.2, 8.8, 10.1, -16.9, -18.3, -3.2, 13.3, -20.6, -14.6, 13.4, 16.2, 11.7, 5.7, -15.9, -9.1, -2.0, 2.1, // 8
|
844
|
+
5.4, 8.8, -21.6, 3.1, 10.8, -3.3, 11.8, 0.7, -6.8, -13.3, -6.9, -0.1, 7.8, 8.7, 1.0, -9.1, -4.0, -10.5, 8.4, // 9
|
845
|
+
-1.9, -6.3, 3.2, 0.1, -0.4, 0.5, 4.6, -0.5, 4.4, 1.8, -7.9, -0.7, -0.6, 2.1, -4.2, 2.4, -2.8, -1.8, -1.2, -3.6, -8.7, // 10
|
846
|
+
3.1, -1.5, -0.1, -2.3, 2.0, 2.0, -0.7, -0.8, -1.1, 0.6, 0.8, -0.7, -0.2, 0.2, -2.2, 1.7, -1.4, -0.2, -2.5, 0.4, -2.0, 3.5, -2.4, // 11
|
847
|
+
-1.9, -0.2, -1.1, 0.4, 0.4, 1.2, 1.9, -0.8, -2.2, 0.9, 0.3, 0.1, 0.7, 0.5, -0.1, -0.3, 0.3, -0.4, 0.2, 0.2, -0.9, -0.9, -0.1, 0.0, 0.7, // 12
|
848
|
+
0.0, -0.9, -0.9, 0.4, 0.4, 0.5, 1.6, -0.5, -0.5, 1.0, -1.2, -0.2, -0.1, 0.8, 0.4, -0.1, -0.1, 0.3, 0.4, 0.1, 0.5, 0.5, -0.3, -0.4, -0.4, -0.3, -0.8, } // 13
|
849
|
+
};
|
850
|
+
|
851
|
+
template <class FloatT>
|
852
|
+
const typename MagneticFieldGeneric<FloatT>::model_t *IGRF12Generic<FloatT>::models[] = {
|
853
|
+
&preset_t::IGRF00,
|
854
|
+
&preset_t::IGRF05,
|
855
|
+
&preset_t::IGRF10,
|
856
|
+
&preset_t::IGRF15,
|
857
|
+
&preset_t::IGRF20,
|
858
|
+
&preset_t::IGRF25,
|
859
|
+
&preset_t::IGRF30,
|
860
|
+
&preset_t::IGRF35,
|
861
|
+
&preset_t::IGRF40,
|
862
|
+
&preset_t::DGRF45,
|
863
|
+
&preset_t::DGRF50,
|
864
|
+
&preset_t::DGRF55,
|
865
|
+
&preset_t::DGRF60,
|
866
|
+
&preset_t::DGRF65,
|
867
|
+
&preset_t::DGRF70,
|
868
|
+
&preset_t::DGRF75,
|
869
|
+
&preset_t::DGRF80,
|
870
|
+
&preset_t::DGRF85,
|
871
|
+
&preset_t::DGRF90,
|
872
|
+
&preset_t::DGRF95,
|
873
|
+
&preset_t::DGRF2000,
|
874
|
+
&preset_t::DGRF2005,
|
875
|
+
&preset_t::DGRF2010,
|
876
|
+
&preset_t::IGRF2015,
|
877
|
+
};
|
878
|
+
|
879
|
+
template <class FloatT>
|
880
|
+
const int IGRF12Generic<FloatT>::models_num = sizeof(models) / sizeof(models[0]);
|
881
|
+
|
882
|
+
/*
|
883
|
+
* WMM2010 is the standard model for the U.S. and U.K. Departments of Defense
|
884
|
+
* and for NATO, also used widely in civilian navigation systems. This is a
|
885
|
+
* degree and order 12 main field model for 2010.0 and degree and order 12
|
886
|
+
* secular variation model for 2010 - 2015. For more information on the WMM or
|
887
|
+
* to download the Technical Report, visit the WMM Web site at:
|
888
|
+
* http://www.ngdc.noaa.gov/geomag/WMM/
|
889
|
+
*/
|
890
|
+
|
891
|
+
template <class FloatT>
|
892
|
+
struct WMM2010Generic : public MagneticFieldGeneric<FloatT> {
|
893
|
+
static const typename MagneticFieldGeneric<FloatT>::model_t WMM;
|
894
|
+
|
895
|
+
static typename MagneticFieldGeneric<FloatT>::model_t get_model(const FloatT &year){
|
896
|
+
return WMM;
|
897
|
+
}
|
898
|
+
static typename MagneticFieldGeneric<FloatT>::latlng_t geomagnetic_latlng(
|
899
|
+
const FloatT &year,
|
900
|
+
const FloatT &geocentric_latitude, const FloatT &longitude){
|
901
|
+
return MagneticFieldGeneric<FloatT>::geomagnetic_latlng(
|
902
|
+
WMM,
|
903
|
+
geocentric_latitude, longitude);
|
904
|
+
}
|
905
|
+
};
|
906
|
+
|
907
|
+
typedef WMM2010Generic<double> WMM2010;
|
908
|
+
|
909
|
+
template <class FloatT>
|
910
|
+
const typename MagneticFieldGeneric<FloatT>::model_t WMM2010Generic<FloatT>::WMM = {
|
911
|
+
"WMM2010",
|
912
|
+
2010.0,
|
913
|
+
12,
|
914
|
+
{-29496.6, -1586.3, 4944.4, // 1
|
915
|
+
-2396.6, 3026.1, -2707.7, 1668.6, -576.1, // 2
|
916
|
+
1340.1, -2326.2, -160.2, 1231.9, 251.9, 634.0, -536.6, // 3
|
917
|
+
912.6, 808.9, 286.4, 166.7, -211.2, -357.1, 164.3, 89.4, -309.1, // 4
|
918
|
+
-230.9, 357.2, 44.6, 200.3, 188.9, -141.1, -118.2, -163.0, 0.0, -7.8, 100.9, // 5
|
919
|
+
72.8, 68.6, -20.8, 76.0, 44.1, -141.4, 61.5, -22.8, -66.3, 13.2, 3.1, -77.9, 55.0, // 6
|
920
|
+
80.5, -75.1, -57.9, -4.7, -21.1, 45.3, 6.5, 13.9, 24.9, 10.4, 7.0, 1.7, -27.7, 4.9, -3.3, // 7
|
921
|
+
24.4, 8.1, 11.0, -14.5, -20.0, -5.6, 11.9, -19.3, -17.4, 11.5, 16.7, 10.9, 7.0, -14.1, -10.8, -3.7, 1.7, // 8
|
922
|
+
5.4, 9.4, -20.5, 3.4, 11.5, -5.2, 12.8, 3.1, -7.2, -12.4, -7.4, -0.7, 8.0, 8.4, 2.1, -8.5, -6.1, -10.1, 7.0, // 9
|
923
|
+
-2.0, -6.3, 2.8, 0.9, -0.1, -1.1, 4.7, -0.2, 4.4, 2.5, -7.2, -0.3, -1.0, 2.2, -3.9, 3.1, -2.0, -1.0, -2.0, -2.8, -8.3, // 10
|
924
|
+
3.0, -1.5, 0.2, -2.1, 1.7, 1.7, -0.6, -0.5, -1.8, 0.5, 0.9, -0.8, -0.4, 0.4, -2.5, 1.8, -1.3, 0.1, -2.1, 0.7, -1.9, 3.8, -1.8, // 11
|
925
|
+
-2.2, -0.2, -0.9, 0.3, 0.3, 1.0, 2.1, -0.6, -2.5, 0.9, 0.5, -0.1, 0.6, 0.5, -0.0, -0.4, 0.1, -0.4, 0.3, 0.2, -0.9, -0.8, -0.2, 0.0, 0.9, } // 12
|
926
|
+
};
|
927
|
+
|
928
|
+
#endif /* __MAGNETIC_FIELD_H__ */
|