pyflightstream 0.2.0__tar.gz → 0.4.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 (199) hide show
  1. pyflightstream-0.4.0/PKG-INFO +259 -0
  2. pyflightstream-0.4.0/README.md +211 -0
  3. pyflightstream-0.4.0/pyproject.toml +300 -0
  4. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/setup.cfg +4 -4
  5. pyflightstream-0.4.0/src/pyflightstream/__init__.py +95 -0
  6. pyflightstream-0.4.0/src/pyflightstream/_deprecations.py +108 -0
  7. pyflightstream-0.4.0/src/pyflightstream/_errors.py +63 -0
  8. pyflightstream-0.4.0/src/pyflightstream/cases/__init__.py +544 -0
  9. pyflightstream-0.4.0/src/pyflightstream/cases/cli.py +167 -0
  10. pyflightstream-0.4.0/src/pyflightstream/cases/matrix.py +897 -0
  11. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/__init__.py +697 -544
  12. pyflightstream-0.4.0/src/pyflightstream/commands/_meta.yaml +45 -0
  13. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/actuators.yaml +170 -167
  14. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/advanced_settings.yaml +140 -136
  15. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/aeroelastic_coupling.yaml +172 -172
  16. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/boundary_conditions.yaml +3 -1
  17. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/coordinate_systems.yaml +104 -102
  18. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/file_io.yaml +6 -0
  19. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/mesh_import_export.yaml +21 -0
  20. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/motion_definitions.yaml +186 -185
  21. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/probe_points.yaml +121 -116
  22. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/runtime_settings.yaml +11 -0
  23. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/script_controls.yaml +42 -39
  24. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/simulation_controls.yaml +1 -0
  25. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/solver_analysis.yaml +15 -6
  26. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/solver_export.yaml +6 -0
  27. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/solver_initialization.yaml +4 -0
  28. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/solver_settings.yaml +128 -120
  29. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/streamlines.yaml +67 -63
  30. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/surface_sections.yaml +153 -145
  31. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/sweeper.yaml +121 -115
  32. pyflightstream-0.4.0/src/pyflightstream/commands/unsteady_solver.yaml +135 -0
  33. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/volume_sections.yaml +153 -148
  34. pyflightstream-0.4.0/src/pyflightstream/exceptions.py +153 -0
  35. pyflightstream-0.4.0/src/pyflightstream/extras.py +125 -0
  36. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/farfield/__init__.py +167 -24
  37. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/fsi/__init__.py +57 -57
  38. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/fsi/beam.py +420 -417
  39. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/fsi/centrifugal.py +456 -418
  40. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/fsi/cli.py +206 -206
  41. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/fsi/config.py +416 -316
  42. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/fsi/driver.py +703 -501
  43. pyflightstream-0.4.0/src/pyflightstream/fsi/errors.py +42 -0
  44. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/fsi/kinematics.py +3 -1
  45. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/fsi/loads.py +840 -740
  46. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/fsi/nodes.py +52 -9
  47. pyflightstream-0.4.0/src/pyflightstream/fsi/state.py +401 -0
  48. pyflightstream-0.4.0/src/pyflightstream/options.py +336 -0
  49. pyflightstream-0.4.0/src/pyflightstream/overview.py +296 -0
  50. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/post/__init__.py +18 -18
  51. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/probes/__init__.py +480 -453
  52. pyflightstream-0.4.0/src/pyflightstream/probes/errors.py +23 -0
  53. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/probes/geometry.py +297 -281
  54. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/probes/planar.py +479 -477
  55. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/qa/__init__.py +10 -3
  56. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/qa/cli.py +106 -22
  57. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/qa/compat.py +167 -25
  58. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/qa/drift.py +3 -1
  59. pyflightstream-0.4.0/src/pyflightstream/qa/errors.py +21 -0
  60. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/qa/geometry.py +10 -8
  61. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/qa/physics.py +1801 -1744
  62. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/qa/probes.py +32 -4
  63. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/qa/references/PHY-01.yaml +38 -38
  64. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/qa/references/PHY-02.yaml +28 -28
  65. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/qa/references/PHY-05.yaml +29 -29
  66. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/qa/references/PHY-06.yaml +91 -90
  67. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/qa/references/SMI-01.yaml +28 -28
  68. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/qa/references/SMI-02.yaml +28 -28
  69. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/qa/specs.py +1405 -1405
  70. pyflightstream-0.4.0/src/pyflightstream/reference.py +861 -0
  71. pyflightstream-0.4.0/src/pyflightstream/results/__init__.py +997 -0
  72. pyflightstream-0.4.0/src/pyflightstream/results/conditions.py +245 -0
  73. pyflightstream-0.4.0/src/pyflightstream/results/tables.py +578 -0
  74. pyflightstream-0.4.0/src/pyflightstream/run/__init__.py +2026 -0
  75. pyflightstream-0.4.0/src/pyflightstream/script/__init__.py +1029 -0
  76. pyflightstream-0.4.0/src/pyflightstream/script/entities.py +452 -0
  77. pyflightstream-0.4.0/src/pyflightstream/script/helpers.py +1403 -0
  78. pyflightstream-0.4.0/src/pyflightstream/script/solver_setup.py +553 -0
  79. pyflightstream-0.4.0/src/pyflightstream/script/toggles.py +79 -0
  80. pyflightstream-0.4.0/src/pyflightstream/support.py +389 -0
  81. pyflightstream-0.4.0/src/pyflightstream/testing.py +176 -0
  82. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/versions.py +320 -191
  83. pyflightstream-0.4.0/src/pyflightstream/workspace/__init__.py +834 -0
  84. pyflightstream-0.4.0/src/pyflightstream/workspace/cli.py +60 -0
  85. pyflightstream-0.4.0/src/pyflightstream/workspace/inputs.py +534 -0
  86. pyflightstream-0.4.0/src/pyflightstream/workspace/naming.py +323 -0
  87. pyflightstream-0.4.0/src/pyflightstream.egg-info/PKG-INFO +259 -0
  88. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream.egg-info/SOURCES.txt +63 -5
  89. pyflightstream-0.4.0/src/pyflightstream.egg-info/entry_points.txt +5 -0
  90. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream.egg-info/requires.txt +6 -2
  91. pyflightstream-0.4.0/tests/test_cases.py +327 -0
  92. pyflightstream-0.4.0/tests/test_claim_currency.py +318 -0
  93. pyflightstream-0.4.0/tests/test_clean_room.py +226 -0
  94. pyflightstream-0.4.0/tests/test_command_db.py +705 -0
  95. pyflightstream-0.4.0/tests/test_conditions.py +175 -0
  96. pyflightstream-0.4.0/tests/test_conventions.py +301 -0
  97. pyflightstream-0.4.0/tests/test_deprecation_deadline.py +211 -0
  98. pyflightstream-0.4.0/tests/test_env_contract.py +190 -0
  99. pyflightstream-0.4.0/tests/test_error_messages.py +180 -0
  100. pyflightstream-0.4.0/tests/test_evidence_provenance.py +332 -0
  101. pyflightstream-0.4.0/tests/test_examples.py +192 -0
  102. pyflightstream-0.4.0/tests/test_examples_isolation.py +61 -0
  103. pyflightstream-0.4.0/tests/test_exceptions_catalog.py +579 -0
  104. pyflightstream-0.4.0/tests/test_extras.py +201 -0
  105. pyflightstream-0.4.0/tests/test_farfield.py +553 -0
  106. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/tests/test_fsi_beam.py +117 -117
  107. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/tests/test_fsi_centrifugal.py +175 -108
  108. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/tests/test_fsi_cli.py +80 -80
  109. pyflightstream-0.4.0/tests/test_fsi_config.py +226 -0
  110. pyflightstream-0.4.0/tests/test_fsi_driver.py +679 -0
  111. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/tests/test_fsi_kinematics.py +90 -0
  112. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/tests/test_fsi_loads.py +412 -234
  113. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/tests/test_fsi_sources.py +110 -102
  114. pyflightstream-0.4.0/tests/test_guide_api_names.py +104 -0
  115. pyflightstream-0.4.0/tests/test_guide_currency.py +433 -0
  116. pyflightstream-0.4.0/tests/test_house_style.py +640 -0
  117. pyflightstream-0.4.0/tests/test_kit_drift.py +376 -0
  118. pyflightstream-0.4.0/tests/test_legacy_id_exemption.py +101 -0
  119. pyflightstream-0.4.0/tests/test_matrix.py +220 -0
  120. pyflightstream-0.4.0/tests/test_matrix_cli.py +154 -0
  121. pyflightstream-0.4.0/tests/test_matrix_run.py +715 -0
  122. pyflightstream-0.4.0/tests/test_metadata_currency.py +186 -0
  123. pyflightstream-0.4.0/tests/test_options.py +174 -0
  124. pyflightstream-0.4.0/tests/test_overview.py +137 -0
  125. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/tests/test_package_imports.py +2 -2
  126. pyflightstream-0.4.0/tests/test_plan_checker.py +315 -0
  127. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/tests/test_probes.py +72 -2
  128. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/tests/test_probes_geometry.py +154 -154
  129. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/tests/test_probes_planar.py +2 -2
  130. pyflightstream-0.4.0/tests/test_public_api.py +180 -0
  131. pyflightstream-0.4.0/tests/test_push_gate.py +980 -0
  132. pyflightstream-0.4.0/tests/test_qa_cli.py +65 -0
  133. pyflightstream-0.4.0/tests/test_qa_compat.py +409 -0
  134. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/tests/test_qa_physics.py +367 -329
  135. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/tests/test_reference.py +148 -93
  136. pyflightstream-0.4.0/tests/test_registry_hygiene.py +63 -0
  137. pyflightstream-0.4.0/tests/test_requirements_index.py +127 -0
  138. pyflightstream-0.4.0/tests/test_results.py +472 -0
  139. pyflightstream-0.4.0/tests/test_run.py +172 -0
  140. pyflightstream-0.4.0/tests/test_run_campaign.py +1752 -0
  141. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/tests/test_run_preproc.py +3 -3
  142. pyflightstream-0.4.0/tests/test_script.py +789 -0
  143. pyflightstream-0.4.0/tests/test_script_entities.py +220 -0
  144. pyflightstream-0.4.0/tests/test_script_helpers.py +527 -0
  145. pyflightstream-0.4.0/tests/test_skill_invocation.py +80 -0
  146. pyflightstream-0.4.0/tests/test_solver_setup.py +468 -0
  147. pyflightstream-0.4.0/tests/test_srs_consistency.py +184 -0
  148. pyflightstream-0.4.0/tests/test_support.py +241 -0
  149. pyflightstream-0.4.0/tests/test_tables.py +350 -0
  150. pyflightstream-0.4.0/tests/test_testing.py +92 -0
  151. pyflightstream-0.4.0/tests/test_traceability.py +228 -0
  152. pyflightstream-0.4.0/tests/test_version_identity.py +162 -0
  153. pyflightstream-0.4.0/tests/test_versions.py +186 -0
  154. pyflightstream-0.4.0/tests/test_workflow_supply_chain.py +166 -0
  155. pyflightstream-0.4.0/tests/test_workspace.py +641 -0
  156. pyflightstream-0.4.0/tests/test_write_attestation.py +219 -0
  157. pyflightstream-0.2.0/PKG-INFO +0 -88
  158. pyflightstream-0.2.0/README.md +0 -55
  159. pyflightstream-0.2.0/pyproject.toml +0 -80
  160. pyflightstream-0.2.0/src/pyflightstream/__init__.py +0 -27
  161. pyflightstream-0.2.0/src/pyflightstream/cases/__init__.py +0 -332
  162. pyflightstream-0.2.0/src/pyflightstream/cases/matrix_legacy.py +0 -337
  163. pyflightstream-0.2.0/src/pyflightstream/commands/_meta.yaml +0 -18
  164. pyflightstream-0.2.0/src/pyflightstream/commands/unsteady_solver.yaml +0 -68
  165. pyflightstream-0.2.0/src/pyflightstream/files/__init__.py +0 -375
  166. pyflightstream-0.2.0/src/pyflightstream/fsi/state.py +0 -181
  167. pyflightstream-0.2.0/src/pyflightstream/reference.py +0 -465
  168. pyflightstream-0.2.0/src/pyflightstream/results/__init__.py +0 -547
  169. pyflightstream-0.2.0/src/pyflightstream/run/__init__.py +0 -677
  170. pyflightstream-0.2.0/src/pyflightstream/script/__init__.py +0 -474
  171. pyflightstream-0.2.0/src/pyflightstream/script/helpers.py +0 -844
  172. pyflightstream-0.2.0/src/pyflightstream.egg-info/PKG-INFO +0 -88
  173. pyflightstream-0.2.0/src/pyflightstream.egg-info/entry_points.txt +0 -3
  174. pyflightstream-0.2.0/tests/test_cases.py +0 -104
  175. pyflightstream-0.2.0/tests/test_command_db.py +0 -264
  176. pyflightstream-0.2.0/tests/test_farfield.py +0 -181
  177. pyflightstream-0.2.0/tests/test_files.py +0 -144
  178. pyflightstream-0.2.0/tests/test_fsi_config.py +0 -85
  179. pyflightstream-0.2.0/tests/test_fsi_driver.py +0 -260
  180. pyflightstream-0.2.0/tests/test_house_style.py +0 -54
  181. pyflightstream-0.2.0/tests/test_matrix_legacy.py +0 -106
  182. pyflightstream-0.2.0/tests/test_qa_compat.py +0 -169
  183. pyflightstream-0.2.0/tests/test_results.py +0 -139
  184. pyflightstream-0.2.0/tests/test_run.py +0 -78
  185. pyflightstream-0.2.0/tests/test_run_campaign.py +0 -256
  186. pyflightstream-0.2.0/tests/test_script.py +0 -294
  187. pyflightstream-0.2.0/tests/test_script_helpers.py +0 -251
  188. pyflightstream-0.2.0/tests/test_versions.py +0 -58
  189. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/LICENSE +0 -0
  190. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/ccs_wing_mesh.yaml +0 -0
  191. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/scenes.yaml +0 -0
  192. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/post/writers.py +0 -0
  193. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream.egg-info/dependency_links.txt +0 -0
  194. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream.egg-info/top_level.txt +0 -0
  195. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/tests/test_fsi_wing.py +0 -0
  196. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/tests/test_post_writers.py +0 -0
  197. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/tests/test_qa_drift.py +0 -0
  198. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/tests/test_qa_geometry.py +0 -0
  199. {pyflightstream-0.2.0 → pyflightstream-0.4.0}/tests/test_qa_probes.py +0 -0
