pyflightstream 0.43.0__tar.gz → 0.44.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.43.0/src/pyflightstream.egg-info → pyflightstream-0.44.0}/PKG-INFO +3 -2
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/pyproject.toml +6 -2
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/_textio.py +11 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/_fsi_external.py +1 -1
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/_matrix_upgrade.py +2 -1
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/_setup_keys.py +1 -1
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/matrix.py +21 -6
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/mesh.py +116 -17
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/pproc.py +13 -2
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/qsteady.py +26 -6
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/settings.py +22 -7
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/setup_surfaces.py +9 -20
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/workflows/_additional.py +4 -4
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/workflows/_clock.py +3 -2
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/workflows/_conventions.py +15 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/workflows/_exports.py +2 -1
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/workflows/_farfield.py +2 -1
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/workflows/_freestream.py +6 -7
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/workflows/_gap_evidence.py +16 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/workflows/_geometry.py +110 -12
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/workflows/_motion.py +8 -2
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/workflows/_pproc.py +2 -1
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/workflows/_probes.py +3 -2
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/workflows/_qsteady_rotor.py +26 -13
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/workflows/_reductions.py +12 -8
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/workflows/_rows.py +11 -4
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/workflows/_skeleton.py +4 -3
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/workflows/_solver_settings.py +12 -4
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/workflows/_steady.py +6 -2
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/workflows/_streamlines.py +2 -1
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/workflows/_timing.py +3 -2
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/workflows/_unsteady.py +2 -1
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/workflows/_vocabulary.py +2 -2
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/commands/unsteady_solver.yaml +5 -4
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/extras.py +1 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/fsi/driver.py +3 -1
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/fsi/external.py +25 -7
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/fsi/loads.py +5 -3
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/post/_admit.py +6 -7
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/post/_condition.py +2 -2
- pyflightstream-0.44.0/src/pyflightstream/post/_noise_products.py +335 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/post/_products_campaign.py +8 -1
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/post/_reduction_stage.py +2 -1
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/post/_rotor_products.py +11 -17
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/post/_sim.py +19 -2
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/post/_tables.py +6 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/post/farfield_products.py +7 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/post/harmonics.py +39 -8
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/post/input_template.py +10 -10
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/post/point_tables.py +14 -6
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/post/products.py +1 -1
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/post/qsteady.py +14 -7
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/post/qsteady_noise.py +27 -7
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/post/rotor_table.py +9 -43
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/post/section_distributions.py +4 -2
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/post/superfile.py +6 -4
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/post/unsteady.py +4 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/post/unsteady_polar.py +0 -11
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/qa/_spec_0400_gap.py +4 -1
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/qa/_spec_0400_gapkit.py +6 -2
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/qa/_spec_ccs_mesh.py +79 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/qa/compat.py +3 -1
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/qa/probes.py +3 -2
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/results/__init__.py +2 -2
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/results/core.py +1 -1
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/results/loads.py +47 -24
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/results/tables.py +280 -88
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/run/_alias.py +54 -2
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/run/_assemble.py +9 -5
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/run/_assessment.py +10 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/run/_batch_exec.py +12 -9
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/run/_batch_plan.py +4 -2
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/run/_batch_run.py +14 -3
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/run/_cli_geometry.py +51 -20
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/run/_cli_mesh.py +19 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/run/_cli_parsers.py +19 -1
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/run/_cli_query.py +2 -12
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/run/_cli_query_history.py +39 -6
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/run/_cli_query_point.py +2 -51
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/run/_continuation_frame.py +2 -1
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/run/_identity.py +13 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/run/_plan.py +127 -4
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/run/_points.py +17 -2
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/run/_rebuild_evidence.py +38 -14
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/run/_rebuild_grouped.py +4 -1
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/run/_sweep.py +17 -2
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/run/_wake_edge_verdict.py +68 -2
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/run/cli.py +61 -1
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/run/collect.py +30 -9
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/run/matrix.py +16 -30
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/script/__init__.py +15 -15
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/script/_build_forms.py +3 -3
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/script/entities.py +49 -22
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/script/motion.py +3 -3
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/script/solver_setup.py +8 -6
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/__init__.py +6 -8
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/_batch_life.py +3 -3
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/_batches.py +3 -2
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/_degenerate.py +7 -4
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/_free_space.py +26 -12
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/_geometry_clean.py +17 -1
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/_geometry_instruction.py +6 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/_geometry_record.py +4 -2
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/_geometry_sidecar.py +3 -2
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/_layout.py +2 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/_matrix_homes.py +1 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/_matrix_phases.py +5 -19
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/_query_files.py +2 -1
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/_query_logs.py +2 -0
- pyflightstream-0.44.0/src/pyflightstream/workspace/_refine/_blocks.py +1064 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/_refine/_level.py +115 -156
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/_refine/_obj.py +80 -10
- pyflightstream-0.44.0/src/pyflightstream/workspace/_refine/_staging.py +135 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/cli.py +60 -3
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/excel_bridge.py +6 -1
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/excel_file.py +2 -4
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/excel_sync.py +2 -4
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/fsi_setup.py +155 -3
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/hpc.py +7 -6
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/ledger.py +9 -6
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/manifest.py +12 -4
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/matrix.py +3 -2
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/naming.py +54 -4
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/setup_standards.py +9 -1
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/sidecars.py +72 -2
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/storage.py +31 -25
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/wake_edges.py +151 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0/src/pyflightstream.egg-info}/PKG-INFO +3 -2
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream.egg-info/SOURCES.txt +4 -1
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream.egg-info/requires.txt +3 -1
- pyflightstream-0.44.0/tools/check_shipped_surface.py +889 -0
- pyflightstream-0.44.0/tools/shipped_surface.conf +134 -0
- pyflightstream-0.43.0/src/pyflightstream/post/_noise_products.py +0 -164
- pyflightstream-0.43.0/src/pyflightstream/workspace/_refine/_blocks.py +0 -559
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/LICENSE +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/README.md +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/setup.cfg +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/__init__.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/_atmosphere.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/_cli.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/_console.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/_decimal.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/_deprecations.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/_digest.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/_errors.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/_expressions.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/_fsi_calibration.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/_fsm.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/_fsm_fresh.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/_lengths.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/_maturity.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/_mesh.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/_progress.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/_retired_names.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/_signature.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/_tokens.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/_yamlflow.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/__init__.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/_ccs.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/_farfield_spec.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/_geometry_emit.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/_geometry_instruction.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/_matrix_layouts.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/_setup_link.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/_skipped_families.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/_sweep_names.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/_unsteady_actions.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/acoustics.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/ccs_fuselage.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/ccs_revolution.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/ccs_wing.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/corrections.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/farfield_inputs.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/field_coverage.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/freestream.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/fsi_workspace.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/naming.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/reference_blocks.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/selection.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/sixdof.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/windows.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/workflows/__init__.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/workflows/_actuator.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/workflows/_batch_actions.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/workflows/_batch_script.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/workflows/_export_first_step.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/workflows/_frames.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/workflows/_names.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/workflows/_registry.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/workflows/_rotor.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/workflows/_row_cells.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/workflows/_sixdof.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/cases/workflows/_wake_length.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/commands/__init__.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/commands/_meta.yaml +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/commands/_schema.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/commands/acoustics.yaml +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/commands/actuators.yaml +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/commands/advanced_settings.yaml +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/commands/aeroelastic_coupling.yaml +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/commands/base_regions.yaml +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/commands/boundary_conditions.yaml +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/commands/cad.yaml +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/commands/cad_create.yaml +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/commands/ccs_fuselage_mesh.yaml +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/commands/ccs_revolve_mesh.yaml +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/commands/ccs_wing_mesh.yaml +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/commands/coordinate_systems.yaml +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/commands/file_io.yaml +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/commands/free_surfaces.yaml +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/commands/inlets_outlets.yaml +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/commands/mesh_import_export.yaml +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/commands/mesh_operations.yaml +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/commands/mesh_unite.yaml +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/commands/mesh_wrapper.yaml +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/commands/motion_definitions.yaml +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/commands/plots.yaml +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/commands/probe_points.yaml +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/commands/runtime_settings.yaml +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/commands/scene_settings.yaml +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/commands/scenes.yaml +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/commands/script_controls.yaml +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/commands/simulation_controls.yaml +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/commands/solver_analysis.yaml +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/commands/solver_contours.yaml +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/commands/solver_export.yaml +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/commands/solver_initialization.yaml +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/commands/solver_settings.yaml +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/commands/stability_toolbox.yaml +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/commands/streamlines.yaml +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/commands/surface_sections.yaml +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/commands/sweeper.yaml +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/commands/transition_trips.yaml +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/commands/volume_sections.yaml +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/exceptions.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/farfield/__init__.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/farfield/balances.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/farfield/fields.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/farfield/quadrature.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/farfield/trefftz.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/fsi/__init__.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/fsi/_direct_morphing.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/fsi/beam.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/fsi/calibration.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/fsi/centrifugal.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/fsi/cli.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/fsi/config.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/fsi/errors.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/fsi/kinematics.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/fsi/materials.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/fsi/nodes.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/fsi/sections.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/fsi/state.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/fsi/wing.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/options.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/overview.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/post/__init__.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/post/_additional.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/post/_field_inputs.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/post/_installed_copies.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/post/_matrix_template.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/post/_rotor_plan.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/post/_settings_product.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/post/_stage.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/post/_structure.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/post/_transfer_functions.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/post/acoustics.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/post/axes.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/post/boundary_layer.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/post/corrections.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/post/custom_polar.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/post/diagnostics.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/post/disc_maps.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/post/equations.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/post/farfield_fields.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/post/field_frames.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/post/glossary.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/post/guides.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/post/inflow_tools.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/post/polar.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/post/probe_fields.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/post/provenance.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/post/reductions.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/post/series.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/post/settings_table.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/post/streamlines.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/post/surfaces.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/post/writers.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/probes/__init__.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/probes/_model.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/probes/errors.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/probes/geometry.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/probes/lattice.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/probes/layouts.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/probes/planar.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/qa/__init__.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/qa/_reanalysis.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/qa/_spec_0400_gapbase.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/qa/_spec_0400_gapedges.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/qa/_spec_26125.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/qa/_spec_catalog_b.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/qa/_spec_ccs_noise.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/qa/_spec_kit.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/qa/_spec_t1.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/qa/cli.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/qa/cost.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/qa/drift.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/qa/errors.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/qa/geometry.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/qa/matrix.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/qa/physics.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/qa/references/PHY-01.yaml +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/qa/references/PHY-02.yaml +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/qa/references/PHY-05.yaml +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/qa/references/PHY-06.yaml +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/qa/references/SMI-01.yaml +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/qa/references/SMI-02.yaml +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/qa/references/pressure-drag/PHY-01.yaml +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/qa/references/pressure-drag/PHY-02.yaml +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/qa/references/pressure-drag/PHY-05.yaml +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/qa/references/pressure-drag/PHY-06.yaml +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/qa/reports.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/qa/specs.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/reference.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/results/conditions.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/results/exports.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/results/log.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/results/native_surface.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/results/sectional_loads.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/results/surface.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/results/wake.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/run/__init__.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/run/_actions_counter.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/run/_additional.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/run/_batch_collect.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/run/_batch_split.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/run/_campaign.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/run/_cli_parsers_storage.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/run/_cli_print.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/run/_collect_logs.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/run/_collect_notes.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/run/_continuation.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/run/_executors.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/run/_field_motion.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/run/_grouped.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/run/_ids.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/run/_mark_converged.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/run/_matrix_warnings.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/run/_pending.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/run/_plan_report.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/run/_rebuild.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/run/_rebuild_summary.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/run/_record_files.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/run/_solver_windows.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/run/_step_exports.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/run/records.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/script/_arg_checks.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/script/_ledger_tables.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/script/_relaxed_te.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/script/_settings.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/script/_surface_averaging.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/script/_wake_edge_file.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/script/helpers.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/script/rotor_vocabulary.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/script/toggles.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/support.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/testing.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/utils/__init__.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/utils/cli.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/utils/database.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/utils/errors.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/utils/manual.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/versions.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/_batch_relocate.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/_effective.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/_geometry_build.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/_geometry_convert.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/_geometry_vtk.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/_ledger_api.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/_ledger_history.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/_links.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/_matrix_binding.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/_missing_log.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/_query_point.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/_refine/__init__.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/_refine/_audit.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/_refine/_config.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/_refine/_geometry.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/_refine/_grid.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/_refine/_periodic.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/_refine/_remesh.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/_refine/_remesh_group.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/_refine/_remesh_pairs.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/_row_setup.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/_script_comparison.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/_settings_file.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/_step_prune.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/_verdicts.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/actuator_profiles.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/builds.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/costs.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/excel.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/fields.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/flight_condition.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/fsi_external_setup.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/inputs.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/migrate.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/record_document.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/selections.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/setup_inspection.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/sixdof_setup.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream/workspace/trailing_edges.py +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream.egg-info/dependency_links.txt +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream.egg-info/entry_points.txt +0 -0
- {pyflightstream-0.43.0 → pyflightstream-0.44.0}/src/pyflightstream.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pyflightstream
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.44.0
|
|
4
4
|
Summary: Version-aware, didactic Python driver for the FlightStream panel-method solver
|
|
5
5
|
Author: Geovana Neves
|
|
6
6
|
License: MIT
|
|
@@ -19,10 +19,11 @@ Requires-Python: >=3.12
|
|
|
19
19
|
Description-Content-Type: text/markdown
|
|
20
20
|
License-File: LICENSE
|
|
21
21
|
Requires-Dist: numpy>=2.2
|
|
22
|
-
Requires-Dist: pandas>=2.3
|
|
23
22
|
Requires-Dist: pydantic>=2
|
|
24
23
|
Requires-Dist: pyyaml
|
|
25
24
|
Requires-Dist: trimesh<6,>=4.12
|
|
25
|
+
Provides-Extra: pandas
|
|
26
|
+
Requires-Dist: pandas>=2.3; extra == "pandas"
|
|
26
27
|
Provides-Extra: plot
|
|
27
28
|
Requires-Dist: matplotlib; extra == "plot"
|
|
28
29
|
Provides-Extra: geom
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "pyflightstream"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.44.0"
|
|
8
8
|
description = "Version-aware, didactic Python driver for the FlightStream panel-method solver"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = {text = "MIT"}
|
|
@@ -75,13 +75,13 @@ classifiers = [
|
|
|
75
75
|
# is written against (field_validator, model_validator).
|
|
76
76
|
dependencies = [
|
|
77
77
|
"numpy>=2.2",
|
|
78
|
-
"pandas>=2.3",
|
|
79
78
|
"pydantic>=2",
|
|
80
79
|
"pyyaml",
|
|
81
80
|
"trimesh>=4.12,<6",
|
|
82
81
|
]
|
|
83
82
|
|
|
84
83
|
[project.optional-dependencies]
|
|
84
|
+
pandas = ["pandas>=2.3"]
|
|
85
85
|
# matplotlib is PSF/BSD-style, MIT-compatible (NFR-02); it backs the
|
|
86
86
|
# plotting examples only, no core code imports it.
|
|
87
87
|
plot = ["matplotlib"]
|
|
@@ -170,6 +170,10 @@ Issues = "https://github.com/nevesgeovana/pyflightstream/issues"
|
|
|
170
170
|
[tool.setuptools.packages.find]
|
|
171
171
|
where = ["src"]
|
|
172
172
|
|
|
173
|
+
# Keep the artifact scanner and its policy available with the distribution.
|
|
174
|
+
[tool.setuptools.data-files]
|
|
175
|
+
"share/pyflightstream/tools" = ["tools/check_shipped_surface.py", "tools/shipped_surface.conf"]
|
|
176
|
+
|
|
173
177
|
[tool.setuptools.package-data]
|
|
174
178
|
"pyflightstream.commands" = ["*.yaml"]
|
|
175
179
|
"pyflightstream.qa" = ["references/*.yaml", "references/pressure-drag/*.yaml"]
|
|
@@ -119,6 +119,17 @@ def append_text(path: str | Path, text: str, *, encoding: str = "utf-8") -> int:
|
|
|
119
119
|
return stream.write(text)
|
|
120
120
|
|
|
121
121
|
|
|
122
|
+
def write_bytes(path: str | Path, data: bytes) -> int:
|
|
123
|
+
"""Replace a complete byte payload atomically through a sibling temporary file.
|
|
124
|
+
|
|
125
|
+
Keep the same permission and symlink policy as :func:`atomic_text`.
|
|
126
|
+
Latin-1 maps each byte to one character; the explicit LF newline policy
|
|
127
|
+
leaves CR, LF and CRLF bytes unchanged, including non-UTF-8 matrix comments.
|
|
128
|
+
"""
|
|
129
|
+
with atomic_text(path, encoding="latin-1") as stream:
|
|
130
|
+
return stream.write(data.decode("latin-1"))
|
|
131
|
+
|
|
132
|
+
|
|
122
133
|
def open_text(
|
|
123
134
|
path: str | Path, mode: str = "w", *, encoding: str = "utf-8", errors: str | None = None
|
|
124
135
|
) -> IO[str]:
|
|
@@ -201,7 +201,7 @@ def wire_external_fsi(
|
|
|
201
201
|
"from pyflightstream.fsi.cli import main\n"
|
|
202
202
|
"raise SystemExit(main(['external', '--out', '.']))\n"
|
|
203
203
|
),
|
|
204
|
-
"fsi-provenance.json": json.dumps(structure.provenance(), indent=2) + "\n",
|
|
204
|
+
"fsi-provenance.json": json.dumps(structure.provenance(portable=True), indent=2) + "\n",
|
|
205
205
|
# FR-1095: the input itself, under the digest the record states for it
|
|
206
206
|
# (the run refuses a source changed after the plan).
|
|
207
207
|
Path(structure.source).name: Path(structure.source).read_bytes(),
|
|
@@ -6,6 +6,7 @@ import re
|
|
|
6
6
|
from collections.abc import Mapping
|
|
7
7
|
from pathlib import Path
|
|
8
8
|
|
|
9
|
+
import pyflightstream._textio as _textio
|
|
9
10
|
from pyflightstream.cases._matrix_layouts import (
|
|
10
11
|
_COLUMNS,
|
|
11
12
|
_LAYOUT_0_9_0,
|
|
@@ -209,5 +210,5 @@ def rewrite_codes(
|
|
|
209
210
|
raise MatrixError(f"{source} holds no matrix content: no line carries a cell separator")
|
|
210
211
|
rewritten = b"".join(rebuilt)
|
|
211
212
|
if in_place:
|
|
212
|
-
|
|
213
|
+
_textio.write_bytes(path, rewritten)
|
|
213
214
|
return rewritten, counts
|
|
@@ -372,7 +372,7 @@ class CustomFlag(BaseModel):
|
|
|
372
372
|
if not self.command:
|
|
373
373
|
raise ValueError(
|
|
374
374
|
f"the flag {self.name!r} names no command; write the FlightStream "
|
|
375
|
-
'command it becomes, bare, as command = "
|
|
375
|
+
'command it becomes, bare, as command = "SET_SIGNIFICANT_DIGITS"'
|
|
376
376
|
)
|
|
377
377
|
if len(self.command.split()) > 1:
|
|
378
378
|
raise ValueError(
|
|
@@ -56,10 +56,11 @@ from collections.abc import Mapping
|
|
|
56
56
|
from dataclasses import dataclass, field
|
|
57
57
|
from pathlib import Path
|
|
58
58
|
|
|
59
|
+
import pyflightstream._textio as _textio
|
|
59
60
|
from pyflightstream._errors import PyflightstreamError as PyflightstreamError
|
|
60
61
|
from pyflightstream._tokens import NOT_APPLICABLE as NOT_APPLICABLE
|
|
62
|
+
from pyflightstream.cases import ROTATION_OFFSET_KEY as ROTATION_OFFSET_KEY
|
|
61
63
|
from pyflightstream.cases import (
|
|
62
|
-
ROTATION_OFFSET_KEY,
|
|
63
64
|
ROTATION_SWEEP_KEY,
|
|
64
65
|
Campaign,
|
|
65
66
|
RawCommand,
|
|
@@ -904,7 +905,7 @@ def _check_one_sweep_per_row(pol: str, sweep: SweepAxis, variables: dict[str, st
|
|
|
904
905
|
|
|
905
906
|
The refusal names the fixed-offset form, because the user asking for
|
|
906
907
|
both almost always wants one rotation held fixed across an alpha
|
|
907
|
-
sweep, which is what ``
|
|
908
|
+
sweep, which is what a single ``ROTATE`` entry's ``ANGLE`` does.
|
|
908
909
|
"""
|
|
909
910
|
rotation = multiplied_sweep(sweep, variables)
|
|
910
911
|
if not rotation:
|
|
@@ -916,7 +917,8 @@ def _check_one_sweep_per_row(pol: str, sweep: SweepAxis, variables: dict[str, st
|
|
|
916
917
|
f"two would multiply into {len(sweep.values) * len(rotation)} runs this row "
|
|
917
918
|
"does not name and whose points cannot "
|
|
918
919
|
"be told apart. A rotation held FIXED across an aerodynamic sweep is written "
|
|
919
|
-
|
|
920
|
+
"ROTATE: {ANGLE: <angle> / AXIS: MRP-Y / ALIAS: <boundary label>}, one angle; "
|
|
921
|
+
"a sweep OF the rotation is a row "
|
|
920
922
|
"of its own with a single-point SWEEP_VALUES."
|
|
921
923
|
)
|
|
922
924
|
|
|
@@ -964,9 +966,22 @@ def _unknown_columns_sentence(header: tuple[str, ...]) -> str:
|
|
|
964
966
|
return "".join(sentences)
|
|
965
967
|
|
|
966
968
|
|
|
969
|
+
def matrix_content_line(line: str) -> bool:
|
|
970
|
+
"""Classify UTF-8 matrix text for both execution and byte-preserving Excel sync.
|
|
971
|
+
|
|
972
|
+
Blank lines, hash comments and rules containing only whitespace, pipes,
|
|
973
|
+
dashes, colons and plus signs carry no cells. All other lines need parsing.
|
|
974
|
+
"""
|
|
975
|
+
stripped = line.strip()
|
|
976
|
+
return bool(stripped) and not stripped.startswith("#") and not set(stripped) <= set("-:+| \t")
|
|
977
|
+
|
|
978
|
+
|
|
967
979
|
def read_matrix(path: str | Path, *, active_only: bool = True) -> list[MatrixRow]:
|
|
968
980
|
"""Read a pipe-delimited ``matrix.fs`` run matrix.
|
|
969
981
|
|
|
982
|
+
Decode strict UTF-8 with an optional BOM. Skip hash comments, blank lines
|
|
983
|
+
and separator rules using the same classifier as Excel sync.
|
|
984
|
+
|
|
970
985
|
Parameters
|
|
971
986
|
----------
|
|
972
987
|
path : str or Path
|
|
@@ -1008,13 +1023,13 @@ def read_matrix(path: str | Path, *, active_only: bool = True) -> list[MatrixRow
|
|
|
1008
1023
|
[('9001', 1)]
|
|
1009
1024
|
"""
|
|
1010
1025
|
try:
|
|
1011
|
-
lines = Path(path).read_text(encoding="utf-8").splitlines()
|
|
1026
|
+
lines = Path(path).read_text(encoding="utf-8-sig").splitlines()
|
|
1012
1027
|
except UnicodeDecodeError as error:
|
|
1013
1028
|
raise MatrixError(
|
|
1014
1029
|
f"{path} is not valid UTF-8 (byte {error.start}); a replaced character would alter "
|
|
1015
1030
|
"a declared input, so save the matrix as UTF-8."
|
|
1016
1031
|
) from None
|
|
1017
|
-
content = [line for line in lines if
|
|
1032
|
+
content = [line for line in lines if matrix_content_line(line)]
|
|
1018
1033
|
if not content:
|
|
1019
1034
|
raise MatrixError(f"{path} holds no matrix content")
|
|
1020
1035
|
header = tuple(cell.strip() for cell in content[0].split("|"))
|
|
@@ -1331,7 +1346,7 @@ def renumber_pols(
|
|
|
1331
1346
|
)
|
|
1332
1347
|
rewritten = b"".join(rebuilt)
|
|
1333
1348
|
if in_place:
|
|
1334
|
-
|
|
1349
|
+
_textio.write_bytes(path, rewritten)
|
|
1335
1350
|
return rewritten
|
|
1336
1351
|
|
|
1337
1352
|
|
|
@@ -7,9 +7,9 @@ how its trailing edges are found; :class:`RawMeshConditions` the boundary
|
|
|
7
7
|
conditions a raw mesh's sidecar declares; and :class:`BaseRegionOperation` and
|
|
8
8
|
:class:`PortBoundary` the base regions and the ports a setup declares.
|
|
9
9
|
|
|
10
|
-
The package root re-exports these models (AD-16). This module imports
|
|
11
|
-
|
|
12
|
-
imports it.
|
|
10
|
+
The package root re-exports these models (AD-16). This module imports the shared
|
|
11
|
+
configuration error from reference_blocks and never the package root;
|
|
12
|
+
:mod:`pyflightstream.cases.settings` imports it.
|
|
13
13
|
"""
|
|
14
14
|
|
|
15
15
|
from __future__ import annotations
|
|
@@ -18,12 +18,20 @@ import math
|
|
|
18
18
|
from collections.abc import Mapping, Sequence
|
|
19
19
|
from typing import Annotated, Literal
|
|
20
20
|
|
|
21
|
-
from pydantic import
|
|
21
|
+
from pydantic import (
|
|
22
|
+
BaseModel,
|
|
23
|
+
ConfigDict,
|
|
24
|
+
Field,
|
|
25
|
+
field_validator,
|
|
26
|
+
model_serializer,
|
|
27
|
+
model_validator,
|
|
28
|
+
)
|
|
22
29
|
|
|
23
30
|
# The CCS geometry table, a table of a geometry sidecar's [import]; its
|
|
24
31
|
# module imports only pydantic and the script row, so the package may import it
|
|
25
32
|
# while it loads.
|
|
26
33
|
from pyflightstream.cases._ccs import CcsImportOptions
|
|
34
|
+
from pyflightstream.cases.reference_blocks import CampaignConfigError
|
|
27
35
|
|
|
28
36
|
__all__ = [
|
|
29
37
|
"EVERY_SURFACE",
|
|
@@ -279,6 +287,20 @@ class MeshImport(BaseModel):
|
|
|
279
287
|
TrailingEdgeRoute = Literal["file", "detect", "none"]
|
|
280
288
|
|
|
281
289
|
|
|
290
|
+
class TrailingEdgeSet(BaseModel):
|
|
291
|
+
"""One points file and the type applied to its trailing edges, in metres."""
|
|
292
|
+
|
|
293
|
+
model_config = ConfigDict(extra="forbid", frozen=True, allow_inf_nan=False)
|
|
294
|
+
edge_type: Literal["STANDARD", "RELAXED", "JET_OUTFLOW", "VORTEX_SHEDDING"] = "STANDARD"
|
|
295
|
+
points_m: tuple[tuple[float, float, float], ...] = ()
|
|
296
|
+
points_file: str | None = Field(default=None, exclude=True)
|
|
297
|
+
|
|
298
|
+
@field_validator("edge_type", mode="before")
|
|
299
|
+
@classmethod
|
|
300
|
+
def _uppercase(cls, value: object) -> object:
|
|
301
|
+
return value.strip().upper() if isinstance(value, str) else value
|
|
302
|
+
|
|
303
|
+
|
|
282
304
|
class TrailingEdgeMarking(BaseModel):
|
|
283
305
|
"""How a raw mesh's trailing edges are marked: its sidecar's ``[trailing_edges]`` (G02).
|
|
284
306
|
|
|
@@ -313,17 +335,66 @@ class TrailingEdgeMarking(BaseModel):
|
|
|
313
335
|
model_config = ConfigDict(extra="forbid", frozen=True)
|
|
314
336
|
|
|
315
337
|
route: TrailingEdgeRoute
|
|
316
|
-
edge_type: str = "STANDARD"
|
|
317
338
|
tolerance: float = 0.0001
|
|
318
|
-
|
|
319
|
-
points_file: str | None = Field(default=None, exclude=True)
|
|
339
|
+
sets: tuple[TrailingEdgeSet, ...] = ()
|
|
320
340
|
detect_surfaces: tuple[str, ...] = ()
|
|
321
341
|
sweep_angle_deg: float | None = None
|
|
322
342
|
|
|
323
|
-
@
|
|
343
|
+
@model_validator(mode="before")
|
|
324
344
|
@classmethod
|
|
325
|
-
def
|
|
326
|
-
|
|
345
|
+
def _legacy_file(cls, value: object) -> object:
|
|
346
|
+
if not isinstance(value, Mapping):
|
|
347
|
+
return value
|
|
348
|
+
data = dict(value)
|
|
349
|
+
legacy = {
|
|
350
|
+
key: data.pop(key) for key in ("edge_type", "points_m", "points_file") if key in data
|
|
351
|
+
}
|
|
352
|
+
if "sets" not in data and (data.get("route") == "file" or legacy):
|
|
353
|
+
data["sets"] = (legacy,)
|
|
354
|
+
return data
|
|
355
|
+
|
|
356
|
+
@property
|
|
357
|
+
def edge_type(self) -> str:
|
|
358
|
+
"""Return the first file's type for single-file callers."""
|
|
359
|
+
return self.sets[0].edge_type if self.sets else "STANDARD"
|
|
360
|
+
|
|
361
|
+
@property
|
|
362
|
+
def points_m(self) -> tuple[tuple[float, float, float], ...]:
|
|
363
|
+
"""Return the first file's points in metres."""
|
|
364
|
+
return self.sets[0].points_m if self.sets else ()
|
|
365
|
+
|
|
366
|
+
@property
|
|
367
|
+
def points_file(self) -> str | None:
|
|
368
|
+
"""Return the first file's local path, excluded from records."""
|
|
369
|
+
return self.sets[0].points_file if self.sets else None
|
|
370
|
+
|
|
371
|
+
def model_copy(self, *, update=None, deep=False):
|
|
372
|
+
"""Preserve the legacy first-file update spelling for existing callers."""
|
|
373
|
+
values = dict(update or {})
|
|
374
|
+
first = {
|
|
375
|
+
key: values.pop(key)
|
|
376
|
+
for key in ("edge_type", "points_m", "points_file")
|
|
377
|
+
if key in values
|
|
378
|
+
}
|
|
379
|
+
if first:
|
|
380
|
+
entry = self.sets[0] if self.sets else TrailingEdgeSet()
|
|
381
|
+
values["sets"] = (entry.model_copy(update=first, deep=deep), *self.sets[1:])
|
|
382
|
+
return super().model_copy(update=values, deep=deep)
|
|
383
|
+
|
|
384
|
+
@model_serializer(mode="wrap")
|
|
385
|
+
def _record(self, handler):
|
|
386
|
+
data = handler(self)
|
|
387
|
+
sets = data.pop("sets")
|
|
388
|
+
record = {
|
|
389
|
+
"route": data.pop("route"),
|
|
390
|
+
"edge_type": self.edge_type,
|
|
391
|
+
"tolerance": data.pop("tolerance"),
|
|
392
|
+
"points_m": sets[0]["points_m"] if sets else [],
|
|
393
|
+
**data,
|
|
394
|
+
}
|
|
395
|
+
if len(sets) > 1:
|
|
396
|
+
record["sets"] = sets
|
|
397
|
+
return record
|
|
327
398
|
|
|
328
399
|
@model_validator(mode="after")
|
|
329
400
|
def _one_route_and_sound_values(self) -> TrailingEdgeMarking:
|
|
@@ -385,7 +456,7 @@ class BaseRegionOperation(BaseModel):
|
|
|
385
456
|
"remesh",
|
|
386
457
|
"select_faces",
|
|
387
458
|
]
|
|
388
|
-
#: Mesh boundary for creation
|
|
459
|
+
#: Mesh boundary for creation/outflow marking, or an earlier region's boundary name.
|
|
389
460
|
boundary: str | Annotated[int, Field(ge=1)] | None = None
|
|
390
461
|
#: Current base-region index; all is only allowed for trailing-edge marking or face selection.
|
|
391
462
|
index: Annotated[int, Field(ge=1)] | Literal["all"] | None = None
|
|
@@ -401,9 +472,9 @@ class BaseRegionOperation(BaseModel):
|
|
|
401
472
|
allowed = {
|
|
402
473
|
"create": {"boundary", "model", "cp"},
|
|
403
474
|
"mark_outflow_edges": {"boundary"},
|
|
404
|
-
"set_pressure": {"index", "model", "cp"},
|
|
405
|
-
"remesh": {"index", "mesh"},
|
|
406
|
-
}.get(self.operation, {"index"})
|
|
475
|
+
"set_pressure": {"index", "boundary", "model", "cp"},
|
|
476
|
+
"remesh": {"index", "boundary", "mesh"},
|
|
477
|
+
}.get(self.operation, {"index", "boundary"})
|
|
407
478
|
for name in ("boundary", "index", "model", "cp", "mesh"):
|
|
408
479
|
if name not in allowed and getattr(self, name) is not None:
|
|
409
480
|
raise ValueError(f"{name} does not apply to base-region {self.operation}")
|
|
@@ -415,8 +486,14 @@ class BaseRegionOperation(BaseModel):
|
|
|
415
486
|
elif self.operation == "mark_outflow_edges":
|
|
416
487
|
if self.boundary is None or self.boundary == "":
|
|
417
488
|
raise ValueError("base-region mark_outflow_edges requires boundary")
|
|
418
|
-
elif self.
|
|
419
|
-
|
|
489
|
+
elif self.operation in {
|
|
490
|
+
"set_pressure",
|
|
491
|
+
"delete",
|
|
492
|
+
"mark_trailing_edges",
|
|
493
|
+
"remesh",
|
|
494
|
+
"select_faces",
|
|
495
|
+
}:
|
|
496
|
+
self._followup_selector()
|
|
420
497
|
if self.boundary == "all" and self.operation != "mark_outflow_edges":
|
|
421
498
|
raise ValueError("base-region create has no documented all form")
|
|
422
499
|
if self.index == "all" and self.operation not in {"mark_trailing_edges", "select_faces"}:
|
|
@@ -432,6 +509,19 @@ class BaseRegionOperation(BaseModel):
|
|
|
432
509
|
raise ValueError("base-region remesh requires mesh parameters")
|
|
433
510
|
return self
|
|
434
511
|
|
|
512
|
+
def _followup_selector(self) -> None:
|
|
513
|
+
"""Require one explicit index or one previously created/declared boundary name."""
|
|
514
|
+
if self.boundary is None:
|
|
515
|
+
if self.index is None:
|
|
516
|
+
raise CampaignConfigError(
|
|
517
|
+
f"base-region {self.operation} requires index or boundary"
|
|
518
|
+
)
|
|
519
|
+
return
|
|
520
|
+
if self.index is not None:
|
|
521
|
+
raise CampaignConfigError("base-region selection requires index or boundary, not both")
|
|
522
|
+
if not isinstance(self.boundary, str) or not self.boundary.strip():
|
|
523
|
+
raise CampaignConfigError("a follow-up base-region boundary must be a nonempty name")
|
|
524
|
+
|
|
435
525
|
|
|
436
526
|
class PortBoundary(BaseModel):
|
|
437
527
|
"""A normal-velocity inlet or outlet; an inlet may also bind a native profile."""
|
|
@@ -472,6 +562,15 @@ class PortBoundary(BaseModel):
|
|
|
472
562
|
return self
|
|
473
563
|
|
|
474
564
|
|
|
565
|
+
class WakeTerminationMarking(BaseModel):
|
|
566
|
+
"""Explicit wake-termination vertices, matched in metres before emission."""
|
|
567
|
+
|
|
568
|
+
model_config = ConfigDict(extra="forbid", frozen=True, allow_inf_nan=False)
|
|
569
|
+
points_file: str = Field(exclude=True)
|
|
570
|
+
tolerance: float = Field(default=0.0001, gt=0)
|
|
571
|
+
nodes: tuple[int, ...] = ()
|
|
572
|
+
|
|
573
|
+
|
|
475
574
|
class RawMeshConditions(BaseModel):
|
|
476
575
|
"""The boundary conditions a raw mesh's sidecar declares (G02, Q1).
|
|
477
576
|
|
|
@@ -495,7 +594,7 @@ class RawMeshConditions(BaseModel):
|
|
|
495
594
|
#: Stable geometric port identities mapped to exact surface names after import renames.
|
|
496
595
|
ports: dict[str, str] = Field(default_factory=dict)
|
|
497
596
|
trailing_edges: TrailingEdgeMarking | None = None
|
|
498
|
-
wake_termination: Literal["auto"] | tuple[str, ...] | None = None
|
|
597
|
+
wake_termination: Literal["auto"] | tuple[str, ...] | WakeTerminationMarking | None = None
|
|
499
598
|
base_regions: Literal["auto"] | None = None
|
|
500
599
|
inlets: tuple[PortBoundary, ...] = ()
|
|
501
600
|
outlets: tuple[PortBoundary, ...] = ()
|
|
@@ -1561,7 +1561,7 @@ class PhaseLockedSpec(BaseModel):
|
|
|
1561
1561
|
of THAT rotor, and never the length of the exported window.
|
|
1562
1562
|
|
|
1563
1563
|
``last_revolutions_avg`` is how many of the last revolutions enter the mean
|
|
1564
|
-
at each azimuth. It may not exceed ``min_revolutions``: a reduction may not
|
|
1564
|
+
at each azimuth, at least one. It may not exceed ``min_revolutions``: a reduction may not
|
|
1565
1565
|
average over more history than it required in order to exist.
|
|
1566
1566
|
|
|
1567
1567
|
NOT REACHING THE MINIMUM NEVER REFUSES ANOTHER PRODUCT. This is a gate on
|
|
@@ -1581,7 +1581,7 @@ class PhaseLockedSpec(BaseModel):
|
|
|
1581
1581
|
#: Total revolutions the matrix must specify before this is generated.
|
|
1582
1582
|
min_revolutions: float = Field(gt=0.0, allow_inf_nan=False)
|
|
1583
1583
|
#: How many of the LAST revolutions the average uses.
|
|
1584
|
-
last_revolutions_avg: float = Field(
|
|
1584
|
+
last_revolutions_avg: float = Field(ge=1.0, allow_inf_nan=False)
|
|
1585
1585
|
|
|
1586
1586
|
@model_validator(mode="after")
|
|
1587
1587
|
def _averages_no_more_than_it_required(self) -> PhaseLockedSpec:
|
|
@@ -1952,6 +1952,17 @@ class _NoiseSpec(BaseModel):
|
|
|
1952
1952
|
#: Explicit in-plane loading radius in metres; omitted uses the inferred centroid.
|
|
1953
1953
|
inplane_radius_m: float | None = Field(default=None, gt=0.0)
|
|
1954
1954
|
|
|
1955
|
+
#: Number of blade-passage orders in the exploratory harmonic table.
|
|
1956
|
+
gutin_orders: int = Field(default=4, ge=1, strict=True)
|
|
1957
|
+
#: Workspace-relative reference CSV per observer; an empty string omits one.
|
|
1958
|
+
reference: list[str] | None = None
|
|
1959
|
+
|
|
1960
|
+
@model_validator(mode="after")
|
|
1961
|
+
def _noise_references(self):
|
|
1962
|
+
if self.reference is not None and len(self.reference) != len(self.observers_m):
|
|
1963
|
+
raise ValueError("noise.reference needs one CSV path or empty string per observer")
|
|
1964
|
+
return self
|
|
1965
|
+
|
|
1955
1966
|
|
|
1956
1967
|
class PprocSpec(BaseModel):
|
|
1957
1968
|
"""The post-processing specification a matrix row's PPROC cell names.
|
|
@@ -397,6 +397,7 @@ def reduced_frequencies(
|
|
|
397
397
|
omega_rad_s: float,
|
|
398
398
|
velocity_m_per_s: float,
|
|
399
399
|
source: str,
|
|
400
|
+
band_widths_m: Sequence[float] | None = None,
|
|
400
401
|
) -> ReducedFrequencies:
|
|
401
402
|
"""Return the reduced frequency of every station, sorted by radius.
|
|
402
403
|
|
|
@@ -412,6 +413,9 @@ def reduced_frequencies(
|
|
|
412
413
|
The free-stream speed in metres per second.
|
|
413
414
|
source : str
|
|
414
415
|
Where the chords came from, ``mesh`` or ``sections``.
|
|
416
|
+
band_widths_m : sequence of float, optional
|
|
417
|
+
Full widths of mesh bands, in station order. Nodal sections omit this
|
|
418
|
+
and retain midpoint strips with half-width end stations.
|
|
415
419
|
|
|
416
420
|
Returns
|
|
417
421
|
-------
|
|
@@ -440,7 +444,15 @@ def reduced_frequencies(
|
|
|
440
444
|
)
|
|
441
445
|
for radius, chord in zip(radii, chords, strict=True)
|
|
442
446
|
)
|
|
443
|
-
|
|
447
|
+
strips = strip_lengths(radii) if band_widths_m is None else _band_widths(radii_m, band_widths_m)
|
|
448
|
+
return ReducedFrequencies(radii, chords, values, strips, source)
|
|
449
|
+
|
|
450
|
+
|
|
451
|
+
def _band_widths(radii: Sequence[float], widths: Sequence[float]) -> tuple[float, ...]:
|
|
452
|
+
"""Validate full-band weights and sort them with their station radii."""
|
|
453
|
+
if len(widths) != len(radii) or any(not math.isfinite(w) or w <= 0 for w in widths):
|
|
454
|
+
raise CampaignConfigError("band_widths_m needs one finite positive width per station")
|
|
455
|
+
return tuple(w for _, w in sorted(zip(radii, widths, strict=True), key=lambda row: abs(row[0])))
|
|
444
456
|
|
|
445
457
|
|
|
446
458
|
def _sub(a: Sequence[float], b: Sequence[float]) -> Vector:
|
|
@@ -468,7 +480,7 @@ def blade_stations(
|
|
|
468
480
|
hub: Sequence[float],
|
|
469
481
|
axis: Sequence[float],
|
|
470
482
|
count: int = DEFAULT_STATIONS,
|
|
471
|
-
) -> tuple[tuple[float, ...], tuple[float, ...]]:
|
|
483
|
+
) -> tuple[tuple[float, ...], tuple[float, ...], tuple[float, ...]]:
|
|
472
484
|
"""Estimate a blade's chord at ``count`` radial stations from its surface vertices.
|
|
473
485
|
|
|
474
486
|
The blade's span, from its innermost to its outermost vertex measured from
|
|
@@ -492,9 +504,9 @@ def blade_stations(
|
|
|
492
504
|
|
|
493
505
|
Returns
|
|
494
506
|
-------
|
|
495
|
-
tuple of (radii, chords)
|
|
507
|
+
tuple of (radii, chords, band_widths)
|
|
496
508
|
Per station with two vertices or more, the band's mid radius and the
|
|
497
|
-
chord estimate, in metres, in ascending radius.
|
|
509
|
+
chord estimate and full band width, in metres, in ascending radius.
|
|
498
510
|
|
|
499
511
|
Raises
|
|
500
512
|
------
|
|
@@ -543,7 +555,7 @@ def blade_stations(
|
|
|
543
555
|
chord = max(chord, max(projections) - min(projections))
|
|
544
556
|
radii.append(r_low + (index + 0.5) * width)
|
|
545
557
|
chords.append(chord)
|
|
546
|
-
return tuple(radii), tuple(chords)
|
|
558
|
+
return tuple(radii), tuple(chords), (width,) * len(radii)
|
|
547
559
|
|
|
548
560
|
|
|
549
561
|
def obj_group_vertices(path: str | Path, *, metres_per_unit: float) -> dict[str, list[Vector]]:
|
|
@@ -994,6 +1006,8 @@ class QsteadyRecord:
|
|
|
994
1006
|
blade1_azimuth_deg: float
|
|
995
1007
|
positions: tuple[QsteadyClocking, ...]
|
|
996
1008
|
validity: Mapping[str, Any] | None
|
|
1009
|
+
#: MRP origin in geometry coordinates, metres; None for historical records without it.
|
|
1010
|
+
moment_point_m: tuple[float, float, float] | None = None
|
|
997
1011
|
|
|
998
1012
|
def solve_order(self) -> tuple[QsteadyClocking, ...]:
|
|
999
1013
|
"""Return the clockings in the order the run solved them: 1 to k - 1, then 0.
|
|
@@ -1023,6 +1037,7 @@ class QsteadyRecord:
|
|
|
1023
1037
|
"blade1_azimuth_deg": self.blade1_azimuth_deg,
|
|
1024
1038
|
"positions": [clocking.as_json() for clocking in self.positions],
|
|
1025
1039
|
"validity": self.validity,
|
|
1040
|
+
"moment_point_m": self.moment_point_m and list(self.moment_point_m),
|
|
1026
1041
|
}
|
|
1027
1042
|
|
|
1028
1043
|
def to_text(self) -> str:
|
|
@@ -1177,7 +1192,7 @@ def _parse_record(data: object) -> QsteadyRecord:
|
|
|
1177
1192
|
f"is of schema {version!r}; this package writes and reads schema "
|
|
1178
1193
|
f"{RECORD_SCHEMA_VERSION} only"
|
|
1179
1194
|
)
|
|
1180
|
-
_exact_keys(data, _RECORD_KEYS, "record")
|
|
1195
|
+
_exact_keys(data, _RECORD_KEYS, "record", optional=("moment_point_m",))
|
|
1181
1196
|
if data["run_type"] != RECORD_RUN_TYPE:
|
|
1182
1197
|
raise QsteadyRecordError(f"is of run type {data['run_type']!r}, not {RECORD_RUN_TYPE!r}")
|
|
1183
1198
|
case = data["case"]
|
|
@@ -1205,6 +1220,11 @@ def _parse_record(data: object) -> QsteadyRecord:
|
|
|
1205
1220
|
blade1_azimuth_deg=_record_number(data["blade1_azimuth_deg"], "blade1_azimuth_deg"),
|
|
1206
1221
|
positions=tuple(_record_clocking(value, at) for at, value in enumerate(positions)),
|
|
1207
1222
|
validity=validity,
|
|
1223
|
+
moment_point_m=(
|
|
1224
|
+
_record_vector(data["moment_point_m"], "moment_point_m")
|
|
1225
|
+
if data.get("moment_point_m") is not None
|
|
1226
|
+
else None
|
|
1227
|
+
),
|
|
1208
1228
|
)
|
|
1209
1229
|
|
|
1210
1230
|
|
|
@@ -110,8 +110,8 @@ class ReferenceData(BaseModel):
|
|
|
110
110
|
rotor_position_m: tuple[float, float, float] | None = None
|
|
111
111
|
#: WHICH MODEL AXIS EACH BODY RATE TURNS ABOUT, from the
|
|
112
112
|
#: reference artifact's ``[body_axes]`` table: ``roll``, ``pitch`` and
|
|
113
|
-
#: ``yaw`` to ``X``, ``Y``
|
|
114
|
-
#:
|
|
113
|
+
#: ``yaw`` to ``X``, ``Y`` and ``Z``, respectively. Only that mapping's
|
|
114
|
+
#: signs are measured (RPT-052/RPT-060). A rotating free stream has to be
|
|
115
115
|
#: given an AXIS of a frame, so the row cannot state one without the
|
|
116
116
|
#: reference saying which axis is which. Empty for a reference that
|
|
117
117
|
#: declares none, and a row stating a rate against such a reference is
|
|
@@ -157,6 +157,18 @@ class ReferenceData(BaseModel):
|
|
|
157
157
|
)
|
|
158
158
|
return axes
|
|
159
159
|
|
|
160
|
+
@field_validator("body_axes")
|
|
161
|
+
@classmethod
|
|
162
|
+
def _axes_have_measured_rate_signs(cls, axes: dict[str, str]) -> dict[str, str]:
|
|
163
|
+
"""Keep rate signs within the axis mapping measured by RPT-052 and RPT-060."""
|
|
164
|
+
standard = {"roll": "X", "pitch": "Y", "yaw": "Z"}
|
|
165
|
+
if any(axis != standard[rate] for rate, axis in axes.items()):
|
|
166
|
+
raise ValueError(
|
|
167
|
+
"body_axes supports only roll=X, pitch=Y, yaw=Z: RPT-052 and RPT-060 "
|
|
168
|
+
"did not measure a permuted mesh, so its rate signs are unavailable"
|
|
169
|
+
)
|
|
170
|
+
return axes
|
|
171
|
+
|
|
160
172
|
|
|
161
173
|
def _resolve_settings_toggle(value: object) -> object:
|
|
162
174
|
"""Resolve a settings toggle in either vocabulary, before validation.
|
|
@@ -472,16 +484,19 @@ class SolverSettings(BaseModel):
|
|
|
472
484
|
#: setting a run applied: by the build guard naming the command on 25.100
|
|
473
485
|
#: onward, and on 25.000 by the INITIALIZE_SOLVER helper, as every case is.
|
|
474
486
|
legacy_solver_model: str | None = None
|
|
475
|
-
#: Explicit BC overrides, emitted before runtime/init settings
|
|
487
|
+
#: Explicit BC overrides, emitted before runtime/init settings and checked per build.
|
|
476
488
|
trailing_edge_types: (
|
|
477
|
-
dict[
|
|
489
|
+
dict[
|
|
490
|
+
Annotated[int, Field(ge=1)],
|
|
491
|
+
Literal["STANDARD", "RELAXED", "JET_OUTFLOW", "VORTEX_SHEDDING"],
|
|
492
|
+
]
|
|
478
493
|
| None
|
|
479
494
|
) = None
|
|
480
495
|
#: One-based trailing-edge indices whose wake nodes are disabled.
|
|
481
496
|
disabled_wake_trailing_edges: list[Annotated[int, Field(ge=1)]] | None = None
|
|
482
497
|
#: Boundary labels or indices on which leading-edge wakes are detected.
|
|
483
498
|
leading_edge_wake_boundaries: list[int | str] | None = Field(default=None, min_length=1)
|
|
484
|
-
#:
|
|
499
|
+
#: Refused: selects no node. Use the geometry sidecar's [wake_termination] file route.
|
|
485
500
|
mark_wake_termination_nodes: Literal[True] | None = None
|
|
486
501
|
#: Ports selected by setup; surface identity is bound from the geometry and values from MATRIX.
|
|
487
502
|
ports: tuple[PortBoundary, ...] = ()
|
|
@@ -666,8 +681,8 @@ class SolverSettings(BaseModel):
|
|
|
666
681
|
#: not carry is left out, and a list that resolves to none is refused.
|
|
667
682
|
analysis_families: list[str] | None = None
|
|
668
683
|
#: SET_LOADS_AND_MOMENTS_UNITS: the unit the loads table prints, one of the
|
|
669
|
-
#: tokens the command takes on the row's build.
|
|
670
|
-
#:
|
|
684
|
+
#: tokens the command takes on the row's build. Load-table polars, superfiles
|
|
685
|
+
#: and rotor coefficients need COEFFICIENTS; independent exports remain available.
|
|
671
686
|
load_units: str | None = None
|
|
672
687
|
#: SET_INVISCID_LOADS: the loads and moments without their viscous part.
|
|
673
688
|
inviscid_loads: SolverToggle | None = None
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"""Setup operations on a point's surfaces: removing surfaces, and the wake option it emits.
|
|
2
2
|
|
|
3
3
|
Pipeline role: the cases row, where a row's solver commands are emitted.
|
|
4
|
-
It emits the removal of the surfaces a setup names,
|
|
5
|
-
|
|
4
|
+
It emits the removal of the surfaces a setup names, preserving survivor
|
|
5
|
+
IDs in the surface inventory, and the slipstream wake
|
|
6
6
|
stabilization a setup states.
|
|
7
7
|
|
|
8
8
|
Two setup keys reach the solver here, each through a short hook in
|
|
@@ -10,15 +10,11 @@ Two setup keys reach the solver here, each through a short hook in
|
|
|
10
10
|
|
|
11
11
|
``delete_surfaces``
|
|
12
12
|
Boundaries named by NAME, alias or family, never by index. Each is
|
|
13
|
-
removed with ``DELETE_SURFACES``.
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
``DELETE_SURFACES 3`` on a four-surface mesh (Body, Base, Blade1,
|
|
19
|
-
Blade2) left Body, Base, Blade2, and only Blade2 moved, to index 3.
|
|
20
|
-
A family is removed from its last member so no index shifts under
|
|
21
|
-
the next command. Where the row's reference declares the study's
|
|
13
|
+
removed with ``DELETE_SURFACES``. Survivors keep their original IDs,
|
|
14
|
+
as measured on 26.124 and 26.125 in the committed fixture
|
|
15
|
+
``pfs2119_016_delete_surfaces_ids_2026-10-16.md``. Tree position after
|
|
16
|
+
deletion is not an ID. Later selections use the retained IDs.
|
|
17
|
+
Families are removed in descending ID order. Where the row's reference declares the study's
|
|
22
18
|
vocabulary (FR-435), a name the study holds and the row's model lacks
|
|
23
19
|
is skipped and said, and a list every name of which is skipped emits
|
|
24
20
|
no removal.
|
|
@@ -79,7 +75,7 @@ _OPENED: WeakKeyDictionary[Script, tuple[str, ...]] = WeakKeyDictionary()
|
|
|
79
75
|
|
|
80
76
|
|
|
81
77
|
def emit_setup_surfaces(script: Script, case: SimCase) -> None:
|
|
82
|
-
"""Emit
|
|
78
|
+
"""Emit removal of the named surfaces, preserving every surviving boundary ID.
|
|
83
79
|
|
|
84
80
|
Nothing is emitted, and the script is left as it was, when the setup
|
|
85
81
|
states no ``delete_surfaces``.
|
|
@@ -146,14 +142,7 @@ def emit_setup_surfaces(script: Script, case: SimCase) -> None:
|
|
|
146
142
|
_OPENED.setdefault(script, tuple(ordered))
|
|
147
143
|
for index in sorted(doomed, reverse=True):
|
|
148
144
|
script.emit(_DELETE, index)
|
|
149
|
-
|
|
150
|
-
script.boundary_inventory = survivors
|
|
151
|
-
renumbered = {
|
|
152
|
-
name: new_index
|
|
153
|
-
for new_index, name in enumerate(survivors, 1)
|
|
154
|
-
if name in labels and survivors.count(name) == 1
|
|
155
|
-
}
|
|
156
|
-
script.entities.renumber_boundaries(renumbered, len(survivors))
|
|
145
|
+
script.boundary_inventory = tuple(name for name in inventory if labels.get(name) not in doomed)
|
|
157
146
|
|
|
158
147
|
|
|
159
148
|
def emit_wake_stabilization(
|