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.
Files changed (414) hide show
  1. pyflightstream-0.45.0/MANIFEST.in +2 -0
  2. {pyflightstream-0.44.0/src/pyflightstream.egg-info → pyflightstream-0.45.0}/PKG-INFO +1 -1
  3. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/pyproject.toml +1 -5
  4. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/_deprecations.py +0 -11
  5. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/_farfield_spec.py +228 -36
  6. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/farfield_inputs.py +36 -19
  7. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/pproc.py +32 -5
  8. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/_clock.py +98 -25
  9. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/_exports.py +8 -2
  10. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/_farfield.py +183 -41
  11. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/_pproc.py +1 -1
  12. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/_probes.py +14 -9
  13. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/_timing.py +5 -0
  14. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/solver_export.yaml +6 -4
  15. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/farfield/__init__.py +1 -1
  16. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/_field_inputs.py +21 -11
  17. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/_reduction_stage.py +258 -5
  18. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/farfield_fields.py +15 -52
  19. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/farfield_products.py +255 -245
  20. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/polar.py +5 -11
  21. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/products.py +5 -1
  22. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/qsteady_noise.py +6 -2
  23. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/series.py +1 -1
  24. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/superfile.py +2 -2
  25. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/probes/lattice.py +2 -1
  26. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/probes/layouts.py +2 -1
  27. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_actions_counter.py +42 -8
  28. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_plan.py +1 -1
  29. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_plan_report.py +4 -1
  30. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_points.py +10 -0
  31. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/script/_build_forms.py +10 -6
  32. {pyflightstream-0.44.0 → pyflightstream-0.45.0/src/pyflightstream.egg-info}/PKG-INFO +1 -1
  33. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream.egg-info/SOURCES.txt +1 -0
  34. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/LICENSE +0 -0
  35. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/README.md +0 -0
  36. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/setup.cfg +0 -0
  37. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/__init__.py +0 -0
  38. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/_atmosphere.py +0 -0
  39. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/_cli.py +0 -0
  40. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/_console.py +0 -0
  41. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/_decimal.py +0 -0
  42. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/_digest.py +0 -0
  43. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/_errors.py +0 -0
  44. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/_expressions.py +0 -0
  45. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/_fsi_calibration.py +0 -0
  46. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/_fsm.py +0 -0
  47. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/_fsm_fresh.py +0 -0
  48. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/_lengths.py +0 -0
  49. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/_maturity.py +0 -0
  50. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/_mesh.py +0 -0
  51. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/_progress.py +0 -0
  52. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/_retired_names.py +0 -0
  53. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/_signature.py +0 -0
  54. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/_textio.py +0 -0
  55. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/_tokens.py +0 -0
  56. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/_yamlflow.py +0 -0
  57. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/__init__.py +0 -0
  58. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/_ccs.py +0 -0
  59. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/_fsi_external.py +0 -0
  60. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/_geometry_emit.py +0 -0
  61. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/_geometry_instruction.py +0 -0
  62. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/_matrix_layouts.py +0 -0
  63. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/_matrix_upgrade.py +0 -0
  64. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/_setup_keys.py +0 -0
  65. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/_setup_link.py +0 -0
  66. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/_skipped_families.py +0 -0
  67. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/_sweep_names.py +0 -0
  68. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/_unsteady_actions.py +0 -0
  69. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/acoustics.py +0 -0
  70. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/ccs_fuselage.py +0 -0
  71. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/ccs_revolution.py +0 -0
  72. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/ccs_wing.py +0 -0
  73. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/corrections.py +0 -0
  74. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/field_coverage.py +0 -0
  75. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/freestream.py +0 -0
  76. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/fsi_workspace.py +0 -0
  77. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/matrix.py +0 -0
  78. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/mesh.py +0 -0
  79. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/naming.py +0 -0
  80. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/qsteady.py +0 -0
  81. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/reference_blocks.py +0 -0
  82. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/selection.py +0 -0
  83. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/settings.py +0 -0
  84. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/setup_surfaces.py +0 -0
  85. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/sixdof.py +0 -0
  86. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/windows.py +0 -0
  87. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/__init__.py +0 -0
  88. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/_actuator.py +0 -0
  89. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/_additional.py +0 -0
  90. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/_batch_actions.py +0 -0
  91. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/_batch_script.py +0 -0
  92. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/_conventions.py +0 -0
  93. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/_export_first_step.py +0 -0
  94. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/_frames.py +0 -0
  95. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/_freestream.py +0 -0
  96. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/_gap_evidence.py +0 -0
  97. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/_geometry.py +0 -0
  98. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/_motion.py +0 -0
  99. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/_names.py +0 -0
  100. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/_qsteady_rotor.py +0 -0
  101. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/_reductions.py +0 -0
  102. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/_registry.py +0 -0
  103. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/_rotor.py +0 -0
  104. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/_row_cells.py +0 -0
  105. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/_rows.py +0 -0
  106. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/_sixdof.py +0 -0
  107. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/_skeleton.py +0 -0
  108. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/_solver_settings.py +0 -0
  109. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/_steady.py +0 -0
  110. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/_streamlines.py +0 -0
  111. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/_unsteady.py +0 -0
  112. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/_vocabulary.py +0 -0
  113. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/cases/workflows/_wake_length.py +0 -0
  114. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/__init__.py +0 -0
  115. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/_meta.yaml +0 -0
  116. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/_schema.py +0 -0
  117. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/acoustics.yaml +0 -0
  118. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/actuators.yaml +0 -0
  119. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/advanced_settings.yaml +0 -0
  120. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/aeroelastic_coupling.yaml +0 -0
  121. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/base_regions.yaml +0 -0
  122. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/boundary_conditions.yaml +0 -0
  123. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/cad.yaml +0 -0
  124. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/cad_create.yaml +0 -0
  125. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/ccs_fuselage_mesh.yaml +0 -0
  126. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/ccs_revolve_mesh.yaml +0 -0
  127. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/ccs_wing_mesh.yaml +0 -0
  128. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/coordinate_systems.yaml +0 -0
  129. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/file_io.yaml +0 -0
  130. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/free_surfaces.yaml +0 -0
  131. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/inlets_outlets.yaml +0 -0
  132. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/mesh_import_export.yaml +0 -0
  133. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/mesh_operations.yaml +0 -0
  134. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/mesh_unite.yaml +0 -0
  135. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/mesh_wrapper.yaml +0 -0
  136. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/motion_definitions.yaml +0 -0
  137. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/plots.yaml +0 -0
  138. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/probe_points.yaml +0 -0
  139. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/runtime_settings.yaml +0 -0
  140. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/scene_settings.yaml +0 -0
  141. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/scenes.yaml +0 -0
  142. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/script_controls.yaml +0 -0
  143. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/simulation_controls.yaml +0 -0
  144. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/solver_analysis.yaml +0 -0
  145. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/solver_contours.yaml +0 -0
  146. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/solver_initialization.yaml +0 -0
  147. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/solver_settings.yaml +0 -0
  148. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/stability_toolbox.yaml +0 -0
  149. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/streamlines.yaml +0 -0
  150. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/surface_sections.yaml +0 -0
  151. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/sweeper.yaml +0 -0
  152. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/transition_trips.yaml +0 -0
  153. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/unsteady_solver.yaml +0 -0
  154. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/commands/volume_sections.yaml +0 -0
  155. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/exceptions.py +0 -0
  156. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/extras.py +0 -0
  157. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/farfield/balances.py +0 -0
  158. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/farfield/fields.py +0 -0
  159. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/farfield/quadrature.py +0 -0
  160. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/farfield/trefftz.py +0 -0
  161. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/fsi/__init__.py +0 -0
  162. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/fsi/_direct_morphing.py +0 -0
  163. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/fsi/beam.py +0 -0
  164. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/fsi/calibration.py +0 -0
  165. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/fsi/centrifugal.py +0 -0
  166. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/fsi/cli.py +0 -0
  167. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/fsi/config.py +0 -0
  168. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/fsi/driver.py +0 -0
  169. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/fsi/errors.py +0 -0
  170. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/fsi/external.py +0 -0
  171. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/fsi/kinematics.py +0 -0
  172. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/fsi/loads.py +0 -0
  173. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/fsi/materials.py +0 -0
  174. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/fsi/nodes.py +0 -0
  175. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/fsi/sections.py +0 -0
  176. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/fsi/state.py +0 -0
  177. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/fsi/wing.py +0 -0
  178. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/options.py +0 -0
  179. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/overview.py +0 -0
  180. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/__init__.py +0 -0
  181. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/_additional.py +0 -0
  182. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/_admit.py +0 -0
  183. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/_condition.py +0 -0
  184. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/_installed_copies.py +0 -0
  185. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/_matrix_template.py +0 -0
  186. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/_noise_products.py +0 -0
  187. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/_products_campaign.py +0 -0
  188. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/_rotor_plan.py +0 -0
  189. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/_rotor_products.py +0 -0
  190. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/_settings_product.py +0 -0
  191. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/_sim.py +0 -0
  192. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/_stage.py +0 -0
  193. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/_structure.py +0 -0
  194. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/_tables.py +0 -0
  195. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/_transfer_functions.py +0 -0
  196. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/acoustics.py +0 -0
  197. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/axes.py +0 -0
  198. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/boundary_layer.py +0 -0
  199. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/corrections.py +0 -0
  200. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/custom_polar.py +0 -0
  201. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/diagnostics.py +0 -0
  202. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/disc_maps.py +0 -0
  203. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/equations.py +0 -0
  204. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/field_frames.py +0 -0
  205. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/glossary.py +0 -0
  206. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/guides.py +0 -0
  207. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/harmonics.py +0 -0
  208. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/inflow_tools.py +0 -0
  209. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/input_template.py +0 -0
  210. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/point_tables.py +0 -0
  211. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/probe_fields.py +0 -0
  212. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/provenance.py +0 -0
  213. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/qsteady.py +0 -0
  214. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/reductions.py +0 -0
  215. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/rotor_table.py +0 -0
  216. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/section_distributions.py +0 -0
  217. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/settings_table.py +0 -0
  218. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/streamlines.py +0 -0
  219. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/surfaces.py +0 -0
  220. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/unsteady.py +0 -0
  221. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/unsteady_polar.py +0 -0
  222. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/post/writers.py +0 -0
  223. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/probes/__init__.py +0 -0
  224. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/probes/_model.py +0 -0
  225. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/probes/errors.py +0 -0
  226. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/probes/geometry.py +0 -0
  227. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/probes/planar.py +0 -0
  228. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/__init__.py +0 -0
  229. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/_reanalysis.py +0 -0
  230. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/_spec_0400_gap.py +0 -0
  231. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/_spec_0400_gapbase.py +0 -0
  232. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/_spec_0400_gapedges.py +0 -0
  233. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/_spec_0400_gapkit.py +0 -0
  234. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/_spec_26125.py +0 -0
  235. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/_spec_catalog_b.py +0 -0
  236. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/_spec_ccs_mesh.py +0 -0
  237. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/_spec_ccs_noise.py +0 -0
  238. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/_spec_kit.py +0 -0
  239. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/_spec_t1.py +0 -0
  240. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/cli.py +0 -0
  241. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/compat.py +0 -0
  242. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/cost.py +0 -0
  243. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/drift.py +0 -0
  244. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/errors.py +0 -0
  245. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/geometry.py +0 -0
  246. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/matrix.py +0 -0
  247. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/physics.py +0 -0
  248. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/probes.py +0 -0
  249. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/references/PHY-01.yaml +0 -0
  250. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/references/PHY-02.yaml +0 -0
  251. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/references/PHY-05.yaml +0 -0
  252. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/references/PHY-06.yaml +0 -0
  253. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/references/SMI-01.yaml +0 -0
  254. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/references/SMI-02.yaml +0 -0
  255. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/references/pressure-drag/PHY-01.yaml +0 -0
  256. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/references/pressure-drag/PHY-02.yaml +0 -0
  257. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/references/pressure-drag/PHY-05.yaml +0 -0
  258. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/references/pressure-drag/PHY-06.yaml +0 -0
  259. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/reports.py +0 -0
  260. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/qa/specs.py +0 -0
  261. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/reference.py +0 -0
  262. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/results/__init__.py +0 -0
  263. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/results/conditions.py +0 -0
  264. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/results/core.py +0 -0
  265. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/results/exports.py +0 -0
  266. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/results/loads.py +0 -0
  267. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/results/log.py +0 -0
  268. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/results/native_surface.py +0 -0
  269. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/results/sectional_loads.py +0 -0
  270. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/results/surface.py +0 -0
  271. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/results/tables.py +0 -0
  272. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/results/wake.py +0 -0
  273. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/__init__.py +0 -0
  274. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_additional.py +0 -0
  275. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_alias.py +0 -0
  276. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_assemble.py +0 -0
  277. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_assessment.py +0 -0
  278. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_batch_collect.py +0 -0
  279. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_batch_exec.py +0 -0
  280. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_batch_plan.py +0 -0
  281. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_batch_run.py +0 -0
  282. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_batch_split.py +0 -0
  283. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_campaign.py +0 -0
  284. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_cli_geometry.py +0 -0
  285. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_cli_mesh.py +0 -0
  286. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_cli_parsers.py +0 -0
  287. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_cli_parsers_storage.py +0 -0
  288. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_cli_print.py +0 -0
  289. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_cli_query.py +0 -0
  290. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_cli_query_history.py +0 -0
  291. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_cli_query_point.py +0 -0
  292. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_collect_logs.py +0 -0
  293. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_collect_notes.py +0 -0
  294. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_continuation.py +0 -0
  295. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_continuation_frame.py +0 -0
  296. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_executors.py +0 -0
  297. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_field_motion.py +0 -0
  298. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_grouped.py +0 -0
  299. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_identity.py +0 -0
  300. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_ids.py +0 -0
  301. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_mark_converged.py +0 -0
  302. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_matrix_warnings.py +0 -0
  303. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_pending.py +0 -0
  304. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_rebuild.py +0 -0
  305. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_rebuild_evidence.py +0 -0
  306. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_rebuild_grouped.py +0 -0
  307. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_rebuild_summary.py +0 -0
  308. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_record_files.py +0 -0
  309. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_solver_windows.py +0 -0
  310. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_step_exports.py +0 -0
  311. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_sweep.py +0 -0
  312. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/_wake_edge_verdict.py +0 -0
  313. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/cli.py +0 -0
  314. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/collect.py +0 -0
  315. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/matrix.py +0 -0
  316. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/run/records.py +0 -0
  317. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/script/__init__.py +0 -0
  318. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/script/_arg_checks.py +0 -0
  319. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/script/_ledger_tables.py +0 -0
  320. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/script/_relaxed_te.py +0 -0
  321. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/script/_settings.py +0 -0
  322. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/script/_surface_averaging.py +0 -0
  323. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/script/_wake_edge_file.py +0 -0
  324. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/script/entities.py +0 -0
  325. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/script/helpers.py +0 -0
  326. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/script/motion.py +0 -0
  327. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/script/rotor_vocabulary.py +0 -0
  328. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/script/solver_setup.py +0 -0
  329. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/script/toggles.py +0 -0
  330. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/support.py +0 -0
  331. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/testing.py +0 -0
  332. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/utils/__init__.py +0 -0
  333. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/utils/cli.py +0 -0
  334. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/utils/database.py +0 -0
  335. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/utils/errors.py +0 -0
  336. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/utils/manual.py +0 -0
  337. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/versions.py +0 -0
  338. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/__init__.py +0 -0
  339. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_batch_life.py +0 -0
  340. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_batch_relocate.py +0 -0
  341. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_batches.py +0 -0
  342. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_degenerate.py +0 -0
  343. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_effective.py +0 -0
  344. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_free_space.py +0 -0
  345. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_geometry_build.py +0 -0
  346. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_geometry_clean.py +0 -0
  347. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_geometry_convert.py +0 -0
  348. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_geometry_instruction.py +0 -0
  349. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_geometry_record.py +0 -0
  350. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_geometry_sidecar.py +0 -0
  351. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_geometry_vtk.py +0 -0
  352. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_layout.py +0 -0
  353. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_ledger_api.py +0 -0
  354. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_ledger_history.py +0 -0
  355. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_links.py +0 -0
  356. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_matrix_binding.py +0 -0
  357. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_matrix_homes.py +0 -0
  358. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_matrix_phases.py +0 -0
  359. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_missing_log.py +0 -0
  360. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_query_files.py +0 -0
  361. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_query_logs.py +0 -0
  362. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_query_point.py +0 -0
  363. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_refine/__init__.py +0 -0
  364. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_refine/_audit.py +0 -0
  365. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_refine/_blocks.py +0 -0
  366. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_refine/_config.py +0 -0
  367. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_refine/_geometry.py +0 -0
  368. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_refine/_grid.py +0 -0
  369. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_refine/_level.py +0 -0
  370. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_refine/_obj.py +0 -0
  371. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_refine/_periodic.py +0 -0
  372. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_refine/_remesh.py +0 -0
  373. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_refine/_remesh_group.py +0 -0
  374. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_refine/_remesh_pairs.py +0 -0
  375. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_refine/_staging.py +0 -0
  376. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_row_setup.py +0 -0
  377. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_script_comparison.py +0 -0
  378. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_settings_file.py +0 -0
  379. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_step_prune.py +0 -0
  380. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/_verdicts.py +0 -0
  381. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/actuator_profiles.py +0 -0
  382. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/builds.py +0 -0
  383. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/cli.py +0 -0
  384. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/costs.py +0 -0
  385. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/excel.py +0 -0
  386. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/excel_bridge.py +0 -0
  387. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/excel_file.py +0 -0
  388. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/excel_sync.py +0 -0
  389. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/fields.py +0 -0
  390. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/flight_condition.py +0 -0
  391. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/fsi_external_setup.py +0 -0
  392. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/fsi_setup.py +0 -0
  393. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/hpc.py +0 -0
  394. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/inputs.py +0 -0
  395. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/ledger.py +0 -0
  396. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/manifest.py +0 -0
  397. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/matrix.py +0 -0
  398. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/migrate.py +0 -0
  399. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/naming.py +0 -0
  400. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/record_document.py +0 -0
  401. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/selections.py +0 -0
  402. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/setup_inspection.py +0 -0
  403. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/setup_standards.py +0 -0
  404. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/sidecars.py +0 -0
  405. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/sixdof_setup.py +0 -0
  406. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/storage.py +0 -0
  407. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/trailing_edges.py +0 -0
  408. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream/workspace/wake_edges.py +0 -0
  409. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream.egg-info/dependency_links.txt +0 -0
  410. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream.egg-info/entry_points.txt +0 -0
  411. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream.egg-info/requires.txt +0 -0
  412. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/src/pyflightstream.egg-info/top_level.txt +0 -0
  413. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/tools/check_shipped_surface.py +0 -0
  414. {pyflightstream-0.44.0 → pyflightstream-0.45.0}/tools/shipped_surface.conf +0 -0
