Scattering Module Example

using vSmartMOM
using vSmartMOMYeah.Scattering
using Distributions
using BenchmarkTools

## 
## STEP 1: Create the Aerosol
## 

# Aerosol particle distribution and properties 
μ  = 0.3                # Log mean radius (μm)
σ  = 6.82               # Log stddev of radius (μm)
r_max = 30.0            # Maximum radius (μm)
nquad_radius = 2500     # Number of quadrature points for integrating of size dist.
nᵣ = 1.3                # Real part of refractive index
nᵢ = 0.0                # Imag part of refractive index

size_distribution = LogNormal(log(μ), log(σ))

# Create the aerosol
aero = Aerosol(size_distribution, nᵣ, nᵢ)

## 
## STEP 2: Create the Mie Calculations model
## 

λ = 0.55        # Incident wavelength (μm)
polarization_type = Stokes_IQUV()  
l_max = 10      # Trunction length for legendre terms
Δ_angle = 2     # Exclusion angle for forward peak (in fitting procedure) `[degrees]`
truncation_type = δBGE(l_max, Δ_angle)

# NAI2 Method
model_NAI2 = make_mie_model(NAI2(), aero, λ, polarization_type, truncation_type, r_max, nquad_radius)

# PCW Method with saved/loaded Wigner tables
wigner_file_path = "PATH_TO_SAVED_WIGNER_MATRIX"
model_PCW = make_mie_model(PCW(), aero, λ, polarization_type, truncation_type, r_max, nquad_radius, wigner_file_path)

# PCW Method with newly computed Wigner tables
wigner_A, wigner_B = compute_wigner_values(600) # Specify N_max
model_PCW_computed_wigner = make_mie_model(PCW(), aero, λ, polarization_type, truncation_type, wigner_A, wigner_B)

## 
## STEP 3: Perform the Mie Calculations
## 

aerosol_optics_NAI2 = compute_aerosol_optical_properties(model_NAI2);
aerosol_optics_PCW = compute_aerosol_optical_properties(model_PCW);

# To perform auto-differentiation w.r.t. μ, σ, nᵣ, nᵢ
aerosol_optics_NAI2_AD, derivs = compute_aerosol_optical_properties(model_NAI2, autodiff=true);

## 
## STEP 4: Obtain Scattering Matrix
## 

μ_quad, w_μ = gausslegendre(1000); # Quadrature points/weights
scattering_matrix = reconstruct_phase(aerosol_optics_NAI2.greek_coefs, μ_quad);