pyflightstream 0.41.0__tar.gz → 0.43.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 (428) hide show
  1. {pyflightstream-0.41.0/src/pyflightstream.egg-info → pyflightstream-0.43.0}/PKG-INFO +22 -18
  2. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/README.md +20 -16
  3. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/pyproject.toml +19 -15
  4. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/__init__.py +9 -15
  5. pyflightstream-0.43.0/src/pyflightstream/_atmosphere.py +280 -0
  6. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/_cli.py +5 -2
  7. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/_console.py +7 -7
  8. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/_deprecations.py +34 -104
  9. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/_digest.py +36 -37
  10. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/_errors.py +40 -29
  11. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/_fsm.py +38 -45
  12. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/_fsm_fresh.py +233 -32
  13. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/_lengths.py +4 -5
  14. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/_maturity.py +20 -165
  15. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/_mesh.py +4 -9
  16. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/_progress.py +9 -9
  17. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/_retired_names.py +66 -35
  18. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/_signature.py +1 -2
  19. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/_textio.py +50 -9
  20. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/_tokens.py +27 -45
  21. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/_yamlflow.py +27 -24
  22. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/__init__.py +144 -263
  23. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/_ccs.py +82 -8
  24. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/_farfield_spec.py +3 -3
  25. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/_fsi_external.py +1 -1
  26. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/_geometry_emit.py +58 -7
  27. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/_geometry_instruction.py +82 -6
  28. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/_matrix_layouts.py +56 -130
  29. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/_matrix_upgrade.py +26 -14
  30. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/_setup_keys.py +158 -10
  31. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/_setup_link.py +14 -19
  32. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/_skipped_families.py +15 -16
  33. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/_sweep_names.py +16 -29
  34. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/_unsteady_actions.py +9 -12
  35. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/acoustics.py +30 -14
  36. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/ccs_fuselage.py +1 -1
  37. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/ccs_wing.py +96 -13
  38. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/corrections.py +4 -4
  39. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/farfield_inputs.py +1 -1
  40. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/field_coverage.py +87 -41
  41. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/freestream.py +115 -28
  42. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/fsi_workspace.py +153 -62
  43. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/matrix.py +143 -187
  44. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/mesh.py +11 -10
  45. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/naming.py +19 -17
  46. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/pproc.py +213 -142
  47. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/qsteady.py +63 -47
  48. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/reference_blocks.py +58 -76
  49. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/selection.py +101 -89
  50. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/settings.py +100 -100
  51. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/setup_surfaces.py +9 -5
  52. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/sixdof.py +1 -1
  53. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/windows.py +41 -19
  54. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/workflows/__init__.py +22 -7
  55. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/workflows/_actuator.py +2 -2
  56. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/workflows/_additional.py +12 -5
  57. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/workflows/_batch_actions.py +62 -17
  58. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/workflows/_batch_script.py +129 -39
  59. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/workflows/_clock.py +88 -32
  60. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/workflows/_conventions.py +18 -4
  61. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/workflows/_export_first_step.py +6 -4
  62. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/workflows/_exports.py +12 -16
  63. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/workflows/_farfield.py +74 -15
  64. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/workflows/_frames.py +87 -116
  65. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/workflows/_freestream.py +53 -32
  66. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/workflows/_gap_evidence.py +36 -4
  67. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/workflows/_geometry.py +60 -40
  68. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/workflows/_motion.py +61 -198
  69. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/workflows/_names.py +31 -51
  70. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/workflows/_pproc.py +107 -78
  71. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/workflows/_probes.py +139 -134
  72. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/workflows/_qsteady_rotor.py +150 -54
  73. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/workflows/_reductions.py +90 -101
  74. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/workflows/_registry.py +0 -5
  75. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/workflows/_rotor.py +66 -75
  76. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/workflows/_row_cells.py +17 -4
  77. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/workflows/_rows.py +214 -172
  78. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/workflows/_sixdof.py +3 -3
  79. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/workflows/_skeleton.py +56 -79
  80. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/workflows/_solver_settings.py +31 -51
  81. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/workflows/_steady.py +36 -42
  82. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/workflows/_streamlines.py +1 -1
  83. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/workflows/_timing.py +80 -62
  84. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/workflows/_unsteady.py +13 -5
  85. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/workflows/_vocabulary.py +140 -194
  86. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/commands/__init__.py +60 -277
  87. pyflightstream-0.43.0/src/pyflightstream/commands/_meta.yaml +468 -0
  88. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/commands/_schema.py +272 -37
  89. pyflightstream-0.43.0/src/pyflightstream/commands/acoustics.yaml +308 -0
  90. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/commands/actuators.yaml +117 -114
  91. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/commands/advanced_settings.yaml +252 -211
  92. pyflightstream-0.43.0/src/pyflightstream/commands/aeroelastic_coupling.yaml +321 -0
  93. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/commands/base_regions.yaml +122 -113
  94. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/commands/boundary_conditions.yaml +205 -172
  95. pyflightstream-0.43.0/src/pyflightstream/commands/cad.yaml +292 -0
  96. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/commands/cad_create.yaml +395 -366
  97. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/commands/ccs_fuselage_mesh.yaml +84 -79
  98. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/commands/ccs_revolve_mesh.yaml +98 -82
  99. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/commands/ccs_wing_mesh.yaml +104 -106
  100. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/commands/coordinate_systems.yaml +107 -107
  101. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/commands/file_io.yaml +60 -60
  102. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/commands/free_surfaces.yaml +10 -8
  103. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/commands/inlets_outlets.yaml +78 -69
  104. pyflightstream-0.43.0/src/pyflightstream/commands/mesh_import_export.yaml +154 -0
  105. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/commands/mesh_operations.yaml +239 -230
  106. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/commands/mesh_unite.yaml +40 -31
  107. pyflightstream-0.43.0/src/pyflightstream/commands/mesh_wrapper.yaml +361 -0
  108. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/commands/motion_definitions.yaml +315 -302
  109. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/commands/plots.yaml +27 -25
  110. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/commands/probe_points.yaml +53 -52
  111. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/commands/runtime_settings.yaml +107 -105
  112. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/commands/scene_settings.yaml +79 -69
  113. pyflightstream-0.43.0/src/pyflightstream/commands/scenes.yaml +282 -0
  114. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/commands/script_controls.yaml +24 -24
  115. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/commands/simulation_controls.yaml +57 -56
  116. pyflightstream-0.43.0/src/pyflightstream/commands/solver_analysis.yaml +275 -0
  117. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/commands/solver_contours.yaml +84 -27
  118. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/commands/solver_export.yaml +99 -83
  119. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/commands/solver_initialization.yaml +86 -65
  120. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/commands/solver_settings.yaml +219 -204
  121. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/commands/stability_toolbox.yaml +62 -56
  122. pyflightstream-0.43.0/src/pyflightstream/commands/streamlines.yaml +384 -0
  123. pyflightstream-0.43.0/src/pyflightstream/commands/surface_sections.yaml +349 -0
  124. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/commands/sweeper.yaml +65 -78
  125. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/commands/transition_trips.yaml +14 -16
  126. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/commands/unsteady_solver.yaml +108 -95
  127. pyflightstream-0.43.0/src/pyflightstream/commands/volume_sections.yaml +308 -0
  128. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/exceptions.py +10 -15
  129. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/extras.py +30 -44
  130. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/farfield/__init__.py +13 -2
  131. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/farfield/balances.py +68 -18
  132. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/farfield/fields.py +33 -12
  133. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/farfield/quadrature.py +125 -10
  134. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/farfield/trefftz.py +98 -24
  135. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/fsi/__init__.py +1 -1
  136. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/fsi/beam.py +27 -23
  137. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/fsi/centrifugal.py +55 -22
  138. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/fsi/cli.py +64 -16
  139. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/fsi/config.py +80 -48
  140. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/fsi/driver.py +119 -80
  141. pyflightstream-0.43.0/src/pyflightstream/fsi/errors.py +21 -0
  142. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/fsi/external.py +59 -11
  143. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/fsi/loads.py +41 -46
  144. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/fsi/nodes.py +57 -19
  145. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/fsi/sections.py +57 -36
  146. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/fsi/state.py +25 -6
  147. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/fsi/wing.py +2 -2
  148. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/options.py +5 -2
  149. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/overview.py +5 -10
  150. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/post/__init__.py +24 -20
  151. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/post/_additional.py +2 -2
  152. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/post/_admit.py +31 -28
  153. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/post/_condition.py +176 -128
  154. pyflightstream-0.43.0/src/pyflightstream/post/_noise_products.py +164 -0
  155. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/post/_products_campaign.py +161 -40
  156. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/post/_reduction_stage.py +148 -50
  157. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/post/_rotor_plan.py +72 -104
  158. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/post/_rotor_products.py +364 -171
  159. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/post/_settings_product.py +2 -2
  160. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/post/_sim.py +159 -90
  161. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/post/_stage.py +161 -45
  162. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/post/_structure.py +62 -31
  163. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/post/_tables.py +258 -196
  164. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/post/_transfer_functions.py +65 -3
  165. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/post/acoustics.py +125 -14
  166. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/post/axes.py +32 -20
  167. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/post/boundary_layer.py +135 -35
  168. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/post/corrections.py +64 -124
  169. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/post/custom_polar.py +68 -10
  170. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/post/diagnostics.py +11 -9
  171. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/post/disc_maps.py +148 -44
  172. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/post/equations.py +51 -8
  173. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/post/farfield_fields.py +90 -19
  174. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/post/farfield_products.py +177 -141
  175. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/post/field_frames.py +26 -12
  176. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/post/glossary.py +56 -28
  177. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/post/guides.py +41 -23
  178. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/post/harmonics.py +92 -23
  179. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/post/inflow_tools.py +80 -17
  180. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/post/input_template.py +84 -81
  181. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/post/point_tables.py +172 -133
  182. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/post/polar.py +430 -78
  183. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/post/probe_fields.py +244 -155
  184. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/post/products.py +82 -101
  185. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/post/provenance.py +61 -40
  186. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/post/qsteady.py +330 -111
  187. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/post/qsteady_noise.py +91 -29
  188. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/post/reductions.py +43 -12
  189. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/post/rotor_table.py +145 -172
  190. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/post/section_distributions.py +103 -90
  191. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/post/series.py +134 -75
  192. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/post/settings_table.py +114 -76
  193. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/post/streamlines.py +24 -10
  194. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/post/superfile.py +188 -160
  195. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/post/surfaces.py +74 -13
  196. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/post/unsteady.py +275 -86
  197. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/post/unsteady_polar.py +146 -65
  198. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/post/writers.py +85 -19
  199. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/probes/errors.py +1 -2
  200. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/probes/geometry.py +36 -51
  201. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/probes/lattice.py +37 -6
  202. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/probes/layouts.py +92 -38
  203. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/probes/planar.py +52 -15
  204. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/qa/__init__.py +7 -19
  205. pyflightstream-0.43.0/src/pyflightstream/qa/_reanalysis.py +151 -0
  206. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/qa/_spec_0400_gap.py +24 -25
  207. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/qa/_spec_0400_gapbase.py +20 -4
  208. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/qa/_spec_0400_gapedges.py +1 -1
  209. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/qa/_spec_0400_gapkit.py +48 -12
  210. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/qa/_spec_26125.py +20 -12
  211. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/qa/_spec_catalog_b.py +95 -41
  212. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/qa/_spec_ccs_mesh.py +8 -3
  213. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/qa/_spec_ccs_noise.py +70 -27
  214. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/qa/_spec_kit.py +9 -2
  215. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/qa/_spec_t1.py +6 -6
  216. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/qa/cli.py +16 -26
  217. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/qa/compat.py +470 -151
  218. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/qa/cost.py +21 -15
  219. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/qa/drift.py +16 -5
  220. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/qa/errors.py +2 -2
  221. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/qa/geometry.py +62 -21
  222. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/qa/matrix.py +216 -39
  223. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/qa/physics.py +187 -103
  224. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/qa/probes.py +242 -162
  225. pyflightstream-0.43.0/src/pyflightstream/qa/references/SMI-01.yaml +29 -0
  226. pyflightstream-0.43.0/src/pyflightstream/qa/references/SMI-02.yaml +29 -0
  227. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/qa/references/pressure-drag/PHY-02.yaml +1 -1
  228. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/qa/reports.py +61 -109
  229. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/qa/specs.py +119 -46
  230. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/reference.py +65 -56
  231. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/results/__init__.py +8 -16
  232. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/results/conditions.py +5 -10
  233. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/results/core.py +56 -95
  234. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/results/exports.py +74 -42
  235. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/results/loads.py +198 -103
  236. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/results/log.py +170 -89
  237. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/results/native_surface.py +101 -32
  238. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/results/sectional_loads.py +45 -13
  239. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/results/surface.py +163 -40
  240. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/results/tables.py +130 -106
  241. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/results/wake.py +49 -14
  242. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/run/__init__.py +25 -15
  243. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/run/_actions_counter.py +21 -11
  244. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/run/_additional.py +216 -13
  245. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/run/_alias.py +43 -17
  246. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/run/_assemble.py +30 -9
  247. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/run/_assessment.py +94 -151
  248. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/run/_batch_collect.py +10 -8
  249. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/run/_batch_exec.py +1 -1
  250. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/run/_batch_plan.py +124 -10
  251. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/run/_batch_run.py +22 -4
  252. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/run/_batch_split.py +148 -85
  253. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/run/_campaign.py +97 -85
  254. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/run/_cli_geometry.py +44 -5
  255. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/run/_cli_mesh.py +29 -12
  256. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/run/_cli_parsers.py +73 -80
  257. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/run/_cli_parsers_storage.py +3 -3
  258. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/run/_cli_print.py +4 -5
  259. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/run/_cli_query.py +11 -10
  260. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/run/_cli_query_point.py +8 -3
  261. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/run/_collect_logs.py +38 -18
  262. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/run/_collect_notes.py +86 -33
  263. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/run/_continuation.py +45 -18
  264. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/run/_continuation_frame.py +16 -20
  265. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/run/_executors.py +281 -228
  266. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/run/_field_motion.py +21 -10
  267. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/run/_grouped.py +3 -3
  268. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/run/_identity.py +158 -30
  269. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/run/_ids.py +68 -33
  270. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/run/_mark_converged.py +47 -45
  271. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/run/_matrix_warnings.py +36 -12
  272. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/run/_pending.py +52 -27
  273. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/run/_plan.py +260 -375
  274. pyflightstream-0.43.0/src/pyflightstream/run/_plan_report.py +231 -0
  275. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/run/_points.py +163 -171
  276. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/run/_rebuild.py +79 -27
  277. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/run/_rebuild_evidence.py +33 -42
  278. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/run/_rebuild_grouped.py +30 -9
  279. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/run/_rebuild_summary.py +5 -6
  280. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/run/_record_files.py +81 -12
  281. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/run/_solver_windows.py +4 -9
  282. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/run/_step_exports.py +4 -4
  283. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/run/_sweep.py +51 -89
  284. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/run/_wake_edge_verdict.py +6 -9
  285. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/run/cli.py +163 -201
  286. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/run/collect.py +291 -246
  287. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/run/matrix.py +112 -217
  288. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/run/records.py +16 -58
  289. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/script/__init__.py +178 -294
  290. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/script/_arg_checks.py +41 -15
  291. pyflightstream-0.43.0/src/pyflightstream/script/_build_forms.py +869 -0
  292. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/script/_ledger_tables.py +165 -157
  293. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/script/_relaxed_te.py +21 -24
  294. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/script/_settings.py +343 -130
  295. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/script/_surface_averaging.py +4 -4
  296. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/script/_wake_edge_file.py +12 -1
  297. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/script/entities.py +46 -31
  298. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/script/helpers.py +345 -376
  299. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/script/motion.py +119 -14
  300. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/script/rotor_vocabulary.py +8 -15
  301. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/script/solver_setup.py +132 -112
  302. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/script/toggles.py +5 -4
  303. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/support.py +36 -31
  304. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/testing.py +12 -3
  305. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/utils/__init__.py +5 -15
  306. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/utils/cli.py +144 -88
  307. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/utils/database.py +120 -128
  308. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/utils/errors.py +5 -3
  309. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/utils/manual.py +189 -419
  310. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/versions.py +54 -54
  311. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/__init__.py +188 -292
  312. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/_batch_life.py +23 -8
  313. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/_batch_relocate.py +50 -6
  314. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/_batches.py +37 -19
  315. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/_degenerate.py +38 -17
  316. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/_effective.py +2 -4
  317. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/_free_space.py +307 -21
  318. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/_geometry_build.py +113 -24
  319. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/_geometry_clean.py +14 -4
  320. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/_geometry_convert.py +55 -13
  321. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/_geometry_instruction.py +18 -1
  322. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/_geometry_record.py +12 -10
  323. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/_geometry_sidecar.py +25 -7
  324. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/_layout.py +118 -36
  325. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/_ledger_api.py +3 -2
  326. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/_ledger_history.py +97 -30
  327. pyflightstream-0.43.0/src/pyflightstream/workspace/_links.py +247 -0
  328. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/_matrix_binding.py +43 -84
  329. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/_matrix_homes.py +58 -15
  330. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/_matrix_phases.py +64 -158
  331. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/_missing_log.py +10 -5
  332. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/_query_files.py +29 -3
  333. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/_query_logs.py +19 -4
  334. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/_query_point.py +32 -12
  335. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/_refine/_audit.py +139 -41
  336. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/_refine/_config.py +59 -15
  337. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/_refine/_geometry.py +57 -15
  338. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/_refine/_grid.py +62 -27
  339. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/_refine/_level.py +85 -75
  340. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/_refine/_obj.py +94 -6
  341. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/_refine/_periodic.py +13 -5
  342. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/_refine/_remesh.py +31 -3
  343. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/_refine/_remesh_group.py +63 -10
  344. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/_script_comparison.py +127 -62
  345. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/_step_prune.py +12 -8
  346. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/actuator_profiles.py +38 -6
  347. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/builds.py +11 -8
  348. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/cli.py +121 -19
  349. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/costs.py +46 -9
  350. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/excel.py +74 -36
  351. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/excel_bridge.py +170 -88
  352. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/excel_file.py +121 -30
  353. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/excel_sync.py +64 -5
  354. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/fields.py +115 -19
  355. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/flight_condition.py +67 -54
  356. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/fsi_external_setup.py +30 -18
  357. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/fsi_setup.py +52 -19
  358. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/hpc.py +98 -58
  359. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/inputs.py +191 -193
  360. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/ledger.py +79 -18
  361. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/manifest.py +193 -203
  362. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/matrix.py +29 -42
  363. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/migrate.py +35 -7
  364. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/naming.py +116 -64
  365. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/record_document.py +48 -8
  366. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/selections.py +122 -19
  367. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/setup_inspection.py +3 -3
  368. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/setup_standards.py +55 -17
  369. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/sidecars.py +102 -54
  370. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/sixdof_setup.py +8 -4
  371. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/storage.py +208 -254
  372. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/trailing_edges.py +25 -23
  373. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/wake_edges.py +44 -25
  374. {pyflightstream-0.41.0 → pyflightstream-0.43.0/src/pyflightstream.egg-info}/PKG-INFO +22 -18
  375. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream.egg-info/SOURCES.txt +2 -0
  376. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream.egg-info/requires.txt +1 -1
  377. pyflightstream-0.41.0/src/pyflightstream/_atmosphere.py +0 -349
  378. pyflightstream-0.41.0/src/pyflightstream/commands/_meta.yaml +0 -639
  379. pyflightstream-0.41.0/src/pyflightstream/commands/acoustics.yaml +0 -300
  380. pyflightstream-0.41.0/src/pyflightstream/commands/aeroelastic_coupling.yaml +0 -332
  381. pyflightstream-0.41.0/src/pyflightstream/commands/cad.yaml +0 -273
  382. pyflightstream-0.41.0/src/pyflightstream/commands/mesh_import_export.yaml +0 -154
  383. pyflightstream-0.41.0/src/pyflightstream/commands/mesh_wrapper.yaml +0 -366
  384. pyflightstream-0.41.0/src/pyflightstream/commands/scenes.yaml +0 -290
  385. pyflightstream-0.41.0/src/pyflightstream/commands/solver_analysis.yaml +0 -265
  386. pyflightstream-0.41.0/src/pyflightstream/commands/streamlines.yaml +0 -350
  387. pyflightstream-0.41.0/src/pyflightstream/commands/surface_sections.yaml +0 -342
  388. pyflightstream-0.41.0/src/pyflightstream/commands/volume_sections.yaml +0 -296
  389. pyflightstream-0.41.0/src/pyflightstream/fsi/errors.py +0 -30
  390. pyflightstream-0.41.0/src/pyflightstream/post/_noise_products.py +0 -142
  391. pyflightstream-0.41.0/src/pyflightstream/qa/references/SMI-01.yaml +0 -28
  392. pyflightstream-0.41.0/src/pyflightstream/qa/references/SMI-02.yaml +0 -28
  393. pyflightstream-0.41.0/src/pyflightstream/script/_build_forms.py +0 -276
  394. pyflightstream-0.41.0/src/pyflightstream/workspace/_links.py +0 -148
  395. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/LICENSE +0 -0
  396. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/setup.cfg +0 -0
  397. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/_decimal.py +0 -0
  398. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/_expressions.py +0 -0
  399. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/_fsi_calibration.py +0 -0
  400. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/ccs_revolution.py +0 -0
  401. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/cases/workflows/_wake_length.py +0 -0
  402. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/fsi/_direct_morphing.py +0 -0
  403. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/fsi/calibration.py +0 -0
  404. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/fsi/kinematics.py +0 -0
  405. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/fsi/materials.py +0 -0
  406. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/post/_field_inputs.py +0 -0
  407. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/post/_installed_copies.py +0 -0
  408. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/post/_matrix_template.py +0 -0
  409. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/probes/__init__.py +0 -0
  410. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/probes/_model.py +0 -0
  411. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/qa/references/PHY-01.yaml +0 -0
  412. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/qa/references/PHY-02.yaml +0 -0
  413. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/qa/references/PHY-05.yaml +0 -0
  414. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/qa/references/PHY-06.yaml +0 -0
  415. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/qa/references/pressure-drag/PHY-01.yaml +0 -0
  416. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/qa/references/pressure-drag/PHY-05.yaml +0 -0
  417. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/qa/references/pressure-drag/PHY-06.yaml +0 -0
  418. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/run/_cli_query_history.py +0 -0
  419. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/_geometry_vtk.py +0 -0
  420. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/_refine/__init__.py +0 -0
  421. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/_refine/_blocks.py +0 -0
  422. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/_refine/_remesh_pairs.py +0 -0
  423. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/_row_setup.py +0 -0
  424. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/_settings_file.py +0 -0
  425. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream/workspace/_verdicts.py +0 -0
  426. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream.egg-info/dependency_links.txt +0 -0
  427. {pyflightstream-0.41.0 → pyflightstream-0.43.0}/src/pyflightstream.egg-info/entry_points.txt +0 -0
  428. {pyflightstream-0.41.0 → pyflightstream-0.43.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.41.0
3
+ Version: 0.43.0
4
4
  Summary: Version-aware, didactic Python driver for the FlightStream panel-method solver
5
5
  Author: Geovana Neves
6
6
  License: MIT
@@ -33,7 +33,7 @@ Requires-Dist: PyNiteFEA>=3.0; extra == "fsi"
33
33
  Provides-Extra: excel
34
34
  Requires-Dist: XlsxWriter<4,>=3.2.9; extra == "excel"
35
35
  Provides-Extra: manual
36
- Requires-Dist: pypdf; extra == "manual"
36
+ Requires-Dist: pypdf>=4.0.0; extra == "manual"
37
37
  Provides-Extra: dev
38
38
  Requires-Dist: pytest; extra == "dev"
39
39
  Requires-Dist: packaging; extra == "dev"
@@ -60,8 +60,7 @@ Version-aware Python driver for the FlightStream panel-method solver: write a
60
60
  run matrix, and pyflightstream plans, runs and post-processes every point,
61
61
  from your workstation or a cluster. MIT licensed.
62
62
 
63
- This source tree contains 0.41.0; CHANGELOG.md describes its changes and the
64
- retained release history.
63
+ CHANGELOG.md describes package changes and the retained release history.
65
64
  Use the [upgrade guidance](https://nevesgeovana.github.io/pyflightstream/upgrading/)
66
65
  when moving an existing workspace to a newer package version.
67
66
 
@@ -91,9 +90,14 @@ matrix -> plan -> run -> collect -> post -> products
91
90
  ## Install
92
91
 
93
92
  ```
94
- pip install "pyflightstream[geom,fsi,plot,excel]"
93
+ pip install "pyflightstream[dev,plot,geom,fsi,excel]"
95
94
  ```
96
95
 
96
+ The extras add development and documentation tools (`dev`), plotting (`plot`),
97
+ spatial geometry queries (`geom`), structural coupling (`fsi`) and workbook
98
+ authoring (`excel`). Maintainers reading licensed manuals also install
99
+ `pyflightstream[manual]`.
100
+
97
101
  Python 3.12 or newer. FlightStream itself is licensed separately and is
98
102
  located through your workspace, never guessed.
99
103
 
@@ -140,19 +144,19 @@ and the evidence behind it is narrower than for the supported rows.
140
144
 
141
145
  ## Supported FlightStream versions
142
146
 
143
- | Version | Vendor name | Support level |
144
- |---|---|---|
145
- | 25.000 | 25.0 | `documented` |
146
- | 25.100 | 25.1 | `documented` |
147
- | 26.000 | 26.0 | `documented` |
148
- | 26.100 | 26.1 | `operational` |
149
- | 26.101 | 26.1 | `operational` |
150
- | 26.120 | 26.12 | `operational` |
151
- | 26.121 | 26.12 | `operational` |
152
- | 26.122 | 26.12 | `operational` |
153
- | 26.123 | 26.12 | `operational` |
154
- | 26.124 | 26.12 | `operational` |
155
- | 26.125 | 26.12 | `operational` |
147
+ | Version | Vendor name | Support level | Build |
148
+ |---|---|---|---|
149
+ | 25.000 | 25.0 | `documented` | `12162024` |
150
+ | 25.100 | 25.1 | `documented` | `5062025` |
151
+ | 26.000 | 26.0 | `documented` | `10202025` |
152
+ | 26.100 | 26.1 | `operational` | `2122026` |
153
+ | 26.101 | 26.1 | `operational` | `5012026` |
154
+ | 26.120 | 26.12 | `operational` | `7012026` |
155
+ | 26.121 | 26.12 | `operational` | `7262026` |
156
+ | 26.122 | 26.12 | `operational` | `8092026` |
157
+ | 26.123 | 26.12 | `operational` | `8112026` |
158
+ | 26.124 | 26.12 | `operational` | `8172026` |
159
+ | 26.125 | 26.12 | `operational` | `10052026` |
156
160
 
157
161
  `operational` means the minimal geometry-to-loads workflow builds for that
158
162
  version, checked by a test. `documented` describes the database support level;
@@ -8,8 +8,7 @@ Version-aware Python driver for the FlightStream panel-method solver: write a
8
8
  run matrix, and pyflightstream plans, runs and post-processes every point,
9
9
  from your workstation or a cluster. MIT licensed.
10
10
 
11
- This source tree contains 0.41.0; CHANGELOG.md describes its changes and the
12
- retained release history.
11
+ CHANGELOG.md describes package changes and the retained release history.
13
12
  Use the [upgrade guidance](https://nevesgeovana.github.io/pyflightstream/upgrading/)
14
13
  when moving an existing workspace to a newer package version.
15
14
 
@@ -39,9 +38,14 @@ matrix -> plan -> run -> collect -> post -> products
39
38
  ## Install
40
39
 
41
40
  ```
42
- pip install "pyflightstream[geom,fsi,plot,excel]"
41
+ pip install "pyflightstream[dev,plot,geom,fsi,excel]"
43
42
  ```
44
43
 
44
+ The extras add development and documentation tools (`dev`), plotting (`plot`),
45
+ spatial geometry queries (`geom`), structural coupling (`fsi`) and workbook
46
+ authoring (`excel`). Maintainers reading licensed manuals also install
47
+ `pyflightstream[manual]`.
48
+
45
49
  Python 3.12 or newer. FlightStream itself is licensed separately and is
46
50
  located through your workspace, never guessed.
47
51
 
@@ -88,19 +92,19 @@ and the evidence behind it is narrower than for the supported rows.
88
92
 
89
93
  ## Supported FlightStream versions
90
94
 
91
- | Version | Vendor name | Support level |
92
- |---|---|---|
93
- | 25.000 | 25.0 | `documented` |
94
- | 25.100 | 25.1 | `documented` |
95
- | 26.000 | 26.0 | `documented` |
96
- | 26.100 | 26.1 | `operational` |
97
- | 26.101 | 26.1 | `operational` |
98
- | 26.120 | 26.12 | `operational` |
99
- | 26.121 | 26.12 | `operational` |
100
- | 26.122 | 26.12 | `operational` |
101
- | 26.123 | 26.12 | `operational` |
102
- | 26.124 | 26.12 | `operational` |
103
- | 26.125 | 26.12 | `operational` |
95
+ | Version | Vendor name | Support level | Build |
96
+ |---|---|---|---|
97
+ | 25.000 | 25.0 | `documented` | `12162024` |
98
+ | 25.100 | 25.1 | `documented` | `5062025` |
99
+ | 26.000 | 26.0 | `documented` | `10202025` |
100
+ | 26.100 | 26.1 | `operational` | `2122026` |
101
+ | 26.101 | 26.1 | `operational` | `5012026` |
102
+ | 26.120 | 26.12 | `operational` | `7012026` |
103
+ | 26.121 | 26.12 | `operational` | `7262026` |
104
+ | 26.122 | 26.12 | `operational` | `8092026` |
105
+ | 26.123 | 26.12 | `operational` | `8112026` |
106
+ | 26.124 | 26.12 | `operational` | `8172026` |
107
+ | 26.125 | 26.12 | `operational` | `10052026` |
104
108
 
105
109
  `operational` means the minimal geometry-to-loads workflow builds for that
106
110
  version, checked by a test. `documented` describes the database support level;
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "pyflightstream"
7
- version = "0.41.0"
7
+ version = "0.43.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"}
@@ -19,10 +19,10 @@ authors = [{name = "Geovana Neves"}]
19
19
  # (2025-06-05) are the oldest of theirs still inside it. Until then the
20
20
  # window was chosen (">=3.11" since the first release, no floor on the
21
21
  # numerical dependencies), and a user reading it could not know how it
22
- # would move. tests/tier1_offline/test_support_window.py re-derives the
23
- # floors from the release dates and the date above, so moving one is a
24
- # commit that moves the date with it. The CI matrices, the ruff target and
25
- # the classifiers below follow this line.
22
+ # would move. The floors are derived by hand from the release dates and the
23
+ # date above, and moving one is a commit that moves the date with it; no test
24
+ # re-derives them from the release dates. tests/tier1_offline/test_support_window.py
25
+ # holds the CI matrices, the ruff target and the classifiers below to this line.
26
26
  requires-python = ">=3.12"
27
27
  # PyPA well-known metadata (audit 2026-07-23). The SPDX license
28
28
  # expression form is deferred with the VCS-versioning item: it needs a
@@ -63,13 +63,14 @@ classifiers = [
63
63
  # BOTH ENDS ARE PINNED DELIBERATELY. The floor is the oldest release this
64
64
  # package has been exercised against, and the ceiling excludes the next
65
65
  # major, which is a boundary this repository has no evidence about; a new
66
- # install resolves 5.0.0 today. tests/tier1_offline/test_extras.py holds the installed
67
- # version inside the declared range, so the envelope is a measurement rather
68
- # than a hope.
66
+ # install resolves 5.0.0 today. tests/tier1_offline/test_support_window.py holds
67
+ # the installed version of each declared dependency inside its declared range,
68
+ # so the envelope is a measurement rather than a hope.
69
69
  #
70
70
  # numpy and pandas carry the SPEC 0 floor computed on 2026-09-09 (see
71
71
  # requires-python above); neither is above the version this tree runs
72
- # with, which tests/tier1_offline/test_support_window.py measures. pydantic
72
+ # with, which the same test measures. The CI leg `test-floors` installs the
73
+ # numpy and pandas floors themselves and runs tier 1 on them. pydantic
73
74
  # is not a SPEC 0 project: its floor is the major whose API this package
74
75
  # is written against (field_validator, model_validator).
75
76
  dependencies = [
@@ -99,8 +100,9 @@ excel = ["XlsxWriter>=3.2.9,<4"]
99
100
  # Reading a vendor manual pdf, for pyflightstream.utils.manual. A
100
101
  # MAINTAINER extra: no run path imports it, and the manual it reads is
101
102
  # licensed material that never enters Git. pypdf is BSD-3-Clause,
102
- # MIT-compatible (NFR-02).
103
- manual = ["pypdf"]
103
+ # MIT-compatible (NFR-02). The floor is 4.0.0, the first release whose extract_text takes
104
+ # extraction_mode="layout"; 3.17.4, the last 3.x, does not.
105
+ manual = ["pypdf>=4.0.0"]
104
106
  dev = [
105
107
  # Licence evidence for every distribution in this block:
106
108
  # reports/RPT-033_development-tool-licences_2026-08-19.md, one card
@@ -113,10 +115,10 @@ dev = [
113
115
  # the edge would turn a guard into a collection error. Apache-2.0 and
114
116
  # BSD-2-Clause dual, MIT-compatible.
115
117
  "packaging",
116
- # The coverage floor of NFR-16, enforced by the CI `coverage` job.
118
+ # The coverage floor is enforced by the release's frozen full suite.
117
119
  # Not in pytest's addopts: instrumentation costs about a third of the
118
120
  # suite's runtime and a developer running one test file does not need
119
- # a whole-package number. The job passes --cov explicitly.
121
+ # a whole-package number. The suite-full receipt passes --cov explicitly.
120
122
  "pytest-cov",
121
123
  # Parallel tier 1: CI and the release gates run `pytest -n auto`, in place
122
124
  # of a serial run of about 36 minutes, the 0.33.0 release gate's serial
@@ -208,7 +210,9 @@ markers = [
208
210
  ]
209
211
  addopts = "-m 'not needs_flightstream'"
210
212
 
211
- # NFR-16, the test-coverage floor. The requirement states the rule and
213
+ # The test-coverage floor, enforced by the release's frozen full suite.
214
+ # The suite-full receipt passes --cov; push CI does not measure coverage.
215
+ # The requirement states the rule and
212
216
  # deliberately does NOT state the number: it lives here, where the tool that
213
217
  # enforces it reads it, so raising the floor is one edit rather than two
214
218
  # statements drifting apart.
@@ -226,7 +230,7 @@ branch = true
226
230
  # The floor is set BELOW that, on purpose and twice over. It is a ratchet
227
231
  # against regression rather than a target to be gamed, so the measurement is
228
232
  # the fact and this is the promise; and the measurement above was taken on
229
- # Windows while the floor is enforced on Linux, where the Windows-only
233
+ # Windows while the original CI floor ran on Linux, where the Windows-only
230
234
  # branches count as uncovered. Four points absorbs both. Raise it when the
231
235
  # suite earns it, in a commit that says so.
232
236
  fail_under = 87
@@ -18,23 +18,17 @@ Pipeline layers, dependencies flowing strictly downward:
18
18
  - ``results``: anchor-based parsers for solver output files.
19
19
  - ``cases``: simulation and campaign definitions.
20
20
  - ``workspace``: the managed workspace (input-artifact library plus run
21
- layout) and the run manifest. The old ``files`` name was a
22
- deprecation shim and was removed at v0.4.0.
23
- - ``run``: execution and the campaign loop, one row above ``workspace``
24
- since 0.33.0: ``run`` imports ``workspace``, and nothing of
21
+ layout) and the run manifest.
22
+ - ``run``: execution and the campaign loop, one row above ``workspace``: ``run`` imports
23
+ ``workspace``, and nothing of
25
24
  ``workspace`` imports ``run``.
26
25
  - ``post``: results into engineering data (sweep assembly, exports).
27
26
  - ``qa``: probe harness and physics regression tooling.
28
27
 
29
- Since 0.33.0 the largest modules are packages or facades over
30
- private modules: ``cases.workflows`` is a package whose modules import
31
- one another in a declared order, the roots of ``run`` and ``results``
32
- and the module ``post.products`` keep every public name over modules
33
- of their own, and every public name of 0.32.0 still imports from its
34
- 0.32.0 path. Tier-1 architecture guards hold module size, function
35
- limits, import cycles, fan-out, private-name coupling of the tests,
36
- one home per constant and facade roots to ratchets that only fall,
37
- measured by ``scripts/arch_metrics.py``.
28
+ The largest modules are packages or facades over private modules. Public import paths remain
29
+ available through the facades. Tier-1 architecture guards ratchet module size, function
30
+ limits, import cycles, fan-out, private-name coupling and shared constants, measured by
31
+ ``scripts/arch_metrics.py``.
38
32
 
39
33
  Side packages follow the same downward-only rule:
40
34
 
@@ -91,8 +85,8 @@ except metadata.PackageNotFoundError:
91
85
  import pyflightstream.post # noqa: E402, F401
92
86
 
93
87
  # The run records register, the same way, the rebuild a restoring sync asks
94
- # for (P0320-SYNC-RESTORE-OPTIN): the storage layer sits BELOW the run since
95
- # 0.33.0 (AD-09) and calls whatever is registered, so no import points upward.
88
+ # for (P0320-SYNC-RESTORE-OPTIN): the storage layer sits BELOW the run layer
89
+ # (AD-09) and calls whatever is registered, so no import points upward.
96
90
  import pyflightstream.run.records # noqa: E402, F401
97
91
  from pyflightstream._cli import cli_entrypoint as cli_entrypoint # noqa: E402
98
92
  from pyflightstream.options import ( # noqa: E402
@@ -0,0 +1,280 @@
1
+ """The standard atmosphere, below every pipeline layer (PFS-2027.03).
2
+
3
+ This module computes atmospheric properties and imports only the package's
4
+ base exception. Flight-condition resolution belongs to workspace, where a
5
+ reference is available for Reynolds constraints. The script layer emits
6
+ AIR_ALTITUDE or explicit fluid properties; this module emits no commands.
7
+
8
+ AIR_ALTITUDE has no ISA-deviation argument. Conditions carrying dISA and
9
+ conditions solved from density therefore need explicit fluid properties.
10
+ The command is recorded broken on builds 26.100, 26.101 and 26.120. Only the
11
+ 26.120 evidence quantifies the discrepancy: density 1.056 against 0.736
12
+ expected, consistent with the 5000-foot rather than 5000-metre standard state
13
+ (RPT-014, build 7012026). On 26.100 and 26.101 the probe records absence of
14
+ the expected effect, not its cause. A static effect_note is not a per-run
15
+ reading. The emitter refuses a broken command unless allow_broken is set;
16
+ on 25.000 AIR_ALTITUDE takes a bare value in feet. Explicit properties avoid
17
+ these build-dependent command limitations.
18
+
19
+ An ISA deviation changes temperature at unchanged pressure altitude and
20
+ pressure. Density follows from the offset temperature. delta_isa_c is a
21
+ temperature difference, with the same numerical value in Celsius and Kelvin.
22
+ The model describes the standard atmosphere, not local weather, and refuses
23
+ altitudes outside ISA's modeled layers instead of extrapolating.
24
+
25
+ Atmosphere constants follow ISO 2533:1975, also published as ICAO Doc 7488/3
26
+ [REF-01]. Sutherland's viscosity law uses the air coefficients attributed to
27
+ White, Viscous Fluid Flow, third edition, equation (1-36) [REF-02].
28
+ METRES_PER_FOOT is the exact defining value of the international foot.
29
+
30
+ The viscosity attribution has an unresolved limitation: the cited book is
31
+ not available in this repository. The implemented reference temperature and
32
+ Sutherland constant are 273.15 K and 110.4 K. A 273 K / 111 K triplet commonly
33
+ attributed to the equation gives different results: about 0.0492 percent
34
+ at sea level, 0.0536 percent at 300 K and 0.0164 percent at the tropopause.
35
+ The difference propagates into density solved on the REmi path. Resolving
36
+ which triplet belongs to the cited equation requires the source.
37
+
38
+ The atmosphere tests pin viscosity with rel=1e-4 at three temperatures.
39
+ The alternative triplet differs by 1.64e-4 at 216.65 K, 3.59e-4 at 255.65 K
40
+ and 5.36e-4 at 300 K, exceeding that tolerance at all three points.
41
+ """
42
+
43
+ from __future__ import annotations
44
+
45
+ import math
46
+ from dataclasses import dataclass
47
+ from typing import Final
48
+
49
+ from pyflightstream._errors import PyflightstreamError
50
+
51
+
52
+ class AtmosphereError(PyflightstreamError, ValueError):
53
+ """An atmosphere was asked for outside the range this module models.
54
+
55
+ Catalogued (SRS FR-39) rather than a bare :class:`ValueError`, so a
56
+ caller can tell a refusal of this package's from one of Python's.
57
+ """
58
+
59
+
60
+ @dataclass(frozen=True)
61
+ class IsaConstants:
62
+ """Hold the defining constants of ISO 2533:1975 [REF-01], in one citable object.
63
+
64
+ Held as data rather than as module-level names so that a test can
65
+ read the values it is checking out of the same object the physics
66
+ uses. A test that restates a constant proves the restatement.
67
+ """
68
+
69
+ #: Sea-level temperature, K.
70
+ sea_level_temperature_k: float = 288.15
71
+ #: Sea-level pressure, Pa.
72
+ sea_level_pressure_pa: float = 101325.0
73
+ #: Specific gas constant of dry air, J/(kg K).
74
+ gas_constant_j_per_kg_k: float = 287.05287
75
+ #: Ratio of specific heats of dry air, dimensionless.
76
+ heat_capacity_ratio: float = 1.4
77
+ #: Standard gravity, m/s2.
78
+ gravity_m_per_s2: float = 9.80665
79
+ #: Troposphere temperature lapse rate, K/m (a DECREASE with height).
80
+ lapse_rate_k_per_m: float = 0.0065
81
+ #: Geopotential height of the tropopause, m.
82
+ tropopause_altitude_m: float = 11000.0
83
+ #: Temperature of the isothermal layer above the tropopause, K.
84
+ tropopause_temperature_k: float = 216.65
85
+ #: The top of what this module models, m. ISO 2533 continues above [REF-01]
86
+ #: it with layers this module does not implement, so the ceiling is
87
+ #: a refusal boundary rather than the end of the standard.
88
+ ceiling_altitude_m: float = 20000.0
89
+ #: The bottom, m. ISO 2533 is defined from -2000 m. [REF-01]
90
+ floor_altitude_m: float = -2000.0
91
+
92
+
93
+ #: The single instance every function here reads.
94
+ ISA: Final = IsaConstants()
95
+
96
+ #: Sutherland's law for air: White, *Viscous Fluid Flow*, 3rd ed., [REF-02]
97
+ #: eq. (1-36). The reference viscosity is at the reference temperature,
98
+ #: and S is the Sutherland constant of air.
99
+ SUTHERLAND_REFERENCE_VISCOSITY_PA_S: Final = 1.716e-5
100
+ SUTHERLAND_REFERENCE_TEMPERATURE_K: Final = 273.15
101
+ SUTHERLAND_CONSTANT_K: Final = 110.4
102
+
103
+ #: Exactly, by definition of the international foot.
104
+ METRES_PER_FOOT: Final = 0.3048
105
+
106
+
107
+ @dataclass(frozen=True)
108
+ class AtmosphereState:
109
+ """Hold one fully determined air state.
110
+
111
+ Every field carries its unit in its name, which is this
112
+ repository's rule rather than this module's habit.
113
+ """
114
+
115
+ temperature_k: float
116
+ pressure_pa: float
117
+ density_kg_m3: float
118
+ sonic_velocity_m_per_s: float
119
+ viscosity_pa_s: float
120
+
121
+
122
+ def feet_to_metres(altitude_ft: float) -> float:
123
+ """Convert an altitude in feet to metres.
124
+
125
+ Here rather than at the caller because ``ALTFT`` is the interface
126
+ unit a flight condition is written in and metres are the unit this
127
+ module works in, so the conversion belongs at the boundary between
128
+ them and should exist exactly once.
129
+ """
130
+ return altitude_ft * METRES_PER_FOOT
131
+
132
+
133
+ def _require_finite(name: str, value: float) -> None:
134
+ """Refuse NaN and infinity, which every comparison below would let through."""
135
+ if not math.isfinite(value):
136
+ raise AtmosphereError(f"{name} {value} is not a finite number")
137
+
138
+
139
+ def sutherland_viscosity(temperature_k: float) -> float:
140
+ """Dynamic viscosity of air at ``temperature_k``, in Pa s."""
141
+ _require_finite("temperature", temperature_k)
142
+ if temperature_k <= 0.0:
143
+ raise AtmosphereError(
144
+ f"temperature {temperature_k} K is not above absolute zero, so "
145
+ "Sutherland's law has no value there"
146
+ )
147
+ ratio = temperature_k / SUTHERLAND_REFERENCE_TEMPERATURE_K
148
+ return (
149
+ SUTHERLAND_REFERENCE_VISCOSITY_PA_S
150
+ * ratio**1.5
151
+ * (SUTHERLAND_REFERENCE_TEMPERATURE_K + SUTHERLAND_CONSTANT_K)
152
+ / (temperature_k + SUTHERLAND_CONSTANT_K)
153
+ )
154
+
155
+
156
+ def speed_of_sound(temperature_k: float) -> float:
157
+ """Speed of sound in dry air at ``temperature_k``, in m/s."""
158
+ _require_finite("temperature", temperature_k)
159
+ if temperature_k <= 0.0:
160
+ raise AtmosphereError(
161
+ f"temperature {temperature_k} K is not above absolute zero, so the "
162
+ "speed of sound has no value there"
163
+ )
164
+ return math.sqrt(ISA.heat_capacity_ratio * ISA.gas_constant_j_per_kg_k * temperature_k)
165
+
166
+
167
+ def density(pressure_pa: float, temperature_k: float) -> float:
168
+ """Density of dry air from the ideal gas law, in kg/m3."""
169
+ _require_finite("pressure", pressure_pa)
170
+ _require_finite("temperature", temperature_k)
171
+ if pressure_pa <= 0.0:
172
+ raise AtmosphereError(f"pressure {pressure_pa} Pa is not above zero")
173
+ if temperature_k <= 0.0:
174
+ raise AtmosphereError(
175
+ f"temperature {temperature_k} K is not above absolute zero, so the "
176
+ "ideal gas law has no density there"
177
+ )
178
+ return pressure_pa / (ISA.gas_constant_j_per_kg_k * temperature_k)
179
+
180
+
181
+ def standard_pressure(altitude_m: float) -> float:
182
+ """ISA pressure at a geopotential altitude, in Pa.
183
+
184
+ An ISA deviation does NOT appear here, and that is the convention
185
+ this module exists to make explicit: a deviation moves temperature
186
+ and leaves the pressure at a pressure altitude alone.
187
+ """
188
+ if not ISA.floor_altitude_m <= altitude_m <= ISA.ceiling_altitude_m:
189
+ raise AtmosphereError(
190
+ f"altitude {altitude_m} m is outside the range this atmosphere "
191
+ f"models, {ISA.floor_altitude_m} m to {ISA.ceiling_altitude_m} m. "
192
+ "ISO 2533 continues above that ceiling with layers this module [REF-01] "
193
+ "does not implement, and extrapolating past either end of the range "
194
+ "would be wrong in a way the caller could not see."
195
+ )
196
+ exponent = ISA.gravity_m_per_s2 / (ISA.lapse_rate_k_per_m * ISA.gas_constant_j_per_kg_k)
197
+ if altitude_m <= ISA.tropopause_altitude_m:
198
+ temperature = ISA.sea_level_temperature_k - ISA.lapse_rate_k_per_m * altitude_m
199
+ return ISA.sea_level_pressure_pa * (temperature / ISA.sea_level_temperature_k) ** exponent
200
+ tropopause_pressure = (
201
+ ISA.sea_level_pressure_pa
202
+ * (ISA.tropopause_temperature_k / ISA.sea_level_temperature_k) ** exponent
203
+ )
204
+ height_above = altitude_m - ISA.tropopause_altitude_m
205
+ return tropopause_pressure * math.exp(
206
+ -ISA.gravity_m_per_s2
207
+ * height_above
208
+ / (ISA.gas_constant_j_per_kg_k * ISA.tropopause_temperature_k)
209
+ )
210
+
211
+
212
+ def standard_temperature(altitude_m: float) -> float:
213
+ """ISA temperature at a geopotential altitude, in K, with no deviation."""
214
+ if not ISA.floor_altitude_m <= altitude_m <= ISA.ceiling_altitude_m:
215
+ raise AtmosphereError(
216
+ f"altitude {altitude_m} m is outside the range this atmosphere "
217
+ f"models, {ISA.floor_altitude_m} m to {ISA.ceiling_altitude_m} m"
218
+ )
219
+ if altitude_m <= ISA.tropopause_altitude_m:
220
+ return ISA.sea_level_temperature_k - ISA.lapse_rate_k_per_m * altitude_m
221
+ return ISA.tropopause_temperature_k
222
+
223
+
224
+ def isa(altitude_m: float = 0.0, *, delta_isa_c: float = 0.0) -> AtmosphereState:
225
+ """Return the air state at a pressure altitude, with an optional ISA deviation.
226
+
227
+ Parameters
228
+ ----------
229
+ altitude_m:
230
+ Geopotential pressure altitude in metres. Defaults to sea level,
231
+ which is what an absent altitude means in a flight condition.
232
+ delta_isa_c:
233
+ Temperature offset from the standard value, in Celsius, applied
234
+ as a DELTA. Defaults to 0. Pressure is unaffected by it; see the
235
+ module docstring.
236
+
237
+ Raises
238
+ ------
239
+ AtmosphereError
240
+ For an altitude outside the modelled range, a deviation that is
241
+ NaN or infinite, or a deviation that puts the temperature at or
242
+ below absolute zero.
243
+
244
+ Examples
245
+ --------
246
+ >>> state = isa()
247
+ >>> round(state.temperature_k, 2)
248
+ 288.15
249
+ >>> round(state.sonic_velocity_m_per_s, 3)
250
+ 340.294
251
+
252
+ An ISA deviation moves temperature and density and leaves pressure
253
+ exactly where it was:
254
+
255
+ >>> hot = isa(0.0, delta_isa_c=15.0)
256
+ >>> hot.pressure_pa == state.pressure_pa
257
+ True
258
+ >>> hot.density_kg_m3 < state.density_kg_m3
259
+ True
260
+ """
261
+ _require_finite("delta_isa_c (the ISA deviation, degrees C)", delta_isa_c)
262
+ pressure = standard_pressure(altitude_m)
263
+ temperature = standard_temperature(altitude_m) + delta_isa_c
264
+ if not math.isfinite(temperature):
265
+ raise AtmosphereError(
266
+ f"an ISA deviation of {delta_isa_c} C at {altitude_m} m gives a non-finite "
267
+ f"temperature ({temperature}); the deviation must be a finite number"
268
+ )
269
+ if temperature <= 0.0:
270
+ raise AtmosphereError(
271
+ f"an ISA deviation of {delta_isa_c} C at {altitude_m} m puts the "
272
+ f"temperature at {temperature} K, which is not above absolute zero"
273
+ )
274
+ return AtmosphereState(
275
+ temperature_k=temperature,
276
+ pressure_pa=pressure,
277
+ density_kg_m3=density(pressure, temperature),
278
+ sonic_velocity_m_per_s=speed_of_sound(temperature),
279
+ viscosity_pa_s=sutherland_viscosity(temperature),
280
+ )
@@ -4,12 +4,12 @@ Decorating a console ``main`` preserves its return value and exceptions.
4
4
  Only the outermost entry point reports, including argparse's early exits.
5
5
  Machine-readable stdout is never used for human outcome reporting.
6
6
 
7
- Every invocation ends with the package's signature on stderr (0.30.0): a box
7
+ Every invocation ends with the package's signature on stderr: a box
8
8
  drawn from :mod:`pyflightstream._signature` for an outcome, or one short line
9
9
  for ``--help`` and ``--version`` so their output stays compact. For the length
10
10
  of the call, a warning of the package's own categories prints as
11
11
  ``[warning] <message>`` with no file, line or echoed source, wrapped at 90
12
- columns under its text and followed by a blank line (0.31.0); ``--verbose``
12
+ columns under its text and followed by a blank line; ``--verbose``
13
13
  keeps Python's full format. A Python caller outside a console script is never
14
14
  touched.
15
15
 
@@ -168,6 +168,9 @@ def _sign(outcome: str) -> None:
168
168
  except Exception:
169
169
  text = _signature.SEES_YOU
170
170
  stream = sys.stderr
171
+ if stream is None:
172
+ # print(file=None) would fall back to stdout and break its byte contract.
173
+ return
171
174
  try:
172
175
  try:
173
176
  print(text, file=stream)
@@ -1,22 +1,22 @@
1
1
  """The console layout of a command's human output: titled blocks and wrapped lines.
2
2
 
3
3
  Below the package's domain layers, beside :mod:`pyflightstream._cli`, so
4
- every command prints the same shapes (0.31.0). A block is a short title line
4
+ every command prints the same shapes. A block is a short title line
5
5
  saying what it is, then its lines indented under it; one blank line separates
6
6
  two blocks, and a block with nothing to say is not printed. A long line is
7
7
  wrapped at :data:`WIDTH` columns with its continuation lines indented under
8
8
  its text, never under its label, and every word is kept in order: only the
9
9
  spaces at a break change.
10
10
 
11
- Nothing here decides a stream. Each caller prints where it printed before:
11
+ Nothing here decides a stream. Each caller chooses its stream:
12
12
  the human summary of ``plan`` on stdout, a warning on stderr.
13
13
 
14
- THE CONSOLE CONTRACT (0.32.0, FR-200 and FR-201). Every ``pyfs-matrix`` and
14
+ THE CONSOLE CONTRACT (FR-200 and FR-201). Every ``pyfs-matrix`` and
15
15
  ``pyfs-workspace`` command opens with a titled block, the command's own name
16
16
  and what it is for (:func:`opening_lines`, :func:`opens_with_titled_block`),
17
17
  and a command's warnings are held and printed together at the end under
18
- ``Warnings (<count>)`` (:func:`warnings_title`). The blocks the contract adds
19
- go to stderr, so standard output carries exactly what it carried before. The
18
+ ``Warnings (<count>)`` (:func:`warnings_title`). These console blocks
19
+ go to stderr, keeping standard output available for command results. The
20
20
  progress of a long stage is one line of the shape :func:`progress_text` draws
21
21
  (FR-202). :mod:`pyflightstream._progress` holds the state that uses these
22
22
  shapes; this module holds only the shapes.
@@ -37,8 +37,8 @@ _Subparsers = argparse._SubParsersAction
37
37
  WIDTH = 90
38
38
 
39
39
  #: The console levels of a command (FR-997), least to most: ``quiet`` says the
40
- #: errors, the final summary line and the signature; ``normal`` is the console of
41
- #: 0.38.0; ``verbose`` is its ``--verbose``. The activity log is full at every level.
40
+ #: errors, the final summary line and the signature; ``normal`` includes progress
41
+ #: and summaries; ``verbose`` includes details. The activity log is full at every level.
42
42
  CONSOLE_LEVELS = ("quiet", "normal", "verbose")
43
43
 
44
44
  #: What a console warning starts with; its continuation lines align with the