20#ifndef _POSIX_C_SOURCE
21#define _POSIX_C_SOURCE
37#define READONLYMODE "r"
38#define MAXLINELENGTH (1024)
39#define NOOFPARAMS (15)
40#define NOOFCOEFFICIENTS (7)
42#define _DEGREE_NOT_FOUND (-2)
43#define CALCULATE_NUMTERMS(N) (N * (N + 1) / 2 + N)
48#define INCL_ERROR_BASE (0.20)
49#define DECL_ERROR_OFFSET_BASE (0.36)
50#define F_ERROR_BASE (130)
51#define DECL_ERROR_SLOPE_BASE (5000)
52#define WMM_ERROR_MULTIPLIER 1.21
53#define IGRF_ERROR_MULTIPLIER 1.21
58#define WMMHR_UNCERTAINTY_F 134
59#define WMMHR_UNCERTAINTY_H 130
60#define WMMHR_UNCERTAINTY_X 135
61#define WMMHR_UNCERTAINTY_Y 85
62#define WMMHR_UNCERTAINTY_Z 134
63#define WMMHR_UNCERTAINTY_I 0.19
64#define WMMHR_UNCERTAINTY_D_OFFSET 0.25
65#define WMMHR_UNCERTAINTY_D_COEF 5205
67#define WMM_UNCERTAINTY_F 138
68#define WMM_UNCERTAINTY_H 133
69#define WMM_UNCERTAINTY_X 137
70#define WMM_UNCERTAINTY_Y 89
71#define WMM_UNCERTAINTY_Z 141
72#define WMM_UNCERTAINTY_I 0.20
73#define WMM_UNCERTAINTY_D_OFFSET 0.26
74#define WMM_UNCERTAINTY_D_COEF 5417
77#define M_PI ((2) * (acos(0.0)))
80#define RAD2DEG(rad) ((rad) * (180.0L / M_PI))
81#define DEG2RAD(deg) ((deg) * (M_PI / 180.0L))
82#define ATanH(x) (0.5 * log((1 + x) / (1 - x)))
91#define MAG_PS_MIN_LAT_DEGREE \
93#define MAG_PS_MAX_LAT_DEGREE \
95#define MAG_UTM_MIN_LAT_DEGREE \
97#define MAG_UTM_MAX_LAT_DEGREE \
100#define MAG_GEO_POLE_TOLERANCE 1e-5
101#define MAG_USE_GEOID \
104#define LAT_BOUND_MIN -90
105#define LAT_BOUND_MAX 90
106#define LON_BOUND_MIN -180
107#define LON_BOUND_MAX 360
108#define ALT_BOUND_MIN -10
109#define NO_ALT_MAX -99999
110#define USER_GAVE_UP -1
111#define DEC_YEAR_BOUND_MIN 2024.866
112#define DEC_YEAR_BOUND_MAX 2030
130 double *Main_Field_Coeff_G;
132 double *Main_Field_Coeff_H;
134 double *Secular_Var_Coeff_G;
136 double *Secular_Var_Coeff_H;
140 int SecularVariationUsed;
142 double CoefficientFileEndDate;
158 double HeightAboveEllipsoid;
159 double HeightAboveGeoid;
189 *RelativeRadiusPower;
220 float *GeoidHeightBuffer;
222 int Geoid_Initialized;
243 double CentralMeridian;
244 double ConvergenceOfMeridians;
266enum COEFFICIENTS { IE, N, M, GNM, HNM, DGNM, DHNM };
268enum YYYYMMDD { YEAR, MONTH, DAY };
284int MAG_robustReadMagModels(
char *filename,
292void MAG_Error(
int control);
301int MAG_Warnings(
int control,
double value,
313 char values[][MAXLINELENGTH]);
331void MAG_PrintEMMFormat(
char *filename,
char *filenameSV,
334void MAG_PrintSHDFFormat(
char *filename,
339int MAG_readMagneticModel_SHDF(
char *filename,
343char *MAG_Trim(
char *str);
346void MAG_BaseErrors(
double DeclCoef,
double DeclBaseline,
double InclOffset,
347 double FOffset,
double Multiplier,
double H,
348 double *DeclErr,
double *InclErr,
double *FErr);
350int MAG_CalculateGeoMagneticElements(
358int MAG_CalculateSecularVariationElements(
371int MAG_DateToYear(
MAGtype_Date *Calendar_Date,
char *Error);
373void MAG_DegreeToDMSstring(
double DegreesOfArc,
int UnitDepth,
char *DMSstring);
375void MAG_DMSstringToDegree(
char *DMSstring,
double *DegreesOfArc);
397int MAG_GetUTMParameters(
double Latitude,
double Longitude,
int *Zone,
398 char *Hemisphere,
double *CentralMeridian);
400int MAG_isNaN(
double d);
408 double *y,
double *z);
414void MAG_TMfwd4(
double Eps,
double Epssq,
double K0R4,
double K0R4oa,
415 double Acoeff[],
double Lam0,
double K0,
double falseE,
416 double falseN,
int XYonly,
double Lambda,
double Phi,
double *X,
417 double *Y,
double *pscale,
double *CoM);
429int MAG_ComputeSphericalHarmonicVariables(
445int MAG_PcupHigh(
double *Pcup,
double *dPcup,
double x,
int nMax);
447int MAG_PcupLow(
double *Pcup,
double *dPcup,
double x,
int nMax);
491int MAG_GetGeoidHeight(
double Latitude,
double Longitude,
double *DeltaHeight,
505void MAG_EquivalentLatLon(
double lat,
double lon,
double *repairedLat,
506 double *repairedLon);
510void MAG_PrintUserDataWithUncertainty(
515double MAG_dtstr_to_dyear(
char *edit_date);
516size_t MAG_strlcpy_equivalent(
char *dst,
char *src,
size_t dstlen);