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.
- pyflightstream-0.4.0/PKG-INFO +259 -0
- pyflightstream-0.4.0/README.md +211 -0
- pyflightstream-0.4.0/pyproject.toml +300 -0
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/setup.cfg +4 -4
- pyflightstream-0.4.0/src/pyflightstream/__init__.py +95 -0
- pyflightstream-0.4.0/src/pyflightstream/_deprecations.py +108 -0
- pyflightstream-0.4.0/src/pyflightstream/_errors.py +63 -0
- pyflightstream-0.4.0/src/pyflightstream/cases/__init__.py +544 -0
- pyflightstream-0.4.0/src/pyflightstream/cases/cli.py +167 -0
- pyflightstream-0.4.0/src/pyflightstream/cases/matrix.py +897 -0
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/__init__.py +697 -544
- pyflightstream-0.4.0/src/pyflightstream/commands/_meta.yaml +45 -0
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/actuators.yaml +170 -167
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/advanced_settings.yaml +140 -136
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/aeroelastic_coupling.yaml +172 -172
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/boundary_conditions.yaml +3 -1
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/coordinate_systems.yaml +104 -102
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/file_io.yaml +6 -0
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/mesh_import_export.yaml +21 -0
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/motion_definitions.yaml +186 -185
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/probe_points.yaml +121 -116
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/runtime_settings.yaml +11 -0
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/script_controls.yaml +42 -39
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/simulation_controls.yaml +1 -0
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/solver_analysis.yaml +15 -6
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/solver_export.yaml +6 -0
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/solver_initialization.yaml +4 -0
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/solver_settings.yaml +128 -120
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/streamlines.yaml +67 -63
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/surface_sections.yaml +153 -145
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/sweeper.yaml +121 -115
- pyflightstream-0.4.0/src/pyflightstream/commands/unsteady_solver.yaml +135 -0
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/volume_sections.yaml +153 -148
- pyflightstream-0.4.0/src/pyflightstream/exceptions.py +153 -0
- pyflightstream-0.4.0/src/pyflightstream/extras.py +125 -0
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/farfield/__init__.py +167 -24
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/fsi/__init__.py +57 -57
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/fsi/beam.py +420 -417
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/fsi/centrifugal.py +456 -418
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/fsi/cli.py +206 -206
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/fsi/config.py +416 -316
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/fsi/driver.py +703 -501
- pyflightstream-0.4.0/src/pyflightstream/fsi/errors.py +42 -0
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/fsi/kinematics.py +3 -1
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/fsi/loads.py +840 -740
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/fsi/nodes.py +52 -9
- pyflightstream-0.4.0/src/pyflightstream/fsi/state.py +401 -0
- pyflightstream-0.4.0/src/pyflightstream/options.py +336 -0
- pyflightstream-0.4.0/src/pyflightstream/overview.py +296 -0
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/post/__init__.py +18 -18
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/probes/__init__.py +480 -453
- pyflightstream-0.4.0/src/pyflightstream/probes/errors.py +23 -0
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/probes/geometry.py +297 -281
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/probes/planar.py +479 -477
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/qa/__init__.py +10 -3
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/qa/cli.py +106 -22
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/qa/compat.py +167 -25
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/qa/drift.py +3 -1
- pyflightstream-0.4.0/src/pyflightstream/qa/errors.py +21 -0
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/qa/geometry.py +10 -8
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/qa/physics.py +1801 -1744
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/qa/probes.py +32 -4
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/qa/references/PHY-01.yaml +38 -38
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/qa/references/PHY-02.yaml +28 -28
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/qa/references/PHY-05.yaml +29 -29
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/qa/references/PHY-06.yaml +91 -90
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/qa/references/SMI-01.yaml +28 -28
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/qa/references/SMI-02.yaml +28 -28
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/qa/specs.py +1405 -1405
- pyflightstream-0.4.0/src/pyflightstream/reference.py +861 -0
- pyflightstream-0.4.0/src/pyflightstream/results/__init__.py +997 -0
- pyflightstream-0.4.0/src/pyflightstream/results/conditions.py +245 -0
- pyflightstream-0.4.0/src/pyflightstream/results/tables.py +578 -0
- pyflightstream-0.4.0/src/pyflightstream/run/__init__.py +2026 -0
- pyflightstream-0.4.0/src/pyflightstream/script/__init__.py +1029 -0
- pyflightstream-0.4.0/src/pyflightstream/script/entities.py +452 -0
- pyflightstream-0.4.0/src/pyflightstream/script/helpers.py +1403 -0
- pyflightstream-0.4.0/src/pyflightstream/script/solver_setup.py +553 -0
- pyflightstream-0.4.0/src/pyflightstream/script/toggles.py +79 -0
- pyflightstream-0.4.0/src/pyflightstream/support.py +389 -0
- pyflightstream-0.4.0/src/pyflightstream/testing.py +176 -0
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/versions.py +320 -191
- pyflightstream-0.4.0/src/pyflightstream/workspace/__init__.py +834 -0
- pyflightstream-0.4.0/src/pyflightstream/workspace/cli.py +60 -0
- pyflightstream-0.4.0/src/pyflightstream/workspace/inputs.py +534 -0
- pyflightstream-0.4.0/src/pyflightstream/workspace/naming.py +323 -0
- pyflightstream-0.4.0/src/pyflightstream.egg-info/PKG-INFO +259 -0
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream.egg-info/SOURCES.txt +63 -5
- pyflightstream-0.4.0/src/pyflightstream.egg-info/entry_points.txt +5 -0
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream.egg-info/requires.txt +6 -2
- pyflightstream-0.4.0/tests/test_cases.py +327 -0
- pyflightstream-0.4.0/tests/test_claim_currency.py +318 -0
- pyflightstream-0.4.0/tests/test_clean_room.py +226 -0
- pyflightstream-0.4.0/tests/test_command_db.py +705 -0
- pyflightstream-0.4.0/tests/test_conditions.py +175 -0
- pyflightstream-0.4.0/tests/test_conventions.py +301 -0
- pyflightstream-0.4.0/tests/test_deprecation_deadline.py +211 -0
- pyflightstream-0.4.0/tests/test_env_contract.py +190 -0
- pyflightstream-0.4.0/tests/test_error_messages.py +180 -0
- pyflightstream-0.4.0/tests/test_evidence_provenance.py +332 -0
- pyflightstream-0.4.0/tests/test_examples.py +192 -0
- pyflightstream-0.4.0/tests/test_examples_isolation.py +61 -0
- pyflightstream-0.4.0/tests/test_exceptions_catalog.py +579 -0
- pyflightstream-0.4.0/tests/test_extras.py +201 -0
- pyflightstream-0.4.0/tests/test_farfield.py +553 -0
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/tests/test_fsi_beam.py +117 -117
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/tests/test_fsi_centrifugal.py +175 -108
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/tests/test_fsi_cli.py +80 -80
- pyflightstream-0.4.0/tests/test_fsi_config.py +226 -0
- pyflightstream-0.4.0/tests/test_fsi_driver.py +679 -0
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/tests/test_fsi_kinematics.py +90 -0
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/tests/test_fsi_loads.py +412 -234
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/tests/test_fsi_sources.py +110 -102
- pyflightstream-0.4.0/tests/test_guide_api_names.py +104 -0
- pyflightstream-0.4.0/tests/test_guide_currency.py +433 -0
- pyflightstream-0.4.0/tests/test_house_style.py +640 -0
- pyflightstream-0.4.0/tests/test_kit_drift.py +376 -0
- pyflightstream-0.4.0/tests/test_legacy_id_exemption.py +101 -0
- pyflightstream-0.4.0/tests/test_matrix.py +220 -0
- pyflightstream-0.4.0/tests/test_matrix_cli.py +154 -0
- pyflightstream-0.4.0/tests/test_matrix_run.py +715 -0
- pyflightstream-0.4.0/tests/test_metadata_currency.py +186 -0
- pyflightstream-0.4.0/tests/test_options.py +174 -0
- pyflightstream-0.4.0/tests/test_overview.py +137 -0
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/tests/test_package_imports.py +2 -2
- pyflightstream-0.4.0/tests/test_plan_checker.py +315 -0
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/tests/test_probes.py +72 -2
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/tests/test_probes_geometry.py +154 -154
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/tests/test_probes_planar.py +2 -2
- pyflightstream-0.4.0/tests/test_public_api.py +180 -0
- pyflightstream-0.4.0/tests/test_push_gate.py +980 -0
- pyflightstream-0.4.0/tests/test_qa_cli.py +65 -0
- pyflightstream-0.4.0/tests/test_qa_compat.py +409 -0
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/tests/test_qa_physics.py +367 -329
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/tests/test_reference.py +148 -93
- pyflightstream-0.4.0/tests/test_registry_hygiene.py +63 -0
- pyflightstream-0.4.0/tests/test_requirements_index.py +127 -0
- pyflightstream-0.4.0/tests/test_results.py +472 -0
- pyflightstream-0.4.0/tests/test_run.py +172 -0
- pyflightstream-0.4.0/tests/test_run_campaign.py +1752 -0
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/tests/test_run_preproc.py +3 -3
- pyflightstream-0.4.0/tests/test_script.py +789 -0
- pyflightstream-0.4.0/tests/test_script_entities.py +220 -0
- pyflightstream-0.4.0/tests/test_script_helpers.py +527 -0
- pyflightstream-0.4.0/tests/test_skill_invocation.py +80 -0
- pyflightstream-0.4.0/tests/test_solver_setup.py +468 -0
- pyflightstream-0.4.0/tests/test_srs_consistency.py +184 -0
- pyflightstream-0.4.0/tests/test_support.py +241 -0
- pyflightstream-0.4.0/tests/test_tables.py +350 -0
- pyflightstream-0.4.0/tests/test_testing.py +92 -0
- pyflightstream-0.4.0/tests/test_traceability.py +228 -0
- pyflightstream-0.4.0/tests/test_version_identity.py +162 -0
- pyflightstream-0.4.0/tests/test_versions.py +186 -0
- pyflightstream-0.4.0/tests/test_workflow_supply_chain.py +166 -0
- pyflightstream-0.4.0/tests/test_workspace.py +641 -0
- pyflightstream-0.4.0/tests/test_write_attestation.py +219 -0
- pyflightstream-0.2.0/PKG-INFO +0 -88
- pyflightstream-0.2.0/README.md +0 -55
- pyflightstream-0.2.0/pyproject.toml +0 -80
- pyflightstream-0.2.0/src/pyflightstream/__init__.py +0 -27
- pyflightstream-0.2.0/src/pyflightstream/cases/__init__.py +0 -332
- pyflightstream-0.2.0/src/pyflightstream/cases/matrix_legacy.py +0 -337
- pyflightstream-0.2.0/src/pyflightstream/commands/_meta.yaml +0 -18
- pyflightstream-0.2.0/src/pyflightstream/commands/unsteady_solver.yaml +0 -68
- pyflightstream-0.2.0/src/pyflightstream/files/__init__.py +0 -375
- pyflightstream-0.2.0/src/pyflightstream/fsi/state.py +0 -181
- pyflightstream-0.2.0/src/pyflightstream/reference.py +0 -465
- pyflightstream-0.2.0/src/pyflightstream/results/__init__.py +0 -547
- pyflightstream-0.2.0/src/pyflightstream/run/__init__.py +0 -677
- pyflightstream-0.2.0/src/pyflightstream/script/__init__.py +0 -474
- pyflightstream-0.2.0/src/pyflightstream/script/helpers.py +0 -844
- pyflightstream-0.2.0/src/pyflightstream.egg-info/PKG-INFO +0 -88
- pyflightstream-0.2.0/src/pyflightstream.egg-info/entry_points.txt +0 -3
- pyflightstream-0.2.0/tests/test_cases.py +0 -104
- pyflightstream-0.2.0/tests/test_command_db.py +0 -264
- pyflightstream-0.2.0/tests/test_farfield.py +0 -181
- pyflightstream-0.2.0/tests/test_files.py +0 -144
- pyflightstream-0.2.0/tests/test_fsi_config.py +0 -85
- pyflightstream-0.2.0/tests/test_fsi_driver.py +0 -260
- pyflightstream-0.2.0/tests/test_house_style.py +0 -54
- pyflightstream-0.2.0/tests/test_matrix_legacy.py +0 -106
- pyflightstream-0.2.0/tests/test_qa_compat.py +0 -169
- pyflightstream-0.2.0/tests/test_results.py +0 -139
- pyflightstream-0.2.0/tests/test_run.py +0 -78
- pyflightstream-0.2.0/tests/test_run_campaign.py +0 -256
- pyflightstream-0.2.0/tests/test_script.py +0 -294
- pyflightstream-0.2.0/tests/test_script_helpers.py +0 -251
- pyflightstream-0.2.0/tests/test_versions.py +0 -58
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/LICENSE +0 -0
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/ccs_wing_mesh.yaml +0 -0
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/commands/scenes.yaml +0 -0
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream/post/writers.py +0 -0
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream.egg-info/dependency_links.txt +0 -0
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/src/pyflightstream.egg-info/top_level.txt +0 -0
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/tests/test_fsi_wing.py +0 -0
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/tests/test_post_writers.py +0 -0
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/tests/test_qa_drift.py +0 -0
- {pyflightstream-0.2.0 → pyflightstream-0.4.0}/tests/test_qa_geometry.py +0 -0
- {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
|
+
[](https://github.com/nevesgeovana/pyflightstream/actions/workflows/ci.yml)
|
|
52
|
+
[](https://pypi.org/project/pyflightstream/)
|
|
53
|
+
[](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
|
+
[](https://github.com/nevesgeovana/pyflightstream/actions/workflows/ci.yml)
|
|
4
|
+
[](https://pypi.org/project/pyflightstream/)
|
|
5
|
+
[](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.
|