feff10-rs
Python bindings for FEFF10, a real-space multiple-scattering code for ab initio calculations of X-ray absorption spectra (EXAFS, XANES) and related properties.
Built with PyO3 and maturin for native performance with a Pythonic API.
Installation
pip install feff10-rs
No compiler needed — prebuilt wheels are available for:
| Platform | Architecture | Python |
|---|---|---|
| Linux | x86_64, aarch64 | 3.9 – 3.14+ |
| macOS | Intel, Apple Silicon | 3.9 – 3.14+ |
| Windows | x86_64 | 3.9 – 3.14+ |
Linux ARM64 wheels require glibc 2.39 or newer (for example, Ubuntu 24.04), matching the native release archive's runtime baseline.
Calculations run each FEFF stage in a fresh Python worker process using the current
interpreter. This isolates Fortran state and fatal errors on every platform,
including Windows and macOS GUI/notebook hosts. The installed feff10 package
must be importable by sys.executable; no worker setup is required in user code.
Quick Start
import feff10
# One-liner: parse, validate, and run
result = feff10.run("feff.inp", "./work")
print(f"Done in {result.total_duration_secs:.1f}s")
# Parse and compare output
xmu = feff10.FeffTable.from_file("./work/xmu.dat")
reference = feff10.FeffTable.from_file("reference_xmu.dat")
rsq = xmu.r_squared(reference, col_x=0, col_y=3)
print(f"R-squared = {rsq*100:.4f}%")
You can also pass raw feff.inp text or a FeffInput object:
# From raw text
result = feff10.run(open("feff.inp").read(), "./work")
# From a FeffInput object
inp = feff10.FeffInput.from_file("feff.inp")
inp.s02 = 0.9
result = feff10.run(inp, "./work")
Working with Input Files
Parsing
# From file
inp = feff10.FeffInput.from_file("feff.inp")
# From string
inp = feff10.FeffInput.parse(content)
# Strict mode — raises FeffParseError on malformed input
inp = feff10.FeffInput.from_file_strict("feff.inp")
Inspecting
inp.edge # "K", "L3", etc.
inp.s02 # amplitude reduction factor
inp.num_atoms # number of atoms
inp.num_potentials # number of unique potentials
inp.control # CONTROL flags (6-element list)
inp.other_cards # other cards (EXAFS, RPATH, etc.)
for pot in inp.potentials:
print(f"ipot={pot.ipot}, Z={pot.z}, tag={pot.tag}")
for atom in inp.atoms:
print(f"({atom.x}, {atom.y}, {atom.z}) ipot={atom.ipot}")
Creating from Scratch
inp = feff10.FeffInput(
title=["Cu K-edge EXAFS"],
edge="K",
s02=1.0,
potentials=[
feff10.Potential(ipot=0, z=29, tag="Cu"),
feff10.Potential(ipot=1, z=29, tag="Cu"),
],
atoms=[
feff10.Atom(x=0.0, y=0.0, z=0.0, ipot=0, tag="Cu"),
feff10.Atom(x=0.0, y=1.805, z=1.805, ipot=1, tag="Cu"),
],
other_cards=["EXAFS 20.0", "RPATH 5.5"],
)
Modifying and Writing
inp.edge = "L3"
inp.s02 = 0.85
inp.control = [1, 1, 1, 1, 0, 0]
inp.write_to_file("modified.inp")
Validation
# Validate without running (raises FeffConfigError if invalid)
feff10.validate("feff.inp")
# Or validate a FeffInput object
inp = feff10.FeffInput.from_file("feff.inp")
inp.validate()
Checks: absorber potential (ipot=0) exists, atoms reference valid potentials, no duplicate ipot values, atomic numbers in range, and more.
Running Calculations
Simple (Recommended)
# From file path — validates input automatically
result = feff10.run("feff.inp", "./work")
# From FeffInput object
result = feff10.run(inp, "./work")
Full Control
config = feff10.FeffConfig("./work", inp)
result = feff10.FeffPipeline(config).run()
for sr in result.stages:
print(f"{sr.stage.executable_name}: {sr.duration_secs:.3f}s")
print(f"Total: {result.total_duration_secs:.3f}s")
Running Specific Stages
config = feff10.FeffConfig(
"./work", inp,
stages=[feff10.Stage.RDINP, feff10.Stage.POT, feff10.Stage.XSPH],
)
Progress Callbacks
def on_progress(stage, progress):
if progress.kind == "starting":
print(f" Running {stage.executable_name}...", end="", flush=True)
else:
print(f" done ({progress.duration_secs:.2f}s)")
result = feff10.FeffPipeline(config).run_with_progress(on_progress)
Pipeline Stages
FEFF10 has 18 stages, each a separate computational step:
for stage in feff10.Stage.all():
print(f"{stage.executable_name} (control index {stage.control_index})")
Parsing Output
Reading xmu.dat
result = feff10.run("feff.inp", "./work")
xmu = result.read_xmu() # convenience on PipelineResult
outputs = result.outputs() # discover all *.dat outputs
print(xmu.ncols) # number of columns
print(xmu.nrows) # number of data points
print(xmu.header) # comment lines from file header
print(xmu) # shows first 5 rows
print(len(outputs.files))
Discovering and parsing multiple outputs
outputs = feff10.FeffOutputs.discover("./work")
for f in outputs.files:
print(f.kind, f.name)
chi = outputs.read_chi()
paths = outputs.read_paths()
print(paths.npaths, paths.total_degeneracy())
Accessing Columns
energy = xmu.column(0) # or xmu[0]
mu = xmu.column(3) # or xmu[3]
last = xmu[-1] # negative indexing
for col in xmu: # iterate over columns
print(f"{len(col)} points")
Comparing Spectra
calculated = feff10.FeffTable.from_file("./work/xmu.dat")
reference = feff10.FeffTable.from_file("reference_xmu.dat")
rsq = calculated.r_squared(reference, col_x=0, col_y=3)
print(f"R-squared = {rsq*100:.4f}%") # lower is better
Pandas Integration
pip install 'feff10-rs[pandas]'
df = xmu.to_dataframe()
print(df.describe())
Error Handling
try:
result = feff10.FeffPipeline(config).run()
except feff10.FeffPipelineError as e:
print(f"Pipeline failed: {e}")
except feff10.FeffConfigError as e:
print(f"Configuration error: {e}")
except feff10.FeffParseError as e:
print(f"Parse error: {e}")
except feff10.FeffIOError as e:
print(f"I/O error: {e}")
Exception hierarchy:
FeffError— base exceptionFeffIOError— file I/O errorsFeffParseError— input/output parsing errorsFeffPipelineError— pipeline execution errorsFeffConfigError— configuration validation errors
GIL Behavior
Both run() and run_with_progress() release the Python GIL during FEFF stage execution, allowing other Python threads to run concurrently.
API Summary
| Function / Class | Description |
|---|---|
run(input, work_dir) |
Run a FEFF calculation (accepts file path, raw text, or FeffInput) |
validate(input) |
Validate input without running (accepts file path, raw text, or FeffInput) |
FeffInput |
Parse, create, modify, and write feff.inp files |
Potential |
Scattering potential (ipot, Z, tag, l_scmt, l_fms, stoich) |
Atom |
Atomic position (x, y, z, ipot, tag, distance) |
FeffConfig |
Calculation configuration (work_dir, input, stages, timeout) |
Stage |
Pipeline stage enum (18 stages: RDINP through RHORRP) |
FeffPipeline |
Execute FEFF calculations with optional progress callbacks |
PipelineResult |
Execution results (stages, work_dir, total_duration_secs) |
StageResult |
Per-stage timing (stage, duration_secs) |
StageProgress |
Progress callback data (kind, duration_secs) |
FeffTable |
Parse xmu.dat output with column access and pandas integration |
PathsDat |
Parse structured paths.dat path-expansion output |
FeffOutputs |
Discover and read output files from a work directory |
License
MIT or Apache-2.0. The FEFF10 Fortran source is under its own license.
Links
Metadata
Release files for feff10-rs 0.2.4
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distributions (wheels)
| File | Actions Reset | |||
|---|---|---|---|---|
| feff10_rs-0.2.4-cp39-abi3-win_amd64.whl | CPython 3.9 | abi3 | Windows x86-64 | Details for feff10_rs-0.2.4-cp39-abi3-win_amd64.whl |
| feff10_rs-0.2.4-cp39-abi3-manylinux_2_39_aarch64.whl | CPython 3.9 | abi3 | Linux glibc 2.39+ ARM64 | Details for feff10_rs-0.2.4-cp39-abi3-manylinux_2_39_aarch64.whl |
| feff10_rs-0.2.4-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl | CPython 3.9 | abi3 | Linux glibc 2.17+ x86-64 | Details for feff10_rs-0.2.4-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
| feff10_rs-0.2.4-cp39-abi3-macosx_11_0_arm64.whl | CPython 3.9 | abi3 | macOS 11.0+ ARM64 | Details for feff10_rs-0.2.4-cp39-abi3-macosx_11_0_arm64.whl |
| feff10_rs-0.2.4-cp39-abi3-macosx_10_12_x86_64.whl | CPython 3.9 | abi3 | macOS 10.12+ x86-64 | Details for feff10_rs-0.2.4-cp39-abi3-macosx_10_12_x86_64.whl |
Total release size: 25.2 MB
Release files / feff10_rs-0.2.4-cp39-abi3-win_amd64.whl
| Download URL | feff10_rs-0.2.4-cp39-abi3-win_amd64.whl |
|---|---|
| Size | 4.4 MB |
| Tags | CPython 3.9 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
bc451cd7aec6b3fb5bc2c87368bc4ac6cfce10d78f4c9cae5f8bc73f409f90f3
|
|
BLAKE2b-256 checksum How to use checksums |
fed135c91b6fddf983e461d341c9919e8dfb706822ba0feae12857d4dc5a707c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / feff10_rs-0.2.4-cp39-abi3-manylinux_2_39_aarch64.whl
| Download URL | feff10_rs-0.2.4-cp39-abi3-manylinux_2_39_aarch64.whl |
|---|---|
| Size | 2.7 MB |
| Tags | CPython 3.9 Linux glibc 2.39+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
881f430eb12a988828460f1290fa3c79d7e550ea04de2ed76728b6b52334a71a
|
|
BLAKE2b-256 checksum How to use checksums |
42f265d1daa1546e65f4527fd712d56362654f5d0255c0bf9f3fc4ba0f6c84a1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / feff10_rs-0.2.4-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | feff10_rs-0.2.4-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 8.5 MB |
| Tags | CPython 3.9 Linux glibc 2.17+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
754d4851c27e29a493bdb67bef1b5153e7c48aad9d3a946b9ce51d6e01ec6103
|
|
BLAKE2b-256 checksum How to use checksums |
bbacdd730d07dfb1b11c7fe81fcb9df5351b73d3c1aa18397a0b457b3810ce84
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / feff10_rs-0.2.4-cp39-abi3-macosx_11_0_arm64.whl
| Download URL | feff10_rs-0.2.4-cp39-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 5.5 MB |
| Tags | CPython 3.9 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
6f3b346f10f692b8dc8249612dd4e234b1abdc4ce3bba05782786615116bd5dc
|
|
BLAKE2b-256 checksum How to use checksums |
e981ae508a43fe0795e3c75e62a613529d22f2e6189f5eabfd7ec399b92d63c9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / feff10_rs-0.2.4-cp39-abi3-macosx_10_12_x86_64.whl
| Download URL | feff10_rs-0.2.4-cp39-abi3-macosx_10_12_x86_64.whl |
|---|---|
| Size | 4.1 MB |
| Tags | CPython 3.9 abi3 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
c858e3b34b54afe454c419e9dd164301eae616d5dfce0dfcb542448e62157eba
|
|
BLAKE2b-256 checksum How to use checksums |
38e76b0d86df682765c5023d35b0435c1f730352c1d25fe9fbaaa1e9e31544e0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Security for feff10-rs 0.2.4
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.