source: git/src/igrf2c.py @ 9fcc81a

RELEASE/1.2debug-cidebug-ci-sanitiserswalls-data
Last change on this file since 9fcc81a was ba701e8, checked in by Olly Betts <olly@…>, 9 years ago

src/: Add IGRF handling code from therion 5.3.16.

  • Property mode set to 100755
File size: 1.9 KB
Line 
1#!/usr/bin/python3
2# Martin Budaj 2014
3
4import sys
5
6if len(sys.argv) == 1:
7  print('usage: %s <coefficients.txt>' % sys.argv[0])
8  sys.exit(1)
9
10def get_values(d):
11  return d[3:len(d)-1]
12
13def iround(d):
14  if '.' in d:
15    return d.rstrip('0').rstrip('.')
16  else:
17    return d
18
19data = dict()
20max_n = 0
21
22with open(sys.argv[1]) as fin:
23  for l in fin:
24    if l.startswith(('#', 'c/s')): continue
25    l = l.rstrip()
26    ldata = l.split()
27    if ldata[0] == 'g/h':
28      assert(ldata[1] == 'n' and ldata[2] == 'm')
29      years = get_values(ldata)
30    elif ldata[0] in ('g', 'h'):
31      n = int(ldata[1])
32      m = int(ldata[2])
33      data[ldata[0],n,m] = list(get_values(ldata))
34      data[ldata[0]+'_delta',n,m] = ldata[len(ldata)-1],
35      max_n = max(max_n, n, m)
36    else:
37      raise ValueError('data line in unknown format!')
38
39with open('../thgeomagdata.h','w') as fout:
40  fout.write('''// generated by geomag/igrf2c.py
41
42#ifndef thgeomagdata_h
43#define thgeomagdata_h
44
45''')
46  for gh in ('g', 'h', 'g_delta', 'h_delta'):
47    if 'delta' in gh:
48      isdelta = True
49      suffix = 'D'
50      yy = (0,)
51    else:
52      isdelta = False
53      suffix = '[%d]' % len(years)
54      yy = range(0,len(years))
55    fout.write('static const double thgeomag_%sNM%s[%d][%d] = {\n' %
56      (gh[0].upper(),suffix,max_n+1,max_n+1))
57    for y in yy:
58      if not isdelta: fout.write('{\n')
59      for n in range(0,max_n+1):
60        fout.write('  {')
61        for m in range(0,max_n+1):
62          fout.write('%s, ' % (iround(data[gh,n,m][y]) if (gh,n,m) in data else '0'))
63        fout.write('},\n')
64      if not isdelta: fout.write('},\n')
65    fout.write('};\n')
66
67  fout.write(
68'''#define thgeomag_maxmindex %d
69#define thgeomag_step %d
70#define thgeomag_minyear %d
71#define thgeomag_maxdeg %d
72
73#endif
74
75''' % (len(years)-1, float(years[1])-float(years[0]), float(years[0]), max_n))
76
77  print('OK: ../thgeomagdata.h created')
Note: See TracBrowser for help on using the repository browser.