ember-cfd 0.1.0__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 (260) hide show
  1. ember_cfd-0.1.0/.flake8 +2 -0
  2. ember_cfd-0.1.0/.github/workflows/ci.yml +101 -0
  3. ember_cfd-0.1.0/.github/workflows/publish.yml +64 -0
  4. ember_cfd-0.1.0/.gitignore +65 -0
  5. ember_cfd-0.1.0/.pre-commit-config.yaml +76 -0
  6. ember_cfd-0.1.0/.python-version +1 -0
  7. ember_cfd-0.1.0/.readthedocs.yaml +24 -0
  8. ember_cfd-0.1.0/COPYING +674 -0
  9. ember_cfd-0.1.0/Makefile +43 -0
  10. ember_cfd-0.1.0/PKG-INFO +152 -0
  11. ember_cfd-0.1.0/README.md +129 -0
  12. ember_cfd-0.1.0/bench/README.md +604 -0
  13. ember_cfd-0.1.0/bench/bench_prod_baseline.py +427 -0
  14. ember_cfd-0.1.0/bench/bench_rep_convergence.py +200 -0
  15. ember_cfd-0.1.0/bench/codegen_gauge.py +226 -0
  16. ember_cfd-0.1.0/bench/irs_arms.py +368 -0
  17. ember_cfd-0.1.0/bench/residual_arms.py +358 -0
  18. ember_cfd-0.1.0/bench/results/bench_all_arms.jsonl +1280 -0
  19. ember_cfd-0.1.0/bench/results/bench_flagsweep_phase2.jsonl +5 -0
  20. ember_cfd-0.1.0/bench/results/bench_flagsweep_serial.jsonl +5 -0
  21. ember_cfd-0.1.0/bench/results/bench_irs_arms.jsonl +30 -0
  22. ember_cfd-0.1.0/bench/results/bench_irs_bj128.jsonl +20 -0
  23. ember_cfd-0.1.0/bench/results/bench_irs_bj16.jsonl +20 -0
  24. ember_cfd-0.1.0/bench/results/bench_irs_bj32.jsonl +20 -0
  25. ember_cfd-0.1.0/bench/results/bench_irs_bj64.jsonl +20 -0
  26. ember_cfd-0.1.0/bench/results/bench_irs_cumulative.jsonl +64 -0
  27. ember_cfd-0.1.0/bench/results/bench_irs_dirs.jsonl +60 -0
  28. ember_cfd-0.1.0/bench/results/bench_irs_dirs2.jsonl +60 -0
  29. ember_cfd-0.1.0/bench/results/bench_irs_final.jsonl +48 -0
  30. ember_cfd-0.1.0/bench/results/bench_irs_fused.jsonl +32 -0
  31. ember_cfd-0.1.0/bench/results/bench_irs_jacfused.jsonl +60 -0
  32. ember_cfd-0.1.0/bench/results/bench_irs_jacobi.jsonl +48 -0
  33. ember_cfd-0.1.0/bench/results/bench_irs_jk.jsonl +32 -0
  34. ember_cfd-0.1.0/bench/results/bench_irs_jk_w128.jsonl +20 -0
  35. ember_cfd-0.1.0/bench/results/bench_irs_jk_w256.jsonl +20 -0
  36. ember_cfd-0.1.0/bench/results/bench_irs_jk_w32.jsonl +20 -0
  37. ember_cfd-0.1.0/bench/results/bench_irs_njac1.jsonl +24 -0
  38. ember_cfd-0.1.0/bench/results/bench_irs_njac3.jsonl +24 -0
  39. ember_cfd-0.1.0/bench/results/bench_irs_njac4.jsonl +24 -0
  40. ember_cfd-0.1.0/bench/results/bench_irs_noalias.jsonl +60 -0
  41. ember_cfd-0.1.0/bench/results/bench_irs_tb16.jsonl +20 -0
  42. ember_cfd-0.1.0/bench/results/bench_irs_tb4.jsonl +20 -0
  43. ember_cfd-0.1.0/bench/results/bench_irs_transpose.jsonl +32 -0
  44. ember_cfd-0.1.0/bench/results/bench_prod_baseline.jsonl +320 -0
  45. ember_cfd-0.1.0/bench/results/bench_tauq_baseline_1000000.jsonl +80 -0
  46. ember_cfd-0.1.0/bench/results/bench_visc_arms_100000.jsonl +320 -0
  47. ember_cfd-0.1.0/bench/results/bench_visc_arms_1000000.jsonl +320 -0
  48. ember_cfd-0.1.0/bench/results/bench_visc_arms_2000000.jsonl +320 -0
  49. ember_cfd-0.1.0/bench/results/bench_visc_arms_300000.jsonl +320 -0
  50. ember_cfd-0.1.0/bench/results/bench_visc_baseline_100000.jsonl +80 -0
  51. ember_cfd-0.1.0/bench/results/bench_visc_baseline_1000000.jsonl +80 -0
  52. ember_cfd-0.1.0/bench/results/bench_visc_baseline_2000000.jsonl +80 -0
  53. ember_cfd-0.1.0/bench/results/bench_visc_baseline_300000.jsonl +80 -0
  54. ember_cfd-0.1.0/bench/results/bench_visc_pol2_1000000.jsonl +320 -0
  55. ember_cfd-0.1.0/bench/results/bench_viscpair_1000000.jsonl +160 -0
  56. ember_cfd-0.1.0/bench/results/bench_viscpair_serial_1000000.jsonl +20 -0
  57. ember_cfd-0.1.0/bench/results/pre_deadcode/bench_tauq_baseline_1000000.jsonl +80 -0
  58. ember_cfd-0.1.0/bench/results/pre_deadcode/bench_visc_baseline_100000.jsonl +80 -0
  59. ember_cfd-0.1.0/bench/results/pre_deadcode/bench_visc_baseline_1000000.jsonl +80 -0
  60. ember_cfd-0.1.0/bench/results/pre_deadcode/bench_visc_baseline_2000000.jsonl +80 -0
  61. ember_cfd-0.1.0/bench/results/pre_deadcode/bench_visc_baseline_300000.jsonl +80 -0
  62. ember_cfd-0.1.0/bench/run_all_arms.sh +96 -0
  63. ember_cfd-0.1.0/bench/run_flag_sweep.sh +165 -0
  64. ember_cfd-0.1.0/bench/run_prod_baseline.sh +54 -0
  65. ember_cfd-0.1.0/bench/run_visc_baseline.sh +31 -0
  66. ember_cfd-0.1.0/bench/subroutines/perfect.f90 +1 -0
  67. ember_cfd-0.1.0/bench/subroutines/residual_cand.f90 +376 -0
  68. ember_cfd-0.1.0/bench/subroutines/residual_consa.f90 +515 -0
  69. ember_cfd-0.1.0/bench/subroutines/residual_damp_fused.f90 +89 -0
  70. ember_cfd-0.1.0/bench/subroutines/residual_irs_bj.f90 +672 -0
  71. ember_cfd-0.1.0/bench/subroutines/residual_irs_dirs.f90 +269 -0
  72. ember_cfd-0.1.0/bench/subroutines/residual_irs_jacobi.f90 +635 -0
  73. ember_cfd-0.1.0/bench/subroutines/residual_irs_km.f90 +211 -0
  74. ember_cfd-0.1.0/bench/subroutines/residual_irs_noalias.f90 +412 -0
  75. ember_cfd-0.1.0/bench/subroutines/residual_irs_transpose.f90 +302 -0
  76. ember_cfd-0.1.0/bench/subroutines/residual_multall.f90 +590 -0
  77. ember_cfd-0.1.0/bench/subroutines/residual_multall_aos.f90 +570 -0
  78. ember_cfd-0.1.0/bench/subroutines/residual_naive.f90 +307 -0
  79. ember_cfd-0.1.0/bench/subroutines/residual_nodal.f90 +627 -0
  80. ember_cfd-0.1.0/bench/subroutines/residual_prod_soa.f90 +601 -0
  81. ember_cfd-0.1.0/bench/subroutines/residual_rinv.f90 +665 -0
  82. ember_cfd-0.1.0/bench/subroutines/residual_setdamp.f90 +227 -0
  83. ember_cfd-0.1.0/bench/subroutines/residual_setdamp_fix.f90 +373 -0
  84. ember_cfd-0.1.0/bench/subroutines/residual_staged.f90 +935 -0
  85. ember_cfd-0.1.0/bench/subroutines/residual_tiled.f90 +461 -0
  86. ember_cfd-0.1.0/bench/subroutines/viscous_fused.f90 +1561 -0
  87. ember_cfd-0.1.0/bench/subroutines/viscous_tauq_fused.f90 +639 -0
  88. ember_cfd-0.1.0/bench/visc_arms.py +471 -0
  89. ember_cfd-0.1.0/docs/Makefile +12 -0
  90. ember_cfd-0.1.0/docs/_ext/tikz.py +102 -0
  91. ember_cfd-0.1.0/docs/_static/_tikz/cell_indexing_64b0bfa32a6f.svg +463 -0
  92. ember_cfd-0.1.0/docs/_static/_tikz/cell_indexing_6d75a7f863f0.svg +469 -0
  93. ember_cfd-0.1.0/docs/_static/_tikz/cell_indexing_c791f18305c0.svg +471 -0
  94. ember_cfd-0.1.0/docs/_static/_tikz/coordinate_system_5c381a977fe8.svg +88 -0
  95. ember_cfd-0.1.0/docs/_tikz/cell_indexing.tikz +150 -0
  96. ember_cfd-0.1.0/docs/_tikz/coordinate_system.tikz +90 -0
  97. ember_cfd-0.1.0/docs/api/average.rst +7 -0
  98. ember_cfd-0.1.0/docs/api/block.rst +8 -0
  99. ember_cfd-0.1.0/docs/api/convergence_history.rst +6 -0
  100. ember_cfd-0.1.0/docs/api/cut.rst +7 -0
  101. ember_cfd-0.1.0/docs/api/fluid.rst +14 -0
  102. ember_cfd-0.1.0/docs/api/grid.rst +8 -0
  103. ember_cfd-0.1.0/docs/api/patch.rst +107 -0
  104. ember_cfd-0.1.0/docs/api/perturbation.rst +7 -0
  105. ember_cfd-0.1.0/docs/api/solver.rst +6 -0
  106. ember_cfd-0.1.0/docs/conf.py +141 -0
  107. ember_cfd-0.1.0/docs/coordinate_system.rst +149 -0
  108. ember_cfd-0.1.0/docs/dev/plan_irs_traffic.md +649 -0
  109. ember_cfd-0.1.0/docs/dev/plan_nodal_primitives.md +574 -0
  110. ember_cfd-0.1.0/docs/index.rst +41 -0
  111. ember_cfd-0.1.0/docs/install.rst +116 -0
  112. ember_cfd-0.1.0/docs/references.rst +7 -0
  113. ember_cfd-0.1.0/docs/refs.bib +75 -0
  114. ember_cfd-0.1.0/examples/README.txt +10 -0
  115. ember_cfd-0.1.0/examples/plot_block_basics.py +302 -0
  116. ember_cfd-0.1.0/examples/plot_cut_average.py +147 -0
  117. ember_cfd-0.1.0/examples/plot_isentropic_nozzle.py +160 -0
  118. ember_cfd-0.1.0/examples/plot_joule_cycle.py +115 -0
  119. ember_cfd-0.1.0/examples/plot_patches.py +191 -0
  120. ember_cfd-0.1.0/examples/plot_shocked_nozzle.py +208 -0
  121. ember_cfd-0.1.0/holmes_plan.md +227 -0
  122. ember_cfd-0.1.0/pyproject.toml +99 -0
  123. ember_cfd-0.1.0/setup.cfg +4 -0
  124. ember_cfd-0.1.0/setup.py +373 -0
  125. ember_cfd-0.1.0/src/ember/__init__.py +51 -0
  126. ember_cfd-0.1.0/src/ember/_fortran/adapt.f90 +206 -0
  127. ember_cfd-0.1.0/src/ember/_fortran/block.f90 +39 -0
  128. ember_cfd-0.1.0/src/ember/_fortran/distribute.f90 +209 -0
  129. ember_cfd-0.1.0/src/ember/_fortran/filter.f90 +94 -0
  130. ember_cfd-0.1.0/src/ember/_fortran/fluid_perfect.f90 +50 -0
  131. ember_cfd-0.1.0/src/ember/_fortran/geometry.f90 +285 -0
  132. ember_cfd-0.1.0/src/ember/_fortran/indexing.f90 +86 -0
  133. ember_cfd-0.1.0/src/ember/_fortran/inline_info.txt +0 -0
  134. ember_cfd-0.1.0/src/ember/_fortran/interpolate.f90 +291 -0
  135. ember_cfd-0.1.0/src/ember/_fortran/matvec.f90 +262 -0
  136. ember_cfd-0.1.0/src/ember/_fortran/mixing.f90 +234 -0
  137. ember_cfd-0.1.0/src/ember/_fortran/multigrid.f90 +36 -0
  138. ember_cfd-0.1.0/src/ember/_fortran/nonreflecting.f90 +184 -0
  139. ember_cfd-0.1.0/src/ember/_fortran/perturbation.f90 +362 -0
  140. ember_cfd-0.1.0/src/ember/_fortran/polar.f90 +52 -0
  141. ember_cfd-0.1.0/src/ember/_fortran/primitive.f90 +62 -0
  142. ember_cfd-0.1.0/src/ember/_fortran/residual.f90 +1497 -0
  143. ember_cfd-0.1.0/src/ember/_fortran/scree.f90 +876 -0
  144. ember_cfd-0.1.0/src/ember/_fortran/smooth_const.f90 +215 -0
  145. ember_cfd-0.1.0/src/ember/_fortran/viscous.f90 +885 -0
  146. ember_cfd-0.1.0/src/ember/_version.py +24 -0
  147. ember_cfd-0.1.0/src/ember/average.py +440 -0
  148. ember_cfd-0.1.0/src/ember/basepatch.py +1067 -0
  149. ember_cfd-0.1.0/src/ember/block.py +3110 -0
  150. ember_cfd-0.1.0/src/ember/block_restart.py +187 -0
  151. ember_cfd-0.1.0/src/ember/block_util.py +551 -0
  152. ember_cfd-0.1.0/src/ember/cases.py +186 -0
  153. ember_cfd-0.1.0/src/ember/collections.py +809 -0
  154. ember_cfd-0.1.0/src/ember/convergence_history.py +816 -0
  155. ember_cfd-0.1.0/src/ember/cooling.py +81 -0
  156. ember_cfd-0.1.0/src/ember/cusp.py +118 -0
  157. ember_cfd-0.1.0/src/ember/cut.py +1097 -0
  158. ember_cfd-0.1.0/src/ember/fluid.py +1249 -0
  159. ember_cfd-0.1.0/src/ember/fluxes.py +283 -0
  160. ember_cfd-0.1.0/src/ember/geometry.py +597 -0
  161. ember_cfd-0.1.0/src/ember/grid.py +2537 -0
  162. ember_cfd-0.1.0/src/ember/inlet.py +245 -0
  163. ember_cfd-0.1.0/src/ember/inviscid.py +24 -0
  164. ember_cfd-0.1.0/src/ember/mixing.py +195 -0
  165. ember_cfd-0.1.0/src/ember/mixing_communicator.py +605 -0
  166. ember_cfd-0.1.0/src/ember/mixing_nonreflecting.py +286 -0
  167. ember_cfd-0.1.0/src/ember/nonmatch.py +123 -0
  168. ember_cfd-0.1.0/src/ember/nonmatch_communicator.py +146 -0
  169. ember_cfd-0.1.0/src/ember/nonreflecting.py +1500 -0
  170. ember_cfd-0.1.0/src/ember/outlet.py +651 -0
  171. ember_cfd-0.1.0/src/ember/patch.py +203 -0
  172. ember_cfd-0.1.0/src/ember/periodic.py +94 -0
  173. ember_cfd-0.1.0/src/ember/periodic_communicator.py +216 -0
  174. ember_cfd-0.1.0/src/ember/perturbation.py +956 -0
  175. ember_cfd-0.1.0/src/ember/plot3d.py +378 -0
  176. ember_cfd-0.1.0/src/ember/probe.py +30 -0
  177. ember_cfd-0.1.0/src/ember/rotating.py +68 -0
  178. ember_cfd-0.1.0/src/ember/set_iter.py +651 -0
  179. ember_cfd-0.1.0/src/ember/solver.py +979 -0
  180. ember_cfd-0.1.0/src/ember/struct.py +806 -0
  181. ember_cfd-0.1.0/src/ember/util.py +1771 -0
  182. ember_cfd-0.1.0/src/ember/util_yaml.py +73 -0
  183. ember_cfd-0.1.0/src/ember_cfd.egg-info/PKG-INFO +152 -0
  184. ember_cfd-0.1.0/src/ember_cfd.egg-info/SOURCES.txt +258 -0
  185. ember_cfd-0.1.0/src/ember_cfd.egg-info/dependency_links.txt +1 -0
  186. ember_cfd-0.1.0/src/ember_cfd.egg-info/not-zip-safe +1 -0
  187. ember_cfd-0.1.0/src/ember_cfd.egg-info/requires.txt +4 -0
  188. ember_cfd-0.1.0/src/ember_cfd.egg-info/scm_file_list.json +253 -0
  189. ember_cfd-0.1.0/src/ember_cfd.egg-info/scm_version.json +8 -0
  190. ember_cfd-0.1.0/src/ember_cfd.egg-info/top_level.txt +1 -0
  191. ember_cfd-0.1.0/tests/conftest.py +135 -0
  192. ember_cfd-0.1.0/tests/data/F_body_golden.npz +0 -0
  193. ember_cfd-0.1.0/tests/data/duct.cnv +0 -0
  194. ember_cfd-0.1.0/tests/data/log_duct.txt +5718 -0
  195. ember_cfd-0.1.0/tests/data/residual_golden.npz +0 -0
  196. ember_cfd-0.1.0/tests/data/viscous_phases_golden.npz +0 -0
  197. ember_cfd-0.1.0/tests/nonreflecting_util.py +162 -0
  198. ember_cfd-0.1.0/tests/test_average.py +987 -0
  199. ember_cfd-0.1.0/tests/test_block.py +2824 -0
  200. ember_cfd-0.1.0/tests/test_block_copy_patches.py +331 -0
  201. ember_cfd-0.1.0/tests/test_block_core.py +483 -0
  202. ember_cfd-0.1.0/tests/test_block_i_perk.py +37 -0
  203. ember_cfd-0.1.0/tests/test_block_set_iterative.py +1370 -0
  204. ember_cfd-0.1.0/tests/test_block_util.py +1110 -0
  205. ember_cfd-0.1.0/tests/test_convergence_history.py +546 -0
  206. ember_cfd-0.1.0/tests/test_cut.py +1717 -0
  207. ember_cfd-0.1.0/tests/test_cut_scipy_parity.py +125 -0
  208. ember_cfd-0.1.0/tests/test_fluid.py +590 -0
  209. ember_cfd-0.1.0/tests/test_fluxes.py +256 -0
  210. ember_cfd-0.1.0/tests/test_fmg.py +106 -0
  211. ember_cfd-0.1.0/tests/test_geometry.py +1116 -0
  212. ember_cfd-0.1.0/tests/test_grid.py +1037 -0
  213. ember_cfd-0.1.0/tests/test_grid_connectivity.py +686 -0
  214. ember_cfd-0.1.0/tests/test_grid_resample.py +920 -0
  215. ember_cfd-0.1.0/tests/test_grid_utilities.py +2206 -0
  216. ember_cfd-0.1.0/tests/test_inlet.py +549 -0
  217. ember_cfd-0.1.0/tests/test_inviscid_patch.py +166 -0
  218. ember_cfd-0.1.0/tests/test_io.py +930 -0
  219. ember_cfd-0.1.0/tests/test_irs_fused_damp.py +138 -0
  220. ember_cfd-0.1.0/tests/test_mg_irs.py +330 -0
  221. ember_cfd-0.1.0/tests/test_mixing_integration.py +179 -0
  222. ember_cfd-0.1.0/tests/test_mixing_nonreflecting.py +842 -0
  223. ember_cfd-0.1.0/tests/test_nonmatch_communicator.py +537 -0
  224. ember_cfd-0.1.0/tests/test_nonmatch_patch.py +362 -0
  225. ember_cfd-0.1.0/tests/test_nonreflecting.py +737 -0
  226. ember_cfd-0.1.0/tests/test_operators.py +108 -0
  227. ember_cfd-0.1.0/tests/test_outlet.py +1532 -0
  228. ember_cfd-0.1.0/tests/test_patch.py +4498 -0
  229. ember_cfd-0.1.0/tests/test_periodic_communicator.py +199 -0
  230. ember_cfd-0.1.0/tests/test_perturbation.py +739 -0
  231. ember_cfd-0.1.0/tests/test_polar_source.py +124 -0
  232. ember_cfd-0.1.0/tests/test_probe.py +106 -0
  233. ember_cfd-0.1.0/tests/test_radial_equilibrium.py +185 -0
  234. ember_cfd-0.1.0/tests/test_residual_golden.py +165 -0
  235. ember_cfd-0.1.0/tests/test_run_duct_script.py +33 -0
  236. ember_cfd-0.1.0/tests/test_scree_mg.py +635 -0
  237. ember_cfd-0.1.0/tests/test_set_F_body_golden.py +144 -0
  238. ember_cfd-0.1.0/tests/test_smooth_const.py +433 -0
  239. ember_cfd-0.1.0/tests/test_solver_relaxation.py +338 -0
  240. ember_cfd-0.1.0/tests/test_struct.py +1853 -0
  241. ember_cfd-0.1.0/tests/test_timestep_diffusion.py +166 -0
  242. ember_cfd-0.1.0/tests/test_update_filter.py +127 -0
  243. ember_cfd-0.1.0/tests/test_update_primitive.py +193 -0
  244. ember_cfd-0.1.0/tests/test_util.py +1883 -0
  245. ember_cfd-0.1.0/tests/test_viscous_periodic.py +161 -0
  246. ember_cfd-0.1.0/tests/test_viscous_phases_golden.py +330 -0
  247. ember_cfd-0.1.0/tests/test_wdist.py +316 -0
  248. ember_cfd-0.1.0/tools/build_docs.sh +8 -0
  249. ember_cfd-0.1.0/tools/check_compile.sh +70 -0
  250. ember_cfd-0.1.0/tools/check_dead_code.sh +15 -0
  251. ember_cfd-0.1.0/tools/check_member_order.py +120 -0
  252. ember_cfd-0.1.0/tools/check_no_claude_commit_msg.sh +10 -0
  253. ember_cfd-0.1.0/tools/check_no_typing.sh +26 -0
  254. ember_cfd-0.1.0/tools/check_spec0.py +85 -0
  255. ember_cfd-0.1.0/tools/check_stale_build_artifacts.sh +29 -0
  256. ember_cfd-0.1.0/tools/compile_wilkes.sh +107 -0
  257. ember_cfd-0.1.0/tools/pgo_train.py +71 -0
  258. ember_cfd-0.1.0/tools/run_duct.py +197 -0
  259. ember_cfd-0.1.0/tools/run_throttle.py +183 -0
  260. ember_cfd-0.1.0/uv.lock +2238 -0
