Perturbations.java

/* Copyright 2002-2024 CS GROUP
 * Licensed to CS GROUP (CS) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * CS licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.orekit.files.ccsds.ndm.odm.ocm;

import java.util.Collections;
import java.util.List;

import org.orekit.bodies.CelestialBodies;
import org.orekit.files.ccsds.definitions.BodyFacade;
import org.orekit.files.ccsds.section.CommentsContainer;
import org.orekit.time.AbsoluteDate;

/** Perturbation parameters.
 * @author Luc Maisonobe
 * @since 11.0
 */
public class Perturbations extends CommentsContainer {

    /** Name of atmospheric model. */
    private String atmosphericModel;

    /** Gravity model name. */
    private String gravityModel;

    /** Degree of the gravity model. */
    private int gravityDegree;

    /** Order of the gravity model. */
    private int gravityOrder;

    /** Oblate spheroid equatorial radius of central body. */
    private double equatorialRadius;

    /** Gravitational coefficient of attracting body. */
    private double gm;

    /** N-body perturbation bodies. */
    private List<BodyFacade> nBodyPerturbations;

    /** Central body angular rotation rate. */
    private double centralBodyRotation;

    /** Central body oblate spheroid oblateness. */
    private double oblateFlattening;

    /** Ocean tides model. */
    private String oceanTidesModel;

    /** Solid tides model. */
    private String solidTidesModel;

    /** Reduction theory used for precession and nutation modeling. */
    private String reductionTheory;

    /** Albedo model. */
    private String albedoModel;

    /** Albedo grid size. Optional in 502.0-B-3 with no default. */
    private Integer albedoGridSize;

    /** Shadow model used for solar radiation pressure. */
    private ShadowModel shadowModel;

    /** Celestial bodies casting shadow. */
    private List<BodyFacade> shadowBodies;

    /** Solar Radiation Pressure model. */
    private String srpModel;

    /** Space Weather data source. */
    private String spaceWeatherSource;

    /** Epoch of the Space Weather data. */
    private AbsoluteDate spaceWeatherEpoch;

    /** Interpolation method for Space Weather data. */
    private String interpMethodSW;

    /** Fixed (time invariant) value of the planetary 3-hour-range geomagnetic index Kₚ. */
    private double fixedGeomagneticKp;

    /** Fixed (time invariant) value of the planetary 3-hour-range geomagnetic index aₚ. */
    private double fixedGeomagneticAp;

    /** Fixed (time invariant) value of the planetary 1-hour-range geomagnetic index Dst. */
    private double fixedGeomagneticDst;

    /** Fixed (time invariant) value of the Solar Flux Unit daily proxy F10.7. */
    private double fixedF10P7;

    /** Fixed (time invariant) value of the Solar Flux Unit 81-day running center-average proxy F10.7. */
    private double fixedF10P7Mean;

    /** Fixed (time invariant) value of the Solar Flux daily proxy M10.7. */
    private double fixedM10P7;

    /** Fixed (time invariant) value of the Solar Flux 81-day running center-average proxy M10.7. */
    private double fixedM10P7Mean;

    /** Fixed (time invariant) value of the Solar Flux daily proxy S10.7. */
    private double fixedS10P7;

    /** Fixed (time invariant) value of the Solar Flux 81-day running center-average proxy S10.7. */
    private double fixedS10P7Mean;

    /** Fixed (time invariant) value of the Solar Flux daily proxy Y10.7. */
    private double fixedY10P7;

    /** Fixed (time invariant) value of the Solar Flux 81-day running center-average proxy Y10.7. */
    private double fixedY10P7Mean;

    /** Simple constructor.
     * @param celestialBodies factory for celestial bodies
     */
    public Perturbations(final CelestialBodies celestialBodies) {
        // we don't call the setXxx() methods in order to avoid
        // calling refuseFurtherComments as a side effect
        equatorialRadius    = Double.NaN;
        gm                  = Double.NaN;
        centralBodyRotation = Double.NaN;
        oblateFlattening    = Double.NaN;
        fixedGeomagneticKp  = Double.NaN;
        fixedGeomagneticAp  = Double.NaN;
        fixedGeomagneticDst = Double.NaN;
        fixedF10P7          = Double.NaN;
        fixedF10P7Mean      = Double.NaN;
        fixedM10P7          = Double.NaN;
        fixedM10P7Mean      = Double.NaN;
        fixedS10P7          = Double.NaN;
        fixedS10P7Mean      = Double.NaN;
        fixedY10P7          = Double.NaN;
        fixedY10P7Mean      = Double.NaN;
        // In 502.0-B-3 (p. 6-50) SHADOW_BODIES is optional with no default
        shadowBodies = Collections.emptyList();
    }

