photonoxide 0.5.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 (348) hide show
  1. photonoxide-0.5.2/.gitattributes +2 -0
  2. photonoxide-0.5.2/.gitignore +9 -0
  3. photonoxide-0.5.2/AGENTS.md +115 -0
  4. photonoxide-0.5.2/CHANGELOG.md +349 -0
  5. photonoxide-0.5.2/CONTRIBUTING.md +41 -0
  6. photonoxide-0.5.2/Cargo.lock +7082 -0
  7. photonoxide-0.5.2/Cargo.toml +71 -0
  8. photonoxide-0.5.2/LICENSE-APACHE +202 -0
  9. photonoxide-0.5.2/LICENSE-MIT +21 -0
  10. photonoxide-0.5.2/PKG-INFO +68 -0
  11. photonoxide-0.5.2/README.md +171 -0
  12. photonoxide-0.5.2/ROADMAP.md +761 -0
  13. photonoxide-0.5.2/circuits/mzi.toml +71 -0
  14. photonoxide-0.5.2/circuits/ring-add-drop.toml +74 -0
  15. photonoxide-0.5.2/circuits/ring-all-pass.toml +43 -0
  16. photonoxide-0.5.2/circuits/splitter-1x4.toml +70 -0
  17. photonoxide-0.5.2/docs/baselines.md +290 -0
  18. photonoxide-0.5.2/docs/benchmarks.md +86 -0
  19. photonoxide-0.5.2/docs/design/components.md +158 -0
  20. photonoxide-0.5.2/docs/farming.md +161 -0
  21. photonoxide-0.5.2/docs/features.md +83 -0
  22. photonoxide-0.5.2/docs/getting-started.md +250 -0
  23. photonoxide-0.5.2/docs/libraries.md +359 -0
  24. photonoxide-0.5.2/docs/methods/backends.md +191 -0
  25. photonoxide-0.5.2/docs/methods/bends.md +91 -0
  26. photonoxide-0.5.2/docs/methods/block-qmr.md +196 -0
  27. photonoxide-0.5.2/docs/methods/catalogue.md +285 -0
  28. photonoxide-0.5.2/docs/methods/circuit-adjoint.md +167 -0
  29. photonoxide-0.5.2/docs/methods/circuits.md +135 -0
  30. photonoxide-0.5.2/docs/methods/compact.md +361 -0
  31. photonoxide-0.5.2/docs/methods/components.md +304 -0
  32. photonoxide-0.5.2/docs/methods/contour.md +193 -0
  33. photonoxide-0.5.2/docs/methods/conventions.md +85 -0
  34. photonoxide-0.5.2/docs/methods/dispersion.md +55 -0
  35. photonoxide-0.5.2/docs/methods/eigen.md +118 -0
  36. photonoxide-0.5.2/docs/methods/eim.md +55 -0
  37. photonoxide-0.5.2/docs/methods/expressions.md +104 -0
  38. photonoxide-0.5.2/docs/methods/fdfd-3d.md +823 -0
  39. photonoxide-0.5.2/docs/methods/fdfd-adjoint.md +98 -0
  40. photonoxide-0.5.2/docs/methods/fdfd-ports.md +137 -0
  41. photonoxide-0.5.2/docs/methods/fdfd.md +125 -0
  42. photonoxide-0.5.2/docs/methods/fdtd-adjoint.md +216 -0
  43. photonoxide-0.5.2/docs/methods/fdtd.md +1432 -0
  44. photonoxide-0.5.2/docs/methods/fields.md +53 -0
  45. photonoxide-0.5.2/docs/methods/geometry.md +148 -0
  46. photonoxide-0.5.2/docs/methods/hadley.md +153 -0
  47. photonoxide-0.5.2/docs/methods/marcatili.md +53 -0
  48. photonoxide-0.5.2/docs/methods/materials.md +64 -0
  49. photonoxide-0.5.2/docs/methods/multilayer.md +82 -0
  50. photonoxide-0.5.2/docs/methods/pml.md +60 -0
  51. photonoxide-0.5.2/docs/methods/recycling.md +274 -0
  52. photonoxide-0.5.2/docs/methods/slab-fd.md +40 -0
  53. photonoxide-0.5.2/docs/methods/slab.md +61 -0
  54. photonoxide-0.5.2/docs/methods/vector.md +103 -0
  55. photonoxide-0.5.2/docs/methods/walls.md +49 -0
  56. photonoxide-0.5.2/docs/plans/backends.md +131 -0
  57. photonoxide-0.5.2/docs/plans/bindings.md +604 -0
  58. photonoxide-0.5.2/docs/plans/optimization.md +635 -0
  59. photonoxide-0.5.2/docs/plans/performance.md +648 -0
  60. photonoxide-0.5.2/docs/plans/quantum.md +543 -0
  61. photonoxide-0.5.2/docs/python.md +228 -0
  62. photonoxide-0.5.2/docs/validation-gpu.md +110 -0
  63. photonoxide-0.5.2/docs/validation.md +261 -0
  64. photonoxide-0.5.2/examples/README.md +62 -0
  65. photonoxide-0.5.2/examples/bend_loss.rs +117 -0
  66. photonoxide-0.5.2/examples/bump_oskooi.rs +266 -0
  67. photonoxide-0.5.2/examples/circuit_fit.rs +221 -0
  68. photonoxide-0.5.2/examples/circuit_ring_critical.rs +134 -0
  69. photonoxide-0.5.2/examples/circuit_splitter.rs +133 -0
  70. photonoxide-0.5.2/examples/common/mod.rs +62 -0
  71. photonoxide-0.5.2/examples/coupler_liu_poon.rs +150 -0
  72. photonoxide-0.5.2/examples/cpml_roden_gedney.rs +156 -0
  73. photonoxide-0.5.2/examples/crossing_liu_poon.rs +171 -0
  74. photonoxide-0.5.2/examples/directional_coupler.rs +137 -0
  75. photonoxide-0.5.2/examples/effective_index_method.rs +87 -0
  76. photonoxide-0.5.2/examples/group_index.rs +111 -0
  77. photonoxide-0.5.2/examples/hadley_corners.rs +123 -0
  78. photonoxide-0.5.2/examples/leaky_waves.rs +76 -0
  79. photonoxide-0.5.2/examples/leaky_wire_benchmark.rs +111 -0
  80. photonoxide-0.5.2/examples/lorentz_okoniewski.rs +265 -0
  81. photonoxide-0.5.2/examples/marcatili.rs +103 -0
  82. photonoxide-0.5.2/examples/mmi_liu_poon.rs +161 -0
  83. photonoxide-0.5.2/examples/mode_converter_liu_poon.rs +138 -0
  84. photonoxide-0.5.2/examples/multilayer_chilwell.rs +110 -0
  85. photonoxide-0.5.2/examples/mzi_dwivedi.rs +279 -0
  86. photonoxide-0.5.2/examples/output/bend_loss.txt +13 -0
  87. photonoxide-0.5.2/examples/output/bump_oskooi.txt +21 -0
  88. photonoxide-0.5.2/examples/output/circuit_fit.txt +14 -0
  89. photonoxide-0.5.2/examples/output/circuit_ring_critical.txt +8 -0
  90. photonoxide-0.5.2/examples/output/circuit_splitter.txt +8 -0
  91. photonoxide-0.5.2/examples/output/coupler_liu_poon.txt +6 -0
  92. photonoxide-0.5.2/examples/output/cpml_roden_gedney.txt +7 -0
  93. photonoxide-0.5.2/examples/output/crossing_liu_poon.txt +6 -0
  94. photonoxide-0.5.2/examples/output/directional_coupler.txt +7 -0
  95. photonoxide-0.5.2/examples/output/effective_index_method.txt +9 -0
  96. photonoxide-0.5.2/examples/output/group_index.txt +12 -0
  97. photonoxide-0.5.2/examples/output/hadley_corners.txt +37 -0
  98. photonoxide-0.5.2/examples/output/leaky_waves.txt +12 -0
  99. photonoxide-0.5.2/examples/output/leaky_wire_benchmark.txt +8 -0
  100. photonoxide-0.5.2/examples/output/lorentz_okoniewski.txt +43 -0
  101. photonoxide-0.5.2/examples/output/marcatili.txt +21 -0
  102. photonoxide-0.5.2/examples/output/mmi_liu_poon.txt +6 -0
  103. photonoxide-0.5.2/examples/output/mode_converter_liu_poon.txt +7 -0
  104. photonoxide-0.5.2/examples/output/multilayer_chilwell.txt +40 -0
  105. photonoxide-0.5.2/examples/output/mzi_dwivedi.txt +17 -0
  106. photonoxide-0.5.2/examples/output/pml_oskooi.txt +33 -0
  107. photonoxide-0.5.2/examples/output/ring_liu_poon.txt +4 -0
  108. photonoxide-0.5.2/examples/output/ring_q_factor.txt +8 -0
  109. photonoxide-0.5.2/examples/output/silica_index.txt +8 -0
  110. photonoxide-0.5.2/examples/output/silicon_index.txt +7 -0
  111. photonoxide-0.5.2/examples/output/slab_soi.txt +4 -0
  112. photonoxide-0.5.2/examples/output/slab_yariv_yeh.txt +13 -0
  113. photonoxide-0.5.2/examples/output/splitter_rotator_liu_poon.txt +6 -0
  114. photonoxide-0.5.2/examples/output/strip_waveguide.txt +6 -0
  115. photonoxide-0.5.2/examples/output/subpixel_holes.txt +28 -0
  116. photonoxide-0.5.2/examples/output/tfsf_square_cylinder.txt +13 -0
  117. photonoxide-0.5.2/examples/pdk/mod.rs +1156 -0
  118. photonoxide-0.5.2/examples/pml_oskooi.rs +153 -0
  119. photonoxide-0.5.2/examples/ring_liu_poon.rs +260 -0
  120. photonoxide-0.5.2/examples/ring_q_factor.rs +144 -0
  121. photonoxide-0.5.2/examples/silica_index.rs +39 -0
  122. photonoxide-0.5.2/examples/silicon_index.rs +38 -0
  123. photonoxide-0.5.2/examples/slab_soi.rs +38 -0
  124. photonoxide-0.5.2/examples/slab_yariv_yeh.rs +74 -0
  125. photonoxide-0.5.2/examples/splitter_rotator_liu_poon.rs +140 -0
  126. photonoxide-0.5.2/examples/strip_waveguide.rs +64 -0
  127. photonoxide-0.5.2/examples/subpixel_holes.rs +320 -0
  128. photonoxide-0.5.2/examples/tfsf_square_cylinder.rs +282 -0
  129. photonoxide-0.5.2/jobs/bragg-grating.toml +131 -0
  130. photonoxide-0.5.2/jobs/mmi-fdfd.toml +62 -0
  131. photonoxide-0.5.2/jobs/mmi-fdtd.toml +76 -0
  132. photonoxide-0.5.2/jobs/mzi-mmi.toml +76 -0
  133. photonoxide-0.5.2/jobs/ring-fdfd.toml +48 -0
  134. photonoxide-0.5.2/jobs/ring-fdtd.toml +67 -0
  135. photonoxide-0.5.2/jobs/strip-and-ring.toml +26 -0
  136. photonoxide-0.5.2/jobs/strip-guided-modes.toml +27 -0
  137. photonoxide-0.5.2/jobs/strip-modes.toml +26 -0
  138. photonoxide-0.5.2/jobs/strip-width-sweep.toml +26 -0
  139. photonoxide-0.5.2/licenses/LICENSE-APACHE +202 -0
  140. photonoxide-0.5.2/licenses/LICENSE-MIT +21 -0
  141. photonoxide-0.5.2/photonoxide/__init__.py +515 -0
  142. photonoxide-0.5.2/photonoxide/_photonoxide.pyi +76 -0
  143. photonoxide-0.5.2/photonoxide/errors.py +88 -0
  144. photonoxide-0.5.2/photonoxide/matlab/+photonoxide/circuit_spectrum.m +27 -0
  145. photonoxide-0.5.2/photonoxide/matlab/+photonoxide/fdfd_s_parameters.m +23 -0
  146. photonoxide-0.5.2/photonoxide/matlab/+photonoxide/group_index.m +17 -0
  147. photonoxide-0.5.2/photonoxide/matlab/+photonoxide/materials.m +14 -0
  148. photonoxide-0.5.2/photonoxide/matlab/+photonoxide/private/call.m +14 -0
  149. photonoxide-0.5.2/photonoxide/matlab/+photonoxide/private/jobtext.m +9 -0
  150. photonoxide-0.5.2/photonoxide/matlab/+photonoxide/private/pylist.m +4 -0
  151. photonoxide-0.5.2/photonoxide/matlab/+photonoxide/private/strings.m +4 -0
  152. photonoxide-0.5.2/photonoxide/matlab/+photonoxide/private/unflat.m +10 -0
  153. photonoxide-0.5.2/photonoxide/matlab/+photonoxide/read_touchstone.m +18 -0
  154. photonoxide-0.5.2/photonoxide/matlab/+photonoxide/refractive_index.m +24 -0
  155. photonoxide-0.5.2/photonoxide/matlab/+photonoxide/run_job.m +21 -0
  156. photonoxide-0.5.2/photonoxide/matlab/+photonoxide/slab_modes.m +24 -0
  157. photonoxide-0.5.2/photonoxide/matlab/+photonoxide/vector_modes.m +50 -0
  158. photonoxide-0.5.2/photonoxide/matlab/+photonoxide/version.m +7 -0
  159. photonoxide-0.5.2/photonoxide/matlab/+photonoxide/write_touchstone.m +22 -0
  160. photonoxide-0.5.2/photonoxide/matlab/__init__.py +346 -0
  161. photonoxide-0.5.2/photonoxide/py.typed +0 -0
  162. photonoxide-0.5.2/pyproject.toml +49 -0
  163. photonoxide-0.5.2/python/Cargo.toml +24 -0
  164. photonoxide-0.5.2/python/README.md +44 -0
  165. photonoxide-0.5.2/python/licenses/LICENSE-APACHE +202 -0
  166. photonoxide-0.5.2/python/licenses/LICENSE-MIT +21 -0
  167. photonoxide-0.5.2/python/src/errors.rs +71 -0
  168. photonoxide-0.5.2/python/src/lib.rs +464 -0
  169. photonoxide-0.5.2/python/tests/test_api.py +350 -0
  170. photonoxide-0.5.2/python/tests/test_conformance.py +116 -0
  171. photonoxide-0.5.2/python/tests/test_matlab.py +202 -0
  172. photonoxide-0.5.2/release-plz.toml +59 -0
  173. photonoxide-0.5.2/src/backend/auto.rs +641 -0
  174. photonoxide-0.5.2/src/backend/dense.rs +583 -0
  175. photonoxide-0.5.2/src/backend/iterative.rs +627 -0
  176. photonoxide-0.5.2/src/backend.rs +1051 -0
  177. photonoxide-0.5.2/src/bench/catalogue.rs +1870 -0
  178. photonoxide-0.5.2/src/bench/export.rs +565 -0
  179. photonoxide-0.5.2/src/bench/fdtd.rs +157 -0
  180. photonoxide-0.5.2/src/bench.rs +963 -0
  181. photonoxide-0.5.2/src/circuit/adjoint/checks.rs +479 -0
  182. photonoxide-0.5.2/src/circuit/adjoint/tests.rs +229 -0
  183. photonoxide-0.5.2/src/circuit/adjoint.rs +332 -0
  184. photonoxide-0.5.2/src/circuit/components/checks.rs +570 -0
  185. photonoxide-0.5.2/src/circuit/components/coupler.rs +352 -0
  186. photonoxide-0.5.2/src/circuit/components/dual.rs +195 -0
  187. photonoxide-0.5.2/src/circuit/components/measured.rs +199 -0
  188. photonoxide-0.5.2/src/circuit/components/mmi.rs +439 -0
  189. photonoxide-0.5.2/src/circuit/components/mod.rs +173 -0
  190. photonoxide-0.5.2/src/circuit/components/mzi.rs +94 -0
  191. photonoxide-0.5.2/src/circuit/components/ring.rs +585 -0
  192. photonoxide-0.5.2/src/circuit/components/sampled.rs +220 -0
  193. photonoxide-0.5.2/src/circuit/components/splitter.rs +79 -0
  194. photonoxide-0.5.2/src/circuit/components/tests.rs +657 -0
  195. photonoxide-0.5.2/src/circuit/components/waveguide.rs +661 -0
  196. photonoxide-0.5.2/src/circuit/ideal.rs +368 -0
  197. photonoxide-0.5.2/src/circuit/mod.rs +611 -0
  198. photonoxide-0.5.2/src/circuit/netlist.rs +478 -0
  199. photonoxide-0.5.2/src/circuit/objective.rs +143 -0
  200. photonoxide-0.5.2/src/circuit/solve.rs +506 -0
  201. photonoxide-0.5.2/src/circuit/tests/solve.rs +232 -0
  202. photonoxide-0.5.2/src/circuit/tests.rs +318 -0
  203. photonoxide-0.5.2/src/compact/checks.rs +847 -0
  204. photonoxide-0.5.2/src/compact/fit/tests.rs +210 -0
  205. photonoxide-0.5.2/src/compact/fit.rs +894 -0
  206. photonoxide-0.5.2/src/compact/mod.rs +55 -0
  207. photonoxide-0.5.2/src/compact/model/tests.rs +188 -0
  208. photonoxide-0.5.2/src/compact/model.rs +396 -0
  209. photonoxide-0.5.2/src/compact/param/tests.rs +299 -0
  210. photonoxide-0.5.2/src/compact/param.rs +1166 -0
  211. photonoxide-0.5.2/src/compact/touchstone/tests.rs +754 -0
  212. photonoxide-0.5.2/src/compact/touchstone.rs +1357 -0
  213. photonoxide-0.5.2/src/eigen/checks.rs +501 -0
  214. photonoxide-0.5.2/src/eigen/contour/tests.rs +203 -0
  215. photonoxide-0.5.2/src/eigen/contour.rs +797 -0
  216. photonoxide-0.5.2/src/eigen/growing.rs +99 -0
  217. photonoxide-0.5.2/src/eigen/schur.rs +384 -0
  218. photonoxide-0.5.2/src/eigen.rs +540 -0
  219. photonoxide-0.5.2/src/error.rs +120 -0
  220. photonoxide-0.5.2/src/expr/parse.rs +1441 -0
  221. photonoxide-0.5.2/src/expr/special.rs +62 -0
  222. photonoxide-0.5.2/src/expr/tests.rs +388 -0
  223. photonoxide-0.5.2/src/expr.rs +525 -0
  224. photonoxide-0.5.2/src/facade/circuit.rs +335 -0
  225. photonoxide-0.5.2/src/facade/conformance.rs +414 -0
  226. photonoxide-0.5.2/src/facade/tests.rs +499 -0
  227. photonoxide-0.5.2/src/facade.rs +725 -0
  228. photonoxide-0.5.2/src/farm/coordinator.rs +766 -0
  229. photonoxide-0.5.2/src/farm/protocol.rs +147 -0
  230. photonoxide-0.5.2/src/farm/tests.rs +594 -0
  231. photonoxide-0.5.2/src/farm/worker.rs +494 -0
  232. photonoxide-0.5.2/src/farm.rs +91 -0
  233. photonoxide-0.5.2/src/fdfd/adjoint.rs +202 -0
  234. photonoxide-0.5.2/src/fdfd/checks.rs +360 -0
  235. photonoxide-0.5.2/src/fdfd/direct.rs +256 -0
  236. photonoxide-0.5.2/src/fdfd/krylov/block.rs +1202 -0
  237. photonoxide-0.5.2/src/fdfd/krylov/block_tests.rs +360 -0
  238. photonoxide-0.5.2/src/fdfd/krylov/example.rs +186 -0
  239. photonoxide-0.5.2/src/fdfd/krylov/recycle.rs +599 -0
  240. photonoxide-0.5.2/src/fdfd/krylov/recycle_example.rs +208 -0
  241. photonoxide-0.5.2/src/fdfd/krylov/recycle_tests.rs +121 -0
  242. photonoxide-0.5.2/src/fdfd/krylov.rs +2116 -0
  243. photonoxide-0.5.2/src/fdfd/mod.rs +898 -0
  244. photonoxide-0.5.2/src/fdfd/ports.rs +470 -0
  245. photonoxide-0.5.2/src/fdfd/tests.rs +700 -0
  246. photonoxide-0.5.2/src/fdfd/three/adjoint.rs +194 -0
  247. photonoxide-0.5.2/src/fdfd/three/block_checks.rs +395 -0
  248. photonoxide-0.5.2/src/fdfd/three/checks.rs +602 -0
  249. photonoxide-0.5.2/src/fdfd/three/iterative.rs +666 -0
  250. photonoxide-0.5.2/src/fdfd/three/matrix_free.rs +760 -0
  251. photonoxide-0.5.2/src/fdfd/three/multigrid.rs +861 -0
  252. photonoxide-0.5.2/src/fdfd/three/multigrid_tests.rs +707 -0
  253. photonoxide-0.5.2/src/fdfd/three/port_checks.rs +437 -0
  254. photonoxide-0.5.2/src/fdfd/three/port_tests.rs +494 -0
  255. photonoxide-0.5.2/src/fdfd/three/ports.rs +777 -0
  256. photonoxide-0.5.2/src/fdfd/three/recycle_checks.rs +733 -0
  257. photonoxide-0.5.2/src/fdfd/three/recycling.rs +310 -0
  258. photonoxide-0.5.2/src/fdfd/three/tests.rs +1986 -0
  259. photonoxide-0.5.2/src/fdfd/three.rs +1174 -0
  260. photonoxide-0.5.2/src/fdtd/adjoint.rs +1080 -0
  261. photonoxide-0.5.2/src/fdtd/adjoint_checks.rs +774 -0
  262. photonoxide-0.5.2/src/fdtd/adjoint_tests.rs +216 -0
  263. photonoxide-0.5.2/src/fdtd/agreement_checks.rs +503 -0
  264. photonoxide-0.5.2/src/fdtd/bloch.rs +164 -0
  265. photonoxide-0.5.2/src/fdtd/bloch_checks.rs +370 -0
  266. photonoxide-0.5.2/src/fdtd/checks.rs +949 -0
  267. photonoxide-0.5.2/src/fdtd/gpu/checks.rs +396 -0
  268. photonoxide-0.5.2/src/fdtd/gpu/rates.rs +252 -0
  269. photonoxide-0.5.2/src/fdtd/gpu/resident.rs +867 -0
  270. photonoxide-0.5.2/src/fdtd/gpu/tests.rs +223 -0
  271. photonoxide-0.5.2/src/fdtd/gpu/yee.wgsl +731 -0
  272. photonoxide-0.5.2/src/fdtd/gpu.rs +472 -0
  273. photonoxide-0.5.2/src/fdtd/harmonic.rs +215 -0
  274. photonoxide-0.5.2/src/fdtd/harmonic_tests.rs +114 -0
  275. photonoxide-0.5.2/src/fdtd/kernel/blocked.rs +661 -0
  276. photonoxide-0.5.2/src/fdtd/kernel/reference.rs +181 -0
  277. photonoxide-0.5.2/src/fdtd/kernel/yee.rs +154 -0
  278. photonoxide-0.5.2/src/fdtd/kernel.rs +585 -0
  279. photonoxide-0.5.2/src/fdtd/kernel_rates.rs +226 -0
  280. photonoxide-0.5.2/src/fdtd/kernel_tests.rs +558 -0
  281. photonoxide-0.5.2/src/fdtd/media.rs +815 -0
  282. photonoxide-0.5.2/src/fdtd/media_checks.rs +432 -0
  283. photonoxide-0.5.2/src/fdtd/media_tests.rs +329 -0
  284. photonoxide-0.5.2/src/fdtd/meep_checks.rs +220 -0
  285. photonoxide-0.5.2/src/fdtd/mie.rs +303 -0
  286. photonoxide-0.5.2/src/fdtd/mie_checks.rs +437 -0
  287. photonoxide-0.5.2/src/fdtd/mie_tests.rs +262 -0
  288. photonoxide-0.5.2/src/fdtd/monitors.rs +804 -0
  289. photonoxide-0.5.2/src/fdtd/monitors_checks.rs +621 -0
  290. photonoxide-0.5.2/src/fdtd/monitors_tests.rs +109 -0
  291. photonoxide-0.5.2/src/fdtd/ring.rs +269 -0
  292. photonoxide-0.5.2/src/fdtd/smoothing/checks.rs +905 -0
  293. photonoxide-0.5.2/src/fdtd/smoothing/tests.rs +615 -0
  294. photonoxide-0.5.2/src/fdtd/smoothing.rs +1495 -0
  295. photonoxide-0.5.2/src/fdtd/sources.rs +1565 -0
  296. photonoxide-0.5.2/src/fdtd/tests.rs +479 -0
  297. photonoxide-0.5.2/src/fdtd.rs +1520 -0
  298. photonoxide-0.5.2/src/geometry/boundary.rs +621 -0
  299. photonoxide-0.5.2/src/geometry/checks.rs +277 -0
  300. photonoxide-0.5.2/src/geometry/index.rs +190 -0
  301. photonoxide-0.5.2/src/geometry/primitives.rs +1004 -0
  302. photonoxide-0.5.2/src/geometry/region.rs +327 -0
  303. photonoxide-0.5.2/src/geometry/region_tests.rs +611 -0
  304. photonoxide-0.5.2/src/geometry/transform.rs +289 -0
  305. photonoxide-0.5.2/src/geometry.rs +818 -0
  306. photonoxide-0.5.2/src/job/fdfd.rs +855 -0
  307. photonoxide-0.5.2/src/job/fdtd.rs +3140 -0
  308. photonoxide-0.5.2/src/job/mod.rs +4171 -0
  309. photonoxide-0.5.2/src/job/params.rs +495 -0
  310. photonoxide-0.5.2/src/lib.rs +71 -0
  311. photonoxide-0.5.2/src/material/catalogue/checks.rs +513 -0
  312. photonoxide-0.5.2/src/material/catalogue/coming.rs +179 -0
  313. photonoxide-0.5.2/src/material/catalogue/entries.rs +1649 -0
  314. photonoxide-0.5.2/src/material/catalogue/mod.rs +400 -0
  315. photonoxide-0.5.2/src/material/catalogue/models.rs +909 -0
  316. photonoxide-0.5.2/src/material/catalogue/references.rs +322 -0
  317. photonoxide-0.5.2/src/material/catalogue/symmetry.rs +141 -0
  318. photonoxide-0.5.2/src/material/catalogue/tags.rs +337 -0
  319. photonoxide-0.5.2/src/material/catalogue/tests.rs +687 -0
  320. photonoxide-0.5.2/src/material/mod.rs +895 -0
  321. photonoxide-0.5.2/src/material/refractiveindex.rs +607 -0
  322. photonoxide-0.5.2/src/mode/bend.rs +798 -0
  323. photonoxide-0.5.2/src/mode/dispersion.rs +316 -0
  324. photonoxide-0.5.2/src/mode/eim.rs +254 -0
  325. photonoxide-0.5.2/src/mode/fields.rs +218 -0
  326. photonoxide-0.5.2/src/mode/hadley.rs +1272 -0
  327. photonoxide-0.5.2/src/mode/marcatili.rs +386 -0
  328. photonoxide-0.5.2/src/mode/mod.rs +42 -0
  329. photonoxide-0.5.2/src/mode/multilayer.rs +750 -0
  330. photonoxide-0.5.2/src/mode/region/checks.rs +405 -0
  331. photonoxide-0.5.2/src/mode/region.rs +334 -0
  332. photonoxide-0.5.2/src/mode/slab.rs +369 -0
  333. photonoxide-0.5.2/src/mode/slab_fd.rs +423 -0
  334. photonoxide-0.5.2/src/mode/vector.rs +2097 -0
  335. photonoxide-0.5.2/src/parallel.rs +40 -0
  336. photonoxide-0.5.2/src/portable.rs +107 -0
  337. photonoxide-0.5.2/src/raster.rs +260 -0
  338. photonoxide-0.5.2/src/run.rs +1035 -0
  339. photonoxide-0.5.2/src/sparse/matching.rs +335 -0
  340. photonoxide-0.5.2/src/sparse/multifrontal.rs +1441 -0
  341. photonoxide-0.5.2/src/sparse.rs +338 -0
  342. photonoxide-0.5.2/src/stack.rs +411 -0
  343. photonoxide-0.5.2/src/traffic.rs +69 -0
  344. photonoxide-0.5.2/src/units.rs +406 -0
  345. photonoxide-0.5.2/src/validation/gpu.rs +466 -0
  346. photonoxide-0.5.2/src/validation.rs +4560 -0
  347. photonoxide-0.5.2/tests/gpu_report.rs +29 -0
  348. photonoxide-0.5.2/tests/validation_report.rs +23 -0
