Aerosol3D
Aerosol3D is a Python toolkit for modeling the 3D geometry and optical properties of atmospheric aerosol particles. It provides a unified pipeline from geometric construction to Discrete Dipole Approximation (DDA) optical computation.
Features
- 3D Geometry Modeling — Build spheres, ellipsoids, cubes, and import fractal aggregates
- Coating Algorithms — Apply distance-based, potential-based, CCM (Closed-Cell Model), and CAM (Coated-Aggregate Model) coatings
- Optical Computation — Solve optical properties via DDA with LDR polarizability (Draine & Goodman 1993) and 4 precision levels, or Mie theory (PyMieScatt, near-instant for spheres)
- Parallel Orientation Averaging — Distribute DDA orientation averaging across CPU cores via joblib, with tqdm progress bars and error-tolerant execution
- Effective Medium Approximation — Three EMA methods (volume-weighted, Maxwell-Garnett, Bruggeman) for computing effective refractive indices of mixed-composition particles
- Core-Shell Mie Solver — Exact Mie solution for coated spheres using PyMieScatt's layered-sphere API
- Optical Property Export — Multi-wavelength
AerosolOpticsDatacontainer with auto-computed Legendre moments and NetCDF I/O - Optical Visualization — Spectral properties, phase function comparison, Legendre convergence diagnostics, and comparison summary plots
- 3D Visualization — Generate screenshots and rotation videos using PyVista
- Material Database — Built-in refractive index data for common aerosol materials
- Flexible I/O — Export to VTP and voxel formats
Installation
Requires Python >= 3.10.
pip install Aerosol3D
For development:
git clone https://github.com/openEarthModelling/Aerosol3D.git
cd Aerosol3D
pip install -e ".[dev]"
Optional Dependencies
- Julia backend (required for DDA optical computation): Install Julia and run
pip install pyjulia - GPU acceleration: Requires CUDA-capable GPU and Julia CUDA packages
Quick Start
from Aerosol3D import (
AerosolParticle, create_sphere, MixingState,
preset_material, save_screenshot, solve_optics, SimulationConfig
)
# Create a black carbon sphere
soot = preset_material("black_carbon")
particle = AerosolParticle(
name="bc_sphere",
mixing_state=MixingState.INTERNAL,
unit="nm",
)
particle.add_mesh("core", create_sphere((0, 0, 0), 50.0), soot)
# 3D visualization
save_screenshot(particle, "sphere.png", colors={"core": "black"})
# Optical computation (Mie or DDA)
config = SimulationConfig(wavelength=550.0, source="solar")
result = solve_optics(particle, config, solver="MIE")
print(f"Extinction efficiency: {result.qext}")
Export multi-wavelength results and visualize:
from Aerosol3D.optics import from_optical_results
results = [solve_optics(particle, SimulationConfig(wavelength=w), solver="MIE")
for w in [450, 550, 650]]
data = from_optical_results(results, n_legendre=32)
data.to_netcdf("optics.nc")
See the examples/ directory for complete workflows including fractal aggregates, coated particles, and DDA-Mie comparison pipelines.
Examples
| Example | Description |
|---|---|
black_carbon_sphere.py |
Bare BC sphere with DDA optics |
black_carbon_fractal.py |
Fractal aggregate via pyFracAggregate with full pipeline |
coated_fractal_aggregate.py |
Coated fractal aggregate comparing four Mie approximations (volume-weighted, MG, Bruggeman, core-shell) |
validate_mie_vs_dda.py |
Multi-precision DDA vs Mie validation with LDR convergence analysis |
dda_mie_pyradtran_pipeline/ |
3-stage DDA/Mie optics + DISORT radiative transfer pipeline |
API Overview
Core Classes
AerosolParticle— Particle container with multiple meshes/materialsMixingState— Internal / external mixing stateMaterial— Refractive index and densityFractalAggregate— Fractal aggregate geometry
Geometry
create_sphere(center, radius)create_ellipsoid(center, radii)create_cube(center, size)
Coating
apply_distance_coating(particle, thickness, material)apply_potential_coating(particle, thickness, material)apply_ccm_coating(particle, thickness, material)apply_cam_coating(particle, thickness, material)
Optics
solve_optics(particle, config, solver="DDA"|"MIE"|"MIE_CORESHELL", orientational_average=False, n_dirs=50, n_jobs=32, show_progress=True)— Optical solver dispatch with LDR polarizability (DDA) and optional parallel orientation averagingSimulationConfig(wavelength, source, precision="medium")— Simulation parameters;precisioncontrols DDA dipole spacing (low/medium/high/ultra)AerosolOpticsData/from_optical_results(results, n_legendre)— Multi-wavelength optical property containercompute_legendre_moments(phase_function, theta)— Legendre expansion of scattering phase function
Effective Medium Approximation
volume_weighted(volumes, refractive_indices)— Linear volume-weighted mixingmaxwell_garnett(volumes, refractive_indices)— Maxwell-Garnett mixing rulebruggeman(volumes, refractive_indices)— Bruggeman symmetric mixing rule
Core-Shell Optics
solve_mie_coreshell(particle, config)— Core-shell Mie solver for coated spheresParticle.coreshell_geometry— Compute core-shell geometry from particle composition
Optical Visualization
plot_spectral_properties(data)— Extinction/scattering/absorption spectraplot_phase_function(data)— Phase function P11 vs scattering angleplot_optical_comparison(data1, data2)— Side-by-side comparison of two datasetsplot_phase_function_comparison(data1, data2)— Phase function comparison with relative differenceplot_legendre_convergence(data)— Legendre moment convergence diagnostics
I/O & Visualization
save_screenshot(particle, path)save_rotation_video(particle, path)save_vtp(particle, path)/save_voxel(particle, path)
Development
# Run tests
pytest
# Run tests with coverage
pytest --cov=Aerosol3D --cov-report=term-missing
License
MIT License. See LICENSE for details.
Acknowledgments
DDA optical computation is powered by CEMD.jl via a Python-Julia bridge.
Metadata
Release files for Aerosol3D 0.9.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| aerosol3d-0.9.0.tar.gz | 85.5 kB | Without provenance | Details for aerosol3d-0.9.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| aerosol3d-0.9.0-py3-none-any.whl | Python 3 | none | any | Details for aerosol3d-0.9.0-py3-none-any.whl |
Total release size: 156.3 kB
Release files / aerosol3d-0.9.0.tar.gz
| Download URL | aerosol3d-0.9.0.tar.gz |
|---|---|
| Size | 85.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
3e84685762ac1929aab191b4a73bc4b968c4b5578b09881ccb679231e6e28f82
|
|
BLAKE2b-256 checksum How to use checksums |
e4b47a9d81ad9510cd4a316ff5ccd98bb58cf1fdaac252b6340e79a1c4ce95f8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.10.20
|
Release files / aerosol3d-0.9.0-py3-none-any.whl
| Download URL | aerosol3d-0.9.0-py3-none-any.whl |
|---|---|
| Size | 70.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
1c6b6026e011490e0c5f5d6f5bf1a4ade9ba11c69cba4efc3aea07c2baf3ce60
|
|
BLAKE2b-256 checksum How to use checksums |
fdd206566e55103c18d3be6921cbe0a45c3063ff997912d985b249c7420b36f9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.10.20
|
Security for Aerosol3D 0.9.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.