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 package org.orekit.files.sp3; 18 19 import org.hipparchus.util.FastMath; 20 import org.orekit.utils.units.Unit; 21 22 /** Constants for SP3 files. 23 * @since 12.0 24 * @author Luc Maisonobe 25 */ 26 public class SP3Utils { 27 28 /** Bad or absent clock values are to be set to 999999.999999. */ 29 public static final double DEFAULT_CLOCK_VALUE = 999999.999999; 30 31 /** Bad or absent clock rate values are to be set to 999999.999999. */ 32 public static final double DEFAULT_CLOCK_RATE_VALUE = 999999.999999; 33 34 /** Base for general position/velocity accuracy. */ 35 public static final double POS_VEL_BASE_ACCURACY = 2.0; 36 37 /** Position unit. */ 38 public static final Unit POSITION_UNIT = Unit.parse("km"); 39 40 /** Position accuracy unit. */ 41 public static final Unit POSITION_ACCURACY_UNIT = Unit.parse("mm"); 42 43 /** Velocity unit. */ 44 public static final Unit VELOCITY_UNIT = Unit.parse("dm/s"); 45 46 /** Velocity accuracy unit. */ 47 public static final Unit VELOCITY_ACCURACY_UNIT = Unit.parse("mm/s").scale("10⁻⁴mm/s", 1.0e-4); 48 49 /** Additional state name for clock. 50 * @since 12.1 51 */ 52 public static final String CLOCK_ADDITIONAL_STATE = "clock"; 53 54 /** Clock unit. */ 55 public static final Unit CLOCK_UNIT = Unit.parse("µs"); 56 57 /** Clock accuracy unit. */ 58 public static final Unit CLOCK_ACCURACY_UNIT = Unit.parse("ps"); 59 60 /** Clock rate unit. */ 61 public static final Unit CLOCK_RATE_UNIT = Unit.parse("µs/s").scale("10⁻⁴µs/s", 1.0e-4); 62 63 /** Clock rate accuracy unit. */ 64 public static final Unit CLOCK_RATE_ACCURACY_UNIT = Unit.parse("ps/s").scale("10⁻⁴ps/s", 1.0e-4); 65 66 /** Private constructor for utility class. 67 */ 68 private SP3Utils() { 69 // nothing to do 70 } 71 72 /** Convert an accuracy to SI units. 73 * @param unit accuracy unit 74 * @param base base 75 * @param accuracyIndex index of accuracy 76 * @return accuracy in SI units 77 */ 78 public static double siAccuracy(final Unit unit, final double base, final int accuracyIndex) { 79 return unit.toSI(FastMath.pow(base, accuracyIndex)); 80 } 81 82 /** Convert an accuracy from SI units. 83 * @param unit accuracy unit 84 * @param base base 85 * @param accuracy in SI units 86 * @return accuracyIndex index of accuracy 87 */ 88 public static int indexAccuracy(final Unit unit, final double base, final double accuracy) { 89 return (int) FastMath.ceil(FastMath.log(unit.fromSI(accuracy)) / FastMath.log(base)); 90 } 91 92 }