@@ -0,0 +1,259 @@
1
+ Metadata-Version: 2.4
2
+ Name: pyflightstream
3
+ Version: 0.4.0
4
+ Summary: Version-aware, didactic Python driver for the FlightStream panel-method solver
5
+ Author: Geovana Neves
6
+ License: MIT
7
+ Project-URL: Repository, https://github.com/nevesgeovana/pyflightstream
8
+ Project-URL: Documentation, https://nevesgeovana.github.io/pyflightstream/
9
+ Project-URL: Changelog, https://github.com/nevesgeovana/pyflightstream/blob/main/CHANGELOG.md
10
+ Project-URL: Issues, https://github.com/nevesgeovana/pyflightstream/issues
11
+ Classifier: Development Status :: 4 - Beta
12
+ Classifier: Intended Audience :: Science/Research
13
+ Classifier: License :: OSI Approved :: MIT License
14
+ Classifier: Operating System :: OS Independent
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Topic :: Scientific/Engineering :: Physics
19
+ Requires-Python: >=3.11
20
+ Description-Content-Type: text/markdown
21
+ License-File: LICENSE
22
+ Requires-Dist: numpy
23
+ Requires-Dist: pandas
24
+ Requires-Dist: pydantic
25
+ Requires-Dist: pyyaml
26
+ Requires-Dist: xarray
27
+ Provides-Extra: plot
28
+ Requires-Dist: matplotlib; extra == "plot"
29
+ Provides-Extra: geom
30
+ Requires-Dist: trimesh; extra == "geom"
31
+ Requires-Dist: rtree; extra == "geom"
32
+ Requires-Dist: scipy; extra == "geom"
33
+ Provides-Extra: fsi
34
+ Requires-Dist: PyNiteFEA>=3.0; extra == "fsi"
35
+ Provides-Extra: dev
36
+ Requires-Dist: pytest; extra == "dev"
37
+ Requires-Dist: packaging; extra == "dev"
38
+ Requires-Dist: pytest-cov; extra == "dev"
39
+ Requires-Dist: mypy; extra == "dev"
40
+ Requires-Dist: sybil; extra == "dev"
41
+ Requires-Dist: ruff==0.15.22; extra == "dev"
42
+ Requires-Dist: pre-commit; extra == "dev"
43
+ Requires-Dist: properdocs; extra == "dev"
44
+ Requires-Dist: mkdocs-material; extra == "dev"
45
+ Requires-Dist: mkdocs-gen-files; extra == "dev"
46
+ Requires-Dist: mkdocs-literate-nav; extra == "dev"
47
+ Dynamic: license-file
48
+
49
+ # pyflightstream
50
+
51
+ [![ci](https://github.com/nevesgeovana/pyflightstream/actions/workflows/ci.yml/badge.svg)](https://github.com/nevesgeovana/pyflightstream/actions/workflows/ci.yml)
52
+ [![PyPI](https://img.shields.io/pypi/v/pyflightstream)](https://pypi.org/project/pyflightstream/)
53
+ [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.21482924.svg)](https://doi.org/10.5281/zenodo.21482924)
54
+
55
+ Version-aware, didactic Python driver for the FlightStream panel-method
56
+ solver. Successor of the author's legacy research scripts. MIT licensed.
57
+
58
+ Status: v0.4.0 is public on [PyPI](https://pypi.org/project/pyflightstream/),
59
+ archived on Zenodo (DOI recorded in CITATION.cff). CHANGELOG.md carries
60
+ the release history.
61
+
62
+ ```
63
+ pip install pyflightstream
64
+ ```
65
+
66
+ A first taste, no solver required (build time is where errors surface):
67
+
68
+ ```python
69
+ from pyflightstream.commands import CommandNotInVersionError
70
+ from pyflightstream.script import Script
71
+
72
+ script = Script(version="26.120") # the FlightStream version is explicit input
73
+ script.emit("NEW_SIMULATION")
74
+ script.emit("IMPORT", "METER", "STL", "wing.stl", clear=True)
75
+ script.emit("SOLVER_SET_AOA", 4.0)
76
+ script.emit("START_SOLVER")
77
+ print(script.render()) # validated ASCII script, ready for the solver
78
+
79
+ try:
80
+ Script(version="26.0").emit("SOLVER_SET_AOA", 4.0)
81
+ except CommandNotInVersionError as error:
82
+ print(error) # refused: no recorded evidence for that version
83
+ ```
84
+
85
+ The worked examples in `examples/` take it from here to executed
86
+ polars, campaign matrices, a static wing deflection, and a Campbell
87
+ diagram. No example runs the coupled loop: it needs a licensed solver in the
88
+ loop, and the rotary case is solver-blocked (`reports/RPT-007`). The
89
+ capability status below says what the FSI subpackage does and does not
90
+ claim.
91
+
92
+ Optional extras: `[fsi]` (aeroelastic coupling, PyNiteFEA), `[geom]`
93
+ (probe-survey geometry gating, trimesh/rtree/scipy), `[plot]`
94
+ (matplotlib for the plotting examples).
95
+
96
+ ## Why this package
97
+
98
+ FlightStream is scripted through an ASCII command file, and the solver
99
+ is under active development: the FlightStream team is responsive to
100
+ user requests and works with intermediate hotfix builds that
101
+ consolidate into stable releases. A fast-moving solver naturally means
102
+ a scripting command set that evolves from version to version, faster
103
+ than any single document can track. This package makes the
104
+ FlightStream version an explicit input: every command it emits is
105
+ validated against a per-version command database, and old versions are
106
+ only ever added, never dropped, so campaigns stay reproducible across
107
+ that evolution.
108
+
109
+ Every database entry carries a manual page citation, and its status per
110
+ version (documented, verified, broken) can only be promoted by citing a
111
+ committed probe report from a licensed machine. Nothing is guessed; the
112
+ honest gaps are reported as such.
113
+
114
+ ## What ships
115
+
116
+ - Command database with per-version evidence and a manual citation on
117
+ every entry, browsable offline via `pyflightstream.help()` (including
118
+ a manual-coverage section) and as a generated docs site; the
119
+ compatibility matrix carries the live counts.
120
+ - Validating script builder with curated helpers: phase ordering,
121
+ didactic refusals at build time, entity labels (recipes can name
122
+ frames, actuators, motions, and boundaries instead of raw indices),
123
+ and a solver-setup provenance snapshot recording the effective value
124
+ of every solver flag per run. A command a probe measured `broken` in
125
+ the target version is refused too, because that one produces a
126
+ complete run with wrong numbers rather than no run at all; the
127
+ waiver that emits it anyway records the report and the reason in the
128
+ manifest.
129
+ - Campaign workspace: an input-artifact library (references, solver
130
+ presets, boundary groups, geometries, profiles, executables by build
131
+ id), a run manifest as the single identity authority, output naming
132
+ templates, campaign pre-flight with zero solver time, and resumable
133
+ incremental sweeps.
134
+ - Runner and parsers: headless execution, anchor-based parsers for the
135
+ solver outputs, and a pandas table layer (per-result tables, one wide
136
+ row per run, whole-sweep DataFrame straight from the manifest).
137
+ - Run-matrix support as a first-class interface: read, convert,
138
+ pre-flight, and run the pipe-delimited 15-column matrix format.
139
+ - Far-field probe surveys (planar grids, geometry gating, VTK/Tecplot
140
+ writers, conservation ledgers on xarray) and an aeroelastic coupling
141
+ subpackage (structural beam, coupled driver, replay harness).
142
+ - Architecture overview from the live module docstrings via
143
+ `pyflightstream.overview()`.
144
+ - Predictable surfaces: a declared-options registry
145
+ (`pyflightstream.options`), one public exception catalog
146
+ (`pyflightstream.exceptions`), test assertions with quantified
147
+ reports (`pyflightstream.testing`), and the house conventions
148
+ rendered by `help()`.
149
+
150
+ ## Capability status
151
+
152
+ Not every subpackage carries the same weight of evidence, and until
153
+ 2026-08-03 nothing said so: an independent review found the feature
154
+ list above reading as one uniform claim, with the aeroelastic
155
+ boundary stated only inside the code. The author's decision of
156
+ 2026-08-03 is that the FSI and probe-survey paths are **experimental**
157
+ behind an explicit boundary rather than release-supported, and this
158
+ table is that boundary.
159
+
160
+ | Capability | Status | Evidence |
161
+ |---|---|---|
162
+ | Command database, script builder, version refusals | supported | tier 1 over every registered version; probe reports under `reports/` |
163
+ | Parsers, tables, run manifest, reconstruction | supported | tier 1 on committed solver fixtures |
164
+ | Campaigns, run matrices, workspace, pre-flight | supported | tier 1 end-to-end with a stub solver |
165
+ | Far-field ledgers and probe surveys | **experimental** | tier 1 on synthetic fields; the licensed far-field acceptance work is deferred, not done |
166
+ | FSI structural beam and modal analysis | **experimental** | tier 1 against analytic beam solutions; `examples/wing_static_deflection.py`, `examples/fsi_campbell_diagram.py` |
167
+ | FSI coupled driver (the four-phase loop) | **experimental** | tier 1 offline replay on archived WP1 fixtures only; never run against a live solver in CI |
168
+ | Rotary two-way coupling | **not validated** | `reports/RPT-007` states two-way rotor FSI is blocked in this build; `docs/srs/roadmap.md` records it in the M6 row; no acceptance evidence exists |
169
+
170
+ Experimental means the interface may change without the deprecation
171
+ window of NFR-20, and that the evidence behind it is narrower than
172
+ the supported rows: replaying archived fixtures shows the machine
173
+ runs, not that its physics is right for a case nobody has measured.
174
+
175
+ ## Command-line tools
176
+
177
+ | Tool | Purpose |
178
+ |---|---|
179
+ | `pyfs-qa` | Tier 2 command-validity probes, Tier 3 physics regression and cross-version drift, status promotion from committed reports |
180
+ | `pyfs-workspace` | Initialize the managed campaign workspace tree |
181
+ | `pyfs-matrix` | Convert and pre-flight run matrices |
182
+ | `pyfs-fsi` | The structural executable of the aeroelastic coupling loop |
183
+
184
+ ## Supported FlightStream versions
185
+
186
+ "Supported" covered four different states, so it is now four named
187
+ values (`pyflightstream.SupportLevel`), every one of them derived from
188
+ the evidence rather than declared:
189
+
190
+ | Version | Vendor name | Support level | What that means here |
191
+ |---|---|---|---|
192
+ | 26.000 | 26.0 | `registered` | Ordered in the registry, no command carries evidence for it, so nothing can be built yet |
193
+ | 26.100 | 26.1 | `documented` | Commands drafted from the manual with page citations, none measured against a running solver |
194
+ | 26.120 | 26.12 | `operational` | Probe evidence from a licensed machine, and the minimal end-to-end workflow builds |
195
+ | 26.121 | 26.12 | `operational` | Hotfix build 1. It inherits the 26.120 records except where a probe on this build overrode them; the compatibility matrix marks every inherited cell and counts them |
196
+
197
+ ```python
198
+ import pyflightstream
199
+
200
+ for row in pyflightstream.support_table():
201
+ print(row.summary)
202
+ ```
203
+
204
+ `operational` is the level that claims a user can get from geometry to
205
+ a loads file, and it is checkable rather than asserted: it holds only
206
+ when `pyflightstream.support.minimal_workflow(version)` builds, which a
207
+ tier 1 test builds for every version reported at that level.
208
+
209
+ Canonical identifiers use the 26.XXX scheme, the last digit indexing
210
+ vendor hotfix builds, so 26.121 is hotfix build 1 of the 26.12 release.
211
+ The vendor ships both 26.120 and 26.121 under the one release name
212
+ "26.12", so that name no longer selects a build and is refused with
213
+ both candidates named; pass the canonical identifier. The ordered list
214
+ in `src/pyflightstream/commands/_meta.yaml` is the only ordering
215
+ authority, and it orders releases, not support: 26.100 is newer than
216
+ 26.000 and both sit below 26.120. Supported versions are only ever
217
+ added, never dropped. The compatibility matrix in the docs is generated
218
+ from the database at build time.
219
+
220
+ ## What is each folder?
221
+
222
+ | Folder | Purpose in plain language |
223
+ |---|---|
224
+ | `src/pyflightstream/` | The package, one subpackage per pipeline stage (versions, commands, script, results, cases, run, workspace, post, qa, plus fsi, probes, farfield) |
225
+ | `src/pyflightstream/commands/` | The command database: what exists in which FlightStream version, with manual page citations |
226
+ | `tests/` | Tier 1 tests, runnable anywhere, no FlightStream needed |
227
+ | `reports/` | Committed evidence from licensed machines: command validity (compat), physics regression, drift, and research cards |
228
+ | `docs/` | Documentation source (ProperDocs); reference pages are generated from the database, never committed |
229
+ | `examples/` | Runnable example scripts in percent format |
230
+ | `guide/` | LaTeX source of the user guide (the built pdf never enters Git) |
231
+ | `deprecated/` | Discontinued public items, grouped here instead of scattered at the top level |
232
+ | `.claude/skills/` | Maintenance procedures (version updates, command additions, QA runs, releases) |
233
+ | `_private/` | Local only, never committed: FlightStream manuals, executables, research geometry, the design documents and the plan ledger |
234
+
235
+ ## Development setup
236
+
237
+ Maintainers: several machine-specific environment variables locate local
238
+ tooling and session state and are not in Git. A fresh clone must set
239
+ them in `.claude/settings.local.json`; `CLAUDE.md` (Session protocol)
240
+ is their single home, lists them, and states what each one does when
241
+ unset. The count is deliberately not repeated here: it lived in two
242
+ places and went stale in this one.
243
+
244
+ ```
245
+ pip install -e .[dev,fsi,geom]
246
+ pre-commit install
247
+ pytest
248
+ ```
249
+
250
+ Tier 1 (the pytest suite) runs anywhere. Tier 2 (command validity
251
+ probes) and Tier 3 (physics regression) require a local FlightStream
252
+ license and are documented in CONTRIBUTING.md. The docs build with
253
+ `properdocs build --strict`.
254
+
255
+ ## License
256
+
257
+ MIT. Contributions must be original or MIT-compatible; code derived
258
+ from the AGPL pyFlightscript package is not accepted. See
259
+ CONTRIBUTING.md.
@@ -0,0 +1,211 @@
1
+ # pyflightstream
2
+
3
+ [![ci](https://github.com/nevesgeovana/pyflightstream/actions/workflows/ci.yml/badge.svg)](https://github.com/nevesgeovana/pyflightstream/actions/workflows/ci.yml)
4
+ [![PyPI](https://img.shields.io/pypi/v/pyflightstream)](https://pypi.org/project/pyflightstream/)
5
+ [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.21482924.svg)](https://doi.org/10.5281/zenodo.21482924)
6
+
7
+ Version-aware, didactic Python driver for the FlightStream panel-method
8
+ solver. Successor of the author's legacy research scripts. MIT licensed.
9
+
10
+ Status: v0.4.0 is public on [PyPI](https://pypi.org/project/pyflightstream/),
11
+ archived on Zenodo (DOI recorded in CITATION.cff). CHANGELOG.md carries
12
+ the release history.
13
+
14
+ ```
15
+ pip install pyflightstream
16
+ ```
17
+
18
+ A first taste, no solver required (build time is where errors surface):
19
+
20
+ ```python
21
+ from pyflightstream.commands import CommandNotInVersionError
22
+ from pyflightstream.script import Script
23
+
24
+ script = Script(version="26.120") # the FlightStream version is explicit input
25
+ script.emit("NEW_SIMULATION")
26
+ script.emit("IMPORT", "METER", "STL", "wing.stl", clear=True)
27
+ script.emit("SOLVER_SET_AOA", 4.0)
28
+ script.emit("START_SOLVER")
29
+ print(script.render()) # validated ASCII script, ready for the solver
30
+
31
+ try:
32
+ Script(version="26.0").emit("SOLVER_SET_AOA", 4.0)
33
+ except CommandNotInVersionError as error:
34
+ print(error) # refused: no recorded evidence for that version
35
+ ```
36
+
37
+ The worked examples in `examples/` take it from here to executed
38
+ polars, campaign matrices, a static wing deflection, and a Campbell
39
+ diagram. No example runs the coupled loop: it needs a licensed solver in the
40
+ loop, and the rotary case is solver-blocked (`reports/RPT-007`). The
41
+ capability status below says what the FSI subpackage does and does not
42
+ claim.
43
+
44
+ Optional extras: `[fsi]` (aeroelastic coupling, PyNiteFEA), `[geom]`
45
+ (probe-survey geometry gating, trimesh/rtree/scipy), `[plot]`
46
+ (matplotlib for the plotting examples).
47
+
48
+ ## Why this package
49
+
50
+ FlightStream is scripted through an ASCII command file, and the solver
51
+ is under active development: the FlightStream team is responsive to
52
+ user requests and works with intermediate hotfix builds that
53
+ consolidate into stable releases. A fast-moving solver naturally means
54
+ a scripting command set that evolves from version to version, faster
55
+ than any single document can track. This package makes the
56
+ FlightStream version an explicit input: every command it emits is
57
+ validated against a per-version command database, and old versions are
58
+ only ever added, never dropped, so campaigns stay reproducible across
59
+ that evolution.
60
+
61
+ Every database entry carries a manual page citation, and its status per
62
+ version (documented, verified, broken) can only be promoted by citing a
63
+ committed probe report from a licensed machine. Nothing is guessed; the
64
+ honest gaps are reported as such.
65
+
66
+ ## What ships
67
+
68
+ - Command database with per-version evidence and a manual citation on
69
+ every entry, browsable offline via `pyflightstream.help()` (including
70
+ a manual-coverage section) and as a generated docs site; the
71
+ compatibility matrix carries the live counts.
72
+ - Validating script builder with curated helpers: phase ordering,
73
+ didactic refusals at build time, entity labels (recipes can name
74
+ frames, actuators, motions, and boundaries instead of raw indices),
75
+ and a solver-setup provenance snapshot recording the effective value
76
+ of every solver flag per run. A command a probe measured `broken` in
77
+ the target version is refused too, because that one produces a
78
+ complete run with wrong numbers rather than no run at all; the
79
+ waiver that emits it anyway records the report and the reason in the
80
+ manifest.
81
+ - Campaign workspace: an input-artifact library (references, solver
82
+ presets, boundary groups, geometries, profiles, executables by build
83
+ id), a run manifest as the single identity authority, output naming
84
+ templates, campaign pre-flight with zero solver time, and resumable
85
+ incremental sweeps.
86
+ - Runner and parsers: headless execution, anchor-based parsers for the
87
+ solver outputs, and a pandas table layer (per-result tables, one wide
88
+ row per run, whole-sweep DataFrame straight from the manifest).
89
+ - Run-matrix support as a first-class interface: read, convert,
90
+ pre-flight, and run the pipe-delimited 15-column matrix format.
91
+ - Far-field probe surveys (planar grids, geometry gating, VTK/Tecplot
92
+ writers, conservation ledgers on xarray) and an aeroelastic coupling
93
+ subpackage (structural beam, coupled driver, replay harness).
94
+ - Architecture overview from the live module docstrings via
95
+ `pyflightstream.overview()`.
96
+ - Predictable surfaces: a declared-options registry
97
+ (`pyflightstream.options`), one public exception catalog
98
+ (`pyflightstream.exceptions`), test assertions with quantified
99
+ reports (`pyflightstream.testing`), and the house conventions
100
+ rendered by `help()`.
101
+
102
+ ## Capability status
103
+
104
+ Not every subpackage carries the same weight of evidence, and until
105
+ 2026-08-03 nothing said so: an independent review found the feature
106
+ list above reading as one uniform claim, with the aeroelastic
107
+ boundary stated only inside the code. The author's decision of
108
+ 2026-08-03 is that the FSI and probe-survey paths are **experimental**
109
+ behind an explicit boundary rather than release-supported, and this
110
+ table is that boundary.
111
+
112
+ | Capability | Status | Evidence |
113
+ |---|---|---|
114
+ | Command database, script builder, version refusals | supported | tier 1 over every registered version; probe reports under `reports/` |
115
+ | Parsers, tables, run manifest, reconstruction | supported | tier 1 on committed solver fixtures |
116
+ | Campaigns, run matrices, workspace, pre-flight | supported | tier 1 end-to-end with a stub solver |
117
+ | Far-field ledgers and probe surveys | **experimental** | tier 1 on synthetic fields; the licensed far-field acceptance work is deferred, not done |
118
+ | FSI structural beam and modal analysis | **experimental** | tier 1 against analytic beam solutions; `examples/wing_static_deflection.py`, `examples/fsi_campbell_diagram.py` |
119
+ | FSI coupled driver (the four-phase loop) | **experimental** | tier 1 offline replay on archived WP1 fixtures only; never run against a live solver in CI |
120
+ | Rotary two-way coupling | **not validated** | `reports/RPT-007` states two-way rotor FSI is blocked in this build; `docs/srs/roadmap.md` records it in the M6 row; no acceptance evidence exists |
121
+
122
+ Experimental means the interface may change without the deprecation
123
+ window of NFR-20, and that the evidence behind it is narrower than
124
+ the supported rows: replaying archived fixtures shows the machine
125
+ runs, not that its physics is right for a case nobody has measured.
126
+
127
+ ## Command-line tools
128
+
129
+ | Tool | Purpose |
130
+ |---|---|
131
+ | `pyfs-qa` | Tier 2 command-validity probes, Tier 3 physics regression and cross-version drift, status promotion from committed reports |
132
+ | `pyfs-workspace` | Initialize the managed campaign workspace tree |
133
+ | `pyfs-matrix` | Convert and pre-flight run matrices |
134
+ | `pyfs-fsi` | The structural executable of the aeroelastic coupling loop |
135
+
136
+ ## Supported FlightStream versions
137
+
138
+ "Supported" covered four different states, so it is now four named
139
+ values (`pyflightstream.SupportLevel`), every one of them derived from
140
+ the evidence rather than declared:
141
+
142
+ | Version | Vendor name | Support level | What that means here |
143
+ |---|---|---|---|
144
+ | 26.000 | 26.0 | `registered` | Ordered in the registry, no command carries evidence for it, so nothing can be built yet |
145
+ | 26.100 | 26.1 | `documented` | Commands drafted from the manual with page citations, none measured against a running solver |
146
+ | 26.120 | 26.12 | `operational` | Probe evidence from a licensed machine, and the minimal end-to-end workflow builds |
147
+ | 26.121 | 26.12 | `operational` | Hotfix build 1. It inherits the 26.120 records except where a probe on this build overrode them; the compatibility matrix marks every inherited cell and counts them |
148
+
149
+ ```python
150
+ import pyflightstream
151
+
152
+ for row in pyflightstream.support_table():
153
+ print(row.summary)
154
+ ```
155
+
156
+ `operational` is the level that claims a user can get from geometry to
157
+ a loads file, and it is checkable rather than asserted: it holds only
158
+ when `pyflightstream.support.minimal_workflow(version)` builds, which a
159
+ tier 1 test builds for every version reported at that level.
160
+
161
+ Canonical identifiers use the 26.XXX scheme, the last digit indexing
162
+ vendor hotfix builds, so 26.121 is hotfix build 1 of the 26.12 release.
163
+ The vendor ships both 26.120 and 26.121 under the one release name
164
+ "26.12", so that name no longer selects a build and is refused with
165
+ both candidates named; pass the canonical identifier. The ordered list
166
+ in `src/pyflightstream/commands/_meta.yaml` is the only ordering
167
+ authority, and it orders releases, not support: 26.100 is newer than
168
+ 26.000 and both sit below 26.120. Supported versions are only ever
169
+ added, never dropped. The compatibility matrix in the docs is generated
170
+ from the database at build time.
171
+
172
+ ## What is each folder?
173
+
174
+ | Folder | Purpose in plain language |
175
+ |---|---|
176
+ | `src/pyflightstream/` | The package, one subpackage per pipeline stage (versions, commands, script, results, cases, run, workspace, post, qa, plus fsi, probes, farfield) |
177
+ | `src/pyflightstream/commands/` | The command database: what exists in which FlightStream version, with manual page citations |
178
+ | `tests/` | Tier 1 tests, runnable anywhere, no FlightStream needed |
179
+ | `reports/` | Committed evidence from licensed machines: command validity (compat), physics regression, drift, and research cards |
180
+ | `docs/` | Documentation source (ProperDocs); reference pages are generated from the database, never committed |
181
+ | `examples/` | Runnable example scripts in percent format |
182
+ | `guide/` | LaTeX source of the user guide (the built pdf never enters Git) |
183
+ | `deprecated/` | Discontinued public items, grouped here instead of scattered at the top level |
184
+ | `.claude/skills/` | Maintenance procedures (version updates, command additions, QA runs, releases) |
185
+ | `_private/` | Local only, never committed: FlightStream manuals, executables, research geometry, the design documents and the plan ledger |
186
+
187
+ ## Development setup
188
+
189
+ Maintainers: several machine-specific environment variables locate local
190
+ tooling and session state and are not in Git. A fresh clone must set
191
+ them in `.claude/settings.local.json`; `CLAUDE.md` (Session protocol)
192
+ is their single home, lists them, and states what each one does when
193
+ unset. The count is deliberately not repeated here: it lived in two
194
+ places and went stale in this one.
195
+
196
+ ```
197
+ pip install -e .[dev,fsi,geom]
198
+ pre-commit install
199
+ pytest
200
+ ```
201
+
202
+ Tier 1 (the pytest suite) runs anywhere. Tier 2 (command validity
203
+ probes) and Tier 3 (physics regression) require a local FlightStream
204
+ license and are documented in CONTRIBUTING.md. The docs build with
205
+ `properdocs build --strict`.
206
+
207
+ ## License
208
+
209
+ MIT. Contributions must be original or MIT-compatible; code derived
210
+ from the AGPL pyFlightscript package is not accepted. See
211
+ CONTRIBUTING.md.