1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.forces.gravity.potential;
18
19 import org.orekit.errors.OrekitException;
20 import org.orekit.errors.OrekitMessages;
21
22 import java.io.BufferedReader;
23 import java.io.IOException;
24 import java.io.InputStream;
25 import java.io.InputStreamReader;
26 import java.nio.charset.StandardCharsets;
27 import java.text.ParseException;
28 import java.util.regex.Pattern;
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 public class SHAFormatReader extends PotentialCoefficientsReader {
47
48
49 private static final String ZERO = "0.0";
50
51
52 private static final String ONE = "1.0";
53
54
55 private static final String SPACES = "\\s+";
56
57
58 private static final Pattern SEPARATOR = Pattern.compile(SPACES);
59
60
61 private static final Pattern REAL = Pattern.compile("[-+]?\\d?\\.\\d+[eEdD][-+]\\d\\d");
62
63
64 private static final Pattern HEADER_LINE = Pattern.compile("^\\s*" + REAL + SPACES + REAL + "\\s+\\d+\\s+\\d+\\s*$");
65
66
67 private static final Pattern DATA_LINE = Pattern.compile("^\\s*\\d+\\s+\\d+\\s+" + REAL + SPACES + REAL + SPACES + REAL + SPACES + REAL + "\\s*$");
68
69
70 private static final int START_DEGREE_ORDER = 120;
71
72
73
74
75
76
77 public SHAFormatReader(final String supportedNames, final boolean missingCoefficientsAllowed) {
78 super(supportedNames, missingCoefficientsAllowed, null);
79 }
80
81
82 public void loadData(final InputStream input, final String name) throws IOException, ParseException, OrekitException {
83
84
85 setReadComplete(false);
86 setTideSystem(TideSystem.UNKNOWN);
87 int lineNumber = 0;
88 int maxDegree;
89 int maxOrder;
90 String line = null;
91 TemporaryCoefficientsContainer container = new TemporaryCoefficientsContainer(START_DEGREE_ORDER, START_DEGREE_ORDER,
92 missingCoefficientsAllowed() ? 0.0 : Double.NaN);
93 try (BufferedReader r = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8))) {
94 for (line = r.readLine(); line != null; line = r.readLine()) {
95 ++lineNumber;
96 if (lineNumber == 1) {
97
98 if (!HEADER_LINE.matcher(line).matches()) {
99 throw new OrekitException(OrekitMessages.UNABLE_TO_PARSE_LINE_IN_FILE,
100 lineNumber, name, line);
101 }
102 final String[] headerFields = SEPARATOR.split(line.trim());
103 setMu(Double.parseDouble(headerFields[0]));
104 setAe(Double.parseDouble(headerFields[1]));
105 maxDegree = Integer.parseInt(headerFields[2]);
106 maxOrder = Integer.parseInt(headerFields[3]);
107 container = container.resize(maxDegree, maxOrder);
108 parseCoefficient(ONE, container.getFlattener(), container.getC(), 0, 0, "C", name);
109 parseCoefficient(ZERO, container.getFlattener(), container.getS(), 0, 0, "S", name);
110 parseCoefficient(ZERO, container.getFlattener(), container.getS(), 1, 0, "C", name);
111 parseCoefficient(ZERO, container.getFlattener(), container.getS(), 1, 0, "S", name);
112 parseCoefficient(ZERO, container.getFlattener(), container.getS(), 1, 1, "C", name);
113 parseCoefficient(ZERO, container.getFlattener(), container.getS(), 1, 1, "S", name);
114 } else if (lineNumber > 1) {
115
116 if (!DATA_LINE.matcher(line).matches()) {
117 throw new OrekitException(OrekitMessages.UNABLE_TO_PARSE_LINE_IN_FILE,
118 lineNumber, name, line);
119 }
120 final String[] dataFields = SEPARATOR.split(line.trim());
121
122 final int n = Integer.parseInt(dataFields[0]);
123 final int m = Integer.parseInt(dataFields[1]);
124 parseCoefficient(dataFields[2], container.getFlattener(), container.getC(), n, m, "C", name);
125 parseCoefficient(dataFields[3], container.getFlattener(), container.getS(), n, m, "S", name);
126 }
127 }
128 } catch (NumberFormatException nfe) {
129 throw new OrekitException(OrekitMessages.UNABLE_TO_PARSE_LINE_IN_FILE,
130 lineNumber, name, line);
131 }
132 setRawCoefficients(true, container.getFlattener(), container.getC(), container.getS(), name);
133 setReadComplete(true);
134 }
135
136
137
138
139
140
141
142
143
144
145
146 public RawSphericalHarmonicsProvider getProvider(final boolean wantNormalized,
147 final int degree, final int order) {
148 return getBaseProvider(wantNormalized, degree, order);
149 }
150
151 }