Skip to content

Commit 04763df

Browse files
Merge branch 'develop' into enh/discretize-isa-from-2k
Resolve conflicts in favor of develop for structure, preserving the pressure_ISA discretization change (#1056): - CHANGELOG.md: move the #1056 entry to the [Unreleased] > Changed section (it is not part of the released v1.13.0). - test_flight.py: adopt develop's npt.assert_allclose(atol, rtol) style; merged freestream values stay within rtol=1e-4. - test_environment.py: keep both the new ISA discretization test and develop's pressure-conversion-factor tests. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2 parents 80ac30a + 9ccc804 commit 04763df

122 files changed

Lines changed: 38242 additions & 27791 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/test-pytest-slow.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ jobs:
2727
MPLBACKEND: Agg
2828
steps:
2929
- uses: actions/checkout@main
30+
- name: Set up headless display
31+
uses: pyvista/setup-headless-display-action@v4
3032
- name: Set up Python
3133
uses: actions/setup-python@main
3234
with:

.github/workflows/test_pytest.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ jobs:
2626
MPLBACKEND: Agg
2727
steps:
2828
- uses: actions/checkout@main
29+
- name: Set up headless display
30+
uses: pyvista/setup-headless-display-action@v4
2931
- name: Set up Python
3032
uses: actions/setup-python@main
3133
with:

.pylintrc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -476,7 +476,6 @@ disable=raw-checker-failed,
476476
locally-disabled,
477477
file-ignored,
478478
suppressed-message,
479-
useless-suppression,
480479
deprecated-pragma, # because we have some pending deprecations in the code.
481480
use-symbolic-message-instead,
482481
use-implicit-booleaness-not-comparison-to-string,
@@ -510,6 +509,7 @@ disable=raw-checker-failed,
510509
# multiple time (only on the command line, not in the configuration file where
511510
# it should appear only once). See also the "--disable" option for examples.
512511
enable=
512+
useless-suppression
513513

514514

515515
[METHOD_ARGS]

CHANGELOG.md

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -32,25 +32,36 @@ Attention: The newest changes should be on top -->
3232

3333
### Added
3434

35-
- ENH: ENH: Refactor flight.py latitude/longitude to use inverted_haversine [#1055](https://github.com/RocketPy-Team/RocketPy/pull/1055)
36-
- ENH: TST: Add unit tests for evaluate_reduced_mass and remove TODO [#1051](https://github.com/RocketPy-Team/RocketPy/pull/1051)
37-
- ENH: FIX: pre release hardening [#1047](https://github.com/RocketPy-Team/RocketPy/pull/1047)
38-
- ENH: DEV: Claude Code ruff hooks (auto-format on edit + pre-push lint guard) [#1046](https://github.com/RocketPy-Team/RocketPy/pull/1046)
39-
- ENH: CI: create a CI for testing docs updates + solve different docs issues [#1045](https://github.com/RocketPy-Team/RocketPy/pull/1045)
40-
- ENH: MNT: final fixes before next release [#1044](https://github.com/RocketPy-Team/RocketPy/pull/1044)
35+
- ENH: update master with develop [#1081](https://github.com/RocketPy-Team/RocketPy/pull/1081)
36+
### Changed
37+
38+
- ENH: Resolve pressure_ISA discretization bounds TODO [#1056](https://github.com/RocketPy-Team/RocketPy/pull/1056)
39+
40+
### Fixed
41+
42+
## [v1.13.0] - 2026-07-21
43+
44+
### Added
45+
46+
- ENH: BUG/MNT: pre-release v1.13.0 review fixes [#1074](https://github.com/RocketPy-Team/RocketPy/pull/1074)
47+
- ENH: `Function` vectorized speed-up and refactor [#1049](https://github.com/RocketPy-Team/RocketPy/pull/1049)
48+
- ENH: Interactive 3D Flight Trajectory and Attitude Animation (PyVista) [#1066](https://github.com/RocketPy-Team/RocketPy/pull/1066)
49+
- ENH: Add optional `max_time` to `StochasticFlight` and carry base-flight attributes into created objects [#1070](https://github.com/RocketPy-Team/RocketPy/pull/1070)
50+
- ENH: seed sensor measurement noise per instance [#1052](https://github.com/RocketPy-Team/RocketPy/pull/1052)
51+
- DEV: Claude Code ruff hooks (auto-format on edit + pre-push lint guard) [#1046](https://github.com/RocketPy-Team/RocketPy/pull/1046)
52+
- CI: create a CI for testing docs updates + solve different docs issues [#1045](https://github.com/RocketPy-Team/RocketPy/pull/1045)
53+
- MNT: final fixes before next release [#1044](https://github.com/RocketPy-Team/RocketPy/pull/1044)
4154
- ENH: Individual Fins: add `Fin`, `TrapezoidalFin`, `EllipticalFin`, and `FreeFormFin` classes for modeling asymmetric or individually-positioned fins [#818](https://github.com/RocketPy-Team/RocketPy/pull/818)
4255
- ENH: Add AIGFS and HRRR forecast models to the Environment class [#951](https://github.com/RocketPy-Team/RocketPy/pull/951)
4356
- ENH: Add RingClusterMotor for annular clustered motor modeling [#924](https://github.com/RocketPy-Team/RocketPy/pull/924)
4457
- ENH: Discrete and Continuous Controllers [#946](https://github.com/RocketPy-Team/RocketPy/pull/946)
4558
- ENH: Add custom exceptions and unstable rocket warning [#970](https://github.com/RocketPy-Team/RocketPy/pull/970)
4659
- ENH: Adopt built-in Python logging instead of print() calls (closes [#450](https://github.com/RocketPy-Team/RocketPy/issues/450)) [#973](https://github.com/RocketPy-Team/RocketPy/pull/973)
4760
- ENH: Pass acceleration (`u_dot`) data to parachute trigger functions [#911](https://github.com/RocketPy-Team/RocketPy/pull/911)
48-
- ENH: Add 3D flight trajectory and attitude animations in Flight plots layer [#909](https://github.com/RocketPy-Team/RocketPy/pull/909)
4961
- ENH: Monte Carlo Formatting Options [#947](https://github.com/RocketPy-Team/RocketPy/pull/947)
5062
- ENH: Adaptive Monte Carlo via Convergence Criteria [#922](https://github.com/RocketPy-Team/RocketPy/pull/922)
5163
- ENH: Auto-Detection of Pressure Conversion Factor [#966](https://github.com/RocketPy-Team/RocketPy/pull/966)
5264
- ENH: Introduce pressure unit conversion when using forecast/reanalysis/ensemble data [#955](https://github.com/RocketPy-Team/RocketPy/pull/955)
53-
- MNT: Refactor parachute implementation with abstract base and hemispherical model split [#958](https://github.com/RocketPy-Team/RocketPy/pull/958)
5465
- DOC: Add aerodynamic surfaces user guide [#1043](https://github.com/RocketPy-Team/RocketPy/pull/1043)
5566
- DOC: Add Valkyrie flight example (Bisky Team) [#967](https://github.com/RocketPy-Team/RocketPy/pull/967)
5667
- DOC: Configure AI instructions and update developer docs [#975](https://github.com/RocketPy-Team/RocketPy/pull/975)
@@ -60,8 +71,14 @@ Attention: The newest changes should be on top -->
6071

6172
### Changed
6273

63-
- ENH: Resolve pressure_ISA discretization bounds TODO [#1056](https://github.com/RocketPy-Team/RocketPy/pull/1056)
74+
- REL: bumps up rocketpy version to 1.13.0 [#1048](https://github.com/RocketPy-Team/RocketPy/pull/1048)
75+
- MNT: Remove unused pylint disable statements [#1067](https://github.com/RocketPy-Team/RocketPy/pull/1067)
76+
- MNT: Discrete controllers are now called exactly once per time node (previously twice); results may change for stateful controllers and `observed_variables` no longer contains duplicated entries [#949](https://github.com/RocketPy-Team/RocketPy/pull/949)
77+
- MNT: Multi-dimensional linear `Function` objects now apply their extrapolation rule to points outside the data's convex hull (previously returned NaN) [#969](https://github.com/RocketPy-Team/RocketPy/pull/969)
78+
- MNT: Informational messages previously shown with `print()` now use Python logging and are silent by default; call `rocketpy.utilities.enable_logging()` to see them [#973](https://github.com/RocketPy-Team/RocketPy/pull/973)
6479
- ENH: Refactor flight.py latitude/longitude to use inverted_haversine [#1055](https://github.com/RocketPy-Team/RocketPy/pull/1055)
80+
- MNT: `Function` with `interpolation="akima"` now matches the canonical (SciPy) Akima spline; interpolated values differ slightly from previous releases [#1049](https://github.com/RocketPy-Team/RocketPy/pull/1049)
81+
- MNT: `Function.differentiate` on 1-D array Functions now returns the analytical derivative of the interpolation (previously central finite differences); values at knots and domain edges may change [#1049](https://github.com/RocketPy-Team/RocketPy/pull/1049)
6582

6683
### Deprecated
6784

@@ -73,6 +90,9 @@ Attention: The newest changes should be on top -->
7390

7491
### Fixed
7592

93+
- BUG: Environment not Encoding Necessary Parameters for Decode [#1059](https://github.com/RocketPy-Team/RocketPy/pull/1059)
94+
- BUG: fix individual fin (`TrapezoidalFin`, `EllipticalFin`, `FreeFormFin`) serialization crash when saving rockets/flights [#1048](https://github.com/RocketPy-Team/RocketPy/pull/1048)
95+
- BUG: support the new Wyoming sounding WSGI page format (legacy cgi-bin endpoint was discontinued by UWyo) [#1048](https://github.com/RocketPy-Team/RocketPy/pull/1048)
7696
- FIX: pre-release hardening — bug fixes across the unreleased features [#1047](https://github.com/RocketPy-Team/RocketPy/pull/1047)
7797
- BUG: Remove duplicate controller process; controllers were being invoked twice per time node [#949](https://github.com/RocketPy-Team/RocketPy/pull/949)
7898
- BUG: fix wind heading and direction wraparound interpolation [#974](https://github.com/RocketPy-Team/RocketPy/pull/974)

README.md

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ The following image shows how the four main classes interact with each other:
143143
A typical workflow starts with importing these classes from RocketPy:
144144

145145
```python
146-
from rocketpy import Environment, Rocket, SolidMotor, Flight, HemisphericalParachute
146+
from rocketpy import Environment, Rocket, SolidMotor, Flight
147147
```
148148

149149
An optional step is to import datetime, which is used to define the date of the simulation:
@@ -255,7 +255,7 @@ tail = calisto.add_tail(
255255
You may want to add parachutes to your rocket as well:
256256

257257
```python
258-
main = HemisphericalParachute(
258+
main = calisto.add_parachute(
259259
name="main",
260260
cd_s=10.0,
261261
trigger=800, # ejection altitude in meters
@@ -267,7 +267,7 @@ main = HemisphericalParachute(
267267
porosity=0.0432,
268268
)
269269

270-
drogue = HemisphericalParachute(
270+
drogue = calisto.add_parachute(
271271
name="drogue",
272272
cd_s=1.0,
273273
trigger="apogee", # ejection at apogee
@@ -278,9 +278,6 @@ drogue = HemisphericalParachute(
278278
height=1.5,
279279
porosity=0.0432,
280280
)
281-
282-
calisto.add_parachute(parachute = main)
283-
calisto.add_parachute(parachute = drogue)
284281
```
285282

286283
Finally, you can create a Flight object to simulate your trajectory. To get help on the Flight class, use:
@@ -313,7 +310,7 @@ Here is just a quick taste of what RocketPy is able to calculate. There are hund
313310

314311
![6-DOF Trajectory Plot](https://raw.githubusercontent.com/RocketPy-Team/RocketPy/master/docs/static/rocketpy_example_trajectory.svg)
315312

316-
If you want to see the trajectory on Google Earth, RocketPy acn easily export a KML file for you:
313+
If you want to see the trajectory on Google Earth, RocketPy can easily export a KML file for you:
317314

318315
```python
319316
from rocketpy.simulation import FlightDataExporter

docs/conf.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
author = "RocketPy Team"
2828

2929
# The full version, including alpha/beta/rc tags
30-
release = "1.12.1"
30+
release = "1.13.0"
3131

3232

3333
# -- General configuration ---------------------------------------------------

docs/development/testing.rst

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -257,8 +257,7 @@ Consider the following integration test:
257257
"""
258258
# TODO:: this should be added to the set_atmospheric_model() method as a
259259
# "file" option, instead of receiving the URL as a string.
260-
URL = "http://weather.uwyo.edu/cgi-bin/sounding?region=samer&TYPE=TEXT%3ALIST&YEAR=2019&MONTH=02&FROM=0500&TO=0512&STNM=83779"
261-
# give it at least 5 times to try to download the file
260+
URL = "https://weather.uwyo.edu/wsgi/sounding?datetime=2019-02-05+00:00:00&id=83779&type=TEXT:LIST"
262261
example_plain_env.set_atmospheric_model(type="wyoming_sounding", file=URL)
263262
264263
assert example_plain_env.all_info() is None
@@ -267,7 +266,7 @@ Consider the following integration test:
267266
abs(example_plain_env.barometric_height(example_plain_env.pressure(0)) - 722.0)
268267
< 1e-8
269268
)
270-
assert abs(example_plain_env.wind_velocity_x(0) - -2.9005178894925043) < 1e-8
269+
assert abs(example_plain_env.wind_velocity_x(0) - -2.9130471244363165) < 1e-8
271270
assert abs(example_plain_env.temperature(100) - 291.75) < 1e-8
272271
273272
This test contains two fundamental traits which defines it as an integration test:

docs/examples/andromeda_flight_sim.ipynb

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,7 @@
3737
"source": [
3838
"import matplotlib.pyplot as plt\n",
3939
"\n",
40-
"from rocketpy import (\n",
41-
" Environment,\n",
42-
" Flight,\n",
43-
" Function,\n",
44-
" HemisphericalParachute,\n",
45-
" Rocket,\n",
46-
" SolidMotor,\n",
47-
")\n",
40+
"from rocketpy import Environment, Flight, Function, Rocket, SolidMotor\n",
4841
"\n",
4942
"plt.style.use(\"seaborn-v0_8-colorblind\")"
5043
]
@@ -265,7 +258,7 @@
265258
},
266259
{
267260
"cell_type": "code",
268-
"execution_count": null,
261+
"execution_count": 64,
269262
"metadata": {},
270263
"outputs": [],
271264
"source": [
@@ -283,15 +276,13 @@
283276
" position=0.3546,\n",
284277
")\n",
285278
"\n",
286-
"Drogue = HemisphericalParachute(\n",
279+
"Drogue = Andromeda.add_parachute(\n",
287280
" \"Drogue\", cd_s=0.84665922014, trigger=\"apogee\", sampling_rate=100, lag=0\n",
288281
")\n",
289282
"\n",
290-
"Main = HemisphericalParachute(\n",
283+
"Main = Andromeda.add_parachute(\n",
291284
" \"Main\", cd_s=8.362919643856031, trigger=500, sampling_rate=100, lag=0\n",
292-
")\n",
293-
"Andromeda.add_parachute(parachute=Drogue)\n",
294-
"Andromeda.add_parachute(parachute=Main)"
285+
")"
295286
]
296287
},
297288
{

docs/examples/bella_lui_flight_sim.ipynb

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
},
3232
{
3333
"cell_type": "code",
34-
"execution_count": null,
34+
"execution_count": 9,
3535
"metadata": {},
3636
"outputs": [],
3737
"source": [
@@ -40,14 +40,7 @@
4040
"import numpy as np\n",
4141
"from scipy.signal import savgol_filter\n",
4242
"\n",
43-
"from rocketpy import (\n",
44-
" Environment,\n",
45-
" Flight,\n",
46-
" Function,\n",
47-
" HemisphericalParachute,\n",
48-
" Rocket,\n",
49-
" SolidMotor,\n",
50-
")"
43+
"from rocketpy import Environment, Flight, Function, Rocket, SolidMotor"
5144
]
5245
},
5346
{
@@ -429,19 +422,18 @@
429422
},
430423
{
431424
"cell_type": "code",
432-
"execution_count": null,
425+
"execution_count": 44,
433426
"metadata": {},
434427
"outputs": [],
435428
"source": [
436-
"Drogue = HemisphericalParachute(\n",
429+
"Drogue = bella_lui.add_parachute(\n",
437430
" \"Drogue\",\n",
438431
" cd_s=parameters.get(\"CdS_drogue\")[0],\n",
439432
" trigger=\"apogee\",\n",
440433
" sampling_rate=105,\n",
441434
" lag=parameters.get(\"lag_rec\")[0],\n",
442435
" noise=(0, 8.3, 0.5),\n",
443-
")\n",
444-
"bella_lui.add_parachute(parachute=Drogue)"
436+
")"
445437
]
446438
},
447439
{

docs/examples/camoes_flight_sim.ipynb

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@
5252
" Environment,\n",
5353
" Flight,\n",
5454
" Function,\n",
55-
" HemisphericalParachute,\n",
5655
" Rocket,\n",
5756
" SolidMotor,\n",
5857
")\n",
@@ -300,18 +299,17 @@
300299
},
301300
{
302301
"cell_type": "code",
303-
"execution_count": null,
302+
"execution_count": 85,
304303
"metadata": {},
305304
"outputs": [],
306305
"source": [
307306
"def drogue_trigger(p, h, y):\n",
308307
" return True if y[5] < 5 and y[2] > 300 else False\n",
309308
"\n",
310309
"\n",
311-
"Drogue = HemisphericalParachute(\n",
310+
"Drogue = CAMOES.add_parachute(\n",
312311
" \"Drogue\", cd_s=0.33, sampling_rate=400, lag=1.5, trigger=drogue_trigger\n",
313-
")\n",
314-
"CAMOES.add_parachute(parachute=Drogue)"
312+
")"
315313
]
316314
},
317315
{

0 commit comments

Comments
 (0)