Whitepaper v1.0.0 · March 2026 · Open Science

OPTIC-LENS

Optical Phenomena · Turbulence & Imaging · Light Environmental Nonlinearity System

A unified physics-computational framework for optical scattering anomalies and photon dynamics in heterogeneous atmospheric media — from first-principles Mie theory to real-time neural network inference.

Launch Dashboard pip install opticlens OSF Project
Scroll
5 Physical Regimes
0% Mie Error vs B&H 1983
50 Atmospheric Layers
10⁶ Photons / Ray Trace
CC BY 4.0 Open License

Five Coupled
Physical Regimes

Each module is derived from first principles, validated independently, and coupled through a common atmospheric state vector.

01
Mie Scattering Engine
opticlens.scattering.mie_v10

Exact Mie series solution for extinction efficiency Q_ext, phase function P(θ), and asymmetry parameter g for arbitrary size parameter x and complex refractive index m. Extended via T-matrix for non-spherical hexagonal ice crystals.

Q_ext = (2/x²) · Σₙ (2n+1) · Re[aₙ + bₙ]
02
Refractive Index
opticlens.refraction.edlen

Modified Edlén equation with humidity correction δn_water and CO₂ adjustment. Vertical gradient ∂n/∂z computation for ray bending radius and mirage displacement quantification over desert and tarmac surfaces.

n(P,T,λ) − 1 = [A + B/(C−λ⁻²)] · (P/T)
03
Turbulence & Scintillation
opticlens.turbulence.rytov

Kolmogorov-Obukhov structure function and Rytov log-amplitude variance model. Fried coherence length r₀ for adaptive optics scheduling at astronomical observatories and long-range imaging systems.

σ_χ² = 0.563 · k^(7/6) · ∫ Cₙ²(z) · z^(5/6) dz
04
Radiative Transfer
opticlens.transfer.disort

DISORT discrete ordinate solver for up to 50 atmospheric layers. Beer-Lambert-Bouguer direct beam transmittance with Ångström exponent parameterization. Multiple scattering treatment for τ > 0.3.

τ(λ) = β · (λ/λ₀)^(−α)
05
Physics-Informed NNs
opticlens.pinn.core

12-layer ResNet trained with composite physics + data + boundary condition loss. 50,000 collocation points. Real-time optical property interpolation between sparse sensor locations across the atmospheric domain.

L = λ_phys·L_phys + λ_data·L_data + λ_BC·L_BC
Ray-Tracing Engine
opticlens.ray.tracer

Volumetric 4th-order Runge-Kutta ray propagation through 3D refractive index fields. GPU-accelerated CUDA kernels reduce 10⁶ photon computation from ~20 minutes (CPU) to ~12 seconds (NVIDIA A100).

d(n · dr/ds)/ds = ∇n(r)

Observation to
Optical Output

Four observational pillars feed into a unified computational pipeline updated every 15 minutes synchronized with MODIS overpass times.

01
Hyperspectral Imaging
350–2500 nm · ≤3 nm resolution · DOAS spectral fitting
02
Lidar Profiling
532 & 1064 nm · 7.5 m vertical resolution · 20 km range
03
Satellite Products
MODIS · CALIPSO · AERONET Level 2.0
04
PINN Inference
Physics-constrained interpolation · 15-min update cycle
05
Optical Output
τ(λ) · Cₙ² · r₀ · δy · θ_halo · Dashboard

Production-Ready
Python API

mie_example.py
# Install from PyPI
# pip install opticlens

from opticlens.scattering.mie_v10 import Q_ext
from opticlens.turbulence.rytov import scintillation
from opticlens.refraction.edlen import refractive_index

# Mie extinction efficiency
x = 2.0   # size parameter
m = 1.5 + 0.01j   # complex RI
Q = Q_ext(x, m)
print(f"Q_ext = {Q:.4f}")  # 3.2100

# Rytov scintillation index
sigma2 = scintillation(
    Cn2=1e-14,
    wavelength=0.532e-6,
    path_length=5000
)
print(f"σ_χ² = {sigma2:.4e}")

# Edlén refractive index
n = refractive_index(
    P=101325,   # Pa
    T=293.15,   # K
    lam=0.55    # μm
)
print(f"n = {n:.8f}")
pinn_inference.py
from opticlens.pinn.core import AtmosphericPINN
import numpy as np

# Initialize PINN framework
model = AtmosphericPINN(
    layers=12,
    collocation_pts=50000,
    lambda_phys=1.0,
    lambda_data=1.0,
    lambda_bc=0.5
)

# Train on atmospheric state vector
state = {
    'P': np.array([101325]),
    'T': np.array([293.15]),
    'RH': np.array([45.0]),
    'wavelengths': np.array(
        [440, 675, 870, 1020]
    )
}

# Real-time optical property output
output = model.predict(state)
print(f"AOD τ(440) = {output['tau'][0]:.4f}")
print(f"Fried r₀   = {output['r0']:.3f} m")
print(f"Cn²(z)     = {output['Cn2']:.2e}")

Three-Tier
Validation Strategy

Independent validation across analytical benchmarks, field campaigns, and global satellite climatologies ensures physically complete accuracy.

Bohren & Huffman
Tier 1 · Analytical Benchmark

Mie code validated across size parameter 0.001 < x < 1000 and complex refractive indices spanning absorbing and non-absorbing particles.

Target: ε < 10⁻⁶ relative error
AERONET
Tier 2 · Field Campaign

15 globally distributed stations across marine, continental, urban, and dust regimes. Level 2.0 cloud-screened data at 440, 675, 870, 1020 nm.

Target: bias < 0.02 + 0.05τ
MODIS C6.1
Tier 3 · Satellite Climatology

Global aerosol optical depth compared against Dark Target and Deep Blue combined product over 12-month period, stratified by surface type.

Target: FEES ≥ 65% (maritime)
ARM SGP Site
Turbulence Validation

Lidar-derived Cn²(z) profiles compared against simultaneous sonic anemometer CT² measurements at three-axis, 20 Hz sampling rate.

Target: log-RMSE < 20%
CALIPSO L2
Lidar Profile Comparison

Version 4.2 aerosol profile product at 5 km horizontal resolution. Vertical resolution 60 m below 8.2 km for aerosol backscatter validation.

Target: profile bias < 10%
RAMI-V
Radiative Transfer Benchmark

DISORT solver benchmarked against Radiation Model Intercomparison test cases for homogeneous plane-parallel scattering atmospheres.

Target: radiance accuracy < 0.1%