Skip to content

Commit 7b42a2d

Browse files
authored
Merge pull request #8 from oyve/dev
Refactor, more functions
2 parents 5291c66 + d560c1f commit 7b42a2d

27 files changed

+1058
-240
lines changed

README.md

Lines changed: 111 additions & 49 deletions
Large diffs are not rendered by default.

package-lock.json

Lines changed: 39 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "weather-formulas",
3-
"version": "1.0.8",
3+
"version": "1.0.9",
44
"description": "A collection of atmospheric, meteorological weather calculations",
55
"type": "module",
66
"main": "dist/cjs/index.cjs",
@@ -17,10 +17,15 @@
1717
"import": "./dist/esm/formulas/airDensity.js",
1818
"types": "./dist/types/formulas/airDensity.d.ts"
1919
},
20+
"./altitude": {
21+
"require": "./dist/cjs/formulas/altitude.cjs",
22+
"import": "./dist/esm/formulas/altitude.js",
23+
"types": "./dist/types/formulas/altitude.d.ts"
24+
},
2025
"./diurnalRythm": {
21-
"require": "./dist/cjs/formulas/diurnalRythm.cjs",
22-
"import": "./dist/esm/formulas/diurnalRythm.js",
23-
"types": "./dist/types/formulas/diurnalRythm.d.ts"
26+
"require": "./dist/cjs/phenomena/diurnalRythm.cjs",
27+
"import": "./dist/esm/phenomena/diurnalRythm.js",
28+
"types": "./dist/types/phenomena/diurnalRythm.d.ts"
2429
},
2530
"./humidity": {
2631
"require": "./dist/cjs/formulas/humidity.cjs",
@@ -42,6 +47,21 @@
4247
"import": "./dist/esm/formulas/wind.js",
4348
"types": "./dist/types/formulas/wind.d.ts"
4449
},
50+
"./heatIndex": {
51+
"require": "./dist/cjs/scales/heatIndex.cjs",
52+
"import": "./dist/esm/scales/heatIndex.js",
53+
"types": "./dist/types/scales/heatIndex.d.ts"
54+
},
55+
"./humidex": {
56+
"require": "./dist/cjs/indices/humidex.cjs",
57+
"import": "./dist/esm/indices/humidex.js",
58+
"types": "./dist/types/indices/humidex.d.ts"
59+
},
60+
"./fog": {
61+
"require": "./dist/cjs/phenomena/fog.cjs",
62+
"import": "./dist/esm/phenomena/fog.js",
63+
"types": "./dist/types/phenomena/fog.d.ts"
64+
},
4565
"./beaufort": {
4666
"require": "./dist/cjs/scales/beaufort.cjs",
4767
"import": "./dist/esm/scales/beaufort.js",
@@ -51,6 +71,11 @@
5171
"require": "./dist/cjs/scales/saffirSimpson.cjs",
5272
"import": "./dist/esm/scales/saffirSimpson.js",
5373
"types": "./dist/types/scales/saffirSimpson.d.ts"
74+
},
75+
"./uvindex": {
76+
"require": "./dist/cjs/scales/uvindex.cjs",
77+
"import": "./dist/esm/scales/uvindex.js",
78+
"types": "./dist/types/scales/uvindex.d.ts"
5479
}
5580
},
5681
"files": [
@@ -104,9 +129,15 @@
104129
"homepage": "https://github.com/oyve/weather-formulas#readme",
105130
"devDependencies": {
106131
"@types/jest": "^29.5.14",
132+
"@types/regression": "^2.0.6",
133+
"@types/suncalc": "^1.9.2",
107134
"jest": "^29.7.0",
108135
"ts-jest": "^29.2.6",
109136
"ts-node": "^10.9.2",
110137
"typescript": "^5.8.3"
138+
},
139+
"dependencies": {
140+
"regression": "^2.0.1",
141+
"suncalc": "^1.9.0"
111142
}
112-
}
143+
}

scripts/generate-exports.cjs

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,16 +28,31 @@ function generateExports(directory) {
2828
};
2929
});
3030

31-
// Read, update, and write the package.json file
32-
3331
console.log(`Generated exports for directory /${directory}`);
3432
return exportsField;
3533
}
3634

37-
let exportFormulas = generateExports('formulas');
38-
let scalesFormulas = generateExports('scales');
35+
function getSubdirectories(srcPath) {
36+
return fs.readdirSync(srcPath)
37+
.filter(name => fs.statSync(path.join(srcPath, name)).isDirectory());
38+
}
3939

40-
const exportsField = {...exportFormulas, ...scalesFormulas };
40+
// Dynamically get all subdirectories under src
41+
const srcDir = path.resolve(__dirname, '../src');
42+
const subdirs = getSubdirectories(srcDir);
43+
44+
let exportsField = {
45+
'.': {
46+
require: './dist/cjs/index.cjs',
47+
import: './dist/esm/index.js',
48+
types: "./dist/types/index.d.ts"
49+
},
50+
};
51+
52+
subdirs.forEach(dir => {
53+
const dirExports = generateExports(dir);
54+
Object.assign(exportsField, dirExports);
55+
});
4156

4257
const pkgPath = path.resolve(__dirname, '../package.json');
4358
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));

