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.ccsds.ndm.cdm;
18  
19  import org.hipparchus.linear.MatrixUtils;
20  import org.hipparchus.linear.RealMatrix;
21  import org.orekit.errors.OrekitException;
22  import org.orekit.errors.OrekitMessages;
23  import org.orekit.files.ccsds.section.CommentsContainer;
24  
25  /**
26   * Container for XYZ covariance matrix data.
27   * <p>
28   * Beware that the Orekit getters and setters all rely on SI units. The parsers
29   * and writers take care of converting these SI units into CCSDS mandatory units.
30   * The {@link org.orekit.utils.units.Unit Unit} class provides useful
31   * {@link org.orekit.utils.units.Unit#fromSI(double) fromSi} and
32   * {@link org.orekit.utils.units.Unit#toSI(double) toSI} methods in case the callers
33   * already use CCSDS units instead of the API SI units. The general-purpose
34   * {@link org.orekit.utils.units.Unit Unit} class (without an 's') and the
35   * CCSDS-specific {@link org.orekit.files.ccsds.definitions.Units Units} class
36   * (with an 's') also provide some predefined units. These predefined units and the
37   * {@link org.orekit.utils.units.Unit#fromSI(double) fromSi} and
38   * {@link org.orekit.utils.units.Unit#toSI(double) toSI} conversion methods are indeed
39   * what the parsers and writers use for the conversions.
40   * </p>
41   * <p>
42   * This class as a RealMatrix as attribute which can be access with
43   * {@code getXYZCovariaxMatrix} method. Beware that there are thus two ways to modify
44   * the XYZ covariance : {@code setC…} ({@code setCxx}, {@code setCyx}…) which should be
45   * prioritized and {@code getXYZCovariaxMatrix.setEntry(row, col, value)}.
46   * </p>
47   * <p>
48   * The XYZ Covariance Matrix is only provided if {@link CdmMetadataKey#ALT_COV_TYPE} is
49   * {@link AltCovarianceType#XYZ}, otherwise its terms will return {@code NaN}.
50   * </p>
51   * <p>
52   * When available, the matrix is given in the 9×9 Lower Triangular Form. All parameters
53   * of the 6×6 position/velocity submatrix are mandatory. The remaining elements will
54   * return {@code NaN} if not provided.
55   * </p>
56   */
57  public class XYZCovariance extends CommentsContainer {
58  
59      /** XYZ covariance matrix. */
60      private final RealMatrix covarianceMatrix;
61  
62      /** Flag indicating whether the alternate covariance type set in the CDM Object metadata section is XYZ. */
63      private final boolean covXYZset;
64  
65      /** Simple constructor. To update matrix value there are 2 ways to modify the XYZ
66       * covariance : setC... ( setCxx, setCyx ...) which should be prioritized and
67       * getXYZCovariaxMatrix.setEntry(row, col, value).
68       * <p> The XYZ Covariance Matrix is only provided if {@link CdmMetadataKey#ALT_COV_TYPE} is {@link AltCovarianceType#XYZ}, otherwise
69       * its terms will return NaN. </p>
70       * <p> When available, the matrix is given in the 9×9 Lower Triangular Form. All parameters of the 6×6 position/velocity submatrix
71       * are mandatory. The remaining elements will return NaN if not provided.</p>
72       * @param covXYZset Flag indicating whether the alternate covariance type set in the CDM Object metadata section is XYZ.
73       */
74      public XYZCovariance(final boolean covXYZset) {
75          this.covXYZset = covXYZset;
76          covarianceMatrix = MatrixUtils.createRealMatrix(9, 9);
77          for (int i = 0; i < covarianceMatrix.getRowDimension(); ++i) {
78              for (int j = 0; j <= i; ++j) {
79                  covarianceMatrix.setEntry(i, j, Double.NaN);
80              }
81          }
82  
83      }
84  
85      /** {@inheritDoc} */
86      @Override
87      public void validate(final double version) {
88          super.validate(version);
89  
90          // Conditional on ALT_COV_TYPE = XYZ
91          if (!isCovXYZset()) {
92              throw new OrekitException(OrekitMessages.CCSDS_DATE_INVALID_PREAMBLE_FIELD, CdmMetadataKey.ALT_COV_TYPE);
93          }
94  
95          // We only check values that are mandatory in a cdm file
96          checkNotNaN(getCxx(),              XYZCovarianceKey.CX_X.name());
97          checkNotNaN(getCyx(),              XYZCovarianceKey.CY_X.name());
98          checkNotNaN(getCyy(),              XYZCovarianceKey.CY_Y.name());
99          checkNotNaN(getCzx(),              XYZCovarianceKey.CZ_X.name());
100         checkNotNaN(getCzy(),              XYZCovarianceKey.CZ_Y.name());
101         checkNotNaN(getCzz(),              XYZCovarianceKey.CZ_Z.name());
102         checkNotNaN(getCxdotx(),           XYZCovarianceKey.CXDOT_X.name());
103         checkNotNaN(getCxdoty(),           XYZCovarianceKey.CXDOT_Y.name());
104         checkNotNaN(getCxdotz(),           XYZCovarianceKey.CXDOT_Z.name());
105         checkNotNaN(getCxdotxdot(),        XYZCovarianceKey.CXDOT_XDOT.name());
106         checkNotNaN(getCydotx(),           XYZCovarianceKey.CYDOT_X.name());
107         checkNotNaN(getCydoty(),           XYZCovarianceKey.CYDOT_Y.name());
108         checkNotNaN(getCydotz(),           XYZCovarianceKey.CYDOT_Z.name());
109         checkNotNaN(getCydotxdot(),        XYZCovarianceKey.CYDOT_XDOT.name());
110         checkNotNaN(getCydotydot(),        XYZCovarianceKey.CYDOT_YDOT.name());
111         checkNotNaN(getCzdotx(),           XYZCovarianceKey.CZDOT_X.name());
112         checkNotNaN(getCzdoty(),           XYZCovarianceKey.CZDOT_Y.name());
113         checkNotNaN(getCzdotz(),           XYZCovarianceKey.CZDOT_Z.name());
114         checkNotNaN(getCzdotxdot(),        XYZCovarianceKey.CZDOT_XDOT.name());
115         checkNotNaN(getCzdotydot(),        XYZCovarianceKey.CZDOT_YDOT.name());
116         checkNotNaN(getCzdotzdot(),        XYZCovarianceKey.CZDOT_ZDOT.name());
117     }
118 
119     /** Set an entry in the XYZ covariance matrix.
120      * <p>
121      * Both m(j, k) and m(k, j) are set.
122      * </p>
123      * @param j row index (must be between 0 and 5 (inclusive)
124      * @param k column index (must be between 0 and 5 (inclusive)
125      * @param entry value of the matrix entry
126      */
127     public void setCovarianceMatrixEntry(final int j, final int k, final double entry) {
128         covarianceMatrix.setEntry(j, k, entry);
129         covarianceMatrix.setEntry(k, j, entry);
130     }
131 
132     /**
133      * Get the XYZ covariance matrix.
134      * <p> The XYZ Covariance Matrix is only provided if {@link CdmMetadataKey#ALT_COV_TYPE} is {@link AltCovarianceType#XYZ}, otherwise
135      * its terms will return NaN. </p>
136      * <p> When available, the matrix is given in the 9×9 Lower Triangular Form. All parameters of the 6×6 position/velocity submatrix
137      * are mandatory. The remaining elements will return NaN if not provided.</p>
138      * @return the XYZ covariance matrix
139      */
140     public RealMatrix getXYZCovarianceMatrix() {
141         return covarianceMatrix;
142     }
143 
144     /**
145      * Get the object [1,1] in covariance matrix (with index starting at 1).
146      * @return the object [1,1] in covariance matrix (in m²)
147      */
148     public double getCxx() {
149         return covarianceMatrix.getEntry(0, 0);
150     }
151 
152     /**
153      * Set the object [1,1] in covariance matrix (with index starting at 1).
154      * @param CXX = object [1,1] in covariance matrix (in m²)
155      */
156     public void setCxx(final double CXX) {
157         refuseFurtherComments();
158 
159         // Conditional on ALT_COV_TYPE = XYZ
160         if (!isCovXYZset()) {
161             throw new OrekitException(OrekitMessages.CCSDS_DATE_INVALID_PREAMBLE_FIELD, CdmMetadataKey.ALT_COV_TYPE);
162         }
163 
164         setCovarianceMatrixEntry(0, 0, CXX);
165     }
166 
167     /**
168      * Get the object [2,1] in covariance matrix (with index starting at 1).
169      * @return the object [2,1] in covariance matrix (in m²)
170      */
171     public double getCyx() {
172         return covarianceMatrix.getEntry(1, 0);
173     }
174 
175     /**
176      * Set the object [2,1] in covariance matrix (with index starting at 1).
177      * @param CYX = object [2,1] in covariance matrix (in m²)
178      */
179     public void setCyx(final double CYX) {
180         refuseFurtherComments();
181         setCovarianceMatrixEntry(1, 0, CYX);
182     }
183 
184     /**
185      * Get the object [2,2] in covariance matrix (with index starting at 1).
186      * @return the object [2,2] in covariance matrix (in m²)
187      */
188     public double getCyy() {
189         return covarianceMatrix.getEntry(1, 1);
190     }
191 
192     /**
193      * Set the object [2,2] in covariance matrix (with index starting at 1).
194      * @param CYY = object [2,2] in covariance matrix (in m²)
195      */
196     public void setCyy(final double CYY) {
197         refuseFurtherComments();
198         setCovarianceMatrixEntry(1, 1, CYY);
199     }
200 
201     /**
202      * Get the object [3,1] in covariance matrix (with index starting at 1).
203      * @return the object [3,1] in covariance matrix (in m²)
204      */
205     public double getCzx() {
206         return covarianceMatrix.getEntry(2, 0);
207     }
208 
209     /**
210      * Set the object [3,1] in covariance matrix (with index starting at 1).
211      * @param CZX = object [3,1] in covariance matrix (in m²)
212      */
213     public void setCzx(final double CZX) {
214         refuseFurtherComments();
215         setCovarianceMatrixEntry(2, 0, CZX);
216     }
217 
218     /**
219      * Get the object [3,2] in covariance matrix (with index starting at 1).
220      * @return the object [3,2] in covariance matrix (in m²)
221      */
222     public double getCzy() {
223         return covarianceMatrix.getEntry(2, 1);
224     }
225 
226     /**
227      * Set the object [3,2] in covariance matrix (with index starting at 1).
228      * @param CZY = object [3,2] in covariance matrix (in m²)
229      */
230     public void setCzy(final double CZY) {
231         refuseFurtherComments();
232         setCovarianceMatrixEntry(2, 1, CZY);
233     }
234 
235     /**
236      * Get the object [3,3] in covariance matrix (with index starting at 1).
237      * @return the object [3,3] in covariance matrix (in m²)
238      */
239     public double getCzz() {
240         return covarianceMatrix.getEntry(2, 2);
241     }
242 
243     /**
244      * Set the object [3,3] in covariance matrix (with index starting at 1).
245      * @param CZZ = object [3,3] in covariance matrix (in m²)
246      */
247     public void setCzz(final double CZZ) {
248         refuseFurtherComments();
249         setCovarianceMatrixEntry(2, 2, CZZ);
250     }
251 
252     /**
253      * Get the object [4,1] in covariance matrix (with index starting at 1).
254      * @return the object [4,1] in covariance matrix (in m²/s)
255      */
256     public double getCxdotx() {
257         return covarianceMatrix.getEntry(3, 0);
258     }
259 
260     /**
261      * Set the object [4,1] in covariance matrix (with index starting at 1).
262      * @param CXdotX = object [4,1] in covariance matrix (in m²/s)
263      */
264     public void setCxdotx(final double CXdotX) {
265         refuseFurtherComments();
266         setCovarianceMatrixEntry(3, 0, CXdotX);
267     }
268 
269     /**
270      * Get the object [4,2] in covariance matrix (with index starting at 1).
271      * @return the object [4,2] in covariance matrix (in m²/s)
272      */
273     public double getCxdoty() {
274         return covarianceMatrix.getEntry(3, 1);
275     }
276 
277     /**
278      * Set the object [4, 2] in covariance matrix (with index starting at 1).
279      * @param CXdotY = object [4, 2] in covariance matrix (in m²/s)
280      */
281     public void setCxdoty(final double CXdotY) {
282         refuseFurtherComments();
283         setCovarianceMatrixEntry(3, 1, CXdotY);
284     }
285 
286     /**
287      * Get the object [4, 3] in covariance matrix (with index starting at 1) .
288      * @return the object [4, 3] in covariance matrix (in m²/s)
289      */
290     public double getCxdotz() {
291         return covarianceMatrix.getEntry(3, 2);
292     }
293 
294     /**
295      * Set the object [4, 3] in covariance matrix (with index starting at 1).
296      * @param CXdotZ = object [4,3] in covariance matrix (in m²/s)
297      */
298     public void setCxdotz(final double CXdotZ) {
299         refuseFurtherComments();
300         setCovarianceMatrixEntry(3, 2, CXdotZ);
301     }
302 
303     /**
304      * Get the object [4, 4] in covariance matrix (with index starting at 1).
305      * @return the object [4, 4] in covariance matrix (in m²/s²)
306      */
307     public double getCxdotxdot() {
308         return covarianceMatrix.getEntry(3, 3);
309     }
310 
311     /**
312      * Set the object [4, 4] in covariance matrix (with index starting at 1).
313      * @param CXdotXdot = object [4, 4] in covariance matrix (in m²/s²)
314      */
315     public void setCxdotxdot(final double CXdotXdot) {
316         refuseFurtherComments();
317         setCovarianceMatrixEntry(3, 3, CXdotXdot);
318     }
319 
320     /**
321      * Get the object [5, 1] in covariance matrix (with index starting at 1).
322      * @return the object [5, 1] in covariance matrix (in m²/s)
323      */
324     public double getCydotx() {
325         return covarianceMatrix.getEntry(4, 0);
326     }
327 
328     /**
329      * Set the object [5,1] in covariance matrix (with index starting at 1).
330      * @param CYdotX = object [5,1] in covariance matrix (in m²/s)
331      */
332     public void setCydotx(final double CYdotX) {
333         refuseFurtherComments();
334         setCovarianceMatrixEntry(4, 0, CYdotX);
335     }
336 
337     /**
338      * Get the object [5,2] in covariance matrix (with index starting at 1).
339      * @return the object [5,2] in covariance matrix (in m²/s)
340      */
341     public double getCydoty() {
342         return covarianceMatrix.getEntry(4, 1);
343     }
344 
345     /**
346      * Set the object [5,2] in covariance matrix (with index starting at 1).
347      * @param CYdotY = object [5,2] in covariance matrix (in m²/s)
348      */
349     public void setCydoty(final double CYdotY) {
350         refuseFurtherComments();
351         setCovarianceMatrixEntry(4, 1, CYdotY);
352     }
353 
354     /**
355      * Get the object [5,3] in covariance matrix (with index starting at 1).
356      * @return the object [5,3] in covariance matrix (in m²/s)
357      */
358     public double getCydotz() {
359         return covarianceMatrix.getEntry(4, 2);
360     }
361 
362     /**
363      * Set the object [5,3] in covariance matrix (with index starting at 1).
364      * @param CYdotZ = object [5,3] in covariance matrix (in m²/s)
365      */
366     public void setCydotz(final double CYdotZ) {
367         refuseFurtherComments();
368         setCovarianceMatrixEntry(4, 2, CYdotZ);
369     }
370 
371     /**
372      * Get the object [5,4] in covariance matrix (with index starting at 1).
373      * @return the object [5,4] in covariance matrix (in m²/s²)
374      */
375     public double getCydotxdot() {
376         return covarianceMatrix.getEntry(4, 3);
377     }
378 
379     /**
380      * Set the object [5,4] in covariance matrix (with index starting at 1).
381      * @param CYdotXdot = object [5,4] in covariance matrix (in m²/s²)
382      */
383     public void setCydotxdot(final double CYdotXdot) {
384         refuseFurtherComments();
385         setCovarianceMatrixEntry(4, 3, CYdotXdot);
386     }
387 
388     /**
389      * Get the object [5,5] in covariance matrix (with index starting at 1).
390      * @return the object [5,5] in covariance matrix (in m²/s²)
391      */
392     public double getCydotydot() {
393         return covarianceMatrix.getEntry(4, 4);
394     }
395 
396     /**
397      * Set the object [5,5] in covariance matrix (with index starting at 1).
398      * @param CYdotYdot = object [5,5] in covariance matrix (in m²/s²)
399      */
400     public void setCydotydot(final double CYdotYdot) {
401         refuseFurtherComments();
402         setCovarianceMatrixEntry(4, 4, CYdotYdot);
403     }
404 
405     /**
406      * Get the object [6,1] in covariance matrix (with index starting at 1).
407      * @return the object [6,1] in covariance matrix (in m²/s)
408      */
409     public double getCzdotx() {
410         return covarianceMatrix.getEntry(5, 0);
411     }
412 
413     /**
414      * Set the object [6,1] in covariance matrix (with index starting at 1).
415      * @param CZdotX = object [6,1] in covariance matrix (in m²/s)
416      */
417     public void setCzdotx(final double CZdotX) {
418         refuseFurtherComments();
419         setCovarianceMatrixEntry(5, 0, CZdotX);
420     }
421 
422     /**
423      * Get the object [6,2] in covariance matrix (with index starting at 1).
424      * @return the object [6,2] in covariance matrix (in m²/s)
425      */
426     public double getCzdoty() {
427         return covarianceMatrix.getEntry(5, 1);
428     }
429 
430     /**
431      * Set the object [6,2] in covariance matrix (with index starting at 1).
432      * @param CZdotY = object [6,2] in covariance matrix (in m²/s)
433      */
434     public void setCzdoty(final double CZdotY) {
435         refuseFurtherComments();
436         setCovarianceMatrixEntry(5, 1, CZdotY);
437     }
438 
439     /**
440      * Get the object [6,3] in covariance matrix (with index starting at 1).
441      * @return the object [6,3] in covariance matrix (in m²/s)
442      */
443     public double getCzdotz() {
444         return covarianceMatrix.getEntry(5, 2);
445     }
446 
447     /**
448      * Set the object [6,3] in covariance matrix (with index starting at 1).
449      * @param CZdotZ = object [6,3] in covariance matrix (in m²/s)
450      */
451     public void setCzdotz(final double CZdotZ) {
452         refuseFurtherComments();
453         setCovarianceMatrixEntry(5, 2, CZdotZ);
454     }
455 
456     /**
457      * Get the object [6,4] in covariance matrix (with index starting at 1).
458      * @return the object [6,4] in covariance matrix (in m²/s²)
459      */
460     public double getCzdotxdot() {
461         return covarianceMatrix.getEntry(5, 3);
462     }
463 
464     /**
465      * Set the object [6,4] in covariance matrix (with index starting at 1).
466      * @param CZdotXdot = object [6,4] in covariance matrix (in m²/s²)
467      */
468     public void setCzdotxdot(final double CZdotXdot) {
469         refuseFurtherComments();
470         setCovarianceMatrixEntry(5, 3, CZdotXdot);
471     }
472 
473     /**
474      * Get the object [6,5] in covariance matrix (with index starting at 1).
475      * @return the object [6,5] in covariance matrix (in m²/s²)
476      */
477     public double getCzdotydot() {
478         return covarianceMatrix.getEntry(5, 4);
479     }
480 
481     /**
482      * Set the object [6,5] in covariance matrix (with index starting at 1).
483      * @param CZdotYdot = object [6,5] in covariance matrix (in m²/s²)
484      */
485     public void setCzdotydot(final double CZdotYdot) {
486         refuseFurtherComments();
487         setCovarianceMatrixEntry(5, 4, CZdotYdot);
488     }
489 
490     /**
491      * Get the object [6,6] in covariance matrix (with index starting at 1).
492      * @return the object [6,6] in covariance matrix (in m²/s²)
493      */
494     public double getCzdotzdot() {
495         return covarianceMatrix.getEntry(5, 5);
496     }
497 
498     /**
499      * Set the object [6,6] in covariance matrix (with index starting at 1).
500      * @param CZdotZdot = object [6,6] in covariance matrix (in m²/s²)
501      */
502     public void setCzdotzdot(final double CZdotZdot) {
503         refuseFurtherComments();
504         setCovarianceMatrixEntry(5, 5, CZdotZdot);
505     }
506 
507     /**
508      * Get the object [7,1] in covariance matrix (with index starting at 1).
509      * @return the object [7,1] in covariance matrix (in m³/kg)
510      */
511     public double getCdrgx() {
512         return covarianceMatrix.getEntry(6, 0);
513     }
514 
515     /**
516      * Set the object [7,1] in covariance matrix (with index starting at 1).
517      * @param CDRGX = object [7,1] in covariance matrix (in m³/kg)
518      */
519     public void setCdrgx(final double CDRGX) {
520         refuseFurtherComments();
521         setCovarianceMatrixEntry(6, 0, CDRGX);
522     }
523 
524     /**
525      * Get the object [7,2] in covariance matrix.
526      * @return the object [7,2] in covariance matrix (in m³/kg)
527      */
528     public double getCdrgy() {
529         return covarianceMatrix.getEntry(6, 1);
530     }
531 
532     /**
533      * Set the object [7,2] in covariance matrix (with index starting at 1).
534      * @param CDRGY = object [7,2] in covariance matrix (in m³/kg)
535      */
536     public void setCdrgy(final double CDRGY) {
537         refuseFurtherComments();
538         setCovarianceMatrixEntry(6, 1, CDRGY);
539     }
540 
541     /**
542      * Get the object [7,3] in covariance matrix (with index starting at 1).
543      * @return the object [7,3] in covariance matrix (in m³/kg)
544      */
545     public double getCdrgz() {
546         return covarianceMatrix.getEntry(6, 2);
547     }
548 
549     /**
550      * Set the object [7,3] in covariance matrix (with index starting at 1).
551      * @param CDRGZ = object [7,3] in covariance matrix (in m³/kg)
552      */
553     public void setCdrgz(final double CDRGZ) {
554         refuseFurtherComments();
555         setCovarianceMatrixEntry(6, 2, CDRGZ);
556     }
557 
558     /**
559      * Get the object [7,4] in covariance matrix (with index starting at 1).
560      * @return the object [7,4] in covariance matrix (in m³/(kg.s))
561      */
562     public double getCdrgxdot() {
563         return covarianceMatrix.getEntry(6, 3);
564     }
565 
566     /**
567      * Set the object [7,4] in covariance matrix (with index starting at 1).
568      * @param CDRGXdot = object [7,4] in covariance matrix (in m³/(kg.s))
569      */
570     public void setCdrgxdot(final double CDRGXdot) {
571         refuseFurtherComments();
572         setCovarianceMatrixEntry(6, 3, CDRGXdot);
573     }
574 
575     /**
576      * Get the object [7,5] in covariance matrix (with index starting at 1).
577      * @return the object [7,5] in covariance matrix (in m³/(kg.s))
578      */
579     public double getCdrgydot() {
580         return covarianceMatrix.getEntry(6, 4);
581     }
582 
583     /**
584      * Set the object [7,5] in covariance matrix (with index starting at 1).
585      * @param CDRGYdot = object [7,5] in covariance matrix (in m³/(kg.s))
586      */
587     public void setCdrgydot(final double CDRGYdot) {
588         refuseFurtherComments();
589         setCovarianceMatrixEntry(6, 4, CDRGYdot);
590     }
591 
592     /**
593      * Get the object [7,6] in covariance matrix (with index starting at 1).
594      * @return the object [7,6] in covariance matrix (in m³/(kg.s))
595      */
596     public double getCdrgzdot() {
597         return covarianceMatrix.getEntry(6, 5);
598     }
599 
600     /**
601      * Set the object [7,6] in covariance matrix (with index starting at 1).
602      * @param CDRGZdot = object [7,6] in covariance matrix (in m³/(kg.s))
603      */
604     public void setCdrgzdot(final double CDRGZdot) {
605         refuseFurtherComments();
606         setCovarianceMatrixEntry(6, 5, CDRGZdot);
607     }
608 
609     /**
610      * Get the object [7,7] in covariance matrix (with index starting at 1).
611      * @return the object [7,7] in covariance matrix (in m⁴/kg²)
612      */
613     public double getCdrgdrg() {
614         return covarianceMatrix.getEntry(6, 6);
615     }
616 
617     /**
618      * Set the object [7,7] in covariance matrix (with index starting at 1).
619      * @param CDRGDRG = object [7,7] in covariance matrix (in m⁴/kg²)
620      */
621     public void setCdrgdrg(final double CDRGDRG) {
622         refuseFurtherComments();
623         setCovarianceMatrixEntry(6, 6, CDRGDRG);
624     }
625 
626     /**
627      * Get the object [8,1] in covariance matrix (with index starting at 1).
628      * @return the object [8,1] in covariance matrix (in m³/kg)
629      */
630     public double getCsrpx() {
631         return covarianceMatrix.getEntry(7, 0);
632     }
633 
634     /**
635      * Set the object [8,1] in covariance matrix (with index starting at 1).
636      * @param CSRPX = object [8,1] in covariance matrix (in m³/kg)
637      */
638     public void setCsrpx(final double CSRPX) {
639         refuseFurtherComments();
640         setCovarianceMatrixEntry(7, 0, CSRPX);
641     }
642 
643     /**
644      * Get the object [8,2] in covariance matrix (with index starting at 1).
645      * @return the object [8,2] in covariance matrix (in m³/kg)
646      */
647     public double getCsrpy() {
648         return covarianceMatrix.getEntry(7, 1);
649     }
650 
651     /**
652      * Set the object [8,2] in covariance matrix (with index starting at 1).
653      * @param CSRPY = object [8,2] in covariance matrix (in m³/kg)
654      */
655     public void setCsrpy(final double CSRPY) {
656         refuseFurtherComments();
657         setCovarianceMatrixEntry(7, 1, CSRPY);
658     }
659 
660     /**
661      * Get the object [8,3] in covariance matrix (with index starting at 1).
662      * @return the object [8,3] in covariance matrix (in m³/kg)
663      */
664     public double getCsrpz() {
665         return covarianceMatrix.getEntry(7, 2);
666     }
667 
668     /**
669      * Set the object [8,3] in covariance matrix (with index starting at 1).
670      * @param CSRPZ = object [8,3] in covariance matrix (in m³/kg)
671      */
672     public void setCsrpz(final double CSRPZ) {
673         refuseFurtherComments();
674         setCovarianceMatrixEntry(7, 2, CSRPZ);
675     }
676 
677     /**
678      * Get the object [8,4] in covariance matrix (with index starting at 1).
679      * @return the object [8,4] in covariance matrix (in m³/(kg.s))
680      */
681     public double getCsrpxdot() {
682         return covarianceMatrix.getEntry(7, 3);
683     }
684 
685     /**
686      * Set the object [8,4] in covariance matrix (with index starting at 1).
687      * @param CSRPXdot = object [8,4] in covariance matrix (in m³/(kg.s))
688      */
689     public void setCsrpxdot(final double CSRPXdot) {
690         refuseFurtherComments();
691         setCovarianceMatrixEntry(7, 3, CSRPXdot);
692     }
693 
694     /**
695      * Get the object [8,5] in covariance matrix (with index starting at 1).
696      * @return the object [8,5] in covariance matrix (in m³/(kg.s))
697      */
698     public double getCsrpydot() {
699         return covarianceMatrix.getEntry(7, 4);
700     }
701 
702     /**
703      * Set the object [8,5] in covariance matrix (with index starting at 1).
704      * @param CSRPYdot = object [8,5] in covariance matrix (in m³/(kg.s))
705      */
706     public void setCsrpydot(final double CSRPYdot) {
707         refuseFurtherComments();
708         setCovarianceMatrixEntry(7, 4, CSRPYdot);
709     }
710 
711     /**
712      * Get the object [8,6] in covariance matrix (with index starting at 1).
713      * @return the object [8,6] in covariance matrix (in m³/(kg.s))
714      */
715     public double getCsrpzdot() {
716         return covarianceMatrix.getEntry(7, 5);
717     }
718 
719     /**
720      * Set the object [8,6] in covariance matrix (with index starting at 1).
721      * @param CSRPZdot = object [8,6] in covariance matrix (in m³/(kg.s))
722      */
723     public void setCsrpzdot(final double CSRPZdot) {
724         refuseFurtherComments();
725         setCovarianceMatrixEntry(7, 5, CSRPZdot);
726     }
727 
728     /**
729      * Get the object [8,7] in covariance matrix (with index starting at 1).
730      * @return the object [8,7] in covariance matrix (in m⁴/kg²)
731      */
732     public double getCsrpdrg() {
733         return covarianceMatrix.getEntry(7, 6);
734     }
735 
736     /**
737      * Set the object [8,7] in covariance matrix (with index starting at 1).
738      * @param CSRPDRG = object [8,7] in covariance matrix (in m⁴/kg²)
739      */
740     public void setCsrpdrg(final double CSRPDRG) {
741         refuseFurtherComments();
742         setCovarianceMatrixEntry(7, 6, CSRPDRG);
743     }
744 
745     /**
746      * Get the object [8,8] in covariance matrix (with index starting at 1).
747      * @return the object [8,8] in covariance matrix (in m⁴/kg²)
748      */
749     public double getCsrpsrp() {
750         return covarianceMatrix.getEntry(7, 7);
751     }
752 
753     /**
754      * Set the object [8,8] in covariance matrix (with index starting at 1).
755      * @param CSRPSRP = object [8,8] in covariance matrix (in m⁴/kg²)
756      */
757     public void setCsrpsrp(final double CSRPSRP) {
758         refuseFurtherComments();
759         setCovarianceMatrixEntry(7, 7, CSRPSRP);
760     }
761 
762     /**
763      * Get the object [9,1] in covariance matrix (with index starting at 1).
764      * @return the object [9,1] in covariance matrix (in m²/s²)
765      */
766     public double getCthrx() {
767         return covarianceMatrix.getEntry(8, 0);
768     }
769 
770     /**
771      * Set the object [9,1] in covariance matrix (with index starting at 1).
772      * @param CTHRX = object [9,1] in covariance matrix (in m²/s²)
773      */
774     public void setCthrx(final double CTHRX) {
775         refuseFurtherComments();
776         setCovarianceMatrixEntry(8, 0, CTHRX);
777     }
778 
779     /**
780      * Get the object [9,2] in covariance matrix (with index starting at 1).
781      * @return the object [9,2] in covariance matrix (in m²/s²)
782      */
783     public double getCthry() {
784         return covarianceMatrix.getEntry(8, 1);
785     }
786 
787     /**
788      * Set the object [9,2] in covariance matrix (with index starting at 1).
789      * @param CTHRY = object [9,2] in covariance matrix (in m²/s²)
790      */
791     public void setCthry(final double CTHRY) {
792         refuseFurtherComments();
793         setCovarianceMatrixEntry(8, 1, CTHRY);
794     }
795 
796     /**
797      * Get the object [9,3] in covariance matrix (with index starting at 1).
798      * @return the object [9,3] in covariance matrix (in m²/s²)
799      */
800     public double getCthrz() {
801         return covarianceMatrix.getEntry(8, 2);
802     }
803 
804     /**
805      * Set the object [9,3] in covariance matrix (with index starting at 1).
806      * @param CTHRZ = object [9,3] in covariance matrix (in m²/s²)
807      */
808     public void setCthrz(final double CTHRZ) {
809         refuseFurtherComments();
810         setCovarianceMatrixEntry(8, 2, CTHRZ);
811     }
812 
813     /**
814      * Get the object [9,4] in covariance matrix (with index starting at 1).
815      * @return the object [9,4] in covariance matrix (in m²/s³)
816      */
817     public double getCthrxdot() {
818         return covarianceMatrix.getEntry(8, 3);
819     }
820 
821     /**
822      * Set the object [9,4] in covariance matrix (with index starting at 1).
823      * @param CTHRXdot = object [9,4] in covariance matrix (in m²/s³)
824      */
825     public void setCthrxdot(final double CTHRXdot) {
826         refuseFurtherComments();
827         setCovarianceMatrixEntry(8, 3, CTHRXdot);
828     }
829 
830     /**
831      * Get the object [9,5] in covariance matrix (with index starting at 1).
832      * @return the object [9,5] in covariance matrix (in m²/s³)
833      */
834     public double getCthrydot() {
835         return covarianceMatrix.getEntry(8, 4);
836     }
837 
838     /**
839      * Set the object [9,5] in covariance matrix (with index starting at 1).
840      * @param CTHRYdot = object [9,5] in covariance matrix (in m²/s³)
841      */
842     public void setCthrydot(final double CTHRYdot) {
843         refuseFurtherComments();
844         setCovarianceMatrixEntry(8, 4, CTHRYdot);
845     }
846 
847     /**
848      * Get the object [9,6] in covariance matrix (with index starting at 1).
849      * @return the object [9,6] in covariance matrix (in m²/s³)
850      */
851     public double getCthrzdot() {
852         return covarianceMatrix.getEntry(8, 5);
853     }
854 
855     /**
856      * Set the object [9,6] in covariance matrix (with index starting at 1).
857      * @param CTHRZdot = object [9,6] in covariance matrix (in m²/s³)
858      */
859     public void setCthrzdot(final double CTHRZdot) {
860         refuseFurtherComments();
861         setCovarianceMatrixEntry(8, 5, CTHRZdot);
862     }
863 
864     /**
865      * Get the object [9,7] in covariance matrix (with index starting at 1).
866      * @return the object [9,7] in covariance matrix (in m³/(kg.s²))
867      */
868     public double getCthrdrg() {
869         return covarianceMatrix.getEntry(8, 6);
870     }
871 
872     /**
873      * Set the object [9,7] in covariance matrix (with index starting at 1).
874      * @param CTHRDRG = object [9,7] in covariance matrix (in m³/(kg.s²))
875      */
876     public void setCthrdrg(final double CTHRDRG) {
877         refuseFurtherComments();
878         setCovarianceMatrixEntry(8, 6, CTHRDRG);
879     }
880 
881     /**
882      * Get the object [9,8] in covariance matrix (with index starting at 1).
883      * @return the object [9,8] in covariance matrix (in m³/(kg.s²))
884      */
885     public double getCthrsrp() {
886         return covarianceMatrix.getEntry(8, 7);
887     }
888 
889     /**
890      * Set the object [9,8] in covariance matrix (with index starting at 1).
891      * @param CTHRSRP = object [9,8] in covariance matrix (in m³/(kg.s²))
892      */
893     public void setCthrsrp(final double CTHRSRP) {
894         refuseFurtherComments();
895         setCovarianceMatrixEntry(8, 7, CTHRSRP);
896     }
897 
898     /**
899      * Get the object [9,9] in covariance matrix (with index starting at 1).
900      * @return the object [9,9] in covariance matrix (in m²/s⁴)
901      */
902     public double getCthrthr() {
903         return covarianceMatrix.getEntry(8, 8);
904     }
905 
906     /**
907      * Set the object [9,9] in covariance matrix (with index starting at 1).
908      * @param CTHRTHR = object [9,9] in covariance matrix (in m²/s⁴)
909      */
910     public void setCthrthr(final double CTHRTHR) {
911         refuseFurtherComments();
912         setCovarianceMatrixEntry(8, 8, CTHRTHR);
913     }
914 
915     /** Get the flag indicating whether the alternate covariance type set in the CDM Object metadata section is XYZ.
916      * @return the covXYZset
917      */
918     public boolean isCovXYZset() {
919         return covXYZset;
920     }
921 }