Tide.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.models.earth.displacement;
- import org.orekit.data.BodiesElements;
- /**
- * Class representing a tide.
- * @since 9.1
- * @author Luc Maisonobe
- */
- public class Tide {
- /** M₂ tide. */
- public static final Tide M2 = new Tide(255555);
- /** S₂ tide. */
- public static final Tide S2 = new Tide(273555);
- /** N₂ tide. */
- public static final Tide N2 = new Tide(245655);
- /** K₂ tide. */
- public static final Tide K2 = new Tide(275555);
- /** K₁ tide. */
- public static final Tide K1 = new Tide(165555);
- /** O₁ tide. */
- public static final Tide O1 = new Tide(145555);
- /** P₁ tide. */
- public static final Tide P1 = new Tide(163555);
- /** Q₁ tide. */
- public static final Tide Q1 = new Tide(135655);
- /** Mf tide. */
- public static final Tide MF = new Tide(75555);
- /** Mm tide. */
- public static final Tide MM = new Tide(65455);
- /** Ssa tide. */
- public static final Tide SSA = new Tide(57555);
- /** Doodson number. */
- private final int doodsonNumber;
- /** Multipliers for Doodson arguments (τ, s, h, p, N', ps). */
- private final int[] doodsonMultipliers;
- /** Multipliers for Delaunay arguments (l, l', F, D, Ω). */
- private final int[] delaunayMultipliers;
- /** Simple constructor.
- * @param cTau coefficient for mean lunar time
- * @param cS coefficient for mean longitude of the Moon
- * @param cH coefficient for mean longitude of the Sun
- * @param cP coefficient for longitude of Moon mean perigee
- * @param cNprime negative of the longitude of the Moon's mean ascending node on the ecliptic
- * @param cPs coefficient for longitude of Sun mean perigee
- */
- public Tide(final int cTau, final int cS, final int cH, final int cP, final int cNprime, final int cPs) {
- doodsonNumber = doodsonMultipliersToDoodsonNumber(cTau, cS, cH, cP, cNprime, cPs);
- doodsonMultipliers = new int[] {
- cTau, cS, cH, cP, cNprime, cPs
- };
- this.delaunayMultipliers = doodsonMultipliersToDelaunayMultipliers(doodsonMultipliers);
- }
- /** Simple constructor.
- * @param doodsonNumber Doodson Number
- */
- public Tide(final int doodsonNumber) {
- this.doodsonNumber = doodsonNumber;
- this.doodsonMultipliers = doodsonNumberToDoodsonMultipliers(doodsonNumber);
- this.delaunayMultipliers = doodsonMultipliersToDelaunayMultipliers(doodsonMultipliers);
- }
- /** Convert Doodson number to Doodson mutipliers.
- * @param doodsonNumber Doodson number
- * @return Doodson multipliers
- */
- private static int[] doodsonNumberToDoodsonMultipliers(final int doodsonNumber) {
- // CHECKSTYLE: stop Indentation check
- return new int[] {
- (doodsonNumber / 100000) % 10,
- ((doodsonNumber / 10000) % 10) - 5,
- ((doodsonNumber / 1000) % 10) - 5,
- ((doodsonNumber / 100) % 10) - 5,
- ((doodsonNumber / 10) % 10) - 5,
- (doodsonNumber % 10) - 5
- };
- // CHECKSTYLE: resume Indentation check
- }
- /** Convert Doodson mutipliers to Doodson number.
- * @param cTau coefficient for mean lunar time
- * @param cS coefficient for mean longitude of the Moon
- * @param cH coefficient for mean longitude of the Sun
- * @param cP coefficient for longitude of Moon mean perigee
- * @param cNprime negative of the longitude of the Moon's mean ascending node on the ecliptic
- * @param cPs coefficient for longitude of Sun mean perigee
- * @return Doodson number
- */
- private static int doodsonMultipliersToDoodsonNumber(final int cTau, final int cS, final int cH,
- final int cP, final int cNprime, final int cPs) {
- return ((((cTau * 10 + (cS + 5)) * 10 + (cH + 5)) * 10 + (cP + 5)) * 10 + (cNprime + 5)) * 10 + (cPs + 5);
- }
- /** Convert Doodson mutipliers to Delaunay multipliers.
- * @param dom Doodson multipliers
- * @return Delaunay multipliers
- */
- private static int[] doodsonMultipliersToDelaunayMultipliers(final int[] dom) {
- return new int[] {
- dom[3],
- dom[5],
- dom[0] - dom[1] - dom[2] - dom[3] - dom[5],
- dom[2] + dom[5],
- dom[0] - dom[1] - dom[2] - dom[3] + dom[4] - dom[5]
- };
- }
- /** Get the multipliers for Delaunay arguments (l, l', F, D, Ω).
- * <p>
- * Beware that for tides the multipliers for Delaunay arguments have an opposite
- * sign with respect to the convention used for nutation computation! Here, we
- * obey the tides convention.
- * </p>
- * @return multipliers for Delaunay arguments (l, l', F, D, Ω)
- */
- public int[] getDelaunayMultipliers() {
- return delaunayMultipliers.clone();
- }
- /** Get the multipliers for Doodson arguments (τ, s, h, p, N', ps).
- * @return multipliers for Doodson arguments (τ, s, h, p, N', ps)
- */
- public int[] getDoodsonMultipliers() {
- return doodsonMultipliers.clone();
- }
- /** Get the Doodson number.
- * @return Doodson number
- */
- public int getDoodsonNumber() {
- return doodsonNumber;
- }
- /** Get the multiplier for the τ Doodson argument.
- * <p>
- * This multiplier identifies semi-diurnal tides (2),
- * diurnal tides (1) and long period tides (0)
- * </p>
- * @return multiplier for the τ Doodson argument
- */
- public int getTauMultiplier() {
- return doodsonMultipliers[0];
- }
- /** Get the phase of the tide.
- * @param elements elements to use
- * @return phase of the tide (radians)
- */
- public double getPhase(final BodiesElements elements) {
- return doodsonMultipliers[0] * elements.getGamma() -
- delaunayMultipliers[0] * elements.getL() -
- delaunayMultipliers[1] * elements.getLPrime() -
- delaunayMultipliers[2] * elements.getF() -
- delaunayMultipliers[3] * elements.getD() -
- delaunayMultipliers[4] * elements.getOmega();
- }
- /** Get the angular rate of the tide.
- * @param elements elements to use
- * @return angular rate of the tide (radians/second)
- */
- public double getRate(final BodiesElements elements) {
- return doodsonMultipliers[0] * elements.getGammaDot() -
- delaunayMultipliers[0] * elements.getLDot() -
- delaunayMultipliers[1] * elements.getLPrimeDot() -
- delaunayMultipliers[2] * elements.getFDot() -
- delaunayMultipliers[3] * elements.getDDot() -
- delaunayMultipliers[4] * elements.getOmegaDot();
- }
- @Override
- public boolean equals(final Object object) {
- if (object instanceof Tide) {
- return doodsonNumber == ((Tide) object).doodsonNumber;
- }
- return false;
- }
- @Override
- public int hashCode() {
- return doodsonNumber;
- }
- }