/* @file MagUtil.java * * @author marco corvi * @date nov 2011 * * @brief TopoDroid World Magnetic Model * -------------------------------------------------------- * Copyright This sowftare is distributed under GPL-3.0 or later * See the file COPYING. * -------------------------------------------------------- * Implemented after GeomagneticLibrary.c by * National Geophysical Data Center * NOAA EGC/2 * 325 Broadway * Boulder, CO 80303 USA * Attn: Susan McLean * Phone: (303) 497-6478 * Email: Susan.McLean@noaa.gov */ package com.topodroid.DistoX; // #define NOOFCOEFFICIENTS (7) class MagUtil { /*These error values come from the ISCWSA error model: *http://www.copsegrove.com/Pages/MWDGeomagneticModels.aspx * #define INCL_ERROR_BASE (0.20) #define DECL_ERROR_OFFSET_BASE (0.36) #define F_ERROR_BASE (130) #define DECL_ERROR_SLOPE_BASE (5000) #define WMM_ERROR_MULTIPLIER 1.21 #define IGRF_ERROR_MULTIPLIER 1.21 */ // These error values are the NGDC error model static final double WMM_UNCERTAINTY_F = 152; static final double WMM_UNCERTAINTY_H = 133; static final double WMM_UNCERTAINTY_X = 138; static final double WMM_UNCERTAINTY_Y = 89; static final double WMM_UNCERTAINTY_Z = 165; static final double WMM_UNCERTAINTY_I = 0.22; static final double WMM_UNCERTAINTY_D_OFFSET = 0.24; static final double WMM_UNCERTAINTY_D_COEF = 5432; static final double M_PI = Math.PI; static final double RAD2DEG = 180.0/M_PI; static final double DEG2RAD = M_PI/180.0; static final double MAG_PS_MIN_LAT_DEGREE = -55; /* Minimum Latitude for Polar Stereographic projection in degrees */ static final double MAG_PS_MAX_LAT_DEGREE = 55; /* Maximum Latitude for Polar Stereographic projection in degrees */ static final double MAG_UTM_MIN_LAT_DEGREE = -80.5; /* Minimum Latitude for UTM projection in degrees */ static final double MAG_UTM_MAX_LAT_DEGREE = 84.5; /* Maximum Latitude for UTM projection in degrees */ static final double MAG_GEO_POLE_TOLERANCE = 1e-5; static final boolean MAG_USE_GEOID = true; /* 1 Geoid - Ellipsoid difference should be corrected, 0 otherwise */ static int CALCULATE_NUMTERMS( int N) { return (N * ( N + 1 )) / 2 + N+1; } static double ATanH( double x ) { return (0.5 * Math.log((1 + x) / (1 - x))); } /*New Error Functions*/ static MagElement getWMMErrorCalc( double H ) { MagElement ret = new MagElement(); ret.F = WMM_UNCERTAINTY_F; ret.H = WMM_UNCERTAINTY_H; ret.X = WMM_UNCERTAINTY_X; ret.Z = WMM_UNCERTAINTY_Z; ret.Y = WMM_UNCERTAINTY_Y; ret.Incl = WMM_UNCERTAINTY_I; double decl_variable = WMM_UNCERTAINTY_D_COEF / H; double decl_constant = WMM_UNCERTAINTY_D_OFFSET; ret.Decl = Math.sqrt(decl_constant*decl_constant + decl_variable*decl_variable); if (ret.Decl > 180) ret.Decl = 180; return ret; } }