Skip to main content

Standalone Python implementation of the optimized 2S-ESS forward model.

Project description

py2sess

py2sess is a Python implementation of the optimized 2S-ESS radiative-transfer model. It supports solar and thermal forward calculations with NumPy and optional torch backends. It does not call the original Fortran code.

Install

python3 -m pip install py2sess

For local development:

python3 -m pip install -e ".[torch,dev]"

The optional native backend uses the installed PyTorch shared libraries. Install PyTorch first when building native wheels from source or when using a backend that needs torch tensors.

Build

py2sess uses CMake through scikit-build-core. By default, source builds prepare the Python package without compiling the optional native backend.

cmake -S . -B build
cmake --build build
python3 -m build

To build a local wheel with the native backend, install PyTorch and build without PEP 517 isolation so CMake can find Torch:

python3 -m pip install build scikit-build-core setuptools-scm torch
python3 -m build --wheel --no-isolation -Ccmake.define.PY2SESS_BUILD_NATIVE=ON

Native wheels link against the PyTorch shared libraries supplied by the installed torch package.

Quick Start

Solar:

import numpy as np
from py2sess import TwoStreamEss, TwoStreamEssOptions

solver = TwoStreamEss(TwoStreamEssOptions(nlyr=3, mode="solar"))
result = solver.forward(
    tau=np.full(3, 0.02),
    ssa=np.full(3, 0.2),
    g=np.full(3, 0.1),
    z=np.array([3.0, 2.0, 1.0, 0.0]),
    angles=[30.0, 20.0, 0.0],  # sza, vza, relative azimuth
    albedo=0.3,
)
print(result.radiance)

Thermal:

solver = TwoStreamEss(TwoStreamEssOptions(nlyr=3, mode="thermal"))
result = solver.forward(
    tau=np.full(3, 0.1),
    ssa=np.zeros(3),
    g=np.zeros(3),
    z=np.array([3.0, 2.0, 1.0, 0.0]),
    angles=20.0,
    planck=np.array([1.0, 1.1, 1.2, 1.3]),
    surface_planck=1.4,
    emissivity=1.0,
)

Batched wavelengths use leading dimensions:

solver = TwoStreamEss(TwoStreamEssOptions(nlyr=3, mode="thermal"))
tau = np.full((100, 3), 0.02)
result = solver.forward(
    tau=tau,
    ssa=np.zeros_like(tau),
    g=np.zeros_like(tau),
    z=np.array([3.0, 2.0, 1.0, 0.0]),
    angles=20.0,
    planck=np.ones((100, 4)),
    surface_planck=np.ones(100),
    emissivity=np.ones(100),
)
print(result.radiance.shape)  # (100,)

Level fluxes use the final axis for TOA-to-BOA levels. This clear absorbing solar case has an analytic Beer-Lambert flux solution:

import numpy as np
from py2sess import TwoStreamEss, TwoStreamEssOptions

sza = 30.0
mu0 = np.cos(np.deg2rad(sza))
fbeam = 1.0
tau = np.array([0.1, 0.2])
z = np.array([2.0, 1.0, 0.0])

solver = TwoStreamEss(
    TwoStreamEssOptions(
        nlyr=tau.size,
        mode="solar",
        plane_parallel=True,
        delta_scaling=False,
        downwelling=True,
        output_levels=True,
        output_fluxes=True,
        fo_flux_n_mu=8,
    )
)
result = solver.forward(
    tau=tau,
    ssa=np.zeros_like(tau),  # pure absorption
    g=np.zeros_like(tau),
    z=z,
    angles=[sza, 0.0, 0.0],
    fbeam=fbeam,
    albedo=0.0,  # black surface: no upward reflected flux
    delta_m_truncation_factor=np.zeros_like(tau),
    include_fo=True,
)

level_tau = np.concatenate(([0.0], np.cumsum(tau)))
analytic_down = fbeam * mu0 * np.exp(-level_tau / mu0)

np.testing.assert_allclose(result.flux_down[0], analytic_down, atol=1.0e-9)
np.testing.assert_allclose(result.flux_up[0], 0.0, atol=1.0e-8)
np.testing.assert_allclose(result.flux_net, result.flux_up - result.flux_down)

print(result.flux_down[0])

Torch CPU float64:

solver = TwoStreamEss(
    TwoStreamEssOptions(nlyr=3, mode="solar", backend="torch", torch_dtype="float64")
)

API Notes

