15#ifndef _POSIX_C_SOURCE
16#define _POSIX_C_SOURCE
32#define READONLYMODE "r"
33#define MAXLINELENGTH (1024)
34#define NOOFPARAMS (15)
35#define NOOFCOEFFICIENTS (7)
37#define _DEGREE_NOT_FOUND (-2)
38#define CALCULATE_NUMTERMS(N) (N * (N + 1) / 2 + N)
43#define INCL_ERROR_BASE (0.20)
44#define DECL_ERROR_OFFSET_BASE (0.36)
45#define F_ERROR_BASE (130)
46#define DECL_ERROR_SLOPE_BASE (5000)
47#define WMM_ERROR_MULTIPLIER 1.21
48#define IGRF_ERROR_MULTIPLIER 1.21
53#define WMMHR_UNCERTAINTY_F 134
54#define WMMHR_UNCERTAINTY_H 130
55#define WMMHR_UNCERTAINTY_X 135
56#define WMMHR_UNCERTAINTY_Y 85
57#define WMMHR_UNCERTAINTY_Z 134
58#define WMMHR_UNCERTAINTY_I 0.19
59#define WMMHR_UNCERTAINTY_D_OFFSET 0.25
60#define WMMHR_UNCERTAINTY_D_COEF 5205
62#define WMM_UNCERTAINTY_F 138
63#define WMM_UNCERTAINTY_H 133
64#define WMM_UNCERTAINTY_X 137
65#define WMM_UNCERTAINTY_Y 89
66#define WMM_UNCERTAINTY_Z 141
67#define WMM_UNCERTAINTY_I 0.20
68#define WMM_UNCERTAINTY_D_OFFSET 0.26
69#define WMM_UNCERTAINTY_D_COEF 5417
72#define M_PI ((2) * (acos(0.0)))
75#define RAD2DEG(rad) ((rad) * (180.0L / M_PI))
76#define DEG2RAD(deg) ((deg) * (M_PI / 180.0L))
77#define ATanH(x) (0.5 * log((1 + x) / (1 - x)))
86#define MAG_PS_MIN_LAT_DEGREE \
88#define MAG_PS_MAX_LAT_DEGREE \
90#define MAG_UTM_MIN_LAT_DEGREE \
92#define MAG_UTM_MAX_LAT_DEGREE \
95#define MAG_GEO_POLE_TOLERANCE 1e-5
96#define MAG_USE_GEOID \
99#define LAT_BOUND_MIN -90
100#define LAT_BOUND_MAX 90
101#define LON_BOUND_MIN -180
102#define LON_BOUND_MAX 360
103#define ALT_BOUND_MIN -10
104#define NO_ALT_MAX -99999
105#define USER_GAVE_UP -1
106#define DEC_YEAR_BOUND_MIN 2024.866
107#define DEC_YEAR_BOUND_MAX 2030
125 double *Main_Field_Coeff_G;
127 double *Main_Field_Coeff_H;
129 double *Secular_Var_Coeff_G;
131 double *Secular_Var_Coeff_H;
135 int SecularVariationUsed;
137 double CoefficientFileEndDate;
153 double HeightAboveEllipsoid;
154 double HeightAboveGeoid;
184 *RelativeRadiusPower;
215 float *GeoidHeightBuffer;
217 int Geoid_Initialized;
238 double CentralMeridian;
239 double ConvergenceOfMeridians;
261enum COEFFICIENTS { IE, N, M, GNM, HNM, DGNM, DHNM };
263enum YYYYMMDD { YEAR, MONTH, DAY };
279int MAG_robustReadMagModels(
char *filename,
287void MAG_Error(
int control);
296int MAG_Warnings(
int control,
double value,
308 char values[][MAXLINELENGTH]);
326void MAG_PrintEMMFormat(
char *filename,
char *filenameSV,
329void MAG_PrintSHDFFormat(
char *filename,
334int MAG_readMagneticModel_SHDF(
char *filename,
338char *MAG_Trim(
char *str);
341void MAG_BaseErrors(
double DeclCoef,
double DeclBaseline,
double InclOffset,
342 double FOffset,
double Multiplier,
double H,
343 double *DeclErr,
double *InclErr,
double *FErr);
345int MAG_CalculateGeoMagneticElements(
353int MAG_CalculateSecularVariationElements(
366int MAG_DateToYear(
MAGtype_Date *Calendar_Date,
char *Error);
368void MAG_DegreeToDMSstring(
double DegreesOfArc,
int UnitDepth,
char *DMSstring);
370void MAG_DMSstringToDegree(
char *DMSstring,
double *DegreesOfArc);
392int MAG_GetUTMParameters(
double Latitude,
double Longitude,
int *Zone,
393 char *Hemisphere,
double *CentralMeridian);
395int MAG_isNaN(
double d);
403 double *y,
double *z);
409void MAG_TMfwd4(
double Eps,
double Epssq,
double K0R4,
double K0R4oa,
410 double Acoeff[],
double Lam0,
double K0,
double falseE,
411 double falseN,
int XYonly,
double Lambda,
double Phi,
double *X,
412 double *Y,
double *pscale,
double *CoM);
424int MAG_ComputeSphericalHarmonicVariables(
440int MAG_PcupHigh(
double *Pcup,
double *dPcup,
double x,
int nMax);
442int MAG_PcupLow(
double *Pcup,
double *dPcup,
double x,
int nMax);
486int MAG_GetGeoidHeight(
double Latitude,
double Longitude,
double *DeltaHeight,
500void MAG_EquivalentLatLon(
double lat,
double lon,
double *repairedLat,
501 double *repairedLon);
505void MAG_PrintUserDataWithUncertainty(
510double MAG_dtstr_to_dyear(
char *edit_date);
511size_t MAG_strlcpy_equivalent(
char *dst,
char *src,
size_t dstlen);