    /** Get name of atmospheric model.
     * @return name of atmospheric model
     */
    public String getAtmosphericModel() {
        return atmosphericModel;
    }

    /** Set name of atmospheric model.
     * @param atmosphericModel name of atmospheric model
     */
    public void setAtmosphericModel(final String atmosphericModel) {
        this.atmosphericModel = atmosphericModel;
    }

    /** Get gravity model name.
     * @return gravity model name
     */
    public String getGravityModel() {
        return gravityModel;
    }

    /** Get degree of the gravity model.
     * @return degree of the gravity model
     */
    public int getGravityDegree() {
        return gravityDegree;
    }

    /** Get order of the gravity model.
     * @return order of the gravity model
     */
    public int getGravityOrder() {
        return gravityOrder;
    }

    /** Set gravity model.
     * @param name name of the model
     * @param degree degree of the model
     * @param order order of the model
     */
    public void setGravityModel(final String name, final int degree, final int order) {
        this.gravityModel  = name;
        this.gravityDegree = degree;
        this.gravityOrder  = order;
    }

    /** Get oblate spheroid equatorial radius of central body.
     * @return oblate spheroid equatorial radius of central body
     */
    public double getEquatorialRadius() {
        return equatorialRadius;
    }

    /** Set oblate spheroid equatorial radius of central body.
     * @param equatorialRadius oblate spheroid equatorial radius of central body
     */
    public void setEquatorialRadius(final double equatorialRadius) {
        this.equatorialRadius = equatorialRadius;
    }

    /** Get gravitational coefficient of attracting body.
     * @return gravitational coefficient of attracting body
     */
    public double getGm() {
        return gm;
    }

    /** Set gravitational coefficient of attracting body.
     * @param gm gravitational coefficient of attracting body
     */
    public void setGm(final double gm) {
        this.gm = gm;
    }

    /** Get n-body perturbation bodies.
     * @return n-body perturbation bodies
     */
    public List<BodyFacade> getNBodyPerturbations() {
        return nBodyPerturbations;
    }

    /** Set n-body perturbation bodies.
     * @param nBody n-body perturbation bodies
     */
    public void setNBodyPerturbations(final List<BodyFacade> nBody) {
        this.nBodyPerturbations = nBody;
    }

    /** Get central body angular rotation rate.
     * @return central body angular rotation rate
     */
    public double getCentralBodyRotation() {
        return centralBodyRotation;
    }

    /** Set central body angular rotation rate.
     * @param centralBodyRotation central body angular rotation rate
     */
    public void setCentralBodyRotation(final double centralBodyRotation) {
        this.centralBodyRotation = centralBodyRotation;
    }

    /** Get central body oblate spheroid oblateness.
     * @return central body oblate spheroid oblateness
     */
    public double getOblateFlattening() {
        return oblateFlattening;
    }

    /** Set central body oblate spheroid oblateness.
     * @param oblateFlattening central body oblate spheroid oblateness
     */
    public void setOblateFlattening(final double oblateFlattening) {
        this.oblateFlattening = oblateFlattening;
    }

    /** Get ocean tides model.
     * @return ocean tides model
     */
    public String getOceanTidesModel() {
        return oceanTidesModel;
    }

    /** Set ocean tides model.
     * @param oceanTidesModel ocean tides model
     */
    public void setOceanTidesModel(final String oceanTidesModel) {
        this.oceanTidesModel = oceanTidesModel;
    }

    /** Get solid tides model.
     * @return solid tides model
     */
    public String getSolidTidesModel() {
        return solidTidesModel;
    }

    /** Set solid tides model.
     * @param solidTidesModel solid tides model
     */
    public void setSolidTidesModel(final String solidTidesModel) {
        this.solidTidesModel = solidTidesModel;
    }

    /** Get reduction theory used for precession and nutation modeling.
     * @return reduction theory used for precession and nutation modeling
     */
    public String getReductionTheory() {
        return reductionTheory;
    }

    /** Set reduction theory used for precession and nutation modeling.
     * @param reductionTheory reduction theory used for precession and nutation modeling
     */
    public void setReductionTheory(final String reductionTheory) {
        this.reductionTheory = reductionTheory;
    }

    /** Get albedo model.
     * @return albedo model
     */
    public String getAlbedoModel() {
        return albedoModel;
    }

    /** Set albedo model.
     * @param albedoModel albedo model
     */
    public void setAlbedoModel(final String albedoModel) {
        this.albedoModel = albedoModel;
    }

    /** Get albedo grid size.
     * @return albedo grid size
     */
    public Integer getAlbedoGridSize() {
        return albedoGridSize;
    }

    /** Set albedo grid size.
     * @param albedoGridSize albedo grid size
     */
    public void setAlbedoGridSize(final Integer albedoGridSize) {
        this.albedoGridSize = albedoGridSize;
    }

