@woosh/meep-engine
Version:
Pure JavaScript game engine. Fully featured and production ready.
146 lines (143 loc) • 4.46 kB
JavaScript
import {
ParameterLookupTable
} from "../../../../engine/graphics/particles/particular/engine/parameter/ParameterLookupTable.js";
/**
* Sea-salt aerosol (deliquesced brine) complex refractive index m = n + i k, wavelength in nm.
* Assumptions: maritime haze surrogate; aqueous brine droplet at ~300 K; morphology not modeled.
* Guidance/sources (composite, smoothed):
* - Refractive index of seawater/brine in visible n≈1.37–1.40 (dependent on salinity and wavelength).
* - Hale & Querry (1973) water bands for k behavior in IR; salt slightly perturbs n, k remains water-like.
* - Querry NaCl for dry-salt context; here we target deliquesced brine typical for haze.
* Notes:
* - Visible k is extremely small; we use tiny nonzero values for numerical stability.
* - MIR/LWIR follow water band structure but with slightly different n baseline.
* - Coverage: 200–20,000 nm; denser near 3 µm and 6–10 µm regions.
*/
const SEASALT_BRINE_REFRACTION_INDEX_LUT = ParameterLookupTable.from(
2, // [n, k]
[
// UV (short-wave)
1.4100, 2.0e-4, // 200 nm (strong UV absorption relative to visible)
1.4000, 6.0e-5, // 220 nm
1.3950, 2.0e-5, // 240 nm
1.3900, 8.0e-6, // 260 nm
1.3860, 3.0e-6, // 280 nm
1.3820, 1.2e-6, // 300 nm
1.3795, 8.0e-7, // 320 nm
1.3775, 5.0e-7, // 340 nm
1.3760, 3.0e-7, // 360 nm
1.3750, 2.0e-7, // 380 nm
// Visible (400–700 nm): n≈1.38–1.39, very small k
1.3745, 1.5e-7, // 400 nm
1.3738, 1.2e-7, // 450 nm
1.3730, 1.0e-7, // 500 nm
1.3725, 1.0e-7, // 550 nm
1.3720, 1.2e-7, // 600 nm
1.3718, 1.5e-7, // 650 nm
1.3715, 2.0e-7, // 700 nm
// NIR/SWIR (0.7–2.5 µm): weak absorption until ~970/1450/1940 nm bands
1.3712, 3.0e-7, // 750 nm
1.3710, 4.0e-7, // 800 nm
1.3705, 1.2e-6, // 900 nm
1.3700, 3.5e-6, // 950 nm
1.3695, 1.5e-5, // 970 nm
1.3690, 8.0e-6, // 1000 nm
1.3685, 3.0e-6, // 1064 nm
1.3678, 4.5e-5, // 1200 nm
1.3672, 1.8e-4, // 1300 nm
1.3660, 1.2e-3, // 1450 nm
1.3650, 2.0e-4, // 1550 nm
1.3640, 4.5e-4, // 1650 nm
1.3630, 1.8e-3, // 1750 nm
1.3610, 1.2e-2, // 1940 nm
1.3600, 6.0e-3, // 2000 nm
1.3580, 2.0e-3, // 2200 nm
1.3560, 9.0e-4, // 2400 nm
1.3550, 6.0e-4, // 2500 nm
// Mid-IR (2.5–5 µm) — OH stretch complex 2.9–3.2 µm
1.3520, 1.0e-2, // 2700 nm
1.3480, 8.0e-2, // 2900 nm
1.3460, 3.5e-1, // 3000 nm
1.3430, 9.0e-1, // 3100 nm
1.3400, 1.5e+0, // 3200 nm
1.3380, 1.2e+0, // 3300 nm
1.3350, 7.0e-1, // 3500 nm
1.3320, 3.5e-1, // 3700 nm
1.3290, 1.8e-1, // 4000 nm
1.3260, 9.0e-2, // 4500 nm
1.3240, 6.0e-2, // 5000 nm
// Long-wave IR (5–20 µm): elevated k due to vibrational modes
1.3200, 1.8e-1, // 6000 nm
1.3180, 3.5e-1, // 7000 nm
1.3160, 7.0e-1, // 8000 nm
1.3140, 9.0e-1, // 9000 nm
1.3125, 1.1e+0, // 10000 nm
1.3110, 9.0e-1, // 12000 nm
1.3095, 7.0e-1, // 15000 nm
1.3080, 5.5e-1, // 20000 nm
],
[
200,
220,
240,
260,
280,
300,
320,
340,
360,
380,
400,
450,
500,
550,
600,
650,
700,
750,
800,
900,
950,
970,
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
]
);
/**
* 🌊 Sea-salt (brine) — maritime haze surrogate
* @param {number[]} result complex number, refraction index
* @param {number} wavelength_nm in nanometers
*/
export function ri_brine(result, wavelength_nm) {
SEASALT_BRINE_REFRACTION_INDEX_LUT.sample(wavelength_nm, result);
}