rapidfem 0.2.1__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 (223) hide show
  1. rapidfem-0.2.1/.github/workflows/deploy-demo.yml +61 -0
  2. rapidfem-0.2.1/.github/workflows/wheels.yml +150 -0
  3. rapidfem-0.2.1/.gitignore +47 -0
  4. rapidfem-0.2.1/Cargo.lock +1365 -0
  5. rapidfem-0.2.1/Cargo.toml +29 -0
  6. rapidfem-0.2.1/LICENSE +661 -0
  7. rapidfem-0.2.1/PKG-INFO +179 -0
  8. rapidfem-0.2.1/README.md +147 -0
  9. rapidfem-0.2.1/docs/static-demo.md +92 -0
  10. rapidfem-0.2.1/pyproject.toml +57 -0
  11. rapidfem-0.2.1/python/Cargo.lock +1510 -0
  12. rapidfem-0.2.1/python/Cargo.toml +15 -0
  13. rapidfem-0.2.1/python/README.md +147 -0
  14. rapidfem-0.2.1/python/debug_substrate_tag.py +86 -0
  15. rapidfem-0.2.1/python/examples/builder_patch_antenna.py +113 -0
  16. rapidfem-0.2.1/python/examples/builder_wr90.py +48 -0
  17. rapidfem-0.2.1/python/examples/geometry_fragment.py +47 -0
  18. rapidfem-0.2.1/python/examples/geometry_wr90.py +81 -0
  19. rapidfem-0.2.1/python/examples/patch_antenna.py +65 -0
  20. rapidfem-0.2.1/python/examples/rfic_gds_sky130.py +108 -0
  21. rapidfem-0.2.1/python/examples/rfic_inductance_validation.py +209 -0
  22. rapidfem-0.2.1/python/examples/rfic_microstrip.py +104 -0
  23. rapidfem-0.2.1/python/examples/rfic_spiral_validation.py +259 -0
  24. rapidfem-0.2.1/python/examples/rfic_wire_min.py +150 -0
  25. rapidfem-0.2.1/python/examples/wr90.py +53 -0
  26. rapidfem-0.2.1/python/spike_geometry.py +286 -0
  27. rapidfem-0.2.1/python/src/lib.rs +327 -0
  28. rapidfem-0.2.1/python_src/rapidfem/__init__.py +100 -0
  29. rapidfem-0.2.1/python_src/rapidfem/_cli.py +151 -0
  30. rapidfem-0.2.1/python_src/rapidfem/_show_capture.py +62 -0
  31. rapidfem-0.2.1/python_src/rapidfem/bridge.py +224 -0
  32. rapidfem-0.2.1/python_src/rapidfem/builder.py +955 -0
  33. rapidfem-0.2.1/python_src/rapidfem/examples/__init__.py +6 -0
  34. rapidfem-0.2.1/python_src/rapidfem/examples/coax_step.py +78 -0
  35. rapidfem-0.2.1/python_src/rapidfem/examples/iris_filter.py +97 -0
  36. rapidfem-0.2.1/python_src/rapidfem/examples/microstrip_line.py +130 -0
  37. rapidfem-0.2.1/python_src/rapidfem/examples/patch_antenna.py +161 -0
  38. rapidfem-0.2.1/python_src/rapidfem/examples/wr90.py +63 -0
  39. rapidfem-0.2.1/python_src/rapidfem/examples/wr90_pml.py +88 -0
  40. rapidfem-0.2.1/python_src/rapidfem/geometry.py +1116 -0
  41. rapidfem-0.2.1/python_src/rapidfem/io.py +146 -0
  42. rapidfem-0.2.1/python_src/rapidfem/rfic.py +519 -0
  43. rapidfem-0.2.1/python_src/rapidfem/ui/__init__.py +7 -0
  44. rapidfem-0.2.1/python_src/rapidfem/ui/api.py +822 -0
  45. rapidfem-0.2.1/python_src/rapidfem/ui/bus.py +43 -0
  46. rapidfem-0.2.1/python_src/rapidfem/ui/frontend/__init__.py +3 -0
  47. rapidfem-0.2.1/python_src/rapidfem/ui/frontend/dist/404.html +42 -0
  48. rapidfem-0.2.1/python_src/rapidfem/ui/frontend/dist/CNAME +1 -0
  49. rapidfem-0.2.1/python_src/rapidfem/ui/frontend/dist/_app/env.js +1 -0
  50. rapidfem-0.2.1/python_src/rapidfem/ui/frontend/dist/_app/immutable/assets/0.D9BPtZGD.css +1 -0
  51. rapidfem-0.2.1/python_src/rapidfem/ui/frontend/dist/_app/immutable/assets/2.DQx7kmyG.css +1 -0
  52. rapidfem-0.2.1/python_src/rapidfem/ui/frontend/dist/_app/immutable/assets/3.7H1Qmg1u.css +1 -0
  53. rapidfem-0.2.1/python_src/rapidfem/ui/frontend/dist/_app/immutable/assets/4.D5ywvrNv.css +1 -0
  54. rapidfem-0.2.1/python_src/rapidfem/ui/frontend/dist/_app/immutable/chunks/8JA6wOM_.js +1 -0
  55. rapidfem-0.2.1/python_src/rapidfem/ui/frontend/dist/_app/immutable/chunks/BiMBxLpA.js +3789 -0
  56. rapidfem-0.2.1/python_src/rapidfem/ui/frontend/dist/_app/immutable/chunks/CR1c6hWL.js +1 -0
  57. rapidfem-0.2.1/python_src/rapidfem/ui/frontend/dist/_app/immutable/chunks/CYSOoxjT.js +2 -0
  58. rapidfem-0.2.1/python_src/rapidfem/ui/frontend/dist/_app/immutable/chunks/CwAP3ik2.js +1 -0
  59. rapidfem-0.2.1/python_src/rapidfem/ui/frontend/dist/_app/immutable/chunks/D5CK9Z8e.js +11 -0
  60. rapidfem-0.2.1/python_src/rapidfem/ui/frontend/dist/_app/immutable/chunks/DS00yKme.js +1 -0
  61. rapidfem-0.2.1/python_src/rapidfem/ui/frontend/dist/_app/immutable/chunks/DZ5O8Cz3.js +1 -0
  62. rapidfem-0.2.1/python_src/rapidfem/ui/frontend/dist/_app/immutable/chunks/DjRDjFqR.js +1 -0
  63. rapidfem-0.2.1/python_src/rapidfem/ui/frontend/dist/_app/immutable/chunks/HmEuodsi.js +1 -0
  64. rapidfem-0.2.1/python_src/rapidfem/ui/frontend/dist/_app/immutable/chunks/pKXBG7yB.js +1 -0
  65. rapidfem-0.2.1/python_src/rapidfem/ui/frontend/dist/_app/immutable/entry/app.BxIsfjFG.js +2 -0
  66. rapidfem-0.2.1/python_src/rapidfem/ui/frontend/dist/_app/immutable/entry/start.xq-Z1Urp.js +1 -0
  67. rapidfem-0.2.1/python_src/rapidfem/ui/frontend/dist/_app/immutable/nodes/0.mCgTYB0q.js +1 -0
  68. rapidfem-0.2.1/python_src/rapidfem/ui/frontend/dist/_app/immutable/nodes/1.BP6YpX2t.js +1 -0
  69. rapidfem-0.2.1/python_src/rapidfem/ui/frontend/dist/_app/immutable/nodes/2.dZbBPtnp.js +1 -0
  70. rapidfem-0.2.1/python_src/rapidfem/ui/frontend/dist/_app/immutable/nodes/3.CcLI6sL5.js +126 -0
  71. rapidfem-0.2.1/python_src/rapidfem/ui/frontend/dist/_app/immutable/nodes/4.Cc9T6wv6.js +19 -0
  72. rapidfem-0.2.1/python_src/rapidfem/ui/frontend/dist/_app/version.json +1 -0
  73. rapidfem-0.2.1/python_src/rapidfem/ui/frontend/dist/demo/coax_step.json +1 -0
  74. rapidfem-0.2.1/python_src/rapidfem/ui/frontend/dist/demo/coax_step_c4_d1.bin +0 -0
  75. rapidfem-0.2.1/python_src/rapidfem/ui/frontend/dist/demo/iris_filter.json +1 -0
  76. rapidfem-0.2.1/python_src/rapidfem/ui/frontend/dist/demo/iris_filter_c4_d1.bin +0 -0
  77. rapidfem-0.2.1/python_src/rapidfem/ui/frontend/dist/demo/manifest.json +312 -0
  78. rapidfem-0.2.1/python_src/rapidfem/ui/frontend/dist/demo/microstrip_line.json +1 -0
  79. rapidfem-0.2.1/python_src/rapidfem/ui/frontend/dist/demo/microstrip_line_c4_d1.bin +0 -0
  80. rapidfem-0.2.1/python_src/rapidfem/ui/frontend/dist/demo/patch_antenna.json +1 -0
  81. rapidfem-0.2.1/python_src/rapidfem/ui/frontend/dist/demo/patch_antenna_c4_d1.bin +0 -0
  82. rapidfem-0.2.1/python_src/rapidfem/ui/frontend/dist/demo/wr90.json +1 -0
  83. rapidfem-0.2.1/python_src/rapidfem/ui/frontend/dist/demo/wr90_c4_d1.bin +0 -0
  84. rapidfem-0.2.1/python_src/rapidfem/ui/frontend/dist/demo/wr90_pml.json +1 -0
  85. rapidfem-0.2.1/python_src/rapidfem/ui/frontend/dist/demo/wr90_pml_c4_d1.bin +0 -0
  86. rapidfem-0.2.1/python_src/rapidfem/ui/frontend/dist/embed/fem-viewer.js +116 -0
  87. rapidfem-0.2.1/python_src/rapidfem/ui/frontend/dist/embed/test.html +46 -0
  88. rapidfem-0.2.1/python_src/rapidfem/ui/frontend/dist/favicon.svg +4 -0
  89. rapidfem-0.2.1/python_src/rapidfem/ui/frontend/dist/index.html +45 -0
  90. rapidfem-0.2.1/python_src/rapidfem/ui/frontend-src/package-lock.json +1896 -0
  91. rapidfem-0.2.1/python_src/rapidfem/ui/frontend-src/package.json +33 -0
  92. rapidfem-0.2.1/python_src/rapidfem/ui/frontend-src/src/app.css +168 -0
  93. rapidfem-0.2.1/python_src/rapidfem/ui/frontend-src/src/app.html +13 -0
  94. rapidfem-0.2.1/python_src/rapidfem/ui/frontend-src/src/embed/fem-viewer.ts +479 -0
  95. rapidfem-0.2.1/python_src/rapidfem/ui/frontend-src/src/lib/api.ts +320 -0
  96. rapidfem-0.2.1/python_src/rapidfem/ui/frontend-src/src/lib/bridge/mesh_spec.ts +53 -0
  97. rapidfem-0.2.1/python_src/rapidfem/ui/frontend-src/src/lib/bridge/rp_to_spec.ts +167 -0
  98. rapidfem-0.2.1/python_src/rapidfem/ui/frontend-src/src/lib/bridge/spec.ts +83 -0
  99. rapidfem-0.2.1/python_src/rapidfem/ui/frontend-src/src/lib/components/Cell.svelte +335 -0
  100. rapidfem-0.2.1/python_src/rapidfem/ui/frontend-src/src/lib/components/CodeEditor.svelte +187 -0
  101. rapidfem-0.2.1/python_src/rapidfem/ui/frontend-src/src/lib/components/CodeSnippet.svelte +169 -0
  102. rapidfem-0.2.1/python_src/rapidfem/ui/frontend-src/src/lib/components/FileBrowser.svelte +538 -0
  103. rapidfem-0.2.1/python_src/rapidfem/ui/frontend-src/src/lib/components/MeshViewer.svelte +999 -0
  104. rapidfem-0.2.1/python_src/rapidfem/ui/frontend-src/src/lib/components/Notebook.svelte +205 -0
  105. rapidfem-0.2.1/python_src/rapidfem/ui/frontend-src/src/lib/components/Resizer.svelte +73 -0
  106. rapidfem-0.2.1/python_src/rapidfem/ui/frontend-src/src/lib/components/ResultsPanel.svelte +281 -0
  107. rapidfem-0.2.1/python_src/rapidfem/ui/frontend-src/src/lib/components/Select.svelte +115 -0
  108. rapidfem-0.2.1/python_src/rapidfem/ui/frontend-src/src/lib/components/fields.css +89 -0
  109. rapidfem-0.2.1/python_src/rapidfem/ui/frontend-src/src/lib/examples.ts +7 -0
  110. rapidfem-0.2.1/python_src/rapidfem/ui/frontend-src/src/lib/kernel.ts +373 -0
  111. rapidfem-0.2.1/python_src/rapidfem/ui/frontend-src/src/lib/msh.ts +15 -0
  112. rapidfem-0.2.1/python_src/rapidfem/ui/frontend-src/src/lib/render/canvas3d.ts +643 -0
  113. rapidfem-0.2.1/python_src/rapidfem/ui/frontend-src/src/lib/render/mesh_scene.ts +195 -0
  114. rapidfem-0.2.1/python_src/rapidfem/ui/frontend-src/src/lib/render/scene_builder.ts +377 -0
  115. rapidfem-0.2.1/python_src/rapidfem/ui/frontend-src/src/lib/sparams.ts +110 -0
  116. rapidfem-0.2.1/python_src/rapidfem/ui/frontend-src/src/lib/static_mode.ts +22 -0
  117. rapidfem-0.2.1/python_src/rapidfem/ui/frontend-src/src/lib/theme.ts +129 -0
  118. rapidfem-0.2.1/python_src/rapidfem/ui/frontend-src/src/lib/viz.ts +177 -0
  119. rapidfem-0.2.1/python_src/rapidfem/ui/frontend-src/src/routes/+layout.svelte +6 -0
  120. rapidfem-0.2.1/python_src/rapidfem/ui/frontend-src/src/routes/+layout.ts +3 -0
  121. rapidfem-0.2.1/python_src/rapidfem/ui/frontend-src/src/routes/+page.svelte +399 -0
  122. rapidfem-0.2.1/python_src/rapidfem/ui/frontend-src/src/routes/+page.ts +5 -0
  123. rapidfem-0.2.1/python_src/rapidfem/ui/frontend-src/src/routes/demo/+page.svelte +1166 -0
  124. rapidfem-0.2.1/python_src/rapidfem/ui/frontend-src/src/routes/embed/test/+page.svelte +219 -0
  125. rapidfem-0.2.1/python_src/rapidfem/ui/frontend-src/src/routes/embed/test/+page.ts +4 -0
  126. rapidfem-0.2.1/python_src/rapidfem/ui/frontend-src/static/CNAME +1 -0
  127. rapidfem-0.2.1/python_src/rapidfem/ui/frontend-src/static/demo/coax_step.json +1 -0
  128. rapidfem-0.2.1/python_src/rapidfem/ui/frontend-src/static/demo/coax_step_c4_d1.bin +0 -0
  129. rapidfem-0.2.1/python_src/rapidfem/ui/frontend-src/static/demo/iris_filter.json +1 -0
  130. rapidfem-0.2.1/python_src/rapidfem/ui/frontend-src/static/demo/iris_filter_c4_d1.bin +0 -0
  131. rapidfem-0.2.1/python_src/rapidfem/ui/frontend-src/static/demo/manifest.json +312 -0
  132. rapidfem-0.2.1/python_src/rapidfem/ui/frontend-src/static/demo/microstrip_line.json +1 -0
  133. rapidfem-0.2.1/python_src/rapidfem/ui/frontend-src/static/demo/microstrip_line_c4_d1.bin +0 -0
  134. rapidfem-0.2.1/python_src/rapidfem/ui/frontend-src/static/demo/patch_antenna.json +1 -0
  135. rapidfem-0.2.1/python_src/rapidfem/ui/frontend-src/static/demo/patch_antenna_c4_d1.bin +0 -0
  136. rapidfem-0.2.1/python_src/rapidfem/ui/frontend-src/static/demo/wr90.json +1 -0
  137. rapidfem-0.2.1/python_src/rapidfem/ui/frontend-src/static/demo/wr90_c4_d1.bin +0 -0
  138. rapidfem-0.2.1/python_src/rapidfem/ui/frontend-src/static/demo/wr90_pml.json +1 -0
  139. rapidfem-0.2.1/python_src/rapidfem/ui/frontend-src/static/demo/wr90_pml_c4_d1.bin +0 -0
  140. rapidfem-0.2.1/python_src/rapidfem/ui/frontend-src/static/embed/fem-viewer.js +116 -0
  141. rapidfem-0.2.1/python_src/rapidfem/ui/frontend-src/static/favicon.svg +4 -0
  142. rapidfem-0.2.1/python_src/rapidfem/ui/frontend-src/svelte.config.js +26 -0
  143. rapidfem-0.2.1/python_src/rapidfem/ui/frontend-src/tsconfig.json +14 -0
  144. rapidfem-0.2.1/python_src/rapidfem/ui/frontend-src/vite.config.ts +17 -0
  145. rapidfem-0.2.1/python_src/rapidfem/ui/frontend-src/vite.embed.config.ts +34 -0
  146. rapidfem-0.2.1/python_src/rapidfem/ui/kernel.py +61 -0
  147. rapidfem-0.2.1/python_src/rapidfem/ui/kernel_ws.py +131 -0
  148. rapidfem-0.2.1/python_src/rapidfem/ui/serialize.py +424 -0
  149. rapidfem-0.2.1/python_src/rapidfem/ui/server.py +148 -0
  150. rapidfem-0.2.1/scripts/bake_demo.py +525 -0
  151. rapidfem-0.2.1/scripts/build_frontend.ps1 +31 -0
  152. rapidfem-0.2.1/scripts/build_frontend.sh +25 -0
  153. rapidfem-0.2.1/scripts/patch_antenna.py +280 -0
  154. rapidfem-0.2.1/src/abc_order2.rs +387 -0
  155. rapidfem-0.2.1/src/assembly.rs +555 -0
  156. rapidfem-0.2.1/src/basis.rs +182 -0
  157. rapidfem-0.2.1/src/coefficients.rs +142 -0
  158. rapidfem-0.2.1/src/config.rs +324 -0
  159. rapidfem-0.2.1/src/constants.rs +7 -0
  160. rapidfem-0.2.1/src/csym_ldlt.rs +229 -0
  161. rapidfem-0.2.1/src/eigenmode.rs +260 -0
  162. rapidfem-0.2.1/src/error_estimator.rs +334 -0
  163. rapidfem-0.2.1/src/farfield.rs +482 -0
  164. rapidfem-0.2.1/src/interp.rs +256 -0
  165. rapidfem-0.2.1/src/lib.rs +25 -0
  166. rapidfem-0.2.1/src/main.rs +210 -0
  167. rapidfem-0.2.1/src/materials.rs +216 -0
  168. rapidfem-0.2.1/src/mesh.rs +161 -0
  169. rapidfem-0.2.1/src/mesh_io.rs +169 -0
  170. rapidfem-0.2.1/src/pardiso.rs +332 -0
  171. rapidfem-0.2.1/src/port.rs +155 -0
  172. rapidfem-0.2.1/src/quadrature.rs +158 -0
  173. rapidfem-0.2.1/src/simulation.rs +697 -0
  174. rapidfem-0.2.1/src/sparam.rs +184 -0
  175. rapidfem-0.2.1/src/tet_assembly.rs +443 -0
  176. rapidfem-0.2.1/src/touchstone.rs +64 -0
  177. rapidfem-0.2.1/src/tri_assembly.rs +320 -0
  178. rapidfem-0.2.1/src/vtk_export.rs +158 -0
  179. rapidfem-0.2.1/src/waveguide.rs +665 -0
  180. rapidfem-0.2.1/tests/abc_order2_test.rs +24 -0
  181. rapidfem-0.2.1/tests/benchmark.rs +148 -0
  182. rapidfem-0.2.1/tests/benchmark_large.rs +89 -0
  183. rapidfem-0.2.1/tests/config_cavity_eigen.toml +12 -0
  184. rapidfem-0.2.1/tests/config_iris_error.toml +23 -0
  185. rapidfem-0.2.1/tests/config_iris_sweep.toml +23 -0
  186. rapidfem-0.2.1/tests/config_patch.toml +23 -0
  187. rapidfem-0.2.1/tests/config_patch_cq.toml +31 -0
  188. rapidfem-0.2.1/tests/config_patch_ff.toml +31 -0
  189. rapidfem-0.2.1/tests/config_stepped_viz.toml +22 -0
  190. rapidfem-0.2.1/tests/config_two_iris.toml +19 -0
  191. rapidfem-0.2.1/tests/config_two_iris_fine_viz.toml +22 -0
  192. rapidfem-0.2.1/tests/config_two_iris_viz.toml +22 -0
  193. rapidfem-0.2.1/tests/config_vtk_test.toml +19 -0
  194. rapidfem-0.2.1/tests/config_wr90.toml +23 -0
  195. rapidfem-0.2.1/tests/csym_ldlt_test.rs +80 -0
  196. rapidfem-0.2.1/tests/e2e_test.rs +120 -0
  197. rapidfem-0.2.1/tests/mesh_verify.rs +43 -0
  198. rapidfem-0.2.1/tests/meshes/cavity.msh +1691 -0
  199. rapidfem-0.2.1/tests/meshes/coax.msh +179423 -0
  200. rapidfem-0.2.1/tests/meshes/iris_coarse.msh +3025 -0
  201. rapidfem-0.2.1/tests/meshes/iris_fine.msh +6474 -0
  202. rapidfem-0.2.1/tests/meshes/parallel_plate.msh +3706 -0
  203. rapidfem-0.2.1/tests/meshes/patch_antenna.msh +3942 -0
  204. rapidfem-0.2.1/tests/meshes/patch_antenna_cq.msh +37158 -0
  205. rapidfem-0.2.1/tests/meshes/stepped_coarse.msh +4286 -0
  206. rapidfem-0.2.1/tests/meshes/stepped_fine.msh +32838 -0
  207. rapidfem-0.2.1/tests/meshes/stepped_medium.msh +11830 -0
  208. rapidfem-0.2.1/tests/meshes/two_iris_coarse.msh +5484 -0
  209. rapidfem-0.2.1/tests/meshes/two_iris_fine.msh +42324 -0
  210. rapidfem-0.2.1/tests/meshes/two_iris_medium.msh +17812 -0
  211. rapidfem-0.2.1/tests/meshes/wg_50k_100k.msh +85675 -0
  212. rapidfem-0.2.1/tests/meshes/wg_50k_50k.msh +29260 -0
  213. rapidfem-0.2.1/tests/meshes/wg_large.msh +2420 -0
  214. rapidfem-0.2.1/tests/meshes/wg_medium.msh +1693 -0
  215. rapidfem-0.2.1/tests/meshes/wg_small.msh +1693 -0
  216. rapidfem-0.2.1/tests/meshes/wg_tiny.msh +1693 -0
  217. rapidfem-0.2.1/tests/meshes/wg_xlarge.msh +5215 -0
  218. rapidfem-0.2.1/tests/meshes/wr90_pml.msh +4601 -0
  219. rapidfem-0.2.1/tests/meshes/wr90_straight.msh +1532 -0
  220. rapidfem-0.2.1/tests/pardiso_test.rs +44 -0
  221. rapidfem-0.2.1/tests/tet_assembly_test.rs +39 -0
  222. rapidfem-0.2.1/tests/tri_assembly_test.rs +96 -0
  223. rapidfem-0.2.1/tests/waveguide_test.rs +82 -0
