weather-formulas
Version:
A collection of atmospheric, meteorological weather calculations
121 lines (120 loc) • 6.5 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const constants_1 = __importDefault(require('../constants.cjs'));
const temperature_1 = __importDefault(require('./temperature.cjs'));
/**
* Calculates the pressure altitude based on the observed pressure.
* Pressure altitude is the altitude in the International Standard Atmosphere (ISA) where the observed pressure would occur.
*
* @param {number} pressure Observed pressure in Pascals (Pa).
* @returns {number} Pressure altitude in meters (m).
*/
function pressureAltitude(pressure) {
return (1 - Math.pow(pressure / constants_1.default.STANDARD_MEAN_PRESSURE_SEA_LEVEL, 0.190284)) * 145366.45 * 0.3048;
}
/**
* Calculates the density altitude, which is the altitude relative to the standard atmosphere conditions
* at which the air density would be equal to the current air density.
*
* @param {number} pressureAltitude Pressure altitude in meters (m).
* @param {number} temperature Temperature in Kelvin (K).
* @returns {number} Density altitude in meters (m).
*/
function densityAltitude(pressureAltitude, temperature) {
return pressureAltitude + (120 * (temperature - constants_1.default.STANDARD_MEAN_TEMPERATURE_KELVIN));
}
/**
* Calculates the barometric pressure at a given altitude using the barometric formula.
* The calculation accounts for both zero and non-zero lapse rates.
*
* @param {number} altitude Target altitude in meters (m).
* @param {number} referencePressure Pressure at the reference altitude in Pascals (Pa).
* @param {number} referenceAltitude Reference altitude in meters (m).
* @param {number} referenceTemperature Temperature at the reference altitude in Kelvin (K). Defaults to 288.15 K (15°C).
* @param {AtmospericConstants} constants Atmospheric constants (e.g., lapse rate, gravity, gas constant).
* @returns {number} Barometric pressure at the target altitude in Pascals (Pa).
*/
function barometricPressure(altitude, referencePressure, referenceAltitude, referenceTemperature = 288.15, constants = constants_1.default.DEFAULT_ATMOSPHERIC_CONSTANTS_DRY_AIR) {
let result;
if (constants.lapseRate === 0) {
// Case: Zero lapse rate
const scaleHeight = (constants.gasConstant * referenceTemperature) / constants.gravity;
result = referencePressure * Math.exp(-(altitude - referenceAltitude) / scaleHeight);
}
else {
// Case: Non-zero lapse rate
const tempRatio = 1 - (constants.lapseRate * (altitude - referenceAltitude)) / referenceTemperature;
// Ensure tempRatio is positive to avoid invalid results
if (tempRatio <= 0) {
return 0; // Return 0 if the calculation is invalid
}
const exponent = constants.gravity / (constants.gasConstant * constants.lapseRate);
result = referencePressure * Math.pow(tempRatio, exponent);
}
return Math.round(result * 100) / 100;
}
/**
* Reduces the observed pressure to sea level using a simplified barometric formula.
* This method assumes a standard sea level mean temperature of 15°C (288.15 K) and is less accurate for non-standard temperatures.
*
* @param {number} pressureObserved Observed pressure in Pascals (Pa).
* @param {number} altitude Altitude of the observed pressure in meters (m).
* @param {number} temperatureAtSeaLevel Temperature at sea level in Kelvin (K). Defaults to 288.15 K (15°C).
* @returns {number} Pressure reduced to sea level in Pascals (Pa), rounded to two decimal places.
*/
function adjustPressureToSeaLevelSimple(pressureObserved, altitude, temperatureAtSeaLevel = constants_1.default.STANDARD_MEAN_TEMPERATURE_KELVIN) {
let pressureSeaLevel = pressureObserved * Math.pow(1 - ((0.0065 * altitude) / (temperatureAtSeaLevel + 0.0065 * altitude)), -5.257);
return Number(pressureSeaLevel.toFixed(2));
}
/**
* Reduces the observed pressure to sea level with higher accuracy by using the barometric formula.
* This method allows customization of atmospheric constants for non-standard conditions.
*
* @param {number} pressureObserved Observed pressure in Pascals (Pa).
* @param {number} altitude Altitude of the observed pressure in meters (m).
* @param {number} temperature Temperature at sea level in Kelvin (K). Defaults to 288.15 K (15°C).
* @param {AtmospericConstants} constants Atmospheric constants (e.g., lapse rate, gravity, gas constant). Defaults to Earth's standard constants.
* @returns {number} Pressure reduced to sea level in Pascals (Pa), rounded to two decimal places.
*/
function adjustPressureToSeaLevelAdvanced(pressureObserved, altitude, temperature = constants_1.default.STANDARD_MEAN_TEMPERATURE_KELVIN, constants = constants_1.default.DEFAULT_ATMOSPHERIC_CONSTANTS_DRY_AIR) {
return barometricPressure(0, pressureObserved, altitude, temperature, constants);
}
/**
*
* @param pressure Observed pressure
* @param altitude Observed altitude
* @param temperature Observed temperature
* @param lapseRate Lapse rate
* @returns Adjusted pressure
*/
function adjustPressureToSeaLevelByDynamicLapseRate(pressure, altitude, temperature, lapseRate) {
const g = 9.80665; // Gravitational acceleration (m/s²)
const R = 287.05; // Specific gas constant for dry air (J/(kg·K))
if (lapseRate > 0) {
// Handle temperature inversion
const Tavg = temperature + (lapseRate * altitude) / 2; // Average temperature
return pressure * Math.exp((g * altitude) / (R * Tavg));
}
else {
// Standard formula
return pressure * Math.pow(1 - (lapseRate * altitude) / temperature, -g / (R * lapseRate));
}
}
function adjustPressureToSeaLevelByHistoricalData(pressure, altitude, readings, hours = 24) {
const dynamicLapseRate = temperature_1.default.calculateDynamicLapseRate(readings, hours);
const weightedAverageTemperature = temperature_1.default.calculateWeightedAverageTemperature(readings, hours);
const adjusted = adjustPressureToSeaLevelByDynamicLapseRate(pressure, altitude, weightedAverageTemperature, dynamicLapseRate);
return Math.round(adjusted);
}
exports.default = {
pressureAltitude,
densityAltitude,
barometricPressure,
adjustPressureToSeaLevelSimple,
adjustPressureToSeaLevelAdvanced,
adjustPressureToSeaLevelByDynamicLapseRate,
adjustPressureToSeaLevelByHistoricalData,
};