1   /* Copyright 2002-2025 CS GROUP
2    * Licensed to CS GROUP (CS) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * CS licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *   http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.orekit.files.rinex.navigation;
18  
19  import java.util.ArrayList;
20  import java.util.Collections;
21  import java.util.HashMap;
22  import java.util.List;
23  import java.util.Map;
24  
25  import org.orekit.files.rinex.RinexFile;
26  import org.orekit.gnss.SatelliteSystem;
27  import org.orekit.models.earth.ionosphere.KlobucharIonoModel;
28  import org.orekit.models.earth.ionosphere.nequick.NeQuickModel;
29  import org.orekit.propagation.analytical.gnss.data.BeidouCivilianNavigationMessage;
30  import org.orekit.propagation.analytical.gnss.data.BeidouLegacyNavigationMessage;
31  import org.orekit.propagation.analytical.gnss.data.GLONASSNavigationMessage;
32  import org.orekit.propagation.analytical.gnss.data.GPSCivilianNavigationMessage;
33  import org.orekit.propagation.analytical.gnss.data.GPSLegacyNavigationMessage;
34  import org.orekit.propagation.analytical.gnss.data.GalileoNavigationMessage;
35  import org.orekit.propagation.analytical.gnss.data.NavICL1NVNavigationMessage;
36  import org.orekit.propagation.analytical.gnss.data.NavICLegacyNavigationMessage;
37  import org.orekit.propagation.analytical.gnss.data.QZSSCivilianNavigationMessage;
38  import org.orekit.propagation.analytical.gnss.data.QZSSLegacyNavigationMessage;
39  import org.orekit.propagation.analytical.gnss.data.SBASNavigationMessage;
40  
41  /**
42   * Represents a parsed RINEX navigation messages files.
43   * @author Bryan Cazabonne
44   * @author Luc Maisonobe
45   * @since 11.0
46   */
47  public class RinexNavigation extends RinexFile<RinexNavigationHeader> {
48  
49      /** The 4 Klobuchar coefficients of a cubic equation representing the amplitude of the vertical delay. */
50      private double[] klobucharAlpha;
51  
52      /** The 4 coefficients of a cubic equation representing the period of the model. */
53      private double[] klobucharBeta;
54  
55      /** The three ionospheric coefficients broadcast in the Galileo navigation message. */
56      private double[] neQuickAlpha;
57  
58      /** A map containing the GPS navigation messages. */
59      private final Map<String, List<GPSLegacyNavigationMessage>> gpsLegacyData;
60  
61      /** A map containing the GPS navigation messages. */
62      private final Map<String, List<GPSCivilianNavigationMessage>> gpsCivilianData;
63  
64      /** A map containing the Galileo navigation messages. */
65      private final Map<String, List<GalileoNavigationMessage>> galileoData;
66  
67      /** A map containing the Beidou navigation messages. */
68      private final Map<String, List<BeidouLegacyNavigationMessage>> beidouLegacyData;
69  
70      /** A map containing the Beidou navigation messages. */
71      private final Map<String, List<BeidouCivilianNavigationMessage>> beidouCivilianData;
72  
73      /** A map containing the QZSS navigation messages. */
74      private final Map<String, List<QZSSLegacyNavigationMessage>> qzssLegacyData;
75  
76      /** A map containing the QZSS navigation messages. */
77      private final Map<String, List<QZSSCivilianNavigationMessage>> qzssCivilianData;
78  
79      /** A map containing the NavIC navigation messages. */
80      private final Map<String, List<NavICLegacyNavigationMessage>> navicLegacyData;
81  
82      /** A map containing the NavIC navigation messages.
83       * @since 13.0
84       */
85      private final Map<String, List<NavICL1NVNavigationMessage>> navicL1NVData;
86  
87      /** A map containing the GLONASS navigation messages. */
88      private final Map<String, List<GLONASSNavigationMessage>> glonassData;
89  
90      /** A map containing the SBAS navigation messages. */
91      private final Map<String, List<SBASNavigationMessage>> sbasData;
92  
93      /** System time offsets.
94       * @since 12.0
95       */
96      private final List<SystemTimeOffsetMessage> systemTimeOffsets;
97  
98      /** Earth orientation parameters.
99       * @since 12.0
100      */
101     private final List<EarthOrientationParameterMessage> eops;
102 
103     /** Ionosphere Klobuchar messages.
104      * @since 12.0
105      */
106     private final List<IonosphereKlobucharMessage> klobucharMessages;
107 
108     /** Ionosphere Nequick G messages.
109      * @since 12.0
110      */
111     private final List<IonosphereNequickGMessage> nequickGMessages;
112 
113     /** Ionosphere BDGIM messages.
114      * @since 12.0
115      */
116     private final List<IonosphereBDGIMMessage> bdgimMessages;
117 
118     /** Constructor. */
119     public RinexNavigation() {
120         super(new RinexNavigationHeader());
121         this.gpsLegacyData      = new HashMap<>();
122         this.gpsCivilianData    = new HashMap<>();
123         this.galileoData        = new HashMap<>();
124         this.beidouLegacyData   = new HashMap<>();
125         this.beidouCivilianData = new HashMap<>();
126         this.qzssLegacyData     = new HashMap<>();
127         this.qzssCivilianData   = new HashMap<>();
128         this.navicLegacyData    = new HashMap<>();
129         this.navicL1NVData = new HashMap<>();
130         this.glonassData        = new HashMap<>();
131         this.sbasData           = new HashMap<>();
132         this.systemTimeOffsets  = new ArrayList<>();
133         this.eops               = new ArrayList<>();
134         this.klobucharMessages  = new ArrayList<>();
135         this.nequickGMessages   = new ArrayList<>();
136         this.bdgimMessages      = new ArrayList<>();
137     }
138 
139     /**
140      * Get the "alpha" ionospheric parameters.
141      * <p>
142      * They are used to initialize the {@link KlobucharIonoModel}.
143      * </p>
144      * @return the "alpha" ionospheric parameters
145      */
146     public double[] getKlobucharAlpha() {
147         return klobucharAlpha.clone();
148     }
149 
150     /**
151      * Set the "alpha" ionspheric parameters.
152      * @param klobucharAlpha the "alpha" ionspheric parameters to set
153      */
154     public void setKlobucharAlpha(final double[] klobucharAlpha) {
155         this.klobucharAlpha = klobucharAlpha.clone();
156     }
157 
158     /**
159      * Get the "beta" ionospheric parameters.
160      * <p>
161      * They are used to initialize the {@link KlobucharIonoModel}.
162      * </p>
163      * @return the "beta" ionospheric parameters
164      */
165     public double[] getKlobucharBeta() {
166         return klobucharBeta.clone();
167     }
168 
169     /**
170      * Set the "beta" ionospheric parameters.
171      * @param klobucharBeta the "beta" ionospheric parameters to set
172      */
173     public void setKlobucharBeta(final double[] klobucharBeta) {
174         this.klobucharBeta = klobucharBeta.clone();
175     }
176 
177     /**
178      * Get the "alpha" ionospheric parameters.
179      * <p>
180      * They are used to initialize the {@link NeQuickModel}.
181      * </p>
182      * @return the "alpha" ionospheric parameters
183      */
184     public double[] getNeQuickAlpha() {
185         return neQuickAlpha.clone();
186     }
187 
188     /**
189      * Set the "alpha" ionospheric parameters.
190      * @param neQuickAlpha the "alpha" ionospheric parameters to set
191      */
192     public void setNeQuickAlpha(final double[] neQuickAlpha) {
193         this.neQuickAlpha = neQuickAlpha.clone();
194     }
195 
196     /**
197      * Get all the GPS legacy navigation messages contained in the file.
198      * @return an unmodifiable list of GPS legacy navigation messages
199      * @since 12.0
200      */
201     public Map<String, List<GPSLegacyNavigationMessage>> getGPSLegacyNavigationMessages() {
202         return Collections.unmodifiableMap(gpsLegacyData);
203     }
204 
205     /**
206      * Get the GPS legacy navigation messages for the given satellite Id.
207      * @param satId satellite Id (i.e. Satellite System (e.g. G) + satellite number)
208      * @return an unmodifiable list of GPS legacy navigation messages
209      * @since 12.0
210      */
211     public List<GPSLegacyNavigationMessage> getGPSLegacyNavigationMessages(final String satId) {
212         return Collections.unmodifiableList(gpsLegacyData.get(satId));
213     }
214 
215     /**
216      * Add a GPS legacy navigation message to the list.
217      * @param message message to add
218      * @since 12.0
219      */
220     public void addGPSLegacyNavigationMessage(final GPSLegacyNavigationMessage message) {
221         final int    gpsPRN = message.getPRN();
222         final String prnString = gpsPRN < 10 ? "0" + gpsPRN : String.valueOf(gpsPRN);
223         final String satId = SatelliteSystem.GPS.getKey() + prnString;
224         gpsLegacyData.putIfAbsent(satId, new ArrayList<>());
225         gpsLegacyData.get(satId).add(message);
226     }
227 
228     /**
229      * Get all the GPS civilian navigation messages contained in the file.
230      * @return an unmodifiable list of GPS civilian navigation messages
231      * @since 12.0
232      */
233     public Map<String, List<GPSCivilianNavigationMessage>> getGPSCivilianNavigationMessages() {
234         return Collections.unmodifiableMap(gpsCivilianData);
235     }
236 
237     /**
238      * Get the GPS civilian navigation messages for the given satellite Id.
239      * @param satId satellite Id (i.e. Satellite System (e.g. G) + satellite number)
240      * @return an unmodifiable list of GPS civilian navigation messages
241      * @since 12.0
242      */
243     public List<GPSCivilianNavigationMessage> getGPSCivilianNavigationMessages(final String satId) {
244         return Collections.unmodifiableList(gpsCivilianData.get(satId));
245     }
246 
247     /**
248      * Add a GPS civilian navigation message to the list.
249      * @param message message to add
250      * @since 13.0
251      */
252     public void addGPSCivilianNavigationMessage(final GPSCivilianNavigationMessage message) {
253         final int    gpsPRN = message.getPRN();
254         final String prnString = gpsPRN < 10 ? "0" + gpsPRN : String.valueOf(gpsPRN);
255         final String satId = SatelliteSystem.GPS.getKey() + prnString;
256         gpsCivilianData.putIfAbsent(satId, new ArrayList<>());
257         gpsCivilianData.get(satId).add(message);
258     }
259 
260     /**
261      * Get all the Galileo navigation messages contained in the file.
262      * @return an unmodifiable list of Galileo navigation messages
263      */
264     public Map<String, List<GalileoNavigationMessage>> getGalileoNavigationMessages() {
265         return Collections.unmodifiableMap(galileoData);
266     }
267 
268     /**
269      * Get the Galileo navigation messages for the given satellite Id.
270      * @param satId satellite Id (i.e. Satellite System (e.g. E) + satellite number)
271      * @return an unmodifiable list of Galileo navigation messages
272      */
273     public List<GalileoNavigationMessage> getGalileoNavigationMessages(final String satId) {
274         return Collections.unmodifiableList(galileoData.get(satId));
275     }
276 
277     /**
278      * Add a Galileo navigation message to the list.
279      * @param message message to add
280      */
281     public void addGalileoNavigationMessage(final GalileoNavigationMessage message) {
282         final int    galPRN = message.getPRN();
283         final String prnString = galPRN < 10 ? "0" + galPRN : String.valueOf(galPRN);
284         final String satId = SatelliteSystem.GALILEO.getKey() + prnString;
285         galileoData.putIfAbsent(satId, new ArrayList<>());
286         galileoData.get(satId).add(message);
287     }
288 
289     /**
290      * Get all the Beidou navigation messages contained in the file.
291      * @return an unmodifiable list of Beidou navigation messages
292      * @since 12.0
293      */
294     public Map<String, List<BeidouLegacyNavigationMessage>> getBeidouLegacyNavigationMessages() {
295         return Collections.unmodifiableMap(beidouLegacyData);
296     }
297 
298     /**
299      * Get the Beidou navigation messages for the given satellite Id.
300      * @param satId satellite Id (i.e. Satellite System (e.g. C) + satellite number)
301      * @return an unmodifiable list of Beidou navigation messages
302      * @since 12.0
303      */
304     public List<BeidouLegacyNavigationMessage> getBeidouLegacyNavigationMessages(final String satId) {
305         return Collections.unmodifiableList(beidouLegacyData.get(satId));
306     }
307 
308     /**
309      * Add a Beidou navigation message to the list.
310      * @param message message to add
311      * @since 12.0
312      */
313     public void addBeidouLegacyNavigationMessage(final BeidouLegacyNavigationMessage message) {
314         final int    bdtPRN = message.getPRN();
315         final String prnString = bdtPRN < 10 ? "0" + bdtPRN : String.valueOf(bdtPRN);
316         final String satId = SatelliteSystem.BEIDOU.getKey() + prnString;
317         beidouLegacyData.putIfAbsent(satId, new ArrayList<>());
318         beidouLegacyData.get(satId).add(message);
319     }
320 
321     /**
322      * Get all the Beidou navigation messages contained in the file.
323      * @return an unmodifiable list of Beidou navigation messages
324      * @since 12.0
325      */
326     public Map<String, List<BeidouCivilianNavigationMessage>> getBeidouCivilianNavigationMessages() {
327         return Collections.unmodifiableMap(beidouCivilianData);
328     }
329 
330     /**
331      * Get the Beidou navigation messages for the given satellite Id.
332      * @param satId satellite Id (i.e. Satellite System (e.g. C) + satellite number)
333      * @return an unmodifiable list of Beidou navigation messages
334      * @since 12.0
335      */
336     public List<BeidouCivilianNavigationMessage> getBeidouCivilianNavigationMessages(final String satId) {
337         return Collections.unmodifiableList(beidouCivilianData.get(satId));
338     }
339 
340     /**
341      * Add a Beidou navigation message to the list.
342      * @param message message to add
343      * @since 12.0
344      */
345     public void addBeidouCivilianNavigationMessage(final BeidouCivilianNavigationMessage message) {
346         final int    bdtPRN = message.getPRN();
347         final String prnString = bdtPRN < 10 ? "0" + bdtPRN : String.valueOf(bdtPRN);
348         final String satId = SatelliteSystem.BEIDOU.getKey() + prnString;
349         beidouCivilianData.putIfAbsent(satId, new ArrayList<>());
350         beidouCivilianData.get(satId).add(message);
351     }
352 
353     /**
354      * Get all the QZSS navigation messages contained in the file.
355      * @return an unmodifiable list of QZSS navigation messages
356      * @since 12.0
357      */
358     public Map<String, List<QZSSLegacyNavigationMessage>> getQZSSLegacyNavigationMessages() {
359         return Collections.unmodifiableMap(qzssLegacyData);
360     }
361 
362     /**
363      * Get the QZSS navigation messages for the given satellite Id.
364      * @param satId satellite Id (i.e. Satellite System (e.g. J) + satellite number)
365      * @return an unmodifiable list of QZSS navigation messages
366      * @since 12.0
367      */
368     public List<QZSSLegacyNavigationMessage> getQZSSLegacyNavigationMessages(final String satId) {
369         return Collections.unmodifiableList(qzssLegacyData.get(satId));
370     }
371 
372     /**
373      * Add a QZSS navigation message to the list.
374      * @param message message to add
375      * @since 12.0
376      */
377     public void addQZSSLegacyNavigationMessage(final QZSSLegacyNavigationMessage message) {
378         final int    qzsPRN = message.getPRN();
379         final String prnString = qzsPRN < 10 ? "0" + qzsPRN : String.valueOf(qzsPRN);
380         final String satId = SatelliteSystem.QZSS.getKey() + prnString;
381         qzssLegacyData.putIfAbsent(satId, new ArrayList<>());
382         qzssLegacyData.get(satId).add(message);
383     }
384 
385     /**
386      * Get all the QZSS navigation messages contained in the file.
387      * @return an unmodifiable list of QZSS navigation messages
388      * @since 12.0
389      */
390     public Map<String, List<QZSSCivilianNavigationMessage>> getQZSSCivilianNavigationMessages() {
391         return Collections.unmodifiableMap(qzssCivilianData);
392     }
393 
394     /**
395      * Get the QZSS navigation messages for the given satellite Id.
396      * @param satId satellite Id (i.e. Satellite System (e.g. J) + satellite number)
397      * @return an unmodifiable list of QZSS navigation messages
398      * @since 12.0
399      */
400     public List<QZSSCivilianNavigationMessage> getQZSSCivilianNavigationMessages(final String satId) {
401         return Collections.unmodifiableList(qzssCivilianData.get(satId));
402     }
403 
404     /**
405      * Add a QZSS navigation message to the list.
406      * @param message message to add
407      * @since 12.0
408      */
409     public void addQZSSCivilianNavigationMessage(final QZSSCivilianNavigationMessage message) {
410         final int    qzsPRN = message.getPRN();
411         final String prnString = qzsPRN < 10 ? "0" + qzsPRN : String.valueOf(qzsPRN);
412         final String satId = SatelliteSystem.QZSS.getKey() + prnString;
413         qzssCivilianData.putIfAbsent(satId, new ArrayList<>());
414         qzssCivilianData.get(satId).add(message);
415     }
416 
417     /**
418      * Get all the NavIC navigation messages contained in the file.
419      * @return an unmodifiable list of NavIC navigation messages
420      */
421     public Map<String, List<NavICLegacyNavigationMessage>> getNavICLegacyNavigationMessages() {
422         return Collections.unmodifiableMap(navicLegacyData);
423     }
424 
425     /**
426      * Get the NavIC navigation messages for the given satellite Id.
427      * @param satId satellite Id (i.e. Satellite System (e.g. I) + satellite number)
428      * @return an unmodifiable list of NavIC navigation messages
429      */
430     public List<NavICLegacyNavigationMessage> getNavICLegacyNavigationMessages(final String satId) {
431         return Collections.unmodifiableList(navicLegacyData.get(satId));
432     }
433 
434     /**
435      * Add a NavIC navigation message to the list.
436      * @param message message to add
437      */
438     public void addNavICLegacyNavigationMessage(final NavICLegacyNavigationMessage message) {
439         final int    irsPRN = message.getPRN();
440         final String prnString = irsPRN < 10 ? "0" + irsPRN : String.valueOf(irsPRN);
441         final String satId = SatelliteSystem.NAVIC.getKey() + prnString;
442         navicLegacyData.putIfAbsent(satId, new ArrayList<>());
443         navicLegacyData.get(satId).add(message);
444     }
445 
446     /**
447      * Get all the NavIC navigation messages contained in the file.
448      * @return an unmodifiable list of NavIC navigation messages
449      */
450     public Map<String, List<NavICL1NVNavigationMessage>> getNavICL1NVNavigationMessages() {
451         return Collections.unmodifiableMap(navicL1NVData);
452     }
453 
454     /**
455      * Get the NavIC navigation messages for the given satellite Id.
456      * @param satId satellite Id (i.e. Satellite System (e.g. I) + satellite number)
457      * @return an unmodifiable list of NavIC navigation messages
458      */
459     public List<NavICL1NVNavigationMessage> getNavICL1NVNavigationMessages(final String satId) {
460         return Collections.unmodifiableList(navicL1NVData.get(satId));
461     }
462 
463     /**
464      * Add a NavIC navigation message to the list.
465      * @param message message to add
466      */
467     public void addNavICL1NVNavigationMessage(final NavICL1NVNavigationMessage message) {
468         final int    irsPRN = message.getPRN();
469         final String prnString = irsPRN < 10 ? "0" + irsPRN : String.valueOf(irsPRN);
470         final String satId = SatelliteSystem.NAVIC.getKey() + prnString;
471         navicL1NVData.putIfAbsent(satId, new ArrayList<>());
472         navicL1NVData.get(satId).add(message);
473     }
474 
475     /**
476      * Get all the Glonass navigation messages contained in the file.
477      * @return an unmodifiable list of Glonass navigation messages
478      */
479     public Map<String, List<GLONASSNavigationMessage>> getGlonassNavigationMessages() {
480         return Collections.unmodifiableMap(glonassData);
481     }
482 
483     /**
484      * Get the Glonass navigation messages for the given satellite Id.
485      * @param satId satellite Id (i.e. Satellite System (e.g. R) + satellite number)
486      * @return an unmodifiable list of Glonass navigation messages
487      */
488     public List<GLONASSNavigationMessage> getGlonassNavigationMessages(final String satId) {
489         return Collections.unmodifiableList(glonassData.get(satId));
490     }
491 
492     /**
493      * Add a Glonass navigation message to the list.
494      * @param message message to add
495      */
496     public void addGlonassNavigationMessage(final GLONASSNavigationMessage message) {
497         final int    gloPRN = message.getPRN();
498         final String prnString = gloPRN < 10 ? "0" + gloPRN : String.valueOf(gloPRN);
499         final String satId = SatelliteSystem.GLONASS.getKey() + prnString;
500         glonassData.putIfAbsent(satId, new ArrayList<>());
501         glonassData.get(satId).add(message);
502     }
503 
504     /**
505      * Get all the SBAS navigation messages contained in the file.
506      * @return an unmodifiable list of SBAS navigation messages
507      */
508     public Map<String, List<SBASNavigationMessage>> getSBASNavigationMessages() {
509         return Collections.unmodifiableMap(sbasData);
510     }
511 
512     /**
513      * Get the SBAS navigation messages for the given satellite Id.
514      * @param satId satellite Id (i.e. Satellite System (e.g. S) + satellite number)
515      * @return an unmodifiable list of SBAS navigation messages
516      */
517     public List<SBASNavigationMessage> getSBASNavigationMessages(final String satId) {
518         return Collections.unmodifiableList(sbasData.get(satId));
519     }
520 
521     /**
522      * Add a SBAS navigation message to the list.
523      * @param message message to add
524      */
525     public void addSBASNavigationMessage(final SBASNavigationMessage message) {
526         final int    sbsPRN = message.getPRN();
527         final String prnString = sbsPRN < 10 ? "0" + sbsPRN : String.valueOf(sbsPRN);
528         final String satId = SatelliteSystem.SBAS.getKey() + prnString;
529         sbasData.putIfAbsent(satId, new ArrayList<>());
530         sbasData.get(satId).add(message);
531     }
532 
533     /**
534      * Get the system time offsets.
535      * @return an unmodifiable list of system time offsets
536      * @since 12.0
537      */
538     public List<SystemTimeOffsetMessage> getSystemTimeOffsets() {
539         return Collections.unmodifiableList(systemTimeOffsets);
540     }
541 
542     /**
543      * Add a system time offset.
544      * @param systemTimeOffset system time offset message
545      * @since 12.0
546      */
547     public void addSystemTimeOffset(final SystemTimeOffsetMessage systemTimeOffset) {
548         systemTimeOffsets.add(systemTimeOffset);
549     }
550 
551     /**
552      * Get the Earth orientation parameters.
553      * @return an unmodifiable list of Earth orientation parameters
554      * @since 12.0
555      */
556     public List<EarthOrientationParameterMessage> getEarthOrientationParameters() {
557         return Collections.unmodifiableList(eops);
558     }
559 
560     /**
561      * Add an Earth orientation parameter.
562      * @param eop Earth orientation oarameter message
563      * @since 12.0
564      */
565     public void addEarthOrientationParameter(final EarthOrientationParameterMessage eop) {
566         eops.add(eop);
567     }
568 
569     /**
570      * Get the ionosphere Klobuchar messages.
571      * @return an unmodifiable list of ionosphere Klobuchar messages
572      * @since 12.0
573      */
574     public List<IonosphereKlobucharMessage> getKlobucharMessages() {
575         return Collections.unmodifiableList(klobucharMessages);
576     }
577 
578     /**
579      * Add an ionosphere Klobuchar message.
580      * @param klobuchar ionosphere Klobuchar message
581      * @since 12.0
582      */
583     public void addKlobucharMessage(final IonosphereKlobucharMessage klobuchar) {
584         klobucharMessages.add(klobuchar);
585     }
586 
587     /**
588      * Get the ionosphere Nequick-G messages.
589      * @return an unmodifiable list of ionosphere Nequick-G messages
590      * @since 12.0
591      */
592     public List<IonosphereNequickGMessage> getNequickGMessages() {
593         return Collections.unmodifiableList(nequickGMessages);
594     }
595 
596     /**
597      * Add an ionosphere Nequick-G message.
598      * @param nequickG ionosphere Nequick-G message
599      * @since 12.0
600      */
601     public void addNequickGMessage(final IonosphereNequickGMessage nequickG) {
602         nequickGMessages.add(nequickG);
603     }
604 
605     /**
606      * Get the ionosphere BDGIM messages.
607      * @return an unmodifiable list of ionosphere BDGIM messages
608      * @since 12.0
609      */
610     public List<IonosphereBDGIMMessage> getBDGIMMessages() {
611         return Collections.unmodifiableList(bdgimMessages);
612     }
613 
614     /**
615      * Add an ionosphere BDGIM message.
616      * @param bdgim ionosphere BDGIM message
617      * @since 12.0
618      */
619     public void addBDGIMMessage(final IonosphereBDGIMMessage bdgim) {
620         bdgimMessages.add(bdgim);
621     }
622 
623 }