@@ -0,0 +1,2 @@
1
+ include tools/check_shipped_surface.py
2
+ include tools/shipped_surface.conf
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyflightstream
3
- Version: 0.44.0
3
+ Version: 0.45.0
4
4
  Summary: Version-aware, didactic Python driver for the FlightStream panel-method solver
5
5
  Author: Geovana Neves
6
6
  License: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "pyflightstream"
7
- version = "0.44.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 ``[farfield]`` table of the pproc artifact and the lattice shape of ``[[probes]]``.
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
- from typing import Annotated, Literal
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 ``[farfield.ledgers]`` geometry and of one entry of a
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 ``[farfield.trefftz]`` sub-table: the Trefftz variants and their geometry (FR-454).
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), "[farfield.trefftz] 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 ``[farfield.ledgers]`` sub-table: the balances and their survey lattice (FR-38, FR-454).
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), "[farfield.ledgers] 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
- """The ``[farfield]`` table: what the far field is computed over, and how (FR-454).
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
- A selector word, an alias, a family name or a list, the grammar of
297
- ``[sections]``.
298
- trefftz : TrefftzSpec, optional
299
- The Trefftz variants.
300
- ledgers : LedgersSpec, optional
301
- The survey balances.
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
- families: Annotated[str | list[str], BeforeValidator(_family_selection)] = Field(
307
- description=(
308
- "What the far field is computed over: a selector word, an alias, a family name or "
309
- "a list, the grammar of [sections]."
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
- trefftz: TrefftzSpec | None = Field(default=None, description="The Trefftz-plane analyses.")
313
- ledgers: LedgersSpec | None = Field(
314
- default=None, description="The conservation balances of a survey lattice."
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
- @model_validator(mode="after")
318
- def _selects_an_analysis(self) -> FarfieldSpec:
319
- if self.trefftz is None and self.ledgers is None:
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
- "[farfield] selects no analysis: state [farfield.trefftz] with a variant, "
322
- "[farfield.ledgers], or both"
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
- return self
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 in ("trefftz:sections", "trefftz:wake"):
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 "variants A and B serve steady rows"
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 ``[farfield.trefftz] stations`` asks for, and the
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 ``[farfield.trefftz] stations`` asks for.
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} of "
210
- f"[farfield.trefftz]; the strip bias of E_T measured on the definitions page is "
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.ledgers is not None:
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 ``[farfield]`` table.
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 ``[farfield] families`` resolves to on the row's geometry.
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=f"[farfield] families = {spec.families!r} names no family of the geometry",
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
- resolver.item(analysis, "run_type", "not_applicable", reason=why)
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 == "ledgers" or resolver.rotor
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 == "ledgers" or self.rotor else "plane"
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
- if self.run_type in UNSTEADY_RUN_TYPES:
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 FarfieldSpec, LatticeShape
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
- farfield : FarfieldSpec, optional
2038
- The far-field analyses and what they are computed over (FR-454);
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
- farfield: FarfieldSpec | None = None
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