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
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 | Reset | |||
|---|---|---|---|---|
| feff10_rs-0.2.4-cp39-abi3-win_amd64.whl | CPython 3.9 | abi3 | Windows x86-64 | Details |
| feff10_rs-0.2.4-cp39-abi3-manylinux_2_39_aarch64.whl | CPython 3.9 | abi3 | Linux glibc 2.39+ ARM64 | Details |
| 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 |
| feff10_rs-0.2.4-cp39-abi3-macosx_11_0_arm64.whl | CPython 3.9 | abi3 | macOS 11.0+ ARM64 | Details |
| feff10_rs-0.2.4-cp39-abi3-macosx_10_12_x86_64.whl | CPython 3.9 | abi3 | macOS 10.12+ x86-64 | Details |
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
|