Core inputs are tau, ssa, g, z, angles, and the surface/source terms needed by the selected mode. Solar angles are [sza, vza, raz] in degrees; thermal angles are viewing zenith angles. Heights are in km, ordered top to bottom.

See docs/api_arguments.md for the full argument table and conventions. Level-flux conventions are summarized in docs/level_fluxes.md.

Examples

python3 examples/level_flux_beer_lambert.py
python3 examples/build_thermal_source_from_temperature.py
python3 examples/retrieve_synthetic_spectra.py --case uv --noise-level 0

Scene/profile runs:

from py2sess.scene import load_scene

scene = load_scene(profile="profile.txt", config="scene.yaml")
result = scene.forward(backend="numpy", include_fo=True)

Full-spectrum benchmark details are in docs/full_spectrum_benchmarks.md.

Tests

python3 -m unittest discover -s tests -v
python3 -m ruff check .
python3 -m ruff format --check .

Full-spectrum benchmarks use profile text plus scene YAML inputs and Python optical preprocessing. Keep large local cross-section tables, benchmark bundles, and generated outputs out of git.

References

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

py2sess-1.0.0.tar.gz (13.3 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

py2sess-1.0.0-cp313-cp313-manylinux_2_27_x86_64.whl (11.3 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.27+ x86-64

py2sess-1.0.0-cp313-cp313-macosx_15_0_arm64.whl (826.2 kB view details)

Uploaded CPython 3.13macOS 15.0+ ARM64

py2sess-1.0.0-cp312-cp312-manylinux_2_27_x86_64.whl (11.3 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.27+ x86-64

py2sess-1.0.0-cp312-cp312-macosx_15_0_arm64.whl (832.5 kB view details)

Uploaded CPython 3.12macOS 15.0+ ARM64

py2sess-1.0.0-cp311-cp311-manylinux_2_27_x86_64.whl (11.3 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.27+ x86-64

py2sess-1.0.0-cp311-cp311-macosx_15_0_arm64.whl (825.5 kB view details)

Uploaded CPython 3.11macOS 15.0+ ARM64

py2sess-1.0.0-cp310-cp310-manylinux_2_27_x86_64.whl (11.3 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.27+ x86-64

py2sess-1.0.0-cp310-cp310-macosx_15_0_arm64.whl (824.2 kB view details)

Uploaded CPython 3.10macOS 15.0+ ARM64

File details

Details for the file py2sess-1.0.0.tar.gz.

File metadata

  • Download URL: py2sess-1.0.0.tar.gz
  • Upload date:
  • Size: 13.3 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for py2sess-1.0.0.tar.gz
Algorithm Hash digest
SHA256 f79e34d92fc70558a0e8f867ea9ebcdda1a5ce3a55ec7ca8d34d6b3cd9114fe7
MD5 4e4ff5c2ddba728bd868de0fd828c47b
BLAKE2b-256 c2326b56975853abcda5902a3b0215692f552c446919dc2472c43e9b722213ee

See more details on using hashes here.

Provenance

The following attestation bundles were made for py2sess-1.0.0.tar.gz:

Publisher: release.yml on happysky19/py2sess

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file py2sess-1.0.0-cp313-cp313-manylinux_2_27_x86_64.whl.

File metadata

File hashes

Hashes for py2sess-1.0.0-cp313-cp313-manylinux_2_27_x86_64.whl
Algorithm Hash digest
SHA256 95f418cbf6e094379909be8088160f3812c7aa1e98acfd5dc7b8a5a26ff6973a
MD5 adb775805a18fb0716b89001227f040f
BLAKE2b-256 49bf26e7c048a25f125775bf84b447f1b6c671f036705e43eb22f05eecb2e9c5

See more details on using hashes here.

Provenance

The following attestation bundles were made for py2sess-1.0.0-cp313-cp313-manylinux_2_27_x86_64.whl:

Publisher: release.yml on happysky19/py2sess

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file py2sess-1.0.0-cp313-cp313-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for py2sess-1.0.0-cp313-cp313-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 0cdec79c9772f70c18687c3bb64b9b8f125a7f39b23ba34d46eab32e81695d6d
MD5 7c75d95e6c2dbacb0679787d163b524a
BLAKE2b-256 69c72017c49f7deecfcfa0a118fe169ad456f583d0c4b0c930a4674f5f527121

See more details on using hashes here.

Provenance

The following attestation bundles were made for py2sess-1.0.0-cp313-cp313-macosx_15_0_arm64.whl:

Publisher: release.yml on happysky19/py2sess

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file py2sess-1.0.0-cp312-cp312-manylinux_2_27_x86_64.whl.

File metadata

File hashes

Hashes for py2sess-1.0.0-cp312-cp312-manylinux_2_27_x86_64.whl
Algorithm Hash digest
SHA256 d0714626cd49cbc488780a338a8b8a750cdd4fdb2e29d382cedd1be03ba69163
MD5 fce4e2ab38142fbde03c78f7bd465346
BLAKE2b-256 d848c4c4931ef43aa92873ec507be8296e588f88f1fe3427132d0bc4dfa3fb0f

See more details on using hashes here.

Provenance

The following attestation bundles were made for py2sess-1.0.0-cp312-cp312-manylinux_2_27_x86_64.whl:

Publisher: release.yml on happysky19/py2sess

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file py2sess-1.0.0-cp312-cp312-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for py2sess-1.0.0-cp312-cp312-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 c6dca613c0a97426e1bc5f3148b69981d58f39c0f77060514598d1b4c32b1fa5
MD5 89c6ba37d2b46bc23872f13586d201a8
BLAKE2b-256 429ba8dc7b3ac99ad87f02a3faa98aa894651a5b4e83d94b4e2cdc180b8715bb

See more details on using hashes here.

Provenance

The following attestation bundles were made for py2sess-1.0.0-cp312-cp312-macosx_15_0_arm64.whl:

Publisher: release.yml on happysky19/py2sess

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file py2sess-1.0.0-cp311-cp311-manylinux_2_27_x86_64.whl.

File metadata

File hashes

Hashes for py2sess-1.0.0-cp311-cp311-manylinux_2_27_x86_64.whl
Algorithm Hash digest
SHA256 e0cf0fd221a52bc02ba5b4277b40d32cf4a1eb1251e7a1af26d071203ad2381b
MD5 a7ea442de9394796821d85a2340b782b
BLAKE2b-256 53943d10d0f5bbef4530117bfe1fdba54fecec259501db2a32886764dadc40d6

See more details on using hashes here.

Provenance

The following attestation bundles were made for py2sess-1.0.0-cp311-cp311-manylinux_2_27_x86_64.whl:

Publisher: release.yml on happysky19/py2sess

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file py2sess-1.0.0-cp311-cp311-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for py2sess-1.0.0-cp311-cp311-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 10f18f32baa3040c1f71954e1f7a83247efa42e43ee12a7c4ddaa8172e990e7d
MD5 f4d3965e74a9b24e7b75de8acd2f4b91
BLAKE2b-256 9102d5db9c387719e2ad99058972890b9c0e3efadf56c02ca52c8a1d133f9010

See more details on using hashes here.

Provenance

The following attestation bundles were made for py2sess-1.0.0-cp311-cp311-macosx_15_0_arm64.whl:

Publisher: release.yml on happysky19/py2sess

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file py2sess-1.0.0-cp310-cp310-manylinux_2_27_x86_64.whl.

File metadata

File hashes

Hashes for py2sess-1.0.0-cp310-cp310-manylinux_2_27_x86_64.whl
Algorithm Hash digest
SHA256 0a7f13fc54ea4ade5e1fad54f0802ce1810d7af3c23abb9ce5fd214038431193
MD5 0811d1a88b609f844f67eb851ef25f4c
BLAKE2b-256 9a07f4889e7bb94292c2a82691f4f551d2e944674e603ffe9cf713ec5c7e03ac

See more details on using hashes here.

Provenance

The following attestation bundles were made for py2sess-1.0.0-cp310-cp310-manylinux_2_27_x86_64.whl:

Publisher: release.yml on happysky19/py2sess

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file py2sess-1.0.0-cp310-cp310-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for py2sess-1.0.0-cp310-cp310-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 55b6dff334da8a8a26fa92380a8d610ce93ab2fdd38df722afe0c11118256b1a
MD5 84b39bc4d55d962ac9e2b8c154c61c91
BLAKE2b-256 4bd271af583d6271694ef027a17f86cdf4f7adfe46da650ea1cd77777b5f2348

See more details on using hashes here.

Provenance

The following attestation bundles were made for py2sess-1.0.0-cp310-cp310-macosx_15_0_arm64.whl:

Publisher: release.yml on happysky19/py2sess

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page