    /** Get shadow model used for solar radiation pressure.
     * @return shadow model used for solar radiation pressure
     */
    public ShadowModel getShadowModel() {
        return shadowModel;
    }

    /** Set shadow model used for solar radiation pressure.
     * @param shadowModel shadow model used for solar radiation pressure
     */
    public void setShadowModel(final ShadowModel shadowModel) {
        this.shadowModel = shadowModel;
    }

    /** Get celestial bodies casting shadows.
     * @return celestial bodies casting shadows
     */
    public List<BodyFacade> getShadowBodies() {
        return shadowBodies;
    }

    /** Set celestial bodies casting shadows.
     * @param shadowBodies celestial bodies casting shadows
     */
    public void setShadowBodies(final List<BodyFacade> shadowBodies) {
        this.shadowBodies = shadowBodies;
    }

    /** Get Solar Radiation Pressure model.
     * @return Solar Radiation Pressure model
     */
    public String getSrpModel() {
        return srpModel;
    }

    /** Set Solar Radiation Pressure model.
     * @param srpModel Solar Radiation Pressure model
     */
    public void setSrpModel(final String srpModel) {
        this.srpModel = srpModel;
    }

    /** Get Space Weather data source.
     * @return Space Weather data source
     */
    public String getSpaceWeatherSource() {
        return spaceWeatherSource;
    }

    /** Set Space Weather data source.
     * @param spaceWeatherSource Space Weather data source
     */
    public void setSpaceWeatherSource(final String spaceWeatherSource) {
        this.spaceWeatherSource = spaceWeatherSource;
    }

    /** Get epoch of the Space Weather data.
     * @return epoch of the Space Weather data
     */
    public AbsoluteDate getSpaceWeatherEpoch() {
        return spaceWeatherEpoch;
    }

    /** Set epoch of the Space Weather data.
     * @param spaceWeatherEpoch epoch of the Space Weather data
     */
    public void setSpaceWeatherEpoch(final AbsoluteDate spaceWeatherEpoch) {
        this.spaceWeatherEpoch = spaceWeatherEpoch;
    }

    /** Get the interpolation method for Space Weather data.
     * @return interpolation method for Space Weather data
     */
    public String getInterpMethodSW() {
        return interpMethodSW;
    }

    /** Set the interpolation method for Space Weather data.
     * @param interpMethodSW interpolation method for Space Weather data
     */
    public void setInterpMethodSW(final String interpMethodSW) {
        refuseFurtherComments();
        this.interpMethodSW = interpMethodSW;
    }

    /** Get fixed (time invariant) value of the planetary 3-hour-range geomagnetic index Kₚ.
     * @return fixed (time invariant) value of the planetary 3-hour-range geomagnetic index Kₚ
     */
    public double getFixedGeomagneticKp() {
        return fixedGeomagneticKp;
    }

    /** Set fixed (time invariant) value of the planetary 3-hour-range geomagnetic index Kₚ.
     * @param fixedGeomagneticKp fixed (time invariant) value of the planetary 3-hour-range geomagnetic index Kₚ
     */
    public void setFixedGeomagneticKp(final double fixedGeomagneticKp) {
        this.fixedGeomagneticKp = fixedGeomagneticKp;
    }

    /** Get fixed (time invariant) value of the planetary 3-hour-range geomagnetic index aₚ.
     * @return fixed (time invariant) value of the planetary 3-hour-range geomagnetic index aₚ
     */
    public double getFixedGeomagneticAp() {
        return fixedGeomagneticAp;
    }

    /** Set fixed (time invariant) value of the planetary 3-hour-range geomagnetic index aₚ.
     * @param fixedGeomagneticAp fixed (time invariant) value of the planetary 3-hour-range geomagnetic index aₚ
     */
    public void setFixedGeomagneticAp(final double fixedGeomagneticAp) {
        this.fixedGeomagneticAp = fixedGeomagneticAp;
    }

    /** Get fixed (time invariant) value of the planetary 1-hour-range geomagnetic index Dst.
     * @return fixed (time invariant) value of the planetary 1-hour-range geomagnetic index Dst
     */
    public double getFixedGeomagneticDst() {
        return fixedGeomagneticDst;
    }

    /** Set fixed (time invariant) value of the planetary 1-hour-range geomagnetic index Dst.
     * @param fixedGeomagneticDst fixed (time invariant) value of the planetary 1-hour-range geomagnetic index Dst
     */
    public void setFixedGeomagneticDst(final double fixedGeomagneticDst) {
        this.fixedGeomagneticDst = fixedGeomagneticDst;
    }

    /** Get fixed (time invariant) value of the Solar Flux Unit daily proxy F10.7.
     * @return fixed (time invariant) value of the Solar Flux Unit daily proxy F10.7
     */
    public double getFixedF10P7() {
        return fixedF10P7;
    }

