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 .
python3 -m pip install -e ".[torch,dev]"

The optional native backend requires PyTorch:

python3 -m pip install "py2sess[native]"

For source-tree runs without installation, set PYTHONPATH=src.

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.

Releases are tagged from merged PRs by GitHub Actions. Add a release:major, release:minor, or release:patch label to the PR before merging; the default is release:patch.

PyPI publication uses Trusted Publishing. Configure PyPI to trust happysky19/py2sess, workflow .github/workflows/release.yml, and the pypi GitHub environment, then run the Publish to PyPI GitHub Actions workflow for the tag. The release workflow currently publishes macOS arm64 native wheels and the source distribution.

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-0.4.4.tar.gz (13.4 MB view details)

Uploaded Source

Built Distributions

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

py2sess-0.4.4-cp313-cp313-manylinux_2_27_x86_64.whl (11.9 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.27+ x86-64

py2sess-0.4.4-cp313-cp313-macosx_15_0_arm64.whl (817.0 kB view details)

Uploaded CPython 3.13macOS 15.0+ ARM64

py2sess-0.4.4-cp312-cp312-manylinux_2_27_x86_64.whl (11.9 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.27+ x86-64

py2sess-0.4.4-cp312-cp312-macosx_15_0_arm64.whl (816.9 kB view details)

Uploaded CPython 3.12macOS 15.0+ ARM64

py2sess-0.4.4-cp311-cp311-manylinux_2_27_x86_64.whl (11.9 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.27+ x86-64

py2sess-0.4.4-cp311-cp311-macosx_15_0_arm64.whl (816.3 kB view details)

Uploaded CPython 3.11macOS 15.0+ ARM64

py2sess-0.4.4-cp310-cp310-manylinux_2_27_x86_64.whl (11.9 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.27+ x86-64

py2sess-0.4.4-cp310-cp310-macosx_15_0_arm64.whl (815.0 kB view details)

Uploaded CPython 3.10macOS 15.0+ ARM64

File details

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

File metadata

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

File hashes

Hashes for py2sess-0.4.4.tar.gz
Algorithm Hash digest
SHA256 3ecbca0774eb11c4fc3af9c8cba377007fbdb582eb193dc806066c0f4e314cf1
MD5 9ce03493689d6cc5ad1f27f1ada6d1af
BLAKE2b-256 901db5ae0da93a6b57b9c4ae16968e4adf0db1a35e84472cedbd24ecd007712e

See more details on using hashes here.

Provenance

The following attestation bundles were made for py2sess-0.4.4.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-0.4.4-cp313-cp313-manylinux_2_27_x86_64.whl.

File metadata

File hashes

Hashes for py2sess-0.4.4-cp313-cp313-manylinux_2_27_x86_64.whl
Algorithm Hash digest
SHA256 9f52e64d3af0c59e7717b6f92e056df8cb2002a6deae83603253f24b2be3b675
MD5 f3e873abc2b6c73d5e4363b56f1cf145
BLAKE2b-256 af061b1ec6c7ad366bbdd847c72620308e14f30afbf08514ed7cb4dd6b1efcac

See more details on using hashes here.

Provenance

The following attestation bundles were made for py2sess-0.4.4-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-0.4.4-cp313-cp313-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for py2sess-0.4.4-cp313-cp313-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 d087d5fa4adc67642600d3f65db25c68147251b045bb096584de2c2fb91f804c
MD5 d7f1b34be6b16af98ee597cf93d6edc4
BLAKE2b-256 034cd0be17758fd93e590a5ca5f93d3ecb816589b31c387f1de1fd2a94d24125

See more details on using hashes here.

Provenance

The following attestation bundles were made for py2sess-0.4.4-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-0.4.4-cp312-cp312-manylinux_2_27_x86_64.whl.

File metadata

File hashes

Hashes for py2sess-0.4.4-cp312-cp312-manylinux_2_27_x86_64.whl
Algorithm Hash digest
SHA256 1c456417802328b26b150e5a035722e04d209971e70a51f01c32ca9bb30be803
MD5 b989052e900d4f9a764c735e727610df
BLAKE2b-256 9b93788f132656f5210c2353a3beec600337a267189c9f85be99cc8b49a70aec

See more details on using hashes here.

Provenance

The following attestation bundles were made for py2sess-0.4.4-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-0.4.4-cp312-cp312-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for py2sess-0.4.4-cp312-cp312-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 acb93205d4178e4e6a65e6703ce7cc897e39049225449b2263e933220421099a
MD5 a48bfe6b679860aa321b4b04db4ff0c0
BLAKE2b-256 8572c92e479bebda10a88df12bb6bd10e6d52450e79654890d20a560bdccf853

See more details on using hashes here.

Provenance

The following attestation bundles were made for py2sess-0.4.4-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-0.4.4-cp311-cp311-manylinux_2_27_x86_64.whl.

File metadata

File hashes

Hashes for py2sess-0.4.4-cp311-cp311-manylinux_2_27_x86_64.whl
Algorithm Hash digest
SHA256 8290df90d92671b414cc52eebeb4edab27650838cc70f647bb9f4b5068e803e3
MD5 65761c37e3abedc3097abe1384ed4ac8
BLAKE2b-256 e5b2dc739d9c096f3049e8390568d78cb98abf004035b86a0f30fc9c0a2c711a

See more details on using hashes here.

Provenance

The following attestation bundles were made for py2sess-0.4.4-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-0.4.4-cp311-cp311-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for py2sess-0.4.4-cp311-cp311-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 2435d32797e680c3a951524c6687dd423dcab19f2eca987627ca11cb29c630ec
MD5 2d807e20d1a37acd9945c29236216e4f
BLAKE2b-256 1ab94535791a1828b0a65d521a9d6bca0dfe879b443790b11c0ba1c0d9bdf5c5

See more details on using hashes here.

Provenance

The following attestation bundles were made for py2sess-0.4.4-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-0.4.4-cp310-cp310-manylinux_2_27_x86_64.whl.

File metadata

File hashes

Hashes for py2sess-0.4.4-cp310-cp310-manylinux_2_27_x86_64.whl
Algorithm Hash digest
SHA256 33e78f0333b91f0ed0b135513070f390a78dba0f51ef9b5252ccae2eaeaa4520
MD5 fc5970856a44125285149b540bfda59f
BLAKE2b-256 71d44a9f2ff9152c8e225c213c1c5cfe94f0bd2a504f4db52559bdcd3116a3d4

See more details on using hashes here.

Provenance

The following attestation bundles were made for py2sess-0.4.4-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-0.4.4-cp310-cp310-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for py2sess-0.4.4-cp310-cp310-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 675d0bd4f31614253d916df812b55398b4d67fa590939d8cc932cb7beee314aa
MD5 b06ab90c0228fa232762e23e2279a549
BLAKE2b-256 9648a41f27c2aaf2e8873ec70b2f44b1ebcfbe87b2eccfbc3fa7620463fa631a

See more details on using hashes here.

Provenance

The following attestation bundles were made for py2sess-0.4.4-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