From f458b37ff913f5438c049ba6a21729647c77ce09 Mon Sep 17 00:00:00 2001 From: scivision Date: Wed, 23 May 2018 05:30:57 -0400 Subject: [PATCH 1/2] AP_Declination: 2to3, IGRF API update use built-in IGRF total, incl, decl computations --- libraries/AP_Declination/generate/generate.py | 138 ++++++++---------- 1 file changed, 63 insertions(+), 75 deletions(-) diff --git a/libraries/AP_Declination/generate/generate.py b/libraries/AP_Declination/generate/generate.py index 55f918244b173..404c682c0b08a 100755 --- a/libraries/AP_Declination/generate/generate.py +++ b/libraries/AP_Declination/generate/generate.py @@ -6,93 +6,81 @@ import pyigrf12 as igrf import numpy as np import datetime -import os.path -import sys -from math import sqrt, pi, atan2, asin - -if not os.path.isfile("AP_Declination.h"): - print("Please run this tool from the AP_Declination directory") - sys.exit(1) - - -def field_to_angles(x, y, z): - intensity = sqrt(x**2+y**2+z**2) - r2d = 180.0 / pi - declination = r2d * atan2(y, x) - inclination = r2d * asin(z / intensity) - return [intensity, inclination, declination] - - -isv = 0 -date = datetime.datetime.now() -itype = 1 -alt = 0.0 - -SAMPLING_RES = 10 -SAMPLING_MIN_LAT = -90 -SAMPLING_MAX_LAT = 90 -SAMPLING_MIN_LON = -180 -SAMPLING_MAX_LON = 180 - -NUM_LAT = 1 + (SAMPLING_MAX_LAT - SAMPLING_MIN_LAT) / SAMPLING_RES -NUM_LON = 1 + (SAMPLING_MAX_LON - SAMPLING_MIN_LON) / SAMPLING_RES - -intensity_table = np.empty((NUM_LAT, NUM_LON)) -inclination_table = np.empty((NUM_LAT, NUM_LON)) -declination_table = np.empty((NUM_LAT, NUM_LON)) - -for i in range(NUM_LAT): - for j in range(NUM_LON): - lat = SAMPLING_MIN_LAT + i*SAMPLING_RES - lon = SAMPLING_MIN_LON + j*SAMPLING_RES - x, y, z, f, d = igrf.gridigrf12(date, isv, itype, alt, lat, lon) - intensity, I, D = field_to_angles(x, y, z) - intensity_table[i][j] = intensity * 0.00001 - inclination_table[i][j] = I - declination_table[i][j] = D - -tfile = open("tables.cpp", 'w') -tfile.write('''// this is an auto-generated file from the IGRF tables. Do not edit +from pathlib import Path + +if not Path("AP_Declination.h").is_file(): + raise OSError("Please run this tool from the AP_Declination directory") + + +def write_table(f,name, table): + '''write one table''' + f.write("const float AP_Declination::%s[%u][%u] = {\n" % + (name, NUM_LAT, NUM_LON)) + for i in range(NUM_LAT): + f.write(" {") + for j in range(NUM_LON): + f.write("%.5f" % table[i][j]) + if j != NUM_LON-1: + f.write(",") + f.write("}") + if i != NUM_LAT-1: + f.write(",") + f.write("\n") + f.write("};\n\n") + + + + +if __name__ == '__main__': + + date = datetime.datetime.now() + # date = datetime.date(2018,2,20) + + SAMPLING_RES = 10 + SAMPLING_MIN_LAT = -90 + SAMPLING_MAX_LAT = 90 + SAMPLING_MIN_LON = -180 + SAMPLING_MAX_LON = 180 + + lats = np.arange(SAMPLING_MIN_LAT, SAMPLING_MAX_LAT+SAMPLING_RES, SAMPLING_RES) + lons = np.arange(SAMPLING_MIN_LON, SAMPLING_MAX_LON+SAMPLING_RES, SAMPLING_RES) + + NUM_LAT = lats.size + NUM_LON = lons.size + + intensity_table = np.empty((NUM_LAT, NUM_LON)) + inclination_table = np.empty((NUM_LAT, NUM_LON)) + declination_table = np.empty((NUM_LAT, NUM_LON)) + + for i,lat in enumerate(lats): + for j,lon in enumerate(lons): + mag = igrf.igrf(date=date, glat=lat, glon=lon, alt=0., isv=0, itype=1) + intensity_table[i][j] = mag.total/1e5 + inclination_table[i][j] = mag.incl + declination_table[i][j] = mag.decl + + with open("tables.cpp", 'w') as f: + f.write('''// this is an auto-generated file from the IGRF tables. Do not edit // To re-generate run generate/generate.py #include "AP_Declination.h" ''') -tfile.write(''' -const float AP_Declination::SAMPLING_RES = %u; + f.write('''const float AP_Declination::SAMPLING_RES = %u; const float AP_Declination::SAMPLING_MIN_LAT = %u; const float AP_Declination::SAMPLING_MAX_LAT = %u; const float AP_Declination::SAMPLING_MIN_LON = %u; const float AP_Declination::SAMPLING_MAX_LON = %u; ''' % (SAMPLING_RES, - SAMPLING_MIN_LAT, - SAMPLING_MAX_LAT, - SAMPLING_MIN_LON, - SAMPLING_MAX_LON)) - - -def write_table(name, table): - '''write one table''' - tfile.write("const float AP_Declination::%s[%u][%u] = {\n" % - (name, NUM_LAT, NUM_LON)) - for i in range(NUM_LAT): - tfile.write(" {") - for j in range(NUM_LON): - tfile.write("%.5f" % table[i][j]) - if j != NUM_LON-1: - tfile.write(",") - tfile.write("}") - if i != NUM_LAT-1: - tfile.write(",") - tfile.write("\n") - tfile.write("};\n\n") - + SAMPLING_MIN_LAT, + SAMPLING_MAX_LAT, + SAMPLING_MIN_LON, + SAMPLING_MAX_LON)) -write_table('declination_table', declination_table) -write_table('inclination_table', inclination_table) -write_table('intensity_table', intensity_table) + write_table(f,'declination_table', declination_table) + write_table(f,'inclination_table', inclination_table) + write_table(f,'intensity_table', intensity_table) -tfile.close() From 5408983f582a6d4ea440d0930c267a8471e3d6d3 Mon Sep 17 00:00:00 2001 From: Michael du Breuil Date: Sun, 2 Sep 2018 16:02:04 -0700 Subject: [PATCH 2/2] AP_Declination: Fixes ups for pyigrf --- libraries/AP_Declination/generate/generate.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/AP_Declination/generate/generate.py b/libraries/AP_Declination/generate/generate.py index 404c682c0b08a..4ae0020540a91 100755 --- a/libraries/AP_Declination/generate/generate.py +++ b/libraries/AP_Declination/generate/generate.py @@ -3,7 +3,7 @@ generate field tables from IGRF12 ''' -import pyigrf12 as igrf +import igrf12 as igrf import numpy as np import datetime from pathlib import Path @@ -54,7 +54,7 @@ def write_table(f,name, table): for i,lat in enumerate(lats): for j,lon in enumerate(lons): - mag = igrf.igrf(date=date, glat=lat, glon=lon, alt=0., isv=0, itype=1) + mag = igrf.igrf(date, glat=lat, glon=lon, alt_km=0., isv=0, itype=1) intensity_table[i][j] = mag.total/1e5 inclination_table[i][j] = mag.incl declination_table[i][j] = mag.decl