GlobalPressureTemperatureModel.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.weather;

import org.orekit.annotation.DefaultDataContext;
import org.orekit.bodies.GeodeticPoint;
import org.orekit.data.DataContext;
import org.orekit.frames.Frame;
import org.orekit.models.earth.Geoid;
import org.orekit.models.earth.ReferenceEllipsoid;
import org.orekit.models.earth.troposphere.TroposphericModelUtils;
import org.orekit.time.AbsoluteDate;

/** The Global Pressure and Temperature model.
 * This model is an empirical model that provides the temperature and the pressure depending
 * the latitude and the longitude of the station.
 * <p>
 * The Global Pressure and Temperature model is based on spherical harmonics up
 * to degree and order of 9. The residual values ​​of this model can reach 20 hPa
 * for pressure and 10 ° C for temperature. They are significant for higher latitudes and
 * small near the equator (Böhm, 2007)
 * </p>
 *
 * @see "J. Böhm, R. Heinkelmann, and H. Schuh (2007),
 * Short Note: A global model of pressure and temperature for geodetic applications. J Geod,
 * doi:10.1007/s00190-007-0135-3."
 *
 * @author Bryan Cazabonne
 * @deprecated as of 12.1, replaced by {@link GlobalPressureTemperature}
 */
@Deprecated
public class GlobalPressureTemperatureModel extends GlobalPressureTemperature implements WeatherModel {

    /** Spherical harmonics degree. */
    private static final int DEGREE = 9;

    /** Spherical harmonics order. */
    private static final int ORDER = 9;

    /** Geodetic latitude, in radians. */
    private final double latitude;

    /** Geodetic longitude, in radians. */
    private final double longitude;

    /** Temperature site, in kelvins. */
    private double temperature;

    /** Pressure site, in hPa. */
    private double pressure;

    /** Build a new instance.
     * <p>
     * At the initialization the values of the pressure and the temperature are set to NaN.
     * The user has to call {@link #weatherParameters(double, AbsoluteDate)} method before using
     * the values of the pressure and the temperature.
     * </p>
     *
     * <p>This method uses the {@link DataContext#getDefault() default data context}.
     *
     * @param latitude geodetic latitude, in radians
     * @param longitude geodetic longitude, in radians
     * @param bodyFrame the frame to attach to the ellipsoid. The origin is at
     *                  the center of mass, the z axis is the minor axis.
     * @see #GlobalPressureTemperatureModel(double, double, Frame, DataContext)
     */
    @DefaultDataContext
    public GlobalPressureTemperatureModel(final double latitude, final double longitude, final Frame bodyFrame) {
        this(latitude, longitude, bodyFrame, DataContext.getDefault());
    }

    /** Build a new instance.
     * <p>
     * At the initialization the values of the pressure and the temperature are set to NaN.
     * The user has to call {@link #weatherParameters(double, AbsoluteDate)} method before using
     * the values of the pressure and the temperature.
     * </p>
     * @param latitude geodetic latitude, in radians
     * @param longitude geodetic longitude, in radians
     * @param bodyFrame the frame to attach to the ellipsoid. The origin is at
     * @param dataContext to use for time and gravity.
     * @since 10.1
     */
    public GlobalPressureTemperatureModel(final double latitude,
                                          final double longitude,
                                          final Frame bodyFrame,
                                          final DataContext dataContext) {
        super(new Geoid(dataContext.getGravityFields().getNormalizedProvider(DEGREE, ORDER),
                        ReferenceEllipsoid.getWgs84(bodyFrame)),
              dataContext.getTimeScales().getUTC());
        this.latitude    = latitude;
        this.longitude   = longitude;
        this.temperature = Double.NaN;
        this.pressure    = Double.NaN;
    }

    /** Get the atmospheric temperature of the station depending its position.
     * @return the temperature in kelvins
     */
    public double getTemperature() {
        return temperature;
    }

    /** Get the atmospheric pressure of the station depending its position.
     * @return the pressure in hPa
     */
    public double getPressure() {
        return pressure;
    }

    @Override
    public void weatherParameters(final double height, final AbsoluteDate date) {

        final GeodeticPoint location = new GeodeticPoint(latitude, longitude, height);

        // Pressure and temperature
        final PressureTemperature pt = getWeatherParameters(location, date);
        this.temperature = pt.getTemperature();
        this.pressure    = TroposphericModelUtils.HECTO_PASCAL.fromSI(pt.getPressure());

    }

}