pyflightstream 0.43.0__tar.gz → 0.44.0__tar.gz

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