1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.models.earth;
18
19 import org.orekit.data.DataSource;
20
21 import java.io.IOException;
22 import java.io.StreamTokenizer;
23 import java.util.ArrayList;
24 import java.util.List;
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70 public class GeoMagneticModelParser {
71
72
73
74 public GeoMagneticModelParser() {
75
76 }
77
78
79
80
81
82
83 public List<GeoMagneticField> parse(final DataSource dataSource) throws IOException {
84
85
86 final StreamTokenizer str = new StreamTokenizer(dataSource.getOpener().openReaderOnce());
87
88
89 final List<GeoMagneticField> fields = new ArrayList<>();
90 for (GeoMagneticField model = readModel(str); model != null; model = readModel(str)) {
91 fields.add(model);
92 }
93
94 return fields;
95
96 }
97
98
99
100
101
102
103 private GeoMagneticField readModel(final StreamTokenizer stream) throws IOException {
104
105
106 final int ttype = stream.nextToken();
107 if (ttype == StreamTokenizer.TT_EOF) {
108 return null;
109 }
110
111 if (ttype == StreamTokenizer.TT_WORD) {
112 return readCombinedFormat(stream);
113 } else {
114 return readOriginalWMMFormat(stream);
115 }
116 }
117
118
119
120
121
122
123 private GeoMagneticField readCombinedFormat(final StreamTokenizer stream)
124 throws IOException {
125 final String modelName = stream.sval;
126 stream.nextToken();
127 final double epoch = stream.nval;
128 stream.nextToken();
129 final int nMax = (int) stream.nval;
130 stream.nextToken();
131 final int nMaxSecVar = (int) stream.nval;
132
133
134 stream.nextToken();
135
136 stream.nextToken();
137 final double startYear = stream.nval;
138
139 stream.nextToken();
140 final double endYear = stream.nval;
141
142 final GeoMagneticField model = new GeoMagneticField(modelName, epoch, nMax, nMaxSecVar,
143 startYear, endYear);
144
145
146 stream.nextToken();
147 @SuppressWarnings("unused")
148 final double altmin = stream.nval;
149
150 stream.nextToken();
151 @SuppressWarnings("unused")
152 final double altmax = stream.nval;
153
154 stream.nextToken();
155 stream.nextToken();
156
157
158 boolean done;
159 int n;
160 int m;
161
162 do {
163 stream.nextToken();
164 n = (int) stream.nval;
165 stream.nextToken();
166 m = (int) stream.nval;
167
168 stream.nextToken();
169 final double gnm = stream.nval;
170 stream.nextToken();
171 final double hnm = stream.nval;
172 stream.nextToken();
173 final double dgnm = stream.nval;
174 stream.nextToken();
175 final double dhnm = stream.nval;
176
177 model.setMainFieldCoefficients(n, m, gnm, hnm);
178 if (n <= nMaxSecVar && m <= nMaxSecVar) {
179 model.setSecularVariationCoefficients(n, m, dgnm, dhnm);
180 }
181
182 stream.nextToken();
183 stream.nextToken();
184
185 done = n == nMax && m == nMax;
186 } while (!done);
187
188 return model;
189 }
190
191
192
193
194
195
196 private GeoMagneticField readOriginalWMMFormat(final StreamTokenizer stream) throws IOException {
197
198
199 final int nMax = 12;
200 final int nMaxSecVar = 12;
201
202
203
204 stream.whitespaceChars('/', '/');
205
206 final double epoch = stream.nval;
207 stream.nextToken();
208 final String modelName = stream.sval;
209 stream.nextToken();
210 final double month = stream.nval;
211 stream.nextToken();
212 final double day = stream.nval;
213 stream.nextToken();
214 final double year = stream.nval;
215
216 final double startYear = GeoMagneticField.getDecimalYear((int) day, (int) month, (int) year);
217
218 final GeoMagneticField model = new GeoMagneticField(modelName, epoch, nMax, nMaxSecVar,
219 startYear, epoch + 5.0);
220
221
222 boolean done;
223 int n;
224 int m;
225
226 do {
227 stream.nextToken();
228 n = (int) stream.nval;
229 stream.nextToken();
230 m = (int) stream.nval;
231
232 stream.nextToken();
233 final double gnm = stream.nval;
234 stream.nextToken();
235 final double hnm = stream.nval;
236 stream.nextToken();
237 final double dgnm = stream.nval;
238 stream.nextToken();
239 final double dhnm = stream.nval;
240
241 model.setMainFieldCoefficients(n, m, gnm, hnm);
242 if (n <= nMaxSecVar && m <= nMaxSecVar) {
243 model.setSecularVariationCoefficients(n, m, dgnm, dhnm);
244 }
245
246 done = n == nMax && m == nMax;
247 } while (!done);
248
249
250 stream.nextToken();
251 stream.nextToken();
252
253 return model;
254 }
255
256 }