NeQuickIonoNavData_T.cpp
Go to the documentation of this file.
1 //==============================================================================
2 //
3 // This file is part of GNSSTk, the ARL:UT GNSS Toolkit.
4 //
5 // The GNSSTk is free software; you can redistribute it and/or modify
6 // it under the terms of the GNU Lesser General Public License as published
7 // by the Free Software Foundation; either version 3.0 of the License, or
8 // any later version.
9 //
10 // The GNSSTk is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU Lesser General Public License for more details.
14 //
15 // You should have received a copy of the GNU Lesser General Public
16 // License along with GNSSTk; if not, write to the Free Software Foundation,
17 // Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
18 //
19 // This software was developed by Applied Research Laboratories at the
20 // University of Texas at Austin.
21 // Copyright 2004-2022, The Board of Regents of The University of Texas System
22 //
23 //==============================================================================
24 
25 
26 //==============================================================================
27 //
28 // This software was developed by Applied Research Laboratories at the
29 // University of Texas at Austin, under contract to an agency or agencies
30 // within the U.S. Department of Defense. The U.S. Government retains all
31 // rights to use, duplicate, distribute, disclose, or release this software.
32 //
33 // Pursuant to DoD Directive 523024
34 //
35 // DISTRIBUTION STATEMENT A: This software has been approved for public
36 // release, distribution is unlimited.
37 //
38 //==============================================================================
39 
40 #include "TestUtil.hpp"
41 #include "NeQuickIonoNavData.hpp"
42 #include "MODIP.hpp"
43 #include "GalileoIonoEllipsoid.hpp"
44 #include "FreqConv.hpp"
45 #include "DebugTrace.hpp"
46 
49 {
50  // convert hour/month to a usable CivilTime object
51  int hr = trunc(hour);
52  double soh = (hour-hr)*3600;
53  int min = trunc(soh/60.0);
54  double sec = fmod(soh,60.0);
56  GNSSTK_ASSERT(fabs(ct.getUTHour()-hour) < 1e-7);
57  return ct;
58 }
59 
62 
65 {
66 public:
67  TestClass() = default;
68  gnsstk::NavDataPtr clone() const override
69  { return std::make_shared<TestClass>(*this); }
70 };
71 
73 {
74 public:
76 
78  unsigned constructorTest();
80  unsigned getEffIonoLevelTest();
82  unsigned constructor2Test();
84  unsigned legendreTest();
86  unsigned heightTest();
88  unsigned exosphereAdjustTest();
90  unsigned peakAmplitudesTest();
92  unsigned effSolarZenithAngleTest();
94  unsigned thicknessTest();
96  unsigned getTECTest();
98  unsigned getIonoCorrTest();
99 
101  class TestData
102  {
103  public:
104  TestData(double hour, int month, double iazr, double lon, double lat,
105  double cf, double tf)
106  : tAzr(iazr), tPos(lat,lon,0,gnsstk::Position::Geodetic, &galEll),
108  {
109  // Test data supplies Azr (effective sunspot count), but
110  // ModelParameters takes Az (effective ionization level)
111  // so convert for use.
112  tAz = tAzr + 408.99;
113  tAz = (((tAz * tAz) - 167273)/1123.6) + 63.7;
114  }
116  double tAzr;
117  double tAz;
119  double criticalFreq;
120  double transFactor;
121  };
122 
125  {
126  public:
127  TestDataHeight(double tf, double cfF2, double cfE, double h)
128  : transFactor(tf), criticalFreqF2(cfF2), criticalFreqE(cfE),
129  height(h)
130  {}
131  double transFactor;
134  double height;
135  };
136 
142  {
143  public:
144  TestDataExosphere(double ed, double iazr, double h, double b, double hr,
145  int mn, double t)
146  : electronDensity(ed), tAzr(iazr), height(h), bottom(b), hour(hr),
147  month(mn), top(t)
148  {
149  }
151  double tAzr;
152  double height;
153  double bottom;
154  double hour;
155  int month;
156  double top;
157  };
158 
161  {
162  public:
163  TestDataAmplitude(double edF2, double phF2, double ptF2, double cfF1,
164  double edF1, double phF1, double ptF1, double edE,
165  double phE, double ptE, double eA1, double eA2,
166  double eA3)
167  : electronDensityF2(edF2), peakHeightF2(phF2), peakThickBotF2(ptF2),
168  critFreqF1(cfF1), electronDensityF1(edF1), peakHeightF1(phF1),
169  peakThickBotF1(ptF1), electronDensityE(edE), peakHeightE(phE),
170  peakThickTopE(ptE), expA1(eA1), expA2(eA2), expA3(eA3)
171  {}
173  double peakHeightF2;
175  double critFreqF1;
177  double peakHeightF1;
180  double peakHeightE; // EU test data specifies this but it's a constant.
182  double expA1;
183  double expA2;
184  double expA3;
185  };
186 
189  {
190  public:
191  TestDataSolar(double lon, double lat, double hour, int month,
192  double expect)
193  : pos(lat,lon,0,gnsstk::Position::Geodetic, &galEll),
194  ct(convertTime(hour,month)), expAngle(expect)
195  {}
198  double expAngle;
199  };
200 
203  {
204  public:
205  TestDataCritFreqE(double az, double lon, double lat, double hour,
206  int month, double expect)
207  : tAz(az), pos(lat,lon,0,gnsstk::Position::Geodetic, &galEll),
208  ct(convertTime(hour,month)), expFreq(expect)
209  {
210  }
211  double tAz;
214  double expFreq;
215  };
216 
219  {
220  public:
221  TestDataAz(const std::vector<double>& coeff, double mdl, double expect)
222  : coefficients(coeff), modip(mdl), expAz(expect)
223  {}
224  std::vector<double> coefficients;
225  double modip;
226  double expAz;
227  };
228 
231  {
232  public:
233  TestDataThickness(double tf, double cf, double ed, double ph,
234  double pttf2, double ptbf2, double pttf1, double ptbf1,
235  double ptte, double ptbe)
236  : transFactor(tf), critFreqF2(cf), electronDensityF2(ed),
237  peakHeightF2(ph), peakThickTopF2(pttf2), peakThickBotF2(ptbf2),
238  peakThickTopF1(pttf1), peakThickBotF1(ptbf1), peakThickTopE(ptte),
239  peakThickBotE(ptbe)
240  {}
241  double transFactor;
242  double critFreqF2;
244  double peakHeightF2;
245  // There is no top for F2 layer, but the EU code specifies
246  // thickness in pairs of top/bottom, and in the interest of
247  // maintaining consistency with the original test code, it's
248  // here.
254  double peakThickBotE; // EU test data specifies this but it's a constant.
255  };
256 
259  {
260  public:
261  TestDataTEC(const std::vector<double>& coeff,
262  int month, double hour,
263  double stalon, double stalat, double stah,
264  double satlon, double satlat, double sath,
265  double expect)
266  : coefficients(coeff),
268  station(stalat, stalon, stah, gnsstk::Position::Geodetic, &galEll),
269  satellite(satlat, satlon, sath, gnsstk::Position::Geodetic,
270  &galEll),
271  expTEC(expect)
272  {}
273  std::vector<double> coefficients;
277  double expTEC;
278  };
279 
281  static const TestData testData[];
289  static const TestDataSolar testDataSolar[];
293  static const std::vector<double> highSolarCoeff;
295  static const std::vector<double> mediumSolarCoeff;
297  static const std::vector<double> lowSolarCoeff;
299  static const TestDataAz testDataAz[];
303  static const TestDataTEC testDataTEC[];
309  static const double criticalFreqEps;
311  static const double transFactorEps;
313  static const double amplitudeEps;
315  static const double solarEps;
317  static const double azEps;
319  static const double thicknessEps;
321  static const double docEps;
323  static const double ionoSpotsEps;
324 };
325 
326 
327 // epsilons (thresholds) and test data pulled from
328 // NeQuickG_JRC_iono_F2_layer_test.c
329 // NeQuickG_JRC_iono_layer_amplitudes_test.c
330 // NeQuickG_JRC_Az_test.c
331 // NeQuickG_JRC_iono_layer_thickness_test.c
332 const double NeQuickIonoNavData_T::criticalFreqEps = 1e-5;
333 const double NeQuickIonoNavData_T::transFactorEps = 1e-5;
334 const double NeQuickIonoNavData_T::amplitudeEps = 1e-5;
335 const double NeQuickIonoNavData_T::solarEps = 1e-5;
336 const double NeQuickIonoNavData_T::azEps = 1e-6;
337 const double NeQuickIonoNavData_T::thicknessEps = 1e-5;
338 // precision is not great, but this is the level of precision that is
339 // supplied in the truth table in Annex E.1, plus fudge factor for
340 // accumulated differences that particularly show up in
341 // integrateGaussKronrod as it adds large numbers together.
342 const double NeQuickIonoNavData_T::docEps = 4e-2;
343 const double NeQuickIonoNavData_T::ionoSpotsEps = 1e-13;
344 
346 {
347  {
348  0.0, 4,
349  186.328060298,
350  297.438314733,
351  82.481346266,
352  6.575612801,
353  2.366982653
354  },
355  {
356  2.666667, 4,
357  186.328060298,
358  378.105699987,
359  74.653105616,
360  6.289174069,
361  2.375445167
362  },
363  {
364  10.500000, 4,
365  203.036737976,
366  31.022679098,
367  -8.649092730,
368  16.638422783,
369  2.244593590
370  },
371 };
372 
373 
375 {
376  {
377  2.366982653,
378  6.575612801,
379  2.409694059,
380  412.551921084
381  },
382 };
383 
384 
387 {
388  {
389  5.361596779,
390  186.328060298,
391  412.551921084,
392  45.987213389,
393  0.0, 4,
394  50.657704983
395  },
396 };
397 
398 
401 {
402  {
403  5.361596779,
404  412.551921084,
405  45.987213389,
406 
407  3.373571683,
408  1.411242252,
409  266.275960542,
410  73.137980271,
411 
412  0.720021557,
413  120.000000000,
414  73.137980271,
415 
416  21.446387117,
417  1.310172197,
418  2.182239112,
419  },
420  {
421  5.107156754,
422  429.080085583,
423  46.507547598,
424 
425  0.000000000,
426  0.000000000,
427  274.540042792,
428  77.270021396,
429 
430  0.466645104,
431  120.000000000,
432  77.270021396,
433 
434  20.428627016,
435  0.000000000,
436  1.760670936
437  }
438 };
439 
440 
444 {
445  {
446  297.438315, 82.481346,
447  0.000000, 4,
448  82.978526
449  },
450  {
451  139.790965, 26.595660,
452  0.833333, 4,
453  30.664744
454  },
455  {
456  298.035128, 82.566581,
457  12.0, 4,
458  76.209610
459  },
460  {
461  260.236348, 35.803032,
462  23.833333, 4,
463  74.148769
464  },
465  {
466  114.989502, -50.092818,
467  23.833333, 4,
468  83.933196
469  },
470 };
471 
472 
476 {
477  {
478  230.245562,
479  297.438315, 82.481346,
480  0.0, 4,
481  2.409694
482  },
483  {
484  248.199580,
485  40.173216, -3.023059,
486  1.0, 4,
487  0.726159
488  },
489  {
490  285.871846,
491  137.301902, -82.090099,
492  11.0, 4,
493  0.971728
494  },
495 };
496 
497 
498 const std::vector<double> NeQuickIonoNavData_T::highSolarCoeff
499 {236.831641, -0.39362878, 0.00402826613};
500 
501 const std::vector<double> NeQuickIonoNavData_T::mediumSolarCoeff
502 {121.129893, 0.351254133, 0.0134635348};
503 
504 const std::vector<double> NeQuickIonoNavData_T::lowSolarCoeff
505 {2.580271, 0.127628236, 0.0252748384};
506 
507 
509 {
510  { highSolarCoeff, 76.284073, 230.245562 },
511  { mediumSolarCoeff, 76.284073, 226.272795 },
512  { lowSolarCoeff, 76.284073, 159.397123 },
513  { highSolarCoeff, 19.528774, 230.680826 },
514  { mediumSolarCoeff, 19.528774, 133.124084 },
515  { lowSolarCoeff, 19.528774, 14.711835 },
516  { highSolarCoeff, 47.857688, 227.219650 },
517  { mediumSolarCoeff, 47.857688, 168.776422 },
518  { lowSolarCoeff, 47.857688, 66.576699 },
519  { highSolarCoeff, -23.316310, 248.199580 },
520  { mediumSolarCoeff, -23.316310, 120.259398 },
521  { lowSolarCoeff, -23.316310, 13.345125 },
522  { highSolarCoeff, -71.811295, 285.871846 },
523  { mediumSolarCoeff, -71.811295, 165.335471 },
524  { lowSolarCoeff, -71.811295, 123.753978 },
525  { highSolarCoeff, 46.487417, 227.238261 },
526  { mediumSolarCoeff, 46.487417, 166.554565 },
527  { lowSolarCoeff, 46.487417, 63.134324 },
528  { highSolarCoeff, 33.054571, 228.221713 },
529  { mediumSolarCoeff, 33.054571, 147.450769 },
530  { lowSolarCoeff, 33.054571, 34.414374 },
531  { highSolarCoeff, -51.379818, 267.690378 },
532  { mediumSolarCoeff, -51.379818, 138.624713 },
533  { lowSolarCoeff, -51.379818, 62.745440 }
534 };
535 
536 
539 {
540  {
541  2.366982653,
542  6.5756128,
543  5.361596779,
544  412.551921084,
545  0.0, 45.987213389,
546  43.882788163, 73.137980271,
547  73.137980271, 5.000000000,
548  },
549 };
550 
551 
554 {
555  // pulled from Annex E of galileo:iono
556  {highSolarCoeff,4,0,297.66,82.49,78.11,8.23,54.29,20281546.18,20.40},
557  {highSolarCoeff,4,0,297.66,82.49,78.11,-158.03,24.05,20275295.43,53.45},
558  {highSolarCoeff,4,0,297.66,82.49,78.11,-30.86,41.04,19953770.93,25.91},
559  {highSolarCoeff,4,4,297.66,82.49,78.11,-85.72,53.69,20544786.65,18.78},
560  {highSolarCoeff,4,4,297.66,82.49,78.11,-130.77,54.40,20121312.46,20.00},
561  {highSolarCoeff,4,4,297.66,82.49,78.11,140.68,35.85,19953735.00,37.81},
562  {highSolarCoeff,4,8,297.66,82.49,78.11,-126.28,51.26,20513440.10,21.31},
563  {highSolarCoeff,4,8,297.66,82.49,78.11,84.26,54.68,20305726.79,27.72},
564  {highSolarCoeff,4,8,297.66,82.49,78.11,-96.21,37.33,19956072.48,24.13},
565  {highSolarCoeff,4,12,297.66,82.49,78.11,81.09,35.20,20278071.03,49.30},
566  {highSolarCoeff,4,12,297.66,82.49,78.11,175.57,51.89,19995445.72,26.61},
567  {highSolarCoeff,4,12,297.66,82.49,78.11,4.25,53.43,20107681.66,29.21},
568  {highSolarCoeff,4,16,297.66,82.49,78.11,14.89,32.88,20636367.33,37.95},
569  {highSolarCoeff,4,16,297.66,82.49,78.11,-70.26,50.63,20043030.82,23.93},
570  {highSolarCoeff,4,16,297.66,82.49,78.11,-130.60,49.21,20288021.34,26.97},
571  {highSolarCoeff,4,20,297.66,82.49,78.11,-52.46,24.28,19831557.96,48.45},
572  {highSolarCoeff,4,20,297.66,82.49,78.11,-165.78,35.06,20196268.24,41.71},
573  {highSolarCoeff,4,20,297.66,82.49,78.11,168.73,52.58,20288372.95,27.79},
574  {highSolarCoeff,4,0,307.19,5.25,-25.76,-89.48,-29.05,20081457.33,240.59},
575  {highSolarCoeff,4,0,307.19,5.25,-25.76,-46.73,-24.08,19975517.42,152.19},
576  {highSolarCoeff,4,0,307.19,5.25,-25.76,-99.26,34.47,20275286.46,204.92},
577  {highSolarCoeff,4,4,307.19,5.25,-25.76,-46.61,54.84,20258938.89,124.39},
578  {highSolarCoeff,4,4,307.19,5.25,-25.76,-85.72,53.68,20544786.61,140.16},
579  {highSolarCoeff,4,4,307.19,5.25,-25.76,-18.13,14.17,20267783.18,95.52},
580  {highSolarCoeff,4,8,307.19,5.25,-25.76,7.14,-19.55,20226657.45,26.47},
581  {highSolarCoeff,4,8,307.19,5.25,-25.76,-48.38,-31.04,20069586.93,21.34},
582  {highSolarCoeff,4,8,307.19,5.25,-25.76,-58.59,21.93,20008556.82,21.68},
583  {highSolarCoeff,4,12,307.19,5.25,-25.76,-102.83,-40.74,20153844.84,169.86},
584  {highSolarCoeff,4,12,307.19,5.25,-25.76,-0.60,10.75,20272829.17,178.43},
585  {highSolarCoeff,4,12,307.19,5.25,-25.76,-120.35,11.00,20283503.35,146.95},
586  {highSolarCoeff,4,16,307.19,5.25,-25.76,-70.26,50.63,20043030.72,198.43},
587  {highSolarCoeff,4,16,307.19,5.25,-25.76,-72.73,-9.78,19936049.27,149.02},
588  {highSolarCoeff,4,16,307.19,5.25,-25.76,-66.77,2.37,19986966.89,133.16},
589  {highSolarCoeff,4,20,307.19,5.25,-25.76,-1.57,-7.90,20373709.74,255.31},
590  {highSolarCoeff,4,20,307.19,5.25,-25.76,0.44,50.83,19975412.45,292.41},
591  {highSolarCoeff,4,20,307.19,5.25,-25.76,10.94,44.72,20450566.19,336.74},
592  {mediumSolarCoeff,4,0,40.19,-3.00,-23.32,76.65,-41.43,20157673.93,18.26},
593  {mediumSolarCoeff,4,0,40.19,-3.00,-23.32,-13.11,-4.67,20194168.22,35.84},
594  {mediumSolarCoeff,4,0,40.19,-3.00,-23.32,26.31,-39.04,20671871.64,17.18},
595  {mediumSolarCoeff,4,4,40.19,-3.00,-23.32,79.33,-55.34,20679595.44,36.00},
596  {mediumSolarCoeff,4,4,40.19,-3.00,-23.32,107.19,-10.65,19943686.06,76.77},
597  {mediumSolarCoeff,4,4,40.19,-3.00,-23.32,56.35,47.54,20322471.38,38.01},
598  {mediumSolarCoeff,4,8,40.19,-3.00,-23.32,7.14,-19.55,20226657.34,69.17},
599  {mediumSolarCoeff,4,8,40.19,-3.00,-23.32,51.96,-1.90,20218595.37,59.53},
600  {mediumSolarCoeff,4,8,40.19,-3.00,-23.32,89.22,-40.56,20055109.63,101.26},
601  {mediumSolarCoeff,4,12,40.19,-3.00,-23.32,90.78,-28.26,20081398.25,127.83},
602  {mediumSolarCoeff,4,12,40.19,-3.00,-23.32,35.75,-14.88,20010521.91,81.34},
603  {mediumSolarCoeff,4,12,40.19,-3.00,-23.32,81.09,35.20,20278071.09,113.92},
604  {mediumSolarCoeff,4,16,40.19,-3.00,-23.32,14.89,32.88,20636367.52,91.07},
605  {mediumSolarCoeff,4,16,40.19,-3.00,-23.32,2.04,11.23,20394926.95,96.70},
606  {mediumSolarCoeff,4,16,40.19,-3.00,-23.32,22.79,-35.87,20125991.19,71.45},
607  {mediumSolarCoeff,4,20,40.19,-3.00,-23.32,54.11,3.15,20251696.28,48.06},
608  {mediumSolarCoeff,4,20,40.19,-3.00,-23.32,95.06,17.94,20246498.07,77.64},
609  {mediumSolarCoeff,4,20,40.19,-3.00,-23.32,-1.81,-52.00,20332764.38,50.10},
610  {mediumSolarCoeff,4,0,115.89,-31.80,12.78,119.90,-8.76,19941513.27,24.84},
611  {mediumSolarCoeff,4,0,115.89,-31.80,12.78,165.14,-13.93,20181976.57,43.94},
612  {mediumSolarCoeff,4,0,115.89,-31.80,12.78,76.65,-41.43,20157673.77,19.90},
613  {mediumSolarCoeff,4,4,115.89,-31.80,12.78,107.19,-10.65,19943685.24,46.25},
614  {mediumSolarCoeff,4,4,115.89,-31.80,12.78,79.33,-55.34,20679595.29,46.10},
615  {mediumSolarCoeff,4,4,115.89,-31.80,12.78,64.90,-17.58,20177185.06,64.59},
616  {mediumSolarCoeff,4,8,115.89,-31.80,12.78,127.35,23.46,19837695.71,88.58},
617  {mediumSolarCoeff,4,8,115.89,-31.80,12.78,89.22,-40.56,20055109.56,40.62},
618  {mediumSolarCoeff,4,8,115.89,-31.80,12.78,148.31,-29.93,20109263.99,40.82},
619  {mediumSolarCoeff,4,12,115.89,-31.80,12.78,90.78,-28.26,20081398.25,14.48},
620  {mediumSolarCoeff,4,12,115.89,-31.80,12.78,133.47,-24.87,19975574.41,13.63},
621  {mediumSolarCoeff,4,12,115.89,-31.80,12.78,166.97,-3.87,20196778.56,27.69},
622  {mediumSolarCoeff,4,16,115.89,-31.80,12.78,124.09,-14.31,20100697.90,6.96},
623  {mediumSolarCoeff,4,16,115.89,-31.80,12.78,154.31,-45.19,20116286.17,7.48},
624  {mediumSolarCoeff,4,16,115.89,-31.80,12.78,-167.50,-43.24,20095343.13,13.87},
625  {mediumSolarCoeff,4,20,115.89,-31.80,12.78,131.65,-31.56,20066111.12,4.36},
626  {mediumSolarCoeff,4,20,115.89,-31.80,12.78,115.68,-52.78,20231909.06,4.35},
627  {mediumSolarCoeff,4,20,115.89,-31.80,12.78,50.87,-50.69,20186511.77,6.97},
628  {lowSolarCoeff,4,0,141.13,39.14,117.00,165.14,-13.93,20181976.50,36.44},
629  {lowSolarCoeff,4,0,141.13,39.14,117.00,85.59,36.64,20015444.79,14.24},
630  {lowSolarCoeff,4,0,141.13,39.14,117.00,119.90,-8.76,19941513.27,23.54},
631  {lowSolarCoeff,4,4,141.13,39.14,117.00,107.19,-10.65,19943685.88,77.49},
632  {lowSolarCoeff,4,4,141.13,39.14,117.00,38.39,51.98,20457198.52,29.28},
633  {lowSolarCoeff,4,4,141.13,39.14,117.00,-130.77,54.40,20121312.41,23.02},
634  {lowSolarCoeff,4,8,141.13,39.14,117.00,179.50,51.35,19967933.94,13.62},
635  {lowSolarCoeff,4,8,141.13,39.14,117.00,97.28,21.46,19941941.52,24.28},
636  {lowSolarCoeff,4,8,141.13,39.14,117.00,84.26,54.68,20305726.98,15.90},
637  {lowSolarCoeff,4,12,141.13,39.14,117.00,62.65,54.77,20370905.24,16.33},
638  {lowSolarCoeff,4,12,141.13,39.14,117.00,115.63,-1.28,20165065.92,11.05},
639  {lowSolarCoeff,4,12,141.13,39.14,117.00,81.09,35.20,20278071.22,14.25},
640  {lowSolarCoeff,4,16,141.13,39.14,117.00,124.09,-14.31,20100698.19,8.12},
641  {lowSolarCoeff,4,16,141.13,39.14,117.00,-130.60,49.21,20288020.98,6.45},
642  {lowSolarCoeff,4,16,141.13,39.14,117.00,161.97,13.35,20265041.53,4.69},
643  {lowSolarCoeff,4,20,141.13,39.14,117.00,84.18,36.59,19953853.27,6.06},
644  {lowSolarCoeff,4,20,141.13,39.14,117.00,54.67,51.65,20511861.27,8.28},
645  {lowSolarCoeff,4,20,141.13,39.14,117.00,-136.92,46.53,20309713.36,10.78},
646  {lowSolarCoeff,4,0,204.54,19.80,3754.69,165.14,-13.93,20181976.58,94.98},
647  {lowSolarCoeff,4,0,204.54,19.80,3754.69,179.32,9.92,20274303.54,60.87},
648  {lowSolarCoeff,4,0,204.54,19.80,3754.69,-144.16,-15.44,20007317.84,72.83},
649  {lowSolarCoeff,4,4,204.54,19.80,3754.69,-130.77,54.40,20121312.45,30.77},
650  {lowSolarCoeff,4,4,204.54,19.80,3754.69,-99.26,37.44,20066769.88,36.18},
651  {lowSolarCoeff,4,4,204.54,19.80,3754.69,-85.72,53.69,20544786.60,37.25},
652  {lowSolarCoeff,4,8,204.54,19.80,3754.69,178.35,-7.05,20372509.81,1.62},
653  {lowSolarCoeff,4,8,204.54,19.80,3754.69,-125.97,2.30,20251559.90,0.12},
654  {lowSolarCoeff,4,8,204.54,19.80,3754.69,179.50,51.35,19967934.29,0.56},
655  {lowSolarCoeff,4,12,204.54,19.80,3754.69,158.88,-12.61,20145417.20,1.77},
656  {lowSolarCoeff,4,12,204.54,19.80,3754.69,-146.53,22.03,20069033.97,0.64},
657  {lowSolarCoeff,4,12,204.54,19.80,3754.69,-153.30,-39.75,20672066.87,2.99},
658  {lowSolarCoeff,4,16,204.54,19.80,3754.69,-140.58,51.70,20455387.61,2.16},
659  {lowSolarCoeff,4,16,204.54,19.80,3754.69,-167.50,-43.24,20095343.11,3.11},
660  {lowSolarCoeff,4,16,204.54,19.80,3754.69,-164.50,27.08,20494802.61,1.22},
661  {lowSolarCoeff,4,20,204.54,19.80,3754.69,-172.71,-20.37,20225145.06,24.53},
662  {lowSolarCoeff,4,20,204.54,19.80,3754.69,-136.92,46.53,20309713.37,13.14},
663  {lowSolarCoeff,4,20,204.54,19.80,3754.69,-82.52,20.64,19937791.48,38.20},
664  // created to test vertical TEC which the provided truth seems to ignore
665  {highSolarCoeff,4,12,257.17,-40.74,-25.76,257.17,-40.74,20153844.84,14.08},
666 };
667 
668 
671 {
672 }
673 
674 
677 {
678  TUDEF("NeQuickIonoNavData", "NeQuickIonoNavData()");
679  TestClass uut;
680  TUASSERTFE(0.0, uut.ai[0]);
681  TUASSERTFE(0.0, uut.ai[1]);
682  TUASSERTFE(0.0, uut.ai[2]);
683  TUASSERTE(bool, false, uut.idf[0]);
684  TUASSERTE(bool, false, uut.idf[1]);
685  TUASSERTE(bool, false, uut.idf[2]);
686  TUASSERTE(bool, false, uut.idf[3]);
687  TUASSERTE(bool, false, uut.idf[4]);
688  TURETURN();
689 }
690 
691 
694 {
695  TUDEF("NeQuickIonoNavData", "getEffIonoLevel");
696  unsigned numTests = sizeof(testDataAz)/sizeof(testDataAz[0]);
697  TestClass uut;
698  for (unsigned testNum = 0; testNum < numTests; testNum++)
699  {
700  const TestDataAz& td(testDataAz[testNum]);
701  uut.ai[0] = td.coefficients[0];
702  uut.ai[1] = td.coefficients[1];
703  uut.ai[2] = td.coefficients[2];
704  TUASSERTFEPS(td.expAz, uut.getEffIonoLevel(td.modip), azEps);
705  }
706  TURETURN();
707 }
708 
711 {
712  TUDEF("NeQuickIonoNavData::ModelParameters", "constructor");
713  unsigned numTests = sizeof(testDataCFE)/sizeof(testDataCFE[0]);
714  for (unsigned testNum = 0; testNum < numTests; testNum++)
715  {
716  const TestDataCritFreqE& td(testDataCFE[testNum]);
718  0, td.pos, td.tAz, ccir, td.ct);
720  }
721  TURETURN();
722 }
723 
724 
727 {
728  TUDEF("NeQuickIonoNavData::ModelParameters", "legendre");
729  unsigned numTests = sizeof(testData)/sizeof(testData[0]);
730  for (unsigned testNum = 0; testNum < numTests; testNum++)
731  {
732  const TestData& td(testData[testNum]);
733  double modip_u = modip.stModip(td.tPos);
735  modip_u, td.tPos, td.tAz, ccir, td.ct);
736  // sanity check
740  }
741  TURETURN();
742 }
743 
744 
747 {
748  TUDEF("NeQuickIonoNavData::ModelParameters", "height");
749  unsigned numTests = sizeof(testDataHeight)/sizeof(testDataHeight[0]);
750  for (unsigned testNum = 0; testNum < numTests; testNum++)
751  {
752  const TestDataHeight& td(testDataHeight[testNum]);
754  uut.fM3000F2 = td.transFactor;
755  uut.ffoF2 = td.criticalFreqF2;
756  uut.ffoE = td.criticalFreqE;
757  TUCATCH(uut.height());
759  }
760  TURETURN();
761 }
762 
763 
766 {
767  TUDEF("NeQuickIonoNavData::ModelParameters", "exosphereAdjust");
768  unsigned numTests = sizeof(testDataExosphere)/sizeof(testDataExosphere[0]);
769  for (unsigned testNum = 0; testNum < numTests; testNum++)
770  {
771  const TestDataExosphere& td(testDataExosphere[testNum]);
773  uut.fNmF2 = td.electronDensity;
774  uut.fB2bot = td.bottom;
775  uut.fhmF2 = td.height;
776  uut.fAzr = td.tAzr;
777  TUCATCH(uut.exosphereAdjust(td.month));
779  }
780  TURETURN();
781 }
782 
783 
786 {
787  TUDEF("NeQuickIonoNavData::ModelParameters", "peakAmplitudes");
788  unsigned numTests = sizeof(testDataAmplitude)/sizeof(testDataAmplitude[0]);
789  for (unsigned testNum = 0; testNum < numTests; testNum++)
790  {
791  const TestDataAmplitude& td(testDataAmplitude[testNum]);
793  uut.fNmE = td.electronDensityE;
794  uut.fBEtop = td.peakThickTopE;
795  uut.ffoF1 = td.critFreqF1;
796  uut.fNmF1 = td.electronDensityF1;
797  uut.fhmF1 = td.peakHeightF1;
798  uut.fB1bot = td.peakThickBotF1;
799  uut.fNmF2 = td.electronDensityF2;
800  uut.fhmF2 = td.peakHeightF2;
801  uut.fB2bot = td.peakThickBotF2;
802  TUCATCH(uut.peakAmplitudes());
803  TUASSERTFEPS(td.expA1, uut.fA[0], amplitudeEps);
804  TUASSERTFEPS(td.expA2, uut.fA[1], amplitudeEps);
805  TUASSERTFEPS(td.expA3, uut.fA[2], amplitudeEps);
806  }
807  TURETURN();
808 }
809 
810 
813 {
814  TUDEF("NeQuickIonoNavData::ModelParameters", "effSolarZenithAngle");
815  unsigned numTests = sizeof(testDataSolar)/sizeof(testDataSolar[0]);
816  for (unsigned testNum = 0; testNum < numTests; testNum++)
817  {
818  const TestDataSolar& td(testDataSolar[testNum]);
820  gnsstk::Angle rv = uut.effSolarZenithAngle(td.pos, td.ct);
821  TUASSERTFEPS(td.expAngle, rv.deg(), solarEps);
822  }
823  TURETURN();
824 }
825 
826 
829 {
830  TUDEF("NeQuickIonoNavData::ModelParameters", "thickness");
831  unsigned numTests = sizeof(testDataThickness)/sizeof(testDataThickness[0]);
833  constexpr double hmE = 120.0; //eq.78
834  for (unsigned testNum = 0; testNum < numTests; testNum++)
835  {
836  const TestDataThickness& td(testDataThickness[testNum]);
838  uut.fM3000F2 = td.transFactor;
839  uut.ffoF2 = td.critFreqF2;
840  uut.fNmF2 = td.electronDensityF2;
841  uut.fhmF2 = td.peakHeightF2;
842  // normally set in height() method
843  uut.fhmF1 = (uut.fhmF2+hmE) / 2.0; //eq.79
844  TUCATCH(uut.thickness());
849  }
850  TURETURN();
851 }
852 
853 
856 {
857  using namespace std;
858  TUDEF("NeQuickIonoNavData::ModelParameters", "getTEC");
859  unsigned numTests = sizeof(testDataTEC)/sizeof(testDataTEC[0]);
860  TestClass uut;
862  constexpr double hmE = 120.0; //eq.78
863  for (unsigned testNum = 0; testNum < numTests; testNum++)
864  {
865  const TestDataTEC& td(testDataTEC[testNum]);
866  uut.ai[0] = td.coefficients[0];
867  uut.ai[1] = td.coefficients[1];
868  uut.ai[2] = td.coefficients[2];
869 /*
870  cerr << "getTEC #" << testNum << " for "
871  << fixed << setprecision(6) << uut.ai[0] << " "
872  << setprecision(8) << uut.ai[1] << " "
873  << setprecision(11) << uut.ai[2] << " "
874  << td.ct.month << " " << setprecision(0) << td.ct.getUTHour() << " "
875  << setprecision(2) << td.station.longitude() << " "
876  << td.station.geodeticLatitude() << " "
877  << td.station.height() << " "
878  << td.satellite.longitude() << " "
879  << td.satellite.geodeticLatitude() << " "
880  << td.satellite.height() << endl;
881 */
882  TUASSERTFEPS(td.expTEC, uut.getTEC(td.ct, td.station, td.satellite),
883  docEps);
884  }
885  TURETURN();
886 }
887 
888 
889 inline double getFactor(gnsstk::CarrierBand band)
890 {
891  double freq = gnsstk::getFrequency(band);
892  return 40.3 / (freq*freq);
893 }
894 
897 {
898  using namespace std;
899  TUDEF("NeQuickIonoNavData::ModelParameters", "getIonoCorr");
900  unsigned numTests = sizeof(testDataTEC)/sizeof(testDataTEC[0]);
901  TestClass uut;
903  constexpr double hmE = 120.0; //eq.78
904  gnsstk::CarrierBand band;
905  double expCorr;
906  // Only testing two carrier bands to make sure the formula
907  // works. The code is too slow for more thorough testing.
908  const double factorL1 = getFactor(gnsstk::CarrierBand::L1);
909  const double factorL5 = getFactor(gnsstk::CarrierBand::L5);
910  for (unsigned testNum = 0; testNum < numTests; testNum++)
911  {
912  const TestDataTEC& td(testDataTEC[testNum]);
913  uut.ai[0] = td.coefficients[0];
914  uut.ai[1] = td.coefficients[1];
915  uut.ai[2] = td.coefficients[2];
916  // test L1
918  expCorr = td.expTEC * factorL1 * 1e16;
919  TUASSERTFEPS(expCorr, uut.getIonoCorr(td.ct, td.station, td.satellite,
920  band),
921  docEps);
922  // test L5
924  expCorr = td.expTEC * factorL5 * 1e16;
925  TUASSERTFEPS(expCorr, uut.getIonoCorr(td.ct, td.station, td.satellite,
926  band),
927  docEps);
928  }
929  TURETURN();
930 }
931 
932 
933 int main(int argc, char *argv[])
934 {
935  NeQuickIonoNavData_T testClass;
936  unsigned errorTotal = 0;
937 
938  errorTotal += testClass.constructorTest();
939  errorTotal += testClass.getEffIonoLevelTest();
940  errorTotal += testClass.constructor2Test();
941  errorTotal += testClass.legendreTest();
942  errorTotal += testClass.heightTest();
943  errorTotal += testClass.exosphereAdjustTest();
944  errorTotal += testClass.peakAmplitudesTest();
945  errorTotal += testClass.effSolarZenithAngleTest();
946  errorTotal += testClass.thicknessTest();
947  errorTotal += testClass.getTECTest();
948  errorTotal += testClass.getIonoCorrTest();
949 
950  std::cout << "Total Failures for " << __FILE__ << ": " << errorTotal
951  << std::endl;
952 
953  return errorTotal;
954 }
gnsstk::NavDataPtr
std::shared_ptr< NavData > NavDataPtr
Factories instantiate these in response to find() requests.
Definition: NavData.hpp:62
NeQuickIonoNavData_T::transFactorEps
static const double transFactorEps
Epsilon for trans factor checks.
Definition: NeQuickIonoNavData_T.cpp:311
NeQuickIonoNavData_T::testDataTEC
static const TestDataTEC testDataTEC[]
Input/truth data for getTECTest.
Definition: NeQuickIonoNavData_T.cpp:303
NeQuickIonoNavData_T::TestDataThickness::critFreqF2
double critFreqF2
Definition: NeQuickIonoNavData_T.cpp:242
gnsstk::NeQuickIonoNavData::ModelParameters::fM3000F2
double fM3000F2
F2 layer transmission factor.
Definition: NeQuickIonoNavData.hpp:279
NeQuickIonoNavData_T::effSolarZenithAngleTest
unsigned effSolarZenithAngleTest()
Test NeQuickIonoNavData::ModelParameters::effSolarZenithAngle.
Definition: NeQuickIonoNavData_T.cpp:812
NeQuickIonoNavData_T::TestData::tAzr
double tAzr
Definition: NeQuickIonoNavData_T.cpp:116
coeff
static const struct @1 coeff[]
Constants used in the nutation models, adapted from SOFA nut80.c.
NeQuickIonoNavData_T::TestDataAmplitude::peakHeightF1
double peakHeightF1
Definition: NeQuickIonoNavData_T.cpp:177
TUCATCH
#define TUCATCH(STATEMENT)
Definition: TestUtil.hpp:193
NeQuickIonoNavData_T::TestDataThickness::peakHeightF2
double peakHeightF2
Definition: NeQuickIonoNavData_T.cpp:244
gnsstk::NeQuickIonoNavData::ModelParameters::fB1bot
double fB1bot
F1 layer bottom-side thickness parameter in km.
Definition: NeQuickIonoNavData.hpp:274
NeQuickIonoNavData_T::legendreTest
unsigned legendreTest()
Test NeQuickIonoNavData::ModelParameters::legendre.
Definition: NeQuickIonoNavData_T.cpp:726
NeQuickIonoNavData_T::TestDataHeight::TestDataHeight
TestDataHeight(double tf, double cfF2, double cfE, double h)
Definition: NeQuickIonoNavData_T.cpp:127
NeQuickIonoNavData_T::TestDataCritFreqE::expFreq
double expFreq
Definition: NeQuickIonoNavData_T.cpp:214
gnsstk::NeQuickIonoNavData::ModelParameters::fBEtop
double fBEtop
E layer top-side thickness parameter in km.
Definition: NeQuickIonoNavData.hpp:267
NeQuickIonoNavData_T::TestDataAmplitude::peakHeightE
double peakHeightE
Definition: NeQuickIonoNavData_T.cpp:180
NeQuickIonoNavData_T::TestDataThickness::peakThickBotF2
double peakThickBotF2
Definition: NeQuickIonoNavData_T.cpp:250
NeQuickIonoNavData_T::TestDataAmplitude::electronDensityF1
double electronDensityF1
Definition: NeQuickIonoNavData_T.cpp:176
NeQuickIonoNavData.hpp
gnsstk::NeQuickIonoNavData::ModelParameters::ffoF1
double ffoF1
F1 layer critical frequency in MHz.
Definition: NeQuickIonoNavData.hpp:270
NeQuickIonoNavData_T::TestDataExosphere::height
double height
Definition: NeQuickIonoNavData_T.cpp:152
NeQuickIonoNavData_T::TestDataExosphere::tAzr
double tAzr
Definition: NeQuickIonoNavData_T.cpp:151
NeQuickIonoNavData_T::lowSolarCoeff
static const std::vector< double > lowSolarCoeff
Solar flux coefficients for low solar activity.
Definition: NeQuickIonoNavData_T.cpp:297
NeQuickIonoNavData_T::criticalFreqEps
static const double criticalFreqEps
Epsilon for critical frequency checks.
Definition: NeQuickIonoNavData_T.cpp:309
gnsstk::NeQuickIonoNavData::ModelParameters::ffoE
double ffoE
E layer critical frequency in MHz.
Definition: NeQuickIonoNavData.hpp:265
gnsstk::NeQuickIonoNavData::ModelParameters::effSolarZenithAngle
static Angle effSolarZenithAngle(const Position &pos, const CivilTime &when)
Definition: NeQuickIonoNavData.cpp:490
TUASSERTE
#define TUASSERTE(TYPE, EXP, GOT)
Definition: TestUtil.hpp:81
gnsstk::CarrierBand
CarrierBand
Definition: CarrierBand.hpp:54
gnsstk::NeQuickIonoNavData::ModelParameters::fH0
double fH0
Top-side thickness parameter in km.
Definition: NeQuickIonoNavData.hpp:280
NeQuickIonoNavData_T::docEps
static const double docEps
Epsilon for testing TEC computation using galileo:iono test data.
Definition: NeQuickIonoNavData_T.cpp:321
getFactor
double getFactor(gnsstk::CarrierBand band)
Definition: NeQuickIonoNavData_T.cpp:889
NeQuickIonoNavData_T::constructorTest
unsigned constructorTest()
Test the NeQuickIonoNavData constructor.
Definition: NeQuickIonoNavData_T.cpp:676
NeQuickIonoNavData_T::getTECTest
unsigned getTECTest()
Test NeQuickIonoNavData::getTEC (implicitly getSED, getVED).
Definition: NeQuickIonoNavData_T.cpp:855
NeQuickIonoNavData_T::TestDataAmplitude::electronDensityF2
double electronDensityF2
Definition: NeQuickIonoNavData_T.cpp:172
NeQuickIonoNavData_T::TestDataTEC::station
gnsstk::Position station
Definition: NeQuickIonoNavData_T.cpp:275
example6.hour
hour
Definition: example6.py:67
gnsstk::MODIP::stModip
double stModip(const Position &pos) const
Definition: MODIP.cpp:70
NeQuickIonoNavData_T::TestDataCritFreqE::tAz
double tAz
Definition: NeQuickIonoNavData_T.cpp:211
NeQuickIonoNavData_T::TestData::criticalFreq
double criticalFreq
Definition: NeQuickIonoNavData_T.cpp:119
TestClass::clone
gnsstk::NavDataPtr clone() const override
Definition: NeQuickIonoNavData_T.cpp:68
hmE
constexpr double hmE
E layer maximum density height in km.
Definition: NeQuickIonoNavData.cpp:100
NeQuickIonoNavData_T::TestDataSolar::expAngle
double expAngle
Definition: NeQuickIonoNavData_T.cpp:198
gnsstk::NeQuickIonoNavData::ModelParameters::fA
double fA[3]
F2, F1, E layer peak amplitudes.
Definition: NeQuickIonoNavData.hpp:268
NeQuickIonoNavData_T::testDataCFE
static const TestDataCritFreqE testDataCFE[]
Input/truth data for constructor2Test.
Definition: NeQuickIonoNavData_T.cpp:291
NeQuickIonoNavData_T::TestDataAmplitude::expA1
double expA1
Definition: NeQuickIonoNavData_T.cpp:182
FreqConv.hpp
NeQuickIonoNavData_T::TestDataAmplitude::peakHeightF2
double peakHeightF2
Definition: NeQuickIonoNavData_T.cpp:173
gnsstk
For Sinex::InputHistory.
Definition: BasicFramework.cpp:50
NeQuickIonoNavData_T::modip
gnsstk::MODIP modip
Tool for computing modified dip latitude.
Definition: NeQuickIonoNavData_T.cpp:305
gnsstk::Angle
Definition: Angle.hpp:53
NeQuickIonoNavData_T::TestDataThickness::electronDensityF2
double electronDensityF2
Definition: NeQuickIonoNavData_T.cpp:243
convertTime
gnsstk::CivilTime convertTime(double hour, int month)
convert test data time stamps that EU used to CivilTime object
Definition: NeQuickIonoNavData_T.cpp:48
NeQuickIonoNavData_T::TestDataCritFreqE::ct
gnsstk::CivilTime ct
Definition: NeQuickIonoNavData_T.cpp:213
NeQuickIonoNavData_T::TestData::tAz
double tAz
Definition: NeQuickIonoNavData_T.cpp:117
NeQuickIonoNavData_T::TestDataThickness
Hold input/truth data for testing layer thickness computation.
Definition: NeQuickIonoNavData_T.cpp:230
gnsstk::NeQuickIonoNavData::ModelParameters::fhmF2
double fhmF2
F2 layer maximum density height in km.
Definition: NeQuickIonoNavData.hpp:277
NeQuickIonoNavData_T::TestDataCritFreqE::pos
gnsstk::Position pos
Definition: NeQuickIonoNavData_T.cpp:212
NeQuickIonoNavData_T::ionoSpotsEps
static const double ionoSpotsEps
Epsilon for comparing derived Azr against stated Azr.
Definition: NeQuickIonoNavData_T.cpp:323
NeQuickIonoNavData_T::TestDataAmplitude::electronDensityE
double electronDensityE
Definition: NeQuickIonoNavData_T.cpp:179
NeQuickIonoNavData_T::TestDataThickness::transFactor
double transFactor
Definition: NeQuickIonoNavData_T.cpp:241
TestUtil.hpp
NeQuickIonoNavData_T::testDataSolar
static const TestDataSolar testDataSolar[]
Input/truth data for effSolarZenithAngleTest.
Definition: NeQuickIonoNavData_T.cpp:289
NeQuickIonoNavData_T::solarEps
static const double solarEps
Epsilon for solar effective zenith angle checks.
Definition: NeQuickIonoNavData_T.cpp:315
NeQuickIonoNavData_T::TestDataAmplitude::expA2
double expA2
Definition: NeQuickIonoNavData_T.cpp:183
NeQuickIonoNavData_T::TestDataHeight::criticalFreqE
double criticalFreqE
Definition: NeQuickIonoNavData_T.cpp:133
NeQuickIonoNavData_T::TestDataExosphere::month
int month
Definition: NeQuickIonoNavData_T.cpp:155
NeQuickIonoNavData_T::TestDataSolar::TestDataSolar
TestDataSolar(double lon, double lat, double hour, int month, double expect)
Definition: NeQuickIonoNavData_T.cpp:191
NeQuickIonoNavData_T::TestDataAmplitude::peakThickBotF1
double peakThickBotF1
Definition: NeQuickIonoNavData_T.cpp:178
NeQuickIonoNavData_T::TestDataThickness::peakThickTopF2
double peakThickTopF2
Definition: NeQuickIonoNavData_T.cpp:249
NeQuickIonoNavData_T::thicknessTest
unsigned thicknessTest()
Test NeQuickIonoNavData::ModelParameters::thickness.
Definition: NeQuickIonoNavData_T.cpp:828
NeQuickIonoNavData_T::TestDataThickness::peakThickTopE
double peakThickTopE
Definition: NeQuickIonoNavData_T.cpp:253
NeQuickIonoNavData_T::TestDataSolar::ct
gnsstk::CivilTime ct
Definition: NeQuickIonoNavData_T.cpp:197
TURETURN
#define TURETURN()
Definition: TestUtil.hpp:232
NeQuickIonoNavData_T::TestDataAmplitude::expA3
double expA3
Definition: NeQuickIonoNavData_T.cpp:184
NeQuickIonoNavData_T::peakAmplitudesTest
unsigned peakAmplitudesTest()
Test NeQuickIonoNavData::ModelParameters::peakAmplitudes.
Definition: NeQuickIonoNavData_T.cpp:785
NeQuickIonoNavData_T::testDataExosphere
static const TestDataExosphere testDataExosphere[]
Input/truth data for exosphereAdjustTest.
Definition: NeQuickIonoNavData_T.cpp:285
NeQuickIonoNavData_T::TestDataThickness::peakThickTopF1
double peakThickTopF1
Definition: NeQuickIonoNavData_T.cpp:251
NeQuickIonoNavData_T::TestDataAz::coefficients
std::vector< double > coefficients
Definition: NeQuickIonoNavData_T.cpp:224
NeQuickIonoNavData_T::TestDataExosphere::top
double top
Definition: NeQuickIonoNavData_T.cpp:156
NeQuickIonoNavData_T::heightTest
unsigned heightTest()
Test NeQuickIonoNavData::ModelParameters::height.
Definition: NeQuickIonoNavData_T.cpp:746
gnsstk::NeQuickIonoNavData::ModelParameters::fNmF1
double fNmF1
F1 layer maximum electron density in el m**-2.
Definition: NeQuickIonoNavData.hpp:271
gnsstk::NeQuickIonoNavData::ModelParameters::fNmF2
double fNmF2
F2 layer maximum electron density in el m**-2.
Definition: NeQuickIonoNavData.hpp:276
NeQuickIonoNavData_T::NeQuickIonoNavData_T
NeQuickIonoNavData_T()
Definition: NeQuickIonoNavData_T.cpp:670
NeQuickIonoNavData_T::TestDataAmplitude::critFreqF1
double critFreqF1
Definition: NeQuickIonoNavData_T.cpp:175
gnsstk::NeQuickIonoNavData::ModelParameters
Aggregate the model parameters as defined in section 2.5.5.
Definition: NeQuickIonoNavData.hpp:154
NeQuickIonoNavData_T::constructor2Test
unsigned constructor2Test()
Test the NeQuickIonoNavData::ModelParameters constructor.
Definition: NeQuickIonoNavData_T.cpp:710
NeQuickIonoNavData_T::TestDataTEC::coefficients
std::vector< double > coefficients
Definition: NeQuickIonoNavData_T.cpp:273
gnsstk::min
T min(const SparseMatrix< T > &SM)
Maximum element - return 0 if empty.
Definition: SparseMatrix.hpp:858
TestClass::TestClass
TestClass()
Definition: GroupPathCorrector_T.cpp:59
NeQuickIonoNavData_T::mediumSolarCoeff
static const std::vector< double > mediumSolarCoeff
Solar flux coefficients for medium solar activity.
Definition: NeQuickIonoNavData_T.cpp:295
TUASSERTFEPS
#define TUASSERTFEPS(EXP, GOT, EPS)
Definition: TestUtil.hpp:126
gnsstk::CarrierBand::L1
@ L1
GPS L1, Galileo E1, SBAS L1, QZSS L1, BeiDou L1.
gnsstk::GalileoIonoEllipsoid
Definition: GalileoIonoEllipsoid.hpp:57
NeQuickIonoNavData_T::TestDataAmplitude::peakThickTopE
double peakThickTopE
Definition: NeQuickIonoNavData_T.cpp:181
gnsstk::Angle::deg
double deg() const
Get the angle in degrees.
Definition: Angle.hpp:98
NeQuickIonoNavData_T::TestDataAz::expAz
double expAz
Definition: NeQuickIonoNavData_T.cpp:226
TUDEF
#define TUDEF(CLASS, METHOD)
Definition: TestUtil.hpp:56
NeQuickIonoNavData_T::TestDataAmplitude::TestDataAmplitude
TestDataAmplitude(double edF2, double phF2, double ptF2, double cfF1, double edF1, double phF1, double ptF1, double edE, double phE, double ptE, double eA1, double eA2, double eA3)
Definition: NeQuickIonoNavData_T.cpp:163
NeQuickIonoNavData_T::TestDataTEC::ct
gnsstk::CivilTime ct
Definition: NeQuickIonoNavData_T.cpp:274
gnsstk::NeQuickIonoNavData::ModelParameters::thickness
void thickness()
Definition: NeQuickIonoNavData.cpp:622
NeQuickIonoNavData_T::TestDataTEC::TestDataTEC
TestDataTEC(const std::vector< double > &coeff, int month, double hour, double stalon, double stalat, double stah, double satlon, double satlat, double sath, double expect)
Definition: NeQuickIonoNavData_T.cpp:261
NeQuickIonoNavData_T::TestDataSolar::pos
gnsstk::Position pos
Definition: NeQuickIonoNavData_T.cpp:196
gnsstk::MODIP
Definition: MODIP.hpp:54
gnsstk::NeQuickIonoNavData::ModelParameters::fNmE
double fNmE
E layer maximum electron density in el m**-2.
Definition: NeQuickIonoNavData.hpp:266
NeQuickIonoNavData_T::TestDataTEC::satellite
gnsstk::Position satellite
Definition: NeQuickIonoNavData_T.cpp:276
NeQuickIonoNavData_T::TestData::ct
gnsstk::CivilTime ct
Definition: NeQuickIonoNavData_T.cpp:115
NeQuickIonoNavData_T::TestDataAz::modip
double modip
Definition: NeQuickIonoNavData_T.cpp:225
NeQuickIonoNavData_T::TestDataAz
Hold input/truth data for testing solar flux->eff. ionization.
Definition: NeQuickIonoNavData_T.cpp:218
gnsstk::TimeSystem::UTC
@ UTC
Coordinated Universal Time (e.g., from NTP)
NeQuickIonoNavData_T::TestDataExosphere::electronDensity
double electronDensity
Definition: NeQuickIonoNavData_T.cpp:150
NeQuickIonoNavData_T::ccir
gnsstk::CCIR ccir
Tool for looking up iono model data.
Definition: NeQuickIonoNavData_T.cpp:307
NeQuickIonoNavData_T::TestDataHeight::transFactor
double transFactor
Definition: NeQuickIonoNavData_T.cpp:131
gnsstk::NeQuickIonoNavData::ModelParameters::exosphereAdjust
void exosphereAdjust(unsigned month)
Definition: NeQuickIonoNavData.cpp:636
NeQuickIonoNavData_T::TestDataHeight::height
double height
Definition: NeQuickIonoNavData_T.cpp:134
GalileoIonoEllipsoid.hpp
gnsstk::CivilTime
Definition: CivilTime.hpp:55
NeQuickIonoNavData_T::testDataThickness
static const TestDataThickness testDataThickness[]
Input/truth data for thicknessTest.
Definition: NeQuickIonoNavData_T.cpp:301
GNSSTK_ASSERT
#define GNSSTK_ASSERT(CONDITION)
Provide an "ASSERT" type macro.
Definition: Exception.hpp:373
NeQuickIonoNavData_T::TestDataThickness::peakThickBotF1
double peakThickBotF1
Definition: NeQuickIonoNavData_T.cpp:252
NeQuickIonoNavData_T::testDataAmplitude
static const TestDataAmplitude testDataAmplitude[]
Input/truth data for peakAmplitudesTest.
Definition: NeQuickIonoNavData_T.cpp:287
NeQuickIonoNavData_T::highSolarCoeff
static const std::vector< double > highSolarCoeff
Solar flux coefficients for high solar activity.
Definition: NeQuickIonoNavData_T.cpp:293
NeQuickIonoNavData_T::TestData::transFactor
double transFactor
Definition: NeQuickIonoNavData_T.cpp:120
gnsstk::NeQuickIonoNavData::ModelParameters::height
void height()
Definition: NeQuickIonoNavData.cpp:603
gnsstk::NeQuickIonoNavData::ModelParameters::fAzr
double fAzr
Effective sunspot number.
Definition: NeQuickIonoNavData.hpp:264
gnsstk::CCIR
Definition: CCIR.hpp:59
NeQuickIonoNavData_T::TestDataCritFreqE
Hold input/truth data for testing E layer critical freq computation.
Definition: NeQuickIonoNavData_T.cpp:202
DebugTrace.hpp
std
Definition: Angle.hpp:142
NeQuickIonoNavData_T::amplitudeEps
static const double amplitudeEps
Epsilon for peak amplitude checks.
Definition: NeQuickIonoNavData_T.cpp:313
NeQuickIonoNavData_T::thicknessEps
static const double thicknessEps
Epsilon for peak thickness checks.
Definition: NeQuickIonoNavData_T.cpp:319
gnsstk::NeQuickIonoNavData::ModelParameters::fhmF1
double fhmF1
F1 layer maximum density height in km.
Definition: NeQuickIonoNavData.hpp:272
NeQuickIonoNavData_T::TestDataHeight
Hold input/truth data for heightTest.
Definition: NeQuickIonoNavData_T.cpp:124
NeQuickIonoNavData_T::TestDataExosphere::hour
double hour
Definition: NeQuickIonoNavData_T.cpp:154
gnsstk::NeQuickIonoNavData::ModelParameters::ffoF2
double ffoF2
F2 layer critical frequency in MHz.
Definition: NeQuickIonoNavData.hpp:275
NeQuickIonoNavData_T::TestDataExosphere
Definition: NeQuickIonoNavData_T.cpp:141
TestClass
Make GroupPathCorrector instantiatable for testing.
Definition: GroupPathCorrector_T.cpp:56
TUASSERTFE
#define TUASSERTFE(EXP, GOT)
Definition: TestUtil.hpp:103
gnsstk::Position
Definition: Position.hpp:136
NeQuickIonoNavData_T::TestDataHeight::criticalFreqF2
double criticalFreqF2
Definition: NeQuickIonoNavData_T.cpp:132
galEll
gnsstk::GalileoIonoEllipsoid galEll
Use this "ellipsoid" (sphere) for all testing.
Definition: NeQuickIonoNavData_T.cpp:61
gnsstk::getFrequency
double getFrequency(CarrierBand band)
Definition: FreqConv.cpp:43
NeQuickIonoNavData_T::getEffIonoLevelTest
unsigned getEffIonoLevelTest()
Test NequickIonoNavData::getEffIonoLevel.
Definition: NeQuickIonoNavData_T.cpp:693
NeQuickIonoNavData_T::TestDataTEC
Hold input/truth data for getTEC.
Definition: NeQuickIonoNavData_T.cpp:258
gnsstk::NeQuickIonoNavData::ModelParameters::peakAmplitudes
void peakAmplitudes()
Definition: NeQuickIonoNavData.cpp:682
example6.month
month
Definition: example6.py:65
NeQuickIonoNavData_T::TestDataSolar
Hold input/truth data for effSolarZenithAngle method.
Definition: NeQuickIonoNavData_T.cpp:188
NeQuickIonoNavData_T::TestData::tPos
gnsstk::Position tPos
Definition: NeQuickIonoNavData_T.cpp:118
gnsstk::NeQuickIonoNavData
Definition: NeQuickIonoNavData.hpp:81
NeQuickIonoNavData_T::TestDataThickness::TestDataThickness
TestDataThickness(double tf, double cf, double ed, double ph, double pttf2, double ptbf2, double pttf1, double ptbf1, double ptte, double ptbe)
Definition: NeQuickIonoNavData_T.cpp:233
NeQuickIonoNavData_T::TestDataExosphere::TestDataExosphere
TestDataExosphere(double ed, double iazr, double h, double b, double hr, int mn, double t)
Definition: NeQuickIonoNavData_T.cpp:144
NeQuickIonoNavData_T::TestData
Hold input/truth data for legendreTest.
Definition: NeQuickIonoNavData_T.cpp:101
NeQuickIonoNavData_T::TestDataTEC::expTEC
double expTEC
Definition: NeQuickIonoNavData_T.cpp:277
MODIP.hpp
NeQuickIonoNavData_T::TestDataAz::TestDataAz
TestDataAz(const std::vector< double > &coeff, double mdl, double expect)
Definition: NeQuickIonoNavData_T.cpp:221
NeQuickIonoNavData_T::testData
static const TestData testData[]
Input/truth data for legendreTest.
Definition: NeQuickIonoNavData_T.cpp:281
NeQuickIonoNavData_T::TestDataExosphere::bottom
double bottom
Definition: NeQuickIonoNavData_T.cpp:153
NeQuickIonoNavData_T::TestDataThickness::peakThickBotE
double peakThickBotE
Definition: NeQuickIonoNavData_T.cpp:254
NeQuickIonoNavData_T::exosphereAdjustTest
unsigned exosphereAdjustTest()
Test NeQuickIonoNavData::ModelParameters::exosphereAdjust.
Definition: NeQuickIonoNavData_T.cpp:765
NeQuickIonoNavData_T::TestDataCritFreqE::TestDataCritFreqE
TestDataCritFreqE(double az, double lon, double lat, double hour, int month, double expect)
Definition: NeQuickIonoNavData_T.cpp:205
NeQuickIonoNavData_T::TestDataAmplitude
Hold input/truth data for peakAmplitudes method.
Definition: NeQuickIonoNavData_T.cpp:160
NeQuickIonoNavData_T::testDataAz
static const TestDataAz testDataAz[]
Input/truth data for getEffIonoLevelTest.
Definition: NeQuickIonoNavData_T.cpp:299
gnsstk::NeQuickIonoNavData::ModelParameters::fB2bot
double fB2bot
F2 layer bottom-side thickness parameter in km.
Definition: NeQuickIonoNavData.hpp:278
NeQuickIonoNavData_T::getIonoCorrTest
unsigned getIonoCorrTest()
Test NeQuickIonoNavData::getIonoCorr.
Definition: NeQuickIonoNavData_T.cpp:896
NeQuickIonoNavData_T
Definition: NeQuickIonoNavData_T.cpp:72
main
int main(int argc, char *argv[])
Definition: NeQuickIonoNavData_T.cpp:933
gnsstk::NeQuickIonoNavData::ModelParameters::fB1top
double fB1top
F1 layer top-side thickness parameter in km.
Definition: NeQuickIonoNavData.hpp:273
NeQuickIonoNavData_T::azEps
static const double azEps
Epsilon for effective ionization level checks.
Definition: NeQuickIonoNavData_T.cpp:317
NeQuickIonoNavData_T::TestData::TestData
TestData(double hour, int month, double iazr, double lon, double lat, double cf, double tf)
Definition: NeQuickIonoNavData_T.cpp:104
NeQuickIonoNavData_T::TestDataAmplitude::peakThickBotF2
double peakThickBotF2
Definition: NeQuickIonoNavData_T.cpp:174
gnsstk::CivilTime::getUTHour
double getUTHour() const
Get the "universal time"-esque fractional hour of day.
Definition: CivilTime.hpp:195
gnsstk::CarrierBand::L5
@ L5
GPS L5, Galileo E5a, SBAS L5, QZSS L5, BeiDou B2a, NavIC L5.
NeQuickIonoNavData_T::testDataHeight
static const TestDataHeight testDataHeight[]
Input/truth data for heightTest.
Definition: NeQuickIonoNavData_T.cpp:283


gnsstk
Author(s):
autogenerated on Wed Oct 25 2023 02:40:40