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 WMM_UNCERTAINTY_F 145
54#define WMM_UNCERTAINTY_H 128
55#define WMM_UNCERTAINTY_X 131
56#define WMM_UNCERTAINTY_Y 94
57#define WMM_UNCERTAINTY_Z 157
58#define WMM_UNCERTAINTY_I 0.21
59#define WMM_UNCERTAINTY_D_OFFSET 0.26
60#define WMM_UNCERTAINTY_D_COEF 5625
63#define M_PI ((2) * (acos(0.0)))
66#define RAD2DEG(rad) ((rad) * (180.0L / M_PI))
67#define DEG2RAD(deg) ((deg) * (M_PI / 180.0L))
68#define ATanH(x) (0.5 * log((1 + x) / (1 - x)))
77#define MAG_PS_MIN_LAT_DEGREE \
79#define MAG_PS_MAX_LAT_DEGREE \
81#define MAG_UTM_MIN_LAT_DEGREE \
83#define MAG_UTM_MAX_LAT_DEGREE \
86#define MAG_GEO_POLE_TOLERANCE 1e-5
87#define MAG_USE_GEOID \
90#define LAT_BOUND_MIN -90
91#define LAT_BOUND_MAX 90
92#define LON_BOUND_MIN -180
93#define LON_BOUND_MAX 360
94#define ALT_BOUND_MIN -10
95#define NO_ALT_MAX -99999
96#define USER_GAVE_UP -1
109#define MODEL_RELEASE_DATE "10 Dec 2019"
110#define VERSIONDATE_LARGE \
111 "$Date: 2019-12-10 10:40:43 -0700 (Tue, 10 Dec 2019) $"
128 double *Main_Field_Coeff_G;
130 double *Main_Field_Coeff_H;
132 double *Secular_Var_Coeff_G;
134 double *Secular_Var_Coeff_H;
138 int SecularVariationUsed;
140 double CoefficientFileEndDate;
156 double HeightAboveEllipsoid;
157 double HeightAboveGeoid;
187 *RelativeRadiusPower;
218 float *GeoidHeightBuffer;
220 int Geoid_Initialized;
241 double CentralMeridian;
242 double ConvergenceOfMeridians;
264enum COEFFICIENTS { IE, N, M, GNM, HNM, DGNM, DHNM };
266enum YYYYMMDD { YEAR, MONTH, DAY };
282int MAG_robustReadMagneticModel_Large(
char *filename,
char *filenameSV,
285int MAG_robustReadMagModels(
char *filename,
292void MAG_Error(
int control);
296 double *a_step_size,
double *step_time,
298 int *ElementOption,
int *PrintOption,
char *OutputFile,
312int MAG_ValidateDMSstring(
char *input,
int min,
int max,
char *Error);
314int MAG_Warnings(
int control,
double value,
326 char values[][MAXLINELENGTH]);
344void MAG_PrintEMMFormat(
char *filename,
char *filenameSV,
347void MAG_PrintSHDFFormat(
char *filename,
352int MAG_readMagneticModel_Large(
char *filename,
char *filenameSV,
355int MAG_readMagneticModel_SHDF(
char *filename,
358char *MAG_Trim(
char *str);
361void MAG_BaseErrors(
double DeclCoef,
double DeclBaseline,
double InclOffset,
362 double FOffset,
double Multiplier,
double H,
363 double *DeclErr,
double *InclErr,
double *FErr);
365int MAG_CalculateGeoMagneticElements(
373int MAG_CalculateSecularVariationElements(
386int MAG_DateToYear(
MAGtype_Date *Calendar_Date,
char *Error);
388void MAG_DegreeToDMSstring(
double DegreesOfArc,
int UnitDepth,
char *DMSstring);
390void MAG_DMSstringToDegree(
char *DMSstring,
double *DegreesOfArc);
412int MAG_GetUTMParameters(
double Latitude,
double Longitude,
int *Zone,
413 char *Hemisphere,
double *CentralMeridian);
415int MAG_isNaN(
double d);
423 double *y,
double *z);
429void MAG_TMfwd4(
double Eps,
double Epssq,
double K0R4,
double K0R4oa,
430 double Acoeff[],
double Lam0,
double K0,
double falseE,
431 double falseN,
int XYonly,
double Lambda,
double Phi,
double *X,
432 double *Y,
double *pscale,
double *CoM);
444int MAG_ComputeSphericalHarmonicVariables(
460int MAG_PcupHigh(
double *Pcup,
double *dPcup,
double x,
int nMax);
462int MAG_PcupLow(
double *Pcup,
double *dPcup,
double x,
int nMax);
506int MAG_GetGeoidHeight(
double Latitude,
double Longitude,
double *DeltaHeight,
520void MAG_EquivalentLatLon(
double lat,
double lon,
double *repairedLat,
521 double *repairedLon);
524void MAG_PrintUserDataWithUncertainty(
530void MAG_GetDeg(
char *Query_String,
double *latitude,
double bounds[2]);
533 int AltitudeSetting);