1   /* Copyright 2022-2025 Luc Maisonobe
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  
18  package org.orekit.files.ccsds.ndm.adm.acm;
19  
20  import org.hipparchus.geometry.euclidean.threed.Vector3D;
21  import org.hipparchus.linear.MatrixUtils;
22  import org.hipparchus.linear.RealMatrix;
23  import org.orekit.files.ccsds.definitions.FrameFacade;
24  import org.orekit.files.ccsds.section.CommentsContainer;
25  
26  /** Spacecraft physical properties.
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   * @author Luc Maisonobe
42   * @since 12.0
43   */
44  public class AttitudePhysicalProperties extends CommentsContainer {
45  
46      /** Drag coefficient. */
47      private double dragCoefficient;
48  
49      /** Total mass at T₀. */
50      private double wetMass;
51  
52      /** Mass without propellant. */
53      private double dryMass;
54  
55      /** Reference frame for center of pressure. */
56      private FrameFacade centerOfPressureReferenceFrame;
57  
58      /** Location of center of pressure. */
59      private Vector3D centerOfPressure;
60  
61      /** Reference frame for inertia. */
62      private FrameFacade inertiaReferenceFrame;
63  
64      /** Inertia matrix. */
65      private final RealMatrix inertiaMatrix;
66  
67      /**
68       * Simple constructor.
69       */
70      public AttitudePhysicalProperties() {
71          dragCoefficient = Double.NaN;
72          wetMass         = Double.NaN;
73          dryMass         = Double.NaN;
74          inertiaMatrix   = MatrixUtils.createRealMatrix(3, 3);
75      }
76  
77      /** {@inheritDoc} */
78      @Override
79      public void validate(final double version) {
80          super.validate(version);
81          if (centerOfPressureReferenceFrame != null) {
82              checkNotNull(centerOfPressure, AttitudePhysicalPropertiesKey.CP.name());
83          }
84      }
85  
86      /** Get the drag coefficient.
87       * @return the drag coefficient
88       */
89      public double getDragCoefficient() {
90          return dragCoefficient;
91      }
92  
93      /** Set the the drag coefficient.
94       * @param dragCoefficient the drag coefficient
95       */
96      public void setDragCoefficient(final double dragCoefficient) {
97          refuseFurtherComments();
98          this.dragCoefficient = dragCoefficient;
99      }
100 
101     /** Get the total mass at T₀.
102      * @return total mass at T₀
103      */
104     public double getWetMass() {
105         return wetMass;
106     }
107 
108     /** Set the total mass at T₀.
109      * @param wetMass total mass at T₀
110      */
111     public void setWetMass(final double wetMass) {
112         refuseFurtherComments();
113         this.wetMass = wetMass;
114     }
115 
116     /** Get the mass without propellant.
117      * @return mass without propellant
118      */
119     public double getDryMass() {
120         return dryMass;
121     }
122 
123     /** Set the mass without propellant.
124      * @param dryMass mass without propellant
125      */
126     public void setDryMass(final double dryMass) {
127         refuseFurtherComments();
128         this.dryMass = dryMass;
129     }
130 
131     /** Get reference frame for center of pressure.
132      * @return reference frame for center of pressure
133      */
134     public FrameFacade getCenterOfPressureReferenceFrame() {
135         return centerOfPressureReferenceFrame;
136     }
137 
138     /** Set reference frame for center of pressure.
139      * @param centerOfPressureReferenceFrame reference frame for center of pressure
140      */
141     public void setCenterOfPressureReferenceFrame(final FrameFacade centerOfPressureReferenceFrame) {
142         this.centerOfPressureReferenceFrame = centerOfPressureReferenceFrame;
143     }
144 
145     /** Get the location of center of pressure.
146      * @return location of center of pressure
147      */
148     public Vector3D getCenterOfPressure() {
149         return centerOfPressure;
150     }
151 
152     /** Set the location of center of pressure.
153      * @param centerOfPressure location of center of pressure
154      */
155     public void setCenterOfPressure(final Vector3D centerOfPressure) {
156         this.centerOfPressure = centerOfPressure;
157     }
158 
159     /** Get reference frame for inertia.
160      * @return reference frame for inertia
161      */
162     public FrameFacade getInertiaReferenceFrame() {
163         return inertiaReferenceFrame;
164     }
165 
166     /** Set reference frame for inertia.
167      * @param inertiaReferenceFrame reference frame for inertia
168      */
169     public void setInertiaReferenceFrame(final FrameFacade inertiaReferenceFrame) {
170         this.inertiaReferenceFrame = inertiaReferenceFrame;
171     }
172 
173     /** Get the inertia matrix.
174      * @return the inertia matrix
175      */
176     public RealMatrix getInertiaMatrix() {
177         return inertiaMatrix;
178     }
179 
180     /** Set an entry in the inertia matrix.
181      * <p>
182      * Both I(j, k) and I(k, j) are set.
183      * </p>
184      * @param j row index (must be between 0 and 3 (inclusive)
185      * @param k column index (must be between 0 and 3 (inclusive)
186      * @param entry value of the matrix entry
187      */
188     public void setInertiaMatrixEntry(final int j, final int k, final double entry) {
189         refuseFurtherComments();
190         inertiaMatrix.setEntry(j, k, entry);
191         inertiaMatrix.setEntry(k, j, entry);
192     }
193 
194 }