src/common.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
export interface Reading {
22
temperature: number, //kelvin
3+
pressure: number, //meter
34
altitude: number, //meter
4-
datetime: Date
5+
relativeHumidity: number, //relative humidity in %
6+
timestamp: number
57
}

src/constants.ts

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,14 @@ export const STANDARD_MEAN_TEMPERATURE_CELCIUS = 15;
55
export const STANDARD_MEAN_TEMPERATURE_KELVIN = 288.15;
66
export const STANDARD_LAPSE_RATE = 0.0065;
77

8-
export const DEW_POINT_VALUATIONS = {
8+
export interface IValuationSet {
9+
a: number, //millibar
10+
b: number, //constant
11+
c: number, //celcius degrees
12+
d: number; //celcius degrees
13+
}
14+
15+
export const DEW_POINT_VALUATIONS: Record<string, IValuationSet> = {
916
ARDENBUCK_DEFAULT: { a: 6.1121, b: 18.678, c: 257.14, d: 234.5 },
1017
DAVID_BOLTON: { a: 6.112, b: 17.67, c: 234.5, d: 234.5 }, //maximum error of 0.1%, for −30 °C ≤ T ≤ 35°C and 1% < RH < 100%
1118
SONNTAG1990: { a: 6.112, b: 17.62, c: 243.12, d: 234.5 }, //for −45 °C ≤ T ≤ 60 °C (error ±0.35 °C).
@@ -45,4 +52,18 @@ export const SATURATION_VAPOR_PRESSURE_COEFFICIENTS: SaturationVaporCoefficients
4552
REFERENCE_PRESSURE: 611.2, // Reference pressure at 0°C in Pascals
4653
MAGNUS_CONSTANT_B: 17.62, // Empirical constant for water vapor
4754
MAGNUS_CONSTANT_C: 243.12, // Empirical constant for water vapor in Celsius
48-
} as const;
55+
} as const;
56+
57+
export interface THERMODYNAMIC_CONSTANTS {
58+
Rd: number; // Gas constant for dry air (J/(kg·K))
59+
Cp: number; // Specific heat at constant pressure (J/(kg·K))
60+
Lv: number; // Latent heat of vaporization (J/kg)
61+
p0: number; // Reference pressure (Pa, 1000 hPa)
62+
};
63+
64+
export const DEFAULT_THERMODYNAMIC_CONSTANTS: THERMODYNAMIC_CONSTANTS = {
65+
Rd: 287, // Gas constant for dry air (J/(kg·K))
66+
Cp: 1004, // Specific heat at constant pressure (J/(kg·K))
67+
Lv: 2.5e6, // Latent heat of vaporization (J/kg)
68+
p0: 100000 // Reference pressure (Pa, 1000 hPa)
69+
};

src/formulas/airDensity.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@ import * as c from '../constants';
66
* Supports both dry air and moist air calculations.
77
* @param {number} pressure - Atmospheric pressure in Pascals (Pa).
88
* @param {number} temperature - Temperature in Kelvin (K).
9-
* @param {number} humidity - Relative Humidity in percentage (%).
10-
* @param {boolean} [isDryAir=false] - Whether to calculate for dry air (ignores humidity).
119
* @param {number} [gasConstant=287.05] - Specific gas constant for dry air (J/(kg·K)).
1210
* @returns {number} - Air density in kilograms per cubic meter (kg/m³).
1311
*/

src/formulas/altitude.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/**
2+
* Estimate the altitude (in meters) where the temperature drops below freezing (0°C).
3+
* Assumes a linear lapse rate (default: 0.0065 K/m).
4+
* @param {number} surfaceTemp - Surface temperature in Kelvin.
5+
* @param {number} surfaceAltitude - Surface altitude in meters.
6+
* @param {number} lapseRate - Lapse rate in Kelvin per meter (default: 0.0065).
7+
* @returns {number | null} Altitude in meters where temperature is 273.15 K (0°C), or null if already below freezing.
8+
*/
9+
export function freezingLevelAltitude(
10+
surfaceTemp: number,
11+
surfaceAltitude: number = 0,
12+
lapseRate: number = 0.0065
13+
): number | null {
14+
if (surfaceTemp <= 273.15) return null; // Already freezing or below at surface
15+
// Calculate altitude difference needed to reach 0°C (273.15 K)
16+
const altitudeDiff = (surfaceTemp - 273.15) / lapseRate;
17+
return surfaceAltitude + altitudeDiff;
18+
}

src/formulas/humidity.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,4 +112,15 @@ export function specificGasConstantForMoistAir(mixingRatio: number): number {
112112
*/
113113
export function dewPointDepression(airTemperature: number, dewPointTemperature: number): number {
114114
return airTemperature - dewPointTemperature;
115+
}
116+
117+
/**
118+
* Calculate the Lifting Condensation Level (LCL) in meters.
119+
* If LCL is near the surface, fog is likely.
120+
* @param {number} temperature - Air temperature in Kelvin
121+
* @param {number} dewPoint - Dew point temperature in Kelvin
122+
* @returns {number} LCL in meters
123+
*/
124+
export function liftingCondensationLevel(temperature: number, dewPoint: number): number {
125+
return 125 * (temperature - dewPoint);
115126
}

0 commit comments

Comments
 (0)