@@ -0,0 +1,61 @@
1
+ name: Deploy static demo
2
+
3
+ # Builds the SvelteKit frontend with VITE_STATIC_MODE=1 and deploys it
4
+ # to GitHub Pages (fem.rapidpassives.org).
5
+ #
6
+ # The example outputs in `python/python_src/rapidfem/ui/frontend-src/static/demo/`
7
+ # are pre-baked LOCALLY by `python scripts/bake_demo.py` and checked
8
+ # into git, so CI never has to run gmsh + the FEM solver.
9
+ # Re-bake locally + commit whenever an example changes.
10
+
11
+ on:
12
+ push:
13
+ branches: [master]
14
+ workflow_dispatch:
15
+
16
+ concurrency:
17
+ group: deploy-static-demo
18
+ cancel-in-progress: false
19
+
20
+ permissions:
21
+ contents: read
22
+ pages: write
23
+ id-token: write
24
+
25
+ jobs:
26
+ build:
27
+ name: Build frontend
28
+ runs-on: ubuntu-latest
29
+ steps:
30
+ - uses: actions/checkout@v4
31
+
32
+ - name: Set up Node
33
+ uses: actions/setup-node@v4
34
+ with:
35
+ node-version: '20'
36
+ cache: 'npm'
37
+ cache-dependency-path: python/python_src/rapidfem/ui/frontend-src/package-lock.json
38
+
39
+ - name: Install frontend deps + build (static mode)
40
+ working-directory: python/python_src/rapidfem/ui/frontend-src
41
+ env:
42
+ VITE_STATIC_MODE: '1'
43
+ run: |
44
+ npm ci
45
+ npm run build
46
+
47
+ - name: Upload Pages artifact
48
+ uses: actions/upload-pages-artifact@v3
49
+ with:
50
+ path: python/python_src/rapidfem/ui/frontend/dist
51
+
52
+ deploy:
53
+ name: Deploy to GitHub Pages
54
+ needs: build
55
+ runs-on: ubuntu-latest
56
+ environment:
57
+ name: github-pages
58
+ url: ${{ steps.deployment.outputs.page_url }}
59
+ steps:
60
+ - id: deployment
61
+ uses: actions/deploy-pages@v4
@@ -0,0 +1,150 @@
1
+ name: Build wheels
2
+
3
+ on:
4
+ push:
5
+ tags: ['v*']
6
+ release:
7
+ types: [published]
8
+ workflow_dispatch:
9
+
10
+ permissions:
11
+ contents: read
12
+
13
+ jobs:
14
+ build-frontend:
15
+ name: Build SvelteKit frontend
16
+ runs-on: ubuntu-latest
17
+ steps:
18
+ - uses: actions/checkout@v4
19
+ - uses: actions/setup-node@v4
20
+ with:
21
+ node-version: '20'
22
+ cache: 'npm'
23
+ cache-dependency-path: python/python_src/rapidfem/ui/frontend-src/package-lock.json
24
+ - name: Install + build frontend
25
+ working-directory: python/python_src/rapidfem/ui/frontend-src
26
+ run: |
27
+ npm ci
28
+ npm run build
29
+ - name: Upload frontend dist
30
+ uses: actions/upload-artifact@v4
31
+ with:
32
+ name: frontend-dist
33
+ path: python/python_src/rapidfem/ui/frontend/dist
34
+ if-no-files-found: error
35
+
36
+ build-wheels:
37
+ name: Wheels — ${{ matrix.os }} / py${{ matrix.python-version }}
38
+ needs: build-frontend
39
+ runs-on: ${{ matrix.os }}
40
+ strategy:
41
+ fail-fast: false
42
+ matrix:
43
+ os: [ubuntu-latest, windows-latest, macos-latest]
44
+ python-version: ['3.10'] # abi3 wheel covers >=3.10
45
+ steps:
46
+ - uses: actions/checkout@v4
47
+
48
+ - uses: actions/setup-python@v5
49
+ with:
50
+ python-version: ${{ matrix.python-version }}
51
+
52
+ - name: Download frontend dist
53
+ uses: actions/download-artifact@v4
54
+ with:
55
+ name: frontend-dist
56
+ path: python/python_src/rapidfem/ui/frontend/dist
57
+
58
+ - name: Install Rust toolchain
59
+ uses: dtolnay/rust-toolchain@stable
60
+
61
+ - name: Cache cargo registry + target
62
+ uses: actions/cache@v4
63
+ with:
64
+ path: |
65
+ ~/.cargo/registry
66
+ ~/.cargo/git
67
+ target
68
+ key: ${{ runner.os }}-cargo-${{ hashFiles('Cargo.lock', 'python/Cargo.toml') }}
69
+
70
+ # Stage repo-root README into python/ so maturin can pack it.
71
+ # pyproject's readme path is relative to pyproject; maturin sdist refuses
72
+ # `..` segments, so we copy instead of referencing the parent.
73
+ - name: Stage README into package dir
74
+ shell: bash
75
+ run: cp README.md python/README.md
76
+
77
+ # `pip install --upgrade pip` fails on Windows (pip.exe can't replace
78
+ # itself while running). `python -m pip` works on every platform.
79
+ - name: Install maturin
80
+ run: python -m pip install --upgrade pip maturin
81
+
82
+ - name: Build wheel (abi3)
83
+ working-directory: python
84
+ run: maturin build --release --strip --out dist
85
+
86
+ - name: Upload wheel
87
+ uses: actions/upload-artifact@v4
88
+ with:
89
+ name: wheel-${{ matrix.os }}
90
+ path: python/dist/*.whl
91
+ if-no-files-found: error
92
+
93
+ build-sdist:
94
+ name: Source distribution
95
+ needs: build-frontend
96
+ runs-on: ubuntu-latest
97
+ steps:
98
+ - uses: actions/checkout@v4
99
+ - uses: actions/setup-python@v5
100
+ with:
101
+ python-version: '3.11'
102
+ - name: Download frontend dist
103
+ uses: actions/download-artifact@v4
104
+ with:
105
+ name: frontend-dist
106
+ path: python/python_src/rapidfem/ui/frontend/dist
107
+ - name: Stage README into package dir
108
+ run: cp README.md python/README.md
109
+ - run: python -m pip install --upgrade pip maturin
110
+ - name: Build sdist
111
+ working-directory: python
112
+ run: maturin sdist --out dist
113
+ - uses: actions/upload-artifact@v4
114
+ with:
115
+ name: sdist
116
+ path: python/dist/*.tar.gz
117
+ if-no-files-found: error
118
+
119
+ publish-pypi:
120
+ name: Publish to PyPI
121
+ needs: [build-wheels, build-sdist]
122
+ # Only fires on a published GitHub Release (any semver — major / minor /
123
+ # patch). Bare `v*` tag pushes still build artifacts but do not publish,
124
+ # so accidental test tags can't reach PyPI.
125
+ if: github.event_name == 'release' && github.event.action == 'published'
126
+ runs-on: ubuntu-latest
127
+ environment:
128
+ name: pypi
129
+ url: https://pypi.org/p/rapidfem
130
+ permissions:
131
+ id-token: write # OIDC token for PyPI Trusted Publishing
132
+ steps:
133
+ - name: Download all wheels + sdist
134
+ uses: actions/download-artifact@v4
135
+ with:
136
+ path: dist
137
+ pattern: 'wheel-*'
138
+ merge-multiple: true
139
+
140
+ - name: Download sdist
141
+ uses: actions/download-artifact@v4
142
+ with:
143
+ name: sdist
144
+ path: dist
145
+
146
+ - name: Publish to PyPI
147
+ uses: pypa/gh-action-pypi-publish@release/v1
148
+ with:
149
+ packages-dir: dist
150
+ skip-existing: true
@@ -0,0 +1,47 @@
1
+ /target
2
+
3
+ # Solver outputs
4
+ tests/**/*.vtk
5
+ tests/**/*.csv
6
+ tests/**/*.png
7
+ tests/**/*.s1p
8
+ tests/**/*.s2p
9
+ tests/**/*.snp
10
+ tests/output_*
11
+
12
+ # Adaptive refinement size fields
13
+ tests/meshes/*_size.pos
14
+
15
+ # Python
16
+ __pycache__/
17
+ *.pyc
18
+ *.pyd
19
+ *.pdb
20
+ *.so
21
+ *.dylib
22
+ python/target/
23
+ python/python_src/rapidfem/_native.*
24
+ python/python_src/rapidfem/rapidfem.*
25
+ python/dist/
26
+ python/*.egg-info/
27
+ # Staged at build time from the repo root by CI / build scripts.
28
+ python/README.md
29
+ .maturin/
30
+
31
+ # Frontend build output (locally built; in CI built fresh into the wheel)
32
+ python/python_src/rapidfem/ui/frontend/dist/
33
+ python/python_src/rapidfem/ui/frontend-src/node_modules/
34
+ python/python_src/rapidfem/ui/frontend-src/.svelte-kit/
35
+ python/python_src/rapidfem/ui/frontend-src/build/
36
+
37
+ # Stray workdir leftovers — when `rapidfem serve` is started from this
38
+ # repo root, opening any bundled example copies it here. Not real source.
39
+ /coax_step*.py
40
+ /iris_filter*.py
41
+ /patch_antenna*.py
42
+ /wr90*.py
43
+ /microstrip*.py
44
+ /welcome.py
45
+
46
+ # Static demo bake artefacts (regenerated locally by scripts/bake_demo.py
47
+ # and committed to git, so CI can deploy without re-running FEM solves)