    /** Set fixed (time invariant) value of the Solar Flux Unit daily proxy F10.7.
     * @param fixedF10P7 fixed (time invariant) value of the Solar Flux Unit daily proxy F10.7
     */
    public void setFixedF10P7(final double fixedF10P7) {
        this.fixedF10P7 = fixedF10P7;
    }

    /** Get fixed (time invariant) value of the Solar Flux Unit 81-day running center-average proxy F10.7.
     * @return fixed (time invariant) value of the Solar Flux Unit 81-day running center-average proxy F10.7
     */
    public double getFixedF10P7Mean() {
        return fixedF10P7Mean;
    }

    /** Set fixed (time invariant) value of the Solar Flux Unit 81-day running center-average proxy F10.7.
     * @param fixedF10P7Mean fixed (time invariant) value of the Solar Flux Unit 81-day running center-average proxy F10.7
     */
    public void setFixedF10P7Mean(final double fixedF10P7Mean) {
        this.fixedF10P7Mean = fixedF10P7Mean;
    }

    /** Get fixed (time invariant) value of the Solar Flux daily proxy M10.7.
     * @return fixed (time invariant) value of the Solar Flux daily proxy M10.7
     */
    public double getFixedM10P7() {
        return fixedM10P7;
    }

    /** Set fixed (time invariant) value of the Solar Flux daily proxy M10.7.
     * @param fixedM10P7 fixed (time invariant) value of the Solar Flux daily proxy M10.7
     */
    public void setFixedM10P7(final double fixedM10P7) {
        this.fixedM10P7 = fixedM10P7;
    }

    /** Get fixed (time invariant) value of the Solar Flux 81-day running center-average proxy M10.7.
     * @return fixed (time invariant) value of the Solar Flux 81-day running center-average proxy M10.7
     */
    public double getFixedM10P7Mean() {
        return fixedM10P7Mean;
    }

    /** Set fixed (time invariant) value of the Solar Flux 81-day running center-average proxy M10.7.
     * @param fixedM10P7Mean fixed (time invariant) value of the Solar Flux 81-day running center-average proxy M10.7
     */
    public void setFixedM10P7Mean(final double fixedM10P7Mean) {
        this.fixedM10P7Mean = fixedM10P7Mean;
    }

    /** Get fixed (time invariant) value of the Solar Flux daily proxy S10.7.
     * @return fixed (time invariant) value of the Solar Flux daily proxy S10.7
     */
    public double getFixedS10P7() {
        return fixedS10P7;
    }

    /** Set fixed (time invariant) value of the Solar Flux daily proxy S10.7.
     * @param fixedS10P7 fixed (time invariant) value of the Solar Flux daily proxy S10.7
     */
    public void setFixedS10P7(final double fixedS10P7) {
        this.fixedS10P7 = fixedS10P7;
    }

    /** Get fixed (time invariant) value of the Solar Flux 81-day running center-average proxy S10.7.
     * @return fixed (time invariant) value of the Solar Flux 81-day running center-average proxy S10.7
     */
    public double getFixedS10P7Mean() {
        return fixedS10P7Mean;
    }

    /** Set fixed (time invariant) value of the Solar Flux 81-day running center-average proxy S10.7.
     * @param fixedS10P7Mean fixed (time invariant) value of the Solar Flux 81-day running center-average proxy S10.7
     */
    public void setFixedS10P7Mean(final double fixedS10P7Mean) {
        this.fixedS10P7Mean = fixedS10P7Mean;
    }

    /** Get fixed (time invariant) value of the Solar Flux daily proxy Y10.7.
     * @return fixed (time invariant) value of the Solar Flux daily proxy Y10.7
     */
    public double getFixedY10P7() {
        return fixedY10P7;
    }

    /** Set fixed (time invariant) value of the Solar Flux daily proxy Y10.7.
     * @param fixedY10P7 fixed (time invariant) value of the Solar Flux daily proxy Y10.7
     */
    public void setFixedY10P7(final double fixedY10P7) {
        this.fixedY10P7 = fixedY10P7;
    }

    /** Get fixed (time invariant) value of the Solar Flux 81-day running center-average proxy Y10.7.
     * @return fixed (time invariant) value of the Solar Flux 81-day running center-average proxy Y10.7
     */
    public double getFixedY10P7Mean() {
        return fixedY10P7Mean;
    }

    /** Set fixed (time invariant) value of the Solar Flux 81-day running center-average proxy Y10.7.
     * @param fixedY10P7Mean fixed (time invariant) value of the Solar Flux 81-day running center-average proxy Y10.7
     */
    public void setFixedY10P7Mean(final double fixedY10P7Mean) {
        this.fixedY10P7Mean = fixedY10P7Mean;
    }

}