|
1 | | -import { freezingLevelAltitude } from '../../src/formulas/altitude'; |
| 1 | +import { freezingLevelAltitude, altitudeFromPressureDifference } from '../../src/formulas/altitude'; |
2 | 2 | import { cloudBaseHeight } from '../../src/phenomena/cloud'; |
3 | 3 |
|
4 | 4 | describe('freezingLevelHeight', () => { |
@@ -29,6 +29,59 @@ describe('freezingLevelHeight', () => { |
29 | 29 | }); |
30 | 30 | }); |
31 | 31 |
|
| 32 | +describe('altitudeFromPressureDifference', () => { |
| 33 | + it('should calculate altitude from sea level pressure', () => { |
| 34 | + // Sea level pressure: 101325 Pa, pressure at ~1000m: ~89874 Pa |
| 35 | + // Using hypsometric formula: h = (R * T / g) * ln(P1 / P2) |
| 36 | + // With R = 287.05 J/(kg·K), T = 288.15 K, g = 9.80665 m/s² |
| 37 | + const result = altitudeFromPressureDifference(101325, 89874, 0, 288.15); |
| 38 | + // Calculated: (287.05 * 288.15 / 9.80665) * ln(101325 / 89874) ≈ 1011.49 m |
| 39 | + expect(result).toBeCloseTo(1011.49, 0); |
| 40 | + }); |
| 41 | + |
| 42 | + it('should return the final altitude, not just the difference', () => { |
| 43 | + // If reference altitude is 500 m, the result should be 500 + altitude difference |
| 44 | + const result = altitudeFromPressureDifference(101325, 89874, 500, 288.15); |
| 45 | + // Should be approximately 500 + 1011.49 = 1511.49 m |
| 46 | + expect(result).toBeCloseTo(1511.49, 0); |
| 47 | + }); |
| 48 | + |
| 49 | + it('should return reference altitude when pressures are equal', () => { |
| 50 | + // If pressures are equal, altitude difference is 0 |
| 51 | + const result = altitudeFromPressureDifference(101325, 101325, 100, 288.15); |
| 52 | + expect(result).toBeCloseTo(100, 2); |
| 53 | + }); |
| 54 | + |
| 55 | + it('should calculate lower altitude when observed pressure is higher', () => { |
| 56 | + // Higher pressure means lower altitude |
| 57 | + const result = altitudeFromPressureDifference(89874, 101325, 1000, 288.15); |
| 58 | + // Should be approximately 1000 - 1011.49 ≈ -11.49 m |
| 59 | + expect(result).toBeCloseTo(-11.49, 0); |
| 60 | + }); |
| 61 | + |
| 62 | + it('should calculate altitude at high elevation from sea level', () => { |
| 63 | + // Sea level pressure: 101325 Pa, pressure at ~5000m: ~54020 Pa |
| 64 | + const result = altitudeFromPressureDifference(101325, 54020, 0, 288.15); |
| 65 | + // Calculated value using hypsometric formula |
| 66 | + expect(result).toBeCloseTo(5305.07, 0); |
| 67 | + }); |
| 68 | + |
| 69 | + it('should work with default parameters', () => { |
| 70 | + // Uses default referenceAltitude = 0 and temperature = 288.15 K |
| 71 | + const result = altitudeFromPressureDifference(101325, 89874); |
| 72 | + expect(result).toBeCloseTo(1011.49, 0); |
| 73 | + }); |
| 74 | + |
| 75 | + it('should account for different temperatures', () => { |
| 76 | + // Colder temperature should result in slightly different altitude calculation |
| 77 | + const coldResult = altitudeFromPressureDifference(101325, 89874, 0, 273.15); // 0°C |
| 78 | + const warmResult = altitudeFromPressureDifference(101325, 89874, 0, 303.15); // 30°C |
| 79 | + |
| 80 | + // Warmer air is less dense, so same pressure difference = larger altitude change |
| 81 | + expect(warmResult).toBeGreaterThan(coldResult); |
| 82 | + }); |
| 83 | +}); |
| 84 | + |
32 | 85 | describe('cloudBaseHeight', () => { |
33 | 86 | it('should calculate cloud base height at sea level', () => { |
34 | 87 | // Temperature: 293.15 K (20°C), Dew Point: 283.15 K (10°C) |
|
0 commit comments