PhysicalProperties.java

  1. /* Copyright 2002-2022 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.odm.ocm;

  18. import java.util.ArrayList;
  19. import java.util.List;

  20. import org.hipparchus.complex.Quaternion;
  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.definitions.OrbitRelativeFrame;
  25. import org.orekit.files.ccsds.section.CommentsContainer;
  26. import org.orekit.time.AbsoluteDate;
  27. import org.orekit.utils.Constants;

  28. /** Spacecraft physical properties.
  29.  * @author Luc Maisonobe
  30.  * @since 11.0
  31.  */
  32. public class PhysicalProperties extends CommentsContainer {

  33.     /** Satellite manufacturer name. */
  34.     private String manufacturer;

  35.     /** Bus model name. */
  36.     private String busModel;

  37.     /** Other space objects this object is docked to. */
  38.     private List<String> dockedWith;

  39.     /** Attitude-independent drag cross-sectional area, not already into attitude-dependent area along OEB. */
  40.     private double dragConstantArea;

  41.     /** Nominal drag coefficient. */
  42.     private double dragCoefficient;

  43.     /** Drag coefficient 1σ uncertainty. */
  44.     private double dragUncertainty;

  45.     /** Total mass at beginning of life. */
  46.     private double initialWetMass;

  47.     /** Total mass at T₀. */
  48.     private double wetMass;

  49.     /** Mass without propellant. */
  50.     private double dryMass;

  51.     /** Optimally Enclosing Box parent reference frame. */
  52.     private FrameFacade oebParentFrame;

  53.     /** Optimally Enclosing Box parent reference frame epoch. */
  54.     private AbsoluteDate oebParentFrameEpoch;

  55.     /** Quaternion defining Optimally Enclosing Box. */
  56.     private final double[] oebQ;

  57.     /** Dimensions of Optimally Enclosing Box along X-OEB (i.e max). */
  58.     private double oebMax;

  59.     /** Dimensions of Optimally Enclosing Box along Y-OEB (i.e intermediate). */
  60.     private double oebIntermediate;

  61.     /** Dimensions of Optimally Enclosing Box along Z-OEB (i.e min). */
  62.     private double oebMin;

  63.     /** Cross-sectional area of Optimally Enclosing Box along X-OEB. */
  64.     private double oebAreaAlongMax;

  65.     /** Cross-sectional area of Optimally Enclosing Box along Y-OEB. */
  66.     private double oebAreaAlongIntermediate;

  67.     /** Cross-sectional area of Optimally Enclosing Box along Z-OEB. */
  68.     private double oebAreaAlongMin;

  69.     /** Minimum cross-sectional area for collision probability estimation purposes. */
  70.     private double minAreaForCollisionProbability;

  71.     /** Maximum cross-sectional area for collision probability estimation purposes. */
  72.     private double maxAreaForCollisionProbability;

  73.     /** Typical (50th percentile) cross-sectional area for collision probability estimation purposes. */
  74.     private double typAreaForCollisionProbability;

  75.     /** Typical (50th percentile) radar cross-section. */
  76.     private double rcs;

  77.     /** Minimum radar cross-section. */
  78.     private double minRcs;

  79.     /** Maximum radar cross-section. */
  80.     private double maxRcs;

  81.     /** Attitude-independent SRP area, not already into attitude-dependent area along OEB. */
  82.     private double srpConstantArea;

  83.     /** Nominal SRP coefficient. */
  84.     private double srpCoefficient;

  85.     /** SRP coefficient 1σ uncertainty. */
  86.     private double srpUncertainty;

  87.     /** Typical (50th percentile) visual magnitude. */
  88.     private double vmAbsolute;

  89.     /** Minimum apparent visual magnitude. */
  90.     private double vmApparentMin;

  91.     /** Typical (50th percentile) apparent visual magnitude. */
  92.     private double vmApparent;

  93.     /** Maximum apparent visual magnitude. */
  94.     private double vmApparentMax;

  95.     /** Typical (50th percentile) coefficient of reflectivity. */
  96.     private double reflectivity;

  97.     /** Attitude control mode. */
  98.     private String attitudeControlMode;

  99.     /** Type of actuator for attitude control. */
  100.     private String attitudeActuatorType;

  101.     /** Accuracy of attitude knowledge. */
  102.     private double attitudeKnowledgeAccuracy;

  103.     /** Accuracy of attitude control. */
  104.     private double attitudeControlAccuracy;

  105.     /** Overall accuracy of spacecraft to maintain attitude. */
  106.     private double attitudePointingAccuracy;

  107.     /** Average average frequency of orbit or attitude maneuvers (in SI units, hence per second). */
  108.     private double maneuversFrequency;

  109.     /** Maximum composite thrust the spacecraft can accomplish. */
  110.     private double maxThrust;

  111.     /** Total ΔV capability at beginning of life. */
  112.     private double bolDv;

  113.     /** Total ΔV remaining for spacecraft. */
  114.     private double remainingDv;

  115.     /** Inertia matrix. */
  116.     private RealMatrix inertiaMatrix;

  117.     /** Simple constructor.
  118.      * @param epochT0 T0 epoch from file metadata
  119.      */
  120.     PhysicalProperties(final AbsoluteDate epochT0) {
  121.         // we don't call the setXxx() methods in order to avoid
  122.         // calling refuseFurtherComments as a side effect
  123.         dockedWith                     = new ArrayList<>();
  124.         dragConstantArea                  = Double.NaN;
  125.         dragCoefficient         = Double.NaN;
  126.         dragUncertainty                = 0.0;
  127.         initialWetMass                    = Double.NaN;
  128.         wetMass                           = Double.NaN;
  129.         dryMass                        = Double.NaN;
  130.         oebParentFrame                 = new FrameFacade(null, null, OrbitRelativeFrame.RIC, null,
  131.                                                          OrbitRelativeFrame.RIC.name());
  132.         oebParentFrameEpoch            = epochT0;
  133.         oebQ                           = new double[4];
  134.         oebMax                         = Double.NaN;
  135.         oebIntermediate                = Double.NaN;
  136.         oebMin                         = Double.NaN;
  137.         oebAreaAlongMax                = Double.NaN;
  138.         oebAreaAlongIntermediate       = Double.NaN;
  139.         oebAreaAlongMin                = Double.NaN;
  140.         minAreaForCollisionProbability = Double.NaN;
  141.         maxAreaForCollisionProbability = Double.NaN;
  142.         typAreaForCollisionProbability = Double.NaN;
  143.         rcs                            = Double.NaN;
  144.         minRcs                         = Double.NaN;
  145.         maxRcs                         = Double.NaN;
  146.         srpConstantArea                = Double.NaN;
  147.         srpCoefficient          = Double.NaN;
  148.         srpUncertainty                 = Double.NaN;
  149.         vmAbsolute                     = Double.NaN;
  150.         vmApparentMin                  = Double.NaN;
  151.         vmApparent                     = Double.NaN;
  152.         vmApparentMax                  = Double.NaN;
  153.         reflectivity                   = Double.NaN;
  154.         attitudeKnowledgeAccuracy      = Double.NaN;
  155.         attitudeControlAccuracy        = Double.NaN;
  156.         attitudePointingAccuracy       = Double.NaN;
  157.         maneuversFrequency             = Double.NaN;
  158.         maxThrust                      = Double.NaN;
  159.         bolDv                          = Double.NaN;
  160.         remainingDv                    = Double.NaN;
  161.         inertiaMatrix                  = MatrixUtils.createRealMatrix(3, 3);
  162.     }

  163.     /** Get manufacturer name.
  164.      * @return manufacturer name
  165.      */
  166.     public String getManufacturer() {
  167.         return manufacturer;
  168.     }

  169.     /** Set manufacturer name.
  170.      * @param manufacturer manufacturer name
  171.      */
  172.     public void setManufacturer(final String manufacturer) {
  173.         refuseFurtherComments();
  174.         this.manufacturer = manufacturer;
  175.     }

  176.     /** Get the bus model name.
  177.      * @return bus model name
  178.      */
  179.     public String getBusModel() {
  180.         return busModel;
  181.     }

  182.     /** Set the bus model name.
  183.      * @param busModel bus model name
  184.      */
  185.     public void setBusModel(final String busModel) {
  186.         refuseFurtherComments();
  187.         this.busModel = busModel;
  188.     }

  189.     /** Get the other space objects this object is docked to.
  190.      * @return the oother space objects this object is docked to
  191.      */
  192.     public List<String> getDockedWith() {
  193.         return dockedWith;
  194.     }

  195.     /** Set the other space objects this object is docked to.
  196.      * @param dockedWith the other space objects this object is docked to
  197.      */
  198.     public void setDockedWith(final List<String> dockedWith) {
  199.         refuseFurtherComments();
  200.         this.dockedWith = dockedWith;
  201.     }

  202.     /** Get the attitude-independent drag cross-sectional area, not already into attitude-dependent area along OEB.
  203.      * @return attitude-independent drag cross-sectional area, not already into attitude-dependent area along OEB
  204.      */
  205.     public double getDragConstantArea() {
  206.         return dragConstantArea;
  207.     }

  208.     /** Set the attitude-independent drag cross-sectional area, not already into attitude-dependent area along OEB.
  209.      * @param dragConstantArea attitude-independent drag cross-sectional area, not already into attitude-dependent area along OEB
  210.      */
  211.     public void setDragConstantArea(final double dragConstantArea) {
  212.         refuseFurtherComments();
  213.         this.dragConstantArea = dragConstantArea;
  214.     }

  215.     /** Get the nominal drag coefficient.
  216.      * @return the nominal drag coefficient
  217.      */
  218.     public double getDragCoefficient() {
  219.         return dragCoefficient;
  220.     }

  221.     /** Set the the nominal drag coefficient.
  222.      * @param dragCoefficient the nominal drag coefficient
  223.      */
  224.     public void setDragCoefficient(final double dragCoefficient) {
  225.         refuseFurtherComments();
  226.         this.dragCoefficient = dragCoefficient;
  227.     }

  228.     /** Get the drag coefficient 1σ uncertainty.
  229.      * @return drag coefficient 1σ uncertainty (in %)
  230.      */
  231.     public double getDragUncertainty() {
  232.         return dragUncertainty;
  233.     }

  234.     /** Set the drag coefficient 1σ uncertainty.
  235.      * @param dragUncertainty drag coefficient 1σ uncertainty (in %)
  236.      */
  237.     public void setDragUncertainty(final double dragUncertainty) {
  238.         refuseFurtherComments();
  239.         this.dragUncertainty = dragUncertainty;
  240.     }

  241.     /** Get the total mass at beginning of life.
  242.      * @return total mass at beginning of life
  243.      */
  244.     public double getInitialWetMass() {
  245.         return initialWetMass;
  246.     }

  247.     /** Set the total mass at beginning of life.
  248.      * @param initialWetMass total mass at beginning of life
  249.      */
  250.     public void setInitialWetMass(final double initialWetMass) {
  251.         refuseFurtherComments();
  252.         this.initialWetMass = initialWetMass;
  253.     }

  254.     /** Get the total mass at T₀.
  255.      * @return total mass at T₀
  256.      */
  257.     public double getWetMass() {
  258.         return wetMass;
  259.     }

  260.     /** Set the total mass at T₀.
  261.      * @param wetMass total mass at T₀
  262.      */
  263.     public void setWetMass(final double wetMass) {
  264.         refuseFurtherComments();
  265.         this.wetMass = wetMass;
  266.     }

  267.     /** Get the mass without propellant.
  268.      * @return mass without propellant
  269.      */
  270.     public double getDryMass() {
  271.         return dryMass;
  272.     }

  273.     /** Set the mass without propellant.
  274.      * @param dryMass mass without propellant
  275.      */
  276.     public void setDryMass(final double dryMass) {
  277.         refuseFurtherComments();
  278.         this.dryMass = dryMass;
  279.     }

  280.     /** Get the Optimally Enclosing Box parent reference frame.
  281.      * @return Optimally Enclosing Box parent reference frame
  282.      */
  283.     public FrameFacade getOebParentFrame() {
  284.         return oebParentFrame;
  285.     }

  286.     /** Set the Optimally Enclosing Box parent reference frame.
  287.      * @param oebParentFrame Optimally Enclosing Box parent reference frame
  288.      */
  289.     public void setOebParentFrame(final FrameFacade oebParentFrame) {
  290.         refuseFurtherComments();
  291.         this.oebParentFrame = oebParentFrame;
  292.     }

  293.     /** Get the Optimally Enclosing Box parent reference frame epoch.
  294.      * @return Optimally Enclosing Box parent reference frame epoch
  295.      */
  296.     public AbsoluteDate getOebParentFrameEpoch() {
  297.         return oebParentFrameEpoch;
  298.     }

  299.     /** Set the Optimally Enclosing Box parent reference frame epoch.
  300.      * @param oebParentFrameEpoch Optimally Enclosing Box parent reference frame epoch
  301.      */
  302.     public void setOebParentFrameEpoch(final AbsoluteDate oebParentFrameEpoch) {
  303.         refuseFurtherComments();
  304.         this.oebParentFrameEpoch = oebParentFrameEpoch;
  305.     }

  306.     /** Get the quaternion defining Optimally Enclosing Box.
  307.      * @return quaternion defining Optimally Enclosing Box
  308.      */
  309.     public Quaternion getOebQ() {
  310.         return new Quaternion(oebQ[0], oebQ[1], oebQ[2], oebQ[3]);
  311.     }

  312.     /** set the component of quaternion defining Optimally Enclosing Box.
  313.      * @param i index of the component
  314.      * @param qI component of quaternion defining Optimally Enclosing Box
  315.      */
  316.     public void setOebQ(final int i, final double qI) {
  317.         refuseFurtherComments();
  318.         oebQ[i] = qI;
  319.     }

  320.     /** Get the dimensions of Optimally Enclosing Box along X-OEB (i.e max).
  321.      * @return dimensions of Optimally Enclosing Box along X-OEB (i.e max)
  322.      */
  323.     public double getOebMax() {
  324.         return oebMax;
  325.     }

  326.     /** Set the dimensions of Optimally Enclosing Box along X-OEB (i.e max).
  327.      * @param oebMax dimensions of Optimally Enclosing Box along X-OEB (i.e max)
  328.      */
  329.     public void setOebMax(final double oebMax) {
  330.         refuseFurtherComments();
  331.         this.oebMax = oebMax;
  332.     }

  333.     /** Get the dimensions of Optimally Enclosing Box along Y-OEB (i.e intermediate).
  334.      * @return dimensions of Optimally Enclosing Box along Y-OEB (i.e intermediate).
  335.      */
  336.     public double getOebIntermediate() {
  337.         return oebIntermediate;
  338.     }

  339.     /** Set the dimensions of Optimally Enclosing Box along Y-OEB (i.e intermediate).
  340.      * @param oebIntermediate dimensions of Optimally Enclosing Box along Y-OEB (i.e intermediate).
  341.      */
  342.     public void setOebIntermediate(final double oebIntermediate) {
  343.         refuseFurtherComments();
  344.         this.oebIntermediate = oebIntermediate;
  345.     }

  346.     /** Get the dimensions of Optimally Enclosing Box along Z-OEB (i.e min).
  347.      * @return dimensions of Optimally Enclosing Box along Z-OEB (i.e min)
  348.      */
  349.     public double getOebMin() {
  350.         return oebMin;
  351.     }

  352.     /** Set the dimensions of Optimally Enclosing Box along Z-OEB (i.e min).
  353.      * @param oebMin dimensions of Optimally Enclosing Box along Z-OEB (i.e min)
  354.      */
  355.     public void setOebMin(final double oebMin) {
  356.         refuseFurtherComments();
  357.         this.oebMin = oebMin;
  358.     }

  359.     /** Get the cross-sectional area of Optimally Enclosing Box along X-OEB.
  360.      * @return cross-sectional area of Optimally Enclosing Box along X-OEB
  361.      */
  362.     public double getOebAreaAlongMax() {
  363.         return oebAreaAlongMax;
  364.     }

  365.     /** Set the cross-sectional area of Optimally Enclosing Box along X-OEB.
  366.      * @param oebAreaAlongMax cross-sectional area of Optimally Enclosing Box along X-OEB
  367.      */
  368.     public void setOebAreaAlongMax(final double oebAreaAlongMax) {
  369.         refuseFurtherComments();
  370.         this.oebAreaAlongMax = oebAreaAlongMax;
  371.     }

  372.     /** Get the cross-sectional area of Optimally Enclosing Box along Y-OEB.
  373.      * @return cross-sectional area of Optimally Enclosing Box along Y-OEB
  374.      */
  375.     public double getOebAreaAlongIntermediate() {
  376.         return oebAreaAlongIntermediate;
  377.     }

  378.     /** Set the cross-sectional area of Optimally Enclosing Box along Y-OEB.
  379.      * @param oebAreaAlongIntermediate cross-sectional area of Optimally Enclosing Box along X-OEB
  380.      */
  381.     public void setOebAreaAlongIntermediate(final double oebAreaAlongIntermediate) {
  382.         refuseFurtherComments();
  383.         this.oebAreaAlongIntermediate = oebAreaAlongIntermediate;
  384.     }

  385.     /** Get the cross-sectional area of Optimally Enclosing Box along Z-OEB.
  386.      * @return cross-sectional area of Optimally Enclosing Box along X-OEB
  387.      */
  388.     public double getOebAreaAlongMin() {
  389.         return oebAreaAlongMin;
  390.     }

  391.     /** Set the cross-sectional area of Optimally Enclosing Box along Z-OEB.
  392.      * @param oebAreaAlongMin cross-sectional area of Optimally Enclosing Box along X-OEB
  393.      */
  394.     public void setOebAreaAlongMin(final double oebAreaAlongMin) {
  395.         refuseFurtherComments();
  396.         this.oebAreaAlongMin = oebAreaAlongMin;
  397.     }

  398.     /** Get the minimum cross-sectional area for collision probability estimation purposes.
  399.      * @return minimum cross-sectional area for collision probability estimation purposes
  400.      */
  401.     public double getMinAreaForCollisionProbability() {
  402.         return minAreaForCollisionProbability;
  403.     }

  404.     /** Set the minimum cross-sectional area for collision probability estimation purposes.
  405.      * @param minAreaForCollisionProbability minimum cross-sectional area for collision probability estimation purposes
  406.      */
  407.     public void setMinAreaForCollisionProbability(final double minAreaForCollisionProbability) {
  408.         refuseFurtherComments();
  409.         this.minAreaForCollisionProbability = minAreaForCollisionProbability;
  410.     }

  411.     /** Get the maximum cross-sectional area for collision probability estimation purposes.
  412.      * @return maximum cross-sectional area for collision probability estimation purposes
  413.      */
  414.     public double getMaxAreaForCollisionProbability() {
  415.         return maxAreaForCollisionProbability;
  416.     }

  417.     /** Set the maximum cross-sectional area for collision probability estimation purposes.
  418.      * @param maxAreaForCollisionProbability maximum cross-sectional area for collision probability estimation purposes
  419.      */
  420.     public void setMaxAreaForCollisionProbability(final double maxAreaForCollisionProbability) {
  421.         refuseFurtherComments();
  422.         this.maxAreaForCollisionProbability = maxAreaForCollisionProbability;
  423.     }

  424.     /** Get the typical (50th percentile) cross-sectional area for collision probability estimation purposes.
  425.      * @return typical (50th percentile) cross-sectional area for collision probability estimation purposes
  426.      */
  427.     public double getTypAreaForCollisionProbability() {
  428.         return typAreaForCollisionProbability;
  429.     }

  430.     /** Get the typical (50th percentile) cross-sectional area for collision probability estimation purposes.
  431.      * @param typAreaForCollisionProbability typical (50th percentile) cross-sectional area for collision probability estimation purposes
  432.      */
  433.     public void setTypAreaForCollisionProbability(final double typAreaForCollisionProbability) {
  434.         refuseFurtherComments();
  435.         this.typAreaForCollisionProbability = typAreaForCollisionProbability;
  436.     }

  437.     /** Get the typical (50th percentile) radar cross-section.
  438.      * @return typical (50th percentile) radar cross-section
  439.      */
  440.     public double getRcs() {
  441.         return rcs;
  442.     }

  443.     /** Set the typical (50th percentile) radar cross-section.
  444.      * @param rcs typical (50th percentile) radar cross-section
  445.      */
  446.     public void setRcs(final double rcs) {
  447.         refuseFurtherComments();
  448.         this.rcs = rcs;
  449.     }

  450.     /** Get the minimum radar cross-section.
  451.      * @return minimum radar cross-section
  452.      */
  453.     public double getMinRcs() {
  454.         return minRcs;
  455.     }

  456.     /** Set the minimum radar cross-section.
  457.      * @param minRcs minimum radar cross-section
  458.      */
  459.     public void setMinRcs(final double minRcs) {
  460.         refuseFurtherComments();
  461.         this.minRcs = minRcs;
  462.     }

  463.     /** Get the maximum radar cross-section.
  464.      * @return maximum radar cross-section
  465.      */
  466.     public double getMaxRcs() {
  467.         return maxRcs;
  468.     }

  469.     /** Set the maximum radar cross-section.
  470.      * @param maxRcs maximum radar cross-section
  471.      */
  472.     public void setMaxRcs(final double maxRcs) {
  473.         refuseFurtherComments();
  474.         this.maxRcs = maxRcs;
  475.     }

  476.     /** Get the attitude-independent SRP area, not already into attitude-dependent area along OEB.
  477.      * @return attitude-independent SRP area, not already into attitude-dependent area along OEB
  478.      */
  479.     public double getSrpConstantArea() {
  480.         return srpConstantArea;
  481.     }

  482.     /** Set the attitude-independent SRP area, not already into attitude-dependent area along OEB.
  483.      * @param srpConstantArea attitude-independent SRP area, not already into attitude-dependent area along OEB
  484.      */
  485.     public void setSrpConstantArea(final double srpConstantArea) {
  486.         refuseFurtherComments();
  487.         this.srpConstantArea = srpConstantArea;
  488.     }

  489.     /** Get the nominal SRP coefficient.
  490.      * @return nominal SRP coefficient
  491.      */
  492.     public double getSrpCoefficient() {
  493.         return srpCoefficient;
  494.     }

  495.     /** Set the nominal SRP coefficient.
  496.      * @param srpCoefficient nominal SRP coefficient
  497.      */
  498.     public void setSrpCoefficient(final double srpCoefficient) {
  499.         refuseFurtherComments();
  500.         this.srpCoefficient = srpCoefficient;
  501.     }

  502.     /** Get the SRP coefficient 1σ uncertainty.
  503.      * @return SRP coefficient 1σ uncertainty
  504.      */
  505.     public double getSrpUncertainty() {
  506.         return srpUncertainty;
  507.     }

  508.     /** Set the SRP coefficient 1σ uncertainty.
  509.      * @param srpUncertainty SRP coefficient 1σ uncertainty.
  510.      */
  511.     public void setSrpUncertainty(final double srpUncertainty) {
  512.         refuseFurtherComments();
  513.         this.srpUncertainty = srpUncertainty;
  514.     }

  515.     /** Get the typical (50th percentile) visual magnitude.
  516.      * @return typical (50th percentile) visual magnitude
  517.      */
  518.     public double getVmAbsolute() {
  519.         return vmAbsolute;
  520.     }

  521.     /** Set the typical (50th percentile) visual magnitude.
  522.      * @param vmAbsolute typical (50th percentile) visual magnitude
  523.      */
  524.     public void setVmAbsolute(final double vmAbsolute) {
  525.         refuseFurtherComments();
  526.         this.vmAbsolute = vmAbsolute;
  527.     }

  528.     /** Get the minimum apparent visual magnitude.
  529.      * @return minimum apparent visual magnitude
  530.      */
  531.     public double getVmApparentMin() {
  532.         return vmApparentMin;
  533.     }

  534.     /** Set the minimum apparent visual magnitude.
  535.      * @param vmApparentMin minimum apparent visual magnitude
  536.      */
  537.     public void setVmApparentMin(final double vmApparentMin) {
  538.         refuseFurtherComments();
  539.         this.vmApparentMin = vmApparentMin;
  540.     }

  541.     /** Get the typical (50th percentile) apparent visual magnitude.
  542.      * @return typical (50th percentile) apparent visual magnitude
  543.      */
  544.     public double getVmApparent() {
  545.         return vmApparent;
  546.     }

  547.     /** Set the typical (50th percentile) apparent visual magnitude.
  548.      * @param vmApparent typical (50th percentile) apparent visual magnitude
  549.      */
  550.     public void setVmApparent(final double vmApparent) {
  551.         refuseFurtherComments();
  552.         this.vmApparent = vmApparent;
  553.     }

  554.     /** Get the maximum apparent visual magnitude.
  555.      * @return maximum apparent visual magnitude
  556.      */
  557.     public double getVmApparentMax() {
  558.         return vmApparentMax;
  559.     }

  560.     /** Set the maximum apparent visual magnitude.
  561.      * @param vmApparentMax maximum apparent visual magnitude
  562.      */
  563.     public void setVmApparentMax(final double vmApparentMax) {
  564.         refuseFurtherComments();
  565.         this.vmApparentMax = vmApparentMax;
  566.     }

  567.     /** Get the typical (50th percentile) coefficient of reflectivity.
  568.      * @return typical (50th percentile) coefficient of reflectivity
  569.      */
  570.     public double getReflectivity() {
  571.         return reflectivity;
  572.     }

  573.     /** Set the typical (50th percentile) coefficient of reflectivity.
  574.      * @param reflectivity typical (50th percentile) coefficient of reflectivity
  575.      */
  576.     public void setReflectivity(final double reflectivity) {
  577.         refuseFurtherComments();
  578.         this.reflectivity = reflectivity;
  579.     }

  580.     /** Get the attitude control mode.
  581.      * @return attitude control mode
  582.      */
  583.     public String getAttitudeControlMode() {
  584.         return attitudeControlMode;
  585.     }

  586.     /** Set the attitude control mode.
  587.      * @param attitudeControlMode attitude control mode
  588.      */
  589.     public void setAttitudeControlMode(final String attitudeControlMode) {
  590.         refuseFurtherComments();
  591.         this.attitudeControlMode = attitudeControlMode;
  592.     }

  593.     /** Get the type of actuator for attitude control.
  594.      * @return type of actuator for attitude control
  595.      */
  596.     public String getAttitudeActuatorType() {
  597.         return attitudeActuatorType;
  598.     }

  599.     /** Set the type of actuator for attitude control.
  600.      * @param attitudeActuatorType type of actuator for attitude control
  601.      */
  602.     public void setAttitudeActuatorType(final String attitudeActuatorType) {
  603.         refuseFurtherComments();
  604.         this.attitudeActuatorType = attitudeActuatorType;
  605.     }

  606.     /** Get the accuracy of attitude knowledge.
  607.      * @return accuracy of attitude knowledge
  608.      */
  609.     public double getAttitudeKnowledgeAccuracy() {
  610.         return attitudeKnowledgeAccuracy;
  611.     }

  612.     /** Set the accuracy of attitude knowledge.
  613.      * @param attitudeKnowledgeAccuracy accuracy of attitude knowledge
  614.      */
  615.     public void setAttitudeKnowledgeAccuracy(final double attitudeKnowledgeAccuracy) {
  616.         refuseFurtherComments();
  617.         this.attitudeKnowledgeAccuracy = attitudeKnowledgeAccuracy;
  618.     }

  619.     /** Get the accuracy of attitude control.
  620.      * @return accuracy of attitude control
  621.      */
  622.     public double getAttitudeControlAccuracy() {
  623.         return attitudeControlAccuracy;
  624.     }

  625.     /** Set the accuracy of attitude control.
  626.      * @param attitudeControlAccuracy accuracy of attitude control
  627.      */
  628.     public void setAttitudeControlAccuracy(final double attitudeControlAccuracy) {
  629.         refuseFurtherComments();
  630.         this.attitudeControlAccuracy = attitudeControlAccuracy;
  631.     }

  632.     /** Get the overall accuracy of spacecraft to maintain attitude.
  633.      * @return overall accuracy of spacecraft to maintain attitude
  634.      */
  635.     public double getAttitudePointingAccuracy() {
  636.         return attitudePointingAccuracy;
  637.     }

  638.     /** Set the overall accuracy of spacecraft to maintain attitude.
  639.      * @param attitudePointingAccuracy overall accuracy of spacecraft to maintain attitude
  640.      */
  641.     public void setAttitudePointingAccuracy(final double attitudePointingAccuracy) {
  642.         refuseFurtherComments();
  643.         this.attitudePointingAccuracy = attitudePointingAccuracy;
  644.     }

  645.     /** Get the average number of orbit or attitude maneuvers per year.
  646.      * @return average number of orbit or attitude maneuvers per year.
  647.      */
  648.     public double getManeuversPerYear() {
  649.         return maneuversFrequency * Constants.JULIAN_YEAR;
  650.     }

  651.     /** Get the average frequency of orbit or attitude maneuvers (in SI units, hence per second).
  652.      * @return average frequency of orbit or attitude maneuvers (in SI units, hence per second).
  653.      */
  654.     public double getManeuversFrequency() {
  655.         return maneuversFrequency;
  656.     }

  657.     /** Set the average frequency of orbit or attitude maneuvers (in SI units, hence per second).
  658.      * @param maneuversFrequency average frequency of orbit or attitude (in SI units, hence per second).
  659.      */
  660.     public void setManeuversFrequency(final double maneuversFrequency) {
  661.         refuseFurtherComments();
  662.         this.maneuversFrequency = maneuversFrequency;
  663.     }

  664.     /** Get the maximum composite thrust the spacecraft can accomplish.
  665.      * @return maximum composite thrust the spacecraft can accomplish
  666.      */
  667.     public double getMaxThrust() {
  668.         return maxThrust;
  669.     }

  670.     /** Set the maximum composite thrust the spacecraft can accomplish.
  671.      * @param maxThrust maximum composite thrust the spacecraft can accomplish
  672.      */
  673.     public void setMaxThrust(final double maxThrust) {
  674.         refuseFurtherComments();
  675.         this.maxThrust = maxThrust;
  676.     }

  677.     /** Get the total ΔV capability at beginning of life.
  678.      * @return total ΔV capability at beginning of life
  679.      */
  680.     public double getBolDv() {
  681.         return bolDv;
  682.     }

  683.     /** Set the total ΔV capability at beginning of life.
  684.      * @param bolDv total ΔV capability at beginning of life
  685.      */
  686.     public void setBolDv(final double bolDv) {
  687.         refuseFurtherComments();
  688.         this.bolDv = bolDv;
  689.     }

  690.     /** Get the total ΔV remaining for spacecraft.
  691.      * @return total ΔV remaining for spacecraft
  692.      */
  693.     public double getRemainingDv() {
  694.         return remainingDv;
  695.     }

  696.     /** Set the total ΔV remaining for spacecraft.
  697.      * @param remainingDv total ΔV remaining for spacecraft
  698.      */
  699.     public void setRemainingDv(final double remainingDv) {
  700.         refuseFurtherComments();
  701.         this.remainingDv = remainingDv;
  702.     }

  703.     /** Get the inertia matrix.
  704.      * @return the inertia matrix
  705.      */
  706.     public RealMatrix getInertiaMatrix() {
  707.         return inertiaMatrix;
  708.     }

  709.     /** Set an entry in the inertia matrix.
  710.      * <p>
  711.      * Both I(j, k) and I(k, j) are set.
  712.      * </p>
  713.      * @param j row index (must be between 0 and 3 (inclusive)
  714.      * @param k column index (must be between 0 and 3 (inclusive)
  715.      * @param entry value of the matrix entry
  716.      */
  717.     public void setInertiaMatrixEntry(final int j, final int k, final double entry) {
  718.         refuseFurtherComments();
  719.         inertiaMatrix.setEntry(j, k, entry);
  720.         inertiaMatrix.setEntry(k, j, entry);
  721.     }

  722. }