Skip to content

Instantly share code, notes, and snippets.

@myjr52
Last active August 29, 2015 14:18
Show Gist options
  • Save myjr52/62ca6ffc3e9c78ea0411 to your computer and use it in GitHub Desktop.
Save myjr52/62ca6ffc3e9c78ea0411 to your computer and use it in GitHub Desktop.
IGFR12 Model in Python using f2py
IGRF12 (International Geomagnetic Reference Field) model in python
- fortran source subroutine: igrf12.f
modified for calling in python
original version from: http://www.ngdc.noaa.gov/IAGA/vmod/igrf.html
- how to use
1) compile igrf12.f using f2py
>> f2py -c -m igrf12_fortran igrf12.f
this will generate a library, e.g., igrf12_fortran.so
2) import the python module
>> import igrf12
3) call igrf12 in the following format
>> igrf12.igrf12(0,2016,2,4000,23,32)
(-1216.8147739252843, 24122.237297648033, 118869.7813460386)
the output is the geomagnetic field vector in north, east and down direction in [nT]
igrf12.igrf12(isv,date,itype,alt,colat,elong)
where the inputs are:
isv = 0 if main-field values are required
isv = 1 if secular variation values are required
date = year A.D. Must be greater than or equal to 1900.0 and
less than or equal to 2025.0. Warning message is given
for dates greater than 2020.0. Must be double precision.
itype = 1 if geodetic (spheroid)
itype = 2 if geocentric (sphere)
alt = height in km above sea level if itype = 1
= distance from centre of Earth in km if itype = 2 (>3485 km)
colat = colatitude (0-180)
elong = east-longitude (0-360)
c the orignal coming from: http://www.ngdc.noaa.gov/IAGA/vmod/igrf.html, and modified by jongrae
c
subroutine igrf12syn (isv,date,itype,alt,colat,elong,x,y,z,f)
c
c This is a synthesis routine for the 12th generation IGRF as agreed
c in December 2014 by IAGA Working Group V-MOD. It is valid 1900.0 to
c 2020.0 inclusive. Values for dates from 1945.0 to 2010.0 inclusive are
c definitive, otherwise they are non-definitive.
c INPUT
c isv = 0 if main-field values are required
c isv = 1 if secular variation values are required
c date = year A.D. Must be greater than or equal to 1900.0 and
c less than or equal to 2025.0. Warning message is given
c for dates greater than 2020.0. Must be double precision.
c itype = 1 if geodetic (spheroid)
c itype = 2 if geocentric (sphere)
c alt = height in km above sea level if itype = 1
c = distance from centre of Earth in km if itype = 2 (>3485 km)
c colat = colatitude (0-180)
c elong = east-longitude (0-360)
c alt, colat and elong must be double precision.
c OUTPUT
c x = north component (nT) if isv = 0, nT/year if isv = 1
c y = east component (nT) if isv = 0, nT/year if isv = 1
c z = vertical component (nT) if isv = 0, nT/year if isv = 1
c f = total intensity (nT) if isv = 0, rubbish if isv = 1
c
c To get the other geomagnetic elements (D, I, H and secular
c variations dD, dH, dI and dF) use routines ptoc and ptocsv.
c
c Adapted from 8th generation version to include new maximum degree for
c main-field models for 2000.0 and onwards and use WGS84 spheroid instead
c of International Astronomical Union 1966 spheroid as recommended by IAGA
c in July 2003. Reference radius remains as 6371.2 km - it is NOT the mean
c radius (= 6371.0 km) but 6371.2 km is what is used in determining the
c coefficients. Adaptation by Susan Macmillan, August 2003 (for
c 9th generation), December 2004, December 2009 & December 2014.
c
c Coefficients at 1995.0 incorrectly rounded (rounded up instead of
c to even) included as these are the coefficients published in Excel
c spreadsheet July 2005.
c
c------------------------------------------------------------------------
c Indicating the input/ouput variables used by f2py: added by jongrae
Cf2py intent(out) x
Cf2py intent(out) y
Cf2py intent(out) z
Cf2py intent(out) f
c------------------------------------------------------------------------
implicit double precision (a-h,o-z)
dimension gh(3451),g0(120),g1(120),g2(120),g3(120),g4(120),
1 g5(120),g6(120),g7(120),g8(120),g9(120),ga(120),
2 gb(120),gc(120),gd(120),ge(120),gf(120),gg(120),
3 gi(120),gj(120),gk(195),gl(195),gm(195),gp(195),
4 gq(195),gr(195),
5 p(105),q(105),cl(13),sl(13)
equivalence (g0,gh(1)),(g1,gh(121)),(g2,gh(241)),(g3,gh(361)),
1 (g4,gh(481)),(g5,gh(601)),(g6,gh(721)),(g7,gh(841)),
2 (g8,gh(961)),(g9,gh(1081)),(ga,gh(1201)),
3 (gb,gh(1321)),(gc,gh(1441)),(gd,gh(1561)),
4 (ge,gh(1681)),(gf,gh(1801)),(gg,gh(1921)),
5 (gi,gh(2041)),(gj,gh(2161)),(gk,gh(2281)),
6 (gl,gh(2476)),(gm,gh(2671)),(gp,gh(2866)),
7 (gq,gh(3061)),(gr,gh(3256))
c
data g0/ -31543.,-2298., 5922., -677., 2905.,-1061., 924., 1121., 1900
1 1022.,-1469., -330., 1256., 3., 572., 523., 876., 1900
2 628., 195., 660., -69., -361., -210., 134., -75., 1900
3 -184., 328., -210., 264., 53., 5., -33., -86., 1900
4 -124., -16., 3., 63., 61., -9., -11., 83., 1900
5 -217., 2., -58., -35., 59., 36., -90., -69., 1900
6 70., -55., -45., 0., -13., 34., -10., -41., 1900
7 -1., -21., 28., 18., -12., 6., -22., 11., 1900
8 8., 8., -4., -14., -9., 7., 1., -13., 1900
9 2., 5., -9., 16., 5., -5., 8., -18., 1900
a 8., 10., -20., 1., 14., -11., 5., 12., 1900
b -3., 1., -2., -2., 8., 2., 10., -1., 1900
c -2., -1., 2., -3., -4., 2., 2., 1., 1900
d -5., 2., -2., 6., 6., -4., 4., 0., 1900
e 0., -2., 2., 4., 2., 0., 0., -6./ 1900
data g1/ -31464.,-2298., 5909., -728., 2928.,-1086., 1041., 1065., 1905
1 1037.,-1494., -357., 1239., 34., 635., 480., 880., 1905
2 643., 203., 653., -77., -380., -201., 146., -65., 1905
3 -192., 328., -193., 259., 56., -1., -32., -93., 1905
4 -125., -26., 11., 62., 60., -7., -11., 86., 1905
5 -221., 4., -57., -32., 57., 32., -92., -67., 1905
6 70., -54., -46., 0., -14., 33., -11., -41., 1905
7 0., -20., 28., 18., -12., 6., -22., 11., 1905
8 8., 8., -4., -15., -9., 7., 1., -13., 1905
9 2., 5., -8., 16., 5., -5., 8., -18., 1905
a 8., 10., -20., 1., 14., -11., 5., 12., 1905
b -3., 1., -2., -2., 8., 2., 10., 0., 1905
c -2., -1., 2., -3., -4., 2., 2., 1., 1905
d -5., 2., -2., 6., 6., -4., 4., 0., 1905
e 0., -2., 2., 4., 2., 0., 0., -6./ 1905
data g2/ -31354.,-2297., 5898., -769., 2948.,-1128., 1176., 1000., 1910
1 1058.,-1524., -389., 1223., 62., 705., 425., 884., 1910
2 660., 211., 644., -90., -400., -189., 160., -55., 1910
3 -201., 327., -172., 253., 57., -9., -33., -102., 1910
4 -126., -38., 21., 62., 58., -5., -11., 89., 1910
5 -224., 5., -54., -29., 54., 28., -95., -65., 1910
6 71., -54., -47., 1., -14., 32., -12., -40., 1910
7 1., -19., 28., 18., -13., 6., -22., 11., 1910
8 8., 8., -4., -15., -9., 6., 1., -13., 1910
9 2., 5., -8., 16., 5., -5., 8., -18., 1910
a 8., 10., -20., 1., 14., -11., 5., 12., 1910
b -3., 1., -2., -2., 8., 2., 10., 0., 1910
c -2., -1., 2., -3., -4., 2., 2., 1., 1910
d -5., 2., -2., 6., 6., -4., 4., 0., 1910
e 0., -2., 2., 4., 2., 0., 0., -6./ 1910
data g3/ -31212.,-2306., 5875., -802., 2956.,-1191., 1309., 917., 1915
1 1084.,-1559., -421., 1212., 84., 778., 360., 887., 1915
2 678., 218., 631., -109., -416., -173., 178., -51., 1915
3 -211., 327., -148., 245., 58., -16., -34., -111., 1915
4 -126., -51., 32., 61., 57., -2., -10., 93., 1915
5 -228., 8., -51., -26., 49., 23., -98., -62., 1915
6 72., -54., -48., 2., -14., 31., -12., -38., 1915
7 2., -18., 28., 19., -15., 6., -22., 11., 1915
8 8., 8., -4., -15., -9., 6., 2., -13., 1915
9 3., 5., -8., 16., 6., -5., 8., -18., 1915
a 8., 10., -20., 1., 14., -11., 5., 12., 1915
b -3., 1., -2., -2., 8., 2., 10., 0., 1915
c -2., -1., 2., -3., -4., 2., 2., 1., 1915
d -5., 2., -2., 6., 6., -4., 4., 0., 1915
e 0., -2., 1., 4., 2., 0., 0., -6./ 1915
data g4/ -31060.,-2317., 5845., -839., 2959.,-1259., 1407., 823., 1920
1 1111.,-1600., -445., 1205., 103., 839., 293., 889., 1920
2 695., 220., 616., -134., -424., -153., 199., -57., 1920
3 -221., 326., -122., 236., 58., -23., -38., -119., 1920
4 -125., -62., 43., 61., 55., 0., -10., 96., 1920
5 -233., 11., -46., -22., 44., 18., -101., -57., 1920
6 73., -54., -49., 2., -14., 29., -13., -37., 1920
7 4., -16., 28., 19., -16., 6., -22., 11., 1920
8 7., 8., -3., -15., -9., 6., 2., -14., 1920
9 4., 5., -7., 17., 6., -5., 8., -19., 1920
a 8., 10., -20., 1., 14., -11., 5., 12., 1920
b -3., 1., -2., -2., 9., 2., 10., 0., 1920
c -2., -1., 2., -3., -4., 2., 2., 1., 1920
d -5., 2., -2., 6., 6., -4., 4., 0., 1920
e 0., -2., 1., 4., 3., 0., 0., -6./ 1920
data g5/ -30926.,-2318., 5817., -893., 2969.,-1334., 1471., 728., 1925
1 1140.,-1645., -462., 1202., 119., 881., 229., 891., 1925
2 711., 216., 601., -163., -426., -130., 217., -70., 1925
3 -230., 326., -96., 226., 58., -28., -44., -125., 1925
4 -122., -69., 51., 61., 54., 3., -9., 99., 1925
5 -238., 14., -40., -18., 39., 13., -103., -52., 1925
6 73., -54., -50., 3., -14., 27., -14., -35., 1925
7 5., -14., 29., 19., -17., 6., -21., 11., 1925
8 7., 8., -3., -15., -9., 6., 2., -14., 1925
9 4., 5., -7., 17., 7., -5., 8., -19., 1925
a 8., 10., -20., 1., 14., -11., 5., 12., 1925
b -3., 1., -2., -2., 9., 2., 10., 0., 1925
c -2., -1., 2., -3., -4., 2., 2., 1., 1925
d -5., 2., -2., 6., 6., -4., 4., 0., 1925
e 0., -2., 1., 4., 3., 0., 0., -6./ 1925
data g6/ -30805.,-2316., 5808., -951., 2980.,-1424., 1517., 644., 1930
1 1172.,-1692., -480., 1205., 133., 907., 166., 896., 1930
2 727., 205., 584., -195., -422., -109., 234., -90., 1930
3 -237., 327., -72., 218., 60., -32., -53., -131., 1930
4 -118., -74., 58., 60., 53., 4., -9., 102., 1930
5 -242., 19., -32., -16., 32., 8., -104., -46., 1930
6 74., -54., -51., 4., -15., 25., -14., -34., 1930
7 6., -12., 29., 18., -18., 6., -20., 11., 1930
8 7., 8., -3., -15., -9., 5., 2., -14., 1930
9 5., 5., -6., 18., 8., -5., 8., -19., 1930
a 8., 10., -20., 1., 14., -12., 5., 12., 1930
b -3., 1., -2., -2., 9., 3., 10., 0., 1930
c -2., -2., 2., -3., -4., 2., 2., 1., 1930
d -5., 2., -2., 6., 6., -4., 4., 0., 1930
e 0., -2., 1., 4., 3., 0., 0., -6./ 1930
data g7/ -30715.,-2306., 5812.,-1018., 2984.,-1520., 1550., 586., 1935
1 1206.,-1740., -494., 1215., 146., 918., 101., 903., 1935
2 744., 188., 565., -226., -415., -90., 249., -114., 1935
3 -241., 329., -51., 211., 64., -33., -64., -136., 1935
4 -115., -76., 64., 59., 53., 4., -8., 104., 1935
5 -246., 25., -25., -15., 25., 4., -106., -40., 1935
6 74., -53., -52., 4., -17., 23., -14., -33., 1935
7 7., -11., 29., 18., -19., 6., -19., 11., 1935
8 7., 8., -3., -15., -9., 5., 1., -15., 1935
9 6., 5., -6., 18., 8., -5., 7., -19., 1935
a 8., 10., -20., 1., 15., -12., 5., 11., 1935
b -3., 1., -3., -2., 9., 3., 11., 0., 1935
c -2., -2., 2., -3., -4., 2., 2., 1., 1935
d -5., 2., -2., 6., 6., -4., 4., 0., 1935
e 0., -1., 2., 4., 3., 0., 0., -6./ 1935
data g8/ -30654.,-2292., 5821.,-1106., 2981.,-1614., 1566., 528., 1940
1 1240.,-1790., -499., 1232., 163., 916., 43., 914., 1940
2 762., 169., 550., -252., -405., -72., 265., -141., 1940
3 -241., 334., -33., 208., 71., -33., -75., -141., 1940
4 -113., -76., 69., 57., 54., 4., -7., 105., 1940
5 -249., 33., -18., -15., 18., 0., -107., -33., 1940
6 74., -53., -52., 4., -18., 20., -14., -31., 1940
7 7., -9., 29., 17., -20., 5., -19., 11., 1940
8 7., 8., -3., -14., -10., 5., 1., -15., 1940
9 6., 5., -5., 19., 9., -5., 7., -19., 1940
a 8., 10., -21., 1., 15., -12., 5., 11., 1940
b -3., 1., -3., -2., 9., 3., 11., 1., 1940
c -2., -2., 2., -3., -4., 2., 2., 1., 1940
d -5., 2., -2., 6., 6., -4., 4., 0., 1940
e 0., -1., 2., 4., 3., 0., 0., -6./ 1940
data g9/ -30594.,-2285., 5810.,-1244., 2990.,-1702., 1578., 477., 1945
1 1282.,-1834., -499., 1255., 186., 913., -11., 944., 1945
2 776., 144., 544., -276., -421., -55., 304., -178., 1945
3 -253., 346., -12., 194., 95., -20., -67., -142., 1945
4 -119., -82., 82., 59., 57., 6., 6., 100., 1945
5 -246., 16., -25., -9., 21., -16., -104., -39., 1945
6 70., -40., -45., 0., -18., 0., 2., -29., 1945
7 6., -10., 28., 15., -17., 29., -22., 13., 1945
8 7., 12., -8., -21., -5., -12., 9., -7., 1945
9 7., 2., -10., 18., 7., 3., 2., -11., 1945
a 5., -21., -27., 1., 17., -11., 29., 3., 1945
b -9., 16., 4., -3., 9., -4., 6., -3., 1945
c 1., -4., 8., -3., 11., 5., 1., 1., 1945
d 2., -20., -5., -1., -1., -6., 8., 6., 1945
e -1., -4., -3., -2., 5., 0., -2., -2./ 1945
data ga/ -30554.,-2250., 5815.,-1341., 2998.,-1810., 1576., 381., 1950
1 1297.,-1889., -476., 1274., 206., 896., -46., 954., 1950
2 792., 136., 528., -278., -408., -37., 303., -210., 1950
3 -240., 349., 3., 211., 103., -20., -87., -147., 1950
4 -122., -76., 80., 54., 57., -1., 4., 99., 1950
5 -247., 33., -16., -12., 12., -12., -105., -30., 1950
6 65., -55., -35., 2., -17., 1., 0., -40., 1950
7 10., -7., 36., 5., -18., 19., -16., 22., 1950
8 15., 5., -4., -22., -1., 0., 11., -21., 1950
9 15., -8., -13., 17., 5., -4., -1., -17., 1950
a 3., -7., -24., -1., 19., -25., 12., 10., 1950
b 2., 5., 2., -5., 8., -2., 8., 3., 1950
c -11., 8., -7., -8., 4., 13., -1., -2., 1950
d 13., -10., -4., 2., 4., -3., 12., 6., 1950
e 3., -3., 2., 6., 10., 11., 3., 8./ 1950
data gb/ -30500.,-2215., 5820.,-1440., 3003.,-1898., 1581., 291., 1955
1 1302.,-1944., -462., 1288., 216., 882., -83., 958., 1955
2 796., 133., 510., -274., -397., -23., 290., -230., 1955
3 -229., 360., 15., 230., 110., -23., -98., -152., 1955
4 -121., -69., 78., 47., 57., -9., 3., 96., 1955
5 -247., 48., -8., -16., 7., -12., -107., -24., 1955
6 65., -56., -50., 2., -24., 10., -4., -32., 1955
7 8., -11., 28., 9., -20., 18., -18., 11., 1955
8 9., 10., -6., -15., -14., 5., 6., -23., 1955
9 10., 3., -7., 23., 6., -4., 9., -13., 1955
a 4., 9., -11., -4., 12., -5., 7., 2., 1955
b 6., 4., -2., 1., 10., 2., 7., 2., 1955
c -6., 5., 5., -3., -5., -4., -1., 0., 1955
d 2., -8., -3., -2., 7., -4., 4., 1., 1955
e -2., -3., 6., 7., -2., -1., 0., -3./ 1955
data gc/ -30421.,-2169., 5791.,-1555., 3002.,-1967., 1590., 206., 1960
1 1302.,-1992., -414., 1289., 224., 878., -130., 957., 1960
2 800., 135., 504., -278., -394., 3., 269., -255., 1960
3 -222., 362., 16., 242., 125., -26., -117., -156., 1960
4 -114., -63., 81., 46., 58., -10., 1., 99., 1960
5 -237., 60., -1., -20., -2., -11., -113., -17., 1960
6 67., -56., -55., 5., -28., 15., -6., -32., 1960
7 7., -7., 23., 17., -18., 8., -17., 15., 1960
8 6., 11., -4., -14., -11., 7., 2., -18., 1960
9 10., 4., -5., 23., 10., 1., 8., -20., 1960
a 4., 6., -18., 0., 12., -9., 2., 1., 1960
b 0., 4., -3., -1., 9., -2., 8., 3., 1960
c 0., -1., 5., 1., -3., 4., 4., 1., 1960
d 0., 0., -1., 2., 4., -5., 6., 1., 1960
e 1., -1., -1., 6., 2., 0., 0., -7./ 1960
data gd/ -30334.,-2119., 5776.,-1662., 2997.,-2016., 1594., 114., 1965
1 1297.,-2038., -404., 1292., 240., 856., -165., 957., 1965
2 804., 148., 479., -269., -390., 13., 252., -269., 1965
3 -219., 358., 19., 254., 128., -31., -126., -157., 1965
4 -97., -62., 81., 45., 61., -11., 8., 100., 1965
5 -228., 68., 4., -32., 1., -8., -111., -7., 1965
6 75., -57., -61., 4., -27., 13., -2., -26., 1965
7 6., -6., 26., 13., -23., 1., -12., 13., 1965
8 5., 7., -4., -12., -14., 9., 0., -16., 1965
9 8., 4., -1., 24., 11., -3., 4., -17., 1965
a 8., 10., -22., 2., 15., -13., 7., 10., 1965
b -4., -1., -5., -1., 10., 5., 10., 1., 1965
c -4., -2., 1., -2., -3., 2., 2., 1., 1965
d -5., 2., -2., 6., 4., -4., 4., 0., 1965
e 0., -2., 2., 3., 2., 0., 0., -6./ 1965
data ge/ -30220.,-2068., 5737.,-1781., 3000.,-2047., 1611., 25., 1970
1 1287.,-2091., -366., 1278., 251., 838., -196., 952., 1970
2 800., 167., 461., -266., -395., 26., 234., -279., 1970
3 -216., 359., 26., 262., 139., -42., -139., -160., 1970
4 -91., -56., 83., 43., 64., -12., 15., 100., 1970
5 -212., 72., 2., -37., 3., -6., -112., 1., 1970
6 72., -57., -70., 1., -27., 14., -4., -22., 1970
7 8., -2., 23., 13., -23., -2., -11., 14., 1970
8 6., 7., -2., -15., -13., 6., -3., -17., 1970
9 5., 6., 0., 21., 11., -6., 3., -16., 1970
a 8., 10., -21., 2., 16., -12., 6., 10., 1970
b -4., -1., -5., 0., 10., 3., 11., 1., 1970
c -2., -1., 1., -3., -3., 1., 2., 1., 1970
d -5., 3., -1., 4., 6., -4., 4., 0., 1970
e 1., -1., 0., 3., 3., 1., -1., -4./ 1970
data gf/ -30100.,-2013., 5675.,-1902., 3010.,-2067., 1632., -68., 1975
1 1276.,-2144., -333., 1260., 262., 830., -223., 946., 1975
2 791., 191., 438., -265., -405., 39., 216., -288., 1975
3 -218., 356., 31., 264., 148., -59., -152., -159., 1975
4 -83., -49., 88., 45., 66., -13., 28., 99., 1975
5 -198., 75., 1., -41., 6., -4., -111., 11., 1975
6 71., -56., -77., 1., -26., 16., -5., -14., 1975
7 10., 0., 22., 12., -23., -5., -12., 14., 1975
8 6., 6., -1., -16., -12., 4., -8., -19., 1975
9 4., 6., 0., 18., 10., -10., 1., -17., 1975
a 7., 10., -21., 2., 16., -12., 7., 10., 1975
b -4., -1., -5., -1., 10., 4., 11., 1., 1975
c -3., -2., 1., -3., -3., 1., 2., 1., 1975
d -5., 3., -2., 4., 5., -4., 4., -1., 1975
e 1., -1., 0., 3., 3., 1., -1., -5./ 1975
data gg/ -29992.,-1956., 5604.,-1997., 3027.,-2129., 1663., -200., 1980
1 1281.,-2180., -336., 1251., 271., 833., -252., 938., 1980
2 782., 212., 398., -257., -419., 53., 199., -297., 1980
3 -218., 357., 46., 261., 150., -74., -151., -162., 1980
4 -78., -48., 92., 48., 66., -15., 42., 93., 1980
5 -192., 71., 4., -43., 14., -2., -108., 17., 1980
6 72., -59., -82., 2., -27., 21., -5., -12., 1980
7 16., 1., 18., 11., -23., -2., -10., 18., 1980
8 6., 7., 0., -18., -11., 4., -7., -22., 1980
9 4., 9., 3., 16., 6., -13., -1., -15., 1980
a 5., 10., -21., 1., 16., -12., 9., 9., 1980
b -5., -3., -6., -1., 9., 7., 10., 2., 1980
c -6., -5., 2., -4., -4., 1., 2., 0., 1980
d -5., 3., -2., 6., 5., -4., 3., 0., 1980
e 1., -1., 2., 4., 3., 0., 0., -6./ 1980
data gi/ -29873.,-1905., 5500.,-2072., 3044.,-2197., 1687., -306., 1985
1 1296.,-2208., -310., 1247., 284., 829., -297., 936., 1985
2 780., 232., 361., -249., -424., 69., 170., -297., 1985
3 -214., 355., 47., 253., 150., -93., -154., -164., 1985
4 -75., -46., 95., 53., 65., -16., 51., 88., 1985
5 -185., 69., 4., -48., 16., -1., -102., 21., 1985
6 74., -62., -83., 3., -27., 24., -2., -6., 1985
7 20., 4., 17., 10., -23., 0., -7., 21., 1985
8 6., 8., 0., -19., -11., 5., -9., -23., 1985
9 4., 11., 4., 14., 4., -15., -4., -11., 1985
a 5., 10., -21., 1., 15., -12., 9., 9., 1985
b -6., -3., -6., -1., 9., 7., 9., 1., 1985
c -7., -5., 2., -4., -4., 1., 3., 0., 1985
d -5., 3., -2., 6., 5., -4., 3., 0., 1985
e 1., -1., 2., 4., 3., 0., 0., -6./ 1985
data gj/ -29775.,-1848., 5406.,-2131., 3059.,-2279., 1686., -373., 1990
1 1314.,-2239., -284., 1248., 293., 802., -352., 939., 1990
2 780., 247., 325., -240., -423., 84., 141., -299., 1990
3 -214., 353., 46., 245., 154., -109., -153., -165., 1990
4 -69., -36., 97., 61., 65., -16., 59., 82., 1990
5 -178., 69., 3., -52., 18., 1., -96., 24., 1990
6 77., -64., -80., 2., -26., 26., 0., -1., 1990
7 21., 5., 17., 9., -23., 0., -4., 23., 1990
8 5., 10., -1., -19., -10., 6., -12., -22., 1990
9 3., 12., 4., 12., 2., -16., -6., -10., 1990
a 4., 9., -20., 1., 15., -12., 11., 9., 1990
b -7., -4., -7., -2., 9., 7., 8., 1., 1990
c -7., -6., 2., -3., -4., 2., 2., 1., 1990
d -5., 3., -2., 6., 4., -4., 3., 0., 1990
e 1., -2., 3., 3., 3., -1., 0., -6./ 1990
data gk/ -29692.,-1784., 5306.,-2200., 3070.,-2366., 1681., -413., 1995
1 1335.,-2267., -262., 1249., 302., 759., -427., 940., 1995
2 780., 262., 290., -236., -418., 97., 122., -306., 1995
3 -214., 352., 46., 235., 165., -118., -143., -166., 1995
4 -55., -17., 107., 68., 67., -17., 68., 72., 1995
5 -170., 67., -1., -58., 19., 1., -93., 36., 1995
6 77., -72., -69., 1., -25., 28., 4., 5., 1995
7 24., 4., 17., 8., -24., -2., -6., 25., 1995
8 6., 11., -6., -21., -9., 8., -14., -23., 1995
9 9., 15., 6., 11., -5., -16., -7., -4., 1995
a 4., 9., -20., 3., 15., -10., 12., 8., 1995
b -6., -8., -8., -1., 8., 10., 5., -2., 1995
c -8., -8., 3., -3., -6., 1., 2., 0., 1995
d -4., 4., -1., 5., 4., -5., 2., -1., 1995
e 2., -2., 5., 1., 1., -2., 0., -7., 1995
f 75*0./ 1995
data gl/ -29619.4,-1728.2, 5186.1,-2267.7, 3068.4,-2481.6, 1670.9, 2000
1 -458.0, 1339.6,-2288.0, -227.6, 1252.1, 293.4, 714.5, 2000
2 -491.1, 932.3, 786.8, 272.6, 250.0, -231.9, -403.0, 2000
3 119.8, 111.3, -303.8, -218.8, 351.4, 43.8, 222.3, 2000
4 171.9, -130.4, -133.1, -168.6, -39.3, -12.9, 106.3, 2000
5 72.3, 68.2, -17.4, 74.2, 63.7, -160.9, 65.1, 2000
6 -5.9, -61.2, 16.9, 0.7, -90.4, 43.8, 79.0, 2000
7 -74.0, -64.6, 0.0, -24.2, 33.3, 6.2, 9.1, 2000
8 24.0, 6.9, 14.8, 7.3, -25.4, -1.2, -5.8, 2000
9 24.4, 6.6, 11.9, -9.2, -21.5, -7.9, 8.5, 2000
a -16.6, -21.5, 9.1, 15.5, 7.0, 8.9, -7.9, 2000
b -14.9, -7.0, -2.1, 5.0, 9.4, -19.7, 3.0, 2000
c 13.4, -8.4, 12.5, 6.3, -6.2, -8.9, -8.4, 2000
d -1.5, 8.4, 9.3, 3.8, -4.3, -8.2, -8.2, 2000
e 4.8, -2.6, -6.0, 1.7, 1.7, 0.0, -3.1, 2000
f 4.0, -0.5, 4.9, 3.7, -5.9, 1.0, -1.2, 2000
g 2.0, -2.9, 4.2, 0.2, 0.3, -2.2, -1.1, 2000
h -7.4, 2.7, -1.7, 0.1, -1.9, 1.3, 1.5, 2000
i -0.9, -0.1, -2.6, 0.1, 0.9, -0.7, -0.7, 2000
j 0.7, -2.8, 1.7, -0.9, 0.1, -1.2, 1.2, 2000
k -1.9, 4.0, -0.9, -2.2, -0.3, -0.4, 0.2, 2000
l 0.3, 0.9, 2.5, -0.2, -2.6, 0.9, 0.7, 2000
m -0.5, 0.3, 0.3, 0.0, -0.3, 0.0, -0.4, 2000
n 0.3, -0.1, -0.9, -0.2, -0.4, -0.4, 0.8, 2000
o -0.2, -0.9, -0.9, 0.3, 0.2, 0.1, 1.8, 2000
p -0.4, -0.4, 1.3, -1.0, -0.4, -0.1, 0.7, 2000
q 0.7, -0.4, 0.3, 0.3, 0.6, -0.1, 0.3, 2000
r 0.4, -0.2, 0.0, -0.5, 0.1, -0.9/ 2000
data gm/-29554.63,-1669.05, 5077.99,-2337.24, 3047.69,-2594.50, 2005
1 1657.76, -515.43, 1336.30,-2305.83, -198.86, 1246.39, 2005
2 269.72, 672.51, -524.72, 920.55, 797.96, 282.07, 2005
3 210.65, -225.23, -379.86, 145.15, 100.00, -305.36, 2005
4 -227.00, 354.41, 42.72, 208.95, 180.25, -136.54, 2005
5 -123.45, -168.05, -19.57, -13.55, 103.85, 73.60, 2005
6 69.56, -20.33, 76.74, 54.75, -151.34, 63.63, 2005
7 -14.58, -63.53, 14.58, 0.24, -86.36, 50.94, 2005
8 79.88, -74.46, -61.14, -1.65, -22.57, 38.73, 2005
9 6.82, 12.30, 25.35, 9.37, 10.93, 5.42, 2005
a -26.32, 1.94, -4.64, 24.80, 7.62, 11.20, 2005
b -11.73, -20.88, -6.88, 9.83, -18.11, -19.71, 2005
c 10.17, 16.22, 9.36, 7.61, -11.25, -12.76, 2005
d -4.87, -0.06, 5.58, 9.76, -20.11, 3.58, 2005
e 12.69, -6.94, 12.67, 5.01, -6.72, -10.76, 2005
f -8.16, -1.25, 8.10, 8.76, 2.92, -6.66, 2005
g -7.73, -9.22, 6.01, -2.17, -6.12, 2.19, 2005
h 1.42, 0.10, -2.35, 4.46, -0.15, 4.76, 2005
i 3.06, -6.58, 0.29, -1.01, 2.06, -3.47, 2005
j 3.77, -0.86, -0.21, -2.31, -2.09, -7.93, 2005
k 2.95, -1.60, 0.26, -1.88, 1.44, 1.44, 2005
l -0.77, -0.31, -2.27, 0.29, 0.90, -0.79, 2005
m -0.58, 0.53, -2.69, 1.80, -1.08, 0.16, 2005
n -1.58, 0.96, -1.90, 3.99, -1.39, -2.15, 2005
o -0.29, -0.55, 0.21, 0.23, 0.89, 2.38, 2005
p -0.38, -2.63, 0.96, 0.61, -0.30, 0.40, 2005
q 0.46, 0.01, -0.35, 0.02, -0.36, 0.28, 2005
r 0.08, -0.87, -0.49, -0.34, -0.08, 0.88, 2005
s -0.16, -0.88, -0.76, 0.30, 0.33, 0.28, 2005
t 1.72, -0.43, -0.54, 1.18, -1.07, -0.37, 2005
u -0.04, 0.75, 0.63, -0.26, 0.21, 0.35, 2005
v 0.53, -0.05, 0.38, 0.41, -0.22, -0.10, 2005
w -0.57, -0.18, -0.82/ 2005
data gp/-29496.57,-1586.42, 4944.26,-2396.06, 3026.34,-2708.54, 2010
1 1668.17, -575.73, 1339.85,-2326.54, -160.40, 1232.10, 2010
2 251.75, 633.73, -537.03, 912.66, 808.97, 286.48, 2010
3 166.58, -211.03, -356.83, 164.46, 89.40, -309.72, 2010
4 -230.87, 357.29, 44.58, 200.26, 189.01, -141.05, 2010
5 -118.06, -163.17, -0.01, -8.03, 101.04, 72.78, 2010
6 68.69, -20.90, 75.92, 44.18, -141.40, 61.54, 2010
7 -22.83, -66.26, 13.10, 3.02, -78.09, 55.40, 2010
8 80.44, -75.00, -57.80, -4.55, -21.20, 45.24, 2010
9 6.54, 14.00, 24.96, 10.46, 7.03, 1.64, 2010
a -27.61, 4.92, -3.28, 24.41, 8.21, 10.84, 2010
b -14.50, -20.03, -5.59, 11.83, -19.34, -17.41, 2010
c 11.61, 16.71, 10.85, 6.96, -14.05, -10.74, 2010
d -3.54, 1.64, 5.50, 9.45, -20.54, 3.45, 2010
e 11.51, -5.27, 12.75, 3.13, -7.14, -12.38, 2010
f -7.42, -0.76, 7.97, 8.43, 2.14, -8.42, 2010
g -6.08, -10.08, 7.01, -1.94, -6.24, 2.73, 2010
h 0.89, -0.10, -1.07, 4.71, -0.16, 4.44, 2010
i 2.45, -7.22, -0.33, -0.96, 2.13, -3.95, 2010
j 3.09, -1.99, -1.03, -1.97, -2.80, -8.31, 2010
k 3.05, -1.48, 0.13, -2.03, 1.67, 1.65, 2010
l -0.66, -0.51, -1.76, 0.54, 0.85, -0.79, 2010
m -0.39, 0.37, -2.51, 1.79, -1.27, 0.12, 2010
n -2.11, 0.75, -1.94, 3.75, -1.86, -2.12, 2010
o -0.21, -0.87, 0.30, 0.27, 1.04, 2.13, 2010
p -0.63, -2.49, 0.95, 0.49, -0.11, 0.59, 2010
q 0.52, 0.00, -0.39, 0.13, -0.37, 0.27, 2010
r 0.21, -0.86, -0.77, -0.23, 0.04, 0.87, 2010
s -0.09, -0.89, -0.87, 0.31, 0.30, 0.42, 2010
t 1.66, -0.45, -0.59, 1.08, -1.14, -0.31, 2010
u -0.07, 0.78, 0.54, -0.18, 0.10, 0.38, 2010
v 0.49, 0.02, 0.44, 0.42, -0.25, -0.26, 2010
w -0.53, -0.26, -0.79/ 2010
data gq/-29442.0,-1501.0, 4797.1,-2445.1, 3012.9,-2845.6, 1676.7, 2015
1 -641.9, 1350.7,-2352.3, -115.3, 1225.6, 244.9, 582.0, 2015
2 -538.4, 907.6, 813.7, 283.3, 120.4, -188.7, -334.9, 2015
3 180.9, 70.4, -329.5, -232.6, 360.1, 47.3, 192.4, 2015
4 197.0, -140.9, -119.3, -157.5, 16.0, 4.1, 100.2, 2015
5 70.0, 67.7, -20.8, 72.7, 33.2, -129.9, 58.9, 2015
6 -28.9, -66.7, 13.2, 7.3, -70.9, 62.6, 81.6, 2015
7 -76.1, -54.1, -6.8, -19.5, 51.8, 5.7, 15.0, 2015
8 24.4, 9.4, 3.4, -2.8, -27.4, 6.8, -2.2, 2015
9 24.2, 8.8, 10.1, -16.9, -18.3, -3.2, 13.3, 2015
a -20.6, -14.6, 13.4, 16.2, 11.7, 5.7, -15.9, 2015
b -9.1, -2.0, 2.1, 5.4, 8.8, -21.6, 3.1, 2015
c 10.8, -3.3, 11.8, 0.7, -6.8, -13.3, -6.9, 2015
d -0.1, 7.8, 8.7, 1.0, -9.1, -4.0, -10.5, 2015
e 8.4, -1.9, -6.3, 3.2, 0.1, -0.4, 0.5, 2015
f 4.6, -0.5, 4.4, 1.8, -7.9, -0.7, -0.6, 2015
g 2.1, -4.2, 2.4, -2.8, -1.8, -1.2, -3.6, 2015
h -8.7, 3.1, -1.5, -0.1, -2.3, 2.0, 2.0, 2015
i -0.7, -0.8, -1.1, 0.6, 0.8, -0.7, -0.2, 2015
j 0.2, -2.2, 1.7, -1.4, -0.2, -2.5, 0.4, 2015
k -2.0, 3.5, -2.4, -1.9, -0.2, -1.1, 0.4, 2015
l 0.4, 1.2, 1.9, -0.8, -2.2, 0.9, 0.3, 2015
m 0.1, 0.7, 0.5, -0.1, -0.3, 0.3, -0.4, 2015
n 0.2, 0.2, -0.9, -0.9, -0.1, 0.0, 0.7, 2015
o 0.0, -0.9, -0.9, 0.4, 0.4, 0.5, 1.6, 2015
p -0.5, -0.5, 1.0, -1.2, -0.2, -0.1, 0.8, 2015
q 0.4, -0.1, -0.1, 0.3, 0.4, 0.1, 0.5, 2015
r 0.5, -0.3, -0.4, -0.4, -0.3, -0.8/ 2015
data gr/ 10.3, 18.1, -26.6, -8.7, -3.3, -27.4, 2.1, 2017
1 -14.1, 3.4, -5.5, 8.2, -0.7, -0.4, -10.1, 2017
2 1.8, -0.7, 0.2, -1.3, -9.1, 5.3, 4.1, 2017
3 2.9, -4.3, -5.2, -0.2, 0.5, 0.6, -1.3, 2017
4 1.7, -0.1, -1.2, 1.4, 3.4, 3.9, 0.0, 2017
5 -0.3, -0.1, 0.0, -0.7, -2.1, 2.1, -0.7, 2017
6 -1.2, 0.2, 0.3, 0.9, 1.6, 1.0, 0.3, 2017
7 -0.2, 0.8, -0.5, 0.4, 1.3, -0.2, 0.1, 2017
8 -0.3, -0.6, -0.6, -0.8, 0.1, 0.2, -0.2, 2017
9 0.2, 0.0, -0.3, -0.6, 0.3, 0.5, 0.1, 2017
a -0.2, 0.5, 0.4, -0.2, 0.1, -0.3, -0.4, 2017
b 0.3, 0.3, 0.0,115*0.0/ 2017
c
c set initial values
c
x = 0.0
y = 0.0
z = 0.0
if (date.lt.1900.0.or.date.gt.2025.0) go to 11
if (date.gt.2020.0) write (6,960) date
960 format (/' This version of the IGRF is intended for use up',
1 ' to 2020.0.'/' values for',f9.3,' will be computed',
2 ' but may be of reduced accuracy'/)
if (date.ge.2015.0) go to 1
t = 0.2*(date - 1900.0)
ll = t
one = ll
t = t - one
c
c SH models before 1995.0 are only to degree 10
c
if (date.lt.1995.0) then
nmx = 10
nc = nmx*(nmx+2)
ll = nc*ll
kmx = (nmx+1)*(nmx+2)/2
else
nmx = 13
nc = nmx*(nmx+2)
ll = 0.2*(date - 1995.0)
c
c 19 is the number of SH models that extend to degree 10
c
ll = 120*19 + nc*ll
kmx = (nmx+1)*(nmx+2)/2
endif
tc = 1.0 - t
if (isv.eq.1) then
tc = -0.2
t = 0.2
end if
go to 2
c
1 t = date - 2015.0
tc = 1.0
if (isv.eq.1) then
t = 1.0
tc = 0.0
end if
c
c pointer for last coefficient in pen-ultimate set of MF coefficients...
c
ll = 3060
nmx = 13
nc = nmx*(nmx+2)
kmx = (nmx+1)*(nmx+2)/2
2 r = alt
one = colat*0.017453292
ct = cos(one)
st = sin(one)
one = elong*0.017453292
cl(1) = cos(one)
sl(1) = sin(one)
cd = 1.0
sd = 0.0
l = 1
m = 1
n = 0
if (itype.eq.2) go to 3
c
c conversion from geodetic to geocentric coordinates
c (using the WGS84 spheroid)
c
a2 = 40680631.6
b2 = 40408296.0
one = a2*st*st
two = b2*ct*ct
three = one + two
rho = sqrt(three)
r = sqrt(alt*(alt + 2.0*rho) + (a2*one + b2*two)/three)
cd = (alt + rho)/r
sd = (a2 - b2)/rho*ct*st/r
one = ct
ct = ct*cd - st*sd
st = st*cd + one*sd
c
3 ratio = 6371.2/r
rr = ratio*ratio
c
c computation of Schmidt quasi-normal coefficients p and x(=q)
c
p(1) = 1.0
p(3) = st
q(1) = 0.0
q(3) = ct
do 10 k=2,kmx
if (n.ge.m) go to 4
m = 0
n = n + 1
rr = rr*ratio
fn = n
gn = n - 1
4 fm = m
if (m.ne.n) go to 5
if (k.eq.3) go to 6
one = sqrt(1.0 - 0.5/fm)
j = k - n - 1
p(k) = one*st*p(j)
q(k) = one*(st*q(j) + ct*p(j))
cl(m) = cl(m-1)*cl(1) - sl(m-1)*sl(1)
sl(m) = sl(m-1)*cl(1) + cl(m-1)*sl(1)
go to 6
5 gmm = m*m
one = sqrt(fn*fn - gmm)
two = sqrt(gn*gn - gmm)/one
three = (fn + gn)/one
i = k - n
j = i - n + 1
p(k) = three*ct*p(i) - two*p(j)
q(k) = three*(ct*q(i) - st*p(i)) - two*q(j)
c
c synthesis of x, y and z in geocentric coordinates
c
6 lm = ll + l
one = (tc*gh(lm) + t*gh(lm+nc))*rr
if (m.eq.0) go to 9
two = (tc*gh(lm+1) + t*gh(lm+nc+1))*rr
three = one*cl(m) + two*sl(m)
x = x + three*q(k)
z = z - (fn + 1.0)*three*p(k)
if (st.eq.0.0) go to 7
y = y + (one*sl(m) - two*cl(m))*fm*p(k)/st
go to 8
7 y = y + (one*sl(m) - two*cl(m))*q(k)*ct
8 l = l + 2
go to 10
9 x = x + one*q(k)
z = z - (fn + 1.0)*one*p(k)
l = l + 1
10 m = m + 1
c
c conversion to coordinate system specified by itype
c
one = x
x = x*cd + z*sd
z = z*cd - one*sd
f = sqrt(x*x + y*y + z*z)
c
return
c
c error return if date out of bounds
c
11 f = 1.0d8
write (6,961) date
961 format (/' This subroutine will not work with a date of',
1 f9.3,'. Date must be in the range 1900.0.ge.date',
2 '.le.2025.0. On return f = 1.0d8., x = y = z = 0.')
return
end
"""
the following comes from:
http://www.ngdc.noaa.gov/IAGA/vmod/igrf.html
c This is a synthesis routine for the 12th generation IGRF as agreed
c in December 2014 by IAGA Working Group V-MOD. It is valid 1900.0 to
c 2020.0 inclusive. Values for dates from 1945.0 to 2010.0 inclusive are
c definitive, otherwise they are non-definitive.
c INPUT
c isv = 0 if main-field values are required
c isv = 1 if secular variation values are required
c date = year A.D. Must be greater than or equal to 1900.0 and
c less than or equal to 2025.0. Warning message is given
c for dates greater than 2020.0. Must be double precision.
c itype = 1 if geodetic (spheroid)
c itype = 2 if geocentric (sphere)
c alt = height in km above sea level if itype = 1
c = distance from centre of Earth in km if itype = 2 (>3485 km)
c colat = colatitude (0-180)
c elong = east-longitude (0-360)
c alt, colat and elong must be double precision.
c OUTPUT
c x = north component (nT) if isv = 0, nT/year if isv = 1
c y = east component (nT) if isv = 0, nT/year if isv = 1
c z = vertical component (nT) if isv = 0, nT/year if isv = 1
c f = total intensity (nT) if isv = 0, rubbish if isv = 1
c
c To get the other geomagnetic elements (D, I, H and secular
c variations dD, dH, dI and dF) use routines ptoc and ptocsv.
c
c Adapted from 8th generation version to include new maximum degree for
c main-field models for 2000.0 and onwards and use WGS84 spheroid instead
c of International Astronomical Union 1966 spheroid as recommended by IAGA
c in July 2003. Reference radius remains as 6371.2 km - it is NOT the mean
c radius (= 6371.0 km) but 6371.2 km is what is used in determining the
c coefficients. Adaptation by Susan Macmillan, August 2003 (for
c 9th generation), December 2004, December 2009 & December 2014.
c
c Coefficients at 1995.0 incorrectly rounded (rounded up instead of
c to even) included as these are the coefficients published in Excel
c spreadsheet July 2005.
"""
import igrf12_fortran
def igrf12(isv, date, itype, alt, coalt, elong):
xyzf = igrf12_fortran.igrf12syn(isv, date, itype, alt, coalt, elong)
north_nT = xyzf[0]
east_nT = xyzf[1]
down_nT = xyzf[2]
return north_nT, east_nT, down_nT
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment