pyflightstream 0.3.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 (193) hide show
  1. {pyflightstream-0.3.0/src/pyflightstream.egg-info → pyflightstream-0.4.0}/PKG-INFO +259 -191
  2. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/README.md +211 -146
  3. pyflightstream-0.4.0/pyproject.toml +300 -0
  4. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/setup.cfg +4 -4
  5. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/__init__.py +95 -79
  6. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/_deprecations.py +6 -19
  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.3.0 → pyflightstream-0.4.0}/src/pyflightstream/cases/cli.py +3 -1
  10. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/cases/matrix.py +897 -747
  11. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/__init__.py +697 -587
  12. pyflightstream-0.4.0/src/pyflightstream/commands/_meta.yaml +45 -0
  13. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/actuators.yaml +170 -167
  14. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/advanced_settings.yaml +140 -140
  15. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/aeroelastic_coupling.yaml +172 -172
  16. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/boundary_conditions.yaml +155 -153
  17. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/coordinate_systems.yaml +104 -102
  18. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/file_io.yaml +6 -0
  19. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/mesh_import_export.yaml +21 -0
  20. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/motion_definitions.yaml +186 -185
  21. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/probe_points.yaml +121 -116
  22. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/runtime_settings.yaml +11 -0
  23. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/script_controls.yaml +42 -39
  24. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/simulation_controls.yaml +1 -0
  25. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/solver_analysis.yaml +12 -4
  26. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/solver_export.yaml +6 -0
  27. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/solver_initialization.yaml +4 -0
  28. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/solver_settings.yaml +128 -126
  29. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/streamlines.yaml +67 -63
  30. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/surface_sections.yaml +153 -145
  31. {pyflightstream-0.3.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.3.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/volume_sections.yaml +153 -148
  34. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/exceptions.py +153 -91
  35. pyflightstream-0.4.0/src/pyflightstream/extras.py +125 -0
  36. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/farfield/__init__.py +167 -24
  37. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/fsi/beam.py +420 -417
  38. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/fsi/centrifugal.py +456 -418
  39. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/fsi/cli.py +206 -206
  40. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/fsi/config.py +416 -316
  41. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/fsi/driver.py +703 -496
  42. pyflightstream-0.4.0/src/pyflightstream/fsi/errors.py +42 -0
  43. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/fsi/kinematics.py +3 -1
  44. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/fsi/loads.py +840 -740
  45. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/fsi/nodes.py +52 -9
  46. pyflightstream-0.4.0/src/pyflightstream/fsi/state.py +401 -0
  47. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/options.py +336 -334
  48. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/overview.py +296 -292
  49. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/post/__init__.py +18 -18
  50. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/probes/__init__.py +480 -453
  51. pyflightstream-0.4.0/src/pyflightstream/probes/errors.py +23 -0
  52. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/probes/geometry.py +297 -283
  53. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/probes/planar.py +479 -477
  54. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/qa/__init__.py +10 -3
  55. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/qa/cli.py +448 -405
  56. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/qa/compat.py +167 -25
  57. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/qa/drift.py +3 -1
  58. pyflightstream-0.4.0/src/pyflightstream/qa/errors.py +21 -0
  59. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/qa/geometry.py +10 -8
  60. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/qa/physics.py +1801 -1784
  61. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/qa/probes.py +32 -4
  62. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/qa/references/PHY-01.yaml +38 -38
  63. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/qa/references/PHY-02.yaml +28 -28
  64. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/qa/references/PHY-05.yaml +29 -29
  65. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/qa/references/PHY-06.yaml +91 -90
  66. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/qa/references/SMI-01.yaml +28 -28
  67. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/qa/references/SMI-02.yaml +28 -28
  68. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/qa/specs.py +1405 -1405
  69. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/reference.py +861 -775
  70. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/results/__init__.py +997 -583
  71. pyflightstream-0.4.0/src/pyflightstream/results/conditions.py +245 -0
  72. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/results/tables.py +49 -45
  73. pyflightstream-0.4.0/src/pyflightstream/run/__init__.py +2026 -0
  74. pyflightstream-0.4.0/src/pyflightstream/script/__init__.py +1029 -0
  75. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/script/entities.py +16 -8
  76. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/script/helpers.py +1403 -1262
  77. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/script/solver_setup.py +135 -23
  78. pyflightstream-0.4.0/src/pyflightstream/script/toggles.py +79 -0
  79. pyflightstream-0.4.0/src/pyflightstream/support.py +389 -0
  80. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/testing.py +176 -176
  81. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/versions.py +320 -217
  82. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/workspace/__init__.py +297 -16
  83. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/workspace/inputs.py +534 -532
  84. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/workspace/naming.py +65 -7
  85. {pyflightstream-0.3.0 → pyflightstream-0.4.0/src/pyflightstream.egg-info}/PKG-INFO +259 -191
  86. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream.egg-info/SOURCES.txt +31 -3
  87. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream.egg-info/requires.txt +4 -1
  88. pyflightstream-0.4.0/tests/test_cases.py +327 -0
  89. pyflightstream-0.4.0/tests/test_claim_currency.py +318 -0
  90. pyflightstream-0.4.0/tests/test_clean_room.py +226 -0
  91. pyflightstream-0.4.0/tests/test_command_db.py +705 -0
  92. pyflightstream-0.4.0/tests/test_conditions.py +175 -0
  93. pyflightstream-0.4.0/tests/test_conventions.py +301 -0
  94. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/tests/test_deprecation_deadline.py +211 -142
  95. pyflightstream-0.4.0/tests/test_env_contract.py +190 -0
  96. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/tests/test_error_messages.py +24 -13
  97. pyflightstream-0.4.0/tests/test_evidence_provenance.py +332 -0
  98. pyflightstream-0.4.0/tests/test_examples.py +192 -0
  99. pyflightstream-0.4.0/tests/test_exceptions_catalog.py +579 -0
  100. pyflightstream-0.4.0/tests/test_extras.py +201 -0
  101. pyflightstream-0.4.0/tests/test_farfield.py +553 -0
  102. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/tests/test_fsi_beam.py +117 -117
  103. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/tests/test_fsi_centrifugal.py +175 -108
  104. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/tests/test_fsi_cli.py +80 -80
  105. pyflightstream-0.4.0/tests/test_fsi_config.py +226 -0
  106. pyflightstream-0.4.0/tests/test_fsi_driver.py +679 -0
  107. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/tests/test_fsi_kinematics.py +90 -0
  108. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/tests/test_fsi_loads.py +412 -234
  109. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/tests/test_fsi_sources.py +110 -102
  110. pyflightstream-0.4.0/tests/test_guide_api_names.py +104 -0
  111. pyflightstream-0.4.0/tests/test_guide_currency.py +433 -0
  112. pyflightstream-0.4.0/tests/test_house_style.py +640 -0
  113. pyflightstream-0.4.0/tests/test_kit_drift.py +376 -0
  114. pyflightstream-0.4.0/tests/test_legacy_id_exemption.py +101 -0
  115. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/tests/test_matrix.py +220 -224
  116. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/tests/test_matrix_cli.py +2 -2
  117. pyflightstream-0.4.0/tests/test_matrix_run.py +715 -0
  118. pyflightstream-0.4.0/tests/test_metadata_currency.py +186 -0
  119. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/tests/test_options.py +174 -174
  120. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/tests/test_overview.py +137 -110
  121. pyflightstream-0.4.0/tests/test_plan_checker.py +315 -0
  122. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/tests/test_probes.py +72 -2
  123. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/tests/test_probes_geometry.py +154 -154
  124. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/tests/test_probes_planar.py +2 -2
  125. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/tests/test_public_api.py +180 -173
  126. pyflightstream-0.4.0/tests/test_push_gate.py +980 -0
  127. pyflightstream-0.4.0/tests/test_qa_cli.py +65 -0
  128. pyflightstream-0.4.0/tests/test_qa_compat.py +409 -0
  129. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/tests/test_qa_physics.py +367 -367
  130. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/tests/test_reference.py +148 -144
  131. pyflightstream-0.4.0/tests/test_requirements_index.py +127 -0
  132. pyflightstream-0.4.0/tests/test_results.py +472 -0
  133. pyflightstream-0.4.0/tests/test_run.py +172 -0
  134. pyflightstream-0.4.0/tests/test_run_campaign.py +1752 -0
  135. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/tests/test_run_preproc.py +3 -3
  136. pyflightstream-0.4.0/tests/test_script.py +789 -0
  137. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/tests/test_script_entities.py +22 -22
  138. pyflightstream-0.4.0/tests/test_script_helpers.py +527 -0
  139. pyflightstream-0.4.0/tests/test_skill_invocation.py +80 -0
  140. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/tests/test_solver_setup.py +164 -25
  141. pyflightstream-0.4.0/tests/test_srs_consistency.py +184 -0
  142. pyflightstream-0.4.0/tests/test_support.py +241 -0
  143. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/tests/test_tables.py +83 -25
  144. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/tests/test_testing.py +92 -92
  145. pyflightstream-0.4.0/tests/test_traceability.py +228 -0
  146. pyflightstream-0.4.0/tests/test_version_identity.py +162 -0
  147. pyflightstream-0.4.0/tests/test_versions.py +186 -0
  148. pyflightstream-0.4.0/tests/test_workflow_supply_chain.py +166 -0
  149. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/tests/test_workspace.py +231 -16
  150. pyflightstream-0.4.0/tests/test_write_attestation.py +219 -0
  151. pyflightstream-0.3.0/pyproject.toml +0 -105
  152. pyflightstream-0.3.0/src/pyflightstream/cases/__init__.py +0 -332
  153. pyflightstream-0.3.0/src/pyflightstream/cases/matrix_legacy.py +0 -40
  154. pyflightstream-0.3.0/src/pyflightstream/commands/_meta.yaml +0 -18
  155. pyflightstream-0.3.0/src/pyflightstream/commands/unsteady_solver.yaml +0 -68
  156. pyflightstream-0.3.0/src/pyflightstream/files/__init__.py +0 -31
  157. pyflightstream-0.3.0/src/pyflightstream/fsi/state.py +0 -194
  158. pyflightstream-0.3.0/src/pyflightstream/run/__init__.py +0 -1009
  159. pyflightstream-0.3.0/src/pyflightstream/script/__init__.py +0 -574
  160. pyflightstream-0.3.0/tests/test_cases.py +0 -104
  161. pyflightstream-0.3.0/tests/test_command_db.py +0 -296
  162. pyflightstream-0.3.0/tests/test_conventions.py +0 -135
  163. pyflightstream-0.3.0/tests/test_exceptions_catalog.py +0 -105
  164. pyflightstream-0.3.0/tests/test_farfield.py +0 -181
  165. pyflightstream-0.3.0/tests/test_fsi_config.py +0 -85
  166. pyflightstream-0.3.0/tests/test_fsi_driver.py +0 -260
  167. pyflightstream-0.3.0/tests/test_house_style.py +0 -54
  168. pyflightstream-0.3.0/tests/test_matrix_run.py +0 -337
  169. pyflightstream-0.3.0/tests/test_metadata_currency.py +0 -77
  170. pyflightstream-0.3.0/tests/test_qa_compat.py +0 -169
  171. pyflightstream-0.3.0/tests/test_results.py +0 -139
  172. pyflightstream-0.3.0/tests/test_run.py +0 -78
  173. pyflightstream-0.3.0/tests/test_run_campaign.py +0 -443
  174. pyflightstream-0.3.0/tests/test_script.py +0 -294
  175. pyflightstream-0.3.0/tests/test_script_helpers.py +0 -257
  176. pyflightstream-0.3.0/tests/test_versions.py +0 -58
  177. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/LICENSE +0 -0
  178. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/ccs_wing_mesh.yaml +0 -0
  179. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/scenes.yaml +0 -0
  180. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/fsi/__init__.py +0 -0
  181. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/post/writers.py +0 -0
  182. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream/workspace/cli.py +0 -0
  183. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream.egg-info/dependency_links.txt +0 -0
  184. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream.egg-info/entry_points.txt +0 -0
  185. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/src/pyflightstream.egg-info/top_level.txt +0 -0
  186. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/tests/test_examples_isolation.py +0 -0
  187. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/tests/test_fsi_wing.py +0 -0
  188. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/tests/test_package_imports.py +0 -0
  189. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/tests/test_post_writers.py +0 -0
  190. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/tests/test_qa_drift.py +0 -0
  191. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/tests/test_qa_geometry.py +0 -0
  192. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/tests/test_qa_probes.py +0 -0
  193. {pyflightstream-0.3.0 → pyflightstream-0.4.0}/tests/test_registry_hygiene.py +0 -0
@@ -1,191 +1,259 @@
1
- Metadata-Version: 2.4
2
- Name: pyflightstream
3
- Version: 0.3.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: sybil; extra == "dev"
38
- Requires-Dist: ruff; extra == "dev"
39
- Requires-Dist: pre-commit; extra == "dev"
40
- Requires-Dist: properdocs; extra == "dev"
41
- Requires-Dist: mkdocs-material; extra == "dev"
42
- Requires-Dist: mkdocs-gen-files; extra == "dev"
43
- Requires-Dist: mkdocs-literate-nav; extra == "dev"
44
- Dynamic: license-file
45
-
46
- # pyflightstream
47
-
48
- [![ci](https://github.com/nevesgeovana/pyflightstream/actions/workflows/ci.yml/badge.svg)](https://github.com/nevesgeovana/pyflightstream/actions/workflows/ci.yml)
49
- [![PyPI](https://img.shields.io/pypi/v/pyflightstream)](https://pypi.org/project/pyflightstream/)
50
- [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.21482925.svg)](https://doi.org/10.5281/zenodo.21482925)
51
-
52
- Version-aware, didactic Python driver for the FlightStream panel-method
53
- solver. Successor of the author's legacy research scripts. MIT licensed.
54
-
55
- Status: v0.2.0 is public on [PyPI](https://pypi.org/project/pyflightstream/)
56
- with the archived release on Zenodo (DOI recorded in CITATION.cff).
57
- Development continues toward v0.3.0; CHANGELOG.md carries the release
58
- history.
59
-
60
- ```
61
- pip install pyflightstream
62
- ```
63
-
64
- A first taste, no solver required (build time is where errors surface):
65
-
66
- ```python
67
- from pyflightstream.commands import CommandNotInVersionError
68
- from pyflightstream.script import Script
69
-
70
- script = Script(version="26.12") # the FlightStream version is explicit input
71
- script.emit("NEW_SIMULATION")
72
- script.emit("IMPORT", "METER", "STL", "wing.stl", clear=True)
73
- script.emit("SOLVER_SET_AOA", 4.0)
74
- script.emit("START_SOLVER")
75
- print(script.render()) # validated ASCII script, ready for the solver
76
-
77
- try:
78
- Script(version="26.0").emit("SOLVER_SET_AOA", 4.0)
79
- except CommandNotInVersionError as error:
80
- print(error) # refused: no recorded evidence for that version
81
- ```
82
-
83
- The worked examples in `examples/` take it from here to executed
84
- polars, campaigns, and coupled aeroelastic runs.
85
-
86
- Optional extras: `[fsi]` (aeroelastic coupling, PyNiteFEA), `[geom]`
87
- (probe-survey geometry gating, trimesh/rtree/scipy), `[plot]`
88
- (matplotlib for the plotting examples).
89
-
90
- ## Why this package
91
-
92
- FlightStream is scripted through an ASCII command file, and the solver
93
- is under active development: the FlightStream team is responsive to
94
- user requests and works with intermediate hotfix builds that
95
- consolidate into stable releases. A fast-moving solver naturally means
96
- a scripting command set that evolves from version to version, faster
97
- than any single document can track. This package makes the
98
- FlightStream version an explicit input: every command it emits is
99
- validated against a per-version command database, and old versions are
100
- only ever added, never dropped, so campaigns stay reproducible across
101
- that evolution.
102
-
103
- Every database entry carries a manual page citation, and its status per
104
- version (documented, verified, broken) can only be promoted by citing a
105
- committed probe report from a licensed machine. Nothing is guessed; the
106
- honest gaps are reported as such.
107
-
108
- ## What ships
109
-
110
- - Command database with per-version evidence and a manual citation on
111
- every entry, browsable offline via `pyflightstream.help()` (including
112
- a manual-coverage section) and as a generated docs site; the
113
- compatibility matrix carries the live counts.
114
- - Validating script builder with curated helpers: phase ordering,
115
- didactic refusals at build time, entity labels (recipes can name
116
- frames, actuators, motions, and boundaries instead of raw indices),
117
- and a solver-setup provenance snapshot recording the effective value
118
- of every solver flag per run.
119
- - Campaign workspace: an input-artifact library (references, solver
120
- presets, boundary groups, geometries, profiles, executables by build
121
- id), a run manifest as the single identity authority, output naming
122
- templates, campaign pre-flight with zero solver time, and resumable
123
- incremental sweeps.
124
- - Runner and parsers: headless execution, anchor-based parsers for the
125
- solver outputs, and a pandas table layer (per-result tables, one wide
126
- row per run, whole-sweep DataFrame straight from the manifest).
127
- - Run-matrix support as a first-class interface: read, convert,
128
- pre-flight, and run the pipe-delimited 15-column matrix format.
129
- - Far-field probe surveys (planar grids, geometry gating, VTK/Tecplot
130
- writers, conservation ledgers on xarray) and an aeroelastic coupling
131
- subpackage (structural beam, coupled driver, replay harness).
132
- - Architecture overview from the live module docstrings via
133
- `pyflightstream.overview()`.
134
- - Predictable surfaces: a declared-options registry
135
- (`pyflightstream.options`), one public exception catalog
136
- (`pyflightstream.exceptions`), test assertions with quantified
137
- reports (`pyflightstream.testing`), and the house conventions
138
- rendered by `help()`.
139
-
140
- ## Command-line tools
141
-
142
- | Tool | Purpose |
143
- |---|---|
144
- | `pyfs-qa` | Tier 2 command-validity probes, Tier 3 physics regression and cross-version drift, status promotion from committed reports |
145
- | `pyfs-workspace` | Initialize the managed campaign workspace tree |
146
- | `pyfs-matrix` | Convert and pre-flight run matrices |
147
- | `pyfs-fsi` | The structural executable of the aeroelastic coupling loop |
148
-
149
- ## Supported FlightStream versions
150
-
151
- Registered: 26.000, 26.100, 26.120 (canonical 26.XXX scheme; the last
152
- digit indexes vendor hotfix builds). The ordered list in
153
- `src/pyflightstream/commands/_meta.yaml` is the only ordering
154
- authority. Evidence is strongest on 26.120 (probed on a licensed
155
- machine); 26.100 is partially backfilled from the manuals; the 26.000
156
- column is honestly empty until probed. The compatibility matrix in the
157
- docs is generated from the database at build time.
158
-
159
- ## What is each folder?
160
-
161
- | Folder | Purpose in plain language |
162
- |---|---|
163
- | `src/pyflightstream/` | The package, one subpackage per pipeline stage (versions, commands, script, results, cases, run, workspace, post, qa, plus fsi, probes, farfield) |
164
- | `src/pyflightstream/commands/` | The command database: what exists in which FlightStream version, with manual page citations |
165
- | `tests/` | Tier 1 tests, runnable anywhere, no FlightStream needed |
166
- | `reports/` | Committed evidence from licensed machines: command validity (compat), physics regression, drift, and research cards |
167
- | `docs/` | Documentation source (ProperDocs); reference pages are generated from the database, never committed |
168
- | `examples/` | Runnable example scripts in percent format |
169
- | `guide/` | LaTeX source of the user guide (the built pdf never enters Git) |
170
- | `deprecated/` | Discontinued public items, grouped here instead of scattered at the top level |
171
- | `.claude/skills/` | Maintenance procedures (version updates, command additions, QA runs, releases) |
172
- | `_private/` | Local only, never committed: FlightStream manuals, executables, research geometry |
173
-
174
- ## Development setup
175
-
176
- ```
177
- pip install -e .[dev,fsi,geom]
178
- pre-commit install
179
- pytest
180
- ```
181
-
182
- Tier 1 (the pytest suite) runs anywhere. Tier 2 (command validity
183
- probes) and Tier 3 (physics regression) require a local FlightStream
184
- license and are documented in CONTRIBUTING.md. The docs build with
185
- `properdocs build --strict`.
186
-
187
- ## License
188
-
189
- MIT. Contributions must be original or MIT-compatible; code derived
190
- from the AGPL pyFlightscript package is not accepted. See
191
- CONTRIBUTING.md.
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.