PyFiberModes 0.13.0__tar.gz → 0.13.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (148) hide show
  1. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/.github/workflows/tests.yml +1 -1
  2. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/.gitignore +2 -0
  3. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/.zenodo.json +6 -3
  4. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/CHANGELOG.md +34 -1
  5. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/CITATION.cff +3 -0
  6. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/CONTRIBUTING.md +1 -1
  7. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/PKG-INFO +22 -8
  8. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/PyFiberModes/__init__.py +11 -2
  9. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/PyFiberModes/_version.py +2 -2
  10. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/PyFiberModes/coordinates.py +7 -5
  11. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/PyFiberModes/directories.py +0 -12
  12. pyfibermodes-0.13.2/PyFiberModes/exceptions.py +17 -0
  13. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/PyFiberModes/fiber.py +154 -72
  14. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/PyFiberModes/field.py +27 -94
  15. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/PyFiberModes/mode.py +0 -30
  16. pyfibermodes-0.13.2/PyFiberModes/models.py +63 -0
  17. pyfibermodes-0.13.2/PyFiberModes/plotting.py +79 -0
  18. pyfibermodes-0.13.2/PyFiberModes/services.py +162 -0
  19. pyfibermodes-0.13.2/PyFiberModes/solver/__init__.py +18 -0
  20. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/PyFiberModes/solver/base_solver.py +88 -8
  21. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/PyFiberModes/solver/mlsif/neff.py +0 -97
  22. pyfibermodes-0.13.2/PyFiberModes/solver/protocols.py +32 -0
  23. pyfibermodes-0.13.2/PyFiberModes/solver/results.py +56 -0
  24. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/PyFiberModes/stepindex.py +23 -9
  25. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/PyFiberModes.egg-info/PKG-INFO +22 -8
  26. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/PyFiberModes.egg-info/SOURCES.txt +11 -1
  27. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/PyFiberModes.egg-info/requires.txt +8 -4
  28. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/README.rst +11 -2
  29. pyfibermodes-0.13.2/benchmarks/README.md +11 -0
  30. pyfibermodes-0.13.2/benchmarks/test_field_performance.py +32 -0
  31. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/conda.recipe/meta.yaml +14 -10
  32. pyfibermodes-0.13.2/docs/source/architecture.rst +37 -0
  33. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/docs/source/code/analysis.rst +12 -0
  34. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/docs/source/code/fundamentals.rst +8 -0
  35. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/docs/source/conf.py +2 -2
  36. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/docs/source/index.rst +1 -0
  37. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/pyproject.toml +24 -7
  38. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/tests/test_api.py +2 -2
  39. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/tests/test_architecture.py +28 -13
  40. pyfibermodes-0.13.2/tests/test_architecture_enhancements.py +86 -0
  41. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/tests/test_field.py +21 -10
  42. pyfibermodes-0.13.2/tests/test_physics_regression.py +41 -0
  43. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/tools/check_release.py +1 -4
  44. pyfibermodes-0.13.0/PyFiberModes/__future__.py +0 -177
  45. pyfibermodes-0.13.0/PyFiberModes/solver/__init__.py +0 -5
  46. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/.coveragerc +0 -0
  47. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/.github/dependabot.yml +0 -0
  48. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/.github/workflows/deploy_PyPi.yml +0 -0
  49. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/.github/workflows/deploy_anaconda.yml +0 -0
  50. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/.github/workflows/deploy_coverage.yml +0 -0
  51. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/.github/workflows/deploy_documentation.yml +0 -0
  52. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/.github/workflows/quality.yml +0 -0
  53. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/LICENSE +0 -0
  54. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/MANIFEST.in +0 -0
  55. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/Makefile +0 -0
  56. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/PyFiberModes/analysis.py +0 -0
  57. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/PyFiberModes/factory.py +0 -0
  58. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/PyFiberModes/fiber_files/1550BHP.yaml +0 -0
  59. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/PyFiberModes/fiber_files/DCF13.yaml +0 -0
  60. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/PyFiberModes/fiber_files/DCF1300S_20.yaml +0 -0
  61. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/PyFiberModes/fiber_files/DCF1300S_26.yaml +0 -0
  62. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/PyFiberModes/fiber_files/DCF1300S_33.yaml +0 -0
  63. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/PyFiberModes/fiber_files/DCF1300S_42.yaml +0 -0
  64. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/PyFiberModes/fiber_files/F2028M12.yaml +0 -0
  65. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/PyFiberModes/fiber_files/F2028M21.yaml +0 -0
  66. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/PyFiberModes/fiber_files/F2028M24.yaml +0 -0
  67. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/PyFiberModes/fiber_files/F2058G1.yaml +0 -0
  68. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/PyFiberModes/fiber_files/F2058L1.yaml +0 -0
  69. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/PyFiberModes/fiber_files/HI1060.yaml +0 -0
  70. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/PyFiberModes/fiber_files/HP630.yaml +0 -0
  71. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/PyFiberModes/fiber_files/SM1950.yaml +0 -0
  72. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/PyFiberModes/fiber_files/SMF28.yaml +0 -0
  73. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/PyFiberModes/fiber_files/fluorine_doped_1%_capillary.yaml +0 -0
  74. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/PyFiberModes/fiber_files/fluorine_doped_2%_capillary.yaml +0 -0
  75. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/PyFiberModes/fiber_files/test_fiber.yaml +0 -0
  76. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/PyFiberModes/fiber_files/test_multimode_fiber.yaml +0 -0
  77. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/PyFiberModes/fundamentals.py +0 -0
  78. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/PyFiberModes/loader.py +0 -0
  79. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/PyFiberModes/mode_instances.py +0 -0
  80. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/PyFiberModes/optimization.py +0 -0
  81. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/PyFiberModes/propagation.py +0 -0
  82. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/PyFiberModes/solver/mlsif/__init__.py +0 -0
  83. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/PyFiberModes/solver/ssif/__init__.py +0 -0
  84. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/PyFiberModes/solver/ssif/cutoff.py +0 -0
  85. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/PyFiberModes/solver/ssif/neff.py +0 -0
  86. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/PyFiberModes/solver/tlsif/__init__.py +0 -0
  87. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/PyFiberModes/solver/tlsif/cutoff.py +0 -0
  88. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/PyFiberModes/source.py +0 -0
  89. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/PyFiberModes.egg-info/dependency_links.txt +0 -0
  90. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/PyFiberModes.egg-info/top_level.txt +0 -0
  91. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/docs/Makefile +0 -0
  92. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/docs/examples/DCF/README.rst +0 -0
  93. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/docs/examples/DCF/plot_DCF_fields.py +0 -0
  94. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/docs/examples/README.rst +0 -0
  95. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/docs/examples/SMF28/README.rst +0 -0
  96. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/docs/examples/SMF28/plot_smf28.py +0 -0
  97. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/docs/examples/SMF28/plot_smf28_dispersion_vs_wavelength.py +0 -0
  98. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/docs/examples/SMF28/plot_smf28_group_index_vs_wavelength.py +0 -0
  99. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/docs/examples/analysis/README.rst +0 -0
  100. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/docs/examples/analysis/plot_coupled_mode_exchange.py +0 -0
  101. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/docs/examples/analysis/plot_structured_wavelength_sweep.py +0 -0
  102. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/docs/examples/basic/README.rst +0 -0
  103. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/docs/examples/basic/plot_U_vs_V.py +0 -0
  104. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/docs/examples/basic/plot_comparison_solvers.py +0 -0
  105. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/docs/examples/basic/plot_dispersion.py +0 -0
  106. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/docs/examples/basic/plot_effective_index.py +0 -0
  107. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/docs/examples/basic/plot_fiber_LP_modes.py +0 -0
  108. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/docs/examples/basic/plot_group_index.py +0 -0
  109. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/docs/examples/basic/plot_mode_field.py +0 -0
  110. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/docs/examples/basic/plot_mode_field_1.py +0 -0
  111. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/docs/examples/basic/plot_mode_field_2.py +0 -0
  112. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/docs/examples/basic/plot_neff_tapered_fiber.py +0 -0
  113. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/docs/examples/benchmarks/README.rst +0 -0
  114. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/docs/examples/benchmarks/plot_field_grid_scaling.py +0 -0
  115. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/docs/examples/fields/README.rst +0 -0
  116. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/docs/examples/fields/plot_vector_components.py +0 -0
  117. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/docs/examples/validation/README.rst +0 -0
  118. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/docs/examples/validation/plot_effective_index_bounds.py +0 -0
  119. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/docs/make.bat +0 -0
  120. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/docs/source/_static/default.css +0 -0
  121. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/docs/source/_static/favicon.png +0 -0
  122. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/docs/source/_static/logo.png +0 -0
  123. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/docs/source/_static/thumbnail.png +0 -0
  124. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/docs/source/code/fibers.rst +0 -0
  125. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/docs/source/code/fields.rst +0 -0
  126. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/docs/source/code.rst +0 -0
  127. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/docs/source/examples.rst +0 -0
  128. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/docs/source/getting_started.rst +0 -0
  129. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/docs/source/performance.rst +0 -0
  130. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/docs/source/references.rst +0 -0
  131. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/docs/source/theory.rst +0 -0
  132. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/docs/source/troubleshooting.rst +0 -0
  133. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/docs/source/workflows.rst +0 -0
  134. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/pytest.ini +0 -0
  135. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/setup.cfg +0 -0
  136. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/tests/__init__.py +0 -0
  137. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/tests/helpers.py +0 -0
  138. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/tests/test_advanced_features.py +0 -0
  139. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/tests/test_coordinates.py +0 -0
  140. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/tests/test_docstrings.py +0 -0
  141. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/tests/test_fiber.py +0 -0
  142. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/tests/test_file_loading.py +0 -0
  143. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/tests/test_release_tools.py +0 -0
  144. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/tests/test_ssif.py +0 -0
  145. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/tests/test_tlsif.py +0 -0
  146. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/tests/test_validation.py +0 -0
  147. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/tools/next_release_version.py +0 -0
  148. {pyfibermodes-0.13.0 → pyfibermodes-0.13.2}/tools/release_tag.py +0 -0
