@woosh/meep-engine
Version:
Pure JavaScript game engine. Fully featured and production ready.
141 lines (138 loc) • 4.38 kB
JavaScript
import {
ParameterLookupTable
} from "../../../../engine/graphics/particles/particular/engine/parameter/ParameterLookupTable.js";
/**
* Ammonium sulfate aerosol ("(NH4)2SO4") complex refractive index m = n + i k, wavelength in nm.
* Assumptions: dry crystalline aerosol surrogate for continental haze; ~300 K; morphology not modeled.
* Guidance/sources (composite, smoothed for Mie with linear interpolation):
* - Toon, Pollack & Khare (1976); d'Almeida et al. (1991); Hess et al. (1998, OPAC) — visible/NIR anchors (n≈1.52, k≈0).
* - Palmer & Williams (1975) optical constants compendium; Querry (1985/1991) — UV and MIR/LWIR band behavior.
* Notes:
* - In the visible, k is extremely small (≈1e-6–1e-5). We use small nonzero values to avoid divide-by-zero corner cases.
* - MIR bands associated with sulfate and ammonium groups raise k around ~3 µm (weak) and ~7–10 µm (stronger).
* - Coverage: 200–20,000 nm; denser sampling near MIR bands.
*/
const AMMONIUM_SULFATE_REFRACTION_INDEX_LUT = ParameterLookupTable.from(
2, // [n, k]
[
// UV (short-wave) — increasing absorption
1.560, 2.0e-2, // 200 nm
1.550, 8.0e-3, // 220 nm
1.545, 3.5e-3, // 240 nm
1.540, 1.5e-3, // 260 nm
1.535, 8.0e-4, // 280 nm
1.532, 3.5e-4, // 300 nm
1.530, 2.0e-4, // 320 nm
1.528, 1.2e-4, // 340 nm
1.5265, 8.0e-5, // 360 nm
1.5255, 6.0e-5, // 380 nm
// Visible (very low absorption; n≈1.52)
1.5250, 5.0e-5, // 400 nm
1.5245, 3.0e-5, // 450 nm
1.5240, 2.0e-5, // 500 nm
1.5235, 2.0e-5, // 550 nm
1.5230, 2.0e-5, // 600 nm
1.5225, 2.0e-5, // 650 nm
1.5220, 2.0e-5, // 700 nm
// NIR/SWIR (0.7–2.5 µm): still tiny k; slight dispersion in n
1.5218, 2.0e-5, // 750 nm
1.5215, 2.0e-5, // 800 nm
1.5210, 3.0e-5, // 900 nm
1.5205, 4.0e-5, // 1000 nm
1.5200, 4.5e-5, // 1064 nm
1.5195, 6.0e-5, // 1200 nm
1.5190, 8.0e-5, // 1300 nm
1.5185, 1.6e-4, // 1450 nm
1.5180, 1.3e-4, // 1550 nm
1.5178, 1.2e-4, // 1650 nm
1.5175, 1.2e-4, // 1750 nm
1.5172, 1.8e-4, // 1940 nm
1.5170, 1.8e-4, // 2000 nm
1.5165, 2.2e-4, // 2200 nm
1.5160, 2.8e-4, // 2400 nm
1.5158, 3.0e-4, // 2500 nm
// Mid-IR (2.7–5 µm): weak-to-moderate absorption near 3 µm
1.5155, 6.0e-4, // 2700 nm
1.5150, 1.5e-3, // 2900 nm
1.5145, 3.5e-3, // 3000 nm
1.5140, 5.0e-3, // 3100 nm
1.5135, 6.0e-3, // 3200 nm
1.5130, 6.5e-3, // 3300 nm
1.5125, 6.0e-3, // 3500 nm
1.5120, 4.0e-3, // 3700 nm
1.5115, 2.5e-3, // 4000 nm
1.5110, 1.6e-3, // 4500 nm
1.5105, 1.2e-3, // 5000 nm
// Long-wave IR (5–20 µm): strong sulfate bands ~7–10 µm
1.5100, 4.0e-3, // 6000 nm
1.5100, 8.0e-3, // 7000 nm
1.5105, 1.8e-2, // 8000 nm
1.5110, 3.5e-2, // 9000 nm
1.5120, 5.5e-2, // 10000 nm (10 µm)
1.5140, 3.5e-2, // 12000 nm
1.5160, 1.5e-2, // 15000 nm
1.5180, 8.0e-3, // 20000 nm
],
[
200,
220,
240,
260,
280,
300,
320,
340,
360,
380,
400,
450,
500,
550,
600,
650,
700,
750,
800,
900,
1000,
1064,
1200,
1300,
1450,
1550,
1650,
1750,
1940,
2000,
2200,
2400,
2500,
2700,
2900,
3000,
3100,
3200,
3300,
3500,
3700,
4000,
4500,
5000,
6000,
7000,
8000,
9000,
10000,
12000,
15000,
20000
]
);
/**
* 🌫️ Ammonium sulfate (continental haze surrogate)
* @param {number[]} result complex number, refraction index
* @param {number} wavelength_nm in nanometers
*/
export function ri_ammonium_sulfate(result, wavelength_nm) {
AMMONIUM_SULFATE_REFRACTION_INDEX_LUT.sample(wavelength_nm, result);
}