@@ -0,0 +1,2 @@
1
+ [flake8]
2
+ extend-ignore = E501
@@ -0,0 +1,101 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [master]
6
+ pull_request:
7
+ # Called by publish.yml so a release tag cannot publish past a red CI.
8
+ workflow_call:
9
+
10
+ jobs:
11
+ test:
12
+ runs-on: ubuntu-latest
13
+ steps:
14
+ - uses: actions/checkout@v4
15
+
16
+ - name: Install build dependencies
17
+ run: sudo apt-get update && sudo apt-get install -y gfortran ninja-build
18
+
19
+ - name: Install uv
20
+ uses: astral-sh/setup-uv@v5
21
+
22
+ - name: Install dependencies
23
+ run: uv sync --no-install-project
24
+
25
+ - name: Build wheel
26
+ run: uv build --wheel
27
+
28
+ - name: Install wheel
29
+ run: uv pip install --no-deps dist/*.whl
30
+
31
+ - name: Test
32
+ run: uv run --no-sync pytest tests
33
+
34
+ - name: Lint
35
+ run: uv run --no-sync ruff check src tests
36
+
37
+ - name: Check SPEC 0 compliance
38
+ run: uv run --no-sync python tools/check_spec0.py
39
+
40
+ build-wheels:
41
+ needs: test
42
+ runs-on: ubuntu-latest
43
+ steps:
44
+ - uses: actions/checkout@v4
45
+ with:
46
+ # setuptools-scm needs full history and tags to compute the version
47
+ fetch-depth: 0
48
+
49
+ - name: Build wheels
50
+ uses: pypa/cibuildwheel@v4.1.0
51
+
52
+ - name: Build sdist
53
+ run: pipx run build --sdist --outdir wheelhouse
54
+
55
+ - uses: actions/upload-artifact@v4
56
+ with:
57
+ name: wheels
58
+ path: |
59
+ wheelhouse/*.whl
60
+ wheelhouse/*.tar.gz
61
+
62
+ verify-install:
63
+ needs: build-wheels
64
+ runs-on: ubuntu-latest
65
+ strategy:
66
+ matrix:
67
+ # Keep in sync with [tool.cibuildwheel] build = "..." in pyproject.toml.
68
+ python-version: ["3.12", "3.13", "3.14"]
69
+ steps:
70
+ - uses: actions/download-artifact@v4
71
+ with:
72
+ name: wheels
73
+ path: wheelhouse
74
+
75
+ - uses: actions/setup-python@v5
76
+ with:
77
+ python-version: ${{ matrix.python-version }}
78
+
79
+ - name: Start local package index
80
+ run: |
81
+ mkdir -p packages
82
+ pipx run --spec pypiserver pypi-server run -p 8080 -a . -P . packages &
83
+ # First run has to install pypiserver into a fresh pipx venv, so
84
+ # poll for readiness instead of assuming a fixed startup delay.
85
+ for i in $(seq 1 30); do
86
+ curl -sf http://localhost:8080/simple/ && break
87
+ sleep 1
88
+ done
89
+ curl -sf http://localhost:8080/simple/
90
+
91
+ - name: Publish wheels to local index
92
+ run: pipx run twine upload --repository-url http://localhost:8080/ -u x -p x wheelhouse/*.whl
93
+
94
+ - name: Install from local index
95
+ run: |
96
+ python -m venv verify-venv
97
+ verify-venv/bin/pip install --index-url http://localhost:8080/simple/ ember-cfd
98
+
99
+ - name: Smoke test the installed wheel
100
+ run: |
101
+ verify-venv/bin/python -c "from ember.fortran import set_residual; print('OK')"
@@ -0,0 +1,64 @@
1
+ name: Publish
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - "v*"
7
+
8
+ jobs:
9
+ ci:
10
+ # Runs test, build-wheels and verify-install so a release tag cannot
11
+ # publish past a red CI or an unverified wheel.
12
+ uses: ./.github/workflows/ci.yml
13
+
14
+ publish-testpypi:
15
+ needs: ci
16
+ runs-on: ubuntu-latest
17
+ environment: testpypi
18
+ permissions:
19
+ id-token: write
20
+ steps:
21
+ - uses: actions/download-artifact@v4
22
+ with:
23
+ name: wheels
24
+ path: wheelhouse
25
+
26
+ - name: Publish to TestPyPI
27
+ uses: pypa/gh-action-pypi-publish@release/v1
28
+ with:
29
+ repository-url: https://test.pypi.org/legacy/
30
+ packages-dir: wheelhouse/
31
+ # Re-running a tag must not fail here just because TestPyPI already
32
+ # holds that version; publish-pypi is gated on this job succeeding.
33
+ skip-existing: true
34
+
35
+ - name: Install from TestPyPI
36
+ run: |
37
+ python -m venv testpypi-venv
38
+ # Dependencies (numpy, h5py, ...) generally aren't published on
39
+ # TestPyPI, so fall back to real PyPI for anything it's missing.
40
+ testpypi-venv/bin/pip install \
41
+ --index-url https://test.pypi.org/simple/ \
42
+ --extra-index-url https://pypi.org/simple/ \
43
+ ember-cfd
44
+
45
+ - name: Smoke test the installed package
46
+ run: |
47
+ testpypi-venv/bin/python -c "from ember.fortran import set_residual; print('OK')"
48
+
49
+ publish-pypi:
50
+ needs: publish-testpypi
51
+ runs-on: ubuntu-latest
52
+ environment: pypi
53
+ permissions:
54
+ id-token: write
55
+ steps:
56
+ - uses: actions/download-artifact@v4
57
+ with:
58
+ name: wheels
59
+ path: wheelhouse
60
+
61
+ - name: Publish to PyPI
62
+ uses: pypa/gh-action-pypi-publish@release/v1
63
+ with:
64
+ packages-dir: wheelhouse/
@@ -0,0 +1,65 @@
1
+ # setuptools-scm generated version file
2
+ src/ember/_version.py
3
+
4
+ # Python-generated files
5
+ __pycache__/
6
+ *.py[oc]
7
+ build/
8
+ dist/
9
+ wheels/
10
+ *.egg-info
11
+ .coverage
12
+
13
+ examples/.ipynb_checkpoints
14
+
15
+ # Virtual environments
16
+ .venv
17
+
18
+ # Claude Code project instructions
19
+ CLAUDE.md
20
+ .claude/
21
+
22
+ *so
23
+ *.mod
24
+
25
+ # Editable install directory
26
+ /ember/
27
+
28
+ # Benchmark scripts
29
+ benchmark_*.py
30
+
31
+ doc/_build/
32
+ doc/_static/
33
+ docs/_build/
34
+
35
+ # sphinx-gallery generated output. plot_*.py examples are cheap and always
36
+ # regenerated, so their output stays ignored. run_*.py examples are expensive
37
+ # (see examples/README.txt) -- their generated output is committed so RTD and
38
+ # other clean-clone builds reuse it via sphinx-gallery's md5 cache instead of
39
+ # re-running the example; run `make docs-full` and `git add` the results
40
+ # after changing a run_*.py example.
41
+ docs/auto_examples/*
42
+ !docs/auto_examples/run_*
43
+ !docs/auto_examples/images
44
+ docs/auto_examples/images/*
45
+ !docs/auto_examples/images/sphx_glr_run_*.png
46
+ !docs/auto_examples/images/thumb
47
+ docs/auto_examples/images/thumb/*
48
+ !docs/auto_examples/images/thumb/sphx_glr_run_*.png
49
+ docs/sg_execution_times.rst
50
+
51
+ *.pkl
52
+ for-reference/
53
+
54
+ # Reference papers, profiler dumps, Fortran sources
55
+ *.pdf
56
+ *.lprof
57
+ *.f
58
+
59
+ # Archived/untracked scratch scripts and study outputs
60
+ archive/
61
+
62
+ matplotlibrc
63
+
64
+ # PGO profile data (EMBER_PGO=generate); regenerate with tools/pgo_train.py
65
+ .pgo/
@@ -0,0 +1,76 @@
1
+ repos:
2
+ - repo: https://github.com/pre-commit/pre-commit-hooks
3
+ rev: v6.0.0
4
+ hooks:
5
+ - id: trailing-whitespace
6
+ - id: end-of-file-fixer
7
+ - id: check-merge-conflict
8
+ - id: check-yaml
9
+ - id: check-toml
10
+ - id: debug-statements
11
+
12
+ - repo: local
13
+ hooks:
14
+ - id: check-fortran
15
+ name: check fortran syntax
16
+ entry: tools/check_compile.sh
17
+ language: script
18
+ # check_compile.sh syntax-checks the whole .f90 set (pass_filenames:
19
+ # false), so run it on every commit -- not only when a .f90 is staged --
20
+ # to catch a latent bad line already in the tree (e.g. an over-length
21
+ # free-form line) on the next commit of any file, not just a .f90 edit.
22
+ always_run: true
23
+ pass_filenames: false
24
+
25
+ - id: check-no-typing
26
+ name: check no type annotations
27
+ entry: tools/check_no_typing.sh
28
+ language: script
29
+ files: ^src/ember/.*\.py$
30
+ pass_filenames: false
31
+
32
+ - id: check-dead-code
33
+ name: check dead code
34
+ entry: tools/check_dead_code.sh
35
+ language: script
36
+ pass_filenames: false
37
+
38
+ - id: check-stale-build-artifacts
39
+ name: check stale build artifacts
40
+ entry: tools/check_stale_build_artifacts.sh
41
+ language: script
42
+ pass_filenames: false
43
+
44
+ - id: check-member-order
45
+ name: check class member order
46
+ entry: uv run python tools/check_member_order.py
47
+ language: system
48
+ files: ^src/ember/.*\.py$
49
+ pass_filenames: true
50
+
51
+ - id: run-tests
52
+ name: run tests
53
+ entry: uv run pytest tests -q --tb=short
54
+ language: system
55
+ pass_filenames: false
56
+ always_run: true
57
+
58
+ - id: build-docs
59
+ name: build docs
60
+ entry: tools/build_docs.sh
61
+ language: script
62
+ files: ^(docs/.*|src/ember/.*\.py)$
63
+ pass_filenames: false
64
+
65
+ - id: no-claude-in-commit-msg
66
+ name: no Claude in commit message
67
+ entry: tools/check_no_claude_commit_msg.sh
68
+ language: script
69
+ stages: [commit-msg]
70
+
71
+ - repo: https://github.com/astral-sh/ruff-pre-commit
72
+ rev: v0.12.8
73
+ hooks:
74
+ - id: ruff-check
75
+ args: [--fix]
76
+ - id: ruff-format
@@ -0,0 +1 @@
1
+ 3.13
@@ -0,0 +1,24 @@
1
+ # Read the Docs configuration file
2
+ # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
3
+
4
+ # Required
5
+ version: 2
6
+
7
+ # Set the OS, Python version, and other tools you might need
8
+ build:
9
+ os: ubuntu-24.04
10
+ tools:
11
+ python: "3.13"
12
+ # gfortran is required to compile the Fortran extension module from
13
+ # source (there are no prebuilt wheels to install here).
14
+ apt_packages:
15
+ - gfortran
16
+ jobs:
17
+ install:
18
+ # dependency-groups support (--group) needs pip>=25.1
19
+ - pip install --upgrade pip
20
+ - pip install --group docs -e .
21
+
22
+ # Build documentation in the "docs/" directory with Sphinx
23
+ sphinx:
24
+ configuration: docs/conf.py