Changelog
1.0.0 (2026-07-30)
migrate Makefile to a uv-first workflow with shared RUN wrappers and no .venv/.ready bootstrap prerequisite
add RM/RMR cleanup variables and replace hardcoded rm cleanup commands
raise package Python support metadata to 3.10 through 3.14 and update docs/lite dependency ranges
update CI/runtime Python defaults to 3.14 and the test matrix to 3.10 and 3.14
add release dates to each changelog heading using release or tag dates
fix missing += in _d2_sellmeier so d2n() sums all three Sellmeier terms again
restore the full Schott names of 44 glasses that were truncated to six characters
find_glass() prefers an exact name and raises ValueError instead of quietly returning SiO2
add unit tests for refraction.py
make test runs the unit tests instead of doing nothing
add make coverage to report unit test coverage of the package in the terminal
add make update-notebooks to format the docs notebooks with black and re-execute them in place
share NB_TIMEOUT between note-test and update-notebooks
fix first_derivative() appending its padding value in the wrong place and dividing by a negative step
add unit tests for graded_index.py
fix power_law_profile() so a scalar radius outside the core also returns the cladding index
export ray_delay() from the package, previously called velocity() and missing from __all__
fix the material dispersion of ray_delay(), which did not reduce to the plain form at zero dispersion
add a profile_dispersion argument to ray_delay() so the delay-equalising exponent comes out at q = 2 - 2P
fix __all__ in cylinder_step.py, misspelled _all_, which leaked np, plt, scipy and special into ofiber
add unit tests for cylinder_step.py
fix integer arrays of V, ell or em returning zeros from LP_mode_value(), PetermannW(), V_d2bV_by_V(), bending_loss_db() and FF_node_polar_angle()
fix the em check in LP_mode_value() and FF_node_polar_angle() raising on an array, which made the em branch unreachable
correct the accuracy range in the V_d2bV_by_V_Approx() docstring, 1% holds for 1.35<V<2.08 rather than 1.4<V<2.4
fix TE_planar_parabolic_field() calling np.math.factorial, removed in numpy 2.0
fix parabolic_propagation_constants() counting modes with an unrelated formula and passing a float to np.empty
add unit tests for planar_parabolic.py
add unit tests for planar_step.py
fix TE_field() and TM_field() returning a flat field for a mode the waveguide cannot guide, nan is now returned
fix TE_propagation_constant() and TM_propagation_constant() raising TypeError on a scalar V
fix integer arrays of V returning zeros from TE_propagation_constant() and TM_propagation_constant()
correct the TM signatures in the planar_step docstring and label them magnetic rather than electric
fix the symmetric branch of the mode plots being drawn every pi/2 instead of every pi
fix TM_mode_plot() scaling its x axis by (n1/n2)**2, xi never exceeds V/2
V_d2bV_by_V() returns nan rather than 0 for an unguided mode, since 0 is a legal value
document that FF_node_polar_angle() returns k*a*sin(theta), not the polar angle itself
correct the Dispersion() docstring, it returns material and waveguide dispersion but not their sum
correct the glass() docstring, which referenced a nonexistent ofiber.glass_index and inverted find_glass and glass_name
correct LP_mode_value() pointing at itself instead of _LP_mode_value for the calculation details
correct the cutoff_wavelength() docstring, the default is the LP11 cutoff and LP01 has no cutoff at all
add V_parameter() to the basics docstring, drop the duplicated critical_angle entry and stray colons
describe m in R_par(), R_per() and R_unpolarized() as the relative index of the two media
fix R_par(), R_per() and R_unpolarized() returning nan past the critical angle instead of total reflection
add unit tests for basics.py
note in the noise docstrings that I0 is the post-gain current for shot_noise but the primary one for best_APD_gain
correct the thermal_min_power() summary, it reaches the requested signal-to-noise ratio rather than one
list the noise functions in the module docstring and explain Np in quantum_min_power()
use scipy.constants in noise.py instead of four-digit values for q, k, h and c, matching the rest of the package
replace the 4.34 and 4.343 dB conversions in cylinder_step.py with an exact 10/ln(10), they disagreed with each other
use scipy.constants.speed_of_light rather than 3e8 in 1-Refractive-Index.ipynb
default q to np.inf in Waveguide_Dispersion() and Dispersion(), replacing the 1e20 stand-in for a step index fiber
correct the accuracy claim for approx=True in Waveguide_Dispersion(), the error peaks near 6% at V=2.44
list the functions in the dispersion module docstring and note where the silica material zero falls
add unit tests for dispersion.py, completing 100% statement and branch coverage of the package
build Delta and V in Waveguide_Dispersion() from the basics routines instead of repeating their formulas
run the unit tests in CI rather than only pip check, and execute every notebook in a second job
test on ubuntu, macos and windows in CI, forcing the Agg matplotlib backend so headless runners agree
require the tests to pass before the pypi workflow publishes a release
drop the package-wide automodapi from docs/ofiber.rst, which documented every function a second time
accept q=np.inf in esi_Delta(), esi_radius() and esi_V_parameter() so dispersion and basics share one step-index sentinel
raise RuntimeError rather than StopIteration when the far-field node search finds no sign change
fix an RST substitution error from writing
|x|in the power_law_profile() docstringadd a black-check target that reports formatting without rewriting files
add a lint target that runs black, ruff, pylint, rstcheck and yamllint, and have rcheck defer to it
run make lint in CI as its own job, using the official astral-sh/setup-uv action with caching
update the CI actions, checkout v4 to v7 and setup-python v5 to v7
reformat with black, which had drifted in six files
add unit tests for noise.py
0.9.1 (2026-01-14)
remove requirements*.txt, all deps in pyproject.toml
use np.trapezoid()
version info only in __init__.py
update readthedocs configuration
update docs/conf.py
update github action to publish to pypi
fix pylint warnings in update_citation.py
move jupyter_lite_config.json to ofiber folder
update zenodo url
0.9.0 (2025-11-18)
support for jupyterlite
use pyproject.toml and requirements-dev.txt
better citation
normalizing code formatting with black
0.8.1 (2024-05-05)
Implemented FF_node_polar_angle (@matt8s)
Added FF_node_polar_angle() example to 9-Far-field-irradiance.ipynb (@matt8s)
Modified _FF_polar_x to take argument kasin (@matt8s)
Improved configuration for ruff linting tool
Edited Jupyter notebooks
Added images and improved README
0.8.0 (2024-02-13)
add functions for far-field irradiance (thanks @matt8s)
improve calc of b for cylindrical step fibers for large V
add new notebook for far-field irradiance
enable use of arrays in cylinder_step.LP_mode_value()
0.7.1 (2023-09-21)
fix long-description for pypi
0.7.0 (2023-09-21)
better handling of propagation factor b
add import boilerplate needed for Jupyterlite
Makefile packaging for Jupyterlite file
use __version__ and other dunders
flake8 now passes
fix various docstrings
readthedocs fixes
ruff support
add erbium fiber doc
clean up notebooks
add copyright stuff
add .github actions
update badges
conda support
v0.6.2 (2021-08-06)
create pure python packages
include wheel file
package as python3 only
v0.6.1 (2021-03-26)
add colab and binder badges
improve docs
rename dispersion api
start using more descriptive names in notebooks
v0.6.0 (2021-01-05)
improve help()
improve sphinx docs
new names
v0.5.0 (2020-05-25)
sphinx docs
reorganize and improve docs
add lint target to Makefile
add rcheck target to Makefile
v0.4.0 (2020-01-22)
improve packaging
add some documentation
more glasses
more functions
v0.3.0 (2018-03-12)
add basics.py
add documentation for functions
v0.2.1 (2018-03-05)
fix typo
v0.2.0 (2018-03-05)
Add noise.py
Improve packaging
v0.1.0 (2018-02-26)
Initial release