pyflightstream 0.44.0__tar.gz → 0.45.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.45.0/MANIFEST.in +2 -0
- {pyflightstream-0.44.0/src/pyflightstream.egg-info → pyflightstream-0.45.0}/PKG-INFO +1 -1
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/pyproject.toml +1 -5
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/_deprecations.py +0 -11
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/_farfield_spec.py +228 -36
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/farfield_inputs.py +36 -19
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/pproc.py +32 -5
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/_clock.py +98 -25
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/_exports.py +8 -2
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/_farfield.py +183 -41
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/_pproc.py +1 -1
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/_probes.py +14 -9
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/_timing.py +5 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/solver_export.yaml +6 -4
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/farfield/__init__.py +1 -1
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/_field_inputs.py +21 -11
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/_reduction_stage.py +258 -5
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/farfield_fields.py +15 -52
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/farfield_products.py +255 -245
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/polar.py +5 -11
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/products.py +5 -1
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/qsteady_noise.py +6 -2
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/series.py +1 -1
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/superfile.py +2 -2
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/probes/lattice.py +2 -1
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/probes/layouts.py +2 -1
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_actions_counter.py +42 -8
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_plan.py +1 -1
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_plan_report.py +4 -1
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_points.py +10 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/script/_build_forms.py +10 -6
- {pyflightstream-0.44.0 → pyflightstream-0.45.0/src/pyflightstream.egg-info}/PKG-INFO +1 -1
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream.egg-info/SOURCES.txt +1 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/LICENSE +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/README.md +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/setup.cfg +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/__init__.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/_atmosphere.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/_cli.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/_console.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/_decimal.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/_digest.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/_errors.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/_expressions.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/_fsi_calibration.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/_fsm.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/_fsm_fresh.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/_lengths.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/_maturity.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/_mesh.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/_progress.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/_retired_names.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/_signature.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/_textio.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/_tokens.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/_yamlflow.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/__init__.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/_ccs.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/_fsi_external.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/_geometry_emit.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/_geometry_instruction.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/_matrix_layouts.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/_matrix_upgrade.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/_setup_keys.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/_setup_link.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/_skipped_families.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/_sweep_names.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/_unsteady_actions.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/acoustics.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/ccs_fuselage.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/ccs_revolution.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/ccs_wing.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/corrections.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/field_coverage.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/freestream.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/fsi_workspace.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/matrix.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/mesh.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/naming.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/qsteady.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/reference_blocks.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/selection.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/settings.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/setup_surfaces.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/sixdof.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/windows.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/__init__.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/_actuator.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/_additional.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/_batch_actions.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/_batch_script.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/_conventions.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/_export_first_step.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/_frames.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/_freestream.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/_gap_evidence.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/_geometry.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/_motion.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/_names.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/_qsteady_rotor.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/_reductions.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/_registry.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/_rotor.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/_row_cells.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/_rows.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/_sixdof.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/_skeleton.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/_solver_settings.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/_steady.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/_streamlines.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/_unsteady.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/_vocabulary.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/_wake_length.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/__init__.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/_meta.yaml +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/_schema.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/acoustics.yaml +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/actuators.yaml +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/advanced_settings.yaml +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/aeroelastic_coupling.yaml +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/base_regions.yaml +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/boundary_conditions.yaml +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/cad.yaml +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/cad_create.yaml +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/ccs_fuselage_mesh.yaml +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/ccs_revolve_mesh.yaml +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/ccs_wing_mesh.yaml +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/coordinate_systems.yaml +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/file_io.yaml +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/free_surfaces.yaml +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/inlets_outlets.yaml +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/mesh_import_export.yaml +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/mesh_operations.yaml +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/mesh_unite.yaml +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/mesh_wrapper.yaml +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/motion_definitions.yaml +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/plots.yaml +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/probe_points.yaml +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/runtime_settings.yaml +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/scene_settings.yaml +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/scenes.yaml +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/script_controls.yaml +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/simulation_controls.yaml +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/solver_analysis.yaml +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/solver_contours.yaml +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/solver_initialization.yaml +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/solver_settings.yaml +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/stability_toolbox.yaml +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/streamlines.yaml +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/surface_sections.yaml +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/sweeper.yaml +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/transition_trips.yaml +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/unsteady_solver.yaml +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/volume_sections.yaml +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/exceptions.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/extras.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/farfield/balances.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/farfield/fields.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/farfield/quadrature.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/farfield/trefftz.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/fsi/__init__.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/fsi/_direct_morphing.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/fsi/beam.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/fsi/calibration.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/fsi/centrifugal.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/fsi/cli.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/fsi/config.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/fsi/driver.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/fsi/errors.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/fsi/external.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/fsi/kinematics.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/fsi/loads.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/fsi/materials.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/fsi/nodes.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/fsi/sections.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/fsi/state.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/fsi/wing.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/options.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/overview.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/__init__.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/_additional.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/_admit.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/_condition.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/_installed_copies.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/_matrix_template.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/_noise_products.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/_products_campaign.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/_rotor_plan.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/_rotor_products.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/_settings_product.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/_sim.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/_stage.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/_structure.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/_tables.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/_transfer_functions.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/acoustics.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/axes.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/boundary_layer.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/corrections.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/custom_polar.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/diagnostics.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/disc_maps.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/equations.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/field_frames.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/glossary.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/guides.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/harmonics.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/inflow_tools.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/input_template.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/point_tables.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/probe_fields.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/provenance.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/qsteady.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/reductions.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/rotor_table.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/section_distributions.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/settings_table.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/streamlines.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/surfaces.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/unsteady.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/unsteady_polar.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/writers.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/probes/__init__.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/probes/_model.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/probes/errors.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/probes/geometry.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/probes/planar.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/__init__.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/_reanalysis.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/_spec_0400_gap.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/_spec_0400_gapbase.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/_spec_0400_gapedges.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/_spec_0400_gapkit.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/_spec_26125.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/_spec_catalog_b.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/_spec_ccs_mesh.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/_spec_ccs_noise.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/_spec_kit.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/_spec_t1.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/cli.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/compat.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/cost.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/drift.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/errors.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/geometry.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/matrix.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/physics.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/probes.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/references/PHY-01.yaml +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/references/PHY-02.yaml +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/references/PHY-05.yaml +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/references/PHY-06.yaml +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/references/SMI-01.yaml +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/references/SMI-02.yaml +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/references/pressure-drag/PHY-01.yaml +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/references/pressure-drag/PHY-02.yaml +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/references/pressure-drag/PHY-05.yaml +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/references/pressure-drag/PHY-06.yaml +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/reports.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/specs.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/reference.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/results/__init__.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/results/conditions.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/results/core.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/results/exports.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/results/loads.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/results/log.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/results/native_surface.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/results/sectional_loads.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/results/surface.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/results/tables.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/results/wake.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/__init__.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_additional.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_alias.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_assemble.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_assessment.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_batch_collect.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_batch_exec.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_batch_plan.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_batch_run.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_batch_split.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_campaign.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_cli_geometry.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_cli_mesh.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_cli_parsers.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_cli_parsers_storage.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_cli_print.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_cli_query.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_cli_query_history.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_cli_query_point.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_collect_logs.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_collect_notes.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_continuation.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_continuation_frame.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_executors.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_field_motion.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_grouped.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_identity.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_ids.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_mark_converged.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_matrix_warnings.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_pending.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_rebuild.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_rebuild_evidence.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_rebuild_grouped.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_rebuild_summary.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_record_files.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_solver_windows.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_step_exports.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_sweep.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_wake_edge_verdict.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/cli.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/collect.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/matrix.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/records.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/script/__init__.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/script/_arg_checks.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/script/_ledger_tables.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/script/_relaxed_te.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/script/_settings.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/script/_surface_averaging.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/script/_wake_edge_file.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/script/entities.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/script/helpers.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/script/motion.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/script/rotor_vocabulary.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/script/solver_setup.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/script/toggles.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/support.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/testing.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/utils/__init__.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/utils/cli.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/utils/database.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/utils/errors.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/utils/manual.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/versions.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/__init__.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_batch_life.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_batch_relocate.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_batches.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_degenerate.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_effective.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_free_space.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_geometry_build.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_geometry_clean.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_geometry_convert.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_geometry_instruction.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_geometry_record.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_geometry_sidecar.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_geometry_vtk.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_layout.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_ledger_api.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_ledger_history.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_links.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_matrix_binding.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_matrix_homes.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_matrix_phases.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_missing_log.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_query_files.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_query_logs.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_query_point.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_refine/__init__.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_refine/_audit.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_refine/_blocks.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_refine/_config.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_refine/_geometry.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_refine/_grid.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_refine/_level.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_refine/_obj.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_refine/_periodic.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_refine/_remesh.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_refine/_remesh_group.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_refine/_remesh_pairs.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_refine/_staging.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_row_setup.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_script_comparison.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_settings_file.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_step_prune.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_verdicts.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/actuator_profiles.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/builds.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/cli.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/costs.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/excel.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/excel_bridge.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/excel_file.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/excel_sync.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/fields.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/flight_condition.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/fsi_external_setup.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/fsi_setup.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/hpc.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/inputs.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/ledger.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/manifest.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/matrix.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/migrate.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/naming.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/record_document.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/selections.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/setup_inspection.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/setup_standards.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/sidecars.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/sixdof_setup.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/storage.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/trailing_edges.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/wake_edges.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream.egg-info/dependency_links.txt +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream.egg-info/entry_points.txt +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream.egg-info/requires.txt +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream.egg-info/top_level.txt +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/tools/check_shipped_surface.py +0 -0
- {pyflightstream-0.44.0 → pyflightstream-0.45.0}/tools/shipped_surface.conf +0 -0
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "pyflightstream"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.45.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"}
|
|
@@ -170,10 +170,6 @@ 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
|
-
|
|
177
173
|
[tool.setuptools.package-data]
|
|
178
174
|
"pyflightstream.commands" = ["*.yaml"]
|
|
179
175
|
"pyflightstream.qa" = ["references/*.yaml", "references/pressure-drag/*.yaml"]
|
|
@@ -658,16 +658,6 @@ INFLOW_STATION_HARMONICS = DeprecatedFunction(
|
|
|
658
658
|
advice="use pyflightstream.post.inflow_tools.InflowStationHarmonics",
|
|
659
659
|
)
|
|
660
660
|
|
|
661
|
-
#: ``polar_row`` called without ``beta_deg`` keeps zero sideslip and warns; from
|
|
662
|
-
#: the removal version the argument is required.
|
|
663
|
-
POLAR_ROW_OMITTED_BETA = DeprecatedFunction(
|
|
664
|
-
function="pyflightstream.post.polar.polar_row called without beta_deg",
|
|
665
|
-
deprecated_since="0.43.0",
|
|
666
|
-
removal_version="0.45.0",
|
|
667
|
-
advice="pass beta_deg explicitly; zero sideslip is used until then",
|
|
668
|
-
)
|
|
669
|
-
|
|
670
|
-
|
|
671
661
|
MATRIX_REFINE = DeprecatedFunction(
|
|
672
662
|
function="pyfs-matrix refine",
|
|
673
663
|
deprecated_since="0.40.0",
|
|
@@ -706,6 +696,5 @@ DEPRECATIONS: tuple[Deprecation, ...] = (
|
|
|
706
696
|
PLAN_MATRIX_FS_VERSION,
|
|
707
697
|
RUN_MATRIX_FS_VERSION,
|
|
708
698
|
INFLOW_STATION_HARMONICS,
|
|
709
|
-
POLAR_ROW_OMITTED_BETA,
|
|
710
699
|
*MATRIX_GEOMETRY_ALIASES,
|
|
711
700
|
)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"""The ``[
|
|
1
|
+
"""The ``[[farfields]]`` entries of the pproc artifact and the lattice shape of ``[[probes]]``.
|
|
2
2
|
|
|
3
3
|
Pipeline role: the input model of the far-field family (FR-454) and of the
|
|
4
4
|
survey-lattice probe shape (FR-1072), validated at load with
|
|
@@ -12,9 +12,11 @@ states none leaves the geometry to the plan's reuse rule (FR-1042, FR-455).
|
|
|
12
12
|
|
|
13
13
|
from __future__ import annotations
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
import json
|
|
16
|
+
import re
|
|
17
|
+
from typing import Annotated, Any, Literal
|
|
16
18
|
|
|
17
|
-
from pydantic import BaseModel, BeforeValidator, ConfigDict, Field, model_validator
|
|
19
|
+
from pydantic import BaseModel, BeforeValidator, ConfigDict, Field, ValidationError, model_validator
|
|
18
20
|
|
|
19
21
|
from pyflightstream.probes.lattice import ProbeLattice, build_lattice
|
|
20
22
|
|
|
@@ -29,7 +31,7 @@ __all__ = [
|
|
|
29
31
|
]
|
|
30
32
|
|
|
31
33
|
#: The three accepted Trefftz variants.
|
|
32
|
-
TREFFTZ_VARIANTS: tuple[str, ...] = ("sections", "wake", "plane")
|
|
34
|
+
TREFFTZ_VARIANTS: tuple[str, ...] = ("sections", "wake", "plane", "power")
|
|
33
35
|
#: The six balances of FR-479, in the order the ledgers table writes them.
|
|
34
36
|
BALANCES: tuple[str, ...] = (
|
|
35
37
|
"mass",
|
|
@@ -39,6 +41,10 @@ BALANCES: tuple[str, ...] = (
|
|
|
39
41
|
"in_plane_moment",
|
|
40
42
|
"crossflow_energy",
|
|
41
43
|
)
|
|
44
|
+
#: The balance names a ``balances`` key accepts; a test pins it to :data:`BALANCES`.
|
|
45
|
+
BalanceName = Literal[
|
|
46
|
+
"mass", "axial", "transverse", "torque", "in_plane_moment", "crossflow_energy"
|
|
47
|
+
]
|
|
42
48
|
#: The defaults of FR-1039 that a table may leave unstated:
|
|
43
49
|
#: the plan's station count per side, the plane's distance behind the
|
|
44
50
|
#: families and, for the wing plane, its half extents and spacing, all in BREF.
|
|
@@ -80,7 +86,7 @@ def _unique(words: list[str], what: str) -> list[str]:
|
|
|
80
86
|
class LatticeShape(BaseModel):
|
|
81
87
|
"""A survey lattice, by its rotor or its frame and the ``build_lattice`` parameters.
|
|
82
88
|
|
|
83
|
-
The keys of ``[
|
|
89
|
+
The keys of ``[[farfields]]`` lattice geometry and of one entry of a
|
|
84
90
|
``[[probes]]`` entry's ``lattices`` (FR-1072): ``rotor`` names the rotor
|
|
85
91
|
whose hub frame and tip radius place the lattice, or ``frame`` and
|
|
86
92
|
``tip_radius_m`` place a lattice that belongs to no rotor; the rest are the
|
|
@@ -164,11 +170,13 @@ class LatticeShape(BaseModel):
|
|
|
164
170
|
stated = {
|
|
165
171
|
key: getattr(self, key) for key in _LATTICE_KEYS if getattr(self, key) is not None
|
|
166
172
|
}
|
|
173
|
+
if self.lateral_radius is None:
|
|
174
|
+
stated["lateral_radius"] = max(2.5, self.r_outer or 2.5)
|
|
167
175
|
return build_lattice(tip_radius=tip_radius, **stated)
|
|
168
176
|
|
|
169
177
|
|
|
170
178
|
class TrefftzSpec(BaseModel):
|
|
171
|
-
"""The ``[
|
|
179
|
+
"""The internal translation of ``[[farfields]]`` Trefftz variants and geometry (FR-454).
|
|
172
180
|
|
|
173
181
|
Attributes
|
|
174
182
|
----------
|
|
@@ -190,7 +198,7 @@ class TrefftzSpec(BaseModel):
|
|
|
190
198
|
model_config = ConfigDict(extra="forbid", allow_inf_nan=False)
|
|
191
199
|
|
|
192
200
|
variant: Annotated[
|
|
193
|
-
list[Literal["sections", "wake", "plane"]], BeforeValidator(_one_or_list)
|
|
201
|
+
list[Literal["sections", "wake", "plane", "power"]], BeforeValidator(_one_or_list)
|
|
194
202
|
] = Field(
|
|
195
203
|
min_length=1,
|
|
196
204
|
description=(
|
|
@@ -226,7 +234,7 @@ class TrefftzSpec(BaseModel):
|
|
|
226
234
|
|
|
227
235
|
@model_validator(mode="after")
|
|
228
236
|
def _each_variant_once(self) -> TrefftzSpec:
|
|
229
|
-
_unique(list(self.variant), "
|
|
237
|
+
_unique(list(self.variant), "Trefftz variant")
|
|
230
238
|
return self
|
|
231
239
|
|
|
232
240
|
@property
|
|
@@ -247,7 +255,7 @@ class TrefftzSpec(BaseModel):
|
|
|
247
255
|
|
|
248
256
|
|
|
249
257
|
class LedgersSpec(LatticeShape):
|
|
250
|
-
"""The ``[
|
|
258
|
+
"""The internal translation of ``[[farfields]]`` balances and lattice (FR-38, FR-454).
|
|
251
259
|
|
|
252
260
|
Attributes
|
|
253
261
|
----------
|
|
@@ -258,11 +266,8 @@ class LedgersSpec(LatticeShape):
|
|
|
258
266
|
the lattice's azimuth count.
|
|
259
267
|
"""
|
|
260
268
|
|
|
261
|
-
balances: list[
|
|
262
|
-
Literal["mass", "axial", "transverse", "torque", "in_plane_moment", "crossflow_energy"]
|
|
263
|
-
] = Field(
|
|
269
|
+
balances: list[BalanceName] = Field(
|
|
264
270
|
default_factory=lambda: list(BALANCES), # type: ignore[arg-type]
|
|
265
|
-
min_length=1,
|
|
266
271
|
description="The balances written: any of the six, all six by default.",
|
|
267
272
|
)
|
|
268
273
|
m_max: int = Field(
|
|
@@ -271,7 +276,7 @@ class LedgersSpec(LatticeShape):
|
|
|
271
276
|
|
|
272
277
|
@model_validator(mode="after")
|
|
273
278
|
def _the_orders_fit_the_azimuths(self) -> LedgersSpec:
|
|
274
|
-
_unique(list(self.balances), "
|
|
279
|
+
_unique(list(self.balances), "balances")
|
|
275
280
|
n_psi = self.build(1.0).n_psi
|
|
276
281
|
if 2 * self.m_max >= n_psi:
|
|
277
282
|
raise ValueError(
|
|
@@ -288,37 +293,224 @@ def _family_selection(value: object) -> object:
|
|
|
288
293
|
|
|
289
294
|
|
|
290
295
|
class FarfieldSpec(BaseModel):
|
|
291
|
-
"""
|
|
296
|
+
"""One named analysis in ``[[farfields]]``; geometry keys belong to their variant.
|
|
297
|
+
|
|
298
|
+
``sections`` requires families and accepts a station count. ``wake`` and
|
|
299
|
+
``plane`` read the whole field. ``power`` requires a rotor or a frame
|
|
300
|
+
lattice and optionally writes balances. Names default to the variant.
|
|
292
301
|
|
|
293
302
|
Attributes
|
|
294
303
|
----------
|
|
304
|
+
variant : str
|
|
305
|
+
One analysis: sections (A), wake (B), plane (C), or power (D).
|
|
306
|
+
name : str
|
|
307
|
+
Unique entry label, defaulting to the variant word.
|
|
308
|
+
export_type : str
|
|
309
|
+
last_step, avg_window, or default; default reads the last unsteady step.
|
|
295
310
|
families : str or list of str
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
311
|
+
Required selection for sections; the other variants read the whole field.
|
|
312
|
+
stations : int or tuple of float
|
|
313
|
+
A station count per side for sections; lattice positions x/R for power.
|
|
314
|
+
distance_bref : float
|
|
315
|
+
Wake or plane distance behind the whole geometry in BREF.
|
|
316
|
+
half_width_bref, half_height_bref, spacing_bref : float
|
|
317
|
+
Plane half extents and uniform spacing in BREF.
|
|
318
|
+
station : float
|
|
319
|
+
Power station x/R; defaults to the last lattice station.
|
|
320
|
+
rotor : str
|
|
321
|
+
Reference rotor whose hub and radius place the power lattice.
|
|
322
|
+
frame, tip_radius_m : str and float
|
|
323
|
+
Alternative power lattice placement: frame and reference radius in metres.
|
|
324
|
+
n_r, r_inner, r_outer, n_psi : int or float
|
|
325
|
+
Power lattice ring count, radial bounds r/R, and uniform azimuth count.
|
|
326
|
+
lateral_radius, lateral_stations : float or tuple of float
|
|
327
|
+
Power lattice closure cylinder radius r/R and ring positions x/R.
|
|
328
|
+
hub_width, tip_width : float
|
|
329
|
+
Power lattice clustering widths r/R near the hub and tip.
|
|
330
|
+
m_max : int
|
|
331
|
+
Highest azimuthal harmonic, strictly below half the lattice azimuth count.
|
|
332
|
+
balances : list of str
|
|
333
|
+
Optional ledger balances; omitted, no ledger table is requested.
|
|
334
|
+
last_revs : float, optional
|
|
335
|
+
Positive trailing revolutions on the row's rotor clock, for this entry's average.
|
|
336
|
+
last_steps : int, optional
|
|
337
|
+
Positive trailing step count, exclusive with last_revs; omitted, use the row window.
|
|
302
338
|
"""
|
|
303
339
|
|
|
304
340
|
model_config = ConfigDict(extra="forbid", allow_inf_nan=False)
|
|
341
|
+
variant: Literal["sections", "wake", "plane", "power"]
|
|
342
|
+
name: str = Field(default="", min_length=1)
|
|
343
|
+
export_type: Literal["last_step", "avg_window", "default"] = "default"
|
|
344
|
+
families: Annotated[str | list[str] | None, BeforeValidator(_family_selection)] = None
|
|
345
|
+
stations: int | tuple[float, ...] | None = None
|
|
346
|
+
distance_bref: float = Field(default=0.25, gt=0)
|
|
347
|
+
half_width_bref: float | None = Field(default=None, gt=0)
|
|
348
|
+
half_height_bref: float | None = Field(default=None, gt=0)
|
|
349
|
+
spacing_bref: float | None = Field(default=None, gt=0)
|
|
350
|
+
station: float | None = None
|
|
351
|
+
rotor: str | None = None
|
|
352
|
+
frame: str | None = None
|
|
353
|
+
tip_radius_m: float | None = None
|
|
354
|
+
n_r: int | None = None
|
|
355
|
+
r_inner: float | None = None
|
|
356
|
+
r_outer: float | None = None
|
|
357
|
+
n_psi: int | None = None
|
|
358
|
+
lateral_radius: float | None = None
|
|
359
|
+
lateral_stations: tuple[float, ...] | None = None
|
|
360
|
+
hub_width: float | None = None
|
|
361
|
+
tip_width: float | None = None
|
|
362
|
+
m_max: int = 6
|
|
363
|
+
balances: list[BalanceName] = Field(default_factory=list)
|
|
364
|
+
last_revs: float | None = Field(default=None, gt=0, strict=True)
|
|
365
|
+
last_steps: int | None = Field(default=None, gt=0, strict=True)
|
|
366
|
+
|
|
367
|
+
@model_validator(mode="before")
|
|
368
|
+
@classmethod
|
|
369
|
+
def _keys_belong_to_the_variant(cls, value: Any) -> Any:
|
|
370
|
+
if not isinstance(value, dict):
|
|
371
|
+
return value
|
|
372
|
+
variant = value.get("variant")
|
|
373
|
+
if not isinstance(variant, str) or variant not in TREFFTZ_VARIANTS:
|
|
374
|
+
return value
|
|
375
|
+
for key in value:
|
|
376
|
+
readers = _KEY_VARIANTS.get(key)
|
|
377
|
+
if readers is not None and variant not in readers:
|
|
378
|
+
reason = ""
|
|
379
|
+
if key == "families":
|
|
380
|
+
reason = (
|
|
381
|
+
"; wake, plane and power read the whole field, "
|
|
382
|
+
"so there is no family selection"
|
|
383
|
+
)
|
|
384
|
+
raise ValueError(f"{key} is read by {', '.join(readers)}, not {variant!r}{reason}")
|
|
385
|
+
return value
|
|
305
386
|
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
"
|
|
387
|
+
@model_validator(mode="after")
|
|
388
|
+
def _analysis_geometry(self) -> FarfieldSpec:
|
|
389
|
+
if self.last_revs is not None and self.last_steps is not None:
|
|
390
|
+
raise ValueError("state only one window, not both last_revs and last_steps")
|
|
391
|
+
if not self.name:
|
|
392
|
+
self.name = self.variant
|
|
393
|
+
if self.variant == "sections":
|
|
394
|
+
if self.families is None:
|
|
395
|
+
raise ValueError('variant = "sections" requires families')
|
|
396
|
+
if self.stations is not None and (
|
|
397
|
+
not isinstance(self.stations, int) or self.stations < 2
|
|
398
|
+
):
|
|
399
|
+
raise ValueError('variant = "sections" reads stations as a count of at least 2')
|
|
400
|
+
if self.variant == "power":
|
|
401
|
+
if isinstance(self.stations, int):
|
|
402
|
+
raise ValueError('variant = "power" reads stations as a list of x/R positions')
|
|
403
|
+
_ = self.ledgers
|
|
404
|
+
return self
|
|
405
|
+
|
|
406
|
+
@property
|
|
407
|
+
def trefftz(self) -> TrefftzSpec:
|
|
408
|
+
"""Return the numerical trace parameters of this single analysis."""
|
|
409
|
+
keys = ("distance_bref", "half_width_bref", "half_height_bref", "spacing_bref", "station")
|
|
410
|
+
values = {key: getattr(self, key) for key in keys}
|
|
411
|
+
values.update(
|
|
412
|
+
variant=[self.variant], stations=self.stations if self.variant == "sections" else 80
|
|
310
413
|
)
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
414
|
+
if values["stations"] is None:
|
|
415
|
+
values["stations"] = 80
|
|
416
|
+
try:
|
|
417
|
+
return TrefftzSpec.model_validate(values)
|
|
418
|
+
except ValidationError as error:
|
|
419
|
+
raise self._entry_error(error) from error
|
|
316
420
|
|
|
317
|
-
@
|
|
318
|
-
def
|
|
319
|
-
|
|
421
|
+
@property
|
|
422
|
+
def ledgers(self) -> LedgersSpec | None:
|
|
423
|
+
"""Return the power analysis's validated lattice, or None for a trace."""
|
|
424
|
+
if self.variant != "power":
|
|
425
|
+
return None
|
|
426
|
+
keys = (*_LATTICE_KEYS, "rotor", "frame", "tip_radius_m", "m_max", "balances")
|
|
427
|
+
try:
|
|
428
|
+
return LedgersSpec.model_validate({key: getattr(self, key) for key in keys})
|
|
429
|
+
except ValidationError as error:
|
|
430
|
+
raise self._entry_error(error) from error
|
|
431
|
+
|
|
432
|
+
def _entry_error(self, error: ValidationError) -> ValueError:
|
|
433
|
+
parts = []
|
|
434
|
+
for item in error.errors():
|
|
435
|
+
key = ".".join(str(part) for part in item["loc"])
|
|
436
|
+
message = str(item["msg"]).removeprefix("Value error, ")
|
|
437
|
+
parts.append(f"{key}: {message}" if key else message)
|
|
438
|
+
return ValueError(f"[[farfields]] entry {self.name!r}: " + "; ".join(parts))
|
|
439
|
+
|
|
440
|
+
|
|
441
|
+
_KEY_VARIANTS = {
|
|
442
|
+
"families": ("sections",),
|
|
443
|
+
"stations": ("sections", "power"),
|
|
444
|
+
"distance_bref": ("wake", "plane"),
|
|
445
|
+
**{key: ("plane",) for key in ("half_width_bref", "half_height_bref", "spacing_bref")},
|
|
446
|
+
**{
|
|
447
|
+
key: ("power",)
|
|
448
|
+
for key in (
|
|
449
|
+
*_LATTICE_KEYS[1:],
|
|
450
|
+
"station",
|
|
451
|
+
"rotor",
|
|
452
|
+
"frame",
|
|
453
|
+
"tip_radius_m",
|
|
454
|
+
"m_max",
|
|
455
|
+
"balances",
|
|
456
|
+
)
|
|
457
|
+
},
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
|
|
461
|
+
def farfield_entries(value: Any) -> Any:
|
|
462
|
+
"""Refuse the retired table with equivalent array entries."""
|
|
463
|
+
if not isinstance(value, dict):
|
|
464
|
+
return value
|
|
465
|
+
if value.get("farfield") is not None:
|
|
466
|
+
old = value["farfield"]
|
|
467
|
+
entries = []
|
|
468
|
+
if isinstance(old, dict):
|
|
469
|
+
trace = old.get("trefftz", {})
|
|
470
|
+
variants = trace.get("variant", [])
|
|
471
|
+
for variant in [variants] if isinstance(variants, str) else variants:
|
|
472
|
+
entry = {"variant": variant}
|
|
473
|
+
entry.update(
|
|
474
|
+
{k: v for k, v in trace.items() if variant in _KEY_VARIANTS.get(k, ())}
|
|
475
|
+
)
|
|
476
|
+
if variant == "sections":
|
|
477
|
+
entry["families"] = old.get("families", "all")
|
|
478
|
+
entries.append(entry)
|
|
479
|
+
if "ledgers" in old:
|
|
480
|
+
power = {"variant": "power", "balances": list(BALANCES), **old["ledgers"]}
|
|
481
|
+
if "station" in trace:
|
|
482
|
+
power["station"] = trace["station"]
|
|
483
|
+
entries.append(power)
|
|
484
|
+
replacement = "\n\n".join(
|
|
485
|
+
"[[farfields]]\n"
|
|
486
|
+
+ "\n".join(f"{key} = {json.dumps(val)}" for key, val in entry.items())
|
|
487
|
+
for entry in entries
|
|
488
|
+
)
|
|
489
|
+
raise ValueError(
|
|
490
|
+
"[farfield] was replaced by [[farfields]], one analysis per entry:\n"
|
|
491
|
+
+ replacement
|
|
492
|
+
+ '\nA 0.44.0 "plane" with ledgers on a rotor row becomes the "power" entry (D), '
|
|
493
|
+
'not the "plane" entry (C); keep C only to request the velocity plane as well.'
|
|
494
|
+
)
|
|
495
|
+
return value
|
|
496
|
+
|
|
497
|
+
|
|
498
|
+
def _refuse_filename_collisions(entries: Any) -> None:
|
|
499
|
+
"""Refuse sanitized filename collisions even on case-insensitive filesystems."""
|
|
500
|
+
names: dict[str, str] = {}
|
|
501
|
+
for entry in entries if isinstance(entries, list | tuple) else ():
|
|
502
|
+
name = (
|
|
503
|
+
entry.name
|
|
504
|
+
if isinstance(entry, FarfieldSpec)
|
|
505
|
+
else (entry.get("name", entry.get("variant")) if isinstance(entry, dict) else None)
|
|
506
|
+
)
|
|
507
|
+
if not isinstance(name, str):
|
|
508
|
+
continue
|
|
509
|
+
spelling = re.sub(r"[^A-Za-z0-9_.+-]", "_", name).casefold()
|
|
510
|
+
previous = names.get(spelling)
|
|
511
|
+
if previous is not None and previous != name:
|
|
320
512
|
raise ValueError(
|
|
321
|
-
"[
|
|
322
|
-
"
|
|
513
|
+
f"[[farfields]] names {previous!r} and {name!r} share file spelling "
|
|
514
|
+
f"{spelling!r} ignoring case; choose names with distinct file spellings"
|
|
323
515
|
)
|
|
324
|
-
|
|
516
|
+
names[spelling] = name
|
|
@@ -70,6 +70,8 @@ class FarfieldInput:
|
|
|
70
70
|
The declaration reused, or what the plan adds.
|
|
71
71
|
reason : str
|
|
72
72
|
Why the input is not applicable or refused; empty otherwise.
|
|
73
|
+
entry, variant : str
|
|
74
|
+
The requesting entry's name and public variant, assigned by the workflow.
|
|
73
75
|
"""
|
|
74
76
|
|
|
75
77
|
analysis: str
|
|
@@ -77,10 +79,14 @@ class FarfieldInput:
|
|
|
77
79
|
state: str
|
|
78
80
|
source: str = ""
|
|
79
81
|
reason: str = ""
|
|
82
|
+
entry: str = ""
|
|
83
|
+
variant: str = ""
|
|
80
84
|
|
|
81
85
|
def as_record(self) -> dict[str, str]:
|
|
82
86
|
"""Return the input as the plan output states it (FR-1047)."""
|
|
83
87
|
return {
|
|
88
|
+
"entry": self.entry,
|
|
89
|
+
"variant": self.variant,
|
|
84
90
|
"analysis": self.analysis,
|
|
85
91
|
"input": self.input,
|
|
86
92
|
"state": self.state,
|
|
@@ -145,11 +151,22 @@ def applies(analysis: str, run_type: str, *, rotor: bool = False) -> str:
|
|
|
145
151
|
>>> bool(applies('trefftz:wake', 'unsteady_rotor'))
|
|
146
152
|
True
|
|
147
153
|
"""
|
|
148
|
-
if analysis
|
|
154
|
+
if analysis == "trefftz:plane" and run_type == "qsteady_rotor":
|
|
155
|
+
return (
|
|
156
|
+
"Trefftz C requires a uniform freestream; qsteady_rotor uses a rotating frame: "
|
|
157
|
+
'select "power"'
|
|
158
|
+
)
|
|
159
|
+
if analysis == "trefftz:sections" and run_type == "qsteady_rotor":
|
|
160
|
+
return (
|
|
161
|
+
"Trefftz A on qsteady_rotor has no lifting surface outside the rotor: "
|
|
162
|
+
"state the A entry on a steady or unsteady_rotor row that carries the lifting "
|
|
163
|
+
'surfaces, or select "power" for the rotor on this row'
|
|
164
|
+
)
|
|
165
|
+
if analysis == "trefftz:wake":
|
|
149
166
|
if rotor or run_type in ROTOR_RUN_TYPES:
|
|
150
167
|
return "a rotor's helical wake is not a streamwise sheet"
|
|
151
168
|
if run_type in UNSTEADY_RUN_TYPES:
|
|
152
|
-
return "
|
|
169
|
+
return "variant B serves steady rows"
|
|
153
170
|
return ""
|
|
154
171
|
|
|
155
172
|
|
|
@@ -184,7 +201,7 @@ def few_stations_warning(family: str, per_side: int, stations: int) -> str:
|
|
|
184
201
|
"""Return the WARNING of a family traced on fewer stations than asked (FR-1019).
|
|
185
202
|
|
|
186
203
|
One sentence, said by the plan and by post alike: the family, its station
|
|
187
|
-
count per side, the count ``[
|
|
204
|
+
count per side, the count its ``[[farfields]]`` sections entry asks for, and the
|
|
188
205
|
strip bias of ``E_T`` the definitions page measured at the nearest count
|
|
189
206
|
(:data:`STRIP_BIAS_PERCENT`).
|
|
190
207
|
|
|
@@ -195,7 +212,7 @@ def few_stations_warning(family: str, per_side: int, stations: int) -> str:
|
|
|
195
212
|
per_side : int
|
|
196
213
|
Its station count per side of the symmetry plane.
|
|
197
214
|
stations : int
|
|
198
|
-
The count per side ``[
|
|
215
|
+
The count per side its ``[[farfields]]`` sections entry asks for.
|
|
199
216
|
|
|
200
217
|
Returns
|
|
201
218
|
-------
|
|
@@ -206,8 +223,9 @@ def few_stations_warning(family: str, per_side: int, stations: int) -> str:
|
|
|
206
223
|
return ""
|
|
207
224
|
nearest = min(STRIP_BIAS_PERCENT, key=lambda count: (abs(count - per_side), count))
|
|
208
225
|
return (
|
|
209
|
-
f"family {family} has {per_side} stations per side, fewer than the {stations}
|
|
210
|
-
|
|
226
|
+
f"family {family} has {per_side} stations per side, fewer than the {stations} its "
|
|
227
|
+
"[[farfields]] sections entry asks for; the strip bias of E_T measured on the "
|
|
228
|
+
"definitions page is "
|
|
211
229
|
f"{STRIP_BIAS_PERCENT[nearest]} percent at {nearest} stations per side (FR-1019)"
|
|
212
230
|
)
|
|
213
231
|
|
|
@@ -216,7 +234,7 @@ def _analyses(spec: FarfieldSpec) -> list[str]:
|
|
|
216
234
|
out = []
|
|
217
235
|
if spec.trefftz is not None:
|
|
218
236
|
out += [f"trefftz:{variant}" for variant in spec.trefftz.variant]
|
|
219
|
-
if spec.
|
|
237
|
+
if spec.balances:
|
|
220
238
|
out.append("ledgers")
|
|
221
239
|
return out
|
|
222
240
|
|
|
@@ -240,7 +258,7 @@ def resolve_farfield(
|
|
|
240
258
|
Parameters
|
|
241
259
|
----------
|
|
242
260
|
spec : FarfieldSpec
|
|
243
|
-
The row's ``[
|
|
261
|
+
The row's named ``[[farfields]]`` entry.
|
|
244
262
|
run_type : str
|
|
245
263
|
The row's run type (``steady``, ``unsteady``, ``unsteady_rotor``,
|
|
246
264
|
``qsteady_rotor``).
|
|
@@ -248,7 +266,7 @@ def resolve_farfield(
|
|
|
248
266
|
The families a declared ``[sections]`` distribution cuts in plane XZ of a
|
|
249
267
|
reference-axes frame (FR-1045).
|
|
250
268
|
selected_families : sequence of str
|
|
251
|
-
The families ``[
|
|
269
|
+
The families the ``[[farfields]]`` entry resolves to on the row's geometry.
|
|
252
270
|
exports : dict of str to bool
|
|
253
271
|
The artifact's ``[exports]`` table, as stated.
|
|
254
272
|
declares_lattice, declares_plane : bool
|
|
@@ -282,13 +300,17 @@ def resolve_farfield(
|
|
|
282
300
|
analysis,
|
|
283
301
|
"families",
|
|
284
302
|
"refused",
|
|
285
|
-
reason=
|
|
303
|
+
reason=(
|
|
304
|
+
f"[[farfields]] entry {spec.name!r}: families = {spec.families!r} "
|
|
305
|
+
"names no family of the geometry"
|
|
306
|
+
),
|
|
286
307
|
)
|
|
287
308
|
return FarfieldResolution(tuple(resolver.inputs))
|
|
288
309
|
for analysis in _analyses(spec):
|
|
289
310
|
why = applies(analysis, run_type, rotor=rotor)
|
|
290
311
|
if why:
|
|
291
|
-
|
|
312
|
+
state = "refused" if analysis != "trefftz:wake" else "not_applicable"
|
|
313
|
+
resolver.item(analysis, "run_type", state, reason=why)
|
|
292
314
|
elif analysis == "trefftz:sections":
|
|
293
315
|
resolver.sections(analysis, selected_families, coupled)
|
|
294
316
|
elif analysis == "trefftz:wake":
|
|
@@ -305,7 +327,7 @@ def resolve_farfield(
|
|
|
305
327
|
)
|
|
306
328
|
else:
|
|
307
329
|
# A rotor's Trefftz C reads a lattice station, as _Resolver.probes says (PFS-2081.101).
|
|
308
|
-
reads_lattice = analysis
|
|
330
|
+
reads_lattice = analysis in ("ledgers", "trefftz:power")
|
|
309
331
|
declared = declares_lattice if reads_lattice else declares_plane
|
|
310
332
|
resolver.probes(analysis, declared)
|
|
311
333
|
return FarfieldResolution(tuple(resolver.inputs))
|
|
@@ -330,8 +352,6 @@ class _Resolver:
|
|
|
330
352
|
|
|
331
353
|
def lacks(self, analysis: str, name: str) -> bool:
|
|
332
354
|
command = _COMMANDS[name]
|
|
333
|
-
if name == "probe_points" and self.run_type in UNSTEADY_RUN_TYPES:
|
|
334
|
-
command = "UNSTEADY_SOLVER_NEW_FLUID_PLOT"
|
|
335
355
|
if self.has_command(command):
|
|
336
356
|
return False
|
|
337
357
|
self.item(analysis, name, "refused", reason=f"the selected build has no {command}")
|
|
@@ -387,7 +407,7 @@ class _Resolver:
|
|
|
387
407
|
self.export(analysis, "sectional_loads", "sectional_loads_export", True)
|
|
388
408
|
|
|
389
409
|
def probes(self, analysis: str, declared: bool) -> None:
|
|
390
|
-
shape = "lattice" if analysis
|
|
410
|
+
shape = "lattice" if analysis in ("ledgers", "trefftz:power") else "plane"
|
|
391
411
|
self.needed(
|
|
392
412
|
analysis,
|
|
393
413
|
"probe_points",
|
|
@@ -395,7 +415,4 @@ class _Resolver:
|
|
|
395
415
|
f"the declared [[probes]] {shape}",
|
|
396
416
|
f"the far-field {shape} as probe points",
|
|
397
417
|
)
|
|
398
|
-
|
|
399
|
-
self.item(analysis, "probe_export", "added", "per-step fluid plots of every point")
|
|
400
|
-
else:
|
|
401
|
-
self.export(analysis, "probes", "probe_export", True)
|
|
418
|
+
self.item(analysis, "probe_export", "added", "the dedicated farfield_probes export")
|
|
@@ -44,7 +44,12 @@ from pyflightstream._tokens import REDUCTION_COLUMNS
|
|
|
44
44
|
|
|
45
45
|
# The quasi-steady wheel's correction choice, a table of the pproc; its
|
|
46
46
|
# module imports only the floor, so the package may import it while it loads.
|
|
47
|
-
from pyflightstream.cases._farfield_spec import
|
|
47
|
+
from pyflightstream.cases._farfield_spec import (
|
|
48
|
+
FarfieldSpec,
|
|
49
|
+
LatticeShape,
|
|
50
|
+
_refuse_filename_collisions,
|
|
51
|
+
farfield_entries,
|
|
52
|
+
)
|
|
48
53
|
from pyflightstream.cases.corrections import QsteadyCorrectionSpec
|
|
49
54
|
from pyflightstream.cases.reference_blocks import CampaignConfigError
|
|
50
55
|
from pyflightstream.cases.selection import EVERY_FAMILY
|
|
@@ -127,6 +132,7 @@ EXPORT_KINDS: tuple[tuple[str, str, str, bool], ...] = (
|
|
|
127
132
|
("sections", "_cp.txt", "EXPORT_ALL_SURFACE_SECTIONS", False),
|
|
128
133
|
("sectional_loads", "_sloads.txt", "EXPORT_SURFACE_SECTIONAL_LOADS", False),
|
|
129
134
|
("probes", "_probes.txt", "EXPORT_PROBE_POINTS", False),
|
|
135
|
+
("farfield_probes", "_farfield_survey.txt", "EXPORT_PROBE_POINTS", False),
|
|
130
136
|
("plots", "_plots.txt", "UNSTEADY_SOLVER_EXPORT_PLOTS", True),
|
|
131
137
|
("plot_residuals", "_plot_residuals.txt", "SAVE_PLOT_TO_FILE", False),
|
|
132
138
|
("plot_loads", "_plot_loads.txt", "SAVE_PLOT_TO_FILE", False),
|
|
@@ -148,7 +154,7 @@ EXPORT_KINDS: tuple[tuple[str, str, str, bool], ...] = (
|
|
|
148
154
|
#: (FR-460) and the trajectory of a row's ``SIXDOF`` input (FR-461). Each is
|
|
149
155
|
#: written once, where its command sits, and never by a per-step action.
|
|
150
156
|
TABLE_DECLARED_KINDS: frozenset[str] = frozenset(
|
|
151
|
-
{"streamlines_surface", "streamlines_off_body", "trajectory_6dof"}
|
|
157
|
+
{"streamlines_surface", "streamlines_off_body", "trajectory_6dof", "farfield_probes"}
|
|
152
158
|
)
|
|
153
159
|
|
|
154
160
|
#: The plot each solver-plot kind chooses with ``SET_PLOT_TYPE`` before its
|
|
@@ -2034,8 +2040,8 @@ class PprocSpec(BaseModel):
|
|
|
2034
2040
|
families.
|
|
2035
2041
|
probes : list of ProbesSpec
|
|
2036
2042
|
The fluid probe entries, one per frame sampled.
|
|
2037
|
-
|
|
2038
|
-
|
|
2043
|
+
farfields : list of FarfieldSpec
|
|
2044
|
+
Named far-field entries, one variant and optional window each (FR-454);
|
|
2039
2045
|
absent, the artifact plans and posts as before.
|
|
2040
2046
|
products : ProductsSpec
|
|
2041
2047
|
Which post-processed tables the campaign writes.
|
|
@@ -2157,7 +2163,28 @@ class PprocSpec(BaseModel):
|
|
|
2157
2163
|
#: Native surface-property histories, separate from fluid samples and field products.
|
|
2158
2164
|
surface_probes: list[SurfaceProbeSpec] = Field(default_factory=list)
|
|
2159
2165
|
#: FR-454: the far-field family's table; absent, nothing changes.
|
|
2160
|
-
|
|
2166
|
+
farfields: list[FarfieldSpec] = Field(default_factory=list)
|
|
2167
|
+
|
|
2168
|
+
@model_validator(mode="before")
|
|
2169
|
+
@classmethod
|
|
2170
|
+
def _farfield_entries(cls, value: object) -> object:
|
|
2171
|
+
return farfield_entries(value)
|
|
2172
|
+
|
|
2173
|
+
@field_validator("farfields")
|
|
2174
|
+
@classmethod
|
|
2175
|
+
def _unique_farfield_names(cls, entries: list[FarfieldSpec]) -> list[FarfieldSpec]:
|
|
2176
|
+
names = [entry.name for entry in entries]
|
|
2177
|
+
if len(names) != len(set(names)):
|
|
2178
|
+
raise ValueError(
|
|
2179
|
+
f"[[farfields]] names {names!r} must be unique; name repeated variants separately"
|
|
2180
|
+
)
|
|
2181
|
+
_refuse_filename_collisions(entries)
|
|
2182
|
+
return entries
|
|
2183
|
+
|
|
2184
|
+
@property
|
|
2185
|
+
def farfield(self) -> FarfieldSpec | None:
|
|
2186
|
+
"""Return the entry of an analysis-specific planning or post context."""
|
|
2187
|
+
return self.farfields[0] if self.farfields else None
|
|
2161
2188
|
|
|
2162
2189
|
@field_validator("surface_probes")
|
|
2163
2190
|
@classmethod
|