@@ -0,0 +1,2 @@
1
+ # what the examples print, compared byte for byte by CI and locally: LF everywhere
2
+ examples/output/*.txt text eol=lf
@@ -0,0 +1,9 @@
1
+ /target
2
+ /assets/brand/target
3
+ /runs
4
+ # the Python package: its native module when built in place, its wheels and pytest's caches
5
+ __pycache__/
6
+ *.so
7
+ *.pyd
8
+ /python/dist
9
+ /python/.pytest_cache
@@ -0,0 +1,115 @@
1
+ # photonoxide: notes for AI coding assistants
2
+
3
+ photonoxide is released milestone by milestone: a library whose public API can change between milestones until 1.0, and
4
+ the `photonoxide` program (the studio). [ROADMAP.md](ROADMAP.md) is the plan and the record of
5
+ what is done; [CHANGELOG.md](CHANGELOG.md) has what each release changed. 0.1 to 0.5 and their
6
+ patches are released, the latest 0.5.2 (many solves at once: ports as a block, recycling,
7
+ farming); next is 0.6, thermal and electro-optic devices. The library's modules, each with a write-up in
8
+ `docs/methods/`:
9
+
10
+ - `units`, `material` (with `material::catalogue`), `geometry` (the kernel: regions, transforms,
11
+ polygons, a spatial index), `expr` (expressions with units and parameters), `stack`, `raster`;
12
+ - `mode`: slabs, multilayers, planar profiles, full-vector and Hadley cross-sections, bends,
13
+ the effective index method, Marcatili, dispersion and fields;
14
+ - `fdfd`: 2D and 3D, ports and S-parameters, adjoint gradients, direct and QMR solves;
15
+ - `fdtd`: the Yee scheme in 2D and 3D, the convolutional PML, smoothing, sources, monitors,
16
+ dispersive media, adjoint gradients, and the GPU (`fdtd::gpu`, wgpu compute behind the `gpu`
17
+ feature);
18
+ - `circuit`: components, netlists, the circuit solve and its adjoint, objectives for genoxide;
19
+ - `compact`: vector fitting, models over parameters, Touchstone files;
20
+ - `backend`: the solver backends, photonoxide's own and the external libraries' (through
21
+ `photonoxide-native`);
22
+ - `job`, `run`: job files, run records and replay; `validation`: the report's cases; `bench`: the benchmark problems.
23
+ - `facade`: what the bindings wrap, plain types only: materials, slab and full-vector modes, jobs
24
+ and their runs, an FDFD job's S-parameters, circuits from a netlist given as data, Touchstone
25
+ files; and `facade::conformance()`, calls with their results for the bindings' tests. A
26
+ change elsewhere in the API that touches it is absorbed in it, in the same PR.
27
+
28
+ ## Commands
29
+
30
+ ```sh
31
+ cargo test # unit tests
32
+ cargo clippy --all-targets --all-features -- -D warnings
33
+ cargo run --release --example strip_waveguide # an example: a published result, checked
34
+ cargo run --release --quiet --example <name> > examples/output/<name>.txt # its output, which CI compares
35
+ cargo test --release --test validation_report -- --ignored # every validation case, and the report is current
36
+ cargo run -p photonoxide-native --example libraries # the external libraries found here (CUDA, cuSPARSE, cuDSS)
37
+ cargo test --release --features gpu --lib fdtd::gpu # FDTD on the GPU against the CPU (skips without a GPU)
38
+ cargo test --release --features gpu --test gpu_report -- --ignored # docs/validation-gpu.md, before each release
39
+ cargo clippy -p photonoxide-python --all-targets -- -D warnings # the Python package's Rust (not in the default members)
40
+ cd python && maturin develop --release && cd tests && python -m pytest # the Python package, in a virtual environment
41
+ ```
42
+
43
+ The Python package ([docs/python.md](docs/python.md)) wraps `photonoxide::facade` only. A change to
44
+ the façade's functions or results changes `python/` (the native module, the Python functions,
45
+ their stubs and the MATLAB wrappers) in the same PR; its tests compare each function with the
46
+ façade's conformance cases to the bit. A function added to the façade gets its row in
47
+ [docs/features.md](docs/features.md), the table of what works in Rust, Python and MATLAB (a test
48
+ checks every façade function is named there). CI builds and tests the wheels
49
+ (`.github/workflows/python-wheels.yml`) only on PRs that touch `python/`, `src/`, `jobs/` or the
50
+ manifests.
51
+
52
+ The `photonoxide` program is the studio, a Tauri app in `studio/` (Rust in `studio/src-tauri`,
53
+ the window in Svelte 5, TypeScript, Tailwind CSS with daisyUI, and three.js in `studio/src`;
54
+ `pnpm build` there type-checks it with svelte-check and fails on warnings). Build it with the Tauri CLI, never with
55
+ plain `cargo build`, which leaves the window pointing at the dev server:
56
+
57
+ ```sh
58
+ cd studio && pnpm install && pnpm tauri build # target/release/photonoxide(.exe)
59
+ target/release/photonoxide # the studio: examples, job builder, runs, validation
60
+ target/release/photonoxide run jobs/strip-and-ring.toml # a job, live in the studio window
61
+ target/release/photonoxide run jobs/strip-modes.toml # a strip's modes and a wavelength sweep, live
62
+ target/release/photonoxide run <job.toml> --headless # the same run without a window
63
+ target/release/photonoxide view runs/<run> # replay a finished run
64
+ target/release/photonoxide example slab_soi # a built-in example (--list lists them)
65
+ cargo run -p photonoxide-studio --release -- validate --write docs/validation.md # rewrite the report
66
+ target/release/photonoxide bench --threads 1,20 --write docs/benchmarks.md # time the benchmark problems (--all: heavy too)
67
+ ```
68
+
69
+ Every example in `examples/` is built into the program (`studio/src-tauri/src/examples.rs`): a
70
+ new one needs a `pub fn main`, an entry in `examples!` and a title there; a test fails otherwise.
71
+ Every job in `jobs/` is built in too (`jobs()` there), and must pass `job::check`.
72
+
73
+ CI fails when a validation case fails or `docs/validation.md` isn't the report the code writes:
74
+ regenerate and commit it with any change that adds or alters a case.
75
+
76
+ ## Rules
77
+
78
+ - **Rust only, but for the Python bindings** ([docs/plans/bindings.md](docs/plans/bindings.md), #271).
79
+ - Python only in `python/`: the bindings (the `photonoxide` package for Python, with its
80
+ MATLAB wrappers) and their tests. No Python helper scripts, no reference implementations,
81
+ nothing else in Python, anywhere else.
82
+ - The library stays Rust only. The bindings wrap its façade, a small module of plain types, not
83
+ the rest of the API.
84
+ - The binding crate writes no `unsafe` itself, and keeps `#![forbid(unsafe_code)]`: PyO3 needs
85
+ `unsafe`, in PyO3 and in what its macros expand to, and that is all the `unsafe` there is.
86
+ - No C or Fortran dependencies: nothing linked at build time, and the library keeps
87
+ `#![forbid(unsafe_code)]`.
88
+ - **External libraries are optional backends, loaded at run time** ([docs/plans/backends.md](docs/plans/backends.md)).
89
+ - Only through `photonoxide-native`, the one crate allowed `unsafe`. Never linked at build time, never redistributed, never GPL.
90
+ - photonoxide's own solvers stay the default and the reference. A backend is checked against them before it is offered, and its speed counts only at equal accuracy.
91
+ - The default build, CI and the released program work with no external library. Tests that need one skip when it isn't found, and say so.
92
+ - A backend declares whether it gives the same bits on every run. photonoxide's own solvers must, on any thread count.
93
+ - photonoxide's own GPU kernels (wgpu, the `gpu` feature) repeat bit for bit on the same device and driver: no floating-point atomics, fixed workgroup sizes, every sum taken in a fixed order. Against the CPU they agree to a tolerance stated per quantity (ROADMAP's principle 9). f32 on the GPU, f64 (Vulkan) for checking.
94
+ - GitHub's runners have no GPU: the GPU's tests skip there and say so, and run on tachsin's machine before each release, which writes docs/validation-gpu.md. docs/validation.md must be the same with or without a GPU.
95
+ - **Minimum Rust follows the dependencies.** Use a dependency's current release; when it needs a newer Rust than `rust-version`, raise `rust-version` and the CI's MSRV job to what it needs, in the same PR, and say so in the PR.
96
+ - **Validation before features.** A solver or device isn't done without three things:
97
+ - an analytic test;
98
+ - a reproduction of a published result;
99
+ - a convergence test.
100
+ Adjoint gradients are checked against finite differences.
101
+ - **Examples are published results.** Each file in `examples/` reproduces one paper's numbers, checks them with `common::Checks` and fails when they disagree; CI runs them all. See [examples/README.md](examples/README.md).
102
+ - **Cite the source.** Every method's docs name the paper it implements, by DOI. Check a DOI before citing it.
103
+ - **No GPL code.** Meep, MPB, KLayout and SPINS-B may be run as external programs for comparison. Never read them to port code. photonoxide is MIT OR Apache-2.0.
104
+ - **Material data is CC0 or our own, with provenance:** source, validity range and temperature.
105
+ - **Never quote a number without its grid,** and never quote a 2D number as a device's performance.
106
+ - **Optimizations run in the studio:**
107
+ - the window takes the CLI job, starts by itself, shows the run live and exits when done;
108
+ - a hard timeout is always set;
109
+ - headless only for batches.
110
+ - **Optimizers come from genoxide.** photonoxide supplies objectives, gradients and parametrizations. A missing method is added to genoxide as a general method, not written here and not made photonics-specific.
111
+ - **Commits:** no AI attribution lines (no 🤖 footer, no Co-Authored-By trailer).
112
+
113
+ ## From scratch
114
+
115
+ Everything is written from scratch to the roadmap; no code is carried over from earlier projects. The roadmap's "Pitfalls ruled out by design" table lists known mistakes, and each one must have a test here.
@@ -0,0 +1,349 @@
1
+ # Changelog
2
+
3
+ All notable changes to photonoxide are documented in this file, generated from the pull request titles by [release-plz](https://release-plz.dev/).
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and photonoxide adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
+
7
+ ## [Unreleased]
8
+
9
+ ## [0.5.2](https://github.com/tachsin/photonoxide/compare/v0.5.1...v0.5.2) - 2026-10-10
10
+
11
+ ### <!-- 0 -->Added
12
+
13
+ - *(facade)* a small, stable façade of plain types for the bindings, with conformance cases ([#288](https://github.com/tachsin/photonoxide/pull/288))
14
+ - *(python)* the photonoxide package for Python over the façade, MATLAB wrappers, wheels and PyPI publishing ([#290](https://github.com/tachsin/photonoxide/pull/290))
15
+ - *(mode)* Krylov–Schur restarts for shift-and-invert, and every guided mode above an n_eff threshold ([#298](https://github.com/tachsin/photonoxide/pull/298))
16
+ - *(fdfd)* recycling across 3D solves: earlier solutions and GCRO-DR, a sweep's, ports', adjoints' ([#300](https://github.com/tachsin/photonoxide/pull/300))
17
+ - *(studio)* the Academy's Mach–Zehnder lesson, from Mach and Zehnder to thin-film lithium niobate ([#301](https://github.com/tachsin/photonoxide/pull/301))
18
+ - *(farm)* a sweep's points and whole jobs farmed to worker processes, here or over TCP, gathered by index ([#297](https://github.com/tachsin/photonoxide/pull/297))
19
+ - *(studio)* the ring lesson goes on to the Q factor, critical coupling and fitting a measured spectrum ([#310](https://github.com/tachsin/photonoxide/pull/310))
20
+ - *(studio)* the Academy's whole curriculum laid out, each lesson's subsections marked coming soon ([#308](https://github.com/tachsin/photonoxide/pull/308))
21
+
22
+ ### <!-- 1 -->Fixed
23
+
24
+ - *(fdfd)* block QMR's checks hold on every system: portable inputs, and no count compared where it runs on rounding ([#286](https://github.com/tachsin/photonoxide/pull/286))
25
+ - *(run)* a run is Sync, UnwindSafe and RefUnwindSafe again, its farm's points behind a mutex ([#318](https://github.com/tachsin/photonoxide/pull/318))
26
+ - *(studio)* Nightly installs on Windows: the installer after the old app exits, its failure reported, an earlier watchdog superseded ([#293](https://github.com/tachsin/photonoxide/pull/293))
27
+
28
+ ### <!-- 4 -->Documentation
29
+
30
+ - Python bindings in this repository, in python/ only: the rule, the roadmap and the plan's decisions ([#287](https://github.com/tachsin/photonoxide/pull/287))
31
+ - a table of what works in Rust, Python and MATLAB, checked against the façade ([#292](https://github.com/tachsin/photonoxide/pull/292))
32
+ - Stewart's Krylov–Schur paper cited by its online year, December 2001 ([#299](https://github.com/tachsin/photonoxide/pull/299))
33
+ - 0.5.2 released, many solves at once; 0.6 next ([#316](https://github.com/tachsin/photonoxide/pull/316))
34
+
35
+ ## [0.5.1](https://github.com/tachsin/photonoxide/compare/v0.5.0...v0.5.1) - 2026-10-10
36
+
37
+ ### <!-- 0 -->Added
38
+
39
+ - *(native)* the install guides checked on clean machines, the page written from them, and two discovery fixes they found ([#255](https://github.com/tachsin/photonoxide/pull/255))
40
+ - *(backend)* auto chooses the direct solver from this machine's benchmark records ([#254](https://github.com/tachsin/photonoxide/pull/254))
41
+ - *(studio)* the Academy opens each lesson on a drawing of its device, in 2D and 3D ([#274](https://github.com/tachsin/photonoxide/pull/274))
42
+ - *(native)* MUMPS as a direct solver, its sequential build, releases 5.4 to 5.8 ([#260](https://github.com/tachsin/photonoxide/pull/260))
43
+ - *(native)* SuperLU as a direct solver, releases 5 to 7 ([#261](https://github.com/tachsin/photonoxide/pull/261))
44
+ - *(mode)* every mode in a region of n_eff by contour integrals (Sakurai–Sugiura, FEAST) ([#276](https://github.com/tachsin/photonoxide/pull/276))
45
+ - *(studio)* release channels, Stable and Nightly, Nightly built here from main ([#277](https://github.com/tachsin/photonoxide/pull/277))
46
+ - *(native)* Apple Accelerate's sparse solvers as a direct solver on macOS ([#263](https://github.com/tachsin/photonoxide/pull/263))
47
+ - *(native)* MUMPS's block low-rank factorization as the backend mumps-blr, refined ([#278](https://github.com/tachsin/photonoxide/pull/278))
48
+ - *(backend)* the multifrontal fronts' dense kernels as a trait, with OpenBLAS, oneMKL and Accelerate behind it ([#269](https://github.com/tachsin/photonoxide/pull/269))
49
+ - *(fdfd)* block QMR for all of a 3D S-matrix's ports at once, opt-in ([#284](https://github.com/tachsin/photonoxide/pull/284))
50
+
51
+ ### <!-- 1 -->Fixed
52
+
53
+ - the same example outputs on Linux, Windows and macOS, exp, sin and cos in pure Rust where a result hangs on the last bit ([#282](https://github.com/tachsin/photonoxide/pull/282))
54
+
55
+ ### <!-- 2 -->Performance
56
+
57
+ - *(fdtd)* smoothing passes over the shapes out of a cell's reach by their boxes, and CI runs the 3D examples on runners of their own ([#265](https://github.com/tachsin/photonoxide/pull/265))
58
+ - *(fdfd)* QMR on the curl-curl operator without its matrix, a product 1.6 to 2.6 times faster at a sixth of the memory ([#259](https://github.com/tachsin/photonoxide/pull/259))
59
+
60
+ ### <!-- 4 -->Documentation
61
+
62
+ - *(plans)* Wang et al.'s review of integrated photonic quantum technologies is from October 2019 ([#262](https://github.com/tachsin/photonoxide/pull/262))
63
+ - the README cut to what photonoxide does, without the padding ([#268](https://github.com/tachsin/photonoxide/pull/268))
64
+ - *(plans)* Python and MATLAB bindings, a plan and the decisions it needs ([#272](https://github.com/tachsin/photonoxide/pull/272))
65
+ - the Academy in the README's studio GIFs, in place of the themes ([#270](https://github.com/tachsin/photonoxide/pull/270))
66
+ - papers cited by the year they were published online ([#266](https://github.com/tachsin/photonoxide/pull/266))
67
+ - plans, roadmap and notes written in my own voice, not about "the owner" ([#273](https://github.com/tachsin/photonoxide/pull/273))
68
+ - *(plans)* Ryser's permanent read in Lundow and Markström 2022, his 1963 book being out of print ([#279](https://github.com/tachsin/photonoxide/pull/279))
69
+ - *(roadmap)* 0.5.1 releases the channels, backends and mode search now; many solves at once moves to 0.5.2 ([#283](https://github.com/tachsin/photonoxide/pull/283))
70
+ - 0.5.1 released, its GPU report measured on an idle machine, 0.5.2 next ([#285](https://github.com/tachsin/photonoxide/pull/285))
71
+
72
+ ## [0.5.0](https://github.com/tachsin/photonoxide/compare/v0.4.3...v0.5.0) - 2026-10-09
73
+
74
+ ### <!-- 0 -->Added
75
+
76
+ - *(backend)* solver backends: DirectSolver, Analysis and Factorization traits, a registry, and a choice in the solvers and in job files ([#193](https://github.com/tachsin/photonoxide/pull/193))
77
+ - *(bench)* a catalogue of problem families at many sizes, each with its task, its memory and its accuracy check ([#195](https://github.com/tachsin/photonoxide/pull/195))
78
+ - *(fdtd)* the Yee scheme in 2D and 3D with the convolutional PML ([#160](https://github.com/tachsin/photonoxide/pull/160)) ([#201](https://github.com/tachsin/photonoxide/pull/201))
79
+ - *(native)* photonoxide-native, finding and loading external libraries at run time, with smoke tests ([#202](https://github.com/tachsin/photonoxide/pull/202))
80
+ - *(fdtd)* sources: dipoles, total-field/scattered-field, one-way mode sources and Gaussian beams ([#162](https://github.com/tachsin/photonoxide/pull/162)) ([#203](https://github.com/tachsin/photonoxide/pull/203))
81
+ - *(fdtd)* Bloch-periodic boundaries and dispersive media by auxiliary differential equations ([#164](https://github.com/tachsin/photonoxide/pull/164)) ([#204](https://github.com/tachsin/photonoxide/pull/204))
82
+ - *(bench)* the benchmark runner over problems, backends and threads, with a results database ([#207](https://github.com/tachsin/photonoxide/pull/207))
83
+ - *(fdtd)* subpixel smoothing, isotropic and anisotropic ([#161](https://github.com/tachsin/photonoxide/pull/161)) ([#206](https://github.com/tachsin/photonoxide/pull/206))
84
+ - *(native)* oneMKL's PARDISO as a direct solver ([#211](https://github.com/tachsin/photonoxide/pull/211))
85
+ - *(native)* photonoxide's QMR on the GPU with cuSPARSE, an iterative backend ([#214](https://github.com/tachsin/photonoxide/pull/214))
86
+ - *(native)* QMR with ILU(0) on the GPU, photonoxide's factors and cuSPARSE's triangular solves ([#216](https://github.com/tachsin/photonoxide/pull/216))
87
+ - *(fdtd)* refuse a smoothed ε⁻¹ at the nodes that isn't positive definite ([#209](https://github.com/tachsin/photonoxide/pull/209)) ([#213](https://github.com/tachsin/photonoxide/pull/213))
88
+ - *(fdtd)* monitors: DFT fields, flux, mode overlaps and resonances by harmonic inversion ([#215](https://github.com/tachsin/photonoxide/pull/215))
89
+ - *(bench)* factor entries in the measurements and the runner's records ([#225](https://github.com/tachsin/photonoxide/pull/225))
90
+ - *(native)* GMRES with photonoxide's multigrid on the GPU ([#229](https://github.com/tachsin/photonoxide/pull/229))
91
+ - *(studio)* the Academy: lessons with live charts from the library, the ring resonator and Bragg gratings ([#233](https://github.com/tachsin/photonoxide/pull/233))
92
+ - *(fdtd)* Coupling::Triplets, Werner, Bauer & Cary's smoothing stable at any contrast ([#234](https://github.com/tachsin/photonoxide/pull/234))
93
+ - *(geometry)* the kernel: regions, primitives, transforms, polygons within a tolerance, fills and a spatial index ([#235](https://github.com/tachsin/photonoxide/pull/235))
94
+ - *(expr)* an expression language with units and parameters, in job files and sweeps ([#237](https://github.com/tachsin/photonoxide/pull/237))
95
+ - *(studio)* FDTD jobs, live field propagation and monitors ([#239](https://github.com/tachsin/photonoxide/pull/239))
96
+ - *(fdtd)* [**breaking**] Werner, Bauer and Cary's triplets are the default smoothing ([#240](https://github.com/tachsin/photonoxide/pull/240))
97
+ - *(fdtd)* adjoint gradients in 3D from FDTD runs, the mode's imaginary part included ([#246](https://github.com/tachsin/photonoxide/pull/246))
98
+ - *(bench)* the catalogue's remaining problems: stretched PMLs on the device boxes, Diel and the strip with ports at other sizes, Hadley's corners ([#242](https://github.com/tachsin/photonoxide/pull/242))
99
+ - *(fdtd)* FDTD on the GPU through wgpu compute, deterministic, judged against the blocked CPU kernel ([#252](https://github.com/tachsin/photonoxide/pull/252))
100
+ - *(fdtd)* Liu and Poon's six PDK devices in 3D FDTD against their published Lumerical FDTD and Tidy3D results; Coupling::Diagonal, a faster smoothing that keeps the blocked kernel; PortMode3d::moved_to public ([#253](https://github.com/tachsin/photonoxide/pull/253))
101
+ - *(native)* NVIDIA cuDSS, a sparse direct solver on the GPU ([#205](https://github.com/tachsin/photonoxide/pull/205))
102
+ - *(native)* cuDSS's complex symmetric L D Lᵀ ([#222](https://github.com/tachsin/photonoxide/pull/222))
103
+ - *(studio)* a Libraries page: what is found, licences, and guided installs the user confirms ([#221](https://github.com/tachsin/photonoxide/pull/221))
104
+ - *(studio)* a Benchmarks page: runs on the user's machine, charts, and which library wins where ([#226](https://github.com/tachsin/photonoxide/pull/226))
105
+
106
+ ### <!-- 1 -->Fixed
107
+
108
+ - 3D direct solves were wrong on AMD Zen 3 under Windows, faer's threaded product kernel now the fixed 0.1.22 ([#192](https://github.com/tachsin/photonoxide/pull/192))
109
+ - [**breaking**] the ring's closed forms, Marcuse's loss and Marcatili's normalized constant return errors, not NaN, infinities or panics ([#191](https://github.com/tachsin/photonoxide/pull/191))
110
+
111
+ ### <!-- 2 -->Performance
112
+
113
+ - *(fdtd)* the CPU kernel in f32 and f64, row by row, the same bits as the plain loops ([#218](https://github.com/tachsin/photonoxide/pull/218))
114
+ - *(fdtd)* spatial and wavefront diamond blocking, about 4 times the memory's roof beyond the caches ([#248](https://github.com/tachsin/photonoxide/pull/248))
115
+
116
+ ### <!-- 3 -->Changed
117
+
118
+ - *(bench)* the catalogue's Family, Task and Entry non-exhaustive and Family::ALL a slice, so new families aren't breaking changes ([#197](https://github.com/tachsin/photonoxide/pull/197))
119
+
120
+ ### <!-- 4 -->Documentation
121
+
122
+ - the plan for optional external libraries loaded at run time, and AGENTS.md's rule for them ([#196](https://github.com/tachsin/photonoxide/pull/196))
123
+ - other tools described by what they do, without comparisons that run them down; no oxiphoton ([#198](https://github.com/tachsin/photonoxide/pull/198))
124
+ - no more alpha: released milestone by milestone, and the site follows the latest release by itself ([#199](https://github.com/tachsin/photonoxide/pull/199))
125
+ - the README says what 0.4.2 and 0.4.3 released, and that 0.5 is next ([#230](https://github.com/tachsin/photonoxide/pull/230))
126
+ - no promises to fabricate: foundry and process names out of the plan, the site and the banner ([#231](https://github.com/tachsin/photonoxide/pull/231))
127
+ - *(roadmap)* 0.6.1, nonlinear integrated optics, and the materials' transparency windows ([#232](https://github.com/tachsin/photonoxide/pull/232))
128
+ - *(roadmap)* Herr et al.'s solitons paper is from December 2013 ([#236](https://github.com/tachsin/photonoxide/pull/236))
129
+ - *(plans)* the owner's decisions on the GPU: determinism, precision and where its tests run ([#241](https://github.com/tachsin/photonoxide/pull/241))
130
+ - *(plans)* photonic quantum computing: a survey and a plan for photonoxide ([#243](https://github.com/tachsin/photonoxide/pull/243))
131
+ - *(plans)* optimization in photonic design: a survey and a plan with genoxide ([#245](https://github.com/tachsin/photonoxide/pull/245))
132
+ - *(roadmap)* 0.6.2, quantum light and linear-optical statistics, and the owner's decisions on both plans ([#249](https://github.com/tachsin/photonoxide/pull/249))
133
+ - 0.5 released, FDTD and the backends in the README, 0.5.1 next ([#257](https://github.com/tachsin/photonoxide/pull/257))
134
+ - *(academy)* the Bragg lesson cites Macleod's fifth edition ([#238](https://github.com/tachsin/photonoxide/pull/238))
135
+
136
+ ## [0.4.3](https://github.com/tachsin/photonoxide/compare/v0.4.2...v0.4.3) - 2026-10-05
137
+
138
+ ### <!-- 0 -->Added
139
+
140
+ - the direct solves by a multifrontal LU and L D Lᵀ with static pivoting, at PARDISO's fill, 2 to 9 times faster than faer's LU ([#157](https://github.com/tachsin/photonoxide/pull/157))
141
+
142
+ ## [0.4.2](https://github.com/tachsin/photonoxide/compare/v0.4.1...v0.4.2) - 2026-10-05
143
+
144
+ ### <!-- 0 -->Added
145
+
146
+ - *(bench)* a benchmark harness: fixed problems timed at a stated accuracy, and `photonoxide bench` ([#135](https://github.com/tachsin/photonoxide/pull/135))
147
+ - *(fdfd)* GMRES preconditioned by a multigrid cycle for high-contrast 3D problems ([#144](https://github.com/tachsin/photonoxide/pull/144))
148
+ - *(job)* job files in JSON and YAML as well as TOML, the same job in each ([#145](https://github.com/tachsin/photonoxide/pull/145))
149
+ - *(fdfd)* QMR for complex symmetric matrices on the curl-curl operator's symmetric similarity, twice as fast ([#149](https://github.com/tachsin/photonoxide/pull/149))
150
+ - *(bench)* the bandwidth each iterative solve reaches, its bytes counted by the kernels, against the triad ([#152](https://github.com/tachsin/photonoxide/pull/152))
151
+ - *(bench)* the direct solvers' systems exported as Matrix Market files, and photonoxide's factorization timed on them ([#153](https://github.com/tachsin/photonoxide/pull/153))
152
+
153
+ ### <!-- 1 -->Fixed
154
+
155
+ - *(fdfd)* a 3D port's guided mode whose plane crosses PMLs goes forward, not backward ([#136](https://github.com/tachsin/photonoxide/pull/136))
156
+
157
+ ### <!-- 2 -->Performance
158
+
159
+ - *(job)* a sweep's points solved side by side on rayon's threads, recorded in order ([#146](https://github.com/tachsin/photonoxide/pull/146))
160
+ - *(fdfd)* the 3D direct solver orders its LU by nested dissection, twice as fast as COLAMD at 40³ cells ([#147](https://github.com/tachsin/photonoxide/pull/147))
161
+ - *(fdfd)* QMR's vector work fused into two passes on rayon's threads, deterministic sums, nothing allocated an iteration ([#148](https://github.com/tachsin/photonoxide/pull/148))
162
+ - the examples that sweep by hand solve their points side by side, through parallel::map_in_order ([#151](https://github.com/tachsin/photonoxide/pull/151))
163
+
164
+ ### <!-- 4 -->Documentation
165
+
166
+ - *(fdfd)* parallel ILU(0) measured on our matrices, both halves, and not used ([#150](https://github.com/tachsin/photonoxide/pull/150))
167
+ - photonoxide's direct solvers against PARDISO and MUMPS, where the difference comes from, and what would close it in pure Rust ([#155](https://github.com/tachsin/photonoxide/pull/155))
168
+
169
+ ## [0.4.1](https://github.com/tachsin/photonoxide/compare/v0.4.0...v0.4.1) - 2026-10-04
170
+
171
+ ### <!-- 0 -->Added
172
+
173
+ - light travels along x in every kind of job ([#102](https://github.com/tachsin/photonoxide/pull/102))
174
+ - *(studio)* the settings preview the theme in use and keep the other themes behind "More themes" ([#103](https://github.com/tachsin/photonoxide/pull/103))
175
+ - *(studio)* the structure's outline on 2D fields, how a run was solved, and the field from the guide's start ([#104](https://github.com/tachsin/photonoxide/pull/104))
176
+ - *(studio)* every length in µm or nm, app-wide, switched by clicking its unit ([#107](https://github.com/tachsin/photonoxide/pull/107))
177
+ - *(studio)* a menu that folds without anything in it moving, hints beside folded items, and bars that keep still ([#108](https://github.com/tachsin/photonoxide/pull/108))
178
+ - *(material)* crystal tags from the point group, what is coming and from which paper, and the Materials page's stale error ([#123](https://github.com/tachsin/photonoxide/pull/123))
179
+ - *(material)* five gaps filled from their papers: MgO:LiNbO3's r13, r33 and r22, LiNbO3's d22, AlGaAs's r41 and AlGaN's d31 and d33 ([#124](https://github.com/tachsin/photonoxide/pull/124))
180
+
181
+ ### <!-- 1 -->Fixed
182
+
183
+ - *(site)* the overview's version pill shows the release number only, and the title fits a 320 px phone ([#96](https://github.com/tachsin/photonoxide/pull/96))
184
+ - *(site)* the hero's name on one line on an iPhone, sized for its monospace width ([#97](https://github.com/tachsin/photonoxide/pull/97))
185
+ - *(site)* the hero's animation pauses while the page scrolls, so the sticky bar doesn't shiver on an iPhone ([#98](https://github.com/tachsin/photonoxide/pull/98))
186
+ - *(studio)* the viewer follows a running sweep, and an FDFD sweep's points each have their field ([#100](https://github.com/tachsin/photonoxide/pull/100))
187
+ - *(job)* the check refuses a wavelength a material has no data at, as the run does ([#101](https://github.com/tachsin/photonoxide/pull/101))
188
+ - *(job)* the check refuses badly placed fdfd ports, PMLs that leave no room and a grid too fine, as the run does ([#105](https://github.com/tachsin/photonoxide/pull/105))
189
+ - *(job)* an fdfd run's pictures leave out the PMLs, so the light starts and ends where the device is drawn ([#106](https://github.com/tachsin/photonoxide/pull/106))
190
+ - *(studio)* the builder's four-column rows drop to two on a narrow form, so a 5-digit nm value isn't clipped ([#109](https://github.com/tachsin/photonoxide/pull/109))
191
+ - clear errors for degenerate inputs that hung, filled the memory or gave NaNs ([#110](https://github.com/tachsin/photonoxide/pull/110))
192
+ - *(studio)* a 960-wide window fits every page, and the console and the build are quiet ([#111](https://github.com/tachsin/photonoxide/pull/111))
193
+ - the check refuses jobs that ran on something else, vector_fit refuses repeated samples, and the viewer fits 960 px ([#121](https://github.com/tachsin/photonoxide/pull/121))
194
+ - *(mode)* a bent slab is solved in milliseconds whatever its radius ([#126](https://github.com/tachsin/photonoxide/pull/126))
195
+ - a long mode solve heeds the stop and the time limit, and a modes job asks for at most 50 modes ([#125](https://github.com/tachsin/photonoxide/pull/125))
196
+ - *(eigen)* six or more modes of a cross-section converge, each restart taking a larger Krylov space ([#129](https://github.com/tachsin/photonoxide/pull/129))
197
+
198
+ ### <!-- 4 -->Documentation
199
+
200
+ - 0.4.0 is released, and 0.4.1's preconditioner is next ([#93](https://github.com/tachsin/photonoxide/pull/93))
201
+ - a performance plan (GPU, distributed, kernels) and the roadmap it changes ([#127](https://github.com/tachsin/photonoxide/pull/127))
202
+ - 0.4.1 ships as polish, and the preconditioner moves to 0.4.2 ([#130](https://github.com/tachsin/photonoxide/pull/130))
203
+
204
+ ## [0.4.0](https://github.com/tachsin/photonoxide/compare/v0.3.3...v0.4.0) - 2026-10-03
205
+
206
+ ### Breaking
207
+
208
+ - `ParametricModel::fit` takes an `Interpolation` in place of the polynomial degree: `Interpolation::Polynomial { degree }` for the previous fit, `Interpolation::PiecewiseLinear` for Triverio's ([#86](https://github.com/tachsin/photonoxide/pull/86))
209
+ - 2D FDFD ports: with H along z, S's reflections are the tangential E's, as the 3D ports' and mode expansions', and so minus those before 0.4.0; a mode's backward amplitude follows ([#90](https://github.com/tachsin/photonoxide/pull/90))
210
+ - `Boundaries3d` has a new public field, `real_stretch`: struct literals need it, or `..Boundaries3d::pml(cells)` ([#84](https://github.com/tachsin/photonoxide/pull/84))
211
+
212
+ ### <!-- 0 -->Added
213
+
214
+ - components and netlists, the foundation of circuits ([#71](https://github.com/tachsin/photonoxide/pull/71))
215
+ - the circuit solve: one sparse system per netlist, checked against Filipsson's sub-network growth ([#74](https://github.com/tachsin/photonoxide/pull/74))
216
+ - read and write Touchstone files, Version 1 and 2.0 ([#72](https://github.com/tachsin/photonoxide/pull/72))
217
+ - the circuit adjoint: every parameter's gradient from one transposed solve ([#75](https://github.com/tachsin/photonoxide/pull/75))
218
+ - optimization at circuit level through genoxide: a splitter, a ring at critical coupling and a fit ([#76](https://github.com/tachsin/photonoxide/pull/76))
219
+ - compact models by vector fitting, over parameters, and the measured fidelity ([#78](https://github.com/tachsin/photonoxide/pull/78))
220
+ - 3D FDFD ports: the grid's own full-vector port modes, one-way mode sources and a reciprocal S-matrix ([#77](https://github.com/tachsin/photonoxide/pull/77))
221
+ - the first components: waveguide, bend, couplers, MMI, Y-branch, rings and MZI ([#79](https://github.com/tachsin/photonoxide/pull/79))
222
+ - *(studio)* a component library and a chip view ([#80](https://github.com/tachsin/photonoxide/pull/80))
223
+ - validate against measured Mach-Zehnder interferometers (Dwivedi 2015) ([#85](https://github.com/tachsin/photonoxide/pull/85))
224
+ - *(material)* AlN's index (Rigler 2015), AlGaN films (Rigler 2013), and InGaP beyond Tanaka's range (Ferrini 2002) ([#87](https://github.com/tachsin/photonoxide/pull/87))
225
+ - [**breaking**] compact models checked against their papers: Triverio's piecewise-linear model with an exact uniform stability test ([#86](https://github.com/tachsin/photonoxide/pull/86))
226
+ - [**breaking**] QMR preconditioned by ILU(0) on Shin and Fan's operator, with PMLs stretched as much as they absorb ([#84](https://github.com/tachsin/photonoxide/pull/84))
227
+
228
+ ### <!-- 1 -->Fixed
229
+
230
+ - a 3D direct solve reaches round-off on any machine, finishing by QMR on an inaccurate factorization ([#82](https://github.com/tachsin/photonoxide/pull/82))
231
+ - 0.4 follow-ups: MMI port polarization, provenance -0.000, parallel spectra, roadmap ([#83](https://github.com/tachsin/photonoxide/pull/83))
232
+ - [**breaking**] 2D reflections with H along z by the tangential E's convention, as the 3D ports' ([#90](https://github.com/tachsin/photonoxide/pull/90))
233
+
234
+ ### <!-- 4 -->Documentation
235
+
236
+ - bring the README up to date with 0.3.3 and the 0.4 work on main ([#88](https://github.com/tachsin/photonoxide/pull/88))
237
+ - bring the site, getting started, the studio's README and AGENTS.md up to date ([#89](https://github.com/tachsin/photonoxide/pull/89))
238
+ - animate the studio in the README, recorded by a script ([#91](https://github.com/tachsin/photonoxide/pull/91))
239
+ - describe the crate as 0.4.0 has it, with FDTD, inverse design, layout and PDKs as planned ([#92](https://github.com/tachsin/photonoxide/pull/92))
240
+
241
+ ## [0.3.3](https://github.com/tachsin/photonoxide/compare/v0.3.2...v0.3.3) - 2026-10-03
242
+
243
+ ### <!-- 0 -->Added
244
+
245
+ - the selected mode travels along its guide in the 3D viewer, and job previews show a modes job whole ([#61](https://github.com/tachsin/photonoxide/pull/61))
246
+ - *(validation)* the cases' math as LaTeX, rendered by KaTeX in the studio and on the site ([#62](https://github.com/tachsin/photonoxide/pull/62))
247
+ - flip through a sweep's points in the viewer, each with its structure and its modes ([#67](https://github.com/tachsin/photonoxide/pull/67))
248
+ - a materials catalogue with provenance, and a Materials page in the studio ([#70](https://github.com/tachsin/photonoxide/pull/70))
249
+
250
+ ### <!-- 1 -->Fixed
251
+
252
+ - *(studio)* a release in the making is announced as on its way, not as an error ([#58](https://github.com/tachsin/photonoxide/pull/58))
253
+ - the check refuses windows that run backwards, a step that isn't positive and sweeps a run can't take; a width sweep's point shows its own cross-section ([#68](https://github.com/tachsin/photonoxide/pull/68))
254
+ - new run events go after the old ones, so their discriminants keep their values ([#69](https://github.com/tachsin/photonoxide/pull/69))
255
+
256
+ ### <!-- 4 -->Documentation
257
+
258
+ - method write-ups' math as GitHub renders it ([#63](https://github.com/tachsin/photonoxide/pull/63))
259
+
260
+ ## [0.3.2](https://github.com/tachsin/photonoxide/compare/v0.3.1...v0.3.2) - 2026-10-02
261
+
262
+ ### <!-- 0 -->Added
263
+
264
+ - *(studio)* rings, 3D previews of every job, and a steady 3D view ([#54](https://github.com/tachsin/photonoxide/pull/54))
265
+ - *(studio)* look for a new release every hour while the window is open ([#56](https://github.com/tachsin/photonoxide/pull/56))
266
+
267
+ ## [0.3.1](https://github.com/tachsin/photonoxide/compare/v0.3.0...v0.3.1) - 2026-10-02
268
+
269
+ ### <!-- 0 -->Added
270
+
271
+ - *(studio)* the studio as a workspace, with examples inside and updates by one click ([#52](https://github.com/tachsin/photonoxide/pull/52))
272
+
273
+ ## [0.3.0](https://github.com/tachsin/photonoxide/compare/v0.2.0...v0.3.0) - 2026-10-02
274
+
275
+ ### <!-- 0 -->Added
276
+
277
+ - [**breaking**] make the studio a Tauri app with a 3D view, and the photonoxide program ([#36](https://github.com/tachsin/photonoxide/pull/36))
278
+ - open the studio's start page with a bare photonoxide, and release binaries ([#38](https://github.com/tachsin/photonoxide/pull/38))
279
+ - add a multilayer stack's reflection and transmission of a plane wave ([#40](https://github.com/tachsin/photonoxide/pull/40))
280
+ - add 2D FDFD with stretched-coordinate PMLs and its exact power flux ([#41](https://github.com/tachsin/photonoxide/pull/41))
281
+ - add 2D FDFD ports: the grid's own modes, one-way sources and a reciprocal S-matrix ([#42](https://github.com/tachsin/photonoxide/pull/42))
282
+ - reuse an FDFD matrix's symbolic analysis across a sweep ([#43](https://github.com/tachsin/photonoxide/pull/43))
283
+ - add an fdfd job: a device on one layer by 2D FDFD with ports, live in the studio ([#44](https://github.com/tachsin/photonoxide/pull/44))
284
+ - add adjoint gradients for 2D FDFD, checked against finite differences ([#45](https://github.com/tachsin/photonoxide/pull/45))
285
+ - add Hadley's high-accuracy interface and corner equations as a full-vector mode solver ([#47](https://github.com/tachsin/photonoxide/pull/47))
286
+ - add 3D FDFD on the Yee grid with stretched-coordinate PMLs ([#46](https://github.com/tachsin/photonoxide/pull/46))
287
+ - add a QMR iterative solver for 3D FDFD, on the curl-curl operator or Shin and Fan's ([#48](https://github.com/tachsin/photonoxide/pull/48))
288
+
289
+ ### <!-- 1 -->Fixed
290
+
291
+ - *(fdfd)* put Shin and Fan's ε⁻¹ at the nodes, inside the gradient ([#50](https://github.com/tachsin/photonoxide/pull/50))
292
+
293
+ ### <!-- 4 -->Documentation
294
+
295
+ - reshape the roadmap around components, circuits and active photonics ([#49](https://github.com/tachsin/photonoxide/pull/49))
296
+ - mark 0.2 and 0.3 done in the roadmap ([#51](https://github.com/tachsin/photonoxide/pull/51))
297
+
298
+ ## [0.2.0](https://github.com/tachsin/photonoxide/compare/v0.1.1...v0.2.0) - 2026-10-02
299
+
300
+ ### <!-- 0 -->Added
301
+
302
+ - add the exact TE and TM modes of three-layer slabs ([#14](https://github.com/tachsin/photonoxide/pull/14))
303
+ - add the full-vector finite-difference mode solver, with shift-and-invert Arnoldi ([#16](https://github.com/tachsin/photonoxide/pull/16))
304
+ - add mirror walls to the vector mode solver, and validate its corners against Hadley ([#20](https://github.com/tachsin/photonoxide/pull/20))
305
+ - add group index, dispersion, loss and mode tracking ([#21](https://github.com/tachsin/photonoxide/pull/21))
306
+ - add exact multilayer slab modes and leaky waves by transfer matrices ([#22](https://github.com/tachsin/photonoxide/pull/22))
307
+ - add a PML to the vector mode solver for leaky modes ([#23](https://github.com/tachsin/photonoxide/pull/23))
308
+ - add the effective index method, with its error against the vector solver ([#24](https://github.com/tachsin/photonoxide/pull/24))
309
+ - add bends: an exact bent slab, and bent cross-sections in the vector solver ([#26](https://github.com/tachsin/photonoxide/pull/26))
310
+ - add a vector mode's full fields, power and coupling into another mode ([#28](https://github.com/tachsin/photonoxide/pull/28))
311
+ - add Marcatili's approximation, validated against the vector solver in its regime ([#29](https://github.com/tachsin/photonoxide/pull/29))
312
+ - add planar profiles by 1D finite differences, with a PML ([#30](https://github.com/tachsin/photonoxide/pull/30))
313
+ - add the studio's mode viewer, with sweeps over wavelength and width ([#31](https://github.com/tachsin/photonoxide/pull/31))
314
+
315
+ ### <!-- 4 -->Documentation
316
+
317
+ - add examples, each reproducing a published result ([#18](https://github.com/tachsin/photonoxide/pull/18))
318
+ - add the banner, logo and README badges ([#19](https://github.com/tachsin/photonoxide/pull/19))
319
+ - add the project site, method write-ups and example outputs ([#25](https://github.com/tachsin/photonoxide/pull/25))
320
+ - describe 0.2 as released ([#35](https://github.com/tachsin/photonoxide/pull/35))
321
+
322
+ ## [0.1.1](https://github.com/tachsin/photonoxide/compare/v0.1.0...v0.1.1) - 2026-10-01
323
+
324
+ ### <!-- 0 -->Added
325
+
326
+ - check the material data against Li, Malitson and Luke, and validate silica against Malitson's Table I ([#11](https://github.com/tachsin/photonoxide/pull/11))
327
+
328
+ ### <!-- 4 -->Documentation
329
+
330
+ - cite the book's page and words for the 220 nm on 2 um SOI stack ([#13](https://github.com/tachsin/photonoxide/pull/13))
331
+
332
+ ## [0.1.0](https://github.com/tachsin/photonoxide/releases/tag/v0.1.0) - 2026-10-01
333
+
334
+ 0.1 Foundations (ROADMAP.md).
335
+
336
+ ### <!-- 0 -->Added
337
+
338
+ - add the error type, and CI on Linux, macOS and Windows ([#1](https://github.com/tachsin/photonoxide/pull/1))
339
+ - add typed lengths, wavelengths and frequencies, and the e^(-iwt) convention ([#2](https://github.com/tachsin/photonoxide/pull/2))
340
+ - add materials with their provenance: Si (Li 1980), SiO2 (Malitson 1965), Si3N4 (Luke 2015) ([#3](https://github.com/tachsin/photonoxide/pull/3))
341
+ - add planar shapes, layer stacks with SOI and nitride presets, and structures ([#4](https://github.com/tachsin/photonoxide/pull/4))
342
+ - add job files, run directories, event records with exact replay, and stops ([#5](https://github.com/tachsin/photonoxide/pull/5))
343
+ - add the validation harness, its report and the photonoxide validate command ([#6](https://github.com/tachsin/photonoxide/pull/6))
344
+ - add the studio window, structure jobs and permittivity rasters ([#7](https://github.com/tachsin/photonoxide/pull/7))
345
+ - read refractiveindex.info files: its nine formulas, tabulated n, k and nk, with their provenance ([#8](https://github.com/tachsin/photonoxide/pull/8))
346
+
347
+ ### <!-- 3 -->Changed
348
+
349
+ - raise the minimum Rust to 1.95 for eframe and egui 0.36 ([#9](https://github.com/tachsin/photonoxide/pull/9))
@@ -0,0 +1,41 @@
1
+ # Contributing to photonoxide
2
+
3
+ photonoxide is pre-1.0: ideas, use cases and validation cases are as welcome as code. Open an issue first for anything larger than a small fix.
4
+
5
+ ## Pull requests
6
+
7
+ - **One change per PR, with tests, and with its validation.** A solver or device comes with an analytic test, a reproduction of a published result, and a convergence test; adjoint gradients are checked against finite differences. A change that adds or alters a validation case regenerates `docs/validation.md` (`cargo run -p photonoxide-studio --release -- validate --write docs/validation.md`).
8
+ - **Cite the paper.** Every method's docs name the paper it implements, by a DOI that was checked.
9
+ - **The PR title is the changelog entry.** PRs are squash merged: the title becomes the commit message and the changelog line. Use [Conventional Commits](https://www.conventionalcommits.org/), with a short sentence as the subject:
10
+
11
+ | Type | Use for | Changelog section |
12
+ |---|---|---|
13
+ | `feat` | new functionality | Added |
14
+ | `fix` | bug fixes | Fixed |
15
+ | `perf` | performance improvements | Performance |
16
+ | `refactor` | internal changes | Changed |
17
+ | `docs` | documentation | Documentation |
18
+ | `build!` | a higher minimum Rust | Changed |
19
+ | `test`, `ci`, `build`, `chore` | everything else | not listed |
20
+
21
+ Add `!` after the type for a breaking change, e.g. `feat!: rename Structure::draw to Structure::add`, and explain the migration in the PR description.
22
+ - **No AI attribution, anywhere.** Commits, PR and issue descriptions, comments and files carry no attribution to AI tools: no `Co-Authored-By` trailers naming an assistant, no "Generated with …" lines.
23
+ - **Before pushing, run:** `cargo fmt`, `cargo clippy --all-targets --all-features -- -D warnings`, `cargo test --all-features`.
24
+
25
+ ## Versioning
26
+
27
+ photonoxide follows [Semantic Versioning](https://semver.org/). Before 1.0, Cargo's rules for `0.x` apply: a breaking change to the public API, or different results for the same input, is a minor release (0.1.x → 0.2.0); new functionality and fixes are patch releases.
28
+
29
+ The minimum Rust follows the dependencies: when a dependency's current release needs a newer Rust, `rust-version` and the CI's MSRV job are raised with it (`build!: …`).
30
+
31
+ Dependabot's weekly pull request brings our dependencies' minor and patch updates. Their major versions are left out of it: the Releases workflow (`.github/workflows/releases.yml`, every Monday) lists them in the issue "Major updates available" (`photonoxide dependencies`), with each one's release notes, to adopt on purpose in a pull request of its own. The same workflow keeps the external libraries' new releases in the issue "New releases of external libraries" ([docs/libraries.md](docs/libraries.md#new-releases)).
32
+
33
+ ## Releases
34
+
35
+ [release-plz](https://release-plz.dev/) automates releases:
36
+
37
+ 1. **Release PR.** After every merge to `main`, release-plz opens or updates a release PR with the next version and the new CHANGELOG.md section, generated from the PR titles.
38
+ 2. **Breaking-change check.** [cargo-semver-checks](https://github.com/obi1kenobi/cargo-semver-checks) compares the public API with the previous release and catches a breaking change without a breaking version bump.
39
+ 3. **Changelog check.** release-plz leaves out a PR that changed only `studio/`, `site/` or `python/` (the crate excludes them), although the release carries the program built from it. The release PR's "Changelog" status fails while any PR merged since the last release is missing from the new section; its run's summary has the missing lines ready to paste. Add them to the release PR by hand, after the last merge before the release, since release-plz rewrites the section on every merge.
40
+ 4. **Release.** A maintainer merges the release PR. That publishes to crates.io through [trusted publishing](https://rust-lang.github.io/rfcs/3691-trusted-publishing-cratesio.html) (no token is stored: crates.io trusts `.github/workflows/release-plz.yml`), tags the version and creates the GitHub release with the same notes.
41
+ 5. **Python.** The Python package has the crate's version. Once PyPI trusts the repository (the `PYPI_PUBLISH` variable), the release starts `.github/workflows/python-wheels.yml` at the new tag, which builds, tests and publishes the wheels to PyPI; a fix to the package alone is a post-release, published by hand ([docs/python.md](docs/python.md#versions-and-releases)).