@@ -16,7 +16,7 @@ jobs:
16
16
  strategy:
17
17
  fail-fast: false
18
18
  matrix:
19
- python-version: ["3.10", "3.11", "3.12", "3.13"]
19
+ python-version: ["3.11", "3.12", "3.13"]
20
20
  steps:
21
21
  - uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09
22
22
  - uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1
@@ -8,6 +8,8 @@
8
8
  !development
9
9
  !docs
10
10
  !tests
11
+ !benchmarks/
12
+ !benchmarks/**
11
13
  !.flake8
12
14
  !.gitignore
13
15
  !.pre-commit-config.yaml
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "title": "PyFiberModes: guided-mode analysis and design for optical fibers",
3
- "description": "PyFiberModes solves guided modes in circularly symmetric step-index and multilayer optical fibers, including field analysis, modal sweeps, inverse design, and coupled-mode propagation.",
3
+ "description": "Guided-mode analysis and design for circular optical fibers, with field analysis, dispersion, modal sweeps, inverse design, and coupled-mode propagation.",
4
4
  "creators": [
5
5
  {
6
6
  "name": "Poinsinet de Sivry-Houle, Martin"
@@ -9,11 +9,14 @@
9
9
  "license": "MIT",
10
10
  "upload_type": "software",
11
11
  "access_right": "open",
12
- "version": "0.13.0",
13
- "publication_date": "2026-09-22",
12
+ "version": "0.13.2",
13
+ "publication_date": "2026-09-23",
14
14
  "keywords": [
15
15
  "optical fibers",
16
16
  "guided modes",
17
+ "mode solver",
18
+ "optical waveguides",
19
+ "photonics",
17
20
  "effective index",
18
21
  "dispersion",
19
22
  "coupled-mode theory"
@@ -6,6 +6,37 @@ use [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.13.2] - 2026-09-23
10
+
11
+ ### Changed
12
+
13
+ - Raised the minimum supported Python version to 3.11 and aligned CI,
14
+ contributor guidance, Ruff, and Conda metadata with that policy.
15
+ - Moved Matplotlib rendering into the optional `PyFiberModes.plotting` module
16
+ and added the `plotting` installation extra, keeping it out of core runtime
17
+ dependencies while preserving the `Field.plot` convenience method.
18
+ - Replaced generic package descriptions and keywords with fiber-mode,
19
+ photonics, waveguide, dispersion, and coupled-mode metadata.
20
+
21
+ ## [0.13.1] - 2026-09-22
22
+
23
+ ### Added
24
+
25
+ - Added validated immutable layer and solver settings, structural solver
26
+ protocols, domain-specific exceptions, and structured solver diagnostics.
27
+ - Added deterministic physical-reference, convergence, caching, architecture,
28
+ and opt-in `pytest-benchmark` performance suites.
29
+
30
+ ### Changed
31
+
32
+ - Unified cylindrical coordinates under one canonical model, split modal and
33
+ field orchestration into focused services, and added geometry-aware caching.
34
+ - Vectorized radial index lookup and routed field construction through a
35
+ single batched radial-field interface.
36
+ - Standardized the group-velocity API on `get_group_velocity` and removed
37
+ unreferenced experimental modules, unfinished solver branches, misspelled
38
+ methods, lowercase directory aliases, and obsolete compatibility wrappers.
39
+
9
40
  ## [0.13.0] - 2026-09-22
10
41
 
11
42
  ### Changed
@@ -55,7 +86,9 @@ use [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
55
86
 
56
87
  - Established the current tagged baseline for subsequent documented releases.
57
88
 
58
- [Unreleased]: https://github.com/MartinPdeS/PyFiberModes/compare/v0.13.0...HEAD
89
+ [Unreleased]: https://github.com/MartinPdeS/PyFiberModes/compare/v0.13.2...HEAD
90
+ [0.13.2]: https://github.com/MartinPdeS/PyFiberModes/releases/tag/v0.13.2
91
+ [0.13.1]: https://github.com/MartinPdeS/PyFiberModes/releases/tag/v0.13.1
59
92
  [0.13.0]: https://github.com/MartinPdeS/PyFiberModes/releases/tag/v0.13.0
60
93
  [0.12.0]: https://github.com/MartinPdeS/PyFiberModes/releases/tag/v0.12.0
61
94
  [0.11.0]: https://github.com/MartinPdeS/PyFiberModes/releases/tag/v0.11.0
@@ -14,6 +14,9 @@ url: "https://martinpdes.github.io/PyFiberModes/"
14
14
  keywords:
15
15
  - optical fibers
16
16
  - guided modes
17
+ - mode solver
18
+ - optical waveguides
19
+ - photonics
17
20
  - effective index
18
21
  - dispersion
19
22
  - coupled-mode theory
@@ -1,6 +1,6 @@
1
1
  # Contributing to PyFiberModes
2
2
 
3
- Use Python 3.10 or newer. Install development dependencies with `python -m pip install -e ".[testing,documentation]"`, then run `python -m pytest`.
3
+ Use Python 3.11 or newer. Install development dependencies with `python -m pip install -e ".[testing,documentation]"`, then run `python -m pytest`.
4
4
 
5
5
  Releases use semantic version tags. Run `make patch`, `make minor`, or `make major` from a clean `master` checkout; the command creates the release commit, tags it, and pushes both. Publishing workflows run only for `v*` tags.
6
6
 
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PyFiberModes
3
- Version: 0.13.0
4
- Summary: A package for light propagation in fiber optics.
3
+ Version: 0.13.2
4
+ Summary: Guided-mode analysis and design for circular optical fibers.
5
5
  Author-email: Martin Poinsinet de Sivry-Houle <martin.poinsinet.de.sivry@gmail.com>
6
6
  License: GNU GENERAL PUBLIC LICENSE
7
7
  Version 3, 29 June 2007
@@ -682,9 +682,10 @@ Project-URL: Homepage, https://github.com/MartinPdeS/PyFiberModes
682
682
  Project-URL: Repository, https://github.com/MartinPdeS/PyFiberModes
683
683
  Project-URL: Issues, https://github.com/MartinPdeS/PyFiberModes/issues
684
684
  Project-URL: Documentation, https://martinpdes.github.io/PyFiberModes/
685
- Keywords: finit-difference,matrix
685
+ Keywords: fiber optics,guided modes,mode solver,optical waveguides,photonics,dispersion,coupled-mode theory
686
686
  Classifier: Programming Language :: Python
687
687
  Classifier: Programming Language :: Python :: 3
688
+ Classifier: Programming Language :: Python :: 3 :: Only
688
689
  Classifier: Programming Language :: Python :: 3.11
689
690
  Classifier: Programming Language :: Python :: 3.12
690
691
  Classifier: Programming Language :: Python :: 3.13
@@ -693,12 +694,11 @@ Classifier: Development Status :: 4 - Beta
693
694
  Classifier: Topic :: Scientific/Engineering :: Physics
694
695
  Classifier: License :: OSI Approved :: MIT License
695
696
  Classifier: Intended Audience :: Science/Research
696
- Requires-Python: >=3.10
697
+ Requires-Python: >=3.11
697
698
  Description-Content-Type: text/x-rst
698
699
  License-File: LICENSE
699
700
  Requires-Dist: PyOptik<3,>=2
700
701
  Requires-Dist: PyFinitDiff
701
- Requires-Dist: matplotlib>=3.8
702
702
  Requires-Dist: pyyaml
703
703
  Requires-Dist: numpy
704
704
  Requires-Dist: scipy
@@ -708,8 +708,13 @@ Requires-Dist: pytest-cov<8,>=2; extra == "testing"
708
708
  Requires-Dist: pytest-json-report~=1.5; extra == "testing"
709
709
  Requires-Dist: coverage~=7.6; extra == "testing"
710
710
  Requires-Dist: ruff<1,>=0.8; extra == "testing"
711
- Requires-Dist: tomli<3,>=2; python_version < "3.11" and extra == "testing"
711
+ Requires-Dist: matplotlib>=3.8; extra == "testing"
712
+ Provides-Extra: plotting
713
+ Requires-Dist: matplotlib>=3.8; extra == "plotting"
714
+ Provides-Extra: benchmarking
715
+ Requires-Dist: pytest-benchmark<6,>=5; extra == "benchmarking"
712
716
  Provides-Extra: documentation
717
+ Requires-Dist: matplotlib>=3.8; extra == "documentation"
713
718
  Requires-Dist: numpydoc==1.10.0; extra == "documentation"
714
719
  Requires-Dist: sphinx>=5.1.1; extra == "documentation"
715
720
  Requires-Dist: sphinx-gallery==0.21.0; extra == "documentation"
@@ -775,17 +780,26 @@ Features
775
780
  * Constrained optimization of layer radii, refractive indices, and custom parameters.
776
781
  * Constant or longitudinally varying coupled-mode propagation.
777
782
  * A catalog of common and example fiber definitions stored as readable YAML files.
783
+ * Structured solver diagnostics, validated configuration models, and explicit
784
+ solver protocols for extending numerical backends.
785
+ * Geometry-aware modal caching and vectorized radial index and field workflows.
778
786
 
779
787
  Installation
780
788
  ------------
781
789
 
782
- PyFiberModes requires Python 3.10 or newer. Install the released package from
790
+ PyFiberModes requires Python 3.11 or newer. Install the released package from
783
791
  PyPI:
784
792
 
785
793
  .. code-block:: bash
786
794
 
787
795
  python -m pip install PyFiberModes
788
796
 
797
+ Matplotlib-based field visualizations are optional:
798
+
799
+ .. code-block:: bash
800
+
801
+ python -m pip install "PyFiberModes[plotting]"
802
+
789
803
  or from Anaconda:
790
804
 
791
805
  .. code-block:: bash
@@ -1023,7 +1037,7 @@ Or run the complete local check target:
1023
1037
 
1024
1038
  make check
1025
1039
 
1026
- Tests run on Python 3.10 through 3.13 in GitHub Actions. Bug reports and
1040
+ Tests run on Python 3.11 through 3.13 in GitHub Actions. Bug reports and
1027
1041
  feature proposals are welcome through the
1028
1042
  `issue tracker <https://github.com/MartinPdeS/PyFiberModes/issues>`_.
1029
1043
 
@@ -3,7 +3,12 @@
3
3
  from PyFiberModes.mode import Mode, Family # noqa: F401
4
4
  from PyFiberModes.mode_instances import * # noqa: F403
5
5
  from PyFiberModes.factory import FiberFactory
6
+ from PyFiberModes.fiber import Fiber, load_fiber
6
7
  from PyFiberModes.field import Field
8
+ from PyFiberModes.coordinates import CartesianCoordinates, CylindricalCoordinates
9
+ from PyFiberModes.exceptions import ConvergenceError, SolverError, ValidationError
10
+ from PyFiberModes.models import LayerSpec, SolverSettings
11
+ from PyFiberModes.solver.results import SolverResult
7
12
  from PyFiberModes.analysis import ModeSweepResult, find_modes, sweep_modes
8
13
  from PyFiberModes.optimization import DesignParameter, DesignResult, optimize_fiber
9
14
  from PyFiberModes.propagation import CoupledModeSystem, PropagationResult, coupling_matrix, overlap
@@ -17,11 +22,15 @@ except ImportError:
17
22
 
18
23
 
19
24
  __all__ = [ # noqa: F405
20
- 'Wavelength',
21
25
  'Mode',
22
- 'ModeFamily',
26
+ 'Family',
27
+ 'Fiber',
28
+ 'load_fiber',
23
29
  'FiberFactory',
24
30
  'Field',
31
+ 'CartesianCoordinates', 'CylindricalCoordinates',
32
+ 'LayerSpec', 'SolverSettings', 'SolverResult',
33
+ 'ValidationError', 'SolverError', 'ConvergenceError',
25
34
  'ModeSweepResult', 'find_modes', 'sweep_modes',
26
35
  'DesignParameter', 'DesignResult', 'optimize_fiber',
27
36
  'CoupledModeSystem', 'PropagationResult', 'coupling_matrix', 'overlap',
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '0.13.0'
22
- __version_tuple__ = version_tuple = (0, 13, 0)
21
+ __version__ = version = '0.13.2'
22
+ __version_tuple__ = version_tuple = (0, 13, 2)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -74,9 +74,9 @@ class CartesianCoordinates:
74
74
 
75
75
  def __post_init__(self) -> None:
76
76
  """Convert all coordinate arrays to floating-point arrays."""
77
- self.x = self.x.astype(float)
78
- self.y = self.y.astype(float)
79
- self.z = self.z.astype(float)
77
+ self.x = np.asarray(self.x, dtype=float)
78
+ self.y = np.asarray(self.y, dtype=float)
79
+ self.z = np.asarray(self.z, dtype=float)
80
80
 
81
81
  @property
82
82
  def x_boundaries(self) -> Tuple[float, float]:
@@ -119,7 +119,8 @@ class CartesianCoordinates:
119
119
  """
120
120
  if self.is_structured:
121
121
  x_min, x_max = self.x_boundaries
122
- return (x_max - x_min) / len(self.x)
122
+ unique_x = np.unique(self.x)
123
+ return float(unique_x[1] - unique_x[0])
123
124
  raise ValueError("dx value cannot be inferred from an unstructured mesh.")
124
125
 
125
126
  @property
@@ -139,7 +140,8 @@ class CartesianCoordinates:
139
140
  """
140
141
  if self.is_structured:
141
142
  y_min, y_max = self.y_boundaries
142
- return (y_max - y_min) / len(self.y)
143
+ unique_y = np.unique(self.y)
144
+ return float(unique_y[1] - unique_y[0])
143
145
  raise ValueError("dx value cannot be inferred from an unstructured mesh.")
144
146
 
145
147
  @classmethod
@@ -9,11 +9,6 @@ __all__ = [
9
9
  "DOCS_PATH",
10
10
  "EXAMPLES_PATH",
11
11
  "DOC_CSS_PATH",
12
- "root_path",
13
- "project_path",
14
- "examples_path",
15
- "doc_path",
16
- "doc_css_path",
17
12
  ]
18
13
 
19
14
  PACKAGE_PATH = Path(__file__).resolve().parent
@@ -21,10 +16,3 @@ PROJECT_PATH = PACKAGE_PATH.parent
21
16
  DOCS_PATH = PROJECT_PATH / "docs"
22
17
  EXAMPLES_PATH = DOCS_PATH / "examples"
23
18
  DOC_CSS_PATH = DOCS_PATH / "source" / "_static" / "default.css"
24
-
25
- # Backwards-compatible aliases for the original public names.
26
- root_path = PACKAGE_PATH
27
- project_path = PROJECT_PATH
28
- doc_path = DOCS_PATH
29
- examples_path = EXAMPLES_PATH
30
- doc_css_path = DOC_CSS_PATH
@@ -0,0 +1,17 @@
1
+ """Domain-specific exceptions raised by PyFiberModes."""
2
+
3
+
4
+ class PyFiberModesError(Exception):
5
+ """Base class for package-specific errors."""
6
+
7
+
8
+ class ValidationError(PyFiberModesError, ValueError):
9
+ """Indicate invalid physical geometry or solver configuration."""
10
+
11
+
12
+ class SolverError(PyFiberModesError, RuntimeError):
13
+ """Indicate that a modal solver could not complete normally."""
14
+
15
+
16
+ class ConvergenceError(SolverError):
17
+ """Indicate that a numerical solver